first draft FirmwareHandler
FirmwareHandler has no own Task. Only uses callbacks from messges. so it run in the UsbDataHandler Task.
This commit is contained in:
132
Application/Tasks/FirmwareHandler.c
Normal file
132
Application/Tasks/FirmwareHandler.c
Normal file
@@ -0,0 +1,132 @@
|
||||
|
||||
#include "fatfs.h"
|
||||
#include "usbd_cdc_if.h"
|
||||
#include "firmware.pb.h"
|
||||
#include "cmsis_os2.h"
|
||||
#include <pb_encode.h>
|
||||
#include "UsbDataHandler.h"
|
||||
#include "crc.h"
|
||||
|
||||
// static memory only for decoding messages
|
||||
static FirmwareStart msg_FirmwareStart;
|
||||
static FirmwarePackage msg_FirmwarePackage;
|
||||
static FirmwarePackageAck msg_FirmwarePackageAck;
|
||||
static FirmwareDone msg_FirmwareDone;
|
||||
|
||||
static UsbDataPacket pack_FirmwarePackageAck;
|
||||
|
||||
|
||||
static FIL FwFile = {0};
|
||||
static bool FileOpen = false;
|
||||
static FRESULT fresult_open =0;
|
||||
static uint32_t fwStartTime = 0;
|
||||
static uint32_t fwPackageCounter =0;
|
||||
|
||||
#define ASSERT_SIZE(x) \
|
||||
{ \
|
||||
if (!(x)) \
|
||||
Error_Handler(); \
|
||||
}
|
||||
|
||||
#define DATA_CLBK_SETUP(name) \
|
||||
{ \
|
||||
ASSERT_SIZE(length == sizeof(name)); \
|
||||
memcpy(&msg_##name, msg, sizeof(name)); \
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief This function builds and sends a FirmwarePackageAck message over USB.
|
||||
*
|
||||
* @param ack A boolean flag indicating the acknowledgment status.
|
||||
* @param crc A 32-bit cyclic redundancy check (CRC) for the firmware package.
|
||||
* @param counter A 32-bit counter for the firmware packages.
|
||||
* @param device A 32-bit identifier for the device.
|
||||
*/
|
||||
void DataSend_FirmwarePackgeAck(bool ack, uint32_t crc, uint32_t counter, uint32_t device) {
|
||||
msg_FirmwarePackageAck.ack = ack;
|
||||
msg_FirmwarePackageAck.counter= counter;
|
||||
msg_FirmwarePackageAck.crc_pac = crc;
|
||||
msg_FirmwarePackageAck.device_id =device;
|
||||
|
||||
|
||||
pb_ostream_t ostream = pb_ostream_from_buffer(pack_FirmwarePackageAck.data,sizeof(pack_FirmwarePackageAck.data));
|
||||
bool status = pb_encode(&ostream, FirmwarePackageAck_fields, &msg_FirmwarePackageAck);
|
||||
|
||||
pack_FirmwarePackageAck.head.length= ostream.bytes_written;
|
||||
pack_FirmwarePackageAck.head.type = 0xF04;
|
||||
pack_FirmwarePackageAck.head.check = UsbDataPacket_head_sum(&pack_FirmwarePackageAck);
|
||||
|
||||
if(status) {
|
||||
while (CDC_Transmit_HS((uint8_t*)&pack_FirmwarePackageAck, pack_FirmwarePackageAck.head.length + sizeof(UsbDataPacketHead) ) == USBD_BUSY)
|
||||
{
|
||||
osDelay(3);
|
||||
}
|
||||
} else {
|
||||
Error_Handler();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void DataClbk_FirmwareStart(void *msg, uint32_t length) {
|
||||
DATA_CLBK_SETUP(FirmwareStart);
|
||||
fwStartTime = osKernelGetSysTimerCount();
|
||||
fwPackageCounter = 0;
|
||||
|
||||
if(FileOpen) {
|
||||
f_close(&FwFile);
|
||||
}
|
||||
|
||||
fresult_open = f_open(&FwFile, msg_FirmwareStart.name, FA_CREATE_ALWAYS | FA_WRITE);
|
||||
FileOpen=true;
|
||||
|
||||
}
|
||||
|
||||
// 0x58900205 python
|
||||
// 0x2ACB825B stm32
|
||||
|
||||
|
||||
void DataClbk_FirmwarePackage(void *msg, uint32_t length) {
|
||||
DATA_CLBK_SETUP(FirmwarePackage);
|
||||
|
||||
// check CRC and Package counter
|
||||
uint32_t crc_check = HAL_CRC_Calculate(&hcrc,msg_FirmwarePackage.data.bytes, msg_FirmwarePackage.data.size);
|
||||
if(msg_FirmwarePackage.crc_pac != crc_check ) {
|
||||
DataSend_FirmwarePackgeAck(false, msg_FirmwarePackage.crc_pac, msg_FirmwarePackage.counter, msg_FirmwarePackage.device_id);
|
||||
return;
|
||||
}
|
||||
|
||||
if(msg_FirmwarePackage.counter != fwPackageCounter) {
|
||||
DataSend_FirmwarePackgeAck(false, msg_FirmwarePackage.crc_pac, msg_FirmwarePackage.counter, msg_FirmwarePackage.device_id);
|
||||
return;
|
||||
}
|
||||
|
||||
if(fresult_open != 0) {
|
||||
DataSend_FirmwarePackgeAck(false, 0, 0, msg_FirmwarePackage.device_id);
|
||||
return;
|
||||
}
|
||||
|
||||
unsigned int bytes_written =0;
|
||||
f_write(&FwFile,msg_FirmwarePackage.data.bytes, msg_FirmwarePackage.data.size, &bytes_written);
|
||||
fwPackageCounter++;
|
||||
DataSend_FirmwarePackgeAck(true, msg_FirmwarePackage.crc_pac, msg_FirmwarePackage.counter, msg_FirmwarePackage.device_id);
|
||||
}
|
||||
|
||||
void DataClbk_FirmwarePackageAck(void *msg, uint32_t length) {
|
||||
DATA_CLBK_SETUP(FirmwarePackageAck);
|
||||
// Does notthing for the Master
|
||||
}
|
||||
|
||||
void DataClbk_FirmwareDone(void *msg, uint32_t length) {
|
||||
DATA_CLBK_SETUP(FirmwareDone);
|
||||
|
||||
// check CRC and Package counter
|
||||
|
||||
f_close(&FwFile);
|
||||
fresult_open = 0xFF;
|
||||
FileOpen=false;
|
||||
|
||||
|
||||
// Spawn Task to Send this File over CAN
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user