HVAC_M7_CAN_UDS/CanUds.h

330 lines
9.8 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 20.01.2026.
//
#ifndef HVAC_M7_CANUDS_H
#define HVAC_M7_CANUDS_H
#include "CanSerialPortFrameTP.h"
#include "DeviceStorage.h"
#include "DiagnosticTask.h"
#include "CanSpamTransmitter.h"
#include "CanSpamDebugTransmitter.h"
#include "AdcTasks.h"
#include "StatusData.h"
#define LOG_UDS 0
//#define CAN_US_QUEUE_SIZE 1
#define MAX_ATTEMPTS_DEFAULT 3
#define BLOCK_TIME_DEFAULT 60000
#define timeout_session_S3_Server 7000
#define ADR_HEX_BlockBoot 0x01000000
#define ADR_HEX_BlockMain 0x01010000
#define ADR_HEX_BlockCalib 0x010C0000
#define ADR_HEX_Mapped_BlockBoot 0x01100000
#define ADR_HEX_Mapped_BlockMain 0x01110000
#define ADR_HEX_Mapped_BlockCalib 0x011C0000
#define SIZE_HEX_BlockBoot (64 * 1024)
#define SIZE_HEX_BlockMain (704 * 1024)
#define SIZE_HEX_BlockCalib (256 * 1024)
#define LEN_DEBUG_UDS_BUFF 128
typedef enum {
UDS_Firmware_Step_None = 0,
UDS_Firmware_Step_Preconditions = 1,
UDS_Firmware_Step_EraseMemory = 2,
UDS_Firmware_Step_Dependancies = 3
} eUdsFirmwareSteps;
// Время (логарифмическая шкала)
// │
// ├── StMin (0.1-127 мс) ← Между КАДРАМИ
// │ │
// ├── N_As, N_Bs (до 1000 мс) ← Транспортные таймауты
// │ │
// ├── P2Server (до 50 мс) ← Между СООБЩЕНИЯМИ (UDS)
// │ │
// ├── P2*Server (до 5000 мс) ← Ожидание при ResponsePending
// │ │
// └── S3_Server (до 5000 мс) ← ТАЙМЕР ВСЕЙ СЕССИИ
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_InputOutputControlByIdentifier = 0x2F,
UDS_SecurityAccess = 0x27,
UDS_Communication_Control = 0x28,
UDS_ControlDTCSetting = 0x85,
UDS_RequestDownload = 0x34,
UDS_TransferData = 0x36,
UDS_RequestTransferExit = 0x37
} eUdsServices;
typedef enum {
UDS_error_incorrectMessageLengthOrInvalidFormat = 0x13,
UDS_error_responseTooLong = 0x14,
UDS_error_requestOutOfRange = 0x31,
UDS_error_securityAccessDenied = 0x33,
UDS_error_invalidKey = 0x35,
UDS_error_sub_functionNotSupported = 0x12,
UDS_error_conditionsNotCorrect = 0x22,
UDS_error_requestSequenceError = 0x24,
UDS_error_exceededNumberOfAttempts = 0x36,
UDS_error_requiredTimeDelayNotExpired = 0x37,
UDS_error_generalProgrammingFailure = 0x72,
UDS_error_requestCorrectlyReceived_ResponsePending = 0x78
} eUdsResponseError;
typedef enum {
UDS_session_defaultSession = 0x1,
UDS_session_programmingSession = 0x2,
UDS_session_extendedDiagnosticSession = 0x3
} eUdsSession;
typedef enum {
UDS_io_returnControlToECU = 0x0,
UDS_io_shortTermAdjustment = 0x3
} eUdsIO;
typedef enum {
UDS_dtc_reportNumberOfDTCByStatusMask = 0x01,
UDS_dtc_reportDTCByStatusMask = 0x02,
UDS_dtc_reportDTCBySupport = 0x0A
} eUdsDtc;
typedef enum {
UDS_reset_hardReset = 0x1,
UDS_reset_softReset = 0x3,
UDS_reset_rapidReset = 0x4
} eUdsReset;
typedef enum {
UDS_sub_enableRxAndTx = 0x0,
UDS_sub_enableRxAndDisableTx = 0x1
} eUdsCommunicationControl;
typedef enum {
UDS_sub_dtc_on = 0x1,
UDS_sub_dtc_off = 0x2
} eUdsControlDTCSetting;
typedef enum {
UDS_sub_requestSeed = 0x1,
UDS_sub_sendKey = 0x2
} eUdsSecurityAccess;
typedef enum {
UDS_routine_StartRoutine = 1,
UDS_routine_StopRoutine = 2,
UDS_routine_RequestRoutineResults = 3
} eUdsRoutineControlType;
typedef enum {
Check_Programming_Preconditions = 0x0203,
UDS_routine_VIN_learn = 0x1300,
UDS_routine_Compare_Checksum = 0x0202,
UDS_routine_Erase_Memory = 0xFF00,
UDS_routine_Check_Programming_Dependancies = 0xFF01,
UDS_routine_eComp_Initialize = 0xCF01
} eUdsRoutineModes;
typedef enum {
UDS_routine_RoutineStartStopSuccess = 0x00,
UDS_routine_RoutineStartStopFailure = 0x01
} eUdsRoutineStartStopRoutineResult;
typedef enum {
UDS_routine_RoutineStop = 0,
UDS_routine_RoutineRun = 1,
UDS_routine_RoutineFinishError = 2,
UDS_routine_RoutineFinishSuccess = 3
} eUdsRequestRoutineResult;
typedef enum {
// UDS_BlockBoot = 0,
UDS_BlockMain = 1,
UDS_BlockCalib = 2,
UDS_BlockInit = 0xff
} eUdsBlock;
typedef struct {
eUdsServices service;
uint8_t sub_function;
uint8_t *data;
} tUdsServiceCommand;
typedef bool (uds_clear_flash_func)(uint32_t firstPageAddr, uint32_t totalSize, void *wdTriggerFct,
void *wdTriggerFct_env);
typedef bool (uds_write_flash_func)(uint32_t beginPageAddr, void *sourceRamAddr, uint32_t size);
typedef struct {
tCanSerialPortFrameTp canSerialPortFrameTp;
tLoggerInterface *logger;
tSerialPortFrameIO *CanIO;
tDeviceStorage *deviceStorage;
tDiagnostic *Diagnostic;
tCanTP_data canTP_Ext_data;
osMutexId_t access;
tAdc0Task *adcTask0;
tCanTP_data *data;
uint8_t dataResponse[1024];
uint8_t dataResponsePending[4];
uint8_t filterIdCount;
uint32_t filterReqId[16];
uint32_t filterRespId[16];
uint8_t filterDirReq[16];
char hexString[LEN_DEBUG_UDS_BUFF];
eUdsSession currentSession;
uint32_t currentSessionTesterPresentTimeout;
tCanSpamTransmitter *canSpamTransmitter;
// tCanSpamSlowTransmitter *canSpamSlowTransmitter;
tCanSpamDebugTransmitter *canSpamDebugTransmitter;
uint32_t randomSecuritySeed;
struct {
bool requestSequenceRequestSeed;
bool stateSecurityAccess;
uint32_t counter_max_attempts_default;
uint32_t time_counter_max_attempts_default;
} SA;
uds_clear_flash_func *clear_flash_func;
uds_write_flash_func *write_flash_func;
uint32_t AdrFlash;
uint32_t SizeWriteFlash;
uint8_t blockSequenceCounter;
uint32_t DownloadFirmwareSize;
eUdsBlock udsBlock;
eUdsFirmwareSteps udsFirmwareStepsMain;
eUdsFirmwareSteps udsFirmwareStepsCalib;
uint32_t CurrentBlockAdr;
uint32_t CurrentBlockSize;
bool isEcuReset;
uint32_t timeoutPendingClear;
eUdsServices stateDownload;
tStatus_Sensor_For_Model Status_Sensor_For_Model_input;
tStatus_Actuator_For_Model Status_Actuator_DoorsActuator_For_Model_input;
tStatus_Duct_Tgt_For_Model Status_Duct_Tgt_For_Model_input;
tStatus_Eva_Tgt_For_Model Status_Eva_Tgt_For_Model_input;
tStatus_IO_For_Model Status_IO_For_Model_input;
tStatus_Pwm_For_Model Status_Pwm_For_Model_input;
tStatus_eComp_For_Model Status_eComp_For_Model_input;
tStatus_External_For_Model Status_External_For_Model_input;
tStatus_EMS_For_Model Status_EMS_For_Model_input;
tStatus_Ionizer_Aroma_For_Model Status_Ionizer_Aroma_For_Model_input;
tStatus_Duct_Select_For_Model Status_Duct_Select_For_Model_input;
osMessageQueueId_t queue_input_get_Status_Sensor;
osMessageQueueId_t queue_input_get_Status_Actuator_DoorsActuator;
osMessageQueueId_t queue_input_get_Status_Duct_Tgt;
osMessageQueueId_t queue_input_get_Status_Eva_Tgt;
osMessageQueueId_t queue_input_get_Status_IO;
osMessageQueueId_t queue_input_get_Status_Pwm;
osMessageQueueId_t queue_input_get_Status_eComp;
osMessageQueueId_t queue_input_get_Status_External;
osMessageQueueId_t queue_input_get_Status_EMS;
osMessageQueueId_t queue_input_get_Status_Ionizer_Aroma;
osMessageQueueId_t queue_input_get_Status_Duct_Select;
tStatus_Set_For_Model Status_Set_For_Model_output;
tStatus_Actuator_For_Model Status_Actuator_DoorsActuator_For_Model_output;
tStatus_Duct_Tgt_For_Model Status_Duct_Tgt_For_Model_output;
tStatus_Eva_Tgt_For_Model Status_Eva_Tgt_For_Model_output;
tStatus_IO_For_Model Status_IO_For_Model_output;
tStatus_Pwm_For_Model Status_Pwm_For_Model_output;
tStatus_eComp_For_Model Status_eComp_For_Model_output;
tStatus_External_For_Model Status_External_For_Model_output;
tStatus_EMS_For_Model Status_EMS_For_Model_output;
tStatus_Ionizer_Aroma_For_Model Status_Ionizer_Aroma_For_Model_output;
tStatus_Duct_Select_For_Model Status_Duct_Select_For_Model_output;
osMessageQueueId_t queue_output_set_Status_Set;
osMessageQueueId_t queue_output_set_Status_Actuator_DoorsActuator;
osMessageQueueId_t queue_output_set_Status_Duct_Tgt;
osMessageQueueId_t queue_output_set_Status_Eva_Tgt;
osMessageQueueId_t queue_output_set_Status_IO;
osMessageQueueId_t queue_output_set_Status_Pwm;
osMessageQueueId_t queue_output_set_Status_eComp;
osMessageQueueId_t queue_output_set_Status_External;
osMessageQueueId_t queue_output_set_Status_EMS;
osMessageQueueId_t queue_output_set_Status_Ionizer_Aroma;
osMessageQueueId_t queue_output_set_Status_Duct_Select;
struct {
osThreadId_t id;
uint32_t stack[384];
StaticTask_t controlBlock;
osThreadAttr_t attr;
} thread_Uds;
// tStaticThreadBlock(384) T_can_Uds;
} tCanUds;
typedef uint16_t (*uds_func_ptr)(tCanUds *env);
typedef struct {
uds_func_ptr func;
char *desc;
bool hasSPRMIB;
} eUds_com;
void CanUds_Init(
tCanUds *env,
tDiagnostic *Diagnostic,
tSerialPortFrameIO *CanIO,
tDeviceStorage *deviceStorage,
tCanSpamTransmitter *canSpamTransmitter,
tCanSpamDebugTransmitter *canSpamDebugTransmitter,
tAdc0Task *adcTask0,
uds_clear_flash_func *clear_flash_func,
uds_write_flash_func *write_flash_func,
tLoggerInterface *logger);
void CanSerialPortCanUds_Start(tCanUds *env);
// Тут данные должны быть с модели &env->Status_Sensor_For_Model_input и т.д.
void CanUdsInput_Set_Model(tCanUds *env);
// Это на вход модели
void CanUdsOutput_Get_Model(tCanUds *env);
#endif //HVAC_M7_CANUDS_H