button debouncing, cancelling run commands works right
it has been deployed onto the trailer
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user