Files
cls_master/Application/Tasks/LightState.c
2024-05-20 17:44:56 +02:00

90 lines
2.1 KiB
C

#include "cmsis_os2.h"
#include "LightState.h"
#include "BSP_GPIO.h"
#include "BSP_INA.h"
#include "LightTask.h"
#include "ulog.h"
// Create the task with a specific priority and stack size
osThreadAttr_t task_attr = {
.name = "LightStateTask",
.priority = osPriorityNormal,
.stack_size = 1024
};
// Function prototype for the task function
void LightStateTask(void *argument);
// Function to start the LightStateTask
void LightStateTask_start(void)
{
osThreadNew(LightStateTask, NULL, &task_attr);
}
// Check if K15 is on for switching the light state
static bool isK15On()
{
return BSP_GPIO_K15isSet();
}
// Define the threshold voltage for engine running
#define ENGINE_RUNNING_THRESHOLD 13500 // 13.5V = 13500mV
// Check if the engine is running by checking the voltage of the battery, if above the threshold, the engine is running
static bool isEngineRunning()
{
return BSP_INA_Voltage() > ENGINE_RUNNING_THRESHOLD;
}
// check if the headlight is on and the engine is running to switch the light state
// we can check the headlight using the GPIO functions
static bool isHeadlightOn()
{
return BSP_GPIO_HeadLightIsSet();
}
// Function to determine the next state of the light
// return 1 as default state
// return 2 if the engine is running
// return 3 if the headlight and engine is running
static int determineNextState()
{
if (isHeadlightOn() && isEngineRunning()) {
return 2;
} else if (isEngineRunning()) {
return 1;
} else {
return 0;
}
}
// Task function
void LightStateTask(void *argument)
{
// default state
int current_state = 0;
// Infinite loop to keep the task running
while (1)
{
// only change the state if the current state is different from the next state
int next_state = determineNextState();
if (current_state != next_state) {
LightTask_setTheme(next_state);
ULOG_INFO("Light state changed to %d", next_state);
current_state = next_state;
}
// Delay the task for a certain amount of time (in milliseconds)
osDelay(500);
}
}