added lib CLS

- CLS Address management
- CLS Hartbeat timer
This commit is contained in:
2024-02-05 01:22:46 +01:00
parent bfc28e6c94
commit 4dfe9060fa
10 changed files with 157 additions and 8 deletions

48
Application/CLS/CLS.c Normal file
View 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
View 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);

View 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;
}

View 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})