diff --git a/software/dumber3/.cproject b/software/dumber3/.cproject index dfa0378..1ad41af 100644 --- a/software/dumber3/.cproject +++ b/software/dumber3/.cproject @@ -329,7 +329,7 @@ - diff --git a/software/dumber3/Application/application.c b/software/dumber3/Application/application.c index 980a963..515a919 100644 --- a/software/dumber3/Application/application.c +++ b/software/dumber3/Application/application.c @@ -171,6 +171,7 @@ void APPLICATION_MainThread(void* params) { } free(decodedCmd); + free(receivedCMD); break; default: @@ -200,6 +201,7 @@ void APPLICATION_MainThread(void* params) { case MSG_ID_BAT_MED: case MSG_ID_BAT_HIGH: systemInfos.batteryUpdate=1; + systemInfos.inCharge=0; systemInfos.batteryState = msg.id; break; case MSG_ID_MOTEURS_END_OF_MOUVMENT: @@ -226,11 +228,11 @@ void APPLICATION_StateMachine() { } if (systemInfos.batteryUpdate) { - ledState = leds_off; - if (systemInfos.batteryState==MSG_ID_BAT_CRITICAL_LOW) { ledState = leds_bat_critical_low; APPLICATION_TransitionToNewState(stateLowBatDisable); + + LEDS_Set(ledState); } else if (systemInfos.state == stateInCharge) { switch (systemInfos.batteryState) { case MSG_ID_BAT_CHARGE_COMPLETE: @@ -246,6 +248,8 @@ void APPLICATION_StateMachine() { ledState= leds_bat_charge_low; break; } + + LEDS_Set(ledState); } else if (systemInfos.state==stateStartup) { switch (systemInfos.batteryState) { case MSG_ID_BAT_HIGH: @@ -258,9 +262,9 @@ void APPLICATION_StateMachine() { ledState= leds_bat_low; break; } - } - LEDS_Set(ledState); + LEDS_Set(ledState); + } } if (systemInfos.cmd != CMD_NONE) { @@ -271,7 +275,8 @@ void APPLICATION_StateMachine() { case CMD_RESET: if ((systemInfos.state == stateIdle) || (systemInfos.state == stateRun) || - (systemInfos.state == stateInMouvement)) { + (systemInfos.state == stateInMouvement) || + (systemInfos.state == stateWatchdogDisable)) { /* command RESET is only applicable in those 3 states, otherwise it is rejected */ cmdSendAnswer(ANS_OK); APPLICATION_TransitionToNewState(stateIdle); @@ -284,31 +289,34 @@ void APPLICATION_StateMachine() { /* only state where START cmd is accepted */ cmdSendAnswer(ANS_OK); - APPLICATION_TransitionToNewState(stateRun); - if (systemInfos.cmd == CMD_START_WITH_WATCHDOG) { systemTimeout.watchdogEnabled = 1; systemTimeout.watchdogCnt=0; systemTimeout.watchdogMissedCnt=0; } + + APPLICATION_TransitionToNewState(stateRun); } else cmdSendAnswer(ANS_ERR); break; case CMD_RESET_WATCHDOG: if ((systemInfos.state == stateRun) || (systemInfos.state == stateInMouvement)) { if ((systemTimeout.watchdogEnabled ==0 ) || - ((systemTimeout.watchdogCnt>=APPLICATION_WATCHDOG_MIN) && (systemTimeout.watchdogCnt<=APPLICATION_WATCHDOG_MAX))) + ((systemTimeout.watchdogCnt>=(APPLICATION_WATCHDOG_MIN/100)) && (systemTimeout.watchdogCnt<=(APPLICATION_WATCHDOG_MAX/100)))) { + systemTimeout.watchdogMissedCnt=0; // gg, watchog is reset correctly cmdSendAnswer(ANS_OK); - else + } else { + systemTimeout.watchdogMissedCnt++; // If you reset at the wrong time, it still count as missed watchdog reset cmdSendAnswer(ANS_ERR); + } systemTimeout.watchdogCnt =0; - } + } else + cmdSendAnswer(ANS_ERR); break; case CMD_MOVE: case CMD_TURN: if (systemInfos.state == stateRun) { // only state where MOVE or TURN cmds are accepted - if (((systemInfos.cmd == CMD_MOVE) && (systemInfos.distance !=0)) || ((systemInfos.cmd == CMD_TURN) && (systemInfos.turns !=0))) { systemInfos.endOfMouvement = 0; @@ -320,6 +328,8 @@ void APPLICATION_StateMachine() { ((systemInfos.cmd == CMD_TURN) && (systemInfos.turns ==0))) { systemInfos.endOfMouvement = 1; cmdSendAnswer(ANS_OK); + } else { // If MOVE and TURN cmds come with parameters, reject them + cmdSendAnswer(ANS_ERR); } } else cmdSendAnswer(ANS_ERR); @@ -329,7 +339,7 @@ void APPLICATION_StateMachine() { } } - if (systemInfos.endOfMouvement) { + if ((systemInfos.state==stateInMouvement) && (systemInfos.endOfMouvement)) { APPLICATION_TransitionToNewState(stateRun); } @@ -342,14 +352,14 @@ void APPLICATION_StateMachine() { } systemInfos.batteryUpdate = 0; - systemInfos.cmd =0; + systemInfos.cmd = CMD_NONE; systemInfos.endOfMouvement =0; systemInfos.powerOffRequired=0; } void APPLICATION_TransitionToNewState(APPLICATION_State new_state) { LEDS_State ledState = leds_off; - int32_t data; + //int32_t data; switch (new_state) { case stateStartup: @@ -359,30 +369,32 @@ void APPLICATION_TransitionToNewState(APPLICATION_State new_state) { ledState = leds_idle; LEDS_Set(ledState); - MESSAGE_SendMailbox(MOTEURS_Mailbox, MSG_ID_MOTEURS_STOP, APPLICATION_Mailbox, (void*)NULL); + MOTEURS_Stop(); systemTimeout.watchdogEnabled=0; break; case stateRun: - ledState = leds_run; + if (systemTimeout.watchdogEnabled) + ledState = leds_run_with_watchdog; + else + ledState = leds_run; + LEDS_Set(ledState); - MESSAGE_SendMailbox(MOTEURS_Mailbox, MSG_ID_MOTEURS_STOP, APPLICATION_Mailbox, (void*)NULL); + MOTEURS_Stop(); break; case stateInMouvement: ledState = leds_run; LEDS_Set(ledState); if (systemInfos.cmd == CMD_MOVE) { - data = systemInfos.distance; - MESSAGE_SendMailbox(MOTEURS_Mailbox, MSG_ID_MOTEURS_MOVE, APPLICATION_Mailbox, (void*)&data); + MOTEURS_Avance( systemInfos.distance); } else { /* obviously, cmd is CMD_TURN */ - data = systemInfos.turns; - MESSAGE_SendMailbox(MOTEURS_Mailbox, MSG_ID_MOTEURS_TURN, APPLICATION_Mailbox, (void*)&data); + MOTEURS_Tourne(systemInfos.turns); } break; case stateInCharge: /* les leds sont gerées dans APPLICATION_StateMachine */ - MESSAGE_SendMailbox(MOTEURS_Mailbox, MSG_ID_MOTEURS_STOP, APPLICATION_Mailbox, (void*)NULL); + MOTEURS_Stop(); systemTimeout.watchdogEnabled=0; break; case stateWatchdogDisable: @@ -413,7 +425,7 @@ void APPLICATION_PowerOff() { /* * TODO: a decommenter quand le code sera debuggé */ - //HAL_GPIO_WritePin(SHUTDOWN_GPIO_Port, SHUTDOWN_Pin, GPIO_PIN_RESET); + HAL_GPIO_WritePin(SHUTDOWN_GPIO_Port, SHUTDOWN_Pin, GPIO_PIN_RESET); while (1){ __WFE(); // Attente infinie que le regulateur se coupe. @@ -442,9 +454,9 @@ void vTimerTimeoutCallback( TimerHandle_t xTimer ) { if (systemTimeout.watchdogCnt>(APPLICATION_WATCHDOG_MAX/100)) { systemTimeout.watchdogCnt=0; systemTimeout.watchdogMissedCnt++; - - if (systemTimeout.watchdogMissedCnt>=(APPLICATION_WATCHDOG_MISSED_MAX/100)) - APPLICATION_TransitionToNewState(stateWatchdogDisable); /* TODO: Reprendre pour en faire un envoi de message */ } + + if (systemTimeout.watchdogMissedCnt>=APPLICATION_WATCHDOG_MISSED_MAX) + APPLICATION_TransitionToNewState(stateWatchdogDisable); /* TODO: Reprendre pour en faire un envoi de message */ } } diff --git a/software/dumber3/Application/batterie.c b/software/dumber3/Application/batterie.c index 28681c0..b3c5cb5 100644 --- a/software/dumber3/Application/batterie.c +++ b/software/dumber3/Application/batterie.c @@ -17,6 +17,8 @@ typedef enum { CHARGEUR_ERROR } BATTERIE_StatusChargerTypedef; +#define BATTERIE_MAX_ERROR 3 + extern ADC_HandleTypeDef hadc; uint8_t conversion_complete; uint16_t adc_raw_value; @@ -125,16 +127,31 @@ int BATTERIE_LireTension(uint16_t *val) { * Tension batterie: 2.9 critic 3.1 low 3.3 med 3.6 high 4.2 * */ -#define BATTERIE_LEVEL_CRITICAL 200 -#define BATTERIE_LEVEL_LOW 300 -#define BATTERIE_LEVEL_HIGH 500 +#ifdef TESTS +uint8_t BATTERIE_LEVEL_CRITICAL=135; +uint8_t BATTERIE_LEVEL_LOW=145; +uint8_t BATTERIE_LEVEL_HIGH=155; -#define BATTERIE_LEVEL_CHARGE_LOW 400 -#define BATTERIE_LEVEL_CHARGE_HIGH 700 +uint8_t BATTERIE_LEVEL_CHARGE_LOW=150; +uint8_t BATTERIE_LEVEL_CHARGE_HIGH=170; + +uint8_t BATTERIE_currentValue; +#else +#define BATTERIE_LEVEL_CRITICAL 135 +#define BATTERIE_LEVEL_LOW 145 +#define BATTERIE_LEVEL_HIGH 155 + +#define BATTERIE_LEVEL_CHARGE_LOW 150 +#define BATTERIE_LEVEL_CHARGE_HIGH 170 +#endif /* TESTS */ uint16_t BATTERIE_BatteryLevel(uint8_t voltage, BATTERIE_StatusChargerTypedef chargerStatus) { uint16_t msgId=0; +#ifdef TESTS + BATTERIE_currentValue=voltage; +#endif /* TESTS */ + switch (chargerStatus) { case CHARGEUR_CHARGE_COMPLETE: msgId = MSG_ID_BAT_CHARGE_COMPLETE; @@ -166,6 +183,7 @@ uint16_t BATTERIE_BatteryLevel(uint8_t voltage, BATTERIE_StatusChargerTypedef ch void BATTERIE_VoltageThread(void* params) { static uint16_t tension; + static uint8_t batteryErrorCnt=0; BATTERIE_StatusChargerTypedef currentStatus; uint16_t messageID; @@ -177,17 +195,15 @@ void BATTERIE_VoltageThread(void* params) { while (1) { if (BATTERIE_LireTension(&tension) ==0) { currentStatus = BATTERIE_LireStatusChargeur(); - if (currentStatus == CHARGEUR_ERROR) - MESSAGE_SendMailbox(APPLICATION_Mailbox, MSG_ID_BAT_CHARGE_ERR, (QueueHandle_t)0x0, (void*)NULL); - /*else if (currentStatus == CHARGEUR_IN_CHARGE) - MESSAGE_SendMailbox(APPLICATION_Mailbox, MSG_ID_BAT_CHARGE_ON, (QueueHandle_t)0x0, (void*)&tension); - else if (currentStatus == CHARGEUR_CHARGE_COMPLETE) - MESSAGE_SendMailbox(APPLICATION_Mailbox, MSG_ID_BAT_CHARGE_COMPLETE, (QueueHandle_t)0x0, (void*)&tension); - else - MESSAGE_SendMailbox(APPLICATION_Mailbox, MSG_ID_BAT_CHARGE_OFF, (QueueHandle_t)0x0, (void*)&tension);*/ - messageID = BATTERIE_BatteryLevel(tension, currentStatus); - MESSAGE_SendMailbox(APPLICATION_Mailbox, messageID, (QueueHandle_t)0x0, (void*)NULL); + if (currentStatus == CHARGEUR_ERROR) { + batteryErrorCnt++; + if (batteryErrorCnt>=BATTERIE_MAX_ERROR) + MESSAGE_SendMailbox(APPLICATION_Mailbox, MSG_ID_BAT_CHARGE_ERR, (QueueHandle_t)0x0, (void*)NULL); + } else { + messageID = BATTERIE_BatteryLevel(tension, currentStatus); + MESSAGE_SendMailbox(APPLICATION_Mailbox, messageID, (QueueHandle_t)0x0, (void*)NULL); + } #ifdef TESTS MESSAGE_SendMailbox(APPLICATION_Mailbox, MSG_ID_BAT_LEVEL, (QueueHandle_t)0x0, (void*)&tension); #endif /* TESTS*/ diff --git a/software/dumber3/Application/leds.c b/software/dumber3/Application/leds.c index 2db657d..3212052 100644 --- a/software/dumber3/Application/leds.c +++ b/software/dumber3/Application/leds.c @@ -355,9 +355,9 @@ void LEDS_ActionThread(void* params) { cnt=0; break; case leds_watchdog_expired: - if (cnt<3) + if (cnt<4) LEDS_ShowPattern(LED_PATTERN_WDT_EXP_1); - else if (cnt<6) + else if (cnt<7) LEDS_ShowPattern(LED_PATTERN_WDT_EXP_2); else cnt=0; diff --git a/software/dumber3/Application/moteurs.c b/software/dumber3/Application/moteurs.c index 11afe78..937351c 100644 --- a/software/dumber3/Application/moteurs.c +++ b/software/dumber3/Application/moteurs.c @@ -236,10 +236,13 @@ void MOTEURS_TachePrincipale(void *params) { MOTEURS_EtatMoteurGauche.consigne = 0; MOTEURS_EtatMoteurDroit.consigne = 0; if ((MOTEURS_CorrectionEncodeur(MOTEURS_EtatMoteurGauche) == 0) - && (MOTEURS_CorrectionEncodeur(MOTEURS_EtatMoteurDroit) == 0)) + && (MOTEURS_CorrectionEncodeur(MOTEURS_EtatMoteurDroit) == 0)) { // Les moteurs sont déjà arrêtés vTaskSuspend(xHandleMoteursAsservissement); - else + + MESSAGE_SendMailbox(APPLICATION_Mailbox, MSG_ID_MOTEURS_END_OF_MOUVMENT, + MOTEURS_Mailbox, (void*) NULL); + } else // Les moteurs tournent encore vTaskResume(xHandleMoteursAsservissement); break; @@ -289,6 +292,8 @@ void MOTEURS_TacheAsservissement(void *params) { && ((erreurD == 0) && (erreurG == 0))) { MOTEURS_DesactiveAlim(); + MESSAGE_SendMailbox(APPLICATION_Mailbox, MSG_ID_MOTEURS_END_OF_MOUVMENT, + MOTEURS_Mailbox, (void*) NULL); vTaskSuspend(xHandleMoteursAsservissement); } diff --git a/software/dumber3/Application/panic.c b/software/dumber3/Application/panic.c index 391e1f8..99c12fc 100644 --- a/software/dumber3/Application/panic.c +++ b/software/dumber3/Application/panic.c @@ -49,8 +49,8 @@ void PANIC_StopTasksAndWait(void){ currentTask = xTaskGetCurrentTaskHandle(); /* Arret des timers */ - xTimerStop(xHandleTimerButton,0); - xTimerStop(xHandleTimerTimeout,0); + //xTimerStop(xHandleTimerButton,0); + //xTimerStop(xHandleTimerTimeout,0); /* Arret des taches * On n'arrete toute les taches sauf celle en cours ! diff --git a/software/dumber3/Commands tests WDT.xml b/software/dumber3/Commands tests WDT.xml new file mode 100644 index 0000000..25eb3f9 --- /dev/null +++ b/software/dumber3/Commands tests WDT.xml @@ -0,0 +1,45 @@ + + + + true + 1 + 1100 + + + 72720D + + + 57570D + + + 77770D + + + 77770D + + + 77770D + + + 77770D + + + 77770D + + + 77770D + + + 77770D + + + 77770D + + + 77770D + + + 77770D + + + diff --git a/software/dumber3/Core/Src/main.c b/software/dumber3/Core/Src/main.c index d7f4120..921743c 100644 --- a/software/dumber3/Core/Src/main.c +++ b/software/dumber3/Core/Src/main.c @@ -24,7 +24,10 @@ /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "application.h" + +#ifdef TESTS #include "tests.h" +#endif /* TESTS */ /* USER CODE END Includes */ diff --git a/software/dumber3/Dumber3 Debug.launch b/software/dumber3/Dumber3 Debug.launch new file mode 100644 index 0000000..ec8e61b --- /dev/null +++ b/software/dumber3/Dumber3 Debug.launch @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/software/dumber3/TestsPlans/tests.c b/software/dumber3/TestsPlans/tests.c index 1de29a6..6ffa391 100644 --- a/software/dumber3/TestsPlans/tests.c +++ b/software/dumber3/TestsPlans/tests.c @@ -32,10 +32,11 @@ typedef enum { COMMANDS_Tests, BATTERY_Tests, MOTEURS_Tests, - MISC_Tests + MISC_Tests, + PANIC_Tests } TESTS_Type; -TESTS_Type TESTS_Nbr=LEDS_Tests; // Number indicating which test is being run +TESTS_Type TESTS_Nbr=BATTERY_Tests; // Number indicating which test is being run void TESTS_BasicTests(void* params); @@ -328,6 +329,14 @@ void TESTS_BasicTests(void* params) { } } break; + case PANIC_Tests: // test du bouton on/off + + /* test si le systeme detecte qu'il n'y a plus de memoire et part en panic */ + while (1) { + volatile char* str; + str = (char*)malloc(100); /* allocate a buffer of 100 bytes */ + } + break; default: break; }