SMART_COMPONENTS_Can/CanMain.c

1801 lines
80 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 05.08.2024.
//
#include "CanMain.h"
#include "CanPortFrame.h"
#include "SystemDelayInterface.h"
#include "LoggerToSerialPort.h"
#include "DiagnosticSessionControl_10.h"
#include "TesterPresent_3e.h"
#include "ReadDataByIdentifier_22i.h"
#include "string.h"
#include "EgtsInputCommands.h"
#include "EgtsEbu.h"
#include "RoutineControl_31.h"
#include "EgtsOutputCommands.h"
#include "math.h"
#define LOG_SIGN "UDS"
#define LOGGER &env->slog->logger
const uint8_t canTestData[8] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07};
extern tFirmwareLoader FIRMWARE_TELE_LOADER;
uint8_t reverseBits(uint8_t number) {
number = (number & 0x55) << 1 | (number & 0xAA) >> 1;
number = (number & 0x33) << 2 | (number & 0xCC) >> 2;
number = (number & 0x0F) << 4 | (number & 0xF0) >> 4;
return number;
}
bool ReceivedCan_func(void *arg, can_rx_message_type *canFrame) {
tCanMain *env = arg;
if ((canFrame->standard_id == TESTER_REQUEST_GNSS) ||
(canFrame->standard_id == TESTER_REQUEST_FUNC) ||
(canFrame->standard_id == TESTER_REQUEST_ABS_ESP) ||
(canFrame->standard_id == TESTER_REQUEST_ACU) ||
(canFrame->standard_id == TESTER_REQUEST_ECM) ||
(canFrame->standard_id == TESTER_REQUEST_HVAC) ||
(canFrame->standard_id == TESTER_REQUEST_IMMO_D) ||
(canFrame->standard_id == TESTER_REQUEST_ITELMA_IMMO_D) ||
(canFrame->standard_id == TESTER_REQUEST_PTS) ||
(canFrame->standard_id == TESTER_REQUEST_SAS)) {
env->isTimeTESTER_REQUEST = SystemGetMs();
}
/*
tCanMain *env = arg;
if (env->timeCan < SystemGetMs()) {
env->timeCan = SystemGetMs() + 1000;
LoggerStrFormatInfo(LOGGER, LOG_SIGN, "MAIN CAN = [%02x:%02x] %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x",
(canFrame->standard_id >> 8) & 0xff, canFrame->standard_id & 0xff,
canFrame->data[0], canFrame->data[1], canFrame->data[2], canFrame->data[3],
canFrame->data[4], canFrame->data[5], canFrame->data[6], canFrame->data[7])
}
// IPC_General
if (canFrame->standard_id == 0x3E8) {
// внешняя температура
// Factor = 1.0 Offset = -40 Factor = 0.5 Offset = -40
uint8_t CanRaw_ExternalTemperature = canFrame->data[1];
if (CanRaw_ExternalTemperature != 0xFF) {
double ExternalTemperature = CanRaw_ExternalTemperature * 1.0 - 40;
// if (env->time3E8_1 < SystemGetMs()) {
// env->time3E8_1 = SystemGetMs() + 1000;
// LoggerStrFormatInfo(LOGGER, LOG_SIGN, "Внешняя температура = %d", (uint8_t) ExternalTemperature)
// }
env->egtsTeledata->egtsSensorsAnArgs.sensorsAnState[SENSORS_AN_ExternalTemperature].value = (uint8_t) (
(ExternalTemperature + 40) / 0.5);
}
// уровень топлива
// Factor = 0.5 Offset = 0 Factor = 0.5 Offset = 0
uint8_t CanRaw_FuelLevel = canFrame->data[3];
if (CanRaw_FuelLevel != 0xFF) {
double FuelLevel = CanRaw_FuelLevel * 0.5;
// if (env->time3E8_2 < SystemGetMs()) {
// env->time3E8_2 = SystemGetMs() + 1000;
// LoggerStrFormatInfo(LOGGER, LOG_SIGN, "Уровень топлива = %d", (uint8_t)FuelLevel)
// }
env->egtsTeledata->egtsSensorsAnArgs.sensorsAnState[SENSORS_AN_FuelLevel].value = (uint8_t) (FuelLevel /
0.5);
}
}
// ECM_Dashboard
if (canFrame->standard_id == 0x380) {
// температура двигателя
// Factor = 0.75 Offset = -48 Factor = 0.5 Offset = -40
uint8_t CanRaw_EngineOXTemperature = canFrame->data[0];
double EngineOXTemperature =
canFrame->data[0] * 0.75 - 48;
if (EngineOXTemperature < -39.5) {
env->egtsTeledata->egtsSensorsAnArgs.sensorsAnState[SENSORS_AN_EngineOXTemperature].value = 0;
} else {
env->egtsTeledata->egtsSensorsAnArgs.sensorsAnState[SENSORS_AN_EngineOXTemperature].value = (uint8_t) (
(EngineOXTemperature + 40) / 0.5);
}
// if (env->time380_1 < SystemGetMs()) {
// env->time380_1 = SystemGetMs() + 1000;
// LoggerStrFormatInfo(LOGGER, LOG_SIGN, "Температура двигателя = %d", (uint8_t) EngineOXTemperature)
// }
// обороты двигателя
env->EngineSpeed = canFrame->data[1] * 40;
// if (env->time380_2 < SystemGetMs()) {
// env->time380_2 = SystemGetMs() + 1000;
// LoggerStrFormatInfo(LOGGER, LOG_SIGN, "Обороты двигателя = %d", env->EngineSpeed)
// }
}
*/
if ((env->isTimeTESTER_REQUEST + 5000) > SystemGetMs()) {
return true;
}
return false;
}
char *sendLogCanHex(tCanSerialPortFrameTp *env, uint8_t *data, size_t size);
void ReceivedTP_func(void *arg, tCanTP_data *data) {
tCanMain *env = arg;
// LoggerStrInfoStatic(LOGGER, LOG_SIGN, "Приняты данные: ");
// sendLogCanHex(&env->canSerialPortFrameTp, data->data, data->len);
if (data->adrCan == TESTER_REQUEST_GNSS) {
if (data->data[0] == UDS_TesterPresent) {
tTesterPresent testerPresent;
testerPresent.ServiceId = data->data[0] | 0b1000000;
testerPresent.zeroSubFunction = data->data[1] & 0b1111111;
CanSerialPortFrameTpTransmit(&env->canSerialPortFrameTp, (uint8_t *) &testerPresent,
sizeof(tTesterPresent), TESTER_RESPONSE_GNSS, WAIT_FRAME_WRITE);
return;
}
osStatus_t status = osMessageQueuePut(env->queueMain, data, 0, 0U);
if (status != osOK) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка добавления в очередь addCommandQueue 1")
}
} else {
osStatus_t status = osMessageQueuePut(env->queueAdditional, data, 0, 0U);
if (status != osOK) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка добавления в очередь addCommandQueue 2")
}
}
}
void CanMain_Init(
tCanMain *env,
tDeviceTeledataStorageData *deviceTeledataStorageData,
tSerialPortFrameIO *CanIO,
SystemMutexCmsis txAccessQueue,
tDeviceTestsTable *testsTable,
tLoggerToSerialPort *slog,
volatile tRawAccel *rawAccel,
tEgtsTeledata *egtsTeledata
) {
env->CanIO = CanIO;
env->deviceTeledataStorageData = deviceTeledataStorageData;
env->txAccessQueue = txAccessQueue;
env->slog = slog;
env->rawAccel = rawAccel;
env->testsTable = testsTable;
env->egtsTeledata = egtsTeledata;
env->queueMain = osMessageQueueNew(CAN_US_QUEUE_SIZE, sizeof(tCanTP_data), NULL);
env->queueAdditional = osMessageQueueNew(CAN_US_QUEUE_SIZE, sizeof(tCanTP_data), NULL);
env->invalidKey = true;
env->invalidKeyAttempts = 3;
env->invalidKeyIsDelay = 0;
env->isTimeTESTER_REQUEST = 0;
env->filterIdCount = 7;
env->filterReqId[0] = TESTER_RESPONSE_ABS_ESP;
env->filterReqId[1] = TESTER_RESPONSE_ECM;
env->filterReqId[2] = TESTER_RESPONSE_HVAC;
env->filterReqId[3] = TESTER_RESPONSE_IMMO_D;
env->filterReqId[4] = TESTER_RESPONSE_PTS;
env->filterReqId[5] = TESTER_REQUEST_GNSS;
env->filterReqId[6] = TESTER_RESPONSE_ITELMA_IMMO_D;
env->filterRespId[0] = TESTER_REQUEST_ABS_ESP;
env->filterRespId[1] = TESTER_REQUEST_ECM;
env->filterRespId[2] = TESTER_REQUEST_HVAC;
env->filterRespId[3] = TESTER_REQUEST_IMMO_D;
env->filterRespId[4] = TESTER_REQUEST_PTS;
env->filterRespId[5] = TESTER_RESPONSE_GNSS;
env->filterRespId[6] = TESTER_REQUEST_ITELMA_IMMO_D;
env->filterDirReq[0] = 0;
env->filterDirReq[1] = 0;
env->filterDirReq[2] = 0;
env->filterDirReq[3] = 0;
env->filterDirReq[4] = 0;
env->filterDirReq[5] = 1;
env->filterDirReq[6] = 0;
CanSerialPortFrameTpInit(
&env->canSerialPortFrameTp,
0,
env->txAccessQueue,
ReceivedCan_func,
env,
ReceivedTP_func,
env,
env->CanIO,
(tCanTP_data *) &env->canTP_Ext_data,
sizeof(env->canTP_Ext_data.data),
slog,
env->filterIdCount,
env->filterReqId,
env->filterRespId,
env->filterDirReq
);
bool result;
// Тип вызова 112
result = VariablesTable_SetIdUDS_ByNameStatic(EXT_ENV_TELE.store.publicVariablesTable, "ECALL_TEST_MODE",
UDS_ECALLToTest,
1);
// Категория транспортного средства
result = VariablesTable_SetIdUDS_ByNameStatic(EXT_ENV_TELE.store.publicVariablesTable, "VEHICLE_TYPE",
UDS_VehicleType,
1);
// Тип энергоносителя
result = VariablesTable_SetIdUDS_ByNameStatic(EXT_ENV_TELE.store.publicVariablesTable,
"VEHICLE_PROPULSION_STORAGE_TYPE", UDS_vehicleFuelType, 1);
// Количество пассажиров
result = VariablesTable_SetIdUDS_ByNameStatic(EXT_ENV_TELE.store.publicVariablesTable, "VEHICLE_PASSENGERS_NUMBER",
UDS_passengersNumber, 1);
result = VariablesTable_SetIdUDS_ByNameStatic(EXT_ENV_TELE.store.publicVariablesTable, "TEST_MODE_END_DISTANCE",
UDS_TestModeEndDistance, 2);
// SIM Идентификатор
result = VariablesTable_SetIdUDS_ByNameStatic(EXT_ENV_TELE.store.publicVariablesTable, "GSM_CCID",
UDS_SimIdentifier,
19);
// SIM Идентификатор COMM
result = VariablesTable_SetIdUDS_ByNameStatic(EXT_ENV_TELE.store.publicVariablesTable, "GSM_CCID_COMERS",
UDS_CommSimIdentifier,
20);
// (МИН) Промежуток времени после завершения экстренного вызова, в течение которого УСВ автоматически отвечает на входящие звонки
result = VariablesTable_SetIdUDS_ByNameStatic(EXT_ENV_TELE.store.publicVariablesTable, "CALL_AUTO_ANSWER_TIME",
UDS_CallAutoAnswerTime, 2);
// Номер для тестового вызова
result = VariablesTable_SetIdUDS_ByNameStatic(EXT_ENV_TELE.store.publicVariablesTable, "ECALL_TEST_NUMBER",
UDS_ECALLTestNumber, 20);
// (МИН) Время, после которого коммуникационный модуль GSM и UMTS прекращает регистрацию в сети
result = VariablesTable_SetIdUDS_ByNameStatic(EXT_ENV_TELE.store.publicVariablesTable, "NAD_DEREGISTRATION_TIME",
UDS_NadDeregistrationTimer, 2);
// Номер SMS цента
result = VariablesTable_SetIdUDS_ByNameStatic(EXT_ENV_TELE.store.publicVariablesTable, "SMS_CENTER",
UDS_SMSCenterNumber, 20);
// Номер, по которому УСВ посылает SMS с МНД при ошибке передачи МНД посредством in-band модема и по запросу от оператора системы. Определяется оператором национальной системы реагирования на аварии
result = VariablesTable_SetIdUDS_ByNameStatic(EXT_ENV_TELE.store.publicVariablesTable, "ECALL_SMS_FALLBACK_NUMBER",
UDS_SMSFallbackNumber, 20);
// Период регистрации ТЕСТ
result = VariablesTable_SetIdUDS_ByNameStatic(EXT_ENV_TELE.store.publicVariablesTable, "TEST_REGISTRATION_PERIOD",
UDS_TestRegistrationPeriod, 2);
// Число попыток дозвона при экстренном вызове, инициированном вручную. Значение не может устанавливаться в «0»
result = VariablesTable_SetIdUDS_ByNameStatic(EXT_ENV_TELE.store.publicVariablesTable, "ECALL_MANUAL_DIAL_ATTEMPTS",
UDS_EcallManualDialAttempts, 2);
// Интервал времени между повторными попытками отправки мнд из памяти
result = VariablesTable_SetIdUDS_ByNameStatic(EXT_ENV_TELE.store.publicVariablesTable, "INT_MEM_TRANSMIT_INTERVAL",
UDS_IntMemTransmitInterval, 2);
// Количество попыток отправки мнд из памяти
result = VariablesTable_SetIdUDS_ByNameStatic(EXT_ENV_TELE.store.publicVariablesTable, "INT_MEM_TRANSMIT_ATTEMPTS",
UDS_IntMemTransmitAttempts, 2);
// Только транспортные средства категорий М1 и N1 — число попыток дозвона при автоматически инициированном экстренном вызове. Не может быть установлено в «0»
result = VariablesTable_SetIdUDS_ByNameStatic(EXT_ENV_TELE.store.publicVariablesTable, "ECALL_AUTO_DIAL_ATTEMPTS",
UDS_EcallAutoDialAttempts, 2);
// (МИН) Общая продолжительность дозвона при инициации экстренного вызова
result = VariablesTable_SetIdUDS_ByNameStatic(EXT_ENV_TELE.store.publicVariablesTable, "ECALL_DIAL_DURATION",
UDS_EcallDialDuration, 2);
// APN
result = VariablesTable_SetIdUDS_ByNameStatic(EXT_ENV_TELE.store.publicVariablesTable, "EGTS_GPRS_APN",
UDS_Apn, 50);
// Промежуток времени, в течение которого УСВ остается зарегистрированной в сети после передачи результатов тестирования оператору системы
result = VariablesTable_SetIdUDS_ByNameStatic(EXT_ENV_TELE.store.publicVariablesTable,
"POST_TEST_REGISTRATION_TIME",
UDS_PostTestRegistrationTime, 2);
// IMEI
result = VariablesTable_SetIdUDS_ByNameStatic(EXT_ENV_TELE.store.publicVariablesTable, "GSM_CGSN", UDS_IMEI, 15);
// VIN
result = VariablesTable_SetIdUDS_ByNameStatic(EXT_ENV_TELE.store.publicVariablesTable, "VIN",
UDS_vehicleIdentificationNumber, 17);
// SW_Version
result = VariablesTable_SetIdUDS_ByNameStatic(EXT_ENV_TELE.store.publicVariablesTable, "SOFTWARE_VERS",
UDS_SW_Version, 27);
// UDS_ECUSerialNumber
result = VariablesTable_SetIdUDS_ByNameStatic(EXT_ENV_TELE.store.publicVariablesTable, "ECU_SERIAL_NUMBER",
UDS_ECUSerialNumber, 20);
result = VariablesTable_SetIdUDS_ByNameStatic(EXT_ENV_TELE.store.publicVariablesTable, "ACCEL_CALLIBRATION_X",
UDS_AccelCalibrationX, 2);
result = VariablesTable_SetIdUDS_ByNameStatic(EXT_ENV_TELE.store.publicVariablesTable, "ACCEL_CALLIBRATION_Y",
UDS_AccelCalibrationY, 2);
result = VariablesTable_SetIdUDS_ByNameStatic(EXT_ENV_TELE.store.publicVariablesTable, "ACCEL_CALLIBRATION_Z",
UDS_AccelCalibrationZ, 2);
result = VariablesTable_SetIdUDS_ByNameStatic(EXT_ENV_TELE.store.publicVariablesTable, "ROLLOVER_ANGLE",
UDS_RolloverAngle, 1);
result = VariablesTable_SetIdUDS_ByNameStatic(EXT_ENV_TELE.store.publicVariablesTable, "ROLLOVER_TIME",
UDS_RolloverTime, 1);
result = VariablesTable_SetIdUDS_ByNameStatic(EXT_ENV_TELE.store.publicVariablesTable, "DIRECTION_ANGLE",
UDS_DirectionAngle, 1);
/*
result = VariablesTable_SetIdUDS_ByNameStatic(EXT_ENV_TELE.store.publicVariablesTable, "EGTS_SERVER_ADDRESS",
UDS_ServerAddress, 32);
result = VariablesTable_SetIdUDS_ByNameStatic(EXT_ENV_TELE.store.publicVariablesTable, "EGTS_SERVER_SSL_ENABLE",
UDS_ServerSslEnable, 1);
result = VariablesTable_SetIdUDS_ByNameStatic(EXT_ENV_TELE.store.publicVariablesTable, "EGTS_ALT_SERVER_ADDRESS",
UDS_AltServerAddress, 32);
*/
result = VariablesTable_SetIdUDS_ByNameStatic(EXT_ENV_TELE.store.publicVariablesTable, "TELEMATICA_IS_ACTIVE",
UDS_TelematicsEnabledDisabled, 1);
result = VariablesTable_SetIdUDS_ByNameStatic(EXT_ENV_TELE.store.publicVariablesTable, "GNSS_GENERAL_TO_CAN",
UDS_TelematicsEnabledCanGnss, 1);
result = VariablesTable_SetIdUDS_ByNameStatic(EXT_ENV_TELE.store.publicVariablesTable, "NAV_DATA_TO_CAN",
UDS_TelematicsEnabledCanNav, 1);
InitThreadBlock(env->T_can_Main, "CanMain", osPriorityNormal);
}
void SetUdsDTCerror(tCanMain *env, uint16_t *sizeResponse, eUdsErrorDTC codeError) {
env->canUDS_DataSendingBuf[*sizeResponse + 3] = UDS_DTC_Error[codeError].DTCHighByte;
env->canUDS_DataSendingBuf[*sizeResponse + 4] = UDS_DTC_Error[codeError].DTCMiddleByte;
env->canUDS_DataSendingBuf[*sizeResponse + 5] = UDS_DTC_Error[codeError].DTCLowByte;
env->canUDS_DataSendingBuf[*sizeResponse + 6] = 0x1;
*sizeResponse += 4;
}
static unsigned long SeedToKeyUAZ_ERA_NAMI(unsigned char rnd, unsigned long dwSeedInfo) {
#define Mask 0x52F387A6UL
unsigned char i;
unsigned long key = dwSeedInfo;
rnd += 35;
if (rnd < 35) rnd = 255;
for (i = 0; i < rnd; i++) {
if (key & 0x80000000UL)
key = (key << 1) ^ Mask;
else
key <<= 1;
}
return key;
}
void CanMainTask(tCanMain *env) {
tCanTP_data data;
uint32_t timeoutClearSettings = 0;
eUdsStartStopRoutineResult udsStartStopRoutineResult;
eUdsRequestRoutineResult udsRequestRoutineResult;
for (;;) {
osStatus_t status = osMessageQueueGet(env->queueMain, &data, 0, 1000);
if (status == osOK) {
// начало --------------------------- SecurityAccess ---------------------------------------------------------------
// начало --------------------------- SecurityAccess --------------------------------------------------------------
// начало --------------------------- SecurityAccess --------------------------------------------------------------
if (data.data[0] == UDS_SecurityAccess) {
bool isResponse = false;
uint16_t sizeResponse = 0;
uint32_t timeSystemGetMs = SystemGetMs();
if (data.data[1] == 0x01) {
isResponse = true;
if (env->invalidKeyIsDelay < timeSystemGetMs) {
env->RND = data.data[2];
sizeResponse = 6;
uint32_t securitySeed = 0x11223344;
env->canUDS_DataSendingBuf[2] = securitySeed >> 24;
env->canUDS_DataSendingBuf[3] = securitySeed >> 16;
env->canUDS_DataSendingBuf[4] = securitySeed >> 8;
env->canUDS_DataSendingBuf[5] = securitySeed;
}
}
if (data.data[1] == 0x02) {
isResponse = true;
if (env->invalidKeyIsDelay < timeSystemGetMs) {
sizeResponse = 3;
uint32_t securitySeed =
(data.data[2] << 24) |
(data.data[3] << 16) |
(data.data[4] << 8) |
data.data[5];
env->canUDS_DataSendingBuf[2] = 2;
uint32_t securitySeedMy = SeedToKeyUAZ_ERA_NAMI(env->RND, 0x11223344);
if (securitySeedMy != securitySeed) {
env->invalidKey = true;
if (env->invalidKeyAttempts > 0) {
--env->invalidKeyAttempts;
} else {
env->invalidKeyAttempts = 3;
env->invalidKeyIsDelay = timeSystemGetMs + 10000;
}
} else {
env->invalidKey = false;
env->invalidKeyAttempts = 3;
}
//------------------------Всегда разрешено !!!!!!!!!!!!!!!!!!
// env->invalidKey = false;
}
}
if (isResponse) {
if (env->invalidKeyIsDelay > timeSystemGetMs) {
sizeResponse = 3;
env->canUDS_DataSendingBuf[0] = 0x7F;
env->canUDS_DataSendingBuf[1] = data.data[0];
env->canUDS_DataSendingBuf[2] = 0x36;
} else if ((env->invalidKey) && (data.data[1] == 0x02)) {
sizeResponse = 3;
env->canUDS_DataSendingBuf[0] = 0x7F;
env->canUDS_DataSendingBuf[1] = data.data[0];
env->canUDS_DataSendingBuf[2] = 0x35;
} else {
env->canUDS_DataSendingBuf[0] = data.data[0] | 0b1000000;
env->canUDS_DataSendingBuf[1] = data.data[1];
}
} else {
sizeResponse = 3;
env->canUDS_DataSendingBuf[0] = 0x7F;
env->canUDS_DataSendingBuf[1] = data.data[0];
env->canUDS_DataSendingBuf[2] = 0x12;
}
CanSerialPortFrameTpTransmit(&env->canSerialPortFrameTp, env->canUDS_DataSendingBuf,
sizeResponse, TESTER_RESPONSE_GNSS, WAIT_FRAME_WRITE);
}
// конец ---------------------------- SecurityAccess ---------------------------------------------------------------
// конец ---------------------------- SecurityAccess --------------------------------------------------------------
// конец ---------------------------- SecurityAccess --------------------------------------------------------------
// начало --------------------------- Сброс ---------------------------------------------------------------
// начало --------------------------- Сброс --------------------------------------------------------------
// начало --------------------------- Сброс --------------------------------------------------------------
if (data.data[0] == UDS_ECUResetService) {
bool isResponse = false;
uint16_t sizeResponse = 0;
if (data.data[1] == 0x60) {
isResponse = true;
}
if (isResponse) {
sizeResponse = 2;
env->canUDS_DataSendingBuf[0] = data.data[0] | 0b1000000;
env->canUDS_DataSendingBuf[1] = data.data[1];
} else {
sizeResponse = 3;
env->canUDS_DataSendingBuf[0] = 0x7F;
env->canUDS_DataSendingBuf[1] = data.data[0];
env->canUDS_DataSendingBuf[2] = 0x12;
}
CanSerialPortFrameTpTransmit(&env->canSerialPortFrameTp, env->canUDS_DataSendingBuf,
sizeResponse, TESTER_RESPONSE_GNSS, WAIT_FRAME_WRITE);
if (isResponse) {
SystemDelayMs(5000);
EXT_ENV_TELE.osFreeRTOS.nvic_system_reset();
}
}
// конец ---------------------------- Сброс ---------------------------------------------------------------
// конец ---------------------------- Сброс --------------------------------------------------------------
// конец ---------------------------- Сброс --------------------------------------------------------------
// начало --------------------------- Вызов функции УВЭОС --------------------------------------------------
// начало --------------------------- Вызов функции УВЭОС -------------------------------------------------
// начало --------------------------- Вызов функции УВЭОС -------------------------------------------------
if (data.data[0] == UDS_RoutineControl) {
bool isResponse = false;
uint16_t sizeResponse = 0;
eUdsRoutineControlType udsRoutineControlType = data.data[1];
uint16_t routineIdentifier = (data.data[2] << 8) | data.data[3];
eUdsRoutineModes udsRoutineModes = data.data[4];
if (routineIdentifier == UDS_Self_Test) {
if ((udsRoutineControlType == UDS_StartRoutine) ||
(udsRoutineControlType == UDS_StopRoutine) ||
(udsRoutineControlType == UDS_RequestRoutineResults)) {
if ((udsRoutineModes == UDS_MicrophoneDynamic) ||
(udsRoutineModes == UDS_SosTestCall) ||
(udsRoutineModes == UDS_SosTestCallNoMTS) ||
(udsRoutineModes == UDS_LEDs)) {
EXT_ENV_TELE.Routine_Can_UDS(EXT_ENV_TELE.Routine_Can_UDS_env,
routineIdentifier,
udsRoutineModes,
udsRoutineControlType,
&udsStartStopRoutineResult,
&udsRequestRoutineResult
);
isResponse = true;
}
}
}
if (routineIdentifier == UDS_ModuleRegistration) {
udsRoutineModes = UDS_NotDefined;
EXT_ENV_TELE.Routine_Can_UDS(EXT_ENV_TELE.Routine_Can_UDS_env,
routineIdentifier,
udsRoutineModes,
udsRoutineControlType,
&udsStartStopRoutineResult,
&udsRequestRoutineResult
);
isResponse = true;
}
if ((env->invalidKey == false) ||
(memcmp(EXT_ENV_TELE.store.gost->VIN.data, "00000000000000000", 17) == 0)) {
if (routineIdentifier == UDS_BoardVoltageCalibration) {
udsRoutineModes = UDS_NotDefined;
EXT_ENV_TELE.Routine_Can_UDS(EXT_ENV_TELE.Routine_Can_UDS_env,
routineIdentifier,
udsRoutineModes,
udsRoutineControlType,
&udsStartStopRoutineResult,
&udsRequestRoutineResult
);
isResponse = true;
}
if (routineIdentifier == Clear_EEPROM) {
udsRoutineModes = UDS_NotDefined;
EXT_ENV_TELE.Routine_Can_UDS(EXT_ENV_TELE.Routine_Can_UDS_env,
routineIdentifier,
udsRoutineModes,
udsRoutineControlType,
&udsStartStopRoutineResult,
&udsRequestRoutineResult
);
/*
if (udsRoutineControlType == UDS_StartRoutine) {
// String32CopyStatic(&EXT_ENV_TELE.store.gost->VIN, "00000000000000000");
// EXT_ENV_TELE.store.publicVariablesTable->changes = 1;
udsStartStopRoutineResult = RoutineStartStopSuccess;
timeoutClearSettings = SystemGetMs() + 5000;
}
if (udsRoutineControlType == UDS_RequestRoutineResults) {
if (timeoutClearSettings > SystemGetMs()) {
udsRequestRoutineResult = UDS_RoutineRun;
} else {
udsRequestRoutineResult = UDS_RoutineFinishSuccess;
}
}
*/
isResponse = true;
}
}
if (isResponse) {
sizeResponse = 5;
env->canUDS_DataSendingBuf[0] = data.data[0] | 0b1000000;
env->canUDS_DataSendingBuf[1] = data.data[1];
env->canUDS_DataSendingBuf[2] = data.data[2];
env->canUDS_DataSendingBuf[3] = data.data[3];
if ((udsRoutineControlType == UDS_StartRoutine) || (udsRoutineControlType == UDS_StopRoutine)) {
env->canUDS_DataSendingBuf[4] = udsStartStopRoutineResult;
}
if (udsRoutineControlType == UDS_RequestRoutineResults) {
env->canUDS_DataSendingBuf[4] = udsRequestRoutineResult;
}
} else {
sizeResponse = 3;
env->canUDS_DataSendingBuf[0] = 0x7F;
env->canUDS_DataSendingBuf[1] = data.data[0];
env->canUDS_DataSendingBuf[2] = 0x12;
if (env->invalidKey) {
env->canUDS_DataSendingBuf[2] = 0x33;
}
}
CanSerialPortFrameTpTransmit(&env->canSerialPortFrameTp, env->canUDS_DataSendingBuf,
sizeResponse, TESTER_RESPONSE_GNSS, WAIT_FRAME_WRITE);
}
// конец --------------------------- Вызов функции УВЭОС --------------------------------------------------
// конец --------------------------- Вызов функции УВЭОС --------------------------------------------------
// конец --------------------------- Вызов функции УВЭОС --------------------------------------------------
// начало ----------------------------- Сессия -------------------------------------------------------------
// начало ----------------------------- Сессия -------------------------------------------------------------
// начало ----------------------------- Сессия -------------------------------------------------------------
if (data.data[0] == UDS_DiagnosticSessionControl) {
tDiagnosticSessionsType diagnosticSessionsType;
diagnosticSessionsType.ServiceId = data.data[0] | 0b1000000;
diagnosticSessionsType.diagnosticSessionType = data.data[1] & 0b1111111;
diagnosticSessionsType.sessionParameterRecord[0] = 0;
diagnosticSessionsType.sessionParameterRecord[1] = 0x32;
diagnosticSessionsType.sessionParameterRecord[2] = 0x01;
diagnosticSessionsType.sessionParameterRecord[3] = 0xF4;
CanSerialPortFrameTpTransmit(&env->canSerialPortFrameTp, (uint8_t *) &diagnosticSessionsType,
sizeof(tDiagnosticSessionsType), TESTER_RESPONSE_GNSS, WAIT_FRAME_WRITE);
}
// конец ----------------------------- Сессия -------------------------------------------------------------
// конец ----------------------------- Сессия -------------------------------------------------------------
// конец ----------------------------- Сессия -------------------------------------------------------------
// начало --------------------------- Ошибки --------------------------------------------------------------
// начало --------------------------- Ошибки --------------------------------------------------------------
// начало --------------------------- Ошибки --------------------------------------------------------------
if (data.data[0] == UDS_ReadDTCInformation) {
uint16_t sizeResponse = 0;
env->canUDS_DataSendingBuf[0] = data.data[0] | 0b1000000;
env->canUDS_DataSendingBuf[1] = data.data[1];
env->canUDS_DataSendingBuf[2] = data.data[2];
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)
SetUdsDTCerror(env, &sizeResponse, UDS_TEST_BAT_CONNECT);
}
if (egtsTestEbu == TEST_BAT_CHARGE) {
// DEVICE_TESTING_CODE_ERROR
if (deviceTestingCode == DEVICE_TESTING_CODE_ERROR)
SetUdsDTCerror(env, &sizeResponse, UDS_TEST_BAT_CHARGE);
}
if (egtsTestEbu == TEST_BAT_VOLTAGE) {
// DEVICE_TESTING_CODE_ERROR
if (deviceTestingCode == DEVICE_TESTING_CODE_ERROR)
SetUdsDTCerror(env, &sizeResponse, 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))
SetUdsDTCerror(env, &sizeResponse, 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))
SetUdsDTCerror(env, &sizeResponse, UDS_TEST_SPEAKER_CONNECT);
}
if (egtsTestEbu == TEST_BIP_CONNECT) {
if (deviceTestingCode == DEVICE_TESTING_CODE_NOT_CONNECTED)
SetUdsDTCerror(env, &sizeResponse, UDS_TEST_MICROPHONE_CONNECT);
}
if (egtsTestEbu == TEST_ACCEL) {
// DEVICE_TESTING_CODE_ERROR
if (deviceTestingCode == DEVICE_TESTING_CODE_ERROR)
SetUdsDTCerror(env, &sizeResponse, UDS_TEST_ACCEL);
}
if (egtsTestEbu == TEST_GSM) {
// DEVICE_TESTING_CODE_ERROR
if (deviceTestingCode == DEVICE_TESTING_CODE_ERROR)
SetUdsDTCerror(env, &sizeResponse, UDS_TEST_GSM);
}
if (egtsTestEbu == TEST_AUDIO_CODEC) {
// DEVICE_TESTING_CODE_ERROR
if (deviceTestingCode == DEVICE_TESTING_CODE_ERROR)
SetUdsDTCerror(env, &sizeResponse, UDS_TEST_GSM_AUDIO_CODEC);
}
if (egtsTestEbu == TEST_VIN) {
// DEVICE_TESTING_CODE_ERROR
if (deviceTestingCode == DEVICE_TESTING_CODE_ERROR)
SetUdsDTCerror(env, &sizeResponse, UDS_TEST_VIN);
}
if (egtsTestEbu == TEST_ACCEL_CALIB) {
// DEVICE_TESTING_CODE_ERROR
if (deviceTestingCode == DEVICE_TESTING_CODE_ERROR)
SetUdsDTCerror(env, &sizeResponse, UDS_TEST_ACCEL_CALIB);
}
if (egtsTestEbu == TEST_EOL) {
// DEVICE_TESTING_CODE_ERROR
// if (deviceTestingCode == DEVICE_TESTING_CODE_ERROR)
// SetUdsDTCerror(env, &sizeResponse, UDS_TEST_EOL);
}
if (egtsTestEbu == TEST_MODEM_SOFT_REV) {
// DEVICE_TESTING_CODE_ERROR
if (deviceTestingCode == DEVICE_TESTING_CODE_ERROR)
SetUdsDTCerror(env, &sizeResponse, UDS_TEST_MODEM_SOFT_REV);
}
if (egtsTestEbu == TEST_CERT_REV) {
// DEVICE_TESTING_CODE_ERROR
if (deviceTestingCode == DEVICE_TESTING_CODE_ERROR)
SetUdsDTCerror(env, &sizeResponse, UDS_TEST_CERT_REV);
}
if (egtsTestEbu == TEST_AUDIO_FILE) {
// DEVICE_TESTING_CODE_ERROR
if (deviceTestingCode == DEVICE_TESTING_CODE_ERROR)
SetUdsDTCerror(env, &sizeResponse, UDS_TEST_AUDIO_FILE);
}
if (egtsTestEbu == TEST_AMPLIFIER) {
// DEVICE_TESTING_CODE_ERROR
if (deviceTestingCode == DEVICE_TESTING_CODE_ERROR)
SetUdsDTCerror(env, &sizeResponse, UDS_TEST_AMPLIFIER);
}
if (egtsTestEbu == TEST_SIM_ERA) {
// DEVICE_TESTING_CODE_ERROR
if (deviceTestingCode == DEVICE_TESTING_CODE_ERROR)
SetUdsDTCerror(env, &sizeResponse, UDS_TEST_SIM_ERA);
}
if (egtsTestEbu == TEST_SIM_COMERS) {
// DEVICE_TESTING_CODE_ERROR
if (deviceTestingCode == DEVICE_TESTING_CODE_ERROR)
SetUdsDTCerror(env, &sizeResponse, UDS_TEST_SIM_COMERS);
}
}
CanSerialPortFrameTpTransmit(&env->canSerialPortFrameTp, env->canUDS_DataSendingBuf,
sizeResponse + 3, TESTER_RESPONSE_GNSS, WAIT_FRAME_WRITE);
}
if (data.data[0] == UDS_ClearDiagnosticInformation) {
uint16_t sizeResponse = 0;
env->canUDS_DataSendingBuf[0] = data.data[0] | 0b1000000;
clearResultTest();
CanSerialPortFrameTpTransmit(&env->canSerialPortFrameTp, env->canUDS_DataSendingBuf,
sizeResponse + 1, TESTER_RESPONSE_GNSS, WAIT_FRAME_WRITE);
}
// конец --------------------------- Ошибки ---------------------------------------------------------
// конец --------------------------- Ошибки ---------------------------------------------------------
// конец --------------------------- Ошибки ---------------------------------------------------------
// начало --------------------------- Чтение ---------------------------------------------------------
// начало --------------------------- Чтение ---------------------------------------------------------
// начало --------------------------- Чтение ---------------------------------------------------------
if (data.data[0] == UDS_ReadDataByIdentifier) {
uint16_t dataIdentifier;
bool isResponse = false;
uint16_t sizeResponse = 0;
dataIdentifier = (data.data[1] << 8) | data.data[2];
memset(env->canUDS_DataSendingBuf, 0, sizeof(env->canUDS_DataSendingBuf));
tVariableDescriptor *desc = VariablesTable_GetByIdUDS(EXT_ENV_TELE.store.publicVariablesTable,
dataIdentifier);
if (desc != NULL) {
if (desc->typeId == VARIABLE_TYPE_STRING) {
memcpy(&env->canUDS_DataSendingBuf[3], desc->addr, *(uint8_t *) (desc->len));
/*
if (!EXT_ENV_TELE.store.device->factoryMode) {
if (dataIdentifier == UDS_ECUSerialNumber) {
uint8_t lenECUSerialNumber = *(uint8_t *) (desc->len);
uint8_t *pointerECUSerialNumber = (uint8_t *) desc->addr;
memcpy(&env->canUDS_DataSendingBuf[3], &pointerECUSerialNumber[4],
lenECUSerialNumber - 4);
memcpy(&env->canUDS_DataSendingBuf[3 + lenECUSerialNumber - 4],
&pointerECUSerialNumber[0], 4);
}
}
*/
sizeResponse = desc->lenUds;
} else {
// uint8_t len = VariablesTable_ExGetVarTypeLength(desc);
if (desc->lenUds == 1) {
env->canUDS_DataSendingBuf[3] = *(uint8_t *) desc->addr;
if (dataIdentifier == UDS_vehicleFuelType) {
env->canUDS_DataSendingBuf[3] = reverseBits(env->canUDS_DataSendingBuf[3]);
}
}
if (desc->lenUds == 2) {
env->canUDS_DataSendingBuf[3] = *(uint8_t *) (desc->addr + 1);
env->canUDS_DataSendingBuf[4] = *(uint8_t *) desc->addr;
if ((dataIdentifier == UDS_AccelCalibrationX) ||
(dataIdentifier == UDS_AccelCalibrationY) ||
(dataIdentifier == UDS_AccelCalibrationZ)) {
env->canUDS_DataSendingBuf[3] = *(uint8_t *) (desc->addr);
env->canUDS_DataSendingBuf[4] = *(uint8_t *) (desc->addr + 1);
}
}
if (desc->lenUds == 4) {
env->canUDS_DataSendingBuf[3] = *(uint8_t *) (desc->addr + 3);
env->canUDS_DataSendingBuf[4] = *(uint8_t *) (desc->addr + 2);
env->canUDS_DataSendingBuf[5] = *(uint8_t *) (desc->addr + 1);
env->canUDS_DataSendingBuf[6] = *(uint8_t *) desc->addr;
}
sizeResponse = desc->lenUds;
}
isResponse = true;
}
if (dataIdentifier == UDS_InputStatesRecord) {
sizeResponse = sizeof(tInputStatesRecord_0001);
memcpy(&env->canUDS_DataSendingBuf[3], EXT_ENV_TELE.InputStatesRecord_0001, sizeResponse);
isResponse = true;
}
if (dataIdentifier == UDS_outputStatesRecord) {
sizeResponse = sizeof(tOutputStatesRecord_0002);
memcpy(&env->canUDS_DataSendingBuf[3], EXT_ENV_TELE.OutputStatesRecord_0002, sizeResponse);
isResponse = true;
}
if (dataIdentifier == UDS_SystemState) {
sizeResponse = sizeof(tSystemStateID_0006);
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// EXT_ENV_TELE.SystemStateID_0006->TCM_State = 0;
memcpy(&env->canUDS_DataSendingBuf[3], EXT_ENV_TELE.SystemStateID_0006, sizeResponse);
isResponse = true;
}
if (dataIdentifier == UDS_AccelerometerRawData) {
sizeResponse = 8;
//начало---------------------------------Рассчет для UDS сканера----------------------------------------------------
vector3 gravity = (vector3) {0.f, 0.f, 1.f};
vector3 currentValue = (vector3) {(float) egtsProcessing.x1 / 1000,
(float) egtsProcessing.y1 / 1000,
(float) egtsProcessing.z1 / 1000};
egtsProcessing.rawAccel.x = (int16_t) (currentValue.x * 1333);
egtsProcessing.rawAccel.y = (int16_t) (currentValue.y * 1333);
egtsProcessing.rawAccel.z = (int16_t) (currentValue.z * 1333);
float angleCos = vector3AngleCos(gravity, currentValue);
float angle = acosf(angleCos);
egtsProcessing.rawAccel.angle = (uint16_t) (180.0 / 3.141592 * angle);
//конец---------------------------------Рассчет для UDS сканера-----------------------------------------------------
memcpy(&env->canUDS_DataSendingBuf[3], env->rawAccel, sizeResponse);
isResponse = true;
}
if (dataIdentifier == UDS_ECALLManualCanCancel) {
sizeResponse = 1;
if (EXT_ENV_TELE.store.gost->ECALL_MANUAL_CAN_CANCEL) {
env->canUDS_DataSendingBuf[3] = 0xC7;
} else {
env->canUDS_DataSendingBuf[3] = 0x7C;
}
isResponse = true;
}
if (dataIdentifier == UDS_boardVoltage) {
sizeResponse = 1;
env->canUDS_DataSendingBuf[3] = *EXT_ENV_TELE.BoardVoltage;
isResponse = true;
}
if (dataIdentifier == UDS_reserveBatteryCharge) {
sizeResponse = 1;
env->canUDS_DataSendingBuf[3] = *EXT_ENV_TELE.ReserveBatteryCharge;
isResponse = true;
}
// if (dataIdentifier == UDS_reserveBatteryTemperature) {
// sizeResponse = 1;
// env->canUDS_DataSendingBuf[3] = *EXT_ENV_TELE.ReserveBatteryTemperature;
// isResponse = true;
// }
if (dataIdentifier == UDS_vehicleCoordinates) {
sizeResponse = 8;
uint8_t dataVehicleCoordinates[8];
dataVehicleCoordinates[0] = EXT_ENV_TELE.VehicleCoordinates->vehicleLatitude >> 24;
dataVehicleCoordinates[1] = EXT_ENV_TELE.VehicleCoordinates->vehicleLatitude >> 16;
dataVehicleCoordinates[2] = EXT_ENV_TELE.VehicleCoordinates->vehicleLatitude >> 8;
dataVehicleCoordinates[3] = EXT_ENV_TELE.VehicleCoordinates->vehicleLatitude;
dataVehicleCoordinates[4] = EXT_ENV_TELE.VehicleCoordinates->vehicleLongitude >> 24;
dataVehicleCoordinates[5] = EXT_ENV_TELE.VehicleCoordinates->vehicleLongitude >> 16;
dataVehicleCoordinates[6] = EXT_ENV_TELE.VehicleCoordinates->vehicleLongitude >> 8;
dataVehicleCoordinates[7] = EXT_ENV_TELE.VehicleCoordinates->vehicleLongitude;
memcpy(&env->canUDS_DataSendingBuf[3], dataVehicleCoordinates, sizeResponse);
isResponse = true;
}
if (dataIdentifier == UDS_vehicleCoordinatesReliability) {
sizeResponse = 1;
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//*EXT_ENV_TELE.VehicleCoordinatesReliability = 1;
env->canUDS_DataSendingBuf[3] = *EXT_ENV_TELE.VehicleCoordinatesReliability;
isResponse = true;
}
if (dataIdentifier == UDS_MDS_FormatVersion) {
sizeResponse = 1;
env->canUDS_DataSendingBuf[3] = *EXT_ENV_TELE.MDS_FormatVersion;
isResponse = true;
}
if (dataIdentifier == UDS_TCM_working_mode) {
sizeResponse = 1;
//env->canUDS_DataSendingBuf[3] = *EXT_ENV_TELE.TCM_working_mode;
sizeResponse = 1;
if (EXT_ENV_TELE.store.device->factoryMode) {
env->canUDS_DataSendingBuf[3] = 0xA5;
} else {
env->canUDS_DataSendingBuf[3] = 0x5A;
}
isResponse = true;
}
// if (dataIdentifier == UDS_TCM_activation_source) {
// sizeResponse = 1;
// env->canUDS_DataSendingBuf[3] = *EXT_ENV_TELE.TCM_activation_source;
// isResponse = true;
// }
if (dataIdentifier == UDS_TCM_time_calculation) {
sizeResponse = 1;
env->canUDS_DataSendingBuf[3] = *EXT_ENV_TELE.TCM_time_calculation;
isResponse = true;
}
// if (dataIdentifier == UDS_GLONASS_and_GLONASS_GPS_groups) {
// sizeResponse = 1;
// env->canUDS_DataSendingBuf[3] = *EXT_ENV_TELE.GLONASS_and_GLONASS_GPS_groups;
// isResponse = true;
// }
if (dataIdentifier == UDS_GsmRegistrationState) {
sizeResponse = 1;
env->canUDS_DataSendingBuf[3] = *EXT_ENV_TELE.GsmRegistrationState;
isResponse = true;
}
if (dataIdentifier == UDS_timeStamp) {
sizeResponse = 4;
uint8_t dataTimeStamp[4];
dataTimeStamp[0] = *EXT_ENV_TELE.TimeStamp >> 24;
dataTimeStamp[1] = *EXT_ENV_TELE.TimeStamp >> 16;
dataTimeStamp[2] = *EXT_ENV_TELE.TimeStamp >> 8;
dataTimeStamp[3] = *EXT_ENV_TELE.TimeStamp;
memcpy(&env->canUDS_DataSendingBuf[3], dataTimeStamp, sizeResponse);
isResponse = true;
}
if (dataIdentifier == UDS_GsmInnerError) {
sizeResponse = 1;
env->canUDS_DataSendingBuf[3] = *EXT_ENV_TELE.GsmInnerError;
isResponse = true;
}
if (dataIdentifier == UDS_VehicleCoordinatesReliabilityMem) {
sizeResponse = 1;
env->canUDS_DataSendingBuf[3] = *EXT_ENV_TELE.VehicleCoordinatesReliabilityMem;
isResponse = true;
}
if (dataIdentifier == UDS_GsmRegistartionStateMem) {
sizeResponse = 1;
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// *EXT_ENV_TELE.GsmRegistartionStateMem = 1;
env->canUDS_DataSendingBuf[3] = *EXT_ENV_TELE.GsmRegistartionStateMem;
isResponse = true;
}
if (dataIdentifier == UDS_GsmRegistrationError) {
sizeResponse = 1;
env->canUDS_DataSendingBuf[3] = *EXT_ENV_TELE.GsmRegistrationError;
isResponse = true;
}
if (dataIdentifier == UDS_EcallOn) {
sizeResponse = 1;
//env->canUDS_DataSendingBuf[3] = *EXT_ENV_TELE.EcallOn;
if (EXT_ENV_TELE.store.gost->CRASH_SIGNAL_INTERNAL) {
env->canUDS_DataSendingBuf[3] = 0x3B;
} else {
env->canUDS_DataSendingBuf[3] = 0xB3;
}
isResponse = true;
}
// if (dataIdentifier == UDS_CrashSignalExternal) {
// sizeResponse = 1;
// env->canUDS_DataSendingBuf[3] = *EXT_ENV_TELE.CrashSignalExternal;
// isResponse = true;
// }
// if (dataIdentifier == UDS_GnssPowerOffTime) {
// sizeResponse = 2;
//
// uint8_t dataGnssPoweOffTime[2];
// dataGnssPoweOffTime[0] = *EXT_ENV_TELE.GnssPowerOffTime >> 8;
// dataGnssPoweOffTime[1] = *EXT_ENV_TELE.GnssPowerOffTime;
//
// memcpy(&env->canUDS_DataSendingBuf[3], dataGnssPoweOffTime, sizeResponse);
// isResponse = true;
// }
// if (dataIdentifier == UDS_AutomaticActivationProhibition) {
// sizeResponse = 1;
// env->canUDS_DataSendingBuf[3] = *EXT_ENV_TELE.AutomaticActivationProhibition;
// isResponse = true;
// }
// if (dataIdentifier == UDS_NadRegistrationAtStartup) {
// sizeResponse = 1;
// env->canUDS_DataSendingBuf[3] = *EXT_ENV_TELE.NadRegistrationAtStartup;
// isResponse = true;
// }
if (dataIdentifier == UDS_GSMSoftwareVersionNumber) {
sizeResponse = 32;
memcpy(&env->canUDS_DataSendingBuf[3], EXT_ENV_TELE.GSMSoftwareVersionNumber, sizeResponse);
isResponse = true;
}
if (dataIdentifier == UDS_SmsFallbackTestNumber) {
sizeResponse = 20;
memcpy(&env->canUDS_DataSendingBuf[3], EXT_ENV_TELE.SmsFallbackTestNumber, sizeResponse);
isResponse = true;
}
if (dataIdentifier == UDS_SimProfileAmount) {
sizeResponse = 1;
env->canUDS_DataSendingBuf[3] = *EXT_ENV_TELE.SimProfileAmount;
isResponse = true;
}
// if (dataIdentifier == UDS_SimProfile) {
// sizeResponse = 1;
// env->canUDS_DataSendingBuf[3] = *EXT_ENV_TELE.SimProfile;
// isResponse = true;
// }
// if (dataIdentifier == UDS_AudioProfile) {
// sizeResponse = 1;
// env->canUDS_DataSendingBuf[3] = *EXT_ENV_TELE.AudioProfile;
// isResponse = true;
// }
if (dataIdentifier == UDS_EcallNoAutomaticTriggering) {
sizeResponse = 1;
env->canUDS_DataSendingBuf[3] = EXT_ENV_TELE.store.gost->ECALL_NO_AUTOMATIC_TRIGGERING;
//env->canUDS_DataSendingBuf[3] = *EXT_ENV_TELE.EcallNoAutomaticTriggering;
isResponse = true;
}
// if (dataIdentifier == UDS_MiddletState) {
// sizeResponse = 1;
// env->canUDS_DataSendingBuf[3] = *EXT_ENV_TELE.MiddletState;
// isResponse = true;
// }
// if (dataIdentifier == UDS_Vehicle_SW_Version) {
// sizeResponse = 3;
// memcpy(&env->canUDS_DataSendingBuf[3], EXT_ENV_TELE.Vehicle_SW_Version, sizeResponse);
// isResponse = true;
// }
// if (dataIdentifier == UDS_Midlet_SW_Version) {
// sizeResponse = 3;
// memcpy(&env->canUDS_DataSendingBuf[3], EXT_ENV_TELE.Midlet_SW_Version, sizeResponse);
// isResponse = true;
// }
// if (dataIdentifier == UDS_Boot_SW_Version) {
// sizeResponse = 27;
// memcpy(&env->canUDS_DataSendingBuf[3], EXT_ENV_TELE.Boot_SW_Version, sizeResponse);
// isResponse = true;
// }
// if (dataIdentifier == UDS_SertState) {
// sizeResponse = 1;
// env->canUDS_DataSendingBuf[3] = *EXT_ENV_TELE.SertState;
// isResponse = true;
// }
// if (dataIdentifier == UDS_ApplicationCheckSum) {
// sizeResponse = 2;
//
// uint8_t dataApplicationCheckSum[2];
// dataApplicationCheckSum[0] = *EXT_ENV_TELE.ApplicationCheckSum >> 8;
// dataApplicationCheckSum[1] = *EXT_ENV_TELE.ApplicationCheckSum;
//
// memcpy(&env->canUDS_DataSendingBuf[3], dataApplicationCheckSum, sizeResponse);
// isResponse = true;
// }
// if (dataIdentifier == UDS_Audio_HW_Settings) {
// sizeResponse = 1;
// env->canUDS_DataSendingBuf[3] = *EXT_ENV_TELE.Audio_HW_Settings;
// isResponse = true;
// }
// if (dataIdentifier == UDS_ECALL_EmergencyCallCounter) {
// sizeResponse = 3;
// memcpy(&env->canUDS_DataSendingBuf[3], EXT_ENV_TELE.ECALL_EmergencyCallCounter, sizeResponse);
// isResponse = true;
// }
// if (dataIdentifier == UDS_Avaialble_Networks_List) {
// sizeResponse = 128;
// memcpy(&env->canUDS_DataSendingBuf[3], EXT_ENV_TELE.Avaialble_Networks_List, sizeResponse);
// isResponse = true;
// }
// if (dataIdentifier == UDS_SavedMSDAmount) {
// sizeResponse = 1;
// env->canUDS_DataSendingBuf[3] = *EXT_ENV_TELE.SavedMSDAmount;
// isResponse = true;
// }
// if (dataIdentifier == UDS_SentMSDAmount) {
// sizeResponse = 1;
// env->canUDS_DataSendingBuf[3] = *EXT_ENV_TELE.SentMSDAmount;
// isResponse = true;
// }
// if (dataIdentifier == UDS_vehicleManufacturerSparePartNumber) {
// sizeResponse = 10;
// memcpy(&env->canUDS_DataSendingBuf[3], EXT_ENV_TELE.VehicleManufacturerSparePartNumber,
// sizeResponse);
// isResponse = true;
// }
// if (dataIdentifier == UDS_ConfigurationFileReferenceLink) {
// sizeResponse = 10;
// memcpy(&env->canUDS_DataSendingBuf[3], EXT_ENV_TELE.ConfigurationFileReferenceLink, sizeResponse);
// isResponse = true;
// }
// if (dataIdentifier == UDS_systemSupplierIdentifier) {
// sizeResponse = 3;
// memcpy(&env->canUDS_DataSendingBuf[3], EXT_ENV_TELE.SystemSupplierIdentifier, sizeResponse);
// isResponse = true;
// }
// if (dataIdentifier == UDS_ECUSerialNumber) {
// sizeResponse = 20;
// memcpy(&env->canUDS_DataSendingBuf[3], EXT_ENV_TELE.ECUSerialNumber, sizeResponse);
// isResponse = true;
// }
// if (dataIdentifier == UDS_vehicleManufacturerECUHardwareNumber) {
// sizeResponse = 10;
// memcpy(&env->canUDS_DataSendingBuf[3], EXT_ENV_TELE.VehicleManufacturerECUHardwareNumber,
// sizeResponse);
// isResponse = true;
// }
// if (dataIdentifier == UDS_systemSupplierECUSoftwareNumber) {
// sizeResponse = 2;
// memcpy(&env->canUDS_DataSendingBuf[3], EXT_ENV_TELE.SystemSupplierECUSoftwareNumber, sizeResponse);
// isResponse = true;
// }
// if (dataIdentifier == UDS_systemSupplierECUSoftwareVersionNumber) {
// sizeResponse = 2;
// memcpy(&env->canUDS_DataSendingBuf[3], EXT_ENV_TELE.SystemSupplierECUSoftwareVersionNumber,
// sizeResponse);
// isResponse = true;
// }
// if (dataIdentifier == UDS_VDIAG) {
// sizeResponse = 1;
// env->canUDS_DataSendingBuf[3] = *EXT_ENV_TELE.VDIAG;
// isResponse = true;
// }
if (dataIdentifier == UDS_TelematicsSoftwareVersion) {
sizeResponse = 32;
memcpy(&env->canUDS_DataSendingBuf[3], FIRMWARE_TELE_LOADER.main.metadata.name,
*FIRMWARE_TELE_LOADER.main.metadata.nameLength);
isResponse = true;
}
if (dataIdentifier == UDS_Asi15) {
sizeResponse = 4;
uint32_t dataAsi15 = (uint32_t) ((double) EXT_ENV_TELE.store.gost->ASI15_TRESHOLD * 1000);
env->canUDS_DataSendingBuf[6] = dataAsi15 & 0xFF;
env->canUDS_DataSendingBuf[5] = (dataAsi15 >> 8) & 0xFF;
env->canUDS_DataSendingBuf[4] = (dataAsi15 >> 16) & 0xFF;
env->canUDS_DataSendingBuf[3] = (dataAsi15 >> 24) & 0xFF;
isResponse = true;
}
if (dataIdentifier == UDS_LastEventDevice) {
sizeResponse = 1;
env->canUDS_DataSendingBuf[3] = *EXT_ENV_TELE.LastEventDevice;
isResponse = true;
}
if (dataIdentifier == UDS_ServerAddress) {
sizeResponse = 32;
memcpy(&env->canUDS_DataSendingBuf[3],
env->deviceTeledataStorageData->telematica.EGTS_SERVER_ADDRESS.data,
env->deviceTeledataStorageData->telematica.EGTS_SERVER_ADDRESS.length);
isResponse = true;
}
if (dataIdentifier == UDS_ServerSslEnable) {
sizeResponse = 1;
env->canUDS_DataSendingBuf[3] = env->deviceTeledataStorageData->telematica.EGTS_SERVER_SSL_ENABLE;
isResponse = true;
}
if (dataIdentifier == UDS_AltServerAddress) {
sizeResponse = 32;
memcpy(&env->canUDS_DataSendingBuf[3],
env->deviceTeledataStorageData->telematica.EGTS_ALT_SERVER_ADDRESS.data,
env->deviceTeledataStorageData->telematica.EGTS_ALT_SERVER_ADDRESS.length);
isResponse = true;
}
if (isResponse) {
env->canUDS_DataSendingBuf[0] = data.data[0] | 0b1000000;
env->canUDS_DataSendingBuf[1] = data.data[1];
env->canUDS_DataSendingBuf[2] = data.data[2];
} else {
env->canUDS_DataSendingBuf[0] = 0x7F;
env->canUDS_DataSendingBuf[1] = data.data[0];
env->canUDS_DataSendingBuf[2] = 0x12;
}
CanSerialPortFrameTpTransmit(&env->canSerialPortFrameTp, env->canUDS_DataSendingBuf,
sizeResponse + 3, TESTER_RESPONSE_GNSS, WAIT_FRAME_WRITE);
}
// конец --------------------------- Чтение ---------------------------------------------------------
// конец --------------------------- Чтение ---------------------------------------------------------
// конец --------------------------- Чтение ---------------------------------------------------------
// начало --------------------------- Запись ---------------------------------------------------------
// начало --------------------------- Запись ---------------------------------------------------------
// начало --------------------------- Запись ---------------------------------------------------------
if (data.data[0] == UDS_WriteDataByIdentifier) {
uint16_t dataIdentifier;
bool isResponse = false;
uint16_t sizeResponse = 0;
if ((env->invalidKey == false) ||
(memcmp(EXT_ENV_TELE.store.gost->VIN.data, "00000000000000000", 17) == 0)) {
dataIdentifier = (data.data[1] << 8) | data.data[2];
memset(env->canUDS_DataSendingBuf, 0, sizeof(env->canUDS_DataSendingBuf));
tVariableDescriptor *desc = VariablesTable_GetByIdUDS(EXT_ENV_TELE.store.publicVariablesTable,
dataIdentifier);
if (desc != NULL) {
if (VariablesTable_IsVariableChangeAllowed(desc)) {
if (desc->typeId == VARIABLE_TYPE_STRING) {
uint8_t lenStr = desc->lenUds;
if ((data.len - 3) < desc->lenUds) {
lenStr = 0;
for (uint16_t i = 3; i < data.len; ++i) {
if (data.data[i] == 0) {
break;
} else {
++lenStr;
}
}
}
memcpy(desc->addr, &data.data[3], lenStr);
*(uint8_t *) (desc->addr - 1) = lenStr;
} else {
// uint8_t len = VariablesTable_ExGetVarTypeLength(desc);
if (desc->lenUds == 1) {
*(uint8_t *) desc->addr = data.data[3];
if (dataIdentifier == UDS_vehicleFuelType) {
uint8_t pere = data.data[3];
pere = reverseBits(pere);
*(uint8_t *) desc->addr = (pere);
}
}
if (desc->lenUds == 2) {
*(uint8_t *) desc->addr = data.data[4]; // Младшая 4 - младшая
*(uint8_t *) (desc->addr + 1) = data.data[3]; // Старшая 3 - старшая
if ((dataIdentifier == UDS_AccelCalibrationX) ||
(dataIdentifier == UDS_AccelCalibrationY) ||
(dataIdentifier == UDS_AccelCalibrationZ)) {
// *(uint8_t *) (desc->addr + 1) = data.data[4]; //
// *(uint8_t *) desc->addr = data.data[3];
}
}
if (desc->lenUds == 4) {
*(uint8_t *) desc->addr = data.data[6];
*(uint8_t *) (desc->addr + 1) = data.data[5];
*(uint8_t *) (desc->addr + 2) = data.data[4];
*(uint8_t *) (desc->addr + 3) = data.data[3];
}
}
isResponse = true;
EXT_ENV_TELE.store.publicVariablesTable->changes = 1;
}
} else {
if (dataIdentifier == UDS_ECALLManualCanCancel) {
if (data.data[3] == 0xC7) {
EXT_ENV_TELE.store.gost->ECALL_MANUAL_CAN_CANCEL = true;
isResponse = true;
EXT_ENV_TELE.store.publicVariablesTable->changes = 1;
}
if (data.data[3] == 0x7C) {
EXT_ENV_TELE.store.gost->ECALL_MANUAL_CAN_CANCEL = false;
isResponse = true;
EXT_ENV_TELE.store.publicVariablesTable->changes = 1;
}
}
if (dataIdentifier == UDS_EcallOn) {
if (data.data[3] == 0x3B) {
EXT_ENV_TELE.store.gost->CRASH_SIGNAL_INTERNAL = true;
isResponse = true;
EXT_ENV_TELE.store.publicVariablesTable->changes = 1;
}
if (data.data[3] == 0xB3) {
EXT_ENV_TELE.store.gost->CRASH_SIGNAL_INTERNAL = false;
isResponse = true;
EXT_ENV_TELE.store.publicVariablesTable->changes = 1;
}
}
if (dataIdentifier == UDS_TCM_working_mode) {
if (data.data[3] == 0x5A) {
EXT_ENV_TELE.store.device->factoryMode = false;
isResponse = true;
EXT_ENV_TELE.store.publicVariablesTable->changes = 1;
}
if (data.data[3] == 0xA5) {
EXT_ENV_TELE.store.device->factoryMode = true;
isResponse = true;
EXT_ENV_TELE.store.publicVariablesTable->changes = 1;
}
}
if (dataIdentifier == UDS_VehicleCoordinatesReliabilityMem) {
isResponse = true;
EXT_ENV_TELE.store.publicVariablesTable->changes = 1;
}
if (dataIdentifier == UDS_GsmRegistartionStateMem) {
*EXT_ENV_TELE.GsmRegistartionStateMem = 0;
isResponse = true;
EXT_ENV_TELE.store.publicVariablesTable->changes = 1;
}
if (dataIdentifier == UDS_Asi15) {
uint32_t dataAsi15;
dataAsi15 = (uint32_t) data.data[6];
dataAsi15 |= (uint32_t) ((uint32_t) data.data[5] << 8);
dataAsi15 |= (uint32_t) ((uint32_t) data.data[4] << 16);
dataAsi15 |= (uint32_t) ((uint32_t) data.data[3] << 24);
EXT_ENV_TELE.store.gost->ASI15_TRESHOLD = (float) ((double) dataAsi15 / 1000);
isResponse = true;
EXT_ENV_TELE.store.publicVariablesTable->changes = 1;
}
if (dataIdentifier == UDS_SetDeviceFactoryMode) {
EXT_ENV_TELE.SetDeviceFactoryMode(EXT_ENV_TELE.SetDeviceFactoryMode_env);
isResponse = true;
EXT_ENV_TELE.store.publicVariablesTable->changes = 1;
}
if (EXT_ENV_TELE.Function_Can_UDS != NULL) {
if (dataIdentifier == UDS_TASK_INDICATION_START_STOP_CAN_UDS) {
uint8_t dataFunctionCanUds = (data.data[3] == 0) ? TASK_INDICATION_STOP_CAN_UDS
: TASK_INDICATION_START_CAN_UDS;
EXT_ENV_TELE.Function_Can_UDS(EXT_ENV_TELE.Function_Can_UDS_env,
TASK_INDICATION_STOP_START_CAN_UDS,
&dataFunctionCanUds
);
isResponse = true;
}
if (dataIdentifier == UDS_GPIO_ECALL_OUT_CAN_UDS) {
uint8_t dataFunctionCanUds = (data.data[3] == 0) ? GPIO_FALSE_ECALL_OUT_CAN_UDS
: GPIO_TRUE_ECALL_OUT_CAN_UDS;
EXT_ENV_TELE.Function_Can_UDS(EXT_ENV_TELE.Function_Can_UDS_env,
GPIO_WRITE_CAN_UDS,
&dataFunctionCanUds
);
isResponse = true;
}
if (dataIdentifier == UDS_GPIO_GARAGE_CAN_UDS) {
uint8_t dataFunctionCanUds = (data.data[3] == 0) ? GPIO_FALSE_GARAGE_CAN_UDS
: GPIO_TRUE_GARAGE_CAN_UDS;
EXT_ENV_TELE.Function_Can_UDS(EXT_ENV_TELE.Function_Can_UDS_env,
GPIO_WRITE_CAN_UDS,
&dataFunctionCanUds
);
isResponse = true;
}
if (dataIdentifier == UDS_GPIO_MUTE_P_CAN_UDS) {
uint8_t dataFunctionCanUds = (data.data[3] == 0) ? GPIO_FALSE_MUTE_P_CAN_UDS
: GPIO_TRUE_MUTE_P_CAN_UDS;
EXT_ENV_TELE.Function_Can_UDS(EXT_ENV_TELE.Function_Can_UDS_env,
GPIO_WRITE_CAN_UDS,
&dataFunctionCanUds
);
isResponse = true;
}
if (dataIdentifier == UDS_GPIO_MUTE_N_CAN_UDS) {
uint8_t dataFunctionCanUds = (data.data[3] == 0) ? GPIO_FALSE_MUTE_N_CAN_UDS
: GPIO_TRUE_MUTE_N_CAN_UDS;
EXT_ENV_TELE.Function_Can_UDS(EXT_ENV_TELE.Function_Can_UDS_env,
GPIO_WRITE_CAN_UDS,
&dataFunctionCanUds
);
isResponse = true;
}
if (dataIdentifier == UDS_GPIO_LED_RED_CAN_UDS) {
uint8_t dataFunctionCanUds = (data.data[3] == 0) ? GPIO_FALSE_LED_RED_CAN_UDS
: GPIO_TRUE_LED_RED_CAN_UDS;
EXT_ENV_TELE.Function_Can_UDS(EXT_ENV_TELE.Function_Can_UDS_env,
GPIO_WRITE_CAN_UDS,
&dataFunctionCanUds
);
isResponse = true;
}
if (dataIdentifier == UDS_GPIO_LED_GREEN_CAN_UDS) {
uint8_t dataFunctionCanUds = (data.data[3] == 0) ? GPIO_FALSE_LED_GREEN_CAN_UDS
: GPIO_TRUE_LED_GREEN_CAN_UDS;
EXT_ENV_TELE.Function_Can_UDS(EXT_ENV_TELE.Function_Can_UDS_env,
GPIO_WRITE_CAN_UDS,
&dataFunctionCanUds
);
isResponse = true;
}
if (dataIdentifier == UDS_AUDIO_PLAY_TEST_CAN_UDS) {
uint8_t dataFunctionCanUds = data.data[3];
EXT_ENV_TELE.Function_Can_UDS(EXT_ENV_TELE.Function_Can_UDS_env,
AUDIO_TEST_PLAY_CAN_UDS,
&dataFunctionCanUds
);
isResponse = true;
}
}
}
if (dataIdentifier == UDS_EcallNoAutomaticTriggering) {
EXT_ENV_TELE.store.gost->ECALL_NO_AUTOMATIC_TRIGGERING = env->canUDS_DataSendingBuf[3];
isResponse = true;
EXT_ENV_TELE.store.publicVariablesTable->changes = 1;
}
}
if (isResponse) {
// EraGlonassUveosDumper_ForceDump(EXT_ENV_TELE.store.uveosDumper);
// EXT_ENV_TELE.store.publicVariablesTable->changes = 1;
env->canUDS_DataSendingBuf[0] = data.data[0] | 0b1000000;
env->canUDS_DataSendingBuf[1] = data.data[1];
env->canUDS_DataSendingBuf[2] = data.data[2];
} else {
env->canUDS_DataSendingBuf[0] = 0x7F;
env->canUDS_DataSendingBuf[1] = data.data[0];
env->canUDS_DataSendingBuf[2] = 0x12;
if (env->invalidKey) {
env->canUDS_DataSendingBuf[2] = 0x33;
}
}
CanSerialPortFrameTpTransmit(&env->canSerialPortFrameTp, env->canUDS_DataSendingBuf,
sizeResponse + 3, TESTER_RESPONSE_GNSS, WAIT_FRAME_WRITE);
}
// конец --------------------------- Запись ---------------------------------------------------------
// конец --------------------------- Запись ---------------------------------------------------------
// конец --------------------------- Запись ---------------------------------------------------------
}
}
}
void CanMain_Start(tCanMain *env) {
CanSerialPortFrameTp_Start(&env->canSerialPortFrameTp, 0);
ThreadBlock_Start(env->T_can_Main, env, CanMainTask);
}