Добавлены таймауты CAN

This commit is contained in:
cfif 2026-08-27 17:51:36 +03:00
parent 4da836da77
commit b6c7dd4821
5 changed files with 75 additions and 40 deletions

View File

@ -55,16 +55,6 @@ static const CAN_MonitorEntry_t g_can_monitors[] = {
#define CAN_MONITOR_COUNT (sizeof(g_can_monitors) / sizeof(g_can_monitors[0]))
// Функция поиска монитора по CAN ID
static FrameMonitor_t* FindMonitorByCanId(uint32_t can_id) {
for (uint32_t i = 0; i < CAN_MONITOR_COUNT; i++) {
if (g_can_monitors[i].can_id == can_id) {
return g_can_monitors[i].monitor;
}
}
return NULL; // Не найден
}
void CanSpamReceiver_Init(tCanSpamReceiver *env,
tSerialPortFrameIO *ioCanFrame,
tLoggerInterface *logger) {
@ -79,10 +69,8 @@ void CanSpamReceiver_Init(tCanSpamReceiver *env,
}
// VIN
FrameMonitor_t *vin_mon = FindMonitorByCanId(VEH_VIN_CANID);
if (vin_mon != NULL) {
vin_mon->timeout_cycle = 45000; // 45 секунд
}
FrameMonitor_t *vin_mon = g_can_monitors[CAN_IDX_VEH_VIN].monitor;
vin_mon->timeout_cycle = 45000; // 45 секунд для VIN
/*
env->ccu_candb_rx_LOCAL_HVAC_VIN = osMessageQueueNew(1, 17, NULL);

View File

@ -11,6 +11,41 @@
#include "LoggerInterface.h"
#include "crc32_m7.h"
// Индексы таблицы g_can_monitors
typedef enum {
CAN_IDX_ESC_04, // 0
CAN_IDX_EMS_VEH, // 1
CAN_IDX_BCM_POWERTRAIN, // 2
CAN_IDX_EMS_VEH_02, // 3
CAN_IDX_BCM_EEM, // 4
CAN_IDX_DMFR_MSG1, // 5
CAN_IDX_DMFL_MSG1, // 6
CAN_IDX_TM_STAT, // 7
CAN_IDX_TM_CP, // 8
CAN_IDX_HVC_CCU_STATUS_MSG, // 9
CAN_IDX_BCM_VEH_STATE, // 10
CAN_IDX_EMS_HVC_REQ_MSG, // 11
CAN_IDX_HVC_ERR_STATUS_MSG, // 12
CAN_IDX_BCM_CLIMATIC_DATA, // 13
CAN_IDX_VCU_CCU_REQ, // 14
CAN_IDX_ESC_08, // 15
CAN_IDX_SMFL_STATUS, // 16
CAN_IDX_SMFR_STATUS, // 17
CAN_IDX_SMRL_STATUS, // 18
CAN_IDX_SMRR_STATUS, // 19
CAN_IDX_SDM_CMD, // 20
CAN_IDX_VEH_VIN, // 21
CAN_IDX_OCUFL_MSG, // 22
CAN_IDX_OCUFR_MSG, // 23
CAN_IDX_OCURL_MSG, // 24
CAN_IDX_OCURR_MSG, // 25
CAN_IDX_DW_STATE, // 26
CAN_IDX_FIU_CCU1, // 27
CAN_IDX_FIU_CCU2, // 28
CAN_IDX_FIU_CCU3, // 29
} CAN_MonitorIndex_t;
typedef struct {

View File

@ -861,6 +861,12 @@ static _Noreturn void ModelTask_Thread(tModelTask *env) {
//начало--------------------------------------------------ВЫХОД МОДЕЛИ ДЛЯ CAN------------------------------------------
memcpy(&env->ccu_candb_tx.CCU_Errors, &rtY.CCU_Errors_model, sizeof(env->ccu_candb_tx.CCU_Errors));
//начало--------------------------------------------------ВЫХОД МОДЕЛИ ДЛЯ DTC------------------------------------------
memcpy(env->dtc_state_error, rtY.dtc_state_error_model, sizeof(env->dtc_state_error));
set_Dtc_state(env->diagnostic, &env->ccu_candb_tx.CCU_Errors, env->dtc_state_error, env->GET_HVAC_VIN);
//конец--------------------------------------------------ВЫХОД МОДЕЛИ ДЛЯ DTC-------------------------------------------
memcpy(&env->ccu_candb_tx.CCU_Stat1, &rtY.CCU_Stat1_model, sizeof(env->ccu_candb_tx.CCU_Stat1));
memcpy(&env->ccu_candb_tx.CCU_Stat2, &rtY.CCU_Stat2_model, sizeof(env->ccu_candb_tx.CCU_Stat2));
memcpy(&env->ccu_candb_tx.CCU_HVC_Req_Msg, &rtY.CCUCAN_HVC_REQ_MSG_MODEL,
@ -1000,11 +1006,6 @@ static _Noreturn void ModelTask_Thread(tModelTask *env) {
CanUdsInput_Set_Model(env->canUds);
//конец--------------------------------------------------ВЫХОД МОДЕЛИ ДЛЯ UDS-------------------------------------------
//начало--------------------------------------------------ВЫХОД МОДЕЛИ ДЛЯ DTC------------------------------------------
memcpy(env->dtc_state_error, rtY.dtc_state_error_model, sizeof(env->dtc_state_error));
set_Dtc_state(env->diagnostic, env->dtc_state_error, env->GET_HVAC_VIN);
//конец--------------------------------------------------ВЫХОД МОДЕЛИ ДЛЯ DTC-------------------------------------------
env->isRunning = true;
osMutexRelease(env->access);
} else {

View File

@ -17,7 +17,6 @@ void Diagnostic_Init(tDiagnostic *env, tLoggerInterface *logger) {
env->access = osMutexNew(NULL);
env->timeoutDTC[DTC_VIN_INVALID_CONFIG] = SystemGetMs() + 45000;
// for (uint8_t i = 0; i < COUNT_DTC_CODE_ERROR; ++i) {
@ -150,26 +149,40 @@ void set_NoBitsDTC(tDiagnostic *env, bool noBitsDTC) {
}
}
void set_Dtc_state(tDiagnostic *env, uint8_t *dtc_state_error_model, char *VIN) {
static bool isVINError(char *VIN) {
if (VIN == NULL) {
return false; // NULL — не ошибка (ещё нет данных)
}
// Пустой VIN (нули) — ещё не собран → НЕ ошибка
if (memcmp(VIN, "00000000000000000", 17) == 0) {
return false; // НЕ ошибка!
}
// Проверка на совпадение с эталоном
if (memcmp(VIN, statusData.ecu.Vehicle_Identification, 17) == 0) {
return false; // Валидный - не ошибка
}
// VIN собран, но не совпадает с эталоном - ОШИБКА
return true;
}
void set_Dtc_state(tDiagnostic *env, CCU_Errors_t *CCU_Errors, uint8_t *dtc_state_error_model, char *VIN) {
if (osMutexAcquire(env->access, 5000) == osOK) {
bool errorVIN = false;
int result = memcmp(VIN, statusData.ecu.Vehicle_Identification, 17);
if (result != 0) {
errorVIN = true;
} else {
result = memcmp(VIN, "00000000000000000", 17);
bool vin_timeout = ccu_candb_error_rx.VEH_VIN;
bool vin_error = isVINError(VIN);
if (result == 0) {
errorVIN = true;
} else {
errorVIN = false;
}
}
if ((errorVIN) && (SystemGetMs() > env->timeoutDTC[DTC_VIN_INVALID_CONFIG])) {
// DTC = 1 только если:
// - VIN собран, но невалидный
// - ИЛИ таймаут (сообщение VIN вообще не приходит)
if (vin_error || vin_timeout) {
dtc_state_error_model[DTC_VIN_INVALID_CONFIG] = 1;
CCU_Errors->CCU_VinRecordErr_Stat = 1;
} else {
dtc_state_error_model[DTC_VIN_INVALID_CONFIG] = 0;
CCU_Errors->CCU_VinRecordErr_Stat = 0;
}
memcpy(dtc_state_error, dtc_state_error_model, sizeof(dtc_state_error));

View File

@ -7,6 +7,7 @@
#include <cmsis_os.h>
#include "LoggerInterface.h"
#include "ccu_candb-binutil.h"
typedef struct {
@ -20,14 +21,11 @@ typedef struct {
bool isNoBitsDTC;
uint32_t timeoutDTC[127];
} tDiagnostic;
void Diagnostic_Init(tDiagnostic *env, tLoggerInterface *logger);
void set_NoBitsDTC(tDiagnostic *env, bool noBitsDTC);
void set_Dtc_state(tDiagnostic *env, uint8_t *dtc_state_error_model, char *VIN);
void set_Dtc_state(tDiagnostic *env, CCU_Errors_t *CCU_Errors, uint8_t *dtc_state_error_model, char *VIN);
uint32_t diagnostic_ClearDiagnosticInformation_14(tDiagnostic *env);
uint32_t diagnostic_UDS_ReadDTCInformation_19_count(tDiagnostic *env, tDiagnosticDTC *diagnosticDTC);