diff --git a/LinTasks.c b/LinTasks.c index ff04178..a1a5403 100644 --- a/LinTasks.c +++ b/LinTasks.c @@ -127,6 +127,8 @@ lin_event_id_t DFR_PRG_x(tLinIO *linIo, tLinData *linData, res = SEND_ACTUATOR_COM_x(linIo, DFR_PRG); + SystemDelayMs(50); + if (res == LIN_TX_COMPLETED) { break; } @@ -607,14 +609,36 @@ lin_event_id_t Lin0_Scheduler(tLinTaskActuator *env) { uint8_t BUS_ADR; + uint8_t BUS_NEW_ADR; + uint8_t NOTL_DREH_Master; + uint8_t NOTL_ENAB_Master; + uint8_t DREH_Slave; + uint8_t ParitySlave; + uint8_t Version_CFR; + ret = RFR_PRG_x(env->linIo, env->linData, &BUS_ADR, - &env->linStateActuator[i].BUS_NEW_ADR, - &env->linStateActuator[i].NOTL_DREH_Master, - &env->linStateActuator[i].NOTL_ENAB_Master, - &env->linStateActuator[i].DREH_Slave, - &env->linStateActuator[i].ParitySlave, - &env->linStateActuator[i].Version_CFR); + &BUS_NEW_ADR, + &NOTL_DREH_Master, + &NOTL_ENAB_Master, + &DREH_Slave, + &ParitySlave, + &Version_CFR); + + if (BUS_ADR != i) { + asm("nop"); + } + + if (BUS_ADR < LIN0_ISSR_ALL) { + env->linStateActuator[BUS_ADR].BUS_NEW_ADR = BUS_NEW_ADR; + env->linStateActuator[BUS_ADR].NOTL_DREH_Master = NOTL_DREH_Master; + env->linStateActuator[BUS_ADR].NOTL_ENAB_Master = NOTL_ENAB_Master; + env->linStateActuator[BUS_ADR].DREH_Slave = DREH_Slave; + env->linStateActuator[BUS_ADR].ParitySlave = ParitySlave; + env->linStateActuator[BUS_ADR].Version_CFR = Version_CFR; + } else { + asm("nop"); + } if (ret == LIN_TX_COMPLETED) { @@ -636,6 +660,7 @@ lin_event_id_t Lin0_Scheduler(tLinTaskActuator *env) { lin_event_id_t res; for (uint8_t i = 0; i < LIN0_ISSR_ALL; ++i) { + res = ISSR_x(env->linIo, env->linData, i, &env->linStateActuator[i].BLOCK_MT, @@ -647,17 +672,45 @@ lin_event_id_t Lin0_Scheduler(tLinTaskActuator *env) { if (ret == LIN_TX_COMPLETED) { uint8_t BUS_ADR; + 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; + ret = RFR_STA_x(env->linIo, env->linData, &BUS_ADR, - &env->linStateActuator[i].CPOS_ALL, - &env->linStateActuator[i].Emrf_Slave, - &env->linStateActuator[i].Mode_Slave, - &env->linStateActuator[i].Error1_Supply_Slave, - &env->linStateActuator[i].Error2_Communication_Slave, - &env->linStateActuator[i].Error3_Temperature_Slave, - &env->linStateActuator[i].Error4_Permanent_Electrical_Slave, - &env->linStateActuator[i].Stall_Slave, - &env->linStateActuator[i].Reset_Slave); + &CPOS_ALL, + &Emrf_Slave, + &Mode_Slave, + &Error1_Supply_Slave, + &Error2_Communication_Slave, + &Error3_Temperature_Slave, + &Error4_Permanent_Electrical_Slave, + &Stall_Slave, + &Reset_Slave); + + 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"); + } if (ret == LIN_RX_COMPLETED) { @@ -677,12 +730,14 @@ lin_event_id_t Lin0_Scheduler(tLinTaskActuator *env) { return ret; } + return LIN_NO_EVENT; } static _Noreturn void Lin0_Thread(tLinTaskActuator *env) { for (;;) { if (osMutexAcquire(env->access, 100) == osOK) { - Lin0_Scheduler(env); + lin_event_id_t res = Lin0_Scheduler(env); + env->errorConnect = res; osMutexRelease(env->access); }