From e136bcd074ac284fdc42fc047dda40191144aef8 Mon Sep 17 00:00:00 2001 From: Fisch Date: Fri, 13 Dec 2019 23:24:11 +0100 Subject: [PATCH] implement maybe working board online offline failchecks --- controller/controller.ino | 77 ++++++++++++++++++++++++- hoverboard-firmware-hack-foc-serial-esc | 2 +- 2 files changed, 76 insertions(+), 3 deletions(-) diff --git a/controller/controller.ino b/controller/controller.ino index 3881abd..51555be 100644 --- a/controller/controller.ino +++ b/controller/controller.ino @@ -79,20 +79,29 @@ boolean board2Enabled=false; // Global variables for serial communication +//Serial1 (Rear) uint8_t idx1 = 0; // Index for new data pointer uint16_t bufStartFrame1; // Buffer Start Frame byte *p1; // Pointer declaration for the new received data byte incomingByte1; byte incomingBytePrev1; long lastValidDataSerial1_time; +long board1lastPoweron=0; //mainly for failcheck +long board1lastPoweroff=0; +long board1lastFeedbackMinSpeed; +boolean board1lastFeedbackMinSpeed_above=false; -//Same for Serial2 +//Same for Serial2 (Front) uint8_t idx2 = 0; // Index for new data pointer uint16_t bufStartFrame2; // Buffer Start Frame byte *p2; // Pointer declaration for the new received data byte incomingByte2; byte incomingBytePrev2; long lastValidDataSerial2_time; +long board2lastPoweron=0; //mainly for failcheck +long board2lastPoweroff=0; +long board2lastFeedbackMinSpeed; +boolean board2lastFeedbackMinSpeed_above=false; typedef struct{ uint16_t start; @@ -365,12 +374,17 @@ void handleModeChange() { if (requestmode==on) {//wait for both boards to send feedback state_modechange++; board1Enabled=true; //assume board is online + board1lastPoweron=loopmillis; //save time at which board was powered on board2Enabled=true; //assume board is online + board2lastPoweron=loopmillis; //save time at which board was powered on // ### Request Idle or Off (both power boards off) ### }else if(requestmode==idle || requestmode==off) { state_modechange++; board1Enabled=false; //assume board is offline + board1lastPoweroff=loopmillis; //save time at which board was powered off board2Enabled=false; //assume board is offline + board2lastPoweroff=loopmillis; //save time at which board was powered off + Serial.println("finished"); }else{ //if changed off from error mode state_modechange++; @@ -460,7 +474,66 @@ boolean boardsPowered() void failChecks() { - + #define FAILCHECK_WAITCHECK_AFTER_POWEROFF_TIME 3000 //time to start failchecking boardpower after board poweroff + #define FAILCHECK_RECEIVERECENT_TIME 1000 //should be less than FAILCHECK_WAITCHECK_AFTER_POWEROFF_TIME + // ## Check if board is really offline ## + if (!board1Enabled) { //board should be offline + if (loopmillis-board1lastPoweroff > FAILCHECK_WAITCHECK_AFTER_POWEROFF_TIME){ //wait some time before checking if board did power off + if (loopmillis-lastValidDataSerial1_time < FAILCHECK_RECEIVERECENT_TIME) { //new message received recently? + errormessage="Board 1 should be offline but feedback received"; + Serial.println(errormessage); + requestmode=error; + } + } + } + if (!board2Enabled) { //board should be offline + if (loopmillis-board2lastPoweroff > FAILCHECK_WAITCHECK_AFTER_POWEROFF_TIME){ //wait some time before checking if board did power off + if (loopmillis-lastValidDataSerial2_time < FAILCHECK_RECEIVERECENT_TIME) { //new message received recently? + errormessage="Board 2 should be offline but feedback received"; + Serial.println(errormessage); + requestmode=error; + } + } + } + + #define MINSPEED_FOR_FEEDBACK 250 //speed at which feedback output should be expected + #define RESETSPEED_FOR_FEEDBACK 50 //should be less than MINSPEED_FOR_FEEDBACK. speed at which board2lastFeedbackMinSpeed will be able to be reset + if (!board2lastFeedbackMinSpeed_above && ( abs(out_speedFL) > MINSPEED_FOR_FEEDBACK || abs(out_speedFR) > MINSPEED_FOR_FEEDBACK ) ){ + board2lastFeedbackMinSpeed=loopmillis; //front is board 2 + board2lastFeedbackMinSpeed_above=true; + } + if (board2lastFeedbackMinSpeed_above && abs(out_speedFL) < RESETSPEED_FOR_FEEDBACK && abs(out_speedFR) < RESETSPEED_FOR_FEEDBACK) { //if speed of both wheels goes below a threshold, board2lastFeedbackMinSpeed will be able to reset + board2lastFeedbackMinSpeed_above=false; + } + + if (!board1lastFeedbackMinSpeed_above && ( abs(out_speedRL) > MINSPEED_FOR_FEEDBACK || abs(out_speedRR) > MINSPEED_FOR_FEEDBACK ) ){ + board1lastFeedbackMinSpeed=loopmillis; //rear is board 1 + board1lastFeedbackMinSpeed_above=true; + } + if (board1lastFeedbackMinSpeed_above && abs(out_speedRL) < RESETSPEED_FOR_FEEDBACK && abs(out_speedRR) < RESETSPEED_FOR_FEEDBACK) { //if speed of both wheels goes below a threshold, board2lastFeedbackMinSpeed will be able to reset + board1lastFeedbackMinSpeed_above=false; + } + + #define FAILCHECK_WAITCHECK_AFTER_MINSPEED_TIME 3000 //time to start failchecking boardpower after minimum throttle that should give some feedback + // ## Check if board is online (when it should send feedback) ## + if (board1Enabled) { //board should be online + if (loopmillis-board1lastFeedbackMinSpeed > FAILCHECK_WAITCHECK_AFTER_MINSPEED_TIME) { //wait some time before checking + if (board1lastFeedbackMinSpeed_above && loopmillis-lastValidDataSerial1_time > FAILCHECK_RECEIVERECENT_TIME) { //speed still high enough but no new messages recently received? + errormessage="Board 1 should be online and give feedback but didnt"; + Serial.println(errormessage); + requestmode=error; + } + } + } + if (board2Enabled) { //board should be online + if (loopmillis-board2lastFeedbackMinSpeed > FAILCHECK_WAITCHECK_AFTER_MINSPEED_TIME) { //wait some time before checking + if (board2lastFeedbackMinSpeed_above && loopmillis-lastValidDataSerial2_time > FAILCHECK_RECEIVERECENT_TIME) { //speed still high enough but no new messages recently received? + errormessage="Board 2 should be online and give feedback but didnt"; + Serial.println(errormessage); + requestmode=error; + } + } + } } diff --git a/hoverboard-firmware-hack-foc-serial-esc b/hoverboard-firmware-hack-foc-serial-esc index 9fb4b7a..7c76c9f 160000 --- a/hoverboard-firmware-hack-foc-serial-esc +++ b/hoverboard-firmware-hack-foc-serial-esc @@ -1 +1 @@ -Subproject commit 9fb4b7a8d5d9812edc8863dbfe1082a1c96bef9c +Subproject commit 7c76c9f8392b9344033f6a7c06d4ceb000b024da