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