diff --git a/LinTasks.c b/LinTasks.c index c959034..5440f9c 100644 --- a/LinTasks.c +++ b/LinTasks.c @@ -109,6 +109,69 @@ static lin_event_id_t SEND_ACTUATOR_COM_x(tLinTaskActuator *env, uint8_t COM_ADR } +lin_event_id_t DFR_PRG_x(tLinTaskActuator *env, uint8_t BUS_ADR) { + lin_event_id_t res; + + env->linData->direction = LIN_DIRECTION_SET; + env->linData->g_aTxBufferLen = sizeof(ACT_DFR_PRG); + env->linData->g_aRxBufferLen = 0; + + ACT_DFR_PRG *ACT_DFR_PRG_ = (ACT_DFR_PRG *) env->linData->g_aTxBuffer; + ACT_DFR_PRG_->BUS_ADR = BUS_ADR; + ACT_DFR_PRG_->Data1_DFR_PRG = 0xFF; + + uint8_t retry = 3; + + while (retry) { + + res = SEND_ACTUATOR_COM_x(env->linIo->env, DFR_PRG); + + if (res == LIN_TX_COMPLETED) { + break; + } + + --retry; + } + + return res; +} + +lin_event_id_t RFR_PRG_x(tLinTaskActuator *env, uint8_t BUS_ADR) { + lin_event_id_t res; + + env->linData->direction = LIN_DIRECTION_GET; + + env->linData->g_aTxBufferLen = 0; + env->linData->g_aRxBufferLen = sizeof(ACT_RFR_PRG); + + ACT_RFR_PRG *ACT_RFR_PRG_ = (ACT_RFR_PRG *) env->linData->g_aRxBuffer; + + uint8_t retry = 3; + + while (retry) { + + res = SEND_ACTUATOR_COM_x(env->linIo->env, RFR_PRG); + + if (res == LIN_RX_COMPLETED) { + + env->linStateActuator[BUS_ADR].BUS_NEW_ADR = ACT_RFR_PRG_->BUS_NEW_ADR; + env->linStateActuator[BUS_ADR].NOTL_DREH_Master = ACT_RFR_PRG_->NOTL_DREH_Master; + env->linStateActuator[BUS_ADR].NOTL_ENAB_Master = ACT_RFR_PRG_->NOTL_ENAB_Master; + env->linStateActuator[BUS_ADR].DREH_Slave = ACT_RFR_PRG_->DREH_Slave; + env->linStateActuator[BUS_ADR].ParitySlave = ACT_RFR_PRG_->ParitySlave; + env->linStateActuator[BUS_ADR].Version_CFR = ACT_RFR_PRG_->Version_CFR; + + break; + } + + --retry; + } + + return res; +} + + + lin_event_id_t DFR_IDE_x(tLinTaskActuator *env, uint8_t BUS_ADR) { lin_event_id_t res; @@ -249,6 +312,8 @@ lin_event_id_t ISSR_x(tLinTaskActuator *env, uint8_t BUS_ADR) { ACT_RFR_ISSR *ACT_RFR_ISSR_ = (ACT_RFR_ISSR *) env->linData->g_aRxBuffer; + env->linStateActuator[BUS_ADR].CPOS_ALL = ACT_RFR_ISSR_->CPOS_1_LSB_MT | (ACT_RFR_ISSR_->CPOS_1_MSB_MT << 8); + if (ACT_RFR_ISSR_->DIAGNOSE_MT) { if (DFR_STA_x(env, BUS_ADR) == LIN_TX_COMPLETED) { RFR_STA_x(env, BUS_ADR); @@ -282,9 +347,20 @@ void Lin0_Scheduler(tLinTaskActuator *env) { if (osMutexAcquire(env->access, 100) == osOK) { + for (uint8_t i = 0; i < LIN0_ISSR_ALL; ++i) { + + if (DFR_PRG_x(env, i) == LIN_TX_COMPLETED) { + RFR_PRG_x(env, i); + } + + if (DFR_IDE_x(env, i) == LIN_TX_COMPLETED) { + RFR_IDE_x(env, i); + } + + if (DFR_STA_x(env, i) == LIN_TX_COMPLETED) { + RFR_STA_x(env, i); + } - if (DFR_IDE_x(env, BUS_ADR) == LIN_TX_COMPLETED) { - RFR_IDE_x(env, BUS_ADR); } for (uint8_t i = 0; i < LIN0_ISSR_ALL; ++i) { diff --git a/LinTasks.h b/LinTasks.h index bf26c1a..dd27a2e 100644 --- a/LinTasks.h +++ b/LinTasks.h @@ -283,7 +283,7 @@ typedef struct __attribute__ ((packed)) { typedef struct __attribute__ ((packed)) { uint8_t BUS_ADR; - uint8_t Data1_DFR_PRG: 1; // Установить в 0xFF + uint8_t Data1_DFR_PRG; // Установить в 0xFF } ACT_DFR_PRG; typedef struct __attribute__ ((packed)) { @@ -380,6 +380,14 @@ typedef struct { uint8_t IDE_Sup; uint8_t IDE_Har; + uint8_t BUS_NEW_ADR; + uint8_t NOTL_DREH_Master; + uint8_t NOTL_ENAB_Master; + uint8_t DREH_Slave; + uint8_t ParitySlave; + uint8_t Free; + uint8_t Version_CFR; + } tLinStateActuator;