diff --git a/LinTasks.c b/LinTasks.c index 6272640..7a32a20 100644 --- a/LinTasks.c +++ b/LinTasks.c @@ -541,9 +541,13 @@ static bool setState20(tLinTaskActuator *env, bool isError, uint8_t index) { env->linStateActuator[index].error_connect = 0; } + env->linCommandActuator[index].isRFR_STA = 1; + if (env->linCommandActuator[index].BUS_ADR == 0x20) { for (uint8_t j = 0; j < LIN0_ISSR_ALL; ++j) { + env->linCommandActuator[j].COM = LIN_ACT_CFR_NONE; + env->linCommandActuator[j].isRFR_STA = 1; if (isError) { env->linStateActuator[j].error_connect = 1; @@ -564,8 +568,6 @@ lin_event_id_t Lin0_Scheduler(tLinTaskActuator *env) { for (uint8_t i = 0; i < LIN0_ISSR_ALL; ++i) { - env->linCommandActuator[i].isRFR_STA = 1; - if (env->linCommandActuator[i].COM == LIN_ACT_CFR_MOD) { ret = CFR_MOD_x(env->linIo, env->linData, env->linCommandActuator[i].BUS_ADR, @@ -573,22 +575,14 @@ lin_event_id_t Lin0_Scheduler(tLinTaskActuator *env) { if (ret == LIN_TX_COMPLETED) { - if (env->linCommandActuator[i].BUS_ADR == 0x20) { - - for (uint8_t j = 0; j < LIN0_ISSR_ALL; ++j) { - env->linCommandActuator[j].isRFR_STA = 1; - } - - } + if (setState20(env, false, i)) + break; } else { if (setState20(env, true, i)) break; } - if (setState20(env, false, i)) - break; - } } @@ -602,13 +596,13 @@ lin_event_id_t Lin0_Scheduler(tLinTaskActuator *env) { env->linCommandActuator[i].POS); if (ret == LIN_TX_COMPLETED) { + if (setState20(env, false, i)) + break; } else { if (setState20(env, true, i)) break; } - if (setState20(env, false, i)) - break; } } @@ -627,95 +621,95 @@ lin_event_id_t Lin0_Scheduler(tLinTaskActuator *env) { env->linCommandActuator[i].Coils_Stop_SET); if (ret == LIN_TX_COMPLETED) { + if (setState20(env, false, i)) + break; } else { if (setState20(env, true, i)) break; } - if (setState20(env, false, i)) - break; - } } for (uint8_t i = 0; i < LIN0_ISSR_ALL; ++i) { - uint8_t BLOCK_MT; - uint8_t DIAGNOSE_MT; +// uint8_t BLOCK_MT; +// uint8_t DIAGNOSE_MT; uint16_t CPOS_ALL; - ret = ISSR_x(env->linIo, env->linData, - i, - &BLOCK_MT, - &CPOS_ALL, - &DIAGNOSE_MT); +// ret = ISSR_x(env->linIo, env->linData, +// i, +// &BLOCK_MT, +// &CPOS_ALL, +// &DIAGNOSE_MT); - if (ret == LIN_RX_COMPLETED) { +// 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; +// env->linStateActuator[i].BLOCK_MT = BLOCK_MT; +// env->linStateActuator[i].CPOS_ALL = CPOS_ALL << 1; +// env->linStateActuator[i].DIAGNOSE_MT = DIAGNOSE_MT; - if ((env->linStateActuator[i].DIAGNOSE_MT) || (env->linCommandActuator[i].isRFR_STA)) { +// if ((env->linStateActuator[i].DIAGNOSE_MT) || (env->linCommandActuator[i].isRFR_STA)) { + if ((env->linCommandActuator[i].COM == LIN_ACT_CFR_NONE) || (env->linCommandActuator[i].isRFR_STA)) { - env->linCommandActuator[i].isRFR_STA = 0; + env->linCommandActuator[i].isRFR_STA = 0; - uint8_t BUS_ADR; - 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; + uint8_t BUS_ADR; + 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; - ret = RFR_STA_x(env->linIo, env->linData, i | 0x20, - &BUS_ADR, - &CPOS_ALL, - &Emrf_Slave, - &Mode_Slave, - &Error1_Supply_Slave, - &Error2_Communication_Slave, - &Error3_Temperature_Slave, - &Error4_Permanent_Electrical_Slave, - &Stall_Slave, - &Reset_Slave); + ret = RFR_STA_x(env->linIo, env->linData, i | 0x20, + &BUS_ADR, + &CPOS_ALL, + &Emrf_Slave, + &Mode_Slave, + &Error1_Supply_Slave, + &Error2_Communication_Slave, + &Error3_Temperature_Slave, + &Error4_Permanent_Electrical_Slave, + &Stall_Slave, + &Reset_Slave); - if (ret == LIN_RX_COMPLETED) { + if (ret == LIN_RX_COMPLETED) { - BUS_ADR &= 0x1F; - - if (BUS_ADR != i) { - asm("nop"); - } - - if (BUS_ADR < LIN0_ISSR_ALL) { - env->linStateActuator[BUS_ADR].CPOS_ALL = CPOS_ALL; - 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; - env->linStateActuator[BUS_ADR].Stall_Slave = Stall_Slave; - env->linStateActuator[BUS_ADR].Reset_Slave = Reset_Slave; - } else { - asm("nop"); - } + BUS_ADR &= 0x1F; + if (BUS_ADR != i) { + asm("nop"); + } + if (BUS_ADR < LIN0_ISSR_ALL) { + env->linStateActuator[BUS_ADR].CPOS_ALL = CPOS_ALL; + 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; + env->linStateActuator[BUS_ADR].Stall_Slave = Stall_Slave; + env->linStateActuator[BUS_ADR].Reset_Slave = Reset_Slave; } else { - env->linStateActuator[i].error_connect = 1; + asm("nop"); } + } else { + env->linStateActuator[i].error_connect = 1; } - } else { - env->linStateActuator[i].error_connect = 1; + } + +// } else { +// env->linStateActuator[i].error_connect = 1; +// } } if ((ret == LIN_TX_COMPLETED) || (ret == LIN_RX_COMPLETED)) { @@ -727,6 +721,19 @@ lin_event_id_t Lin0_Scheduler(tLinTaskActuator *env) { return LIN_NO_EVENT; } +static void isEnterCommand(tLinTaskActuator *env) { + + for (uint8_t j = 0; j < 5; ++j) { + for (uint8_t i = 0; i < LIN0_ISSR_ALL; ++i) { + if (env->linCommandActuator[i].COM != LIN_ACT_CFR_NONE) { + return; + } + } + SystemDelayMs(100); + } + +} + static _Noreturn void Lin0_Thread(tLinTaskActuator *env) { for (;;) { @@ -748,7 +755,7 @@ static _Noreturn void Lin0_Thread(tLinTaskActuator *env) { osMutexRelease(env->access); } - SystemDelayMs(100); + isEnterCommand(env); } } diff --git a/LinTasks.h b/LinTasks.h index 6a3027b..7add588 100644 --- a/LinTasks.h +++ b/LinTasks.h @@ -6,8 +6,10 @@ #define HVAC_LIN_TASKS_H #include +#include "stdbool.h" #include "LinIO.h" + typedef struct __attribute__ ((packed)) { uint8_t BUS_ADR; uint16_t INI_CPOS: 15;