diff --git a/LinTasks.c b/LinTasks.c index 5645555..c959034 100644 --- a/LinTasks.c +++ b/LinTasks.c @@ -102,21 +102,80 @@ void GetLin0CallbackHandler(tLinData *env, uint8_t u8LinIndex, void *state) { osMessageQueuePut(env->rxDataQueue, (uint8_t *) &pXferState->currentEventId, 0x0, 0U); } -static lin_event_id_t SEND_ACTUATOR_COM_x(tLinTaskActuator *env, uint8_t adr) { - lin_event_id_t res = env->linIo->runCommand(env->linIo->env, adr, 50); +static lin_event_id_t SEND_ACTUATOR_COM_x(tLinTaskActuator *env, uint8_t COM_ADR) { + lin_event_id_t res = env->linIo->runCommand(env->linIo->env, COM_ADR, 50); SystemDelayMs(20); return res; } -lin_event_id_t DFR_STA_x(tLinTaskActuator *env, uint8_t ADR) { + +lin_event_id_t DFR_IDE_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_IDE); + env->linData->g_aRxBufferLen = 0; + + ACT_DFR_IDE *ACT_DFR_IDE_ = (ACT_DFR_IDE *) env->linData->g_aTxBuffer; + ACT_DFR_IDE_->BUS_ADR = BUS_ADR; + ACT_DFR_IDE_->Data1_DFR_IDE = 0xFF; + + uint8_t retry = 3; + + while (retry) { + + res = SEND_ACTUATOR_COM_x(env->linIo->env, DFR_IDE); + + if (res == LIN_TX_COMPLETED) { + break; + } + + --retry; + } + + return res; +} + +lin_event_id_t RFR_IDE_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_IDE); + + ACT_RFR_IDE *ACT_RFR_IDE_ = (ACT_RFR_IDE *) env->linData->g_aRxBuffer; + + uint8_t retry = 3; + + while (retry) { + + res = SEND_ACTUATOR_COM_x(env->linIo->env, RFR_IDE); + + if (res == LIN_RX_COMPLETED) { + + env->linStateActuator[BUS_ADR].IDE_ref = ACT_RFR_IDE_->IDE_ref; + env->linStateActuator[BUS_ADR].IDE_Sup = ACT_RFR_IDE_->IDE_Sup; + env->linStateActuator[BUS_ADR].IDE_Har = ACT_RFR_IDE_->IDE_Har; + + break; + } + + --retry; + } + + return res; +} + +lin_event_id_t DFR_STA_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_STA); env->linData->g_aRxBufferLen = 0; - ACT_DFR_STA *ACT_DFR_STA_ = (ACT_DFR_STA *)env->linData->g_aTxBuffer; - ACT_DFR_STA_->BUS_ADR = ADR; + ACT_DFR_STA *ACT_DFR_STA_ = (ACT_DFR_STA *) env->linData->g_aTxBuffer; + ACT_DFR_STA_->BUS_ADR = BUS_ADR; ACT_DFR_STA_->Data1_DFR_STA = 0xFF; uint8_t retry = 3; @@ -135,7 +194,7 @@ lin_event_id_t DFR_STA_x(tLinTaskActuator *env, uint8_t ADR) { return res; } -lin_event_id_t RFR_STA_x(tLinTaskActuator *env, uint8_t ADR) { +lin_event_id_t RFR_STA_x(tLinTaskActuator *env, uint8_t BUS_ADR) { lin_event_id_t res; env->linData->direction = LIN_DIRECTION_GET; @@ -143,7 +202,7 @@ lin_event_id_t RFR_STA_x(tLinTaskActuator *env, uint8_t ADR) { env->linData->g_aTxBufferLen = 0; env->linData->g_aRxBufferLen = sizeof(ACT_RFR_STA); - ACT_RFR_STA *ACT_RFR_STA_ = (ACT_RFR_STA *)env->linData->g_aRxBuffer; + ACT_RFR_STA *ACT_RFR_STA_ = (ACT_RFR_STA *) env->linData->g_aRxBuffer; uint8_t retry = 3; @@ -153,6 +212,16 @@ lin_event_id_t RFR_STA_x(tLinTaskActuator *env, uint8_t ADR) { if (res == LIN_RX_COMPLETED) { + env->linStateActuator[BUS_ADR].CPOS_ALL = ACT_RFR_STA_->CPOS_ALL; + env->linStateActuator[BUS_ADR].Emrf_Slave = ACT_RFR_STA_->Emrf_Slave; + env->linStateActuator[BUS_ADR].Mode_Slave = ACT_RFR_STA_->Mode_Slave; + env->linStateActuator[BUS_ADR].Error1_Supply_Slave = ACT_RFR_STA_->Error1_Supply_Slave; + env->linStateActuator[BUS_ADR].Error2_Communication_Slave = ACT_RFR_STA_->Error2_Communication_Slave; + env->linStateActuator[BUS_ADR].Error3_Temperature_Slave = ACT_RFR_STA_->Error3_Temperature_Slave; + env->linStateActuator[BUS_ADR].Error4_Permanent_Electrical_Slave = ACT_RFR_STA_->Error4_Permanent_Electrical_Slave; + env->linStateActuator[BUS_ADR].Stall_Slave = ACT_RFR_STA_->Stall_Slave; + env->linStateActuator[BUS_ADR].Reset_Slave = ACT_RFR_STA_->Reset_Slave; + break; } @@ -163,7 +232,7 @@ lin_event_id_t RFR_STA_x(tLinTaskActuator *env, uint8_t ADR) { return res; } -lin_event_id_t ISSR_x(tLinTaskActuator *env, uint8_t ADR) { +lin_event_id_t ISSR_x(tLinTaskActuator *env, uint8_t BUS_ADR) { lin_event_id_t res; env->linData->direction = LIN_DIRECTION_GET; @@ -174,15 +243,16 @@ lin_event_id_t ISSR_x(tLinTaskActuator *env, uint8_t ADR) { while (retry) { - res = SEND_ACTUATOR_COM_x(env->linIo->env, ADR); + res = SEND_ACTUATOR_COM_x(env->linIo->env, BUS_ADR); if (res == LIN_RX_COMPLETED) { - ACT_RFR_ISSR *ACT_RFR_ISSR_ = (ACT_RFR_ISSR *)env->linData->g_aRxBuffer; + ACT_RFR_ISSR *ACT_RFR_ISSR_ = (ACT_RFR_ISSR *) env->linData->g_aRxBuffer; if (ACT_RFR_ISSR_->DIAGNOSE_MT) { - DFR_STA_x(env, ADR); - RFR_STA_x(env, ADR); + if (DFR_STA_x(env, BUS_ADR) == LIN_TX_COMPLETED) { + RFR_STA_x(env, BUS_ADR); + } } break; @@ -213,6 +283,10 @@ void Lin0_Scheduler(tLinTaskActuator *env) { if (osMutexAcquire(env->access, 100) == osOK) { + 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) { lin_event_id_t res = ISSR_x(env, i); } diff --git a/LinTasks.h b/LinTasks.h index d44abc6..bf26c1a 100644 --- a/LinTasks.h +++ b/LinTasks.h @@ -362,11 +362,34 @@ typedef struct __attribute__ ((packed)) { #define LIN1_ISSR_ALL 0x06 #define LIN2_ISSR_ALL 0x08 + +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; + + uint8_t IDE_ref; + uint8_t IDE_Sup; + uint8_t IDE_Har; + + +} tLinStateActuator; + typedef struct { tLinIO *linIo; osMutexId_t access; + tLinStateActuator linStateActuator[9]; + tLinData *linData; struct {