forked from minetest-mods/mesecons
Prevent extra pin events with luacontrollers, microcontrollers, and FPGAs (#593)
This commit is contained in:
parent
fef5c8cf68
commit
0d9e0274ae
@ -114,9 +114,10 @@ plg.register_nodes({
|
|||||||
effector = {
|
effector = {
|
||||||
rules = {}, -- replaced later
|
rules = {}, -- replaced later
|
||||||
action_change = function(pos, _, rule, newstate)
|
action_change = function(pos, _, rule, newstate)
|
||||||
plg.ports_changed(pos, rule, newstate)
|
if plg.ports_changed(pos, rule, newstate) then
|
||||||
plg.update(pos)
|
plg.update(pos)
|
||||||
end
|
end
|
||||||
|
end
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
after_dig_node = function(pos, node)
|
after_dig_node = function(pos, node)
|
||||||
@ -326,8 +327,10 @@ plg.update = function(pos)
|
|||||||
plg.setports(pos, A, B, C, D)
|
plg.setports(pos, A, B, C, D)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Updates the port states according to the signal change.
|
||||||
|
-- Returns whether the port states actually changed.
|
||||||
plg.ports_changed = function(pos, rule, newstate)
|
plg.ports_changed = function(pos, rule, newstate)
|
||||||
if rule == nil then return end
|
if rule == nil then return false end
|
||||||
local meta = minetest.get_meta(pos)
|
local meta = minetest.get_meta(pos)
|
||||||
local states
|
local states
|
||||||
|
|
||||||
@ -347,10 +350,14 @@ plg.ports_changed = function(pos, rule, newstate)
|
|||||||
local portno = ({4, 1, nil, 3, 2})[3 + rule.x + 2*rule.z]
|
local portno = ({4, 1, nil, 3, 2})[3 + rule.x + 2*rule.z]
|
||||||
states[portno] = (newstate == "on")
|
states[portno] = (newstate == "on")
|
||||||
|
|
||||||
meta:set_string("portstates",
|
local new_portstates =
|
||||||
(states[1] and "1" or "0") .. (states[2] and "1" or "0") ..
|
(states[1] and "1" or "0") .. (states[2] and "1" or "0") ..
|
||||||
(states[3] and "1" or "0") .. (states[4] and "1" or "0")
|
(states[3] and "1" or "0") .. (states[4] and "1" or "0")
|
||||||
)
|
if new_portstates ~= s then
|
||||||
|
meta:set_string("portstates", new_portstates)
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
plg.getports = function(pos) -- gets merged states of INPUT & OUTPUT
|
plg.getports = function(pos) -- gets merged states of INPUT & OUTPUT
|
||||||
|
@ -43,13 +43,16 @@ local rules = {
|
|||||||
------------------
|
------------------
|
||||||
-- These helpers are required to set the port states of the luacontroller
|
-- These helpers are required to set the port states of the luacontroller
|
||||||
|
|
||||||
|
-- Updates the real port states according to the signal change.
|
||||||
|
-- Returns whether the real port states actually changed.
|
||||||
local function update_real_port_states(pos, rule_name, new_state)
|
local function update_real_port_states(pos, rule_name, new_state)
|
||||||
local meta = minetest.get_meta(pos)
|
local meta = minetest.get_meta(pos)
|
||||||
if rule_name == nil then
|
if rule_name == nil then
|
||||||
meta:set_int("real_portstates", 1)
|
meta:set_int("real_portstates", 1)
|
||||||
return
|
return true
|
||||||
end
|
end
|
||||||
local n = meta:get_int("real_portstates") - 1
|
local real_portstates = meta:get_int("real_portstates")
|
||||||
|
local n = real_portstates - 1
|
||||||
local L = {}
|
local L = {}
|
||||||
for i = 1, 4 do
|
for i = 1, 4 do
|
||||||
L[i] = n % 2
|
L[i] = n % 2
|
||||||
@ -66,12 +69,12 @@ local function update_real_port_states(pos, rule_name, new_state)
|
|||||||
local port = pos_to_side[rule_name.x + (2 * rule_name.z) + 3]
|
local port = pos_to_side[rule_name.x + (2 * rule_name.z) + 3]
|
||||||
L[port] = (new_state == "on") and 1 or 0
|
L[port] = (new_state == "on") and 1 or 0
|
||||||
end
|
end
|
||||||
meta:set_int("real_portstates",
|
local new_portstates = 1 + 1 * L[1] + 2 * L[2] + 4 * L[3] + 8 * L[4]
|
||||||
1 +
|
if new_portstates ~= real_portstates then
|
||||||
1 * L[1] +
|
meta:set_int("real_portstates", new_portstates)
|
||||||
2 * L[2] +
|
return true
|
||||||
4 * L[3] +
|
end
|
||||||
8 * L[4])
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
@ -826,8 +829,9 @@ for d = 0, 1 do
|
|||||||
effector = {
|
effector = {
|
||||||
rules = input_rules[cid],
|
rules = input_rules[cid],
|
||||||
action_change = function (pos, _, rule_name, new_state)
|
action_change = function (pos, _, rule_name, new_state)
|
||||||
update_real_port_states(pos, rule_name, new_state)
|
if update_real_port_states(pos, rule_name, new_state) then
|
||||||
run(pos, {type=new_state, pin=rule_name})
|
run(pos, {type=new_state, pin=rule_name})
|
||||||
|
end
|
||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
receptor = {
|
receptor = {
|
||||||
|
@ -44,9 +44,10 @@ local mesecons = {effector =
|
|||||||
{
|
{
|
||||||
rules = input_rules,
|
rules = input_rules,
|
||||||
action_change = function (pos, node, rulename, newstate)
|
action_change = function (pos, node, rulename, newstate)
|
||||||
yc.update_real_portstates(pos, node, rulename, newstate)
|
if yc.update_real_portstates(pos, node, rulename, newstate) then
|
||||||
yc.update(pos)
|
yc.update(pos)
|
||||||
end
|
end
|
||||||
|
end
|
||||||
}}
|
}}
|
||||||
if nodename ~= "mesecons_microcontroller:microcontroller0000" then
|
if nodename ~= "mesecons_microcontroller:microcontroller0000" then
|
||||||
mesecons.receptor = {
|
mesecons.receptor = {
|
||||||
@ -655,13 +656,16 @@ yc.set_portstate = function(port, state, L)
|
|||||||
return L
|
return L
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Updates the real port states according to the signal change.
|
||||||
|
-- Returns whether the real port states actually changed.
|
||||||
yc.update_real_portstates = function(pos, _, rulename, newstate)
|
yc.update_real_portstates = function(pos, _, rulename, newstate)
|
||||||
local meta = minetest.get_meta(pos)
|
local meta = minetest.get_meta(pos)
|
||||||
if rulename == nil then
|
if rulename == nil then
|
||||||
meta:set_int("real_portstates", 1)
|
meta:set_int("real_portstates", 1)
|
||||||
return
|
return true
|
||||||
end
|
end
|
||||||
local n = meta:get_int("real_portstates") - 1
|
local real_portstates = meta:get_int("real_portstates")
|
||||||
|
local n = real_portstates - 1
|
||||||
local L = {}
|
local L = {}
|
||||||
for i = 1, 4 do
|
for i = 1, 4 do
|
||||||
L[i] = n%2
|
L[i] = n%2
|
||||||
@ -676,7 +680,12 @@ yc.update_real_portstates = function(pos, _, rulename, newstate)
|
|||||||
local port = ({4, 1, nil, 3, 2})[rulename.x+2*rulename.z+3]
|
local port = ({4, 1, nil, 3, 2})[rulename.x+2*rulename.z+3]
|
||||||
L[port] = (newstate == "on") and 1 or 0
|
L[port] = (newstate == "on") and 1 or 0
|
||||||
end
|
end
|
||||||
meta:set_int("real_portstates", 1 + L[1] + 2*L[2] + 4*L[3] + 8*L[4])
|
local new_portstates = 1 + L[1] + 2*L[2] + 4*L[3] + 8*L[4]
|
||||||
|
if new_portstates ~= real_portstates then
|
||||||
|
meta:set_int("real_portstates", new_portstates)
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
yc.get_real_portstates = function(pos) -- determine if ports are powered (by itself or from outside)
|
yc.get_real_portstates = function(pos) -- determine if ports are powered (by itself or from outside)
|
||||||
|
Loading…
Reference in New Issue
Block a user