diff --git a/LinTasks.c b/LinTasks.c index 5440f9c..a044366 100644 --- a/LinTasks.c +++ b/LinTasks.c @@ -171,7 +171,6 @@ lin_event_id_t RFR_PRG_x(tLinTaskActuator *env, uint8_t BUS_ADR) { } - lin_event_id_t DFR_IDE_x(tLinTaskActuator *env, uint8_t BUS_ADR) { lin_event_id_t res; @@ -312,7 +311,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); + 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) { @@ -331,6 +331,106 @@ lin_event_id_t ISSR_x(tLinTaskActuator *env, uint8_t BUS_ADR) { } +lin_event_id_t CFR_MOD_x(tLinTaskActuator *env, uint8_t BUS_ADR, eMode_Mod Mode_Slave) { + lin_event_id_t res; + + env->linData->direction = LIN_DIRECTION_SET; + env->linData->g_aTxBufferLen = sizeof(ACT_CFR_MOD); + env->linData->g_aRxBufferLen = 0; + + ACT_CFR_MOD *ACT_CFR_MOD_ = (ACT_CFR_MOD *) env->linData->g_aTxBuffer; + ACT_CFR_MOD_->BUS_ADR = BUS_ADR; + ACT_CFR_MOD_->Mode_Slave = Mode_Slave; + ACT_CFR_MOD_->Unused = 0xFF; + ACT_CFR_MOD_->Data2_Mod = 0xFF; + ACT_CFR_MOD_->Data3_Mod = 0xFF; + + uint8_t retry = 3; + + while (retry) { + + res = SEND_ACTUATOR_COM_x(env->linIo->env, CFR_MOD); + + if (res == LIN_TX_COMPLETED) { + break; + } + + --retry; + } + + return res; +} + +lin_event_id_t CFR_INI_x(tLinTaskActuator *env, uint8_t BUS_ADR, uint16 INI_CPOS) { + lin_event_id_t res; + + env->linData->direction = LIN_DIRECTION_SET; + env->linData->g_aTxBufferLen = sizeof(ACT_CFR_INI); + env->linData->g_aRxBufferLen = 0; + + ACT_CFR_INI *ACT_CFR_INI_ = (ACT_CFR_INI *) env->linData->g_aTxBuffer; + ACT_CFR_INI_->BUS_ADR = BUS_ADR; + ACT_CFR_INI_->INI_CPOS = INI_CPOS; + ACT_CFR_INI_->unused = 0xFF; + ACT_CFR_INI_->Not_Used_INI = 0xFF; + + uint8_t retry = 3; + + while (retry) { + + res = SEND_ACTUATOR_COM_x(env->linIo->env, CFR_INI); + + if (res == LIN_TX_COMPLETED) { + break; + } + + --retry; + } + + return res; +} + +lin_event_id_t CFR_SET_x(tLinTaskActuator *env, uint8_t BUS_ADR, uint16 FINAL_POS, + eStall_SET Stall_SET, + eLnoise_SET Lnoise_SET, + eAutos_SET Autos_SET, + eSpeed_SET Speed_SET, + eCoils_Stop_SET Coils_Stop_SET) { + lin_event_id_t res; + + env->linData->direction = LIN_DIRECTION_SET; + env->linData->g_aTxBufferLen = sizeof(ACT_CFR_SET); + env->linData->g_aRxBufferLen = 0; + + ACT_CFR_SET *ACT_CFR_SET_ = (ACT_CFR_SET *) env->linData->g_aTxBuffer; + ACT_CFR_SET_->BUS_ADR = BUS_ADR; + + ACT_CFR_SET_->FINAL_POS = FINAL_POS; + ACT_CFR_SET_->unused = 0xFF; + ACT_CFR_SET_->Unused_SET = 0xFF; + ACT_CFR_SET_->Stall_SET = Stall_SET; + ACT_CFR_SET_->Lnoise_SET = Lnoise_SET; + ACT_CFR_SET_->Autos_SET = Autos_SET; + ACT_CFR_SET_->Speed_SET = Speed_SET; + ACT_CFR_SET_->Coils_Stop_SET = Coils_Stop_SET; + + + uint8_t retry = 3; + + while (retry) { + + res = SEND_ACTUATOR_COM_x(env->linIo->env, CFR_INI); + + if (res == LIN_TX_COMPLETED) { + break; + } + + --retry; + } + + return res; +} + void Lin_0_Init(tLinTaskActuator *env, tLinData *linData, tLinIO *linIO) { @@ -349,20 +449,78 @@ void Lin0_Scheduler(tLinTaskActuator *env) { 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 (env->linCommandActuator[i].COM == LIN_ACT_CFR_MOD) { - if (DFR_IDE_x(env, i) == LIN_TX_COMPLETED) { - RFR_IDE_x(env, i); - } + if (CFR_MOD_x(env, env->linCommandActuator[i].BUS_ADR, + env->linCommandActuator[i].MODE) == LIN_TX_COMPLETED) { - if (DFR_STA_x(env, i) == LIN_TX_COMPLETED) { - RFR_STA_x(env, i); - } + if (DFR_STA_x(env, i) == LIN_TX_COMPLETED) { + RFR_STA_x(env, i); + } + } + + if (env->linCommandActuator[i].BUS_ADR & 0x1F) { + break; + } + + } } + for (uint8_t i = 0; i < LIN0_ISSR_ALL; ++i) { + + if (env->linCommandActuator[i].COM == LIN_ACT_CFR_INI) { + + if (CFR_INI_x(env, env->linCommandActuator[i].BUS_ADR, + env->linCommandActuator[i].POS) == LIN_TX_COMPLETED) { + + } + + if (env->linCommandActuator[i].BUS_ADR & 0x1F) { + break; + } + + } + } + + for (uint8_t i = 0; i < LIN0_ISSR_ALL; ++i) { + + if (env->linCommandActuator[i].COM == LIN_ACT_CFR_SET) { + + if (CFR_SET_x(env, env->linCommandActuator[i].BUS_ADR, + env->linCommandActuator[i].POS, + env->linCommandActuator[i].Stall_SET, + env->linCommandActuator[i].Lnoise_SET, + env->linCommandActuator[i].Autos_SET, + env->linCommandActuator[i].Speed_SET, + env->linCommandActuator[i].Coils_Stop_SET) == LIN_TX_COMPLETED) { + + } + + if (env->linCommandActuator[i].BUS_ADR & 0x1F) { + break; + } + + } + } + + /* + + 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); + } + */ + + + 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 dd27a2e..9be390f 100644 --- a/LinTasks.h +++ b/LinTasks.h @@ -362,10 +362,8 @@ 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; @@ -385,18 +383,62 @@ typedef struct { uint8_t NOTL_ENAB_Master; uint8_t DREH_Slave; uint8_t ParitySlave; - uint8_t Free; uint8_t Version_CFR; +} tLinStateFullActuator; + +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; } tLinStateActuator; +// POS - Позиция + +// BUS_ADR - (3 бита [7..5] - Группа; 5 бит [4..0] - Адрес) +// Пример Широковещательный адрес группа 1: 0x20, 0x20, 0x20 .. 0x20 +// Пример Обычный адрес: 0x01, 0x02, 0x03 .. 0x09 +// Смешанный тип адреса не допустим + +// COM - Команда + +typedef enum { + LIN_ACT_CFR_MOD = 0, + LIN_ACT_CFR_INI = 1, + LIN_ACT_CFR_SET = 2, + LIN_ACT_CFR_PRG = 3, +} eLinCOM; + +typedef struct { + uint16_t POS; + uint8_t BUS_ADR; + eMode_Mod MODE; + eLinCOM COM; // Является защелкой (триггером), которую контроллер сбросит, когда заберет данные + eStall_SET Stall_SET; + eLnoise_SET Lnoise_SET; + eAutos_SET Autos_SET; + eSpeed_SET Speed_SET; + eCoils_Stop_SET Coils_Stop_SET; +} tLinCommandActuator; + typedef struct { tLinIO *linIo; osMutexId_t access; - tLinStateActuator linStateActuator[9]; + uint8_t busy; // Устройство занято + uint8_t errorConnect; // Ошибка соединения (устройство не отвечает) + + tLinStateFullActuator linStateActuator[9]; + tLinCommandActuator linCommandActuator[9]; tLinData *linData;