From 0d9e0274ae504e291e97e8a93481a5c88f4809f3 Mon Sep 17 00:00:00 2001 From: Jude Melton-Houghton Date: Sun, 27 Feb 2022 15:12:37 -0500 Subject: [PATCH] Prevent extra pin events with luacontrollers, microcontrollers, and FPGAs (#593) --- mesecons_fpga/init.lua | 17 ++++++++++++----- mesecons_luacontroller/init.lua | 24 ++++++++++++++---------- mesecons_microcontroller/init.lua | 19 ++++++++++++++----- 3 files changed, 40 insertions(+), 20 deletions(-) diff --git a/mesecons_fpga/init.lua b/mesecons_fpga/init.lua index d8849f3..32412f4 100644 --- a/mesecons_fpga/init.lua +++ b/mesecons_fpga/init.lua @@ -114,8 +114,9 @@ plg.register_nodes({ effector = { rules = {}, -- replaced later action_change = function(pos, _, rule, newstate) - plg.ports_changed(pos, rule, newstate) - plg.update(pos) + if plg.ports_changed(pos, rule, newstate) then + plg.update(pos) + end end } }, @@ -326,8 +327,10 @@ plg.update = function(pos) plg.setports(pos, A, B, C, D) end +-- Updates the port states according to the signal change. +-- Returns whether the port states actually changed. 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 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] states[portno] = (newstate == "on") - meta:set_string("portstates", + local new_portstates = (states[1] and "1" or "0") .. (states[2] 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 plg.getports = function(pos) -- gets merged states of INPUT & OUTPUT diff --git a/mesecons_luacontroller/init.lua b/mesecons_luacontroller/init.lua index f00ea93..8e60b1a 100644 --- a/mesecons_luacontroller/init.lua +++ b/mesecons_luacontroller/init.lua @@ -43,13 +43,16 @@ local rules = { ------------------ -- 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 meta = minetest.get_meta(pos) if rule_name == nil then meta:set_int("real_portstates", 1) - return + return true end - local n = meta:get_int("real_portstates") - 1 + local real_portstates = meta:get_int("real_portstates") + local n = real_portstates - 1 local L = {} for i = 1, 4 do 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] L[port] = (new_state == "on") and 1 or 0 end - meta:set_int("real_portstates", - 1 + - 1 * L[1] + - 2 * L[2] + - 4 * L[3] + - 8 * L[4]) + local new_portstates = 1 + 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 @@ -826,8 +829,9 @@ for d = 0, 1 do effector = { rules = input_rules[cid], action_change = function (pos, _, rule_name, new_state) - update_real_port_states(pos, rule_name, new_state) - run(pos, {type=new_state, pin=rule_name}) + if update_real_port_states(pos, rule_name, new_state) then + run(pos, {type=new_state, pin=rule_name}) + end end, }, receptor = { diff --git a/mesecons_microcontroller/init.lua b/mesecons_microcontroller/init.lua index 89b0953..7134dc5 100644 --- a/mesecons_microcontroller/init.lua +++ b/mesecons_microcontroller/init.lua @@ -44,8 +44,9 @@ local mesecons = {effector = { rules = input_rules, action_change = function (pos, node, rulename, newstate) - yc.update_real_portstates(pos, node, rulename, newstate) - yc.update(pos) + if yc.update_real_portstates(pos, node, rulename, newstate) then + yc.update(pos) + end end }} if nodename ~= "mesecons_microcontroller:microcontroller0000" then @@ -655,13 +656,16 @@ yc.set_portstate = function(port, state, L) return L 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) local meta = minetest.get_meta(pos) if rulename == nil then meta:set_int("real_portstates", 1) - return + return true end - local n = meta:get_int("real_portstates") - 1 + local real_portstates = meta:get_int("real_portstates") + local n = real_portstates - 1 local L = {} for i = 1, 4 do 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] L[port] = (newstate == "on") and 1 or 0 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 yc.get_real_portstates = function(pos) -- determine if ports are powered (by itself or from outside)