added CarCan tp CanDataTask

This commit is contained in:
2024-05-18 02:09:52 +02:00
parent 77a774e7dd
commit 2d903dcf11
2 changed files with 107 additions and 17 deletions

View File

@@ -28,6 +28,22 @@ const osThreadAttr_t CanDataTask_attr = {
.priority = osPriorityNormal,
};
// Memory for the task
StaticTask_t CarCanTask_cb;
uint32_t CarCanTask_stk[256];
// Attributes for the task
osThreadId_t CarCanTask_id;
const osThreadAttr_t CarCanTask_attr = {
.name = "CarCanTask",
.attr_bits = 0U,
.cb_mem = &CarCanTask_cb,
.cb_size = sizeof(CarCanTask_cb),
.stack_mem = CarCanTask_stk,
.stack_size = sizeof(CarCanTask_stk),
.priority = osPriorityNormal,
};
uint32_t dlcDecode(uint32_t dlcCode) {
switch(dlcCode) {
@@ -53,14 +69,14 @@ uint32_t dlcDecode(uint32_t dlcCode) {
void CanDataTask_func(void *argument);
void CarCanTask_func(void *argument);
void CanDataTask_start() {
// Task functionality here
CanDataTask_id = osThreadNew(CanDataTask_func, NULL, &CanDataTask_attr);
CarCanTask_id = osThreadNew(CarCanTask_func, NULL, &CarCanTask_attr);
}
static FDCAN_RxHeaderTypeDef RxHeader;
static uint8_t RxData[8];
// Function for the task
void CanDataTask_func(void *argument) {
@@ -87,38 +103,109 @@ void CanDataTask_func(void *argument) {
CanData_regDataMsg(GENERATE_CLS_ADDRESS(CLS_CODE_STATUS, i, CLS_CH_STA_HEATBEAT));
}
FDCAN_RxHeaderTypeDef RxHeader;
uint8_t RxData[8];
for(;;) {
// wait for interrupt event on any fifo
osThreadFlagsWait(FLAG_FDCAN_RX_FIFO0 | FLAG_FDCAN_RX_FIFO1, osFlagsWaitAny, osWaitForever);
// check the fifos for data and handle it if nessessay
while (HAL_FDCAN_GetRxFifoFillLevel(&hfdcan1, FDCAN_RX_FIFO0) > 0 ) {
if (HAL_FDCAN_GetRxMessage(&hfdcan1, FDCAN_RX_FIFO0, &RxHeader, RxData) != HAL_OK) {
Error_Handler();
} else {
CanData_canFifo0RxCallback(RxHeader.Identifier,RxData, dlcDecode(RxHeader.DataLength));
if (HAL_FDCAN_GetRxMessage(&hfdcan1, FDCAN_RX_FIFO0, &RxHeader, RxData) != HAL_OK) {
Error_Handler();
} else {
CanData_canFifo0RxCallback(RxHeader.Identifier,RxData, dlcDecode(RxHeader.DataLength));
}
}
}
while (HAL_FDCAN_GetRxFifoFillLevel(&hfdcan1, FDCAN_RX_FIFO1) > 0 ) {
if (HAL_FDCAN_GetRxMessage(&hfdcan1, FDCAN_RX_FIFO1, &RxHeader, RxData) != HAL_OK) {
Error_Handler();
} else {
CanData_canFifo1RxCallback(RxHeader.Identifier,RxData, dlcDecode(RxHeader.DataLength));
while (HAL_FDCAN_GetRxFifoFillLevel(&hfdcan1, FDCAN_RX_FIFO1) > 0 ) {
if (HAL_FDCAN_GetRxMessage(&hfdcan1, FDCAN_RX_FIFO1, &RxHeader, RxData) != HAL_OK) {
Error_Handler();
} else {
CanData_canFifo1RxCallback(RxHeader.Identifier,RxData, dlcDecode(RxHeader.DataLength));
}
}
}
}
}
static uint64_t last_car_message_time = UINT64_MAX;
void CarCanTask_func(void *argument) {
// for testing accept all messages from the car can bus
if (HAL_FDCAN_ConfigGlobalFilter(&hfdcan2, FDCAN_ACCEPT_IN_RX_FIFO0, FDCAN_ACCEPT_IN_RX_FIFO0, FDCAN_REJECT_REMOTE, FDCAN_REJECT_REMOTE) != HAL_OK) {
Error_Handler();
}
/* Start the FDCAN module */
if (HAL_FDCAN_Start(&hfdcan2) != HAL_OK){
Error_Handler();
}
if(HAL_FDCAN_ActivateNotification(&hfdcan2,FDCAN_IT_RX_FIFO0_NEW_MESSAGE | FDCAN_IT_RX_FIFO1_NEW_MESSAGE, 0) != HAL_OK) {
Error_Handler();
}
FDCAN_RxHeaderTypeDef RxHeader;
uint8_t RxData[8];
for(;;) {
// wait for interrupt event on any fifo
osThreadFlagsWait(FLAG_FDCAN_RX_FIFO0 | FLAG_FDCAN_RX_FIFO1, osFlagsWaitAny, osWaitForever);
// check the fifos for data and handle it if nessessay
while (HAL_FDCAN_GetRxFifoFillLevel(&hfdcan2, FDCAN_RX_FIFO0) > 0 ) {
if (HAL_FDCAN_GetRxMessage(&hfdcan2, FDCAN_RX_FIFO0, &RxHeader, RxData) != HAL_OK) {
Error_Handler();
} else {
// do something with the can data
last_car_message_time = osKernelGetTickCount();
}
}
while (HAL_FDCAN_GetRxFifoFillLevel(&hfdcan2, FDCAN_RX_FIFO1) > 0 ) {
if (HAL_FDCAN_GetRxMessage(&hfdcan2, FDCAN_RX_FIFO1, &RxHeader, RxData) != HAL_OK) {
Error_Handler();
} else {
// do something with the can data
last_car_message_time = osKernelGetTickCount();
}
}
}
}
/**
* @brief Check if a car can message has been received
*
* @return true if a car can message has been received
* @return false if no car can message has been received
*/
bool CanDataTask_gotCarCanMessage() {
return last_car_message_time != UINT64_MAX;
}
void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs) {
// Notify the thread
osThreadFlagsSet(CanDataTask_id, FLAG_FDCAN_RX_FIFO0);
if(hfdcan == &hfdcan1) {
osThreadFlagsSet(CanDataTask_id, FLAG_FDCAN_RX_FIFO0);
}
if(hfdcan == &hfdcan2) {
osThreadFlagsSet(CarCanTask_id, FLAG_FDCAN_RX_FIFO0);
}
}
void HAL_FDCAN_RxFifo1Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo1ITs) {
// Notify the thread
osThreadFlagsSet(CanDataTask_id, FLAG_FDCAN_RX_FIFO1);
if(hfdcan == &hfdcan1) {
osThreadFlagsSet(CanDataTask_id, FLAG_FDCAN_RX_FIFO1);
}
if(hfdcan == &hfdcan2) {
osThreadFlagsSet(CarCanTask_id, FLAG_FDCAN_RX_FIFO1);
}
}

View File

@@ -1,3 +1,6 @@
#pragma once
void CanDataTask_start();
void CanDataTask_start();
bool CanDataTask_gotCarCanMessage();