diff --git a/MODULES/HVAC_M7_CAN_SPAM/CanSpamReceiver.c b/MODULES/HVAC_M7_CAN_SPAM/CanSpamReceiver.c index 55eb5b4..d8c5ef3 100644 --- a/MODULES/HVAC_M7_CAN_SPAM/CanSpamReceiver.c +++ b/MODULES/HVAC_M7_CAN_SPAM/CanSpamReceiver.c @@ -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); diff --git a/MODULES/HVAC_M7_CAN_SPAM/CanSpamReceiver.h b/MODULES/HVAC_M7_CAN_SPAM/CanSpamReceiver.h index 6a359f2..5424648 100644 --- a/MODULES/HVAC_M7_CAN_SPAM/CanSpamReceiver.h +++ b/MODULES/HVAC_M7_CAN_SPAM/CanSpamReceiver.h @@ -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 { diff --git a/MODULES/HVAC_M7_MODEL/Model_Task.c b/MODULES/HVAC_M7_MODEL/Model_Task.c index 81eb1d7..dcd3b93 100644 --- a/MODULES/HVAC_M7_MODEL/Model_Task.c +++ b/MODULES/HVAC_M7_MODEL/Model_Task.c @@ -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 { diff --git a/MODULES/HVAC_M7_StatusData/DiagnosticTask.c b/MODULES/HVAC_M7_StatusData/DiagnosticTask.c index e0270a3..2cc16bb 100644 --- a/MODULES/HVAC_M7_StatusData/DiagnosticTask.c +++ b/MODULES/HVAC_M7_StatusData/DiagnosticTask.c @@ -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)); diff --git a/MODULES/HVAC_M7_StatusData/DiagnosticTask.h b/MODULES/HVAC_M7_StatusData/DiagnosticTask.h index b396412..3bcd603 100644 --- a/MODULES/HVAC_M7_StatusData/DiagnosticTask.h +++ b/MODULES/HVAC_M7_StatusData/DiagnosticTask.h @@ -7,6 +7,7 @@ #include #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);