From d8378179f1dd2ff02fe317c32a38d046610c72e9 Mon Sep 17 00:00:00 2001 From: cfif Date: Wed, 22 Jul 2026 13:33:16 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B2=20LIN4=20=D0=B8=20LIN5=20(?= =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B2?= =?UTF-8?q?=20=D0=B8=D0=BD=D1=82=D0=B5=D1=80=D1=84=D0=B5=D0=B9=D1=81=D0=B5?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LinSensorTasks.c | 185 ++++++++++++++++++++++++++++++++++------------- LinSensorTasks.h | 31 +++++--- 2 files changed, 156 insertions(+), 60 deletions(-) diff --git a/LinSensorTasks.c b/LinSensorTasks.c index 3606888..3548025 100644 --- a/LinSensorTasks.c +++ b/LinSensorTasks.c @@ -162,6 +162,9 @@ void Lin4_Output_Set_Model(tLin4TaskSensor *env) { env->eTXV_eeChiller_Stat_For_Model.eTXV_eeChiller_Pressure_Val = p_teTXV_eeChiller_Stat->eTXV_eeChiller_Pressure_Val; env->eTXV_eeChiller_Stat_For_Model.eTXV_eeChiller_Temp_Val = p_teTXV_eeChiller_Stat->eTXV_eeChiller_Temp_Val; + memcpy(env->sensorLin4CmdBusInput.in_error_connect, env->error_connect, LIN4_SENSOR_COUNT); + env->sensorLin4CmdBusInput.Error_Connect = env->error_all_connect; + osStatus_t status = osOK; uint32_t countQueue_space = osMessageQueueGetSpace(env->queue_input_tAirQS); @@ -199,6 +202,10 @@ void Lin4_Output_Set_Model(tLin4TaskSensor *env) { status = osMessageQueuePut(env->queue_input_teTXV_eeChiller, &env->eTXV_eeChiller_Stat_For_Model, 0, 0); } + countQueue_space = osMessageQueueGetSpace(env->queue_input_Lin4_Stat); + if (countQueue_space) { + status = osMessageQueuePut(env->queue_input_Lin4_Stat, &env->sensorLin4CmdBusInput, 0, 0); + } } @@ -210,6 +217,12 @@ void Lin4_Output_Get_From_Model(tLin4TaskSensor *env) { if (countQueue_space == 0) { status = osMessageQueueGet(env->queue_input_tAirQS, &rtDW.LIN4_AirQS_Stat_Model, 0, 0); } + + countQueue_space = osMessageQueueGetSpace(env->queue_input_Lin4_Stat); + if (countQueue_space == 0) { +// status = osMessageQueueGet(env->queue_input_Lin4_Stat, &env->sensorLin4CmdBusInput, 0, 0); + } + } // Это формирование входа с модели на задачу Lin4 @@ -265,14 +278,16 @@ static lin_event_id_t Lin4_Scheduler(tLin4TaskSensor *env) { ret = Get_Sensor4_Stat(env->linIo, env->linData, &env->Stat[i], LIN4_SENSON_LEN_Stat[i], LIN4_SENSON_ADR_Stat[i]); + + if (ret == LIN_RX_COMPLETED) { + env->error_connect[i] = 0; #if (LOG_LIN4_SENSOR == 1) - switch (i) { + switch (i) { - case eeAirQS_Stat: { - tAirQS_Stat *pAirQS_Stat = (tAirQS_Stat *) &env->Stat[i]; + case eeAirQS_Stat: { + tAirQS_Stat *pAirQS_Stat = (tAirQS_Stat *) &env->Stat[i]; - if (ret == LIN_RX_COMPLETED) { LoggerFormatInfo(LOGGER, LOG_SIGN4, "AirQS_LinRespErr_Stat = %d AirQS_Sens_Stat = %d AirQS_Combined_Stat = %d AirQS_Err_Stat = %d AirQS_COLvl_Stat = %d AirQS_NOxLvl_Stat = %d AirQS_NH3Lvl_Stat = %d", pAirQS_Stat->AirQS_LinRespErr_Stat, @@ -282,16 +297,14 @@ static lin_event_id_t Lin4_Scheduler(tLin4TaskSensor *env) { pAirQS_Stat->AirQS_COLvl_Stat, pAirQS_Stat->AirQS_NOxLvl_Stat, pAirQS_Stat->AirQS_NH3Lvl_Stat) - } else { - LoggerFormatInfo(LOGGER, LOG_SIGN4, "LIN4 ERROR (pAirQS_Stat) = %d", ret) + + + break; } + case eeAroma_Stat: { + tAroma_Stat *pAroma_Stat = (tAroma_Stat *) &env->Stat[i]; - break; - } - case eeAroma_Stat: { - tAroma_Stat *pAroma_Stat = (tAroma_Stat *) &env->Stat[i]; - if (ret == LIN_RX_COMPLETED) { LoggerFormatInfo(LOGGER, LOG_SIGN4, "Aroma_LinRespErr_Stat = %d Aroma_CartridgeSw_Stat = %d Aroma_Err_Stat = %d Aroma_Intens_Stat = %d Aroma_CartridgeFlavor_Stat = %d Aroma_CartridgeCapacity_Stat = %d", pAroma_Stat->Aroma_LinRespErr_Stat, @@ -300,32 +313,27 @@ static lin_event_id_t Lin4_Scheduler(tLin4TaskSensor *env) { pAroma_Stat->Aroma_Intens_Stat, pAroma_Stat->Aroma_CartridgeFlavor_Stat, pAroma_Stat->Aroma_CartridgeCapacity_Stat) - } else { - LoggerFormatInfo(LOGGER, LOG_SIGN4, "LIN4 ERROR (pAroma_Stat) = %d", ret) + + break; } - break; - } + case eeIonizer_Stat: { + tIonizer_Stat *pIonizer_Stat = (tIonizer_Stat *) &env->Stat[i]; - case eeIonizer_Stat: { - tIonizer_Stat *pIonizer_Stat = (tIonizer_Stat *) &env->Stat[i]; - if (ret == LIN_RX_COMPLETED) { LoggerFormatInfo(LOGGER, LOG_SIGN4, "Ionizer_LinRespErr_Stat = %d Ionizer_Err_Stat = %d Ionizer_Ionization_Stat = %d", pIonizer_Stat->Ionizer_LinRespErr_Stat, pIonizer_Stat->Ionizer_Err_Stat, pIonizer_Stat->Ionizer_Ionization_Stat) - } else { - LoggerFormatInfo(LOGGER, LOG_SIGN4, "LIN4 ERROR (pIonizer_Stat) = %d", ret) + + + break; } + case eeTXV_fHVAC_Stat: { + teTXV_fHVAC_Stat *p_teTXV_fHVAC_Stat = (teTXV_fHVAC_Stat *) &env->Stat[i]; - break; - } - case eeTXV_fHVAC_Stat: { - teTXV_fHVAC_Stat *p_teTXV_fHVAC_Stat = (teTXV_fHVAC_Stat *) &env->Stat[i]; - if (ret == LIN_RX_COMPLETED) { LoggerFormatInfo(LOGGER, LOG_SIGN4, "eTXV_fHVAC_Pos_Stat = %d eTXV_fHVAC_LinRespErr_Stat = %d eTXV_fHVAC_Err_Stat = %d eTXV_fHVAC_Pressure_Val = %d eTXV_fHVAC_Temp_Val = %d", p_teTXV_fHVAC_Stat->eTXV_fHVAC_Pos_Stat, @@ -333,17 +341,15 @@ static lin_event_id_t Lin4_Scheduler(tLin4TaskSensor *env) { p_teTXV_fHVAC_Stat->eTXV_fHVAC_Err_Stat, p_teTXV_fHVAC_Stat->eTXV_fHVAC_Pressure_Val, p_teTXV_fHVAC_Stat->eTXV_fHVAC_Temp_Val) - } else { - LoggerFormatInfo(LOGGER, LOG_SIGN4, "LIN4 ERROR (p_teTXV_fHVAC_Stat) = %d", ret) + + + break; } - break; - } + case eeTXV_rHVAC_Stat: { + teTXV_rHVAC_Stat *p_teTXV_rHVAC_Stat = (teTXV_rHVAC_Stat *) &env->Stat[i]; - case eeTXV_rHVAC_Stat: { - teTXV_rHVAC_Stat *p_teTXV_rHVAC_Stat = (teTXV_rHVAC_Stat *) &env->Stat[i]; - if (ret == LIN_RX_COMPLETED) { LoggerFormatInfo(LOGGER, LOG_SIGN4, "eTXV_rHVAC_Pos_Stat = %d eTXV_rHVAC_LinRespErr_Stat = %d eTXV_rHVAC_Err_Stat = %d eTXV_fHVAC_Pressure_Val = %d eTXV_rHVAC_Temp_Val = %d", p_teTXV_rHVAC_Stat->eTXV_rHVAC_Pos_Stat, @@ -351,17 +357,15 @@ static lin_event_id_t Lin4_Scheduler(tLin4TaskSensor *env) { p_teTXV_rHVAC_Stat->eTXV_rHVAC_Err_Stat, p_teTXV_rHVAC_Stat->eTXV_rHVAC_Pressure_Val, p_teTXV_rHVAC_Stat->eTXV_rHVAC_Temp_Val) - } else { - LoggerFormatInfo(LOGGER, LOG_SIGN4, "LIN4 ERROR (p_teTXV_rHVAC_Stat) = %d", ret) + + + break; } - break; - } + case eeTXV_batChiller_Stat: { + teTXV_batChiller_Stat *p_teTXV_batChiller_Stat = (teTXV_batChiller_Stat *) &env->Stat[i]; - case eeTXV_batChiller_Stat: { - teTXV_batChiller_Stat *p_teTXV_batChiller_Stat = (teTXV_batChiller_Stat *) &env->Stat[i]; - if (ret == LIN_RX_COMPLETED) { LoggerFormatInfo(LOGGER, LOG_SIGN4, "eTXV_batChiller_Pos_Stat = %d eTXV_batChiller_LinRespErr_Stat = %d eTXV_batChiller_Err_Stat = %d eTXV_batChiller_Pressure_Val = %d eTXV_batChiller_Temp_Val = %d", p_teTXV_batChiller_Stat->eTXV_batChiller_Pos_Stat, @@ -369,17 +373,14 @@ static lin_event_id_t Lin4_Scheduler(tLin4TaskSensor *env) { p_teTXV_batChiller_Stat->eTXV_batChiller_Err_Stat, p_teTXV_batChiller_Stat->eTXV_batChiller_Pressure_Val, p_teTXV_batChiller_Stat->eTXV_batChiller_Temp_Val) - } else { - LoggerFormatInfo(LOGGER, LOG_SIGN4, "LIN4 ERROR (p_teTXV_batChiller_Stat) = %d", ret) + + + break; } - break; - } + case eeTXV_eeChiller_Stat: { + teTXV_eeChiller_Stat *p_teTXV_eeChiller_Stat = (teTXV_eeChiller_Stat *) &env->Stat[i]; - case eeTXV_eeChiller_Stat: { - teTXV_eeChiller_Stat *p_teTXV_eeChiller_Stat = (teTXV_eeChiller_Stat *) &env->Stat[i]; - - if (ret == LIN_RX_COMPLETED) { LoggerFormatInfo(LOGGER, LOG_SIGN4, "eTXV_eeChiller_Stat_ = %d eTXV_eeChiller_LinRespErr_Stat = %d eTXV_eeChiller_Err_Stat = %d eTXV_eeChiller_Pressure_Val = %d eTXV_eeChiller_Temp_Val = %d", p_teTXV_eeChiller_Stat->eTXV_eeChiller_Pos_Stat, @@ -387,14 +388,73 @@ static lin_event_id_t Lin4_Scheduler(tLin4TaskSensor *env) { p_teTXV_eeChiller_Stat->eTXV_eeChiller_Err_Stat, p_teTXV_eeChiller_Stat->eTXV_eeChiller_Pressure_Val, p_teTXV_eeChiller_Stat->eTXV_eeChiller_Temp_Val) - } else { - LoggerFormatInfo(LOGGER, LOG_SIGN4, "LIN4 ERROR (p_teTXV_eeChiller_Stat) = %d", ret) + + break; + } + } +#endif + } else { + env->error_connect[i] = 1; + +#if (LOG_LIN4_SENSOR == 1) + switch (i) { + + case eeAirQS_Stat: { + tAirQS_Stat *pAirQS_Stat = (tAirQS_Stat *) &env->Stat[i]; + + LoggerFormatInfo(LOGGER, LOG_SIGN4, "LIN4 ERROR (pAirQS_Stat) = %d", ret) + + break; + } + case eeAroma_Stat: { + tAroma_Stat *pAroma_Stat = (tAroma_Stat *) &env->Stat[i]; + + LoggerFormatInfo(LOGGER, LOG_SIGN4, "LIN4 ERROR (pAroma_Stat) = %d", ret) + + break; } - break; + case eeIonizer_Stat: { + tIonizer_Stat *pIonizer_Stat = (tIonizer_Stat *) &env->Stat[i]; + + LoggerFormatInfo(LOGGER, LOG_SIGN4, "LIN4 ERROR (pIonizer_Stat) = %d", ret) + + break; + } + case eeTXV_fHVAC_Stat: { + teTXV_fHVAC_Stat *p_teTXV_fHVAC_Stat = (teTXV_fHVAC_Stat *) &env->Stat[i]; + + LoggerFormatInfo(LOGGER, LOG_SIGN4, "LIN4 ERROR (p_teTXV_fHVAC_Stat) = %d", ret) + + break; + } + + case eeTXV_rHVAC_Stat: { + teTXV_rHVAC_Stat *p_teTXV_rHVAC_Stat = (teTXV_rHVAC_Stat *) &env->Stat[i]; + + LoggerFormatInfo(LOGGER, LOG_SIGN4, "LIN4 ERROR (p_teTXV_rHVAC_Stat) = %d", ret) + + break; + } + + case eeTXV_batChiller_Stat: { + teTXV_batChiller_Stat *p_teTXV_batChiller_Stat = (teTXV_batChiller_Stat *) &env->Stat[i]; + + LoggerFormatInfo(LOGGER, LOG_SIGN4, "LIN4 ERROR (p_teTXV_batChiller_Stat) = %d", ret) + + break; + } + + case eeTXV_eeChiller_Stat: { + teTXV_eeChiller_Stat *p_teTXV_eeChiller_Stat = (teTXV_eeChiller_Stat *) &env->Stat[i]; + + LoggerFormatInfo(LOGGER, LOG_SIGN4, "LIN4 ERROR (p_teTXV_eeChiller_Stat) = %d", ret) + + break; + } } - } #endif + } } @@ -420,6 +480,8 @@ void Lin_4_Init(tLin4TaskSensor *env, env->queue_input_teTXV_rHVAC = osMessageQueueNew(1, sizeof(LIN4_eTXV_rHVAC_Stat_Bus), NULL); env->queue_input_teTXV_batChiller = osMessageQueueNew(1, sizeof(LIN4_eTXV_batChiller_Stat_Bus), NULL); env->queue_input_teTXV_eeChiller = osMessageQueueNew(1, sizeof(LIN4_eTXV_eeChiller_Stat_Bus), NULL); + env->queue_input_Lin4_Stat = osMessageQueueNew(1, sizeof(SensorLin4CmdBusInput), NULL); + InitThreadAtrStatic(&env->threadLin.attr, "Ln4", env->threadLin.controlBlock, env->threadLin.stack, osPriorityNormal); @@ -432,7 +494,22 @@ static _Noreturn void Lin4_Thread(tLin4TaskSensor *env) { if (osMutexAcquire(env->access, 1000) == osOK) { Lin4_Input_Set_Model(env); + lin_event_id_t res = Lin4_Scheduler(env); + + uint8_t isError = 0; + for (uint8_t i = 0; i < LIN4_SENSOR_COUNT; ++i) { + if (env->error_connect[i] == 1) + ++isError; + } + + if (isError == LIN4_SENSOR_COUNT) { + env->error_all_connect = 1; + } else { + env->error_all_connect = 0; + } + + Lin4_Output_Set_Model(env); osMutexRelease(env->access); @@ -717,6 +794,12 @@ static lin_event_id_t Lin5_Scheduler(tLin5TaskSensor *env) { osStatus_t status = osOK; if (countQueue_led_count) { + memcpy(env->sensorButtonCmdBusInput.in_COUNT, env->linStateSensor.LED_COUNT, LIN5_SENSOR_COUNT); + memcpy(env->sensorButtonCmdBusInput.in_error_connect, env->linStateSensor.error_connect, LIN5_SENSOR_COUNT); + memcpy(env->sensorButtonCmdBusInput.LinRespErr_Stat, env->linStateSensor.LinRespErr_Stat, LIN5_SENSOR_COUNT); + memcpy(env->sensorButtonCmdBusInput.Err_Stat, env->linStateSensor.Err_Stat, LIN5_SENSOR_COUNT); + env->sensorButtonCmdBusInput.Error_Connect = env->error_connect; + status = osMessageQueuePut(env->queue_led_count, env->linStateSensor.LED_COUNT, 0, 0U); } diff --git a/LinSensorTasks.h b/LinSensorTasks.h index 69285a8..bc0bb42 100644 --- a/LinSensorTasks.h +++ b/LinSensorTasks.h @@ -12,7 +12,7 @@ #include "HVAC_model.h" #define LOG_LIN4_SENSOR 0 -#define LOG_LIN5_SENSOR 0 +#define LOG_LIN5_SENSOR 1 #define LIN4_SENSOR_COUNT 7 @@ -291,6 +291,10 @@ typedef struct __attribute__ ((packed)) { uint8_t DRS_RRB_Err_Stat: 1; // 2 } tDRS_RRB_Stat; +typedef struct { + uint8_t in_error_connect[LIN4_SENSOR_COUNT]; // Конкретное устройство не ответило + uint8_t Error_Connect; // Ошибка LIN шины (ни одно устройство не отвечает) +} SensorLin4CmdBusInput; typedef struct { @@ -321,6 +325,9 @@ typedef struct { //teTXV_eeChiller_Stat_For_Model eTXV_eeChiller_Stat_For_Model; LIN4_eTXV_eeChiller_Stat_Bus eTXV_eeChiller_Stat_For_Model; + SensorLin4CmdBusInput sensorLin4CmdBusInput; + + osMessageQueueId_t queue_input_tCCU; osMessageQueueId_t queue_input_tAirQS; @@ -330,7 +337,10 @@ typedef struct { osMessageQueueId_t queue_input_teTXV_rHVAC; osMessageQueueId_t queue_input_teTXV_batChiller; osMessageQueueId_t queue_input_teTXV_eeChiller; + osMessageQueueId_t queue_input_Lin4_Stat; + uint8_t error_connect[LIN4_SENSOR_COUNT]; + uint8_t error_all_connect; struct { osThreadId_t id; @@ -342,15 +352,15 @@ typedef struct { } tLin4TaskSensor; -/* + typedef struct { - uint8_t in_COUNT[8]; // Уровень (0,1,2,3) - uint8_t in_error_connect[8]; // Конкретное устройство не ответило - uint8_t LinRespErr_Stat[8]; // Внутренняя ошибка устройства (ошибка коммутации) - uint8_t Err_Stat[8]; // Внутренняя ошибка устройства - uint8_t Error_Connect; // Ошибка LIN шины (не одно устройство не отвечает) -} SensorButtonCmdBusInput; -*/ + uint8_t in_COUNT[LIN5_SENSOR_COUNT]; // Уровень (0,1,2,3) + uint8_t in_error_connect[LIN5_SENSOR_COUNT]; // Конкретное устройство не ответило + uint8_t LinRespErr_Stat[LIN5_SENSOR_COUNT]; // Внутренняя ошибка устройства (ошибка коммутации) + uint8_t Err_Stat[LIN5_SENSOR_COUNT]; // Внутренняя ошибка устройства + uint8_t Error_Connect; // Ошибка LIN шины (ни одно устройство не отвечает) +} SensorLin5ButtonCmdBusInput; + typedef struct { tLinIO *linIo; @@ -360,12 +370,15 @@ typedef struct { tLoggerInterface *logger; + SensorLin5ButtonCmdBusInput sensorButtonCmdBusInput; + osMessageQueueId_t queue_led_count; struct { tDRS_Stat d_DRS_Stat[LIN5_SENSOR_COUNT]; tDRS_Stat d_old_DRS_Stat[LIN5_SENSOR_COUNT]; uint8_t LED_COUNT[LIN5_SENSOR_COUNT]; + uint8_t LED_OLD_COUNT[LIN5_SENSOR_COUNT]; uint8_t error_connect[LIN5_SENSOR_COUNT]; uint8_t error_old_connect[LIN5_SENSOR_COUNT];