V1.8
This commit is contained in:
128
Core/Src/status_LED.c
Normal file
128
Core/Src/status_LED.c
Normal file
@ -0,0 +1,128 @@
|
||||
/*
|
||||
* status_LED.h
|
||||
*
|
||||
* Created on: 07.07.2024
|
||||
* Author: Hamza
|
||||
*/
|
||||
|
||||
#include "ADBMS_LL_Driver.h"
|
||||
#include "state_machine.h"
|
||||
#include "stm32f3xx_hal.h"
|
||||
#include <status_LED.h>
|
||||
#include <stdint.h>
|
||||
|
||||
/* The PWM period (1/FPWM) is defined by the following parameters:
|
||||
ARR value, the Prescaler value, and the internal clock itself which drives the timer module FCLK.
|
||||
F_PWM = (F_CLK)/((ARR + 1) * (PSC + 1))
|
||||
|
||||
Prescaler:
|
||||
(ARR + 1) * (PSC + 1) = (F_CLK)/(F_PWM)
|
||||
(PSC + 1) = (F_CLK)/(F_PWM * (ARR + 1))
|
||||
625 = (16MHz)/(100Hz * (255 + 1))
|
||||
|
||||
F_CLK = 16 MHz
|
||||
*/
|
||||
|
||||
#define STATUS_LED_ARR 255
|
||||
#define BLINK_LENGTH 300
|
||||
#define TIME_BETWEEN_BLINKS 200
|
||||
#define TIME_BETWEEN_BLINK_SEQS 500
|
||||
|
||||
TIM_HandleTypeDef* red;
|
||||
TIM_HandleTypeDef* green;
|
||||
TIM_HandleTypeDef* blue;
|
||||
uint8_t blinked;
|
||||
uint32_t blink_timer;
|
||||
bool blink_state;
|
||||
|
||||
void status_led_init(TIM_HandleTypeDef* r, TIM_HandleTypeDef* g, TIM_HandleTypeDef* b){
|
||||
red = r;
|
||||
green = g;
|
||||
blue = b;
|
||||
|
||||
blink_timer = 0;
|
||||
blink_state = 0;
|
||||
blinked = 0;
|
||||
|
||||
HAL_TIM_PWM_Start(red, TIM_CHANNEL_1); //TIM4CH1
|
||||
HAL_TIM_PWM_Start(green, TIM_CHANNEL_2); //TIM4CH2
|
||||
HAL_TIM_PWM_Start(blue, TIM_CHANNEL_3); //TIM4CH3
|
||||
|
||||
status_led_set(255, 255, 255);
|
||||
}
|
||||
|
||||
void status_led_update(){
|
||||
switch (state.current_state) {
|
||||
case STATE_INACTIVE:
|
||||
status_led_blink_sequence(1, GREEN);
|
||||
break;
|
||||
case STATE_CHARGING_PRECHARGE:
|
||||
case STATE_PRECHARGE:
|
||||
case STATE_DISCHARGE:
|
||||
status_led_blink_sequence(2, YELLOW);
|
||||
break;
|
||||
case STATE_CHARGING:
|
||||
case STATE_READY:
|
||||
status_led_blink_sequence(3, PINK);
|
||||
break;
|
||||
case STATE_ACTIVE:
|
||||
status_led_set_color(PINK);
|
||||
break;
|
||||
case STATE_ERROR:
|
||||
status_led_set_color(RED);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void status_led_blink_sequence(uint8_t blinks, color color){
|
||||
if (blink_timer < HAL_GetTick())
|
||||
return;
|
||||
|
||||
if (blink_state){
|
||||
if (blinked != blinks){
|
||||
blink_timer = HAL_GetTick() + BLINK_LENGTH;
|
||||
blinks++;
|
||||
status_led_set_color(GREEN);
|
||||
} else {
|
||||
blink_timer = HAL_GetTick() + TIME_BETWEEN_BLINK_SEQS;
|
||||
blinks = 0;
|
||||
}
|
||||
} else {
|
||||
if (blinked != blinks){
|
||||
blink_timer = HAL_GetTick() + TIME_BETWEEN_BLINKS;
|
||||
status_led_set_color(OFF);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void status_led_set_color(color color){
|
||||
switch (color) {
|
||||
case RED:
|
||||
status_led_set(255, 0, 0);
|
||||
break;
|
||||
case GREEN:
|
||||
status_led_set(0, 255, 0);
|
||||
break;
|
||||
case BLUE:
|
||||
status_led_set(0, 0, 255);
|
||||
break;
|
||||
case YELLOW:
|
||||
status_led_set(255, 255, 0);
|
||||
break;
|
||||
case PINK:
|
||||
status_led_set(255, 0, 255);
|
||||
break;
|
||||
case CYAN:
|
||||
status_led_set(0, 255, 255);
|
||||
break;
|
||||
case WHITE:
|
||||
status_led_set(255, 255, 255);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void status_led_set(uint8_t r, uint8_t g, uint8_t b){
|
||||
__HAL_TIM_SET_COMPARE(red, TIM_CHANNEL_1, r);
|
||||
__HAL_TIM_SET_COMPARE(green, TIM_CHANNEL_2, g);
|
||||
__HAL_TIM_SET_COMPARE(blue, TIM_CHANNEL_3, b);
|
||||
}
|
||||
Reference in New Issue
Block a user