From 4dfe9060fa1829d6efdaf826ee60e99c9f873139 Mon Sep 17 00:00:00 2001 From: Oliver Walter Date: Mon, 5 Feb 2024 01:22:46 +0100 Subject: [PATCH] added lib CLS - CLS Address management - CLS Hartbeat timer --- Application/CLS/CLS.c | 48 ++++++++++++++++++++++ Application/CLS/CLS.h | 9 ++++ Application/CLS/CLSAddress.h | 64 +++++++++++++++++++++++++++++ Application/CLS/CMakeLists.txt | 15 +++++++ Application/CMakeLists.txt | 3 +- Application/Tasks/CanDataTask.c | 3 +- Application/Tasks/CanDataTask.h | 3 ++ Application/Tasks/FirmwareHandler.c | 12 ++++-- CMakeLists.txt | 4 +- Core/Src/freertos.c | 4 ++ 10 files changed, 157 insertions(+), 8 deletions(-) create mode 100644 Application/CLS/CLS.c create mode 100644 Application/CLS/CLS.h create mode 100644 Application/CLS/CLSAddress.h create mode 100644 Application/CLS/CMakeLists.txt diff --git a/Application/CLS/CLS.c b/Application/CLS/CLS.c new file mode 100644 index 0000000..ca92ab5 --- /dev/null +++ b/Application/CLS/CLS.c @@ -0,0 +1,48 @@ +#include "CLS.h" +#include "CLSAddress.h" +#include "cmsis_os2.h" +#include "fdcan.h" + +osTimerId_t CLS_HeatbeatTimerId; // Timer ID + + +static const CLSAddress address = { + .code = CLS_CODE_STATUS, + .device = CLS_DEVICE, + .channel = CLS_CH_STA_HEATBEAT, +}; + + +static uint8_t cls_hartbeat_counter = 0; +static FDCAN_TxHeaderTypeDef cls_hartbeat_header = { + .IdType = FDCAN_STANDARD_ID, + .Identifier = GENERATE_CLS_ADDRESS(CLS_CODE_STATUS,CLS_DEVICE,CLS_CH_STA_HEATBEAT), + .TxFrameType = FDCAN_DATA_FRAME, + .DataLength = FDCAN_DLC_BYTES_1, + .ErrorStateIndicator = FDCAN_ESI_PASSIVE, + .BitRateSwitch = FDCAN_BRS_OFF, + .FDFormat = FDCAN_CLASSIC_CAN, + .TxEventFifoControl = FDCAN_NO_TX_EVENTS, + .MessageMarker = 0xCC, +}; +void CLS_Heatbeat(void *argument) { + // Code to be executed every 500ms + cls_hartbeat_counter++; + HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &cls_hartbeat_header, &cls_hartbeat_counter); +} + +void CLS_Init(void) { + osTimerAttr_t timerAttr; + timerAttr.name = "CLS_Heatbeat"; + timerAttr.attr_bits = 0U; + timerAttr.cb_mem = NULL; + timerAttr.cb_size = 0U; + + + CLS_HeatbeatTimerId = osTimerNew((osTimerFunc_t)CLS_Heatbeat, osTimerPeriodic, NULL, &timerAttr); + if (CLS_HeatbeatTimerId != NULL) { // Timer object created + if (osTimerStart(CLS_HeatbeatTimerId, 500) == osOK) { // Timer started + // Timer started successfully + } + } +} \ No newline at end of file diff --git a/Application/CLS/CLS.h b/Application/CLS/CLS.h new file mode 100644 index 0000000..d0e3f1a --- /dev/null +++ b/Application/CLS/CLS.h @@ -0,0 +1,9 @@ +#pragma once + +#define CLS_DEVICE_MASTER 0x11 +#define CLS_SLAVE_AR(n) n + +#define CLS_DEVICE CLS_DEVICE_MASTER + + +void CLS_Init(void); diff --git a/Application/CLS/CLSAddress.h b/Application/CLS/CLSAddress.h new file mode 100644 index 0000000..ea4addb --- /dev/null +++ b/Application/CLS/CLSAddress.h @@ -0,0 +1,64 @@ +#pragma once + +#include + +typedef enum { + CLS_CODE_0 = 0, // 0b000 + CLS_CODE_FIMWARE = 1, // 0b001 + CLS_CODE_2 = 2, // 0b010 + CLS_CODE_MESSAGE = 3, // 0b011 + CLS_CODE_4 = 4, // 0b100 + CLS_CODE_5 = 5, // 0b101 + CLS_CODE_STATUS = 6, // 0b110 + CLS_CODE_CONFIG = 7 // 0b111 +} CLSMessageCode; + +typedef enum { + CLS_CHANNEL1 = 0, // 0b000 + CLS_CHANNEL2 = 1, // 0b001 + CLS_CHANNEL3 = 2, // 0b010 + CLS_CHANNEL4 = 3, // 0b011 + CLS_CHANNEL5 = 4, // 0b100 + CLS_CHANNEL6 = 5, // 0b101 + CLS_CHANNEL7 = 6, // 0b110 + CLS_CHANNEL8 = 7 // 0b111 +} CLSChannel; + + +typedef enum { + CLS_CH_FW_MOSI = 0, // 0b000 + CLS_CH_FW_MISO = 1, // 0b001 + CLS_CH_FW_MASTER_CONTROL = 2, // 0b010 + CLS_CH_FW_SLAVE_FEEDBACK = 3, // 0b011 + CLS_CH_FW_4 = 4, // 0b100 + CLS_CH_FW_5 = 5, // 0b101 + CLS_CH_FW_6 = 6, // 0b110 + CLS_CH_FW_7 = 7 // 0b111 +} CLSChannelFirmware; + + +typedef enum { + CLS_CH_STA_HEATBEAT = 0, // 0b000 + CLS_CH_STA_1 = 1, // 0b001 + CLS_CH_STA_2 = 2, // 0b010 + CLS_CH_STA_3 = 3, // 0b011 + CLS_CH_STA_4 = 4, // 0b100 + CLS_CH_STA_5 = 5, // 0b101 + CLS_CH_STA_6 = 6, // 0b110 + CLS_CH_STA_7 = 7 // 0b111 +} CLSChannel; + + +typedef struct { + CLSMessageCode code : 3; + uint8_t device : 5; + CLSChannel channel : 3; +} CLSAddress; + + +#define GENERATE_CLS_ADDRESS(type, device, channel) \ + ((uint16_t)(((type) << 8) | ((device) << 3) | (channel)) & 0x7ff) + +inline uint16_t generateCLSAddress(CLSMessageCode type, uint8_t device, CLSChannel channel) { + return ((type << 8) | (device << 3) | channel) & 0x7ff; +} \ No newline at end of file diff --git a/Application/CLS/CMakeLists.txt b/Application/CLS/CMakeLists.txt new file mode 100644 index 0000000..67dd4ad --- /dev/null +++ b/Application/CLS/CMakeLists.txt @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 3.12) + +project(CLS C) + +add_library(${PROJECT_NAME} STATIC "") + +target_sources(${PROJECT_NAME} + PRIVATE + ${CMAKE_CURRENT_LIST_DIR}/CLS.c + INTERFACE + ${CMAKE_CURRENT_LIST_DIR}/CLS.h + ${CMAKE_CURRENT_LIST_DIR}/CLSAddress.h + ) + +target_include_directories(${PROJECT_NAME} INTERFACE ${CMAKE_CURRENT_LIST_DIR}) \ No newline at end of file diff --git a/Application/CMakeLists.txt b/Application/CMakeLists.txt index 7126bbb..862a3a3 100644 --- a/Application/CMakeLists.txt +++ b/Application/CMakeLists.txt @@ -1 +1,2 @@ -add_subdirectory(Tasks) \ No newline at end of file +add_subdirectory(Tasks) +add_subdirectory(CLS) \ No newline at end of file diff --git a/Application/Tasks/CanDataTask.c b/Application/Tasks/CanDataTask.c index 71366bb..ddb1c43 100644 --- a/Application/Tasks/CanDataTask.c +++ b/Application/Tasks/CanDataTask.c @@ -87,8 +87,7 @@ void CanDataTask_func(void *argument) { for(;;) { // wait for interrupt event on any fifo - uint32_t flags = osThreadFlagsWait(FLAG_FDCAN_RX_FIFO0 | FLAG_FDCAN_RX_FIFO1, osFlagsWaitAny, osWaitForever); - + osThreadFlagsWait(FLAG_FDCAN_RX_FIFO0 | FLAG_FDCAN_RX_FIFO1, osFlagsWaitAny, osWaitForever); // check the fifos for data and handle it if nessessay CanDataTask_HandleFifo(FDCAN_RX_FIFO0); CanDataTask_HandleFifo(FDCAN_RX_FIFO1); diff --git a/Application/Tasks/CanDataTask.h b/Application/Tasks/CanDataTask.h index e69de29..72dc30e 100644 --- a/Application/Tasks/CanDataTask.h +++ b/Application/Tasks/CanDataTask.h @@ -0,0 +1,3 @@ +#pragma once + +void CanDataTask_start(); \ No newline at end of file diff --git a/Application/Tasks/FirmwareHandler.c b/Application/Tasks/FirmwareHandler.c index ade1754..b4e97f3 100644 --- a/Application/Tasks/FirmwareHandler.c +++ b/Application/Tasks/FirmwareHandler.c @@ -82,9 +82,6 @@ void DataClbk_FirmwareStart(void *msg, uint32_t length) { } -// 0x58900205 python -// 0x2ACB825B stm32 - void DataClbk_FirmwarePackage(void *msg, uint32_t length) { DATA_CLBK_SETUP(FirmwarePackage); @@ -128,5 +125,12 @@ void DataClbk_FirmwareDone(void *msg, uint32_t length) { // Spawn Task to Send this File over CAN - + // this task should + // 1. send can message to send device with matching device id into bootloader mode + // - open the fw file on the SD card. + // 2. wait for the device to get ready. + // - send data 4x data + // - wait for ack + // 3 onec we are at the EOF + // - send done } \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 7aaf409..34256e3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -131,11 +131,13 @@ include_directories(${PROJECT_BINARY_DIR}) add_executable(${CMAKE_PROJECT_NAME}) target_sources(${CMAKE_PROJECT_NAME} PUBLIC ${sources_SRCS}) -target_link_libraries(${CMAKE_PROJECT_NAME} PUBLIC Tasks) +target_link_libraries(${CMAKE_PROJECT_NAME} PUBLIC Tasks CLS) #target_link_libraries(${CMAKE_PROJECT_NAME} PUBLIC PROTOS) target_link_libraries(${CMAKE_PROJECT_NAME} PUBLIC uart_driver) #target_link_libraries(${CMAKE_PROJECT_NAME} PUBLIC lwrb) +target_compile_options(${CMAKE_PROJECT_NAME} PRIVATE -std=c2x) + # Compiler options target_compile_options(${CMAKE_PROJECT_NAME} PRIVATE $<$: > diff --git a/Core/Src/freertos.c b/Core/Src/freertos.c index e47f59f..e3e259f 100644 --- a/Core/Src/freertos.c +++ b/Core/Src/freertos.c @@ -25,6 +25,8 @@ /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "UsbDataHandler.h" +#include "CanDataTask.h" +#include "CLS.h" #include "fatfs.h" /* USER CODE END Includes */ @@ -97,6 +99,8 @@ void MX_FREERTOS_Init(void) { /* USER CODE BEGIN RTOS_THREADS */ UsbDataHandler_Start(); + CanDataTask_start(); + CLS_Init(); /* USER CODE END RTOS_THREADS */ /* USER CODE BEGIN RTOS_EVENTS */