Добавлены таймауты CAN
This commit is contained in:
parent
4da836da77
commit
b6c7dd4821
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue