// // Created by cfif on 12.02.2026. // #include #include "LinSensorTasks.h" #include "CmsisRtosThreadUtils.h" #include "CanPorts.h" #include "fc7xxx_driver_lin.h" #include "Lins.h" #include "LoggerInterface.h" #include "memory.h" #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) { lin_event_id_t res = linIo->runCommand(linIo->env, COM_ADR, 40); SystemDelayMs(30); 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; tAirQS_Stat *tAirQS_Stat_ = (tAirQS_Stat *) linData->g_aRxBuffer; uint8_t retry = 3; while (retry) { linData->direction = LIN_DIRECTION_GET; linData->g_aTxBufferLen = 0; linData->g_aRxBufferLen = sizeof(tAirQS_Stat); res = SEND_SENSOR_COM_x(linIo, AirQS_Stat); if (res == LIN_RX_COMPLETED) { memcpy(p_AirQS_Stat, tAirQS_Stat_, sizeof(tAirQS_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(1000); } } 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 --------------------------------------------------------------- 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; } */ static lin_event_id_t Get_DRS_Stat(tLinIO *linIo, tLinData *linData, tDRS_Stat *p_tDRS_Stat, uint8_t DRS_stat) { lin_event_id_t res; tDRS_Stat *tDRS_Stat_ = (tDRS_Stat *) linData->g_aRxBuffer; uint8_t retry = 3; while (retry) { linData->direction = LIN_DIRECTION_GET; linData->g_aTxBufferLen = 0; linData->g_aRxBufferLen = sizeof(tDRS_Stat); res = SEND_SENSOR_COM_x(linIo, DRS_stat); if (res == LIN_RX_COMPLETED) { memcpy(p_tDRS_Stat, tDRS_Stat_, sizeof(tDRS_Stat)); break; } --retry; } return res; } static lin_event_id_t Lin5_Scheduler(tLin5TaskSensor *env) { lin_event_id_t ret = LIN_NO_EVENT; static uint32_t step = 0; /* // ---------------------------------------- d_DRS_DL_Stat ---------------------------------------------------------- ret = Get_DRS_Stat(env->linIo, env->linData, &env->d_DRS_DL_Stat, 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_Btn_Stat, env->d_DRS_DL_Stat.DRS_LinRespErr_Stat, env->d_DRS_DL_Stat.DRS_Err_Stat ) } else { LoggerFormatInfo(LOGGER, LOG_SIGN5, "ERROR Get_DRS_DL_Stat = %d", ret) } #endif // ---------------------------------------- d_DRS_DR_Stat ---------------------------------------------------------- ret = Get_DRS_Stat(env->linIo, env->linData, &env->d_DRS_DR_Stat, DRS_DR_Stat); #if (LOG_LIN5_ACTUATOR == 1) if (ret == LIN_RX_COMPLETED) { LoggerFormatInfo(LOGGER, LOG_SIGN5, "DRS_DR_Btn_Stat = %d DRS_DR_LinRespErr_Stat = %d DRS_DR_Err_Stat = %d", env->d_DRS_DR_Stat.DRS_Btn_Stat, env->d_DRS_DR_Stat.DRS_LinRespErr_Stat, env->d_DRS_DR_Stat.DRS_Err_Stat ) } else { LoggerFormatInfo(LOGGER, LOG_SIGN5, "ERROR Get_DRS_DR_Stat = %d", ret) } #endif // ---------------------------------------- d_DRS_FCL_Stat ---------------------------------------------------------- ret = Get_DRS_Stat(env->linIo, env->linData, &env->d_DRS_FCL_Stat, DRS_FCL_Stat); #if (LOG_LIN5_ACTUATOR == 1) if (ret == LIN_RX_COMPLETED) { LoggerFormatInfo(LOGGER, LOG_SIGN5, "DRS_FCL_Btn_Stat = %d DRS_FCL_LinRespErr_Stat = %d DRS_FCL_Err_Stat = %d", env->d_DRS_FCL_Stat.DRS_Btn_Stat, env->d_DRS_FCL_Stat.DRS_LinRespErr_Stat, env->d_DRS_FCL_Stat.DRS_Err_Stat ) } else { LoggerFormatInfo(LOGGER, LOG_SIGN5, "ERROR Get_DRS_FCL_Stat = %d", ret) } #endif // ---------------------------------------- d_DRS_FCR_Stat ---------------------------------------------------------- ret = Get_DRS_Stat(env->linIo, env->linData, &env->d_DRS_FCR_Stat, DRS_FCR_Stat); #if (LOG_LIN5_ACTUATOR == 1) if (ret == LIN_RX_COMPLETED) { LoggerFormatInfo(LOGGER, LOG_SIGN5, "DRS_FCR_Btn_Stat = %d DRS_FCR_LinRespErr_Stat = %d DRS_FCR_Err_Stat = %d", env->d_DRS_FCR_Stat.DRS_Btn_Stat, env->d_DRS_FCR_Stat.DRS_LinRespErr_Stat, env->d_DRS_FCR_Stat.DRS_Err_Stat ) } else { LoggerFormatInfo(LOGGER, LOG_SIGN5, "ERROR Get_DRS_FCR_Stat = %d", ret) } #endif */ // ---------------------------------------- d_DRS_FPL_Stat ---------------------------------------------------------- ret = Get_DRS_Stat(env->linIo, env->linData, &env->d_DRS_FPL_Stat, DRS_FPL_Stat); if (env->d_DRS_FPL_Stat.DRS_Btn_Stat) { step = 0; } #if (LOG_LIN5_ACTUATOR == 1) if (ret == LIN_RX_COMPLETED) { LoggerFormatInfo(LOGGER, LOG_SIGN5, "DRS_FPL_Btn_Stat = %d DRS_FPL_LinRespErr_Stat = %d DRS_FPL_Err_Stat = %d", env->d_DRS_FPL_Stat.DRS_Btn_Stat, env->d_DRS_FPL_Stat.DRS_LinRespErr_Stat, env->d_DRS_FPL_Stat.DRS_Err_Stat ) } else { LoggerFormatInfo(LOGGER, LOG_SIGN5, "ERROR Get_DRS_FPL_Stat = %d", ret) } #endif /* // ---------------------------------------- d_DRS_FPR_Stat ---------------------------------------------------------- ret = Get_DRS_Stat(env->linIo, env->linData, &env->d_DRS_FPR_Stat, DRS_FPR_Stat); #if (LOG_LIN5_ACTUATOR == 1) if (ret == LIN_RX_COMPLETED) { LoggerFormatInfo(LOGGER, LOG_SIGN5, "DRS_FPR_Btn_Stat = %d DRS_FPR_LinRespErr_Stat = %d DRS_FPR_Err_Stat = %d", env->d_DRS_FPR_Stat.DRS_Btn_Stat, env->d_DRS_FPR_Stat.DRS_LinRespErr_Stat, env->d_DRS_FPR_Stat.DRS_Err_Stat ) } else { LoggerFormatInfo(LOGGER, LOG_SIGN5, "ERROR Get_DRS_FPR_Stat = %d", ret) } #endif // ---------------------------------------- d_DRS_RLB_Stat ---------------------------------------------------------- ret = Get_DRS_Stat(env->linIo, env->linData, &env->d_DRS_RLB_Stat, DRS_RLB_Stat); #if (LOG_LIN5_ACTUATOR == 1) if (ret == LIN_RX_COMPLETED) { LoggerFormatInfo(LOGGER, LOG_SIGN5, "DRS_RLB_Btn_Stat = %d DRS_RLB_LinRespErr_Stat = %d DRS_RLB_Err_Stat = %d", env->d_DRS_RLB_Stat.DRS_Btn_Stat, env->d_DRS_RLB_Stat.DRS_LinRespErr_Stat, env->d_DRS_RLB_Stat.DRS_Err_Stat ) } else { LoggerFormatInfo(LOGGER, LOG_SIGN5, "ERROR Get_DRS_RLB_Stat = %d", ret) } #endif // ---------------------------------------- d_DRS_RRB_Stat ---------------------------------------------------------- ret = Get_DRS_Stat(env->linIo, env->linData, &env->d_DRS_RRB_Stat, DRS_RRB_Stat); #if (LOG_LIN5_ACTUATOR == 1) if (ret == LIN_RX_COMPLETED) { LoggerFormatInfo(LOGGER, LOG_SIGN5, "DRS_RRB_Btn_Stat = %d DRS_RRB_LinRespErr_Stat = %d DRS_RRB_Err_Stat = %d", env->d_DRS_RRB_Stat.DRS_Btn_Stat, env->d_DRS_RRB_Stat.DRS_LinRespErr_Stat, env->d_DRS_RRB_Stat.DRS_Err_Stat ) } else { LoggerFormatInfo(LOGGER, LOG_SIGN5, "ERROR Get_DRS_RRB_Stat = %d", ret) } #endif */ if (step <= 3) { uint8_t led1 = 0; uint8_t led2 = 0; uint8_t led3 = 0; ++step; if (step == 1) { led1 = 1; led2 = 0; led3 = 0; } if (step == 2) { led1 = 0; led2 = 1; led3 = 0; } if (step == 3) { led1 = 0; led2 = 0; led3 = 1; } if (step == 4) { led1 = 0; led2 = 0; led3 = 0; } env->d_CCU_DRS_Req.CCU_FPLLed1_Req = led1; env->d_CCU_DRS_Req.CCU_FPLLed2_Req = led2; env->d_CCU_DRS_Req.CCU_FPLLed3_Req = led3; env->d_CCU_DRS_Req.BCM_SwIndIntens_Stat = 0; env->d_CCU_DRS_Req.BCM_IndFadingTime_Req = 2; ret = Set_CCU_DRS_Req(env->linIo, env->linData, &env->d_CCU_DRS_Req); #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 SystemDelayMs(50); } 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(10); } } 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 ----------------------------------------------------------------