From 08dcd5ddb96d683d0dbb8fb8bccb7eecf5f2a42a Mon Sep 17 00:00:00 2001 From: cfif Date: Wed, 24 Dec 2025 13:08:09 +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?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LinTasks.c | 155 ++++++++++++++++++++++++++++++++++++++++++++--------- LinTasks.h | 23 +++----- 2 files changed, 138 insertions(+), 40 deletions(-) diff --git a/LinTasks.c b/LinTasks.c index afc6bec..a2e3aa6 100644 --- a/LinTasks.c +++ b/LinTasks.c @@ -457,11 +457,12 @@ lin_event_id_t CFR_SET_x(tLinIO *linIo, tLinData *linData, uint8_t BUS_ADDRESS, ACT_CFR_SET_->BUS_ADR = BUS_ADDRESS; ACT_CFR_SET_->FINAL_POS = FINAL_POS; - ACT_CFR_SET_->unused = 0x1; - ACT_CFR_SET_->Unused_SET = 0x1; - ACT_CFR_SET_->Stall_SET = Stall_SET; + ACT_CFR_SET_->unused = 1; + + ACT_CFR_SET_->Unused_SET = 0; + ACT_CFR_SET_->Stall_SET = 0;//Stall_SET; ACT_CFR_SET_->Lnoise_SET = Lnoise_SET; - ACT_CFR_SET_->Autos_SET = Autos_SET; + ACT_CFR_SET_->Autos_SET = 0;//Autos_SET; ACT_CFR_SET_->Speed_SET = Speed_SET; ACT_CFR_SET_->Coils_Stop_SET = Coils_Stop_SET; @@ -577,15 +578,29 @@ lin_event_id_t Lin0_Scheduler(tLinTaskActuator *env) { if (env->linCommandActuator[i].COM == LIN_ACT_CFR_MOD) { + LoggerFormatInfo(LOGGER, LOG_SIGN, "Sending a command: LIN_ACT_CFR_MOD (ADR = %d MODE = %d)", + env->linCommandActuator[i].BUS_ADR, + env->linCommandActuator[i].MODE) + ret = CFR_MOD_x(env->linIo, env->linData, env->linCommandActuator[i].BUS_ADR | 0x20, env->linCommandActuator[i].MODE); if (ret == LIN_TX_COMPLETED) { + LoggerFormatInfo(LOGGER, LOG_SIGN, + "Command completed successfully: LIN_ACT_CFR_MOD (ADR = %d MODE = %d)", + env->linCommandActuator[i].BUS_ADR, + env->linCommandActuator[i].MODE) + if (setState20(env, false, i)) break; } else { + + LoggerFormatInfo(LOGGER, LOG_SIGN, "Command failed [%d]: LIN_ACT_CFR_MOD (ADR = %d MODE = %d)", + env->linCommandActuator[i].BUS_ADR, + env->linCommandActuator[i].MODE) + if (setState20(env, true, i)) break; } @@ -598,14 +613,28 @@ lin_event_id_t Lin0_Scheduler(tLinTaskActuator *env) { if (env->linCommandActuator[i].COM == LIN_ACT_CFR_INI) { + LoggerFormatInfo(LOGGER, LOG_SIGN, "Sending a command: LIN_ACT_CFR_INI (ADR = %d POS = %d)", + env->linCommandActuator[i].BUS_ADR, + env->linCommandActuator[i].POS) + ret = CFR_INI_x(env->linIo, env->linData, env->linCommandActuator[i].BUS_ADR | 0x20, env->linCommandActuator[i].POS); if (ret == LIN_TX_COMPLETED) { + + LoggerFormatInfo(LOGGER, LOG_SIGN, + "Command completed successfully: LIN_ACT_CFR_INI (ADR = %d POS = %d)", + env->linCommandActuator[i].BUS_ADR, env->linCommandActuator[i].POS) + if (setState20(env, false, i)) break; } else { + + LoggerFormatInfo(LOGGER, LOG_SIGN, "Command failed: LIN_ACT_CFR_INI (ADR = %d POS = %d)", + env->linCommandActuator[i].BUS_ADR, + env->linCommandActuator[i].POS) + if (setState20(env, true, i)) break; } @@ -618,6 +647,17 @@ lin_event_id_t Lin0_Scheduler(tLinTaskActuator *env) { if (env->linCommandActuator[i].COM == LIN_ACT_CFR_SET) { + LoggerFormatInfo(LOGGER, LOG_SIGN, + "Sending a command: LIN_ACT_CFR_SET (ADR = %d POS = %d STALL= %d LNOISE = %d AUTOS = %d SPEED = %d COILS = %d)", + env->linCommandActuator[i].BUS_ADR, + env->linCommandActuator[i].POS, + env->linCommandActuator[i].Stall_SET, + env->linCommandActuator[i].Lnoise_SET, + env->linCommandActuator[i].Autos_SET, + env->linCommandActuator[i].Speed_SET, + env->linCommandActuator[i].Coils_Stop_SET + ) + ret = CFR_SET_x(env->linIo, env->linData, env->linCommandActuator[i].BUS_ADR | 0x20, env->linCommandActuator[i].POS, @@ -628,9 +668,33 @@ lin_event_id_t Lin0_Scheduler(tLinTaskActuator *env) { env->linCommandActuator[i].Coils_Stop_SET); if (ret == LIN_TX_COMPLETED) { + + LoggerFormatInfo(LOGGER, LOG_SIGN, + "Command completed successfully: LIN_ACT_CFR_SET (ADR = %d POS = %d STALL= %d LNOISE = %d AUTOS = %d SPEED = %d COILS = %d)", + env->linCommandActuator[i].BUS_ADR, + env->linCommandActuator[i].POS, + env->linCommandActuator[i].Stall_SET, + env->linCommandActuator[i].Lnoise_SET, + env->linCommandActuator[i].Autos_SET, + env->linCommandActuator[i].Speed_SET, + env->linCommandActuator[i].Coils_Stop_SET + ) + if (setState20(env, false, i)) break; } else { + + LoggerFormatInfo(LOGGER, LOG_SIGN, + "Command failed: LIN_ACT_CFR_SET (ADR = %d POS = %d STALL= %d LNOISE = %d AUTOS = %d SPEED = %d COILS = %d)", + env->linCommandActuator[i].BUS_ADR, + env->linCommandActuator[i].POS, + env->linCommandActuator[i].Stall_SET, + env->linCommandActuator[i].Lnoise_SET, + env->linCommandActuator[i].Autos_SET, + env->linCommandActuator[i].Speed_SET, + env->linCommandActuator[i].Coils_Stop_SET + ) + if (setState20(env, true, i)) break; } @@ -640,29 +704,33 @@ lin_event_id_t Lin0_Scheduler(tLinTaskActuator *env) { for (uint8_t i = 0; i < LIN0_ISSR_ALL; ++i) { +/* + uint8_t BLOCK_MT; + uint8_t DIAGNOSE_MT; + uint16_t CPOS_2_ALL; -// uint8_t BLOCK_MT; -// uint8_t DIAGNOSE_MT; - uint16_t CPOS_ALL; + ret = ISSR_x(env->linIo, env->linData, + i, + &BLOCK_MT, + &CPOS_2_ALL, + &DIAGNOSE_MT); -// ret = ISSR_x(env->linIo, env->linData, -// i, -// &BLOCK_MT, -// &CPOS_ALL, -// &DIAGNOSE_MT); - -// if (ret == LIN_RX_COMPLETED) { - -// env->linStateActuator[i].BLOCK_MT = BLOCK_MT; -// env->linStateActuator[i].CPOS_ALL = CPOS_ALL << 1; -// env->linStateActuator[i].DIAGNOSE_MT = DIAGNOSE_MT; + if (ret == LIN_RX_COMPLETED) { + env->linStateActuator[i].BLOCK_MT = BLOCK_MT; + env->linStateActuator[i].CPOS_2_ALL = CPOS_2_ALL << 1; + env->linStateActuator[i].DIAGNOSE_MT = DIAGNOSE_MT; + } +*/ // if ((env->linStateActuator[i].DIAGNOSE_MT) || (env->linCommandActuator[i].isRFR_STA)) { - if ((env->linCommandActuator[i].COM == LIN_ACT_CFR_NONE) || (env->linCommandActuator[i].COM == LIN_ACT_CFR_SUCCESSFUL) || (env->linCommandActuator[i].isRFR_STA)) { + 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; + uint16_t CPOS_ALL; eEmrf_Slave_STA Emrf_Slave; eMode_Mod Mode_Slave; uint8_t Error1_Supply_Slave; @@ -693,6 +761,32 @@ lin_event_id_t Lin0_Scheduler(tLinTaskActuator *env) { } if (BUS_ADR < LIN0_ISSR_ALL) { + + if ((env->linStateActuator[BUS_ADR].CPOS_ALL != CPOS_ALL) || + (env->linStateActuator[BUS_ADR].Stall_Slave != Stall_Slave) || + (env->linStateActuator[BUS_ADR].Emrf_Slave != Emrf_Slave) || + (env->linStateActuator[BUS_ADR].Mode_Slave != Mode_Slave) || + (env->linStateActuator[BUS_ADR].Error1_Supply_Slave != Error1_Supply_Slave) || + (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)) { + + LoggerFormatInfo(LOGGER, LOG_SIGN, + "State: ADR = %d CPOS = %d Stall = %d Emrf = %d Mode = %d Err1 = %d Err2 = %d Err3 = %d Err4 = %d", + BUS_ADR, + CPOS_ALL, + Stall_Slave, + Emrf_Slave, + Mode_Slave, + Error1_Supply_Slave, + Error2_Communication_Slave, + Error3_Temperature_Slave, + Error4_Permanent_Electrical_Slave + ) + + } + env->linStateActuator[BUS_ADR].CPOS_ALL = CPOS_ALL; env->linStateActuator[BUS_ADR].Emrf_Slave = Emrf_Slave; env->linStateActuator[BUS_ADR].Mode_Slave = Mode_Slave; @@ -703,8 +797,15 @@ lin_event_id_t Lin0_Scheduler(tLinTaskActuator *env) { if (env->linStateActuator[BUS_ADR].Stall_Slave == LIN_STALL_STA_OFF) { env->linStateActuator[BUS_ADR].Stall_Slave = Stall_Slave; + + if (Stall_Slave == LIN_STALL_STA_ON) { + LoggerFormatInfo(LOGGER, LOG_SIGN, "Detect STALL: (ADR = %d POS = %d)", + BUS_ADR, + CPOS_ALL) + } } + env->linStateActuator[BUS_ADR].Reset_Slave = Reset_Slave; // LoggerFormatInfo(LOGGER, LOG_SIGN, "BUS_ADR = %d, CPOS_ALL = %d, Stall_Slave = %d", BUS_ADR, @@ -741,7 +842,9 @@ bool setBusy(tLinTaskActuator *env) { for (uint8_t i = 0; i < LIN0_ISSR_ALL; ++i) { - if (env->linCommandActuator[i].COM != LIN_ACT_CFR_NONE) { + if ((env->linCommandActuator[i].COM != LIN_ACT_CFR_NONE) && + (env->linCommandActuator[i].COM != LIN_ACT_CFR_SUCCESSFUL)) { + env->busy = true; return true; } @@ -750,24 +853,28 @@ bool setBusy(tLinTaskActuator *env) { return false; } -void resetStall(tLinTaskActuator *env) { +void resetStall(tLinTaskActuator *env, uint8_t *dataLocalStall) { for (uint8_t i = 0; i < LIN0_ISSR_ALL; ++i) { - if (env->linCommandActuator[i].COM == LIN_ACT_CFR_SET) { +// if (env->linCommandActuator[i].COM == LIN_ACT_CFR_SET) { + + LoggerInfoStatic(LOGGER, LOG_SIGN, "Reset STALL") env->linStateActuator[i].Stall_Slave = LIN_STALL_STA_OFF; + dataLocalStall[i] = LIN_STALL_STA_OFF; if (env->linCommandActuator[i].BUS_ADR == 0) { for (uint8_t j = 0; j < LIN0_ISSR_ALL; ++j) { env->linStateActuator[j].Stall_Slave = LIN_STALL_STA_OFF; + dataLocalStall[j] = LIN_STALL_STA_OFF; } return; } - } + // } } } @@ -795,7 +902,7 @@ static _Noreturn void Lin0_Thread(tLinTaskActuator *env) { osMutexRelease(env->access); } - SystemDelayMs(500); + SystemDelayMs(50); } } diff --git a/LinTasks.h b/LinTasks.h index 24bb8ff..08cada4 100644 --- a/LinTasks.h +++ b/LinTasks.h @@ -98,14 +98,19 @@ typedef enum { typedef struct __attribute__ ((packed)) { uint8_t BUS_ADR; + uint16_t FINAL_POS: 15; uint8_t unused: 1; + uint8_t Unused_SET: 1; eStall_SET Stall_SET: 1; eLnoise_SET Lnoise_SET: 1; eAutos_SET Autos_SET: 1; eSpeed_SET Speed_SET: 2; eCoils_Stop_SET Coils_Stop_SET: 2; + + + } ACT_CFR_SET; // Using this service the master can switch an actuator to a needed functional mode. @@ -369,6 +374,7 @@ typedef struct { uint8_t BLOCK_MT; uint8_t DIAGNOSE_MT; + uint16_t CPOS_2_ALL; uint16_t CPOS_ALL; eEmrf_Slave_STA Emrf_Slave; @@ -395,21 +401,6 @@ typedef struct { } tLinStateFullActuator; -typedef struct { - - uint16_t CPOS_ALL; - eEmrf_Slave_STA Emrf_Slave; - eMode_Mod Mode_Slave; - uint8_t Error1_Supply_Slave; - uint8_t Error2_Communication_Slave; - uint8_t Error3_Temperature_Slave; - uint8_t Error4_Permanent_Electrical_Slave; - eStall_STA Stall_Slave; - eReset_STA Reset_Slave; - - -} tLinStateActuator; - // POS - Позиция // BUS_ADR - (3 бита [7..5] - Группа; 5 бит [4..0] - Адрес) @@ -483,7 +474,7 @@ void Lin0_StartThread(tLinTaskActuator *env); void GetLin0CallbackHandler(tLinData *env, uint8_t u8LinIndex, void *state); -void resetStall(tLinTaskActuator *env); +void resetStall(tLinTaskActuator *env, uint8_t *dataLocalStall); bool setBusy(tLinTaskActuator *env);