mirror of
https://github.com/yoboujon/dumber.git
synced 2025-06-08 13:50:49 +02:00
Ajout d'un systeme de panic pour tracer des erreurs irrecuperables
This commit is contained in:
parent
64b8f9fe08
commit
1d27411326
7 changed files with 142 additions and 6 deletions
|
@ -16,6 +16,8 @@
|
||||||
#include "batterie.h"
|
#include "batterie.h"
|
||||||
#include "messages.h"
|
#include "messages.h"
|
||||||
|
|
||||||
|
#include "panic.h"
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
stateStartup=0,
|
stateStartup=0,
|
||||||
stateIdle,
|
stateIdle,
|
||||||
|
@ -179,9 +181,11 @@ void APPLICATION_MainThread(void* params) {
|
||||||
|
|
||||||
case MSG_ID_BAT_ADC_ERR:
|
case MSG_ID_BAT_ADC_ERR:
|
||||||
/* depart en panic: error 2 */
|
/* depart en panic: error 2 */
|
||||||
|
PANIC_Raise(panic_adc_err);
|
||||||
break;
|
break;
|
||||||
case MSG_ID_BAT_CHARGE_ERR:
|
case MSG_ID_BAT_CHARGE_ERR:
|
||||||
/* depart en panic: error 3 */
|
/* depart en panic: error 3 */
|
||||||
|
PANIC_Raise(panic_charger_err);
|
||||||
break;
|
break;
|
||||||
case MSG_ID_BAT_CHARGE_COMPLETE:
|
case MSG_ID_BAT_CHARGE_COMPLETE:
|
||||||
case MSG_ID_BAT_CHARGE_LOW:
|
case MSG_ID_BAT_CHARGE_LOW:
|
||||||
|
@ -382,7 +386,7 @@ void APPLICATION_TransitionToNewState(APPLICATION_State new_state) {
|
||||||
systemTimeout.watchdogEnabled=0;
|
systemTimeout.watchdogEnabled=0;
|
||||||
break;
|
break;
|
||||||
case stateWatchdogDisable:
|
case stateWatchdogDisable:
|
||||||
ledState = leds_erreur_1;
|
ledState = leds_watchdog_expired;
|
||||||
LEDS_Set(ledState);
|
LEDS_Set(ledState);
|
||||||
|
|
||||||
systemTimeout.watchdogEnabled=0;
|
systemTimeout.watchdogEnabled=0;
|
||||||
|
@ -440,7 +444,7 @@ void vTimerTimeoutCallback( TimerHandle_t xTimer ) {
|
||||||
systemTimeout.watchdogMissedCnt++;
|
systemTimeout.watchdogMissedCnt++;
|
||||||
|
|
||||||
if (systemTimeout.watchdogMissedCnt>=(APPLICATION_WATCHDOG_MISSED_MAX/100))
|
if (systemTimeout.watchdogMissedCnt>=(APPLICATION_WATCHDOG_MISSED_MAX/100))
|
||||||
APPLICATION_TransitionToNewState(stateWatchdogDisable);
|
APPLICATION_TransitionToNewState(stateWatchdogDisable); /* TODO: Reprendre pour en faire un envoi de message */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,8 +45,8 @@ uint8_t BUTTON_Inactivity=1; //start with button on/off inactive
|
||||||
void BATTERIE_VoltageThread(void* params);
|
void BATTERIE_VoltageThread(void* params);
|
||||||
|
|
||||||
void BATTERIE_Init(void) {
|
void BATTERIE_Init(void) {
|
||||||
task_handler = NULL;
|
//task_handler = NULL;
|
||||||
charger_thread_handler = NULL;
|
//charger_thread_handler = NULL;
|
||||||
|
|
||||||
/* Create the task without using any dynamic memory allocation. */
|
/* Create the task without using any dynamic memory allocation. */
|
||||||
xHandleBatterie = xTaskCreateStatic(
|
xHandleBatterie = xTaskCreateStatic(
|
||||||
|
|
|
@ -68,9 +68,11 @@
|
||||||
#define LED_PATTERN_DIGIT_C 31
|
#define LED_PATTERN_DIGIT_C 31
|
||||||
#define LED_PATTERN_DIGIT_L 32
|
#define LED_PATTERN_DIGIT_L 32
|
||||||
#define LED_PATTERN_DIGIT_B 33
|
#define LED_PATTERN_DIGIT_B 33
|
||||||
#define LED_PATTERN_DIGIT_UNKNOWN 34
|
#define LED_PATTERN_WDT_EXP_1 34
|
||||||
|
#define LED_PATTERN_WDT_EXP_2 35
|
||||||
|
#define LED_PATTERN_DIGIT_UNKNOWN 36
|
||||||
|
|
||||||
#define LED_MAX_PATTERNS 35
|
#define LED_MAX_PATTERNS 37
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Relation entre segment et nom
|
* Relation entre segment et nom
|
||||||
|
@ -131,6 +133,8 @@ uint16_t LEDS_Patterns [LED_MAX_PATTERNS][4]= {
|
||||||
{ LED_SEG_D_Pin, LED_SEG_A_Pin|LED_SEG_B_Pin|LED_SEG_C_Pin, LED_SEG_E_Pin|LED_SEG_F_Pin|LED_SEG_G_Pin|LED_SEG_DP_Pin, 0}, // C
|
{ LED_SEG_D_Pin, LED_SEG_A_Pin|LED_SEG_B_Pin|LED_SEG_C_Pin, LED_SEG_E_Pin|LED_SEG_F_Pin|LED_SEG_G_Pin|LED_SEG_DP_Pin, 0}, // C
|
||||||
{ 0, LED_SEG_A_Pin|LED_SEG_B_Pin|LED_SEG_C_Pin, LED_SEG_D_Pin|LED_SEG_E_Pin|LED_SEG_F_Pin|LED_SEG_G_Pin|LED_SEG_DP_Pin, 0},// L
|
{ 0, LED_SEG_A_Pin|LED_SEG_B_Pin|LED_SEG_C_Pin, LED_SEG_D_Pin|LED_SEG_E_Pin|LED_SEG_F_Pin|LED_SEG_G_Pin|LED_SEG_DP_Pin, 0},// L
|
||||||
{ LED_SEG_F_Pin|LED_SEG_G_Pin, LED_SEG_A_Pin|LED_SEG_B_Pin|LED_SEG_C_Pin, LED_SEG_D_Pin|LED_SEG_E_Pin|LED_SEG_DP_Pin, 0}, // b
|
{ LED_SEG_F_Pin|LED_SEG_G_Pin, LED_SEG_A_Pin|LED_SEG_B_Pin|LED_SEG_C_Pin, LED_SEG_D_Pin|LED_SEG_E_Pin|LED_SEG_DP_Pin, 0}, // b
|
||||||
|
{ LED_SEG_E_Pin, LED_SEG_B_Pin, LED_SEG_D_Pin|LED_SEG_F_Pin|LED_SEG_G_Pin|LED_SEG_DP_Pin, LED_SEG_A_Pin|LED_SEG_C_Pin}, // Watchdog expired 1
|
||||||
|
{ LED_SEG_F_Pin, LED_SEG_C_Pin, LED_SEG_D_Pin|LED_SEG_E_Pin|LED_SEG_G_Pin|LED_SEG_DP_Pin, LED_SEG_A_Pin|LED_SEG_B_Pin}, // Watchdog expired 2
|
||||||
{ LED_SEG_D_Pin|LED_SEG_E_Pin|LED_SEG_G_Pin, LED_SEG_B_Pin, LED_SEG_F_Pin|LED_SEG_DP_Pin, LED_SEG_A_Pin|LED_SEG_C_Pin} // ?
|
{ LED_SEG_D_Pin|LED_SEG_E_Pin|LED_SEG_G_Pin, LED_SEG_B_Pin, LED_SEG_F_Pin|LED_SEG_DP_Pin, LED_SEG_A_Pin|LED_SEG_C_Pin} // ?
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -350,6 +354,14 @@ void LEDS_ActionThread(void* params) {
|
||||||
|
|
||||||
cnt=0;
|
cnt=0;
|
||||||
break;
|
break;
|
||||||
|
case leds_watchdog_expired:
|
||||||
|
if (cnt<3)
|
||||||
|
LEDS_ShowPattern(LED_PATTERN_WDT_EXP_1);
|
||||||
|
else if (cnt<6)
|
||||||
|
LEDS_ShowPattern(LED_PATTERN_WDT_EXP_2);
|
||||||
|
else
|
||||||
|
cnt=0;
|
||||||
|
break;
|
||||||
case leds_erreur_1:
|
case leds_erreur_1:
|
||||||
if (cnt<5)
|
if (cnt<5)
|
||||||
LEDS_ShowPattern(LED_PATTERN_ERROR);
|
LEDS_ShowPattern(LED_PATTERN_ERROR);
|
||||||
|
|
|
@ -23,6 +23,7 @@ typedef enum {
|
||||||
leds_bat_charge_med,
|
leds_bat_charge_med,
|
||||||
leds_bat_charge_high,
|
leds_bat_charge_high,
|
||||||
leds_bat_charge_complete,
|
leds_bat_charge_complete,
|
||||||
|
leds_watchdog_expired,
|
||||||
leds_erreur_1,
|
leds_erreur_1,
|
||||||
leds_erreur_2,
|
leds_erreur_2,
|
||||||
leds_erreur_3,
|
leds_erreur_3,
|
||||||
|
|
94
software/dumber3/Application/panic.c
Normal file
94
software/dumber3/Application/panic.c
Normal file
|
@ -0,0 +1,94 @@
|
||||||
|
/*
|
||||||
|
* panic.c
|
||||||
|
*
|
||||||
|
* Created on: Oct 11, 2023
|
||||||
|
* Author: dimercur
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "application.h"
|
||||||
|
#include "timers.h"
|
||||||
|
|
||||||
|
#include "panic.h"
|
||||||
|
#include "leds.h"
|
||||||
|
|
||||||
|
void PANIC_StopTasksAndWait(void);
|
||||||
|
void MOTEURS_DesactiveAlim(void);
|
||||||
|
|
||||||
|
extern TaskHandle_t xHandleLedsHandler;
|
||||||
|
extern TaskHandle_t xHandleLedsAction;
|
||||||
|
extern TaskHandle_t xHandleBatterie;
|
||||||
|
extern TimerHandle_t xHandleTimerButton;
|
||||||
|
extern TaskHandle_t xHandleApplicationMain;
|
||||||
|
extern TimerHandle_t xHandleTimerTimeout;
|
||||||
|
extern TaskHandle_t xHandleMoteurs;
|
||||||
|
extern TaskHandle_t xHandleMoteursAsservissement;
|
||||||
|
extern TaskHandle_t xHandleXbeeTXHandler;
|
||||||
|
extern TaskHandle_t xHandleXbeeRX;
|
||||||
|
|
||||||
|
void PANIC_Raise(PANIC_Typedef panicId) {
|
||||||
|
switch (panicId) {
|
||||||
|
case panic_adc_err:
|
||||||
|
LEDS_Set(leds_erreur_1);
|
||||||
|
break;
|
||||||
|
case panic_charger_err:
|
||||||
|
LEDS_Set(leds_erreur_2);
|
||||||
|
break;
|
||||||
|
case panic_malloc:
|
||||||
|
LEDS_Set(leds_erreur_3);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
LEDS_Set(leds_erreur_5);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
PANIC_StopTasksAndWait();
|
||||||
|
}
|
||||||
|
|
||||||
|
void PANIC_StopTasksAndWait(void){
|
||||||
|
TaskHandle_t currentTask;
|
||||||
|
currentTask = xTaskGetCurrentTaskHandle();
|
||||||
|
|
||||||
|
/* Arret des timers */
|
||||||
|
xTimerStop(xHandleTimerButton,0);
|
||||||
|
xTimerStop(xHandleTimerTimeout,0);
|
||||||
|
|
||||||
|
/* Arret des taches
|
||||||
|
* On n'arrete toute les taches sauf celle en cours !
|
||||||
|
*
|
||||||
|
* a la fin, on arrete la tache en cours
|
||||||
|
*
|
||||||
|
* on n'arrete jamais les leds, sinon plus d'animation !!
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (currentTask != xHandleXbeeRX)
|
||||||
|
vTaskSuspend(xHandleXbeeRX);
|
||||||
|
|
||||||
|
if (currentTask != xHandleXbeeTXHandler)
|
||||||
|
vTaskSuspend(xHandleXbeeTXHandler);
|
||||||
|
|
||||||
|
if (currentTask != xHandleMoteurs)
|
||||||
|
vTaskSuspend(xHandleMoteurs);
|
||||||
|
|
||||||
|
if (currentTask != xHandleMoteursAsservissement)
|
||||||
|
vTaskSuspend(xHandleMoteursAsservissement);
|
||||||
|
|
||||||
|
if (currentTask != xHandleBatterie)
|
||||||
|
vTaskSuspend(xHandleBatterie);
|
||||||
|
|
||||||
|
if (currentTask != xHandleApplicationMain)
|
||||||
|
vTaskSuspend(xHandleApplicationMain);
|
||||||
|
|
||||||
|
|
||||||
|
/* Stop des alim moteurs */
|
||||||
|
MOTEURS_DesactiveAlim();
|
||||||
|
|
||||||
|
/* disable XBEE */
|
||||||
|
HAL_GPIO_WritePin(XBEE_RESET_GPIO_Port, XBEE_RESET_Pin, GPIO_PIN_RESET);
|
||||||
|
|
||||||
|
/* Stop la tache courante */
|
||||||
|
vTaskSuspend(currentTask);
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
__WFE(); /* Attente infinie */
|
||||||
|
}
|
||||||
|
}
|
19
software/dumber3/Application/panic.h
Normal file
19
software/dumber3/Application/panic.h
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
/*
|
||||||
|
* panic.h
|
||||||
|
*
|
||||||
|
* Created on: Oct 11, 2023
|
||||||
|
* Author: dimercur
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef PANIC_H_
|
||||||
|
#define PANIC_H_
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
panic_charger_err=1, // erreur 1
|
||||||
|
panic_adc_err, // erreur 2
|
||||||
|
panic_malloc // erreur 3
|
||||||
|
} PANIC_Typedef;
|
||||||
|
|
||||||
|
void PANIC_Raise(PANIC_Typedef panicId);
|
||||||
|
|
||||||
|
#endif /* PANIC_H_ */
|
|
@ -33,6 +33,8 @@
|
||||||
|
|
||||||
#include "cmsis_os.h"
|
#include "cmsis_os.h"
|
||||||
|
|
||||||
|
#include "panic.h"
|
||||||
|
|
||||||
/* Variables */
|
/* Variables */
|
||||||
extern int __io_putchar(int ch) __attribute__((weak));
|
extern int __io_putchar(int ch) __attribute__((weak));
|
||||||
extern int __io_getchar(void) __attribute__((weak));
|
extern int __io_getchar(void) __attribute__((weak));
|
||||||
|
@ -55,6 +57,10 @@ void* malloc(size_t size)
|
||||||
// We simply wrap the FreeRTOS call into a standard form
|
// We simply wrap the FreeRTOS call into a standard form
|
||||||
ptr = pvPortMalloc(size);
|
ptr = pvPortMalloc(size);
|
||||||
Counter_Malloc++;
|
Counter_Malloc++;
|
||||||
|
|
||||||
|
if (ptr==NULL) { /* plus assez de memoire dynamique*/
|
||||||
|
PANIC_Raise(panic_malloc);
|
||||||
|
}
|
||||||
} // else NULL if there was an error
|
} // else NULL if there was an error
|
||||||
|
|
||||||
return ptr;
|
return ptr;
|
||||||
|
|
Loading…
Add table
Reference in a new issue