SMART_COMPONENTS_Egts/EgtsEbu.c

721 lines
26 KiB
C

//
// Created by cfif on 13.06.2024.
//
#include "EgtsEbu.h"
#include "string.h"
#include "lfs_file_utils.h"
#include "EgtsOutputCommands.h"
#include "ext_telematica.h"
#include "SystemDelayInterface.h"
#include "Rtc.h"
#include "FirmwareMetadataSection.h"
#include "ld_adr.h"
#define LOG_SIGN "EGTS_EBU"
#define LOGGER &env->slog->logger
#define ADD_TO_DATA_CHAR_SHORT(DATA) *(uint8_t *) (out + offset) = DATA; *(uint8_t *) (out + offset + 1) = 0; offset+=2;
#define ADD_TO_DATA_SHORT(DATA) *(uint8_t *) (out + offset) = (uint8_t)DATA; *(uint8_t *) (out + offset + 1) = (uint8_t)(DATA >> 8); offset+=2;
#define ADD_TO_DATA_BYTE(DATA) *(uint8_t *) (out + offset) = (uint8_t)DATA; offset+=1;
#define ADD_TO_DATA(DATA, LEN) memcpy(out + offset, (uint8_t * ) & DATA, LEN); offset+=LEN;
extern tFirmwareLoader FIRMWARE_TELE_LOADER;
extern tFirmwareLoader FIRMWARE_LOADER;
const tEgtsEbuName egtsEbuName[EBU_COUNT_TABLE_ITEMS] = {
{EBU_GNSS, "GNSS~UAZ", 0x0000, 0x0000, 0x0000, {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}},
{EBU_ABS, "ABS~UAZ1APG", TESTER_REQUEST_ABS_ESP, TESTER_RESPONSE_ABS_ESP, 0x4000, {0xF187, 0xF18A, 0xF18C, 0xF190, 0xF193, 0xF195, 0xF197, 0xF199, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}},
{EBU_ABS, "ABS~UAZ1TRINOVA", TESTER_REQUEST_ABS_ESP, TESTER_RESPONSE_ABS_ESP, 0x0200, {0xF112, 0xF180, 0xF183, 0xF187, 0xF189, 0xF18A, 0xF18B, 0xF18C, 0xF190, 0xF192, 0xF193, 0xF194, 0xF195, 0xF197, 0xF198, 0xF199, 0xF19D, 0x0000}},
{EBU_ECM, "ECM~UAZ1ITL", TESTER_REQUEST_ECM, TESTER_RESPONSE_ECM, 0x0090, {0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x00A1, 0x00A2, 0x00A3, 0x0000, 0x0000, 0x0000, 0x0000}},
{EBU_ECM, "ECM~UAZ1DPLUS", TESTER_REQUEST_ECM, TESTER_RESPONSE_ECM, 0xF187, {0xF187, 0xF189, 0xF18A, 0xF18B, 0xF18C, 0xF190, 0xF192, 0xF193, 0xF194, 0xF195, 0xF197, 0xF198, 0xF199, 0xF19D, 0xF1F9, 0x0000, 0x0000, 0x0000}},
{EBU_HVAC, "HVAC~UAZ1", TESTER_REQUEST_HVAC, TESTER_RESPONSE_HVAC, 0xF112, {0xF112, 0xF122, 0xF132, 0xF150, 0xF151, 0xF153, 0xF18C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}},
{EBU_IMMO, "IMMO~UAZ1ITL", TESTER_REQUEST_ITELMA_IMMO_D, TESTER_RESPONSE_ITELMA_IMMO_D, 0x0000, {0x0007, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}},
{EBU_IMMO, "IMMO~UAZ1DPLUS", TESTER_REQUEST_IMMO_D, TESTER_RESPONSE_IMMO_D, 0x0000, {0xF190, 0xF193, 0xF195, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}},
{EBU_PTS, "PTS~UAZ1ABIX", TESTER_REQUEST_PTS, TESTER_RESPONSE_PTS, 0xF183, {0xF183, 0xF184, 0xF18E, 0xF190, 0xF191, 0xF199, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}}
};
const tEgtsEbuTestName egtsEbuTestName[EBU_COUNT_TEST_ITEMS] = {
{TEST_FIRMWARE, "FIRMWARE"},
{TEST_IGNITION, "IGNITION"},
{TEST_BAT_CONNECT, "BAT_CONNECT"},
{TEST_BAT_CHARGE, "BAT_CHARGE"},
{TEST_BAT_VOLTAGE, "BAT_VOLTAGE"},
{TEST_GNSS_ANT, "GNSS_ANT"},
{TEST_SPEAKER_CONNECT, "SPEAKER_CONNECT"},
{TEST_BIP_CONNECT, "BIP_CONNECT"},
{TEST_ACCEL, "ACCEL"},
{TEST_GSM, "GSM"},
{TEST_AUDIO_CODEC, "AUDIO_CODEC"},
{TEST_VIN, "VIN"},
{TEST_ACCEL_CALIB, "ACCEL_CALIB"},
{TEST_EOL, "EOL"},
{TEST_MODEM_SOFT_REV, "MODEM_SOFT_REV"},
{TEST_CERT_REV, "MODEM_CERT_REV"},
{TEST_AUDIO_FILE, "MODEM_AUDIO_FILE"},
{TEST_AMPLIFIER, "AMPLIFIER"},
{TEST_SIM_ERA, "SIM_ERA"},
{TEST_SIM_COMERS, "SIM_COMERS"}
};
bool addEbuTableItem(tEgtsProcessing *env, tEgtsEbuState *ebuState, tEgtsEbuItemState *ebuItemState) {
if (ebuState->count >= EBU_COUNT_FS_ITEMS)
return false;
ebuState->ebuItemState[ebuState->count].ebu = ebuItemState->ebu;
ebuState->ebuItemState[ebuState->count].timestamp = ebuItemState->timestamp;
++ebuState->count;
return true;
}
void setUpdateEbuAll(tEgtsProcessing *env, tEgtsEbuState *ebuState) {
if (osMutexAcquire(env->accessEbu, 2000) == osOK) {
for (uint16_t i = 0; i < ebuState->count; ++i) {
if (ebuState->ebuItemState[i].ebu == i) {
ebuState->ebuItemState[i].timestamp = 0;
}
}
dumpEbuTable(env);
osMutexRelease(env->accessEbu);
} else {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка доступа setUpdateEbu")
}
}
void setUpdateEbu(tEgtsProcessing *env, tEgtsEbuState *ebuState, eEgtsEbu egtsEbu, uint32_t state) {
if (osMutexAcquire(env->accessEbu, 2000) == osOK) {
for (uint16_t i = 0; i < ebuState->count; ++i) {
if (ebuState->ebuItemState[i].ebu == egtsEbu) {
ebuState->ebuItemState[i].timestamp = state;
LoggerInfoStatic(LOGGER, LOG_SIGN, "Состояние ЭБУ найдено")
dumpEbuTable(env);
break;
}
}
osMutexRelease(env->accessEbu);
} else {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка доступа setUpdateEbu")
}
}
void setUpdateEbuClearDTC(tEgtsProcessing *env, tEgtsEbuState *ebuState, eEgtsEbu egtsEbu, bool clearDTC) {
if (osMutexAcquire(env->accessEbu, 2000) == osOK) {
for (uint16_t i = 0; i < ebuState->count; ++i) {
if (ebuState->ebuItemState[i].ebu == egtsEbu) {
ebuState->ebuItemState[i].clearDTC = clearDTC;
LoggerInfoStatic(LOGGER, LOG_SIGN, "Состояние ЭБУ найдено")
break;
}
}
osMutexRelease(env->accessEbu);
} else {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка доступа setUpdateEbuClearDTC")
}
}
bool dumpEbuTable(tEgtsProcessing *env) {
bool isMain = true;
env->ebuState.version = VERSION_EBU;
uint32_t crc = lfs_crc(0, &env->ebuState, sizeof(env->ebuState) - sizeof(env->ebuState.crc));
env->ebuState.crc = crc;
int lfs_err = dumpEbuFile(&env->fs->lfs, "ebu.bin", &env->ebuState, sizeof(tEgtsEbuState));
if (lfs_err != LFS_ERR_OK) {
LoggerStrInfoStatic(LOGGER, LOG_SIGN, "Сохранение состояния ЭБУ - ошибка");
isMain = false;
}
if (!isMain)
return false;
LoggerStrInfoStatic(LOGGER, LOG_SIGN, "Сохранение состояния ЭБУ - успешно");
return true;
}
bool loadEbuTable(tEgtsProcessing *env) {
bool crc_main = false;
int lfs_err = loadEbuFile(&env->fs->lfs, "ebu.bin", &env->ebuState, sizeof(tEgtsEbuState));
if (lfs_err == LFS_ERR_OK) {
uint32_t crc = lfs_crc(0, &env->ebuState, sizeof(tEgtsEbuState) - sizeof(env->ebuState.crc));
if (crc == env->ebuState.crc) {
LoggerStrInfoStatic(LOGGER, LOG_SIGN, "Загрузка состояния ЭБУ - успешно");
crc_main = true;
} else {
LoggerStrInfoStatic(LOGGER, LOG_SIGN, "Загрузка состояния ЭБУ - ошибка контрольной суммы");
}
}
if ((!crc_main) || (env->ebuState.count == 0) || (env->ebuState.version != VERSION_EBU)) {
LoggerStrInfoStatic(LOGGER, LOG_SIGN, "Загрузка состояния ЭБУ - восстановление значений по умолчанию");
tEgtsEbuItemState egtsEbuItemState;
egtsEbuItemState.timestamp = 0;
for (uint16_t i = 0; i < EBU_COUNT_FS_ITEMS; ++i) {
egtsEbuItemState.ebu = i;
addEbuTableItem(env, &env->ebuState, &egtsEbuItemState);
}
dumpEbuTable(env);
}
return true;
}
bool setEgtsNameEbu(tEgtsProcessing *env, uint8_t ebu) {
if (ebu >= EBU_COUNT_TABLE_ITEMS)
return false;
env->egtsFirmwareDataArgs.module[0] = '\0';
strcat(env->egtsFirmwareDataArgs.module, egtsEbuName[ebu].ebuName);
return true;
/*
for (uint8_t i = 0; i < EBU_COUNT_TABLE_ITEMS; ++i) {
if (egtsEbuName[i].ebu == ebu) {
env->egtsFirmwareDataArgs.module[0] = '\0';
strcat(env->egtsFirmwareDataArgs.module, egtsEbuName[i].ebuName);
return true;
}
}
return false;
*/
}
void clearResultTest() {
for (uint16_t i = 0; i < EXT_ENV_TELE.testsTable->count; ++i) {
EXT_ENV_TELE.testsTable->items[i].resultFix = 0;
}
}
bool isCertTest() {
for (uint16_t i = 0; i < EXT_ENV_TELE.testsTable->count; ++i) {
if (memcmp(EXT_ENV_TELE.testsTable->items[i].name.str, "MODEM_CERT_REV",
EXT_ENV_TELE.testsTable->items[i].name.length) == 0) {
if (EXT_ENV_TELE.testsTable->items[i].resultFix == DEVICE_TESTING_CODE_PASSED) {
return true;
} else {
return false;
}
}
}
return false;
}
eEgtsTestEbu getResultTest(uint8_t indexTest, eDeviceTestingCode *deviceTestingCode) {
/**
* todo: Есть риск коллизии
* Потенциальная ситуация (пример)
* memcmp("ACCEL", "ACCEL_CALIB",5(длинна "ACCEL") ) вернет 0
*/
for (uint16_t i = 0; i < EBU_COUNT_TEST_ITEMS; ++i) {
if (memcmp(EXT_ENV_TELE.testsTable->items[indexTest].name.str, egtsEbuTestName[i].ebuTestName,
EXT_ENV_TELE.testsTable->items[indexTest].name.length) == 0) {
*deviceTestingCode = EXT_ENV_TELE.testsTable->items[indexTest].resultFix;
return egtsEbuTestName[i].ebu;
}
}
return 0xFF;
}
uint16_t SetEbuDTCerror(tEgtsProcessing *env, uint8_t *out, uint16_t offset, eUdsErrorDTC codeError) {
ADD_TO_DATA_BYTE(UDS_DTC_Error[codeError].DTCHighByte)
ADD_TO_DATA_BYTE(UDS_DTC_Error[codeError].DTCMiddleByte)
ADD_TO_DATA_BYTE(UDS_DTC_Error[codeError].DTCLowByte)
ADD_TO_DATA_BYTE(0x01)
return offset;
}
void getMetaDataUveos(tString32 *FW_NAME, tString32 *HW_NAME, tString32 *FW_INTERFACE) {
memset(FW_NAME, 0, sizeof(tString32));
memset(HW_NAME, 0, sizeof(tString32));
memset(FW_INTERFACE, 0, sizeof(tString32));
uint32_t offsetMeta = 0x08000000 + BOOT_AREA_LENGTH + FIRMWARE_MAIN_AREA_LENGTH - 256;
uint32_t pos = offsetMeta;
uint32_t offsetMetaCrc = (*(uint32_t *) pos);
pos += 4;
uint32_t offsetMetaSize = (*(uint32_t *) (pos));
pos += 4;
// FW
FW_NAME->length = (*(uint8_t *) (pos));
pos += 1;
if (FW_NAME->length > 32) {
FW_NAME->length = 0;
return;
}
memcpy(FW_NAME->data, (uint8_t *) (pos), FW_NAME->length);
pos += FW_NAME->length;
// HW
HW_NAME->length = (*(uint8_t *) (pos));
pos += 1;
if (HW_NAME->length > 32) {
HW_NAME->length = 0;
return;
}
memcpy(HW_NAME->data, (uint8_t *) (pos), HW_NAME->length);
pos += HW_NAME->length;
// FW_INTERFACE
FW_INTERFACE->length = (*(uint8_t *) (pos));
pos += 1;
if (FW_INTERFACE->length > 32) {
FW_INTERFACE->length = 0;
return;
}
memcpy(FW_INTERFACE->data, (uint8_t *) (pos), FW_INTERFACE->length);
pos += FW_INTERFACE->length;
}
void setBufEbu(tEgtsProcessing *env) {
uint16_t offset = 0;
uint8_t *out = env->egtsFirmwareDataArgs.bufEbu;
// начало------------------------------------------Ошибки-----------------------------------------------------------
ADD_TO_DATA_SHORT(0x1902)
ADD_TO_DATA_SHORT(0x0004)
ADD_TO_DATA_BYTE(0xFF)
ADD_TO_DATA_BYTE(0x00)
ADD_TO_DATA_BYTE(0x00)
ADD_TO_DATA_BYTE(0xE0)
for (uint16_t i = 0; i < EXT_ENV_TELE.testsTable->count; ++i) {
eDeviceTestingCode deviceTestingCode;
eEgtsTestEbu egtsTestEbu = getResultTest(i, &deviceTestingCode);
if (egtsTestEbu == TEST_FIRMWARE) {
// DEVICE_TESTING_CODE_ERROR
}
if (egtsTestEbu == TEST_IGNITION) {
// DEVICE_TESTING_CODE_ERROR
}
if (egtsTestEbu == TEST_BAT_CONNECT) {
// DEVICE_TESTING_CODE_ERROR
if (deviceTestingCode == DEVICE_TESTING_CODE_ERROR)
offset = SetEbuDTCerror(env, out, offset, UDS_TEST_BAT_CONNECT);
}
if (egtsTestEbu == TEST_BAT_CHARGE) {
// DEVICE_TESTING_CODE_ERROR
if (deviceTestingCode == DEVICE_TESTING_CODE_ERROR)
offset = SetEbuDTCerror(env, out, offset, UDS_TEST_BAT_CHARGE);
}
if (egtsTestEbu == TEST_BAT_VOLTAGE) {
// DEVICE_TESTING_CODE_ERROR
if (deviceTestingCode == DEVICE_TESTING_CODE_ERROR)
offset = SetEbuDTCerror(env, out, offset, UDS_TEST_BAT_VOLTAGE);
}
if (egtsTestEbu == TEST_GNSS_ANT) {
// DEVICE_TESTING_CODE_ERROR
// DEVICE_TESTING_CODE_NOT_CONNECTED
// DEVICE_TESTING_CODE_SHORT_CIRCUIT
if ((deviceTestingCode == DEVICE_TESTING_CODE_ERROR) ||
(deviceTestingCode == DEVICE_TESTING_CODE_NOT_CONNECTED) ||
(deviceTestingCode == DEVICE_TESTING_CODE_SHORT_CIRCUIT))
offset = SetEbuDTCerror(env, out, offset, UDS_TEST_GNSS_ANT);
}
if (egtsTestEbu == TEST_SPEAKER_CONNECT) {
// DEVICE_TESTING_CODE_ERROR
// DEVICE_TESTING_CODE_NOT_CONNECTED
if ((deviceTestingCode == DEVICE_TESTING_CODE_ERROR) ||
(deviceTestingCode == DEVICE_TESTING_CODE_NOT_CONNECTED))
offset = SetEbuDTCerror(env, out, offset, UDS_TEST_SPEAKER_CONNECT);
}
if (egtsTestEbu == TEST_BIP_CONNECT) {
if (deviceTestingCode == DEVICE_TESTING_CODE_NOT_CONNECTED)
offset = SetEbuDTCerror(env, out, offset, UDS_TEST_MICROPHONE_CONNECT);
}
if (egtsTestEbu == TEST_ACCEL) {
// DEVICE_TESTING_CODE_ERROR
if (deviceTestingCode == DEVICE_TESTING_CODE_ERROR)
offset = SetEbuDTCerror(env, out, offset, UDS_TEST_ACCEL);
}
if (egtsTestEbu == TEST_GSM) {
// DEVICE_TESTING_CODE_ERROR
if (deviceTestingCode == DEVICE_TESTING_CODE_ERROR)
offset = SetEbuDTCerror(env, out, offset, UDS_TEST_GSM);
}
if (egtsTestEbu == TEST_AUDIO_CODEC) {
// DEVICE_TESTING_CODE_ERROR
if (deviceTestingCode == DEVICE_TESTING_CODE_ERROR)
offset = SetEbuDTCerror(env, out, offset, UDS_TEST_GSM_AUDIO_CODEC);
}
if (egtsTestEbu == TEST_VIN) {
// DEVICE_TESTING_CODE_ERROR
if (deviceTestingCode == DEVICE_TESTING_CODE_ERROR)
offset = SetEbuDTCerror(env, out, offset, UDS_TEST_VIN);
}
if (egtsTestEbu == TEST_ACCEL_CALIB) {
// DEVICE_TESTING_CODE_ERROR
if (deviceTestingCode == DEVICE_TESTING_CODE_ERROR)
offset = SetEbuDTCerror(env, out, offset, UDS_TEST_ACCEL_CALIB);
}
if (egtsTestEbu == TEST_EOL) {
// DEVICE_TESTING_CODE_ERROR
// if (deviceTestingCode == DEVICE_TESTING_CODE_ERROR)
// offset = SetEbuDTCerror(env, out, offset, UDS_TEST_EOL);
}
if (egtsTestEbu == TEST_MODEM_SOFT_REV) {
// DEVICE_TESTING_CODE_ERROR
if (deviceTestingCode == DEVICE_TESTING_CODE_ERROR)
offset = SetEbuDTCerror(env, out, offset, UDS_TEST_MODEM_SOFT_REV);
}
if (egtsTestEbu == TEST_CERT_REV) {
// DEVICE_TESTING_CODE_ERROR
if (deviceTestingCode == DEVICE_TESTING_CODE_ERROR)
offset = SetEbuDTCerror(env, out, offset, UDS_TEST_CERT_REV);
}
if (egtsTestEbu == TEST_AUDIO_FILE) {
// DEVICE_TESTING_CODE_ERROR
if (deviceTestingCode == DEVICE_TESTING_CODE_ERROR)
offset = SetEbuDTCerror(env, out, offset, UDS_TEST_AUDIO_FILE);
}
if (egtsTestEbu == TEST_AMPLIFIER) {
// DEVICE_TESTING_CODE_ERROR
if (deviceTestingCode == DEVICE_TESTING_CODE_ERROR)
offset = SetEbuDTCerror(env, out, offset, UDS_TEST_AMPLIFIER);
}
if (egtsTestEbu == TEST_SIM_ERA) {
// DEVICE_TESTING_CODE_ERROR
if (deviceTestingCode == DEVICE_TESTING_CODE_ERROR)
offset = SetEbuDTCerror(env, out, offset, UDS_TEST_SIM_ERA);
}
if (egtsTestEbu == TEST_SIM_COMERS) {
// DEVICE_TESTING_CODE_ERROR
if (deviceTestingCode == DEVICE_TESTING_CODE_ERROR)
offset = SetEbuDTCerror(env, out, offset, UDS_TEST_SIM_COMERS);
}
}
if (offset > 8) {
uint16_t *len = (uint16_t *) &out[2];
uint8_t *err = (uint8_t *) &out[7];
*len = offset - 4;
*err = 0;
asm("nop");
}
// конец-------------------------------------------Ошибки-----------------------------------------------------------
// IMEI
uint8_t IMEI_len = EXT_ENV_TELE.store.device->cgsmid.length;
if (EXT_ENV_TELE.store.device->cgsmid.length >= 2) {
if ((EXT_ENV_TELE.store.device->cgsmid.data[IMEI_len - 1] == '\n') &&
(EXT_ENV_TELE.store.device->cgsmid.data[IMEI_len - 2] == '\r')) {
IMEI_len = EXT_ENV_TELE.store.device->cgsmid.length - 2;
}
}
uint8_t dataBuf[50];
memset(dataBuf, 0, sizeof(dataBuf));
memcpy(dataBuf, EXT_ENV_TELE.store.device->cgsmid.data, IMEI_len);
ADD_TO_DATA_SHORT(0x0411);
ADD_TO_DATA_CHAR_SHORT(15);
ADD_TO_DATA(dataBuf, 15)
memset(dataBuf, 0, sizeof(dataBuf));
memcpy(dataBuf, EXT_ENV_TELE.store.gost->VIN.data, EXT_ENV_TELE.store.gost->VIN.length);
ADD_TO_DATA_SHORT(0x0190);
ADD_TO_DATA_CHAR_SHORT(17);
ADD_TO_DATA(dataBuf, 17)
memset(dataBuf, 0, sizeof(dataBuf));
memcpy(dataBuf, EXT_ENV_TELE.store.device->ccidComers.data, EXT_ENV_TELE.store.device->ccidComers.length);
ADD_TO_DATA_SHORT(0x001E);
ADD_TO_DATA_CHAR_SHORT(20);
ADD_TO_DATA(dataBuf, 20)
memset(dataBuf, 0, sizeof(dataBuf));
memcpy(dataBuf, EXT_ENV_TELE.store.device->ccid.data, EXT_ENV_TELE.store.device->ccid.length);
ADD_TO_DATA_SHORT(0x001D);
ADD_TO_DATA_CHAR_SHORT(19);
ADD_TO_DATA(dataBuf, 19)
/*
tString32 FW_NAME;
FW_NAME.length = *FIRMWARE_LOADER.main.metadata.nameLength;
if (FW_NAME.length > 32) {
FW_NAME.length = 0;
} else {
memcpy(FW_NAME.data, FIRMWARE_LOADER.main.metadata.name, FW_NAME.length);
}
*/
tString32 FW_NAME;
tString32 HW_NAME;
tString32 FW_INTERFACE;
getMetaDataUveos(&FW_NAME, &HW_NAME, &FW_INTERFACE);
uint8_t posDel = findDelimiter(&FW_INTERFACE, ' ');
memset(dataBuf, 0, sizeof(dataBuf));
memcpy(dataBuf, FIRMWARE_TELE_LOADER.main.metadata.name, *FIRMWARE_TELE_LOADER.main.metadata.nameLength);
memcpy(&dataBuf[*FIRMWARE_TELE_LOADER.main.metadata.nameLength], &FW_INTERFACE.data[posDel], FW_INTERFACE.length - posDel);
ADD_TO_DATA_SHORT(0x0600);
ADD_TO_DATA_CHAR_SHORT(32);
ADD_TO_DATA(dataBuf, 32)
memset(dataBuf, 0, sizeof(dataBuf));
memcpy(dataBuf, &EXT_ENV_TELE.store.device->telematicaIsActive, 1);
ADD_TO_DATA_SHORT(0x0604);
ADD_TO_DATA_CHAR_SHORT(1);
ADD_TO_DATA(dataBuf, 1)
/*
// Serial Number
// ADD_TO_DATA_SHORT(0xF18C);
// ADD_TO_DATA_CHAR_SHORT(env->storage->nvm.device.serialNumber.value.length);
// ADD_TO_DATA(env->storage->nvm.device.serialNumber.value.data, env->storage->nvm.device.serialNumber.value.length)
// IMEI
uint8_t IMEI_len = EXT_ENV_TELE.store.device->cgsmid.length;
if (EXT_ENV_TELE.store.device->cgsmid.length >= 2) {
if ((EXT_ENV_TELE.store.device->cgsmid.data[IMEI_len - 1] == '\n') &&
(EXT_ENV_TELE.store.device->cgsmid.data[IMEI_len - 2] == '\r')) {
IMEI_len = EXT_ENV_TELE.store.device->cgsmid.length - 2;
}
}
ADD_TO_DATA_SHORT(0xF101);
ADD_TO_DATA_CHAR_SHORT(IMEI_len);
ADD_TO_DATA(EXT_ENV_TELE.store.device->cgsmid.data, IMEI_len)
// Phone Number
// Hardware Version
tString32 fw;
fw.length = META_FW_NAME_SIZE;
memcpy(&fw.data, (uint8_t *) META_FW_NAME, fw.length);
tString32 hw;
hw.length = META_HW_NAME_SIZE;
memcpy(&hw.data, (uint8_t *) META_HW_NAME, hw.length);
// Hardware Version
ADD_TO_DATA_SHORT(0xF193);
ADD_TO_DATA_CHAR_SHORT(hw.length);
ADD_TO_DATA(hw.data, hw.length)
// Vehicle VIN Number
ADD_TO_DATA_SHORT(0xF190);
ADD_TO_DATA_CHAR_SHORT(EXT_ENV_TELE.store.gost->VIN.length);
ADD_TO_DATA(EXT_ENV_TELE.store.gost->VIN.data, EXT_ENV_TELE.store.gost->VIN.length)
// Main Server
ADD_TO_DATA_SHORT(0xF104);
ADD_TO_DATA_CHAR_SHORT(env->deviceTeledataStorageData->telematica.EGTS_SERVER_ADDRESS.length);
ADD_TO_DATA(env->deviceTeledataStorageData->telematica.EGTS_SERVER_ADDRESS.data,
env->deviceTeledataStorageData->telematica.EGTS_SERVER_ADDRESS.length)
// Second Server
ADD_TO_DATA_SHORT(0xF105);
ADD_TO_DATA_CHAR_SHORT(env->deviceTeledataStorageData->telematica.EGTS_ALT_SERVER_ADDRESS.length);
ADD_TO_DATA(env->deviceTeledataStorageData->telematica.EGTS_ALT_SERVER_ADDRESS.data,
env->deviceTeledataStorageData->telematica.EGTS_ALT_SERVER_ADDRESS.length)
*/
env->egtsFirmwareDataArgs.bufLen = offset;
}
void _Noreturn EgtsProcessing_TransmitterTaskEbu(tEgtsProcessing *env) {
time_t timestamp = 0;
uint8_t egtsEbuIndex = 0;
uint32_t timeTeleOff = 0;
bool isTimestamp = true;
bool oneOn = true;
bool oneOff = true;
for (;;) {
if (onOffTelematica(env, &oneOn, &oneOff, "Задача ЭБУ"))
continue;
//начало ---------------------------------Отправка прошивки ЭБУ-------------------------------------------------
//начало ---------------------------------Отправка прошивки ЭБУ-------------------------------------------------
//начало ---------------------------------Отправка прошивки ЭБУ-------------------------------------------------
if (!isAuth(env)) {
// LoggerInfoStatic(LOGGER, LOG_SIGN, "Ожидание аутентификации на сервере")
SystemDelayMs(1000);
continue;
}
if (!env->isEnableTelematicaSendPoints) {
if (timeTeleOff < SystemGetMs()) {
timeTeleOff = SystemGetMs() + 10000;
LoggerInfoStatic(LOGGER, LOG_SIGN, "Ожидание разрешения телематики")
}
SystemDelayMs(1000);
continue;
}
RtcGet(env->gsm->Rtc, &timestamp);
if (timestamp < 1718359909) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Ожидание получения временной метки")
SystemDelayMs(1000);
continue;
} else {
if (isTimestamp) {
isTimestamp = false;
LoggerInfoStatic(LOGGER, LOG_SIGN, "Временная метка получена")
}
}
// Передача прошивки через ВРЕМЯ
if ((env->fl_firstStartTimeUpdateEBU) && (env->firstStartTimeUpdateEBU < SystemGetMs())) {
EXT_ENV_TELE.store.runtime->telematicaWaitConnect = true;
egtsEbuIndex = EBU_GNSS;
setEgtsNameEbu(env, egtsEbuIndex);
setBufEbu(env);
if (EgtsProcessing_SendFirmware(env) == false) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Передача данных ЭБУ (автоматическая) не удалась")
} else {
env->fl_firstStartTimeUpdateEBU = false;
LoggerInfoStatic(LOGGER, LOG_SIGN, "Передача данных ЭБУ (автоматическая) завершена успешно")
}
}
if (!env->ebuReady) {
if (env->ebuState.ebuItemState[EBU_GNSS].timestamp == 0) {
egtsEbuIndex = EBU_GNSS;
setEgtsNameEbu(env, egtsEbuIndex);
setBufEbu(env);
env->ebuReady = true;
} else {
if (env->CanMainAdditional.egtsEbuUdsReady.isUdsBufReady) {
egtsEbuIndex = env->CanMainAdditional.egtsEbuUdsReady.ebuIndex;
setEgtsNameEbu(env, egtsEbuIndex);
env->egtsFirmwareDataArgs.bufLen = env->CanMainAdditional.egtsEbuUdsReady.bufLen;
memcpy(env->egtsFirmwareDataArgs.bufEbu,
(uint8_t *) env->CanMainAdditional.egtsEbuUdsReady.buf,
env->CanMainAdditional.egtsEbuUdsReady.bufLen);
env->ebuReady = true;
}
}
}
if (env->ebuReady) {
env->ebuReady = false;
/*
setUpdateEbu(env, &env->ebuState, egtsEbuName[egtsEbuIndex].ebu, timestamp + 86400); // !!!!!!!!!
env->CanMainAdditional.egtsEbuUdsReady.ebuIndex = 0; // !!!!!!!!!
env->CanMainAdditional.egtsEbuUdsReady.isUdsBufReady = false; // !!!!!!!!!!!!
*/
// Передача прошивки
if (EgtsProcessing_SendFirmware(env) == false) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Передача данных ЭБУ не удалась")
} else {
setUpdateEbu(env, &env->ebuState, egtsEbuName[egtsEbuIndex].ebu, timestamp + 86400);
if (egtsEbuIndex != EBU_GNSS) {
env->CanMainAdditional.egtsEbuUdsReady.ebuIndex = 0;
env->CanMainAdditional.egtsEbuUdsReady.isUdsBufReady = false;
}
}
}
//конец ---------------------------------Отправка прошивки ЭБУ--------------------------------------------------
//конец ---------------------------------Отправка прошивки ЭБУ--------------------------------------------------
//конец ---------------------------------Отправка прошивки ЭБУ--------------------------------------------------
SystemDelayMs(1000);
}
}