From 9c295adb7ff853eeef1e29ac0bcbffd8368d7244 Mon Sep 17 00:00:00 2001 From: Thaddeus Hughes Date: Thu, 28 Aug 2025 11:30:09 -0500 Subject: [PATCH] button debouncing, cancelling run commands works right it has been deployed onto the trailer --- trailer_cbox/trailer_cbox.ino | 147 ++++++++++++++++++++++++---------- 1 file changed, 103 insertions(+), 44 deletions(-) diff --git a/trailer_cbox/trailer_cbox.ino b/trailer_cbox/trailer_cbox.ino index 989b297..83c6013 100644 --- a/trailer_cbox/trailer_cbox.ino +++ b/trailer_cbox/trailer_cbox.ino @@ -19,7 +19,7 @@ bool sensorFallingEdges[NUM_SENSORS] = {false, false, false, false}; uint32_t lastSensorDebounceTimes[NUM_SENSORS] = {0, 0, 0, 0}; void checkSensors() { - Serial.print(' '); + //Serial.print(' '); for (uint8_t i = 0; i < NUM_SENSORS; i++) { bool reading = digitalRead(SENSORS[i]); @@ -34,10 +34,10 @@ void checkSensors() { } lastSensorStates[i] = reading; - Serial.print(currentSensorStates[i] ? '-':'T'); + //Serial.print(currentSensorStates[i] ? '-':'T'); } - Serial.print(' '); + //Serial.print(' '); } bool checkSensor(int8_t ch) { @@ -74,17 +74,8 @@ void checkButtons() { } lastButtonStates[i] = reading; - - if (buttonFallingEdges[i]) { - buttonFallingEdges[i] = false; - lastRepeatTimes[i] = millis(); - } - /*if (currentButtonStates[i] == LOW && (millis() - lastRepeatTimes[i]) >= REPEAT_INTERVAL) { - lastRepeatTimes[i] = millis(); - onButtonPush(i); - }*/ - Serial.print(currentButtonStates[i] ? '-':'T'); + //Serial.print(currentButtonStates[i] ? '-':'T'); } //Serial.println(); } @@ -140,9 +131,9 @@ void setOutputs(int8_t cmd) { lastt = millis(); } - Serial.print("CMD_"); - Serial.print(currentcmd); - Serial.print(" "); + //Serial.print("CMD_"); + //Serial.print(currentcmd); + //Serial.print(" "); setOutputsRaw(currentcmd); } @@ -155,11 +146,13 @@ int8_t state; #define STATE_JOG 1 #define STATE_RUN 2 +#define JOG_DEBOUNCE 160 + // handle state transitions void changeState(int8_t newState, int8_t newChannel=0) { switch(newState) { case STATE_JOG: - timer = millis() + 200; + timer = millis() + JOG_DEBOUNCE; break; case STATE_RUN: if (state != newState || channel != newChannel) @@ -177,6 +170,7 @@ void changeState(int8_t newState, int8_t newChannel=0) { Serial.print(":"); Serial.print(newChannel); Serial.print(" "); + Serial.println(); } state = newState; @@ -184,43 +178,34 @@ void changeState(int8_t newState, int8_t newChannel=0) { } -uint32_t btn_runt=0; -#define DEBOUNCE_BTN_RUN 350 - void runFSM() { // if any button is pressed, cancel any command, run the output manually. bool overridden = false; for (int8_t i=0; i<4; i++) { - if (currentButtonStates[i]) continue; + if (currentButtonStates[i]){ + buttonFallingEdges[i] = false; + continue; + } if (!digitalRead(53)) { changeState(STATE_OFF); setOutputs(checkSensor(i+1) ? CMD_OFF:i+1); } else if (!digitalRead(51)) { - - // TODO: iron this - if (state == STATE_RUN) { - // if running and a different channel, just shut off - if (channel != i+1) { - changeState(STATE_OFF); - // if running and the same channel, and we are past the time of the button being pressed - } else if (millis() > btn_runt) { + if (buttonFallingEdges[i]) { + if (state == STATE_RUN) { changeState(STATE_OFF); } else { changeState(STATE_RUN, i+1); - btn_runt = millis() + DEBOUNCE_BTN_RUN; } - } else { - changeState(STATE_RUN, i+1); - btn_runt = millis() + DEBOUNCE_BTN_RUN; } - } else { changeState(STATE_OFF); setOutputs(i+1); } + buttonFallingEdges[i] = false; + overridden = true; } @@ -259,8 +244,44 @@ void runFSM() { } } -uint32_t rf_runt = 0; +/*#define NUM_CMDS 8 #define DEBOUNCE_RF 500 +bool lastCmdStates[NUM_CMDS] = {LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW}; +bool currentCmdStates[NUM_CMDS] = {LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW}; +bool cmdRisingEdges[NUM_CMDS] = {0,0,0,0,0,0,0,0}; +uint32_t lastCmdDebounceTimes[NUM_BUTTONS] = {0, 0, 0, 0, 0}; + +void checkButtons() { + for (uint8_t i = 0; i < NUM_CMDS; i++) { + if (reading != lastCmdStates[i]) { + lastCmdDebounceTimes[i] = millis(); + } + + if ((millis() - lastCmdDebounceTimes[i]) > DEBOUNCE_DELAY) { + cmdRisingEdges[i] = false; + if (reading != currentCmdStates[i]) { + currentCmdStates[i] = reading; + + if (currentCmdStates[i]) { + cmdRisingEdges[i] = true; + } + } + } + + lastCmdStates[i] = reading; + + Serial.print(currentButtonStates[i] ? '-':'T'); + } + //Serial.println(); +}*/ + +#define DEBOUNCE_RF 300 + +bool cmdFirstSeen[8] = {0,0,0,0,0,0,0,0}; +uint32_t cmdValidTil[8] = {0,0,0,0,0,0,0,0}; //{-10000,-10000,-10000,-10000,-10000,-10000,-10000,-10000}; +uint32_t cmdSeenThisScan[8] = {0,0,0,0,0,0,0,0}; //{-10000,-10000,-10000,-10000,-10000,-10000,-10000,-10000}; +//bool currentCmdState[8] = {0,0,0,0,0,0,0,0}; +//bool currentCmdState[8] = {0,0,0,0,0,0,0,0}; void checkRFTransmissions() { uint8_t buf[RH_ASK_MAX_MESSAGE_LEN]; // Buffer for incoming message @@ -278,12 +299,50 @@ void checkRFTransmissions() { if (buf[3]!='b') return; if ((buf[4]+buf[5]) != buf[6]) return; // checksum if (buf[5] < 49 || buf[5] > 52) return; // valid channel - //if (buf[0] != 'J' && buf[0] != 'R') return; // valid command + if (buf[4] != 'J' && buf[4] != 'R') return; // valid command - if (buf[4] == 'J') + int8_t cmd_no = (buf[4] == 'J' ? 0:4) + buf[5]-49; + + if (cmdValidTil[cmd_no] < millis()) { + cmdFirstSeen[cmd_no] = true; + } + cmdSeenThisScan[cmd_no] = true; + cmdValidTil[cmd_no] = millis() + DEBOUNCE_RF; + } + + for (uint8_t i=0;i<8;i++) { + if (cmdSeenThisScan[i] && i<4) { + changeState(STATE_JOG, i+1); + } else if (cmdFirstSeen[i]) { + if (state == STATE_RUN) { + changeState(STATE_OFF); + } else { + changeState(STATE_RUN, i-4+1); + } + } + cmdFirstSeen[i] = false; + cmdSeenThisScan[i] = false; + } + + /*if (buf[4] == 'J') changeState(STATE_JOG, buf[5]-48); if (buf[4] == 'R') { - // if running + if (state == STATE_RUN) { + if (channel == buf[5]-48) { + if (lastTimeOfCmd[cmd_no] > lastTimeOfCmd+DEBOUNCE_RF) { + changeState(STATE_OFF); + } + } else { + changeState(STATE_OFF); + } + } else { + if (lastTimeOfCmd[cmd_no] > lastTimeOfCmd+DEBOUNCE_RF) { + changeState(STATE_RUN, buf[5]-48); + lastTimeOfCmd[cmd_no] = millis(); + } + }*/ + + /*// if running if (state == STATE_RUN) { // if running and a different channel, just shut off if (channel != buf[5]-48){ @@ -298,10 +357,10 @@ void checkRFTransmissions() { } else { changeState(STATE_RUN, buf[5]-48); rf_runt = millis() + DEBOUNCE_RF; - } - } + }*/ + //} - } + //} } void setup() { @@ -323,15 +382,15 @@ void loop() { runFSM(); // check if both traps are closed - if(!checkSensor(CMD_F_C) || !checkSensor(CMD_R_C)) { + /*if(!checkSensor(CMD_F_C) || !checkSensor(CMD_R_C)) { digitalWrite(RELAY_4A, HIGH); } else { digitalWrite(RELAY_4A, LOW); - } + }*/ //Serial.println("loop"); - Serial.println(); + //Serial.println(); //delay(5); }