existing FW file check to avoid redundant transmit

+ refactro dupliacte code
This commit is contained in:
2024-02-08 02:44:26 +01:00
parent 0ab07d6572
commit 19bcaaf18c
5 changed files with 121 additions and 51 deletions

View File

@@ -13,8 +13,8 @@ static FirmwareStart msg_FirmwareStart;
static FirmwarePackage msg_FirmwarePackage;
static FirmwarePackageAck msg_FirmwarePackageAck;
static FirmwareDone msg_FirmwareDone;
static UsbDataPacket pack_FirmwarePackageAck;
static FirmwareFileCheck msg_FirmwareFileCheck;
static UsbDataPacket pack_FirmwarePackage;
static FIL FwFile = {0};
@@ -50,37 +50,56 @@ void DataSend_FirmwarePackgeAck(bool ack, uint32_t crc, uint32_t counter, uint32
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();
}
UsbDataPacketSendMessage(UsbPackageType_FIRMWAREPACKAGEACK, &pack_FirmwarePackage, FirmwarePackageAck_fields, &msg_FirmwarePackageAck);
}
void DataSend_FirmwareFileCheck(uint32_t crc, uint32_t device_id, bool ready_for_data, UINT size, char* name) {
msg_FirmwareFileCheck.crc_fw = crc;
msg_FirmwareFileCheck.device_id = device_id;
msg_FirmwareFileCheck.ready_for_data = ready_for_data;
msg_FirmwareFileCheck.size = size;
memcpy(msg_FirmwareFileCheck.name, name, sizeof(msg_FirmwareFileCheck.name));
UsbDataPacketSendMessage(UsbPackageType_FIRMWAREFILECHECK, &pack_FirmwarePackage, FirmwareFileCheck_fields, &msg_FirmwareFileCheck);
}
#define CHUNK_SIZE 256 // Change this to the size of chunks you want to read
static uint8_t crc_buffer[CHUNK_SIZE];
void DataClbk_FirmwareStart(void *msg, uint32_t length) {
DATA_CLBK_SETUP(FirmwareStart);
fwStartTime = osKernelGetSysTimerCount();
fwPackageCounter = 0;
uint32_t crc = 0;
UINT totalRead = 0;
UINT bytesRead = 0;
if(FileOpen) {
f_close(&FwFile);
}
// Check if file already exists
if(f_open(&FwFile, msg_FirmwareStart.name, FA_READ) == FR_OK) {
__HAL_CRC_DR_RESET(&hcrc);
do {
f_read(&FwFile, crc_buffer, CHUNK_SIZE, &bytesRead);
crc = HAL_CRC_Accumulate(&hcrc, (uint32_t *)crc_buffer, bytesRead);
totalRead+=bytesRead;
} while(bytesRead == CHUNK_SIZE);
f_close(&FwFile);
if(crc == msg_FirmwareStart.crc_fw) {
// CRC matches, no need for transfer
DataSend_FirmwareFileCheck(crc, msg_FirmwareStart.device_id, false, totalRead, msg_FirmwareStart.name);
return;
}
}
fresult_open = f_open(&FwFile, msg_FirmwareStart.name, FA_CREATE_ALWAYS | FA_WRITE);
FileOpen=true;
DataSend_FirmwareFileCheck(crc, msg_FirmwareStart.device_id, fresult_open==FR_OK, totalRead, msg_FirmwareStart.name);
}