From b9bdc0bc79e1170febb57edad6fb823a03e94dd8 Mon Sep 17 00:00:00 2001 From: openshwprojects <85486843+openshwprojects@users.noreply.github.com> Date: Fri, 27 Jun 2025 16:11:59 +0200 Subject: [PATCH] BETTER STABILITY FOR TOGGLE CHANNEL ON TOGGLE (protect against random rare high level /low level spikes) --- src/new_pins.c | 52 ++++++++++++++++++++++++++++++-------------------- 1 file changed, 31 insertions(+), 21 deletions(-) diff --git a/src/new_pins.c b/src/new_pins.c index 7fc62cb2f..4a665e195 100644 --- a/src/new_pins.c +++ b/src/new_pins.c @@ -2080,30 +2080,40 @@ void PIN_ticks(void* param) #endif } else if (g_cfg.pins.roles[i] == IOR_ToggleChannelOnToggle) { - // we must detect a toggle, but with debouncing value = PIN_ReadDigitalInputValue_WithInversionIncluded(i); - // debouncing - if (g_times[i] <= 0) { - if (g_lastValidState[i] != value) { - // became up - g_lastValidState[i] = value; - - - if (CFG_HasFlag(OBK_FLAG_BUTTON_DISABLE_ALL)) { - addLogAdv(LOG_INFO, LOG_FEATURE_GENERAL, "Child lock!"); + + if (value) { + if (g_times[i] > debounceMS) { + if (g_lastValidState[i] != value) { + g_lastValidState[i] = value; + + if (!CFG_HasFlag(OBK_FLAG_BUTTON_DISABLE_ALL)) { + CHANNEL_Toggle(g_cfg.pins.channels[i]); + EventHandlers_FireEvent(CMD_EVENT_PIN_ONTOGGLE, i); + } else { + addLogAdv(LOG_INFO, LOG_FEATURE_GENERAL, "Child lock!"); + } } - else { - CHANNEL_Toggle(g_cfg.pins.channels[i]); - // fire event - IOR_ToggleChannelOnToggle has been toggle - // Argument is a pin number (NOT channel) - EventHandlers_FireEvent(CMD_EVENT_PIN_ONTOGGLE, i); - } - // lock for given time - g_times[i] = debounceMS; + } else { + g_times[i] += t_diff; } - } - else { - g_times[i] -= t_diff; + g_times2[i] = 0; + } else { + if (g_times2[i] > debounceMS) { + if (g_lastValidState[i] != value) { + g_lastValidState[i] = value; + + if (!CFG_HasFlag(OBK_FLAG_BUTTON_DISABLE_ALL)) { + CHANNEL_Toggle(g_cfg.pins.channels[i]); + EventHandlers_FireEvent(CMD_EVENT_PIN_ONTOGGLE, i); + } else { + addLogAdv(LOG_INFO, LOG_FEATURE_GENERAL, "Child lock!"); + } + } + } else { + g_times2[i] += t_diff; + } + g_times[i] = 0; } } }