UveosOnNation_VEGA_Egts/EgtsOutputCommands.c

627 lines
28 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// 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, &timestamp);
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, &timestamp);
// 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, &timestamp);
++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, &timestamp);
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;
}
//конец ---------------------------------Команды------------------------------------------------------------------
//конец ---------------------------------Команды------------------------------------------------------------------
//конец ---------------------------------Команды------------------------------------------------------------------