SMART_COMPONENTS_ComInt_Com.../Src/ComIntCmd/FILE_TABLE.c

151 lines
4.1 KiB
C

//
// Created by cfif on 04.10.2022.
//
#include "ComIntCmd/XFCPROT_FILE.h"
#include "InternalFlashPage.h"
#include "FirmwareLoader.h"
#include "BaseTypes/Strings.h"
#include "string.h"
#include "ext_telematica.h"
#include "ld_adr.h"
extern uint8_t findDelimiter(tString32 *address, char ch);
uint8_t XfcProtMethod_FileTable(tXfcArray *request, tXfcArray *response, void *args) {
uint8_t file_name_len = sizeof("FIRMWARE") - 1;
uint8_t count = 1;
XFC_CMD_TX_ADD_RAW(count);
XFC_CMD_TX_ADD_RAW(file_name_len);
XFC_CMD_TX_ADD_STR("FIRMWARE");
return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_OK;
}
uint8_t XfcProtMethod_FileInit(tXfcArray *request, tXfcArray *response, tFirmwareLoader *env) {
uint8_t fileNameLen;
uint8_t fileName[32];
XFC_CMD_RX_GET_RAW(fileNameLen)
XFC_CMD_RX_GET_ARR(fileName, fileNameLen)
uint32_t size = 0;
uint32_t crc = 0;
uint8_t descriptionLen = 0;
uint8_t description[64];
XFC_CMD_RX_GET_RAW(size)
XFC_CMD_RX_GET_RAW(crc)
XFC_CMD_RX_GET_RAW(descriptionLen)
XFC_CMD_RX_GET_ARR(description, descriptionLen)
env->metadataOffset = size - FIRMWARE_META_LENGTH;
*env->update.metadata.crc = crc;
*env->update.metadata.size = size - FIRMWARE_META_LENGTH;
*env->update.metadata.nameLength = descriptionLen;
memcpy(env->update.metadata.name, description, descriptionLen);
bool result = false;
EXT_ENV_TELE.store.AdditionalSettings->REGION_SIZE_UPDATE = 0;
EraGlonassUveosDumper_ForceDump(EXT_ENV_TELE.store.uveosDumper);
if (osMutexAcquire(EXT_ENV_TELE.store.accessDumper, 2000) == osOK) {
result = FirmwareLoader_ClearUpdateFlash(env);
osMutexRelease(EXT_ENV_TELE.store.accessDumper);
} else {
asm("nop");
}
if (result) {
return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_OK;
}
return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_EXECUTION_ERROR;
}
uint8_t XfcProtMethod_FileWriteBlock(tXfcArray *request, tXfcArray *response, tFirmwareLoader *env) {
uint32_t offset;
uint16_t blockSize;
XFC_CMD_RX_GET_RAW(offset)
XFC_CMD_RX_GET_RAW(blockSize)
uint32_t data_in_rx = XfcArrayGetDataSize(request);
if (data_in_rx != blockSize) {
return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_EXECUTION_ERROR;
}
uint8_t *inMemBlock = request->data + request->begin;
bool result = false;
if (osMutexAcquire(EXT_ENV_TELE.store.accessDumper, 2000) == osOK) {
result = FirmwareLoader_WriteUpdatePortion(env, offset, inMemBlock, blockSize);
osMutexRelease(EXT_ENV_TELE.store.accessDumper);
} else {
asm("nop");
}
if (result) {
return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_OK;
}
return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_EXECUTION_ERROR;
}
uint8_t XfcProtMethod_FileDone(tXfcArray *request, tXfcArray *response, tFirmwareLoader *env) {
// NVIC_SystemReset();
if (!FirmwareLoader_CheckUpdate(env)) {
return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_EXECUTION_ERROR;
}
tString32 FW_NAME;
FW_NAME.length = *env->update.metadata.nameLength;
if (FW_NAME.length > 32) {
FW_NAME.length = 0;
} else {
memcpy(FW_NAME.data, env->update.metadata.name, FW_NAME.length);
}
uint8_t posDel = findDelimiter(&FW_NAME, '_') + 1;
if (memcmp(&FW_NAME.data[posDel], "TELE", 4) == 0) {
EXT_ENV_TELE.store.AdditionalSettings->REGION_SIZE_UPDATE = FIRMWARE_TELE_AREA_LENGTH;
EraGlonassUveosDumper_ForceDump(EXT_ENV_TELE.store.uveosDumper);
} else if (memcmp(&FW_NAME.data[posDel], "UVEOS", 5) == 0) {
EXT_ENV_TELE.store.AdditionalSettings->REGION_SIZE_UPDATE = FIRMWARE_MAIN_AREA_LENGTH;
EraGlonassUveosDumper_ForceDump(EXT_ENV_TELE.store.uveosDumper);
} else {
return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_EXECUTION_ERROR;
}
// if (!FirmwareLoader_CheckAndUpdate(env)) {
// return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_EXECUTION_ERROR;
// }
NVIC_SystemReset();
// FirmwareLoader_RunFirmware(env);
return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_OK;
}