diff --git a/LinTasks.c b/LinTasks.c index eacdbac..0e7fcba 100644 --- a/LinTasks.c +++ b/LinTasks.c @@ -537,6 +537,31 @@ void Lin_0_Init(tLinTaskActuator *env, } +static bool setState20(tLinTaskActuator *env, bool isError, uint8_t index) { + + if (isError) { + env->linStateActuator[index].error_connect = 1; + } else { + env->linStateActuator[index].error_connect = 0; + } + + 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; + + if (isError) { + env->linStateActuator[j].error_connect = 1; + } else { + env->linStateActuator[j].error_connect = 0; + } + } + return true; + } + + return false; +} + + lin_event_id_t Lin0_Scheduler(tLinTaskActuator *env) { lin_event_id_t ret; @@ -558,26 +583,18 @@ lin_event_id_t Lin0_Scheduler(tLinTaskActuator *env) { env->linCommandActuator[j].isRFR_STA = 1; } - break; } } else { - env->linStateActuator[i].error_connect = 1; - - if (env->linCommandActuator[i].BUS_ADR == 0x20) { - for (uint8_t j = 0; j < LIN0_ISSR_ALL; ++j) { - env->linStateActuator[j].error_connect = 1; - } - } - -// return ret; + if (setState20(env, true, i)) + break; } - if (env->linCommandActuator[i].BUS_ADR == 0x20) { + if (setState20(env, false, i)) break; - } } + } for (uint8_t i = 0; i < LIN0_ISSR_ALL; ++i) { @@ -590,19 +607,12 @@ lin_event_id_t Lin0_Scheduler(tLinTaskActuator *env) { if (ret == LIN_TX_COMPLETED) { } else { - env->linStateActuator[i].error_connect = 1; - - if (env->linCommandActuator[i].BUS_ADR == 0x20) { - for (uint8_t j = 0; j < LIN0_ISSR_ALL; ++j) { - env->linStateActuator[j].error_connect = 1; - } - } -// return ret; + if (setState20(env, true, i)) + break; } - if (env->linCommandActuator[i].BUS_ADR == 0x20) { + if (setState20(env, false, i)) break; - } } } @@ -622,19 +632,12 @@ lin_event_id_t Lin0_Scheduler(tLinTaskActuator *env) { if (ret == LIN_TX_COMPLETED) { } else { - env->linStateActuator[i].error_connect = 1; - - if (env->linCommandActuator[i].BUS_ADR == 0x20) { - for (uint8_t j = 0; j < LIN0_ISSR_ALL; ++j) { - env->linStateActuator[j].error_connect = 1; - } - } -// return ret; + if (setState20(env, true, i)) + break; } - if (env->linCommandActuator[i].BUS_ADR == 0x20) { + if (setState20(env, false, i)) break; - } } } @@ -709,7 +712,6 @@ lin_event_id_t Lin0_Scheduler(tLinTaskActuator *env) { } else { env->linStateActuator[i].error_connect = 1; -// return ret; } @@ -717,7 +719,6 @@ lin_event_id_t Lin0_Scheduler(tLinTaskActuator *env) { } else { env->linStateActuator[i].error_connect = 1; -// return ret; } } @@ -730,300 +731,24 @@ lin_event_id_t Lin0_Scheduler(tLinTaskActuator *env) { return LIN_NO_EVENT; } - -/* -lin_event_id_t Lin0_Scheduler(tLinTaskActuator *env) { - - lin_event_id_t ret; - - - ret = CFR_MOD_x(env->linIo, env->linData, - 0x20, - LIN_MODE_STOP); - - - if (ret == LIN_TX_COMPLETED) { - asm("nop"); - } - - - ret = CFR_INI_x(env->linIo, env->linData, - 0x20, - 6000); - - if (ret == LIN_TX_COMPLETED) { - asm("nop"); - } - - ret = CFR_MOD_x(env->linIo, env->linData, - 0x20, - LIN_MODE_NORMAL); - - - if (ret == LIN_TX_COMPLETED) { - asm("nop"); - } - - asm("nop"); - - - - - - ret = DFR_STA_x(env->linIo, env->linData, 0x27); - - 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, - &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) { - asm("nop"); - } else { - asm("nop"); - } - - -//asm("nop"); - - - ret = CFR_SET_x(env->linIo, env->linData, - 0x27, - 0, - 1, - 0, - 0, - 0, - 0); - - if (ret == LIN_TX_COMPLETED) { - asm("nop"); - } - - asm("nop"); - - ret = ISSR_x(env->linIo, env->linData, - 7, - &env->linStateActuator[7].BLOCK_MT, - &env->linStateActuator[7].CPOS_ALL, - &env->linStateActuator[7].DIAGNOSE_MT); - - if (ret == LIN_RX_COMPLETED) { - asm("nop"); - } - - uint8_t BUS_ADR; - uint8_t IDE_ref; - uint8_t IDE_Sup; - uint8_t IDE_Har; - - ret = DFR_IDE_x(env->linIo, env->linData, 7); - - if (ret == LIN_TX_COMPLETED) { - asm("nop"); - } - - ret = RFR_IDE_x(env->linIo, env->linData, - &BUS_ADR, - &IDE_ref, - &IDE_Sup, - &IDE_Har); - - if (ret == LIN_RX_COMPLETED) { - asm("nop"); - } - - asm("nop"); - - - ret = ISSR_x(env->linIo, env->linData, - 7, - &env->linStateActuator[7].BLOCK_MT, - &env->linStateActuator[7].CPOS_ALL, - &env->linStateActuator[7].DIAGNOSE_MT); - - if (ret == LIN_RX_COMPLETED) { - - if ((env->linStateActuator[7].DIAGNOSE_MT) || (env->linCommandActuator[7].isRFR_STA)) { - - env->linCommandActuator[7].isRFR_STA = 0; - - ret = DFR_STA_x(env->linIo, env->linData, 7); - - 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, - &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 (BUS_ADR != 7) { - 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"); - } - - - } else { - asm("nop"); - //return ret; - } - } - - } else { - asm("nop"); - //return ret; - } - - } else { - asm("nop"); - //return ret; - } - - - uint8_t BUS_ADR; - uint8_t IDE_ref; - uint8_t IDE_Sup; - uint8_t IDE_Har; - - ret = DFR_IDE_x(env->linIo, env->linData,7); - ret = RFR_IDE_x(env->linIo, env->linData, - &BUS_ADR, - &IDE_ref, - &IDE_Sup, - &IDE_Har); - - - ret = CFR_INI_x(env->linIo, env->linData, - 0x20, - 0); - - - ret = ISSR_x(env->linIo, env->linData, - 7, - &env->linStateActuator[7].BLOCK_MT, - &env->linStateActuator[7].CPOS_ALL, - &env->linStateActuator[7].DIAGNOSE_MT); - - - ret = DFR_PRG_x(env->linIo, env->linData, 7); - - 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, - &BUS_NEW_ADR, - &NOTL_DREH_Master, - &NOTL_ENAB_Master, - &DREH_Slave, - &ParitySlave, - &Version_CFR); - - - for (uint8_t i = 0; i < 31; ++i) { - - ret = DFR_STA_x(env->linIo, env->linData, i); - - 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, - &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) { - asm("nop"); - } else { - asm("nop"); - } - } - - if ((ret == LIN_TX_COMPLETED) || (ret == LIN_RX_COMPLETED)) { - - } else { - return ret; - } - - return LIN_NO_EVENT; -} -*/ static _Noreturn void Lin0_Thread(tLinTaskActuator *env) { for (;;) { + if (osMutexAcquire(env->access, 100) == osOK) { lin_event_id_t res = Lin0_Scheduler(env); - env->errorConnect = res; + + uint8_t isError = 0; + for (uint8_t i = 0; i < LIN0_ISSR_ALL; ++i) { + if (env->linStateActuator[i].error_connect == 1) + ++isError; + } + + if (isError == LIN0_ISSR_ALL) { + env->error_connect = 1; + } else { + env->error_connect = 0; + } + osMutexRelease(env->access); } diff --git a/LinTasks.h b/LinTasks.h index cd6bdb8..d65cd0c 100644 --- a/LinTasks.h +++ b/LinTasks.h @@ -452,7 +452,7 @@ typedef struct { osMutexId_t access; uint8_t busy; // Устройство занято - uint8_t errorConnect; // Ошибка соединения (устройство не отвечает) + uint8_t error_connect; // Ошибка соединения (устройство не отвечает) tLinStateFullActuator linStateActuator[9]; tLinCommandActuator linCommandActuator[9];