commit dee734d1da591dacf3ee6c94fa6922b5258813bd Author: cfif Date: Tue Jan 20 17:40:50 2026 +0300 Обновление diff --git a/CanUds.c b/CanUds.c new file mode 100644 index 0000000..bdebb5b --- /dev/null +++ b/CanUds.c @@ -0,0 +1,470 @@ +// +// Created by cfif on 20.01.2026. +// +#include "CanUds.h" +#include "CanPorts.h" +#include "StatusData.h" +#include "memory.h" +#include "TesterPresent_3e.h" +#include "DiagnosticSessionControl_10.h" + + +#define LOG_SIGN "CAN_UDS" +#define LOGGER env->logger + +bool ReceivedCan_func(void *arg, can_rx_message_type *canFrame) { + tCanUds *env = arg; + + + return false; +} + +void ReceivedTP_func(void *arg, tCanTP_data *data) { + tCanUds *env = arg; + + 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), PROTOCOL_CAN_ADR_UDS, WAIT_FRAME_WRITE); + + return; + } + + osStatus_t status = osMessageQueuePut(env->queue, data, 0, 0U); + + if (status != osOK) { + LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка добавления в очередь addCommandQueue") + } + +} + +// начало ----------------------------- Сессия ------------------------------------------------------------- +// начало ----------------------------- Сессия ------------------------------------------------------------- +// начало ----------------------------- Сессия ------------------------------------------------------------- +static uint8_t DiagnosticSessionControl_10(tCanUds *env) { + + tDiagnosticSessionsType *diagnosticSessionsType = (tDiagnosticSessionsType *) env->dataResponse; + diagnosticSessionsType->ServiceId = env->data.data[0] | 0b1000000; + diagnosticSessionsType->diagnosticSessionType = env->data.data[1] & 0b1111111; + + diagnosticSessionsType->sessionParameterRecord[0] = 0; + diagnosticSessionsType->sessionParameterRecord[1] = 0x32; + diagnosticSessionsType->sessionParameterRecord[2] = 0x01; + diagnosticSessionsType->sessionParameterRecord[3] = 0xF4; + + return sizeof(tDiagnosticSessionsType); +} +// конец ----------------------------- Сессия -------------------------------------------------------------- +// конец ----------------------------- Сессия -------------------------------------------------------------- +// конец ----------------------------- Сессия -------------------------------------------------------------- + + +// начало --------------------------- Чтение --------------------------------------------------------- +// начало --------------------------- Чтение --------------------------------------------------------- +// начало --------------------------- Чтение --------------------------------------------------------- +static uint8_t ReadDataByIdentifier_22(tCanUds *env) { + + uint8_t dataIdentifier_hi = env->data.data[1]; + uint8_t dataIdentifier_lo = env->data.data[2]; + uint16_t dataIdentifier = (dataIdentifier_hi << 8) | dataIdentifier_lo; + + if (dataIdentifier_hi == 0xCF) { + + if (uds_ReadDataByIdentifier_22_com[dataIdentifier_lo].data != NULL) { + uint8_t response_size = uds_ReadDataByIdentifier_22_com[dataIdentifier_lo].size; + + env->dataResponse[0] = env->data.data[0] | 0b1000000; + env->dataResponse[1] = dataIdentifier_hi; + env->dataResponse[2] = dataIdentifier_lo; + memcpy(&env->dataResponse[3], uds_ReadDataByIdentifier_22_com[dataIdentifier_lo].data, response_size); + + return response_size; + } + + if (dataIdentifier_lo == 0xFF) { + env->dataResponse[0] = env->data.data[0] | 0b1000000; + env->dataResponse[1] = dataIdentifier_hi; + env->dataResponse[2] = dataIdentifier_lo; + memcpy(&env->dataResponse[3], uds_ReadDataByIdentifier_22_com[dataIdentifier_lo].data, response_size); + } + + } + +} +// конец --------------------------- Чтение --------------------------------------------------------- +// конец --------------------------- Чтение --------------------------------------------------------- +// конец --------------------------- Чтение --------------------------------------------------------- + +// начало --------------------------- Запись --------------------------------------------------------- +// начало --------------------------- Запись --------------------------------------------------------- +// начало --------------------------- Запись --------------------------------------------------------- + +static uint8_t WriteDataByIdentifier_2E(tCanUds *env) { + + +} +// конец --------------------------- Запись --------------------------------------------------------- +// конец --------------------------- Запись --------------------------------------------------------- +// конец --------------------------- Запись --------------------------------------------------------- + +const eUds_com uds_com[256] = { + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {DiagnosticSessionControl_10, "DiagnosticSessionControl_10"}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {ReadDataByIdentifier_22, "ReadDataByIdentifier_22"}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {WriteDataByIdentifier_2E, "WriteDataByIdentifier_2E"}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""} +}; + + +void CanUds(tCanUds *env) { + + for (;;) { + osStatus_t status = osMessageQueueGet(env->queue, &env->data, 0, 1000); + + if (status == osOK) { + + uint8_t com = env->data.data[0]; + + if (uds_com[com].func != NULL) { + + uint8_t response_size = uds_com[com].func(env); + + if (response_size) { + + CanSerialPortFrameTpTransmit(&env->canSerialPortFrameTp, env->dataResponse, + response_size, PROTOCOL_CAN_ADR_UDS, WAIT_FRAME_WRITE); + } + + } else { + asm("nop"); + } + + + } + + + } + +} + + +void CanSerialPortCanUds_Start(tCanUds *env) { + ThreadBlock_Start(env->T_can_Uds, env, CanUds); + CanSerialPortFrameTp_Start(&env->canSerialPortFrameTp); +} + +void CanUds_Init( + tCanUds *env, + tSerialPortFrameIO *CanIO, + tLoggerInterface *logger) { + + env->logger = logger; + env->CanIO = CanIO; + env->filterIdCount = 0; + + env->queue = osMessageQueueNew(CAN_US_QUEUE_SIZE, sizeof(tCanTP_data), NULL); + + env->filterReqId[0] = 0; + env->filterReqId[1] = 0; + env->filterReqId[2] = 0; + env->filterReqId[3] = 0; + env->filterReqId[4] = 0; + env->filterReqId[5] = 0; + env->filterReqId[6] = 0; + + env->filterRespId[0] = 0; + env->filterRespId[1] = 0; + env->filterRespId[2] = 0; + env->filterRespId[3] = 0; + env->filterRespId[4] = 0; + env->filterRespId[5] = 0; + env->filterRespId[6] = 0; + + + 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, + + ReceivedCan_func, + env, + + ReceivedTP_func, + env, + + env->CanIO, + (tCanTP_data *) &env->canTP_Ext_data, + sizeof(env->canTP_Ext_data.data), + env->logger, + + env->filterIdCount, + env->filterReqId, + env->filterRespId, + env->filterDirReq + + ); + + InitThreadBlock(env->T_can_Uds, "CanUds", osPriorityNormal); +}; \ No newline at end of file diff --git a/CanUds.h b/CanUds.h new file mode 100644 index 0000000..e379b1a --- /dev/null +++ b/CanUds.h @@ -0,0 +1,58 @@ +// +// Created by cfif on 20.01.2026. +// + +#ifndef HVAC_M7_CANUDS_H +#define HVAC_M7_CANUDS_H + +#include "CanSerialPortFrameTP.h" + +#define CAN_US_QUEUE_SIZE 3 + +typedef enum { + UDS_DiagnosticSessionControl = 0x10, + UDS_ReadDTCInformation = 0x19, + UDS_ClearDiagnosticInformation = 0x14, + UDS_TesterPresent = 0x3E, + UDS_ReadDataByIdentifier = 0x22, + UDS_WriteDataByIdentifier = 0x2E, + UDS_RoutineControl = 0x31, + UDS_ECUResetService = 0x11, + UDS_SecurityAccess = 0x27 +} eUdsServices; + +typedef struct { + tCanSerialPortFrameTp canSerialPortFrameTp; + tLoggerInterface *logger; + tSerialPortFrameIO *CanIO; + + tCanTP_Ext_data canTP_Ext_data; + + osMessageQueueId_t queue; + + tCanTP_data data; + uint8_t dataResponse[256]; + + uint8_t filterIdCount; + uint32_t filterReqId[16]; + uint32_t filterRespId[16]; + uint8_t filterDirReq[16]; + + tStaticThreadBlock(512) T_can_Uds; +} tCanUds; + +typedef uint8_t (*uds_func_ptr)(tCanUds *env); + +typedef struct { + uds_func_ptr func; + char *desc; +} eUds_com; + +void CanUds_Init( + tCanUds *env, + tSerialPortFrameIO *CanIO, + tLoggerInterface *logger); + +void CanSerialPortCanUds_Start(tCanUds *env); + +#endif //HVAC_M7_CANUDS_H diff --git a/DiagnosticSessionControl_10.h b/DiagnosticSessionControl_10.h new file mode 100644 index 0000000..c1cd637 --- /dev/null +++ b/DiagnosticSessionControl_10.h @@ -0,0 +1,25 @@ +// +// Created by cfif on 06.08.2024. +// + +#ifndef SMART_COMPONENTS_UPDATE_DIAGNOSTICSESSIONCONTROL_10_H +#define SMART_COMPONENTS_UPDATE_DIAGNOSTICSESSIONCONTROL_10_H + +#include "stdint.h" + +// Для готовности загрузки модема +typedef struct __attribute__ ((packed)) { + uint8_t ServiceId; + uint8_t diagnosticSessionType; + uint8_t sessionParameterRecord[4]; + +} tDiagnosticSessionsType; + + +// Для запроса сессии +typedef struct __attribute__ ((packed)) { + uint8_t ServiceId; + uint8_t diagnosticSessionType; +} tDiagnosticSessionControlRequest; + +#endif //SMART_COMPONENTS_UPDATE_DIAGNOSTICSESSIONCONTROL_10_H diff --git a/TesterPresent_3e.h b/TesterPresent_3e.h new file mode 100644 index 0000000..d800f32 --- /dev/null +++ b/TesterPresent_3e.h @@ -0,0 +1,17 @@ +// +// Created by cfif on 06.08.2024. +// + +#ifndef SMART_COMPONENTS_UPDATE_TESTERPRESENT_3E_H +#define SMART_COMPONENTS_UPDATE_TESTERPRESENT_3E_H + +#include "stdint.h" + +// Для готовности загрузки модема +typedef struct __attribute__ ((packed)) { + uint8_t ServiceId; + uint8_t zeroSubFunction; + +} tTesterPresent; + +#endif //SMART_COMPONENTS_UPDATE_TESTERPRESENT_3E_H diff --git a/modular.json b/modular.json new file mode 100644 index 0000000..0dd1901 --- /dev/null +++ b/modular.json @@ -0,0 +1,10 @@ +{ + "cmake": { + "inc_dirs": [ + "./" + ], + "srcs": [ + "./**.c" + ] + } +} \ No newline at end of file