577 lines
23 KiB
C
577 lines
23 KiB
C
//
|
||
// 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[SENSORS_AN_Uptime].number = 99;
|
||
// Внешняя температура, С
|
||
env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[SENSORS_AN_ExternalTemperature].number = 104;
|
||
// Уровень топлива, л
|
||
env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[SENSORS_AN_FuelLevel].number = 105;
|
||
// Статус автомобиля
|
||
env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[SENSORS_AN_VehicleStatus].number = 106;
|
||
// Пробег поездки в 1/10000 литра
|
||
env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[SENSORS_AN_TripMileage].number = 111;
|
||
// Минут поездки (сборная)
|
||
env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[SENSORS_AN_MinutesOfTravel].number = 113;
|
||
// Моточасы
|
||
env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[SENSORS_AN_EngineHours].number = 131;
|
||
// Напряжение АКБ 12В
|
||
env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[SENSORS_AN_Voltage12Volts].number = 3;
|
||
// RSSI (GSM Network)
|
||
env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[SENSORS_AN_RSSI].number = 207;
|
||
// Network type
|
||
env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[SENSORS_AN_NetworkType].number = 208;
|
||
// Количество ускорений за поездку
|
||
env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[SENSORS_AN_NumberAccelerations].number = 142;
|
||
// Количество торможений за поездку
|
||
env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[SENSORS_AN_NumberBraking].number = 143;
|
||
// Температура ОХ двигателя
|
||
env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[SENSORS_AN_EngineOXTemperature].number = 150;
|
||
// Номер поездки
|
||
env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[SENSORS_AN_NumberTrip].number = 153;
|
||
// Ср. расход за поездку
|
||
env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[SENSORS_AN_TripSpentFuel].number = 110;
|
||
|
||
// Отладочный датчик 1
|
||
env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[SENSORS_AN_ANS1].number = 11;
|
||
// Отладочный датчик 2
|
||
env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[SENSORS_AN_ANS2].number = 12;
|
||
// Отладочный датчик 3
|
||
env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[SENSORS_AN_ANS3].number = 13;
|
||
// Отладочный датчик 4
|
||
env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[SENSORS_AN_ANS4].number = 14;
|
||
// Отладочный датчик 5
|
||
env->egtsTeledataEdit.egtsSensorsAnArgs.sensorsAnState[SENSORS_AN_ANS5].number = 15;
|
||
|
||
asm("nop");
|
||
|
||
}
|
||
|
||
|
||
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,
|
||
20,
|
||
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;
|
||
}
|
||
|
||
//конец ---------------------------------Команды------------------------------------------------------------------
|
||
//конец ---------------------------------Команды------------------------------------------------------------------
|
||
//конец ---------------------------------Команды------------------------------------------------------------------
|