added lib CLS
- CLS Address management - CLS Hartbeat timer
This commit is contained in:
48
Application/CLS/CLS.c
Normal file
48
Application/CLS/CLS.c
Normal file
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
9
Application/CLS/CLS.h
Normal file
9
Application/CLS/CLS.h
Normal file
@@ -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);
|
||||||
64
Application/CLS/CLSAddress.h
Normal file
64
Application/CLS/CLSAddress.h
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
15
Application/CLS/CMakeLists.txt
Normal file
15
Application/CLS/CMakeLists.txt
Normal file
@@ -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})
|
||||||
@@ -1 +1,2 @@
|
|||||||
add_subdirectory(Tasks)
|
add_subdirectory(Tasks)
|
||||||
|
add_subdirectory(CLS)
|
||||||
@@ -87,8 +87,7 @@ void CanDataTask_func(void *argument) {
|
|||||||
|
|
||||||
for(;;) {
|
for(;;) {
|
||||||
// wait for interrupt event on any fifo
|
// 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
|
// check the fifos for data and handle it if nessessay
|
||||||
CanDataTask_HandleFifo(FDCAN_RX_FIFO0);
|
CanDataTask_HandleFifo(FDCAN_RX_FIFO0);
|
||||||
CanDataTask_HandleFifo(FDCAN_RX_FIFO1);
|
CanDataTask_HandleFifo(FDCAN_RX_FIFO1);
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
void CanDataTask_start();
|
||||||
@@ -82,9 +82,6 @@ void DataClbk_FirmwareStart(void *msg, uint32_t length) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 0x58900205 python
|
|
||||||
// 0x2ACB825B stm32
|
|
||||||
|
|
||||||
|
|
||||||
void DataClbk_FirmwarePackage(void *msg, uint32_t length) {
|
void DataClbk_FirmwarePackage(void *msg, uint32_t length) {
|
||||||
DATA_CLBK_SETUP(FirmwarePackage);
|
DATA_CLBK_SETUP(FirmwarePackage);
|
||||||
@@ -128,5 +125,12 @@ void DataClbk_FirmwareDone(void *msg, uint32_t length) {
|
|||||||
|
|
||||||
|
|
||||||
// Spawn Task to Send this File over CAN
|
// 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
|
||||||
}
|
}
|
||||||
@@ -131,11 +131,13 @@ include_directories(${PROJECT_BINARY_DIR})
|
|||||||
add_executable(${CMAKE_PROJECT_NAME})
|
add_executable(${CMAKE_PROJECT_NAME})
|
||||||
target_sources(${CMAKE_PROJECT_NAME} PUBLIC ${sources_SRCS})
|
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 PROTOS)
|
||||||
target_link_libraries(${CMAKE_PROJECT_NAME} PUBLIC uart_driver)
|
target_link_libraries(${CMAKE_PROJECT_NAME} PUBLIC uart_driver)
|
||||||
#target_link_libraries(${CMAKE_PROJECT_NAME} PUBLIC lwrb)
|
#target_link_libraries(${CMAKE_PROJECT_NAME} PUBLIC lwrb)
|
||||||
|
|
||||||
|
target_compile_options(${CMAKE_PROJECT_NAME} PRIVATE -std=c2x)
|
||||||
|
|
||||||
# Compiler options
|
# Compiler options
|
||||||
target_compile_options(${CMAKE_PROJECT_NAME} PRIVATE
|
target_compile_options(${CMAKE_PROJECT_NAME} PRIVATE
|
||||||
$<$<COMPILE_LANGUAGE:C>: >
|
$<$<COMPILE_LANGUAGE:C>: >
|
||||||
|
|||||||
@@ -25,6 +25,8 @@
|
|||||||
/* Private includes ----------------------------------------------------------*/
|
/* Private includes ----------------------------------------------------------*/
|
||||||
/* USER CODE BEGIN Includes */
|
/* USER CODE BEGIN Includes */
|
||||||
#include "UsbDataHandler.h"
|
#include "UsbDataHandler.h"
|
||||||
|
#include "CanDataTask.h"
|
||||||
|
#include "CLS.h"
|
||||||
#include "fatfs.h"
|
#include "fatfs.h"
|
||||||
/* USER CODE END Includes */
|
/* USER CODE END Includes */
|
||||||
|
|
||||||
@@ -97,6 +99,8 @@ void MX_FREERTOS_Init(void) {
|
|||||||
|
|
||||||
/* USER CODE BEGIN RTOS_THREADS */
|
/* USER CODE BEGIN RTOS_THREADS */
|
||||||
UsbDataHandler_Start();
|
UsbDataHandler_Start();
|
||||||
|
CanDataTask_start();
|
||||||
|
CLS_Init();
|
||||||
/* USER CODE END RTOS_THREADS */
|
/* USER CODE END RTOS_THREADS */
|
||||||
|
|
||||||
/* USER CODE BEGIN RTOS_EVENTS */
|
/* USER CODE BEGIN RTOS_EVENTS */
|
||||||
|
|||||||
Reference in New Issue
Block a user