From 69a01f167eaa6a8df44043544f49eaac7dd8c78e Mon Sep 17 00:00:00 2001 From: Oliver Walter Date: Sun, 25 Feb 2024 00:01:41 +0100 Subject: [PATCH] add lightTask --- Application/Tasks/CMakeLists.txt | 5 +- Application/Tasks/FirmwareHandler.c | 14 +---- Application/Tasks/LightTask.c | 97 +++++++++++++++++++++++++++++ Application/Tasks/LightTask.h | 46 ++++++++++++++ Application/Tasks/UsbDataHandler.c | 8 +++ Application/Tasks/UsbDataHandler.h | 19 ++++++ Core/Src/freertos.c | 28 ++------- 7 files changed, 180 insertions(+), 37 deletions(-) create mode 100644 Application/Tasks/LightTask.c create mode 100644 Application/Tasks/LightTask.h diff --git a/Application/Tasks/CMakeLists.txt b/Application/Tasks/CMakeLists.txt index 3c55720..84bde4e 100644 --- a/Application/Tasks/CMakeLists.txt +++ b/Application/Tasks/CMakeLists.txt @@ -10,13 +10,14 @@ target_sources(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR}/CanDataTask.c ${CMAKE_CURRENT_LIST_DIR}/FirmwareHandler.c ${CMAKE_CURRENT_LIST_DIR}/FirmwareUpdate.c + ${CMAKE_CURRENT_LIST_DIR}/LightTask.c INTERFACE ${CMAKE_CURRENT_LIST_DIR}/UsbDataHandler.h ${CMAKE_CURRENT_LIST_DIR}/CanDataTask.h ${CMAKE_CURRENT_LIST_DIR}/FirmwareUpdate.h - + ${CMAKE_CURRENT_LIST_DIR}/LightTask.h ) target_include_directories(${PROJECT_NAME} INTERFACE ${CMAKE_CURRENT_LIST_DIR}) target_link_libraries(${PROJECT_NAME} PUBLIC PROTOS CLS) -target_link_libraries(${PROJECT_NAME} PRIVATE CLS_BSP) \ No newline at end of file +target_link_libraries(${PROJECT_NAME} PRIVATE CLS_BSP BSP) \ No newline at end of file diff --git a/Application/Tasks/FirmwareHandler.c b/Application/Tasks/FirmwareHandler.c index 61ee4f0..4f3faf0 100644 --- a/Application/Tasks/FirmwareHandler.c +++ b/Application/Tasks/FirmwareHandler.c @@ -9,6 +9,7 @@ #include "UsbDataHandler.h" #include "crc.h" #include "FirmwareUpdate.h" +#include "stdbool.h" // static memory only for decoding messages static FirmwareStart msg_FirmwareStart; @@ -25,19 +26,6 @@ static FRESULT fresult_open =0; static uint32_t fwStartTime = 0; static uint32_t fwPackageCounter =0; -#define ASSERT_SIZE(x) \ - { \ - if (!(x)) \ - Error_Handler(); \ - } - -#define DATA_CLBK_SETUP(name) \ - { \ - ASSERT_SIZE(length == sizeof(name)); \ - memcpy(&msg_##name, msg, sizeof(name)); \ - } - - /** * @brief This function builds and sends a FirmwarePackageAck message over USB. * diff --git a/Application/Tasks/LightTask.c b/Application/Tasks/LightTask.c new file mode 100644 index 0000000..529175e --- /dev/null +++ b/Application/Tasks/LightTask.c @@ -0,0 +1,97 @@ +#include "UsbDataHandler.h" +#include "light.pb.h" +#include "FreeRTOS.h" +#include "cmsis_os2.h" +#include "CLS.h" +#include "CLS_BSP.h" +#include "CLSAddress.h" +#include "BSP_EE24.h" +#include "LightTask.h" + +// Memory for the task +StaticTask_t LightTask_cb; +uint32_t LightTask_stk[128]; +// Attributes for the task +osThreadId_t LightTask_id; +const osThreadAttr_t LightTask_attr = { + .name = "LightTask", + .attr_bits = 0U, + .cb_mem = &LightTask_cb, + .cb_size = sizeof(LightTask_cb), + .stack_mem = LightTask_stk, + .stack_size = sizeof(LightTask_stk), + .priority = osPriorityNormal, +}; + +static LightGlobalBrightness msg_LightGlobalBrightness; +static LightGlobalTheme msg_LightGlobalTheme; +static LightThemeSettings msg_LightThemeSettings; + +static volatile struct LightSettings_s { + volatile uint8_t brightness; + volatile uint8_t theme; +} lightSettings; + +// these are used to save these settings some tome after they change +static const uint32_t settingSaveTimeout = 10*1000; +static volatile uint32_t settingChangeTime = 0; + +void LightTask_func(void *argument); + +void LightTask_start() { + // Task functionality here + LightTask_id = osThreadNew(LightTask_func, NULL, &LightTask_attr); +} + + + +void LightTask_func(void *argument) { + osDelay(10); + + BSP_EE24_PartRead(BSP_EE24_PART_GLOBAL_LIGHT, (uint8_t*) &lightSettings, sizeof(lightSettings)); + uint16_t msg_global_light = GENERATE_CLS_ADDRESS(CLS_CODE_MESSAGE, GLOBAL_CAST_CLS_ADDRESS, CLS_CH_MSG_LIGHT); + CLS_BSP_TxHeaderType can_header = CREATE_BSP_CAN_HEADER(msg_global_light, CLS_BSP_DLC_BYTES_2); + + uint32_t tick = osKernelGetTickCount(); + while (1) + { + tick += 50; + osDelayUntil(tick); + CLS_BSP_CAN_AddMessageToSend(&can_header,(uint8_t*)&lightSettings); + + if( settingChangeTime !=0 && tick > settingChangeTime + settingSaveTimeout) { + BSP_EE24_PartWrite(BSP_EE24_PART_GLOBAL_LIGHT, (uint8_t*) &lightSettings, sizeof(lightSettings)); + settingChangeTime = 0; + } + } +} + +void DataClbk_LightGlobalBrightness(void* msg, uint32_t length) { + DATA_CLBK_SETUP(LightGlobalBrightness); + lightSettings.brightness = msg_LightGlobalBrightness.brightness; + settingChangeTime = osKernelGetTickCount(); +} + +void DataClbk_LightGlobalTheme(void* msg, uint32_t length) { + DATA_CLBK_SETUP(LightGlobalTheme); + lightSettings.theme = msg_LightGlobalTheme.theme; + settingChangeTime = osKernelGetTickCount(); +} + +void DataClbk_LightThemeSettings(void* msg, uint32_t length) { + DATA_CLBK_SETUP(LightThemeSettings); + uint8_t device = msg_LightThemeSettings.deviceId & 0x1F; + uint8_t theme = msg_LightGlobalTheme.theme & 0x3; + + uint16_t msg_light_setting = GENERATE_CLS_ADDRESS(CLS_CODE_CONFIG, device, theme); + CLS_BSP_TxHeaderType can_header = CREATE_BSP_CAN_HEADER(msg_light_setting, CLS_BSP_DLC_BYTES_8); + + RGB_Theme_t data = {0}; + data.animation = msg_LightThemeSettings.animation; + data.max_brighness = msg_LightThemeSettings.brightness; + data.color.r = (msg_LightThemeSettings.rgb) & 0xFF; + data.color.g = (msg_LightThemeSettings.rgb>>8) & 0xFF; + data.color.b = (msg_LightThemeSettings.rgb>>16) & 0xFF; + + CLS_BSP_CAN_AddMessageToSend(&can_header, (uint8_t*)&data); +} \ No newline at end of file diff --git a/Application/Tasks/LightTask.h b/Application/Tasks/LightTask.h new file mode 100644 index 0000000..dbdb412 --- /dev/null +++ b/Application/Tasks/LightTask.h @@ -0,0 +1,46 @@ +#pragma once + +#include "stdint.h" + +/** + * @struct RGB + * @brief Structure to represent RGB color model + * @var RGB::r + * Member 'r' represents the Red color component + * @var RGB::g + * Member 'g' represents the Green color component + * @var RGB::b + * Member 'b' represents the Blue color component + */ +typedef struct RGB +{ + uint8_t r; + uint8_t g; + uint8_t b; +} RGB_t; + +/** + * @struct RGB_Theme + * @brief Structure to represent theme of RGB + * @var RGB_Theme::max_brighness + * Member 'max_brighness' represents the Maximum brightness level + * @var RGB_Theme::color + * Member 'color' represents the RGB color + * @var RGB_Theme::animation + * Member 'animation' represents the Animation type + * @var RGB_Theme::reseved + * Member 'reseved' is Reserved for future use + * @var RGB_Theme::reseved_16 + * Member 'reseved_16' is Reserved for future use + */ +typedef struct RGB_Theme +{ + uint8_t max_brighness; + RGB_t color; + uint8_t animation; + uint8_t reseved; + uint16_t reseved_16; +} RGB_Theme_t; + + +void LightTask_start(); \ No newline at end of file diff --git a/Application/Tasks/UsbDataHandler.c b/Application/Tasks/UsbDataHandler.c index 9492ab4..7ff5c25 100644 --- a/Application/Tasks/UsbDataHandler.c +++ b/Application/Tasks/UsbDataHandler.c @@ -2,10 +2,12 @@ #include "cmsis_os2.h" #include "FreeRTOS.h" #include "firmware.pb.h" +#include "light.pb.h" #include "usb_device.h" #include #include "cls_device.pb.h" #include "usb.pb.h" +#include "stdbool.h" /* Declare the thread function */ #define NUM_BUFFERS 4 // Define the number of buffers you want to use @@ -53,6 +55,9 @@ union { FirmwareDone msg_FirmwareDone; RequestDeviceList msg_RequestDeviceList; ResponseDeviceList msg_ResponseDeviceList; + LightGlobalBrightness msg_LightGlobalBrightness; + LightGlobalTheme msg_LightGlobalTheme; + LightThemeSettings msg_LightThemeSettings; } mem_msg_decode; @@ -104,6 +109,9 @@ message_handler_t message_handlers[] = { MESSAGE_HANDLER(UsbPackageType_FIRMWAREPACKAGEACK, FirmwarePackageAck), MESSAGE_HANDLER(UsbPackageType_REQUEST_DEVICE_LIST, RequestDeviceList), MESSAGE_HANDLER(UsbPackageType_RESPONSE_DEVICE_LIST, ResponseDeviceList), + MESSAGE_HANDLER(UsbPackageType_LIGHT_GLOBAL_BRIGHT, LightGlobalBrightness), + MESSAGE_HANDLER(UsbPackageType_LIGHT_GLOBAL_THEME, LightGlobalTheme), + MESSAGE_HANDLER(UsbPackageType_LIGHT_SETTING_THEME, LightThemeSettings), }; diff --git a/Application/Tasks/UsbDataHandler.h b/Application/Tasks/UsbDataHandler.h index dda2e4a..e7a817f 100644 --- a/Application/Tasks/UsbDataHandler.h +++ b/Application/Tasks/UsbDataHandler.h @@ -9,6 +9,22 @@ extern "C" { #endif +#define ASSERT_SIZE(x) \ + { \ + if (!(x)) \ + Error_Handler(); \ + } + + +#define DATA_CLBK_SETUP(name) \ + { \ + ASSERT_SIZE(length == sizeof(name)); \ + memcpy(&msg_##name, msg, sizeof(name)); \ + } + + + + /** * @struct UsbDataPacketHead * @brief This structure represents the header of a USB data packet. @@ -113,6 +129,9 @@ void DataClbk_FirmwarePackageAck(void* msg, uint32_t length); void DataClbk_FirmwareDone(void* msg, uint32_t length); void DataClbk_ResponseDeviceList(void* msg, uint32_t length); void DataClbk_RequestDeviceList(void* msg, uint32_t length); +void DataClbk_LightGlobalBrightness(void* msg, uint32_t length); +void DataClbk_LightGlobalTheme(void* msg, uint32_t length); +void DataClbk_LightThemeSettings(void* msg, uint32_t length); #include "usb.pb.h" diff --git a/Core/Src/freertos.c b/Core/Src/freertos.c index abe87bb..5936066 100644 --- a/Core/Src/freertos.c +++ b/Core/Src/freertos.c @@ -35,6 +35,7 @@ #include "BSP_EE24.h" #include "BSP_INA.h" #include "BSP_POWER.h" +#include "LightTask.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ @@ -98,7 +99,7 @@ return __HAL_TIM_GetCounter(&htim2); */ void MX_FREERTOS_Init(void) { /* USER CODE BEGIN Init */ - + BSP_POWER_Init(); /* USER CODE END Init */ /* USER CODE BEGIN RTOS_MUTEX */ @@ -128,6 +129,8 @@ void MX_FREERTOS_Init(void) { CanDataTask_start(); ULOG_INFO("Setup CLS"); CLS_Init(); + ULOG_INFO("Setup LightTask"); + LightTask_start(); /* USER CODE END RTOS_THREADS */ /* USER CODE BEGIN RTOS_EVENTS */ @@ -151,7 +154,8 @@ void StartDefaultTask(void *argument) /* init code for USB_DEVICE */ MX_USB_DEVICE_Init(); /* USER CODE BEGIN StartDefaultTask */ - + BSP_EE24_Init(); + BSP_INA_Init(); retSD = f_mount(&SDFatFS,SDPath,0); retSD = f_open(&SDFile, "counter.bin", FA_READ); @@ -173,17 +177,6 @@ void StartDefaultTask(void *argument) ULOG_INFO(output); } - uint16_t msg_global_light = GENERATE_CLS_ADDRESS(CLS_CODE_MESSAGE, GLOBAL_CAST_CLS_ADDRESS, CLS_CH_MSG_LIGHT); - CLS_BSP_TxHeaderType can_header = CREATE_BSP_CAN_HEADER(msg_global_light, CLS_BSP_DLC_BYTES_2); - - uint8_t light_data[2] = {0}; - - BSP_EE24_Init(); - - BSP_INA_Init(); - - BSP_POWER_Init(); - char INA_LOG[72]; /* Infinite loop */ @@ -197,18 +190,9 @@ void StartDefaultTask(void *argument) float power_W = (float)power/1000.0; float voltage_V =(float) voltage /1000.0; - - snprintf(INA_LOG, sizeof(INA_LOG),"Voltage[mV] %.2f Current[mA] %d P[W]: %.2f", voltage_V, current, power_W); ULOG_INFO(INA_LOG); - light_data[0]++; - light_data[1] = (light_data[0]/10)%4; - - CLS_BSP_CAN_AddMessageToSend(&can_header,light_data); - ULOG_INFO("UPDATE RGB LIGHT TEST"); - - } /* USER CODE END StartDefaultTask */ }