fixed and adaptions

This commit is contained in:
2024-02-06 01:54:06 +01:00
parent ff6fcb75f0
commit 86c0cf9666
8 changed files with 191 additions and 59 deletions

View File

@@ -3,7 +3,8 @@
#include "fdcan.h"
#include "CanDataHandler.h"
#include "FreeRTOS.h"
#include "CLSAddress.h"
#include "firmware.pb.h"
// Define thread flags
#define FLAG_FDCAN_RX_FIFO0 (1<<0)
@@ -58,15 +59,6 @@ void CanDataTask_start() {
static FDCAN_RxHeaderTypeDef RxHeader;
static uint8_t RxData[8];
void CanDataTask_HandleFifo(uint32_t fifo) {
while (HAL_FDCAN_GetRxFifoFillLevel(&hfdcan1, FDCAN_RX_FIFO0) > 0 ) {
if (HAL_FDCAN_GetRxMessage(&hfdcan1, fifo, &RxHeader, RxData) != HAL_OK) {
Error_Handler();
} else {
CanData_canFifo0RxCallback(RxHeader.Identifier,RxData, dlcDecode(RxHeader.DataLength));
}
}
}
// Function for the task
void CanDataTask_func(void *argument) {
@@ -82,13 +74,37 @@ void CanDataTask_func(void *argument) {
Error_Handler();
}
if(HAL_FDCAN_ActivateNotification(&hfdcan1,FDCAN_IT_RX_FIFO0_NEW_MESSAGE | FDCAN_IT_RX_FIFO1_NEW_MESSAGE, 0) != HAL_OK) {
Error_Handler();
}
// setup listening for heartbeats
for (size_t i = 0; i < 16; i++)
{
CanData_regDataMsg(GENERATE_CLS_ADDRESS(CLS_CODE_STATUS, i, CLS_CH_STA_HEATBEAT));
}
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
CanDataTask_HandleFifo(FDCAN_RX_FIFO0);
CanDataTask_HandleFifo(FDCAN_RX_FIFO1);
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));
}
}
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));
}
}
}
}
@@ -101,4 +117,41 @@ void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)
void HAL_FDCAN_RxFifo1Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo1ITs) {
// Notify the thread
osThreadFlagsSet(CanDataTask_id, FLAG_FDCAN_RX_FIFO1);
}
void DataClbk_ResponseDeviceList(void* msg, uint32_t length) {
// igored
}
#include "UsbDataHandler.h"
ResponseDeviceList list;
extern uint8_t gCLS_DEVICE_ADDRESS;
void DataClbk_RequestDeviceList(void* msg, uint32_t length) {
// add yourself
list.devices[list.devices_count].available = true;
list.devices[list.devices_count].canid = GENERATE_CLS_ADDRESS(CLS_CODE_STATUS, gCLS_DEVICE_ADDRESS, CLS_CH_STA_HEATBEAT);
list.devices[list.devices_count].device = gCLS_DEVICE_ADDRESS;
list.devices[list.devices_count].counter = (osKernelGetTickCount()/500)%256;
list.devices_count++;
for (size_t i = 0; i < 16; i++)
{
uint16_t canid = (GENERATE_CLS_ADDRESS(CLS_CODE_STATUS, i, CLS_CH_STA_HEATBEAT));
const CanDataMessage * msg =CanData_getDataMessage(canid);
if(msg) {
if(msg->data_length > 0) {
list.devices[list.devices_count].available = true;
list.devices[list.devices_count].canid = canid;
list.devices[list.devices_count].device = i;
list.devices[list.devices_count].counter = msg->data[0];
list.devices_count++;
}
}
}
USBDataResonse(&list, ResponseDeviceList_fields, UsbPackageType_RESPONSE_DEVICE_LIST);
}

View File

@@ -49,6 +49,8 @@ union {
FirmwarePackage msg_FirmwarePackage;
FirmwarePackageAck msg_FirmwarePackageAck;
FirmwareDone msg_FirmwareDone;
RequestDeviceList msg_RequestDeviceList;
ResponseDeviceList msg_ResponseDeviceList;
} mem_msg_decode;
@@ -98,6 +100,8 @@ message_handler_t message_handlers[] = {
MESSAGE_HANDLER(UsbPackageType_FIRMWAREPACKAGE, FirmwarePackage),
MESSAGE_HANDLER(UsbPackageType_FIRMWAREDONE, FirmwareDone),
MESSAGE_HANDLER(UsbPackageType_FIRMWAREPACKAGEACK, FirmwarePackageAck),
MESSAGE_HANDLER(UsbPackageType_REQUEST_DEVICE_LIST, RequestDeviceList),
MESSAGE_HANDLER(UsbPackageType_RESPONSE_DEVICE_LIST, ResponseDeviceList),
};
@@ -189,6 +193,25 @@ bool UsbDataPacket_head_check(const UsbDataPacket *p) {
return p->head.check == UsbDataPacket_head_sum(p);
}
#include "usbd_cdc_if.h"
#include <pb_encode.h>
static UsbDataPacket packet;
void USBDataResonse(void * msg, const pb_msgdesc_t* fields, UsbPackageType typeid) {
pb_ostream_t ostream = pb_ostream_from_buffer(packet.data,sizeof(packet.data));
bool status = pb_encode(&ostream, fields ,msg);
packet.head.length = ostream.bytes_written;
packet.head.type = typeid;
packet.head.check = UsbDataPacket_head_sum(&packet);
if(status) {
while (CDC_Transmit_HS((uint8_t*)&packet, packet.head.length + sizeof(UsbDataPacketHead) ) == USBD_BUSY)
{
osDelay(3);
}
} else {
Error_Handler();
}
}
//__attribute__((weak)) void DataClbk_FirmwareStart(void *msg, uint32_t length) {}
//__attribute__((weak)) void DataClbk_FirmwarePackage(void *msg, uint32_t length) {}

View File

@@ -93,53 +93,17 @@ void UsbDataHandler_Runner();
*/
int UsbDataHandler_RxCallback(uint8_t* Buf, uint32_t Len);
/**
* @brief Callback function that is invoked when firmware update message is received.
*
* Other parts of the software can implement this function to handle the start of a firmware update.
*
* @param msg A pointer to the message related to the firmware start.
* @param length The length of the message, in bytes.
*
* @return void
*/
void DataClbk_FirmwareStart(void* msg, uint32_t length);
/**
* @brief Callback function that is invoked when a firmware package message is received.
*
* Other parts of the software can implement this function to handle each received firmware package.
*
* @param msg A pointer to the message related to the received firmware package.
* @param length The length of the message, in bytes.
*
* @return void
*/
void DataClbk_FirmwarePackage(void* msg, uint32_t length);
/**
* @brief Callback function that is invoked when a firmware package acknowledgment message is received.
*
* Other parts of the software can implement this function to handle the acknowledgment of a received firmware package.
*
* @param msg A pointer to the message related to the firmware package acknowledgment.
* @param length The length of the message, in bytes.
*
* @return void
*/
void DataClbk_FirmwareStart(void* msg, uint32_t length);
void DataClbk_FirmwarePackage(void* msg, uint32_t length);
void DataClbk_FirmwarePackageAck(void* msg, uint32_t length);
/**
* @brief Callback function that is invoked when firmware update done message.
*
* Other parts of the software can implement this function to handle the completion of a firmware update.
*
* @param msg A pointer to the message related to the completion of the firmware update.
* @param length The length of the message, in bytes.
*
* @return void
*/
void DataClbk_FirmwareDone(void* msg, uint32_t length);
void DataClbk_ResponseDeviceList(void* msg, uint32_t length);
void DataClbk_RequestDeviceList(void* msg, uint32_t length);
#include "firmware.pb.h"
void USBDataResonse(void * msg, const pb_msgdesc_t *fields, UsbPackageType typeid);
#ifdef __cplusplus
}