721 lines
26 KiB
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, ×tamp);
|
|
|
|
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);
|
|
}
|
|
} |