From 4da836da77e8f212c5a6494a9ad5e8328fb1d53e Mon Sep 17 00:00:00 2001 From: cfif Date: Thu, 27 Aug 2026 17:22:00 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D1=82=D0=B0=D0=B9=D0=BC=D0=B0=D1=83=D1=82=D1=8B?= =?UTF-8?q?=20CAN?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../HVAC_M7_CAN_MATRIX/inc/canmonitorutil.h | 2 +- MODULES/HVAC_M7_CAN_SPAM/CanSpamReceiver.c | 114 ++++++++++-------- 2 files changed, 68 insertions(+), 48 deletions(-) diff --git a/MODULES/HVAC_M7_CAN_MATRIX/inc/canmonitorutil.h b/MODULES/HVAC_M7_CAN_MATRIX/inc/canmonitorutil.h index 777b6ff..2289caa 100644 --- a/MODULES/HVAC_M7_CAN_MATRIX/inc/canmonitorutil.h +++ b/MODULES/HVAC_M7_CAN_MATRIX/inc/canmonitorutil.h @@ -25,7 +25,7 @@ typedef struct // @timeout_cycle keeps maximum timeout for frame, user responsibility // to init this field and use it in missing frame monitoring function - uint32_t prev_cycle; + uint32_t timeout_cycle; // @frame_cnt keeps count of all the received frames uint32_t frame_cnt; diff --git a/MODULES/HVAC_M7_CAN_SPAM/CanSpamReceiver.c b/MODULES/HVAC_M7_CAN_SPAM/CanSpamReceiver.c index 1409d68..55eb5b4 100644 --- a/MODULES/HVAC_M7_CAN_SPAM/CanSpamReceiver.c +++ b/MODULES/HVAC_M7_CAN_SPAM/CanSpamReceiver.c @@ -12,52 +12,6 @@ #define LOG_SIGN "CAN_RECEIVED" #define LOGGER env->logger -void CanSpamReceiver_Init(tCanSpamReceiver *env, - tSerialPortFrameIO *ioCanFrame, - tLoggerInterface *logger) { - - env->ioCanFrame = ioCanFrame; - env->logger = logger; - env->access = osMutexNew(NULL); - -/* - env->ccu_candb_rx_LOCAL_HVAC_VIN = osMessageQueueNew(1, 17, NULL); - env->ccu_candb_rx_LOCAL_HVAC_UDS_VIN = osMessageQueueNew(1, 17, NULL); - env->ccu_candb_rx_TM_CP = osMessageQueueNew(1, sizeof(ccu_candb_rx.TM_CP), NULL); - env->ccu_candb_rx_FIU_CCU1 = osMessageQueueNew(1, sizeof(ccu_candb_rx.FIU_CCU1), NULL); - env->ccu_candb_rx_FIU_CCU2 = osMessageQueueNew(1, sizeof(ccu_candb_rx.FIU_CCU2), NULL); - env->ccu_candb_rx_BCM_Powertrain = osMessageQueueNew(1, sizeof(ccu_candb_rx.BCM_Powertrain), NULL); - env->ccu_candb_rx_BCM_CLIMATIC_DATA = osMessageQueueNew(1, sizeof(ccu_candb_rx.BCM_CLIMATIC_DATA), NULL); - env->ccu_candb_rx_EMS_Veh = osMessageQueueNew(1, sizeof(ccu_candb_rx.EMS_Veh), NULL); - env->ccu_candb_rx_ESC_04 = osMessageQueueNew(1, sizeof(ccu_candb_rx.ESC_04), NULL); - env->ccu_candb_rx_BCM_VEH_STATE = osMessageQueueNew(1, sizeof(ccu_candb_rx.BCM_VEH_STATE), NULL); - env->ccu_candb_rx_EMS_HVC_Req_Msg = osMessageQueueNew(1, sizeof(ccu_candb_rx.EMS_HVC_Req_Msg), NULL); - env->ccu_candb_rx_HVC_Err_Status_Msg = osMessageQueueNew(1, sizeof(ccu_candb_rx.HVC_Err_Status_Msg), NULL); -*/ - env->ccu_candb_rx_LOCAL_HVAC_VIN = osMessageQueueNew(1, 17, NULL); - env->ccu_candb_rx_LOCAL_HVAC_UDS_VIN = osMessageQueueNew(1, 17, NULL); - env->ccu_candb_rx_TM_CP = osMessageQueueNew(1, sizeof(rtDW.TM_CP_model), NULL); - env->ccu_candb_rx_FIU_CCU1 = osMessageQueueNew(1, sizeof(rtDW.FIU_CCU1_MODEL), NULL); - env->ccu_candb_rx_FIU_CCU2 = osMessageQueueNew(1, sizeof(rtDW.FIU_CCU2_MODEL), NULL); - env->ccu_candb_rx_BCM_Powertrain = osMessageQueueNew(1, sizeof(rtDW.CCUCAN_BCM_Powertrain_model), NULL); - env->ccu_candb_rx_BCM_CLIMATIC_DATA = osMessageQueueNew(1, sizeof(rtDW.CCUCAN_BCM_Climatic_model), NULL); - env->ccu_candb_rx_EMS_Veh = osMessageQueueNew(1, sizeof(rtDW.CCUCAN_EMS_Veh_model), NULL); - env->ccu_candb_rx_ESC_04 = osMessageQueueNew(1, sizeof(rtDW.CCUCAN_ESC_04_model), NULL); - env->ccu_candb_rx_BCM_VEH_STATE = osMessageQueueNew(1, sizeof(rtDW.CCUCAN_BCM_VEH_STATE_model), NULL); - env->ccu_candb_rx_EMS_HVC_Req_Msg = osMessageQueueNew(1, sizeof(rtDW.CCUCAN_EMS_HVC_REQ_MSG_MODEL), NULL); - env->ccu_candb_rx_HVC_Err_Status_Msg = osMessageQueueNew(1, sizeof(rtDW.HVC_ERR_STATUS_MSG_MODEL), NULL); - - env->thread.stack = tCanSpamReceiver_stack; - InitThreadAtr(&env->thread.attr, "CanSpamRec", &env->thread.controlBlock, sizeof(env->thread.controlBlock), - env->thread.stack, tCanSpamReceiver_stack_size, osPriorityNormal); - env->thread.id = 0; - -// InitThreadAtrStatic(&env->thread.attr, "CanSpamRec", env->thread.controlBlock, env->thread.stack, -// osPriorityNormal); -} - -#define timeout_CAN_Threshold_Error 3000 - // Структура для таблицы мониторов typedef struct { uint32_t can_id; @@ -101,6 +55,72 @@ 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) { + + env->ioCanFrame = ioCanFrame; + env->logger = logger; + env->access = osMutexNew(NULL); + + for (uint32_t i = 0; i < CAN_MONITOR_COUNT; i++) { + FrameMonitor_t *mon = g_can_monitors[i].monitor; + mon->timeout_cycle = 3000; + } + + // VIN + FrameMonitor_t *vin_mon = FindMonitorByCanId(VEH_VIN_CANID); + if (vin_mon != NULL) { + vin_mon->timeout_cycle = 45000; // 45 секунд + } + +/* + env->ccu_candb_rx_LOCAL_HVAC_VIN = osMessageQueueNew(1, 17, NULL); + env->ccu_candb_rx_LOCAL_HVAC_UDS_VIN = osMessageQueueNew(1, 17, NULL); + env->ccu_candb_rx_TM_CP = osMessageQueueNew(1, sizeof(ccu_candb_rx.TM_CP), NULL); + env->ccu_candb_rx_FIU_CCU1 = osMessageQueueNew(1, sizeof(ccu_candb_rx.FIU_CCU1), NULL); + env->ccu_candb_rx_FIU_CCU2 = osMessageQueueNew(1, sizeof(ccu_candb_rx.FIU_CCU2), NULL); + env->ccu_candb_rx_BCM_Powertrain = osMessageQueueNew(1, sizeof(ccu_candb_rx.BCM_Powertrain), NULL); + env->ccu_candb_rx_BCM_CLIMATIC_DATA = osMessageQueueNew(1, sizeof(ccu_candb_rx.BCM_CLIMATIC_DATA), NULL); + env->ccu_candb_rx_EMS_Veh = osMessageQueueNew(1, sizeof(ccu_candb_rx.EMS_Veh), NULL); + env->ccu_candb_rx_ESC_04 = osMessageQueueNew(1, sizeof(ccu_candb_rx.ESC_04), NULL); + env->ccu_candb_rx_BCM_VEH_STATE = osMessageQueueNew(1, sizeof(ccu_candb_rx.BCM_VEH_STATE), NULL); + env->ccu_candb_rx_EMS_HVC_Req_Msg = osMessageQueueNew(1, sizeof(ccu_candb_rx.EMS_HVC_Req_Msg), NULL); + env->ccu_candb_rx_HVC_Err_Status_Msg = osMessageQueueNew(1, sizeof(ccu_candb_rx.HVC_Err_Status_Msg), NULL); +*/ + env->ccu_candb_rx_LOCAL_HVAC_VIN = osMessageQueueNew(1, 17, NULL); + env->ccu_candb_rx_LOCAL_HVAC_UDS_VIN = osMessageQueueNew(1, 17, NULL); + env->ccu_candb_rx_TM_CP = osMessageQueueNew(1, sizeof(rtDW.TM_CP_model), NULL); + env->ccu_candb_rx_FIU_CCU1 = osMessageQueueNew(1, sizeof(rtDW.FIU_CCU1_MODEL), NULL); + env->ccu_candb_rx_FIU_CCU2 = osMessageQueueNew(1, sizeof(rtDW.FIU_CCU2_MODEL), NULL); + env->ccu_candb_rx_BCM_Powertrain = osMessageQueueNew(1, sizeof(rtDW.CCUCAN_BCM_Powertrain_model), NULL); + env->ccu_candb_rx_BCM_CLIMATIC_DATA = osMessageQueueNew(1, sizeof(rtDW.CCUCAN_BCM_Climatic_model), NULL); + env->ccu_candb_rx_EMS_Veh = osMessageQueueNew(1, sizeof(rtDW.CCUCAN_EMS_Veh_model), NULL); + env->ccu_candb_rx_ESC_04 = osMessageQueueNew(1, sizeof(rtDW.CCUCAN_ESC_04_model), NULL); + env->ccu_candb_rx_BCM_VEH_STATE = osMessageQueueNew(1, sizeof(rtDW.CCUCAN_BCM_VEH_STATE_model), NULL); + env->ccu_candb_rx_EMS_HVC_Req_Msg = osMessageQueueNew(1, sizeof(rtDW.CCUCAN_EMS_HVC_REQ_MSG_MODEL), NULL); + env->ccu_candb_rx_HVC_Err_Status_Msg = osMessageQueueNew(1, sizeof(rtDW.HVC_ERR_STATUS_MSG_MODEL), NULL); + + env->thread.stack = tCanSpamReceiver_stack; + InitThreadAtr(&env->thread.attr, "CanSpamRec", &env->thread.controlBlock, sizeof(env->thread.controlBlock), + env->thread.stack, tCanSpamReceiver_stack_size, osPriorityNormal); + env->thread.id = 0; + +// InitThreadAtrStatic(&env->thread.attr, "CanSpamRec", env->thread.controlBlock, env->thread.stack, +// osPriorityNormal); +} + + static void CheckAllCANMonitors(void) { uint32_t current_time = SystemGetMs(); @@ -109,7 +129,7 @@ static void CheckAllCANMonitors(void) { // Проверяем таймаут uint32_t diff = current_time - mon->last_cycle; - uint8_t error = (diff > timeout_CAN_Threshold_Error) ? 1 : 0; + uint8_t error = (diff > mon->timeout_cycle) ? 1 : 0; // Сохраняем ошибку *(g_can_monitors[i].error_flag) = error;