From 05cd0a3a186471e792ddae8f488e84d41a025dc8 Mon Sep 17 00:00:00 2001 From: darya Date: Tue, 17 Feb 2026 17:51:15 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LinActuatorTasks.c | 9 +- LinSensorTasks.c | 262 ++++++++++++++++++++++++++++++++++++++++++++- LinSensorTasks.h | 65 +++++++++++ 3 files changed, 330 insertions(+), 6 deletions(-) diff --git a/LinActuatorTasks.c b/LinActuatorTasks.c index 8b34446..7e79435 100644 --- a/LinActuatorTasks.c +++ b/LinActuatorTasks.c @@ -881,6 +881,8 @@ static lin_event_id_t Lin_Scheduler(tLinTaskActuator *env, char *LOG_SIGN) { if ((env->linCommandActuator[i].COM == LIN_ACT_CFR_NONE) || (env->linCommandActuator[i].COM == LIN_ACT_CFR_SUCCESSFUL) || (env->linCommandActuator[i].isRFR_STA)) { + env->linCommandActuator[i].isRFR_STA = 0; + uint8_t BUS_ADR = 0; uint16_t CPOS_ALL = 0; eEmrf_Slave_STA Emrf_Slave = 0; @@ -921,12 +923,11 @@ static lin_event_id_t Lin_Scheduler(tLinTaskActuator *env, char *LOG_SIGN) { (env->linStateActuator[BUS_ADR].Error2_Communication_Slave != Error2_Communication_Slave) || (env->linStateActuator[BUS_ADR].Error3_Temperature_Slave != Error3_Temperature_Slave) || (env->linStateActuator[BUS_ADR].Error4_Permanent_Electrical_Slave != - Error4_Permanent_Electrical_Slave) || - (env->linCommandActuator[BUS_ADR].isRFR_STA) + Error4_Permanent_Electrical_Slave) ) { #if (LOG_LIN_ACTUATOR == 1) LoggerFormatInfo(LOGGER, LOG_SIGN, - "State: ADR = %d CPOS = %d Emrf = %d Mode = %d Err1 = %d Err2 = %d Err3 = %d Err4 = %d", + "State: ADR = %d CPOS = %d Emrf = %d Mode = %d ErrSupply = %d ErrComm = %d ErrTemp = %d ErrElect = %d", BUS_ADR, CPOS_ALL, Emrf_Slave, @@ -975,7 +976,7 @@ static lin_event_id_t Lin_Scheduler(tLinTaskActuator *env, char *LOG_SIGN) { env->linStateActuator[i].error_connect = 1; } - env->linCommandActuator[i].isRFR_STA = 0; + } // } else { diff --git a/LinSensorTasks.c b/LinSensorTasks.c index 77d69fa..8ee6f21 100644 --- a/LinSensorTasks.c +++ b/LinSensorTasks.c @@ -10,7 +10,8 @@ #include "LoggerInterface.h" #include "memory.h" -#define LOG_SIGN "Lin0" +#define LOG_SIGN4 "Lin4" +#define LOG_SIGN5 "Lin5" #define LOGGER env->logger static lin_event_id_t SEND_SENSOR_COM_x(tLinIO *linIo, uint8_t COM_ADR) { @@ -19,6 +20,33 @@ static lin_event_id_t SEND_SENSOR_COM_x(tLinIO *linIo, uint8_t COM_ADR) { return res; } +static lin_event_id_t Set_CCU_Req(tLinIO *linIo, tLinData *linData, tCCU_Req *p_CCU_Req) { + lin_event_id_t res; + + linData->direction = LIN_DIRECTION_SET; + + linData->g_aTxBufferLen = sizeof(tCCU_Req); + linData->g_aRxBufferLen = 0; + + memcpy(linData->g_aTxBuffer, p_CCU_Req, sizeof(tCCU_Req)); + + uint8_t retry = 1; + + while (retry) { + + res = SEND_SENSOR_COM_x(linIo, CCU_Req); + + SystemDelayMs(50); + + if (res == LIN_TX_COMPLETED) { + break; + } + + --retry; + } + + return res; +} static lin_event_id_t Get_AirQS_Stat(tLinIO *linIo, tLinData *linData, tAirQS_Stat *p_AirQS_Stat) { lin_event_id_t res; @@ -45,4 +73,234 @@ static lin_event_id_t Get_AirQS_Stat(tLinIO *linIo, tLinData *linData, tAirQS_St } return res; -} \ No newline at end of file +} + + +static lin_event_id_t Set_CCU_DRS_Req(tLinIO *linIo, tLinData *linData, tCCU_DRS_Req *p_CCU_DRS_Req) { + lin_event_id_t res; + + linData->direction = LIN_DIRECTION_SET; + + linData->g_aTxBufferLen = sizeof(tCCU_DRS_Req); + linData->g_aRxBufferLen = 0; + + memcpy(linData->g_aTxBuffer, p_CCU_DRS_Req, sizeof(tCCU_DRS_Req)); + + uint8_t retry = 1; + + while (retry) { + + res = SEND_SENSOR_COM_x(linIo, CCU_DRS_Req); + + SystemDelayMs(50); + + if (res == LIN_TX_COMPLETED) { + break; + } + + --retry; + } + + return res; +} + +static lin_event_id_t Get_DRS_DL_Stat(tLinIO *linIo, tLinData *linData, tDRS_DL_Stat *p_tDRS_DL_Stat) { + lin_event_id_t res; + + tDRS_DL_Stat *tDRS_DL_Stat_ = (tDRS_DL_Stat *) linData->g_aRxBuffer; + + uint8_t retry = 3; + + while (retry) { + + linData->direction = LIN_DIRECTION_GET; + + linData->g_aTxBufferLen = 0; + linData->g_aRxBufferLen = sizeof(tDRS_DL_Stat); + + res = SEND_SENSOR_COM_x(linIo, DRS_DL_Stat); + + if (res == LIN_RX_COMPLETED) { + memcpy(p_tDRS_DL_Stat, tDRS_DL_Stat_, sizeof(tDRS_DL_Stat)); + break; + } + + --retry; + } + + return res; +} + +//начало----------------------------------------- LIN 4 ---------------------------------------------------------------- +//начало----------------------------------------- LIN 4 ---------------------------------------------------------------- +//начало----------------------------------------- LIN 4 ---------------------------------------------------------------- +//начало----------------------------------------- LIN 4 --------------------------------------------------------------- + +static lin_event_id_t Lin4_Scheduler(tLin4TaskSensor *env) { + lin_event_id_t ret = LIN_NO_EVENT; + + env->d_CCU_Req.CCU_AirQS_Req = 1; + ret = Set_CCU_Req(env->linIo, env->linData, &env->d_CCU_Req); + +#if (LOG_LIN4_ACTUATOR == 1) + if (ret == LIN_TX_COMPLETED) { + LoggerFormatInfo(LOGGER, LOG_SIGN4, "OK Set_CCU_Req = %d", ret) + } else { + LoggerFormatInfo(LOGGER, LOG_SIGN4, "ERROR Set_CCU_Req = %d", ret) + } +#endif + + + ret = Get_AirQS_Stat(env->linIo, env->linData, &env->d_AirQS_Stat); + +#if (LOG_LIN4_ACTUATOR == 1) + + 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", + env->d_AirQS_Stat.AirQS_LinRespErr_Stat, + env->d_AirQS_Stat.AirQS_Sens_Stat, + env->d_AirQS_Stat.AirQS_Combined_Stat, + env->d_AirQS_Stat.AirQS_Err_Stat, + env->d_AirQS_Stat.AirQS_COLvl_Stat, + env->d_AirQS_Stat.AirQS_NOxLvl_Stat, + env->d_AirQS_Stat.AirQS_NH3Lvl_Stat) + } else { + LoggerFormatInfo(LOGGER, LOG_SIGN4, "ERROR Get_AirQS_Stat = %d", ret) + } + +#endif + + return LIN_NO_EVENT; +} + +void Lin_4_Init(tLin4TaskSensor *env, + tLinData *linData, + tLinIO *linIO, + tLoggerInterface *logger) { + + env->linIo = linIO; + env->linData = linData; + env->logger = logger; + env->access = osMutexNew(NULL); + + InitThreadAtrStatic(&env->threadLin.attr, "Ln4", env->threadLin.controlBlock, env->threadLin.stack, + osPriorityNormal); +} + + +static _Noreturn void Lin4_Thread(tLin4TaskSensor *env) { + for (;;) { + + if (osMutexAcquire(env->access, 1000) == osOK) { + + lin_event_id_t res = Lin4_Scheduler(env); + + + osMutexRelease(env->access); + } + + SystemDelayMs(50); + } +} + +void Lin4_StartThread(tLin4TaskSensor *env) { + if (!env->threadLin.id) { + env->threadLin.id = osThreadNew((osThreadFunc_t) (Lin4_Thread), (void *) (env), &env->threadLin.attr); + } +} + +//конец----------------------------------------- LIN 4 ---------------------------------------------------------------- +//конец----------------------------------------- LIN 4 ---------------------------------------------------------------- +//конец----------------------------------------- LIN 4 ---------------------------------------------------------------- +//конец----------------------------------------- LIN 4 ---------------------------------------------------------------- + +//начало----------------------------------------- LIN 5 ---------------------------------------------------------------- +//начало----------------------------------------- LIN 5 ---------------------------------------------------------------- +//начало----------------------------------------- LIN 5 ---------------------------------------------------------------- +//начало----------------------------------------- LIN 5 --------------------------------------------------------------- + +uint8_t led = 0; + +static lin_event_id_t Lin5_Scheduler(tLin5TaskSensor *env) { + lin_event_id_t ret = LIN_NO_EVENT; + + + env->d_CCU_DRS_Req.CCU_DLLed1_Req = led; + ret = Set_CCU_DRS_Req(env->linIo, env->linData, &env->d_CCU_DRS_Req); + + if (led == 0) { + led = 1; + } else { + led = 0; + } + +#if (LOG_LIN5_ACTUATOR == 1) + if (ret == LIN_TX_COMPLETED) { + LoggerFormatInfo(LOGGER, LOG_SIGN5, "OK Set_CCU_DRS_Req = %d", ret) + } else { + LoggerFormatInfo(LOGGER, LOG_SIGN5, "ERROR Set_CCU_DRS_Req = %d", ret) + } +#endif + + + ret = Get_DRS_DL_Stat(env->linIo, env->linData, &env->d_DRS_DL_Stat); + +#if (LOG_LIN5_ACTUATOR == 1) + + if (ret == LIN_RX_COMPLETED) { + LoggerFormatInfo(LOGGER, LOG_SIGN5, + "DRS_DL_Btn_Stat = %d DRS_DL_LinRespErr_Stat = %d DRS_DL_Err_Stat = %d", + env->d_DRS_DL_Stat.DRS_DL_Btn_Stat, + env->d_DRS_DL_Stat.DRS_DL_LinRespErr_Stat, + env->d_DRS_DL_Stat.DRS_DL_Err_Stat + ) + } else { + LoggerFormatInfo(LOGGER, LOG_SIGN5, "ERROR Get_DRS_DL_Stat = %d", ret) + } + +#endif + + return LIN_NO_EVENT; +} + +void Lin_5_Init(tLin5TaskSensor *env, + tLinData *linData, + tLinIO *linIO, + tLoggerInterface *logger) { + + env->linIo = linIO; + env->linData = linData; + env->logger = logger; + env->access = osMutexNew(NULL); + + InitThreadAtrStatic(&env->threadLin.attr, "Ln5", env->threadLin.controlBlock, env->threadLin.stack, + osPriorityNormal); +} + + +static _Noreturn void Lin5_Thread(tLin5TaskSensor *env) { + for (;;) { + + if (osMutexAcquire(env->access, 1000) == osOK) { + + lin_event_id_t res = Lin5_Scheduler(env); + + + osMutexRelease(env->access); + } + + SystemDelayMs(50); + } +} + +void Lin5_StartThread(tLin5TaskSensor *env) { + if (!env->threadLin.id) { + env->threadLin.id = osThreadNew((osThreadFunc_t) (Lin5_Thread), (void *) (env), &env->threadLin.attr); + } +} + +//конец----------------------------------------- LIN 5 ---------------------------------------------------------------- +//конец----------------------------------------- LIN 5 ---------------------------------------------------------------- +//конец----------------------------------------- LIN 5 ---------------------------------------------------------------- +//конец----------------------------------------- LIN 5 ---------------------------------------------------------------- \ No newline at end of file diff --git a/LinSensorTasks.h b/LinSensorTasks.h index 129a305..966f916 100644 --- a/LinSensorTasks.h +++ b/LinSensorTasks.h @@ -10,6 +10,9 @@ #include "LinIO.h" #include "LoggerInterface.h" +#define LOG_LIN4_ACTUATOR 1 +#define LOG_LIN5_ACTUATOR 1 + #define AirQS_Stat 0x14 #define Aroma_Stat 0x5 #define CCU_Req 0x1 @@ -189,4 +192,66 @@ typedef struct __attribute__ ((packed)) { uint8_t DRS_RRB_Err_Stat: 1; // 2 } tDRS_RRB_Stat; + +typedef struct { + + tLinIO *linIo; + osMutexId_t access; + + tLinData *linData; + + tLoggerInterface *logger; + + tCCU_Req d_CCU_Req; + tAirQS_Stat d_AirQS_Stat; + + struct { + osThreadId_t id; + uint32_t stack[1024]; + StaticTask_t controlBlock; + osThreadAttr_t attr; + } threadLin; + + +} tLin4TaskSensor; + + +typedef struct { + + tLinIO *linIo; + osMutexId_t access; + + tLinData *linData; + + tLoggerInterface *logger; + + tDRS_DL_Stat d_DRS_DL_Stat; + tCCU_DRS_Req d_CCU_DRS_Req; + + struct { + osThreadId_t id; + uint32_t stack[1024]; + StaticTask_t controlBlock; + osThreadAttr_t attr; + } threadLin; + + +} tLin5TaskSensor; + + +void Lin_4_Init(tLin4TaskSensor *env, + tLinData *linData, + tLinIO *linIO, + tLoggerInterface *logger); + +void Lin4_StartThread(tLin4TaskSensor *env); + + +void Lin_5_Init(tLin5TaskSensor *env, + tLinData *linData, + tLinIO *linIO, + tLoggerInterface *logger); + +void Lin5_StartThread(tLin5TaskSensor *env); + #endif //HVAC_M7_LINSENSORTASKS_H