add lightTask

This commit is contained in:
2024-02-25 00:01:41 +01:00
parent 2384399d97
commit 69a01f167e
7 changed files with 180 additions and 37 deletions

View File

@@ -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)
target_link_libraries(${PROJECT_NAME} PRIVATE CLS_BSP BSP)

View File

@@ -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.
*

View File

@@ -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);
}

View File

@@ -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();

View File

@@ -2,10 +2,12 @@
#include "cmsis_os2.h"
#include "FreeRTOS.h"
#include "firmware.pb.h"
#include "light.pb.h"
#include "usb_device.h"
#include <pb_decode.h>
#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),
};

View File

@@ -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"

View File

@@ -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 */
}