dumber/software/dumber3/Core/Src/leds.c
2022-10-18 10:33:48 +02:00

241 lines
5.1 KiB
C

/*
* leds.h
*
* Created on: Sep 12, 2022
* Author: dimercur
*/
#include "main.h"
#define LEDS_AllumeVerte() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET)
#define LEDS_AllumeJaune() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET)
#define LEDS_AllumeRouge() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET)
#define LEDS_EteintVerte() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET)
#define LEDS_EteintJaune() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET)
#define LEDS_EteintRouge() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET)
LEDS_State LEDS_Animation;
LEDS_State LEDS_AnimationAncien;
StaticTask_t xTaskLeds;
/* Buffer that the task being created will use as its stack. Note this is
an array of StackType_t variables. The size of StackType_t is dependent on
the RTOS port. */
StackType_t xStackLeds[ STACK_SIZE ];
TaskHandle_t xHandleLeds = NULL;
void LEDS_AnimationThread(void* params);
void LEDS_Init(void) {
LEDS_EteintVerte();
LEDS_EteintJaune();
LEDS_EteintRouge();
LEDS_Animation=leds_off;
LEDS_AnimationAncien =LEDS_Animation;
/* Mailbox is created in messages.c */
/* Create the task without using any dynamic memory allocation. */
xHandleLeds = xTaskCreateStatic(
LEDS_AnimationThread, /* Function that implements the task. */
"LEDS Animation", /* Text name for the task. */
STACK_SIZE, /* Number of indexes in the xStack array. */
NULL, /* Parameter passed into the task. */
PriorityLeds,/* Priority at which the task is created. */
xStackLeds, /* Array to use as the task's stack. */
&xTaskLeds); /* Variable to hold the task's data structure. */
vTaskResume(xHandleLeds);
}
void LEDS_AnimationThread(void* params) {
MESSAGE_Typedef msg;
uint8_t cnt=0;
static int oneShot=1;
while (1) {
vTaskDelay(pdMS_TO_TICKS(100));
msg = MESSAGE_ReadMailboxNoDelay(LEDS_Mailbox);
cnt++;
if (msg.id == MSG_ID_LED_ETAT) { // Si c'est bien un message de changement d'etat LEDS
LEDS_Animation = *((LEDS_State*)msg.data);
if (LEDS_Animation != LEDS_AnimationAncien) { // si le nouvel etat est different de l'ancien
// dans ce cas, on eteint les leds pour repartir sur une base saine
LEDS_AnimationAncien = LEDS_Animation;
LEDS_EteintVerte();
LEDS_EteintJaune();
LEDS_EteintRouge();
cnt=0;
}
if ((LEDS_Animation == cmd_rcv_ok) || (LEDS_Animation == cmd_rcv_err) || (LEDS_Animation == cmd_rcv_unknown))
{
oneShot =1;
cnt=0;
}
}
switch (LEDS_Animation) {
case leds_off:
LEDS_EteintVerte();
LEDS_EteintJaune();
LEDS_EteintRouge();
break;
case leds_idle:
if (cnt<5)
LEDS_AllumeVerte();
else if (cnt<10)
LEDS_EteintVerte();
else
cnt=0;
break;
case leds_connecte:
LEDS_AllumeVerte();
break;
case leds_watchdog_expire:
if (cnt<5)
LEDS_AllumeRouge();
else if (cnt<10)
LEDS_EteintRouge();
else
cnt=0;
break;
case leds_niveau_bat_0:
if (!(cnt%2))
LEDS_AllumeRouge();
else
LEDS_EteintRouge();
break;
case leds_niveau_bat_1:
LEDS_AllumeRouge();
break;
case leds_niveau_bat_2:
LEDS_AllumeRouge();
if (cnt<3)
LEDS_AllumeJaune();
else if (cnt<6)
LEDS_EteintJaune();
else
cnt=0;
break;
case leds_niveau_bat_3:
LEDS_AllumeRouge();
LEDS_AllumeJaune();
break;
case leds_niveau_bat_4:
LEDS_AllumeRouge();
LEDS_AllumeJaune();
if (cnt<3)
LEDS_AllumeVerte();
else if (cnt<6)
LEDS_EteintVerte();
else
cnt=0;
break;
case leds_niveau_bat_5:
LEDS_AllumeRouge();
LEDS_AllumeJaune();
LEDS_AllumeVerte();
break;
case leds_charge_bat_0:
case leds_charge_bat_1:
if (cnt<3)
LEDS_AllumeRouge();
else if (cnt<6)
LEDS_AllumeJaune();
else if (cnt<9)
LEDS_AllumeVerte();
else if (cnt<12){
LEDS_EteintVerte();
LEDS_EteintJaune();
LEDS_EteintRouge();
} else
cnt=0;
break;
case leds_charge_bat_2:
case leds_charge_bat_3:
LEDS_AllumeRouge();
if (cnt<3)
LEDS_AllumeJaune();
else if (cnt<6)
LEDS_AllumeVerte();
else if (cnt <9){
LEDS_EteintVerte();
LEDS_EteintJaune();
} else
cnt=0;
break;
case leds_charge_bat_4:
case leds_charge_bat_5:
LEDS_AllumeRouge();
LEDS_AllumeJaune();
if (cnt<3)
LEDS_AllumeVerte();
else if (cnt<6)
LEDS_EteintVerte();
else
cnt=0;
break;
case leds_erreur:
if (cnt<5) {
LEDS_AllumeRouge();
LEDS_AllumeJaune();
LEDS_AllumeVerte();
}
else if (cnt<10) {
LEDS_EteintRouge();
LEDS_EteintJaune();
LEDS_EteintVerte();
}
else
cnt=0;
break;
case cmd_rcv_ok:
if (oneShot) {
if (cnt<3)
LEDS_AllumeVerte();
else if (cnt<10)
LEDS_EteintVerte();
else {
cnt=0;
oneShot=0;
}
}
break;
case cmd_rcv_err:
if (oneShot) {
if (cnt<3)
LEDS_AllumeRouge();
else if (cnt<10)
LEDS_EteintRouge();
else {
cnt=0;
oneShot=0;
}
}
break;
case cmd_rcv_unknown:
if (oneShot) {
if (cnt<3)
LEDS_AllumeJaune();
else if (cnt<10)
LEDS_EteintJaune();
else {
cnt=0;
oneShot=0;
}
}
break;
default:
break;
}
}
}