// // Created by cfif on 12.04.2024. // #include "EgtsOutputCommands.h" #include "math.h" #include "AsciiStringAssmeblingUtils.h" #include "stdio.h" #include "Rtc.h" #include "egts_commonExt.h" #include "EgtsTimestamp.h" #include "string.h" #include "FirmwareMetadataSection.h" #include "stdlib.h" #define LOG_SIGN "EGTS" #define LOGGER &env->slog->logger #define ADD_TO_RESULT(DATA, LEN) memcpy(out + offset, (uint8_t * ) & DATA, LEN); offset+=LEN; #define ADD_TO_RESULT_P(DATA, LEN) memcpy(out + offset, DATA, LEN); offset+=LEN; //начало ---------------------------------Аутентификация--------------------------------------------------------------- //начало ---------------------------------Аутентификация--------------------------------------------------------------- //начало ---------------------------------Аутентификация--------------------------------------------------------------- char imei[] = "860384060946040"; uint16_t vEgtsPackAuth(uint8_t *out, tEgtsIdentityDataArgs *args, uint16_t step) { uint16_t offset = 0; uint16_t TermIdentityBS = 512; uint8_t TermIdentityFlags = 0b01000010; ADD_TO_RESULT(args->TerminalID, 4); ADD_TO_RESULT(TermIdentityFlags, 1); ADD_TO_RESULT((*args->IMEI), args->IMEI_len); // ADD_TO_RESULT((imei), 15); ADD_TO_RESULT(TermIdentityBS, 2); return offset; } uint16_t vEgtsPackModuleData(uint8_t *out, tEgtsIdentityModuleDataArgs *args, uint16_t step) { uint16_t offset = 0; tString32 fw; fw.length = META_FW_NAME_SIZE; memcpy(&fw.data, (uint8_t *) META_FW_NAME, fw.length); uint8_t pos = findDelimiter(&fw, '.') + 1; uint8_t fw_h = atoi(FIRMWARE_VERSION); uint8_t fw_l = atoi(&FIRMWARE_VERSION[pos]); tString32 hw; hw.length = META_HW_NAME_SIZE; memcpy(&hw.data, (uint8_t *) META_HW_NAME, hw.length); pos = findDelimiter(&hw, '.') + 1; uint8_t hw_h = atoi(HARDWARE_REVISION); uint8_t hw_l = atoi(&HARDWARE_REVISION[pos]); uint8_t MT = 1; // Module Туре uint32_t VID = 1; // Vendor Identifier uint16_t FWV = (hw_h << 8) | hw_l; // Firmware Version uint16_t SWV = (fw_h << 8) | fw_l; // Software Version uint8_t MD = 0; // Modification uint8_t ST = 1; // State uint8_t Delimiter = 0; char TAG_VIN[] = "VIN:"; char TAG_ICCID[] = "ICCID:"; char TAG_EICCID[] = "EICCID:"; ADD_TO_RESULT(MT, 1); ADD_TO_RESULT(VID, 4); ADD_TO_RESULT(FWV, 2); ADD_TO_RESULT(SWV, 2); ADD_TO_RESULT(MD, 1); ADD_TO_RESULT(ST, 1); /* ADD_TO_RESULT(args->deviceStorage->nvm.device.serialNumber.value.data, args->deviceStorage->nvm.device.serialNumber.value.length); ADD_TO_RESULT(Delimiter, 1); ADD_TO_RESULT(TAG_VIN, sizeof(TAG_VIN) - 1); ADD_TO_RESULT("XTT316300S1013581", sizeof("XTT316300S1013581") - 1); //ADD_TO_RESULT(args->deviceStorage->nvm.gost.VIN.data, args->deviceStorage->nvm.gost.VIN.length); ADD_TO_RESULT(Delimiter, 1); ADD_TO_RESULT(TAG_ICCID, sizeof(TAG_ICCID) - 1); ADD_TO_RESULT("8970120036530350309", sizeof("8970120036530350309") - 1); //ADD_TO_RESULT(args->deviceStorage->nvm.device.ccid.data, args->deviceStorage->nvm.device.ccid.length); ADD_TO_RESULT(Delimiter, 1); ADD_TO_RESULT(TAG_EICCID, sizeof(TAG_EICCID) - 1); ADD_TO_RESULT("89701012656625450608", sizeof("89701012656625450608") - 1); //ADD_TO_RESULT(args->deviceStorage->nvm.device.ccid.data, args->deviceStorage->nvm.device.ccid.length); ADD_TO_RESULT(Delimiter, 1); */ ADD_TO_RESULT(Delimiter, 1); return offset; } //char auth[15] = "860384067388816"; bool EgtsProcessing_SendAuth(tEgtsProcessing *env) { uint8_t egtsRaw[256]; memset(egtsRaw, 0, sizeof(egtsRaw)); uint16_t authPackLength; time_t timestamp; RtcGet(env->gsm->Rtc, ×tamp); uint8_t IMEI_len = env->store->nvm.device.cgsmid.length; if (env->store->nvm.device.cgsmid.length >= 2) { if ((env->store->nvm.device.cgsmid.data[IMEI_len - 1] == '\n') && (env->store->nvm.device.cgsmid.data[IMEI_len - 2] == '\r')) { IMEI_len = env->store->nvm.device.cgsmid.length - 2; } } env->egtsIdentityDataArgs.IMEI = (uint8_t *) env->store->nvm.device.cgsmid.data; env->egtsIdentityDataArgs.IMEI_len = IMEI_len; env->egtsIdentityDataArgs.TerminalID = env->deviceTeledataStorageData->telematica.EGTS_UNIT_ID; env->egtsModuleDataArgs.deviceStorage = env->store; ++env->egtsPacketId; env->egtsIdentityAdditionalData.idPacked = env->egtsPacketId; env->egtsIdentityAdditionalData.isReceivedResponse = false; env->egtsIdentityAdditionalData.isReceivedResultCode = false; authPackLength = vEgtsPackTransportEx2( 0, env->egtsIdentityAdditionalData.idPacked, &env->counter, egtsRaw, EGTS_SERVICE_FLAGS_AUTH, EGTS_PT_APPDATA, EGTS_AUTH_SERVICE, EGTS_AUTH_SERVICE, timestamp, 1, EGTS_SR_TERM_IDENTITY, (tEgtsServiceSubRecordGeneratorEx) vEgtsPackAuth, &env->egtsIdentityDataArgs, 1, EGTS_SR_MODULE_DATA, (tEgtsServiceSubRecordGeneratorEx) vEgtsPackModuleData, &env->egtsModuleDataArgs ); LoggerFormatInfo(LOGGER, LOG_SIGN, "Отправка пакета (id: %u) аутентификации:", env->egtsIdentityAdditionalData.idPacked) sendLogHex(env, egtsRaw, authPackLength); bool result = EgtsProcessingSend(env, egtsRaw, authPackLength, EGTS_WAIT_2, &env->egtsIdentityAdditionalData.isReceivedResponse, &env->egtsIdentityAdditionalData.isReceivedResultCode); if (!result) { LoggerStrInfoStatic(LOGGER, LOG_SIGN, "Истекло время ожидания (EgtsProcessing_SendAuth)"); return false; } return true; } //конец ---------------------------------Аутентификация--------------------------------------------------------------- //конец ---------------------------------Аутентификация--------------------------------------------------------------- //конец ---------------------------------Аутентификация--------------------------------------------------------------- //начало ---------------------------------Теледанные-------------------------------------------------------------------- //начало ---------------------------------Теледанные-------------------------------------------------------------------- //начало ---------------------------------Теледанные-------------------------------------------------------------------- void EgtsProcessing_Default_SendSensorsDig(tEgtsProcessing *env) { env->egtsTeledataEdit.egtsSensorsDigArgs.sensorsDigState[0].number = 18; /* for (int i = 0; i < 20; ++i) { env->egtsTeledataEdit.egtsSensorsDigArgs.sensorsDigState[i].number = i; env->egtsTeledataEdit.egtsSensorsDigArgs.sensorsDigState[i].state = 0; } env->egtsTeledataEdit.egtsSensorsDigArgs.sensorsDigState[0].state = 0; // Vehicle Alarm System activate siren env->egtsTeledataEdit.egtsSensorsDigArgs.sensorsDigState[1].state = 0; // Состояние охранной сигнализации env->egtsTeledataEdit.egtsSensorsDigArgs.sensorsDigState[2].state = 0; // Статус заряда АКБ env->egtsTeledataEdit.egtsSensorsDigArgs.sensorsDigState[3].state = 0; // Статус ПЛ двери env->egtsTeledataEdit.egtsSensorsDigArgs.sensorsDigState[4].state = 0; // Статус ПП двери env->egtsTeledataEdit.egtsSensorsDigArgs.sensorsDigState[5].state = 0; // Статус ЗЛ двери env->egtsTeledataEdit.egtsSensorsDigArgs.sensorsDigState[6].state = 0; // Статус ЗП двери env->egtsTeledataEdit.egtsSensorsDigArgs.sensorsDigState[7].state = 0; // Статус капота env->egtsTeledataEdit.egtsSensorsDigArgs.sensorsDigState[8].state = 0; // Уровень омывающей жидкости env->egtsTeledataEdit.egtsSensorsDigArgs.sensorsDigState[9].state = 0; // Уровень охлаждающей жидкости env->egtsTeledataEdit.egtsSensorsDigArgs.sensorsDigState[10].state = 0; // Окно ПЛ env->egtsTeledataEdit.egtsSensorsDigArgs.sensorsDigState[11].state = 0; // Окно ПП env->egtsTeledataEdit.egtsSensorsDigArgs.sensorsDigState[12].state = 0; // Окно ЗЛ env->egtsTeledataEdit.egtsSensorsDigArgs.sensorsDigState[13].state = 0; // Окно ЗП env->egtsTeledataEdit.egtsSensorsDigArgs.sensorsDigState[14].state = 0; // Состояние батареи датчика давления шины ПЛ env->egtsTeledataEdit.egtsSensorsDigArgs.sensorsDigState[15].state = 0; // Состояние батареи датчика давления шины ПП env->egtsTeledataEdit.egtsSensorsDigArgs.sensorsDigState[16].state = 0; // Состояние батареи датчика давления шины ЗЛ env->egtsTeledataEdit.egtsSensorsDigArgs.sensorsDigState[17].state = 0; // Состояние батареи датчика давления шины ЗП env->egtsTeledataEdit.egtsSensorsDigArgs.sensorsDigState[18].state = 0; // Статус шины BodyCan env->egtsTeledataEdit.egtsSensorsDigArgs.sensorsDigState[19].state = 0; // Статус шины DiagCan */ } void EgtsProcessing_Default_SendSensorsAn(tEgtsProcessing *env) { env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[0].number = 99; env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[1].number = 104; env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[2].number = 105; env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[3].number = 106; env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[4].number = 111; env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[5].number = 112; env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[6].number = 113; env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[7].number = 131; env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[8].number = 132; env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[9].number = 133; env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[10].number = 134; env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[11].number = 3; env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[12].number = 206; env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[13].number = 207; env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[14].number = 208; env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[15].number = 142; env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[16].number = 143; env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[17].number = 144; env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[18].number = 145; env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[19].number = 146; env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[20].number = 147; env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[21].number = 148; env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[22].number = 149; env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[23].number = 150; env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[24].number = 151; /* // 0 env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[0].number = 3; // 43 for (int i = 1; i <= 43; ++i) { env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[i].number = 98 + i; } // 3 for (int i = 44; i <= 46; ++i) { env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[i].number = 162 + i; } env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[0].value = 12000; env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[1].value = 0; // Время работы прибора в минутах, после последней перезагрузки/включения env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[2].value = 80 + 40; // 20 Темп. внутри салона (передняя), С env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[3].value = 80 + 60; // 30 Температура внутри салона (задняя), С env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[4].value = 50; // SoH АКБ, % env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[5].value = 60; // SoC АКБ, % env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[6].value = 90; // 5 Внешняя температура, С env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[7].value = 80; // 40 л Уровень топлива, л env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[8].value = 3; // Статус автомобиля env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[9].value = 1; // Статус замков дверей env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[10].value = 3; // Статус багажника (задняя дверь) env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[11].value = 70; // 7 л Ср. расход топлива после БК env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[12].value = 60; // 6 л Ср. расход за поездку env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[13].value = 200; // 20 км Пробег поездки env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[14].value = 600; // 60 км/ч Средняя скорость env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[15].value = 20; // Минут поездки (сборная) env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[16].value = 3; // Положение рычага АКПП env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[17].value = 100000 + 50; // Дней до ТО env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[18].value = 100000 + 300; // Пробег до ТО env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[19].value = 80;// Уровень масла в двигателе env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[20].value = 0; // Индикатор уровня масла двигателя env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[21].value = 22;// 2 атм давление в шине ПЛ env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[22].value = 24;// 2 атм давление в шине ПП env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[23].value = 26;// 2 атм давление в шине ЗЛ env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[24].value = 20;// 2 атм давление в шине ЗП env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[25].value = 2;// Состояние шины ПЛ env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[26].value = 2;// Состояние шины ПП env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[27].value = 2;// Состояние шины ЗЛ env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[28].value = 2;// Состояние шины ЗП env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[29].value = 20;//26 = 20/10 + 16 Целевая темп. CCU водитель env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[30].value = 20;// Целевая темп. CCU П-П env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[31].value = 20;// Целевая темп. CCU ЗЛ-П env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[32].value = 20;// Целевая темп. CCU ЗП-П env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[33].value = 100;// Моточасы env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[34].value = 250;// Пробег авто после сброса БК env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[35].value = 700;// Средняя скорость после сброса БК env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[36].value = 20;// 20 мин Время после сброса БК env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[37].value = 700;// Пробег на остатке топлива env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[38].value = 50;// SoH HV АКБ, % env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[39].value = 60;// SoC HV АКБ, % env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[40].value = 1;// Занятость кресла водителя env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[41].value = 1;// Занятость кресла ПП env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[42].value = 1;// Занятость кресла ЗЛ // Нет Напряжение АКБ 12В env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[43].value = 4;// Занятость кресла ЗП env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[44].value = 3;// Кол-во спутников env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[45].value = 30;// 53 = 113- 30*2 RSSI (GSM Network) env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[46].value = 44;// Network type */ } uint16_t vEgtsPackSensorsDigData(uint8_t *out, tEgtsSensorsDigDataArgs *args, uint16_t step) { uint16_t offset = 0; ADD_TO_RESULT(args->sensorsDigState[step], 2); return offset; } uint16_t vEgtsPackSensorsAnData(uint8_t *out, tEgtsSensorsAnDataArgs *args, uint16_t step) { uint16_t offset = 0; ADD_TO_RESULT(args->sensorsAnState[step], 4); return offset; } uint16_t vEgtsPackPositionData(uint8_t *out, tEgtsPositionDataArgs *args, uint16_t step) { uint16_t offset = 0; ADD_TO_RESULT(args->NTM, 4); ADD_TO_RESULT(args->LAT, 4); ADD_TO_RESULT(args->LONG, 4); ADD_TO_RESULT(args->FLG, 1); ADD_TO_RESULT(args->SPD, 2); ADD_TO_RESULT(args->DIR, 1); ADD_TO_RESULT(args->ODM, 3); ADD_TO_RESULT(args->DIN, 1); ADD_TO_RESULT(args->SRC, 1); ADD_TO_RESULT(args->ALT, 3); return offset; } bool EgtsProcessing_SendSensors(tEgtsProcessing *env, bool isStorage) { uint8_t egtsRaw[256]; memset(egtsRaw, 0, sizeof(egtsRaw)); time_t timestamp; RtcGet(env->gsm->Rtc, ×tamp); // LoggerStrInfoStatic(LOGGER, LOG_SIGN, "НОВАЯ ТЕЛЕМАТИКА"); ++env->egtsPacketId; env->egtsTeledataAdditionalData.idPacked = env->egtsPacketId; env->egtsTeledataAdditionalData.isReceivedResponse = false; uint16_t PackLength; PackLength = vEgtsPackTransportEx3( 0, env->egtsTeledataAdditionalData.idPacked, &env->counter, egtsRaw, EGTS_SERVICE_FLAGS_TELEDATA, EGTS_PT_APPDATA, EGTS_TELEDATA_SERVICE, EGTS_TELEDATA_SERVICE, timestamp, 1, EGTS_SR_POS_DATA, (tEgtsServiceSubRecordGeneratorEx) vEgtsPackPositionData, &env->egtsTeledataSent.egtsPosDataArgs, //20, 1, EGTS_SR_ABS_DIG_SENS_DATA, (tEgtsServiceSubRecordGeneratorEx) vEgtsPackSensorsDigData, &env->egtsTeledataSent.egtsSensorsDigArgs, //47, 25, EGTS_SR_ABS_AN_SENS_DATA, (tEgtsServiceSubRecordGeneratorEx) vEgtsPackSensorsAnData, &env->egtsTeledataSent.egtsSensorsAnArgs ); LoggerFormatInfo(LOGGER, LOG_SIGN, "Отправка пакета (id: %u) теледанных (%u байт):", env->egtsTeledataAdditionalData.idPacked, PackLength) // sendLogHex(env, egtsRaw, PackLength); bool result = EgtsProcessingSend(env, egtsRaw, PackLength, EGTS_WAIT_1, &env->egtsTeledataAdditionalData.isReceivedResponse, NULL); if (!result) { LoggerStrInfoStatic(LOGGER, LOG_SIGN, "Истекло время ожидания (EgtsProcessing_SendSensors)"); return false; } return true; } //конец ---------------------------------Теледанные--------------------------------------------------------------------- //конец ---------------------------------Теледанные--------------------------------------------------------------------- //конец ---------------------------------Теледанные--------------------------------------------------------------------- //начало ---------------------------------Прошивка ЭБУ------------------------------------------------------------------ //начало ---------------------------------Прошивка ЭБУ------------------------------------------------------------------ //начало ---------------------------------Прошивка ЭБУ------------------------------------------------------------------ uint16_t vEgtsPackFirmware(uint8_t *out, tEgtsFirmwareDataArgs *args, uint16_t step) { uint16_t offset = 0; ++args->partNumber; ADD_TO_RESULT(args->idFirmware, 2); ADD_TO_RESULT(args->partNumber, 2); ADD_TO_RESULT(args->countNumber, 2); if (args->partNumber == 1) { tOA OA; OA.MT = 0; OA.OT = 1; OA.Reserve = 0; ADD_TO_RESULT(OA, 1); uint8_t CMI = 0; ADD_TO_RESULT(CMI, 1); uint16_t VER = 0x100; ADD_TO_RESULT(VER, 2); uint16_t WOS = CRC16EGTS(args->bufEbu, args->bufLen); ADD_TO_RESULT(WOS, 2); char FILENAME[100]; sprintf(FILENAME, "DTC_%lu_%s", args->timestamp, args->module); ADD_TO_RESULT(FILENAME, strlen(FILENAME) + 1); } ADD_TO_RESULT(args->bufEbu, args->bufLen); return offset; } bool EgtsProcessing_SendFirmware(tEgtsProcessing *env) { uint8_t egtsRaw[1024]; memset(egtsRaw, 0, sizeof(egtsRaw)); uint16_t firmwarePackLength; time_t timestamp; RtcGet(env->gsm->Rtc, ×tamp); ++env->egtsFirmwareDataArgs.idFirmware; env->egtsFirmwareDataArgs.countNumber = 1; env->egtsFirmwareDataArgs.partNumber = 0; env->egtsFirmwareDataArgs.timestamp = timestamp; ++env->egtsPacketId; env->egtsIdentityAdditionalData.idPacked = env->egtsPacketId; env->egtsIdentityAdditionalData.isReceivedResponse = false; firmwarePackLength = vEgtsPackTransportEx1( 0, env->egtsIdentityAdditionalData.idPacked, &env->counter, egtsRaw, EGTS_SERVICE_FLAGS_FIRMWARE, EGTS_PT_APPDATA, EGTS_FIRMWARE_SERVICE, EGTS_FIRMWARE_SERVICE, timestamp, 1, EGTS_SR_SERVICE_PART_DATA, (tEgtsServiceSubRecordGeneratorEx) vEgtsPackFirmware, &env->egtsFirmwareDataArgs ); LoggerFormatInfo(LOGGER, LOG_SIGN, "Отправка пакета (id: %u) прошивки:", env->egtsIdentityAdditionalData.idPacked) sendLogHex(env, egtsRaw, firmwarePackLength); bool result = EgtsProcessingSend(env, egtsRaw, firmwarePackLength, EGTS_WAIT_1, &env->egtsIdentityAdditionalData.isReceivedResponse, NULL); if (!result) { LoggerStrInfoStatic(LOGGER, LOG_SIGN, "Истекло время ожидания (EgtsProcessing_SendFirmware)"); return false; } return true; } //конец ---------------------------------Прошивка ЭБУ------------------------------------------------------------------ //конец ---------------------------------Прошивка ЭБУ------------------------------------------------------------------ //конец ---------------------------------Прошивка ЭБУ------------------------------------------------------------------ //начало ---------------------------------Команды------------------------------------------------------------------ //начало ---------------------------------Команды------------------------------------------------------------------ //начало ---------------------------------Команды------------------------------------------------------------------ uint16_t vEgtsPackCommandConfirmation(uint8_t *out, tEgtsCommandConfirmationDataArgs *args, uint16_t step) { uint16_t offset = 0; uint8_t flag = (args->CT << 0x4) | (args->CCT & 0xF); ADD_TO_RESULT(flag, 1); ADD_TO_RESULT(args->CID, 4); ADD_TO_RESULT(args->SID, 4); uint8_t hasFlags = (args->ACFE << 0x1) | (args->CHSFE & 0x1); ADD_TO_RESULT(hasFlags, 1); if (args->CHSFE) { ADD_TO_RESULT(args->CHS, 1); } if (args->ACFE) { ADD_TO_RESULT(args->ACL, 1); ADD_TO_RESULT(args->AC, 4); } if ((args->CT == CT_COMCONF) && (args->CCT == CC_OK)) { ADD_TO_RESULT(args->CmdData.ADR, 2); uint8_t flagComData = (args->CmdData.SZ << 0x4) | (args->CmdData.ACT & 0xF); ADD_TO_RESULT(flagComData, 1); ADD_TO_RESULT(args->CmdData.CCD, 2); } if (args->CmdData.DT_SIZE) { ADD_TO_RESULT_P(args->CmdData.DT, args->CmdData.DT_SIZE); } return offset; } bool EgtsProcessing_SendCommandConfirmation(tEgtsProcessing *env, uint8_t cmdType, uint8_t cmdConfirmationType, uint32_t cmdId, uint32_t srcId, uint16_t address, uint8_t size, uint8_t act, uint16_t cmd, uint8_t *DT, uint16_t DT_SIZE) { uint8_t egtsRaw[256]; memset(egtsRaw, 0, sizeof(egtsRaw)); uint16_t commandConfirmationPackLength; time_t timestamp; RtcGet(env->gsm->Rtc, ×tamp); bool authCodeExist = false; bool charsetExist = false; env->egtsCommandConfirmationDataArgs.CT = cmdType; env->egtsCommandConfirmationDataArgs.CCT = cmdConfirmationType; env->egtsCommandConfirmationDataArgs.CID = cmdId; env->egtsCommandConfirmationDataArgs.SID = srcId; env->egtsCommandConfirmationDataArgs.ACFE = authCodeExist; env->egtsCommandConfirmationDataArgs.CHSFE = charsetExist; env->egtsCommandConfirmationDataArgs.CmdData.ADR = address; env->egtsCommandConfirmationDataArgs.CmdData.SZ = size; env->egtsCommandConfirmationDataArgs.CmdData.ACT = act; env->egtsCommandConfirmationDataArgs.CmdData.CCD = cmd; env->egtsCommandConfirmationDataArgs.CmdData.DT_SIZE = DT_SIZE; if (DT_SIZE == 0) { env->egtsCommandConfirmationDataArgs.CmdData.DT = NULL; } else { env->egtsCommandConfirmationDataArgs.CmdData.DT = DT; } ++env->egtsPacketId; env->egtsCommandConfirmationAdditionalData.idPacked = env->egtsPacketId; env->egtsCommandConfirmationAdditionalData.isReceivedResponse = false; commandConfirmationPackLength = vEgtsPackTransportEx1( 0, env->egtsCommandConfirmationAdditionalData.idPacked, &env->counter, egtsRaw, // 0x44, EGTS_SERVICE_FLAGS_COMMAND, EGTS_PT_APPDATA, EGTS_COMMANDS_SERVICE, EGTS_COMMANDS_SERVICE, timestamp, 1, EGTS_SR_COMMAND_DATA, (tEgtsServiceSubRecordGeneratorEx) vEgtsPackCommandConfirmation, &env->egtsCommandConfirmationDataArgs ); LoggerFormatInfo(LOGGER, LOG_SIGN, "Отправка пакета (id: %u) ответа на команду:", env->egtsCommandConfirmationAdditionalData.idPacked) sendLogHex(env, egtsRaw, commandConfirmationPackLength); bool result = EgtsProcessingSend(env, egtsRaw, commandConfirmationPackLength, EGTS_WAIT_1, &env->egtsCommandConfirmationAdditionalData.isReceivedResponse, NULL); if (!result) { LoggerStrInfoStatic(LOGGER, LOG_SIGN, "Истекло время ожидания (EgtsProcessing_SendCommandConfirmation)"); return false; } return true; } //конец ---------------------------------Команды------------------------------------------------------------------ //конец ---------------------------------Команды------------------------------------------------------------------ //конец ---------------------------------Команды------------------------------------------------------------------