From a173d70e343b27d8b6f91c82a6150c37eb40d2ee Mon Sep 17 00:00:00 2001 From: cfif Date: Thu, 2 Jul 2026 11:26:55 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B8=2002.07.2026=20(=D0=92=D0=BD=D0=B5=D1=81=D0=B5=D0=BD?= =?UTF-8?q?=D1=8B=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20IO)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CanUds.c | 409 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- CanUds.h | 53 +++++++ 2 files changed, 447 insertions(+), 15 deletions(-) diff --git a/CanUds.c b/CanUds.c index cd29b25..4d2071d 100644 --- a/CanUds.c +++ b/CanUds.c @@ -3,7 +3,6 @@ // #include "CanUds.h" #include "CanPorts.h" -#include "StatusData.h" #include "memory.h" #include "TesterPresent_3e.h" #include "DiagnosticSessionControl_10.h" @@ -561,6 +560,12 @@ static uint16_t InputOutputControlByIdentifier_2F(tCanUds *env) { env->dataResponse[2] = dataIdentifier_lo; env->dataResponse[3] = env->data->data[3]; + if (dataIdentifier_lo == 0x50) { + memcpy(&env->dataResponse[4], uds_ReadDataByIdentifier_22_com_CF[2].data, size); + } else { + memcpy(&env->dataResponse[4], uds_ReadDataByIdentifier_22_com_CF[dataIdentifier_lo].data, size); + } + if (env->data->data[3] == UDS_io_shortTermAdjustment) { // Motor_Def...MotorSealingValve (percent) @@ -571,7 +576,12 @@ static uint16_t InputOutputControlByIdentifier_2F(tCanUds *env) { return setResponseError(env, UDS_InputOutputControlByIdentifier, UDS_error_requestOutOfRange); } + uint8_t *pSet = (uint8_t *) &env->Status_Set_For_Model_output; + + pSet[dataIdentifier_lo - 0x60 - 1] = 1; + memcpy(uds_IoDataByIdentifier_2F_com_CF[dataIdentifier_lo].data, &env->data->data[4], size); + return size + 4; } else { @@ -579,6 +589,7 @@ static uint16_t InputOutputControlByIdentifier_2F(tCanUds *env) { // Doors Actuator case 0x50: { + for (uint8_t i = 0; i < 24; i += 2) { uint16_t percent = (env->data->data[4 + i] << 8) | env->data->data[5 + 1 + i]; if (percent > 1000) { @@ -586,6 +597,9 @@ static uint16_t InputOutputControlByIdentifier_2F(tCanUds *env) { UDS_error_requestOutOfRange); } } + + memset(&env->Status_Set_For_Model_output, 1, 24); + break; } @@ -598,6 +612,9 @@ static uint16_t InputOutputControlByIdentifier_2F(tCanUds *env) { UDS_error_requestOutOfRange); } } + + env->Status_Set_For_Model_output.IO = 1; + break; } @@ -610,6 +627,8 @@ static uint16_t InputOutputControlByIdentifier_2F(tCanUds *env) { UDS_error_requestOutOfRange); } + env->Status_Set_For_Model_output.Pwm = 1; + break; } @@ -622,6 +641,8 @@ static uint16_t InputOutputControlByIdentifier_2F(tCanUds *env) { UDS_error_requestOutOfRange); } + env->Status_Set_For_Model_output.eComp = 1; + break; } @@ -634,6 +655,8 @@ static uint16_t InputOutputControlByIdentifier_2F(tCanUds *env) { UDS_error_requestOutOfRange); } + env->Status_Set_For_Model_output.External = 1; + break; } @@ -646,6 +669,8 @@ static uint16_t InputOutputControlByIdentifier_2F(tCanUds *env) { UDS_error_requestOutOfRange); } + env->Status_Set_For_Model_output.EMS = 1; + break; } @@ -658,6 +683,8 @@ static uint16_t InputOutputControlByIdentifier_2F(tCanUds *env) { UDS_error_requestOutOfRange); } + env->Status_Set_For_Model_output.Ionizer_Aroma = 1; + break; } @@ -671,6 +698,8 @@ static uint16_t InputOutputControlByIdentifier_2F(tCanUds *env) { UDS_error_requestOutOfRange); } + env->Status_Set_For_Model_output.Duct_Select = 1; + break; } @@ -680,6 +709,8 @@ static uint16_t InputOutputControlByIdentifier_2F(tCanUds *env) { memcpy(uds_IoDataByIdentifier_2F_com_CF[dataIdentifier_lo].data, &env->data->data[4], size); + return size + 4; + } else { return size + 4; } @@ -1210,7 +1241,7 @@ vUDS_routine_Check_Programming_Dependancies(tCanUds *env, eUdsRoutineControlType SIZE_HEX_BlockMain - 4, SendUpdatePendingCrc, env, 200); - uint32_t crc32_file = (*(uint32_t * )(ADR_HEX_Mapped_BlockMain + SIZE_HEX_BlockMain - 4)); + uint32_t crc32_file = (*(uint32_t *) (ADR_HEX_Mapped_BlockMain + SIZE_HEX_BlockMain - 4)); if (crc32_calc != crc32_file) { env->dataResponse[4] = UDS_routine_RoutineStartStopFailure; @@ -1222,7 +1253,7 @@ vUDS_routine_Check_Programming_Dependancies(tCanUds *env, eUdsRoutineControlType crc32_calc = UdsCrc32Update_Hardware(0xFFFFFFFF, (uint8_t *) ADR_HEX_Mapped_BlockCalib, SIZE_HEX_BlockCalib - 4, SendUpdatePendingCrc, env, 200); - crc32_file = (*(uint32_t * )(ADR_HEX_Mapped_BlockCalib + SIZE_HEX_BlockCalib - 4)); + crc32_file = (*(uint32_t *) (ADR_HEX_Mapped_BlockCalib + SIZE_HEX_BlockCalib - 4)); if (crc32_calc != crc32_file) { env->dataResponse[4] = UDS_routine_RoutineStartStopFailure; @@ -1248,7 +1279,7 @@ vUDS_routine_Check_Programming_Dependancies(tCanUds *env, eUdsRoutineControlType return 4 + 1; } - size_t size = D_sInternalFlashPage_Write(0x04000000, 0, (uint8_t * ) & NumberBank, 8); + size_t size = D_sInternalFlashPage_Write(0x04000000, 0, (uint8_t *) &NumberBank, 8); if (size != 8) { env->dataResponse[4] = UDS_routine_RoutineStartStopFailure; @@ -1738,6 +1769,315 @@ static uint16_t RequestTransferExit_37(tCanUds *env) { // конец --------------------------- RequestTransferExit --------------------------------------------------------- // конец --------------------------- RequestTransferExit --------------------------------------------------------- +void CanUdsInput_Set_Model(tCanUds *env) { + osStatus_t status = osOK; + + uint32_t countQueue_space = osMessageQueueGetSpace(env->queue_input_get_Status_Sensor); + if (countQueue_space) { + status = osMessageQueuePut(env->queue_input_get_Status_Sensor, &env->Status_Sensor_For_Model_input, 0, 0); + } + + countQueue_space = osMessageQueueGetSpace(env->queue_input_get_Status_Actuator_DoorsActuator); + if (countQueue_space) { + status = osMessageQueuePut(env->queue_input_get_Status_Actuator_DoorsActuator, &env->Status_Sensor_For_Model_input, 0, 0); + } + + countQueue_space = osMessageQueueGetSpace(env->queue_input_get_Status_Duct_Tgt); + if (countQueue_space) { + status = osMessageQueuePut(env->queue_input_get_Status_Duct_Tgt, &env->Status_Duct_Tgt_For_Model_input, 0, 0); + } + + countQueue_space = osMessageQueueGetSpace(env->queue_input_get_Status_Eva_Tgt); + if (countQueue_space) { + status = osMessageQueuePut(env->queue_input_get_Status_Eva_Tgt, &env->Status_Eva_Tgt_For_Model_input, 0, 0); + } + + countQueue_space = osMessageQueueGetSpace(env->queue_input_get_Status_IO); + if (countQueue_space) { + status = osMessageQueuePut(env->queue_input_get_Status_IO, &env->Status_IO_For_Model_input, 0, 0); + } + + countQueue_space = osMessageQueueGetSpace(env->queue_input_get_Status_Pwm); + if (countQueue_space) { + status = osMessageQueuePut(env->queue_input_get_Status_Pwm, &env->Status_Pwm_For_Model_input, 0, 0); + } + + countQueue_space = osMessageQueueGetSpace(env->queue_input_get_Status_eComp); + if (countQueue_space) { + status = osMessageQueuePut(env->queue_input_get_Status_eComp, &env->Status_eComp_For_Model_input, 0, 0); + } + + countQueue_space = osMessageQueueGetSpace(env->queue_input_get_Status_External); + if (countQueue_space) { + status = osMessageQueuePut(env->queue_input_get_Status_External, &env->Status_External_For_Model_input, 0, 0); + } + + countQueue_space = osMessageQueueGetSpace(env->queue_input_get_Status_EMS); + if (countQueue_space) { + status = osMessageQueuePut(env->queue_input_get_Status_EMS, &env->Status_EMS_For_Model_input, 0, 0); + } + + countQueue_space = osMessageQueueGetSpace(env->queue_input_get_Status_Ionizer_Aroma); + if (countQueue_space) { + status = osMessageQueuePut(env->queue_input_get_Status_Ionizer_Aroma, &env->Status_Ionizer_Aroma_For_Model_input, 0, 0); + } + + countQueue_space = osMessageQueueGetSpace(env->queue_input_get_Status_Duct_Select); + if (countQueue_space) { + status = osMessageQueuePut(env->queue_input_get_Status_Duct_Select, &env->Status_Duct_Select_For_Model_input, 0, 0); + } +} + +// Это на вход UDS +static void CanUdsInput_Get_Model(tCanUds *env) { + + osStatus_t status = osMessageQueueGet(env->queue_input_get_Status_Sensor, &env->Status_Sensor_For_Model_input, 0, 0); + status = osMessageQueueGet(env->queue_input_get_Status_Actuator_DoorsActuator, &env->Status_Sensor_For_Model_input,0, 0); + status = osMessageQueueGet(env->queue_input_get_Status_Duct_Tgt, &env->Status_Duct_Tgt_For_Model_input,0, 0); + status = osMessageQueueGet(env->queue_input_get_Status_Eva_Tgt, &env->Status_Eva_Tgt_For_Model_input,0, 0); + status = osMessageQueueGet(env->queue_input_get_Status_IO, &env->Status_IO_For_Model_input,0, 0); + status = osMessageQueueGet(env->queue_input_get_Status_Pwm, &env->Status_Pwm_For_Model_input,0, 0); + status = osMessageQueueGet(env->queue_input_get_Status_eComp, &env->Status_eComp_For_Model_input,0, 0); + status = osMessageQueueGet(env->queue_input_get_Status_External, &env->Status_External_For_Model_input,0, 0); + status = osMessageQueueGet(env->queue_input_get_Status_EMS, &env->Status_EMS_For_Model_input,0, 0); + status = osMessageQueueGet(env->queue_input_get_Status_Ionizer_Aroma, &env->Status_Ionizer_Aroma_For_Model_input,0, 0); + status = osMessageQueueGet(env->queue_input_get_Status_Duct_Select, &env->Status_Duct_Select_For_Model_input,0, 0); + +//---------------------- tStatus_Sensor Status_Sensor; -------------------------------------------------------------- + + statusData.Status_Sensor.Ignition = env->Status_Sensor_For_Model_input.Ignition; + statusData.Status_Sensor.Battery = env->Status_Sensor_For_Model_input.Battery; + statusData.Status_Sensor.AMB = env->Status_Sensor_For_Model_input.AMB; + statusData.Status_Sensor.Incar_FL = env->Status_Sensor_For_Model_input.Incar_FL; + statusData.Status_Sensor.Incar_FR = env->Status_Sensor_For_Model_input.Incar_FR; + statusData.Status_Sensor.Incar_RL = env->Status_Sensor_For_Model_input.Incar_RL; + statusData.Status_Sensor.Incar_RR = env->Status_Sensor_For_Model_input.Incar_RR; + statusData.Status_Sensor.Eva_F = env->Status_Sensor_For_Model_input.Eva_F; + statusData.Status_Sensor.Eva_R = env->Status_Sensor_For_Model_input.Eva_R; + statusData.Status_Sensor.Pressure = env->Status_Sensor_For_Model_input.Pressure; + statusData.Status_Sensor.Duct_FL_Upper = env->Status_Sensor_For_Model_input.Duct_FL_Upper; + statusData.Status_Sensor.Duct_FL_Lower = env->Status_Sensor_For_Model_input.Duct_FL_Lower; + statusData.Status_Sensor.Duct_FR_Upper = env->Status_Sensor_For_Model_input.Duct_FR_Upper; + statusData.Status_Sensor.Duct_FR_Lower = env->Status_Sensor_For_Model_input.Duct_FR_Lower; + statusData.Status_Sensor.Duct_RL = env->Status_Sensor_For_Model_input.Duct_RL; + statusData.Status_Sensor.Duct_RR = env->Status_Sensor_For_Model_input.Duct_RR; + statusData.Status_Sensor.Duct_Side_FL = env->Status_Sensor_For_Model_input.Duct_Side_FL; + statusData.Status_Sensor.Duct_Side_FR = env->Status_Sensor_For_Model_input.Duct_Side_FR; + statusData.Status_Sensor.Duct_Side_RL = env->Status_Sensor_For_Model_input.Duct_Side_RL; + statusData.Status_Sensor.Duct_Side_RR = env->Status_Sensor_For_Model_input.Duct_Side_RR; + statusData.Status_Sensor.AQS = env->Status_Sensor_For_Model_input.AQS; + +//---------------------- Status_Actuator_DoorsActuator --------------------------------------------------------------- + + statusData.Status_Actuator_DoorsActuator_FB.Motor_Def = env->Status_Actuator_DoorsActuator_For_Model_input.Motor_Def; + statusData.Status_Actuator_DoorsActuator_FB.Motor_Vent_SFL = env->Status_Actuator_DoorsActuator_For_Model_input.Motor_Vent_SFL; + statusData.Status_Actuator_DoorsActuator_FB.Motor_Vent_CFL = env->Status_Actuator_DoorsActuator_For_Model_input.Motor_Vent_CFL; + statusData.Status_Actuator_DoorsActuator_FB.Motor_Foot_1FL = env->Status_Actuator_DoorsActuator_For_Model_input.Motor_Foot_1FL; + statusData.Status_Actuator_DoorsActuator_FB.Motor_Foot_2FL = env->Status_Actuator_DoorsActuator_For_Model_input.Motor_Foot_2FL; + statusData.Status_Actuator_DoorsActuator_FB.Motor_Vent_CFR = env->Status_Actuator_DoorsActuator_For_Model_input.Motor_Vent_CFR; + statusData.Status_Actuator_DoorsActuator_FB.Motor_Vent_SFR = env->Status_Actuator_DoorsActuator_For_Model_input.Motor_Vent_SFR; + statusData.Status_Actuator_DoorsActuator_FB.Motor_Foot_1FR = env->Status_Actuator_DoorsActuator_For_Model_input.Motor_Foot_1FR; + statusData.Status_Actuator_DoorsActuator_FB.Motor_Foot_2FR = env->Status_Actuator_DoorsActuator_For_Model_input.Motor_Foot_2FR; + statusData.Status_Actuator_DoorsActuator_FB.Motor_Vent_SRL = env->Status_Actuator_DoorsActuator_For_Model_input.Motor_Vent_SRL; + statusData.Status_Actuator_DoorsActuator_FB.Motor_Vent_CRL = env->Status_Actuator_DoorsActuator_For_Model_input.Motor_Vent_CRL; + statusData.Status_Actuator_DoorsActuator_FB.Motor_Foot_RL = env->Status_Actuator_DoorsActuator_For_Model_input.Motor_Foot_RL; + statusData.Status_Actuator_DoorsActuator_FB.Motor_Vent_CRR = env->Status_Actuator_DoorsActuator_For_Model_input.Motor_Vent_CRR; + statusData.Status_Actuator_DoorsActuator_FB.Motor_Vent_SRR = env->Status_Actuator_DoorsActuator_For_Model_input.Motor_Vent_SRR; + statusData.Status_Actuator_DoorsActuator_FB.Motor_Foot_RR = env->Status_Actuator_DoorsActuator_For_Model_input.Motor_Foot_RR; + statusData.Status_Actuator_DoorsActuator_FB.Motor_Temp1_FL = env->Status_Actuator_DoorsActuator_For_Model_input.Motor_Temp1_FL; + statusData.Status_Actuator_DoorsActuator_FB.Motor_Temp2_FL = env->Status_Actuator_DoorsActuator_For_Model_input.Motor_Temp2_FL; + statusData.Status_Actuator_DoorsActuator_FB.Motor_Temp1_FR = env->Status_Actuator_DoorsActuator_For_Model_input.Motor_Temp1_FR; + statusData.Status_Actuator_DoorsActuator_FB.Motor_Temp2_FR = env->Status_Actuator_DoorsActuator_For_Model_input.Motor_Temp2_FR; + statusData.Status_Actuator_DoorsActuator_FB.Motor_Temp_RL = env->Status_Actuator_DoorsActuator_For_Model_input.Motor_Temp_RL; + statusData.Status_Actuator_DoorsActuator_FB.Motor_Temp_RR = env->Status_Actuator_DoorsActuator_For_Model_input.Motor_Temp_RR; + statusData.Status_Actuator_DoorsActuator_FB.Motor_REC = env->Status_Actuator_DoorsActuator_For_Model_input.Motor_REC; + statusData.Status_Actuator_DoorsActuator_FB.Motor_OSA = env->Status_Actuator_DoorsActuator_For_Model_input.Motor_OSA; + statusData.Status_Actuator_DoorsActuator_FB.Motor_SealingValve = env->Status_Actuator_DoorsActuator_For_Model_input.Motor_SealingValve; + +//---------------------- Status_Duct_Tgt ----------------------------------------------------------------------------- + + statusData.Status_Duct_Tgt_FB.DuctTgt_Vent_FL = env->Status_Duct_Tgt_For_Model_input.DuctTgt_Vent_FL; + statusData.Status_Duct_Tgt_FB.DuctTgt_Foot_FL = env->Status_Duct_Tgt_For_Model_input.DuctTgt_Foot_FL; + statusData.Status_Duct_Tgt_FB.DuctTgt_Vent_FR = env->Status_Duct_Tgt_For_Model_input.DuctTgt_Vent_FR; + statusData.Status_Duct_Tgt_FB.DuctTgt_Foot_FR = env->Status_Duct_Tgt_For_Model_input.DuctTgt_Foot_FR; + statusData.Status_Duct_Tgt_FB.DuctTgt_RL = env->Status_Duct_Tgt_For_Model_input.DuctTgt_RL; + statusData.Status_Duct_Tgt_FB.DuctTgt_RR = env->Status_Duct_Tgt_For_Model_input.DuctTgt_RR; + +//---------------------- Status_Eva_Tgt ------------------------------------------------------------------------------ + + statusData.Status_Eva_Tgt_FB.EvaTgt_F = env->Status_Eva_Tgt_For_Model_input.EvaTgt_F; + statusData.Status_Eva_Tgt_FB.EvaTgt_R = env->Status_Eva_Tgt_For_Model_input.EvaTgt_R; + + +//---------------------- Status_IO ----------------------------------------------------------------------------------- + + statusData.Status_IO_FB._2_Way_Valve = env->Status_IO_For_Model_input._2_Way_Valve; + statusData.Status_IO_FB.IncarMotor_Front = env->Status_IO_For_Model_input.IncarMotor_Front; + statusData.Status_IO_FB.IncarMotor_Rear = env->Status_IO_For_Model_input.IncarMotor_Rear; + statusData.Status_IO_FB.ShutOff_Chiller = env->Status_IO_For_Model_input.ShutOff_Chiller; + statusData.Status_IO_FB.ShutOff_Front = env->Status_IO_For_Model_input.ShutOff_Front; + statusData.Status_IO_FB.ShutOff_Rear = env->Status_IO_For_Model_input.ShutOff_Rear; + statusData.Status_IO_FB.PTC_1 = env->Status_IO_For_Model_input.PTC_1; + statusData.Status_IO_FB.PTC_2 = env->Status_IO_For_Model_input.PTC_2; + +//---------------------- Status_Pwm ---------------------------------------------------------------------------------- + + statusData.Status_Pwm_FB.Pwm_Front = env->Status_Pwm_For_Model_input.Pwm_Front; + statusData.Status_Pwm_FB.Pwm_Rear = env->Status_Pwm_For_Model_input.Pwm_Rear; + + +//---------------------- Status_eComp--------------------------------------------------------------------------------- + statusData.Status_eComp_FB.eComp_Statue_Request = env->Status_eComp_For_Model_input.eComp_Statue_Request; + statusData.Status_eComp_FB.Pwm_Front = env->Status_eComp_For_Model_input.Pwm_Front; + statusData.Status_eComp_FB.LowTempValve = env->Status_eComp_For_Model_input.LowTempValve; + +//---------------------- Status_External------------------------------------------------------------------------------ + statusData.Status_External_FB.CoolingFan = env->Status_External_For_Model_input.CoolingFan; + +//---------------------- Status_EMS----------------------------------------------------------------------------------- + statusData.Status_EMS_FB.EMS_Chiller_Req = env->Status_EMS_For_Model_input.EMS_Chiller_Req; + +//---------------------- Status_Ionizer_Aroma------------------------------------------------------------------------- + statusData.Status_Ionizer_Aroma_FB.Ionizer = env->Status_Ionizer_Aroma_For_Model_input.Ionizer; + statusData.Status_Ionizer_Aroma_FB.AromatizationIntensivity = env->Status_Ionizer_Aroma_For_Model_input.AromatizationIntensivity; + +//---------------------- Status_Duct_Select------------------------------------------------------------------------- + statusData.Status_Duct_Select_FB.Duct_FL = env->Status_Duct_Select_For_Model_input.Duct_FL; + statusData.Status_Duct_Select_FB.Duct_FR = env->Status_Duct_Select_For_Model_input.Duct_FR; + statusData.Status_Duct_Select_FB.Duct_RL = env->Status_Duct_Select_For_Model_input.Duct_RL; + statusData.Status_Duct_Select_FB.Duct_RR = env->Status_Duct_Select_For_Model_input.Duct_RR; + +} + +// Это с выхода UDS +void CanUdsOutput_Set_Model(tCanUds *env) { + +//---------------------- Status_Set; -------------------------------------------------------------------------------- +/* + env->Status_Set_For_Model_output.Motor_Def; + env->Status_Set_For_Model_output.Motor_Vent_SFL; + env->Status_Set_For_Model_output.Motor_Vent_CFL; + env->Status_Set_For_Model_output.Motor_Foot_1FL; + env->Status_Set_For_Model_output.Motor_Foot_2FL; + env->Status_Set_For_Model_output.Motor_Vent_CFR; + env->Status_Set_For_Model_output.Motor_Vent_SFR; + env->Status_Set_For_Model_output.Motor_Foot_1FR; + env->Status_Set_For_Model_output.Motor_Foot_2FR; + env->Status_Set_For_Model_output.Motor_Vent_SRL; + env->Status_Set_For_Model_output.Motor_Vent_CRL; + env->Status_Set_For_Model_output.Motor_Foot_RL; + env->Status_Set_For_Model_output.Motor_Vent_CRR; + env->Status_Set_For_Model_output.Motor_Vent_SRR; + env->Status_Set_For_Model_output.Motor_Foot_RR; + env->Status_Set_For_Model_output.Motor_Temp1_FL; + env->Status_Set_For_Model_output.Motor_Temp2_FL; + env->Status_Set_For_Model_output.Motor_Temp1_FR; + env->Status_Set_For_Model_output.Motor_Temp2_FR; + env->Status_Set_For_Model_output.Motor_Temp_RL; + env->Status_Set_For_Model_output.Motor_Temp_RR; + env->Status_Set_For_Model_output.Motor_REC; + env->Status_Set_For_Model_output.Motor_OSA; + env->Status_Set_For_Model_output.Motor_SealingValve; + env->Status_Set_For_Model_output.IO; + env->Status_Set_For_Model_output.Pwm; + env->Status_Set_For_Model_output.eComp; + env->Status_Set_For_Model_output.External; + env->Status_Set_For_Model_output.EMS; + env->Status_Set_For_Model_output.Ionizer_Aroma; + env->Status_Set_For_Model_output.Duct_Select; +*/ +//---------------------- Status_Actuator_DoorsActuator --------------------------------------------------------------- + + env->Status_Actuator_DoorsActuator_For_Model_output.Motor_Def = statusData.Status_Actuator_DoorsActuator.Motor_Def; + env->Status_Actuator_DoorsActuator_For_Model_output.Motor_Vent_SFL = statusData.Status_Actuator_DoorsActuator.Motor_Vent_SFL; + env->Status_Actuator_DoorsActuator_For_Model_output.Motor_Vent_CFL = statusData.Status_Actuator_DoorsActuator.Motor_Vent_CFL; + env->Status_Actuator_DoorsActuator_For_Model_output.Motor_Foot_1FL = statusData.Status_Actuator_DoorsActuator.Motor_Foot_1FL; + env->Status_Actuator_DoorsActuator_For_Model_output.Motor_Foot_2FL = statusData.Status_Actuator_DoorsActuator.Motor_Foot_2FL; + env->Status_Actuator_DoorsActuator_For_Model_output.Motor_Vent_CFR = statusData.Status_Actuator_DoorsActuator.Motor_Vent_CFR; + env->Status_Actuator_DoorsActuator_For_Model_output.Motor_Vent_SFR = statusData.Status_Actuator_DoorsActuator.Motor_Vent_SFR; + env->Status_Actuator_DoorsActuator_For_Model_output.Motor_Foot_1FR = statusData.Status_Actuator_DoorsActuator.Motor_Foot_1FR; + env->Status_Actuator_DoorsActuator_For_Model_output.Motor_Foot_2FR = statusData.Status_Actuator_DoorsActuator.Motor_Foot_2FR; + env->Status_Actuator_DoorsActuator_For_Model_output.Motor_Vent_SRL = statusData.Status_Actuator_DoorsActuator.Motor_Vent_SRL; + env->Status_Actuator_DoorsActuator_For_Model_output.Motor_Vent_CRL = statusData.Status_Actuator_DoorsActuator.Motor_Vent_CRL; + env->Status_Actuator_DoorsActuator_For_Model_output.Motor_Foot_RL = statusData.Status_Actuator_DoorsActuator.Motor_Foot_RL; + env->Status_Actuator_DoorsActuator_For_Model_output.Motor_Vent_CRR = statusData.Status_Actuator_DoorsActuator.Motor_Vent_CRR; + env->Status_Actuator_DoorsActuator_For_Model_output.Motor_Vent_SRR = statusData.Status_Actuator_DoorsActuator.Motor_Vent_SRR; + env->Status_Actuator_DoorsActuator_For_Model_output.Motor_Foot_RR = statusData.Status_Actuator_DoorsActuator.Motor_Foot_RR; + env->Status_Actuator_DoorsActuator_For_Model_output.Motor_Temp1_FL = statusData.Status_Actuator_DoorsActuator.Motor_Temp1_FL; + env->Status_Actuator_DoorsActuator_For_Model_output.Motor_Temp2_FL = statusData.Status_Actuator_DoorsActuator.Motor_Temp2_FL; + env->Status_Actuator_DoorsActuator_For_Model_output.Motor_Temp1_FR = statusData.Status_Actuator_DoorsActuator.Motor_Temp1_FR; + env->Status_Actuator_DoorsActuator_For_Model_output.Motor_Temp2_FR = statusData.Status_Actuator_DoorsActuator.Motor_Temp2_FR; + env->Status_Actuator_DoorsActuator_For_Model_output.Motor_Temp_RL = statusData.Status_Actuator_DoorsActuator.Motor_Temp_RL; + env->Status_Actuator_DoorsActuator_For_Model_output.Motor_Temp_RR = statusData.Status_Actuator_DoorsActuator.Motor_Temp_RR; + env->Status_Actuator_DoorsActuator_For_Model_output.Motor_REC = statusData.Status_Actuator_DoorsActuator.Motor_REC; + env->Status_Actuator_DoorsActuator_For_Model_output.Motor_OSA = statusData.Status_Actuator_DoorsActuator.Motor_OSA; + env->Status_Actuator_DoorsActuator_For_Model_output.Motor_SealingValve = statusData.Status_Actuator_DoorsActuator.Motor_SealingValve; + +//---------------------- Status_Duct_Tgt ----------------------------------------------------------------------------- + + env->Status_Duct_Tgt_For_Model_output.DuctTgt_Vent_FL = statusData.Status_Duct_Tgt.DuctTgt_Vent_FL; + env->Status_Duct_Tgt_For_Model_output.DuctTgt_Foot_FL = statusData.Status_Duct_Tgt.DuctTgt_Foot_FL; + env->Status_Duct_Tgt_For_Model_output.DuctTgt_Vent_FR = statusData.Status_Duct_Tgt.DuctTgt_Vent_FR; + env->Status_Duct_Tgt_For_Model_output.DuctTgt_Foot_FR = statusData.Status_Duct_Tgt.DuctTgt_Foot_FR; + env->Status_Duct_Tgt_For_Model_output.DuctTgt_RL = statusData.Status_Duct_Tgt.DuctTgt_RL; + env->Status_Duct_Tgt_For_Model_output.DuctTgt_RR = statusData.Status_Duct_Tgt.DuctTgt_RR; + +//---------------------- Status_Eva_Tgt ------------------------------------------------------------------------------ + + env->Status_Eva_Tgt_For_Model_output.EvaTgt_F = statusData.Status_Eva_Tgt.EvaTgt_F; + env->Status_Eva_Tgt_For_Model_output.EvaTgt_R = statusData.Status_Eva_Tgt.EvaTgt_R; + +//---------------------- Status_IO ----------------------------------------------------------------------------------- + + env->Status_IO_For_Model_output._2_Way_Valve = statusData.Status_IO._2_Way_Valve; + env->Status_IO_For_Model_output.IncarMotor_Front = statusData.Status_IO.IncarMotor_Front; + env->Status_IO_For_Model_output.IncarMotor_Rear = statusData.Status_IO.IncarMotor_Rear; + env->Status_IO_For_Model_output.ShutOff_Chiller = statusData.Status_IO.ShutOff_Chiller; + env->Status_IO_For_Model_output.ShutOff_Front = statusData.Status_IO.ShutOff_Front; + env->Status_IO_For_Model_output.ShutOff_Rear = statusData.Status_IO.ShutOff_Rear; + env->Status_IO_For_Model_output.PTC_1 = statusData.Status_IO.PTC_1; + env->Status_IO_For_Model_output.PTC_2 = statusData.Status_IO.PTC_2; + +//---------------------- Status_Pwm ---------------------------------------------------------------------------------- + + env->Status_Pwm_For_Model_output.Pwm_Front = statusData.Status_Pwm.Pwm_Front; + env->Status_Pwm_For_Model_output.Pwm_Rear = statusData.Status_Pwm.Pwm_Rear; + +//---------------------- Status_eComp--------------------------------------------------------------------------------- + env->Status_eComp_For_Model_output.eComp_Statue_Request = statusData.Status_eComp.eComp_Statue_Request; + env->Status_eComp_For_Model_output.Pwm_Front = statusData.Status_eComp.Pwm_Front; + env->Status_eComp_For_Model_output.LowTempValve = statusData.Status_eComp.LowTempValve; + +//---------------------- Status_External------------------------------------------------------------------------------ + env->Status_External_For_Model_output.CoolingFan = statusData.Status_External.CoolingFan; + +//---------------------- Status_EMS----------------------------------------------------------------------------------- + env->Status_EMS_For_Model_output.EMS_Chiller_Req = statusData.Status_EMS.EMS_Chiller_Req; + +//---------------------- Status_Ionizer_Aroma------------------------------------------------------------------------- + env->Status_Ionizer_Aroma_For_Model_output.Ionizer = statusData.Status_Ionizer_Aroma.Ionizer; + env->Status_Ionizer_Aroma_For_Model_output.AromatizationIntensivity = statusData.Status_Ionizer_Aroma.AromatizationIntensivity; + +//---------------------- Status_Duct_Select------------------------------------------------------------------------- + env->Status_Duct_Select_For_Model_output.Duct_FL = statusData.Status_Duct_Select.Duct_FL; + env->Status_Duct_Select_For_Model_output.Duct_FR = statusData.Status_Duct_Select.Duct_FR; + env->Status_Duct_Select_For_Model_output.Duct_RL = statusData.Status_Duct_Select.Duct_RL; + env->Status_Duct_Select_For_Model_output.Duct_RR = statusData.Status_Duct_Select.Duct_RR; + + + osStatus_t status = osMessageQueuePut(env->queue_input_get_Status_Sensor, &env->Status_Set_For_Model_output, 0, 0); + status = osMessageQueuePut(env->queue_input_get_Status_Actuator_DoorsActuator, &env->Status_Actuator_DoorsActuator_For_Model_output,0, 0); + status = osMessageQueuePut(env->queue_input_get_Status_Duct_Tgt, &env->Status_Duct_Tgt_For_Model_output,0, 0); + status = osMessageQueuePut(env->queue_input_get_Status_Eva_Tgt, &env->Status_Eva_Tgt_For_Model_output,0, 0); + status = osMessageQueuePut(env->queue_input_get_Status_IO, &env->Status_IO_For_Model_output,0, 0); + status = osMessageQueuePut(env->queue_input_get_Status_Pwm, &env->Status_Pwm_For_Model_output,0, 0); + status = osMessageQueuePut(env->queue_input_get_Status_eComp, &env->Status_eComp_For_Model_output,0, 0); + status = osMessageQueuePut(env->queue_input_get_Status_External, &env->Status_External_For_Model_output,0, 0); + status = osMessageQueuePut(env->queue_input_get_Status_EMS, &env->Status_EMS_For_Model_output,0, 0); + status = osMessageQueuePut(env->queue_input_get_Status_Ionizer_Aroma, &env->Status_Ionizer_Aroma_For_Model_output,0, 0); + status = osMessageQueuePut(env->queue_input_get_Status_Duct_Select, &env->Status_Duct_Select_For_Model_output,0, 0); + +} static const eUds_com uds_com[256] = { {NULL, "", false}, @@ -2015,26 +2355,35 @@ void ReceivedTP_func(void *arg, tCanTP_data *data) { sendLogCanUdsHex(env, env->data->data, env->data->len); LoggerFormatInfo(LOGGER, LOG_SIGN, "> %s [%d] %s", uds_com[com].desc, env->data->len, env->hexString) #endif - uint8_t response_size = uds_com[com].func(env); - if (response_size) { + if (osMutexAcquire(env->access, 5000) == osOK) { - if (SPRMIB == 0) { + uint8_t response_size = uds_com[com].func(env); + + if (response_size) { + + if (SPRMIB == 0) { #if (LOG_UDS == 1) - sendLogCanUdsHex(env, env->dataResponse, response_size); - LoggerFormatInfo(LOGGER, LOG_SIGN, "< %s [%d] %s", uds_com[com].desc, response_size, env->hexString) + sendLogCanUdsHex(env, env->dataResponse, response_size); + LoggerFormatInfo(LOGGER, LOG_SIGN, "< %s [%d] %s", uds_com[com].desc, response_size, env->hexString) #endif - CanSerialPortFrameTpTransmit(&env->canSerialPortFrameTp, env->dataResponse, - response_size, PROTOCOL_CAN_ADR_UDS, WAIT_FRAME_WRITE); - } else { + CanSerialPortFrameTpTransmit(&env->canSerialPortFrameTp, env->dataResponse, + response_size, PROTOCOL_CAN_ADR_UDS, WAIT_FRAME_WRITE); + } else { #if (LOG_UDS == 1) - sendLogCanUdsHex(env, env->dataResponse, response_size); - LoggerFormatInfo(LOGGER, LOG_SIGN, "< %s Response suppression", uds_com[com].desc) + sendLogCanUdsHex(env, env->dataResponse, response_size); + LoggerFormatInfo(LOGGER, LOG_SIGN, "< %s Response suppression", uds_com[com].desc) #endif + } } + + osMutexRelease(env->access); + } else { + LoggerErrorStatic(LOGGER, LOG_SIGN, "Access error ReceivedTP_func"); } + } else { asm("nop"); } @@ -2053,7 +2402,9 @@ void CanUds(tCanUds *env) { for (;;) { - if (osMutexAcquire(env->access, 1000) == osOK) { + if (osMutexAcquire(env->access, 5000) == osOK) { + + CanUdsInput_Get_Model(env); // Контроль TesterPresent if ((env->currentSessionTesterPresentTimeout > 0) && @@ -2071,6 +2422,8 @@ void CanUds(tCanUds *env) { env->currentSession = UDS_session_defaultSession; statusData.Status_Active_Diagnostic_Session.Active_Diagnostic_Session = env->currentSession; + memset(&env->Status_Set_For_Model_output, 0, sizeof(tStatus_Set_For_Model)); + } osMutexRelease(env->access); @@ -2088,6 +2441,7 @@ void CanSerialPortCanUds_Start(tCanUds *env) { CanSerialPortFrameTp_Start(&env->canSerialPortFrameTp); } + void CanUds_Init( tCanUds *env, tDiagnostic *Diagnostic, @@ -2113,6 +2467,31 @@ void CanUds_Init( env->access = osMutexNew(NULL); + env->queue_input_get_Status_Sensor = osMessageQueueNew(1, sizeof(tStatus_Sensor_For_Model), NULL); + env->queue_input_get_Status_Actuator_DoorsActuator = osMessageQueueNew(1, sizeof(tStatus_Actuator_For_Model), NULL); + env->queue_input_get_Status_Duct_Tgt = osMessageQueueNew(1, sizeof(tStatus_Duct_Tgt_For_Model), NULL); + env->queue_input_get_Status_Eva_Tgt = osMessageQueueNew(1, sizeof(tStatus_Eva_Tgt_For_Model), NULL); + env->queue_input_get_Status_IO = osMessageQueueNew(1, sizeof(tStatus_IO_For_Model), NULL); + env->queue_input_get_Status_Pwm = osMessageQueueNew(1, sizeof(tStatus_Pwm_For_Model), NULL); + env->queue_input_get_Status_eComp = osMessageQueueNew(1, sizeof(tStatus_eComp_For_Model), NULL); + env->queue_input_get_Status_External = osMessageQueueNew(1, sizeof(tStatus_External_For_Model), NULL); + env->queue_input_get_Status_EMS = osMessageQueueNew(1, sizeof(tStatus_EMS_For_Model), NULL); + env->queue_input_get_Status_Ionizer_Aroma = osMessageQueueNew(1, sizeof(tStatus_Ionizer_Aroma_For_Model), NULL); + env->queue_input_get_Status_Duct_Select = osMessageQueueNew(1, sizeof(tStatus_Duct_Select_For_Model), NULL); + + + env->queue_output_set_Status_Set = osMessageQueueNew(1, sizeof(tStatus_Set_For_Model), NULL); + env->queue_output_set_Status_Actuator_DoorsActuator = osMessageQueueNew(1, sizeof(tStatus_Actuator_For_Model), NULL); + env->queue_output_set_Status_Duct_Tgt = osMessageQueueNew(1, sizeof(tStatus_Duct_Tgt_For_Model), NULL); + env->queue_output_set_Status_Eva_Tgt = osMessageQueueNew(1, sizeof(tStatus_Eva_Tgt_For_Model), NULL); + env->queue_output_set_Status_IO = osMessageQueueNew(1, sizeof(tStatus_IO_For_Model), NULL); + env->queue_output_set_Status_Pwm = osMessageQueueNew(1, sizeof(tStatus_Pwm_For_Model), NULL); + env->queue_output_set_Status_eComp = osMessageQueueNew(1, sizeof(tStatus_eComp_For_Model), NULL); + env->queue_output_set_Status_External = osMessageQueueNew(1, sizeof(tStatus_External_For_Model), NULL); + env->queue_output_set_Status_EMS = osMessageQueueNew(1, sizeof(tStatus_EMS_For_Model), NULL); + env->queue_output_set_Status_Ionizer_Aroma = osMessageQueueNew(1, sizeof(tStatus_Ionizer_Aroma_For_Model), NULL); + env->queue_output_set_Status_Duct_Select = osMessageQueueNew(1, sizeof(tStatus_Duct_Select_For_Model), NULL); + setDefaultStatus(); env->filterReqId[0] = Diag_To_CCU_CANID; diff --git a/CanUds.h b/CanUds.h index 071bfc7..48702bf 100644 --- a/CanUds.h +++ b/CanUds.h @@ -11,6 +11,7 @@ #include "CanSpamTransmitter.h" #include "CanSpamDebugTransmitter.h" #include "AdcTasks.h" +#include "StatusData.h" #define LOG_UDS 0 @@ -237,6 +238,56 @@ typedef struct { eUdsServices stateDownload; + tStatus_Sensor_For_Model Status_Sensor_For_Model_input; + tStatus_Actuator_For_Model Status_Actuator_DoorsActuator_For_Model_input; + tStatus_Duct_Tgt_For_Model Status_Duct_Tgt_For_Model_input; + tStatus_Eva_Tgt_For_Model Status_Eva_Tgt_For_Model_input; + tStatus_IO_For_Model Status_IO_For_Model_input; + tStatus_Pwm_For_Model Status_Pwm_For_Model_input; + tStatus_eComp_For_Model Status_eComp_For_Model_input; + tStatus_External_For_Model Status_External_For_Model_input; + tStatus_EMS_For_Model Status_EMS_For_Model_input; + tStatus_Ionizer_Aroma_For_Model Status_Ionizer_Aroma_For_Model_input; + tStatus_Duct_Select_For_Model Status_Duct_Select_For_Model_input; + + osMessageQueueId_t queue_input_get_Status_Sensor; + osMessageQueueId_t queue_input_get_Status_Actuator_DoorsActuator; + osMessageQueueId_t queue_input_get_Status_Duct_Tgt; + osMessageQueueId_t queue_input_get_Status_Eva_Tgt; + osMessageQueueId_t queue_input_get_Status_IO; + osMessageQueueId_t queue_input_get_Status_Pwm; + osMessageQueueId_t queue_input_get_Status_eComp; + osMessageQueueId_t queue_input_get_Status_External; + osMessageQueueId_t queue_input_get_Status_EMS; + osMessageQueueId_t queue_input_get_Status_Ionizer_Aroma; + osMessageQueueId_t queue_input_get_Status_Duct_Select; + + + tStatus_Set_For_Model Status_Set_For_Model_output; + tStatus_Actuator_For_Model Status_Actuator_DoorsActuator_For_Model_output; + tStatus_Duct_Tgt_For_Model Status_Duct_Tgt_For_Model_output; + tStatus_Eva_Tgt_For_Model Status_Eva_Tgt_For_Model_output; + tStatus_IO_For_Model Status_IO_For_Model_output; + tStatus_Pwm_For_Model Status_Pwm_For_Model_output; + tStatus_eComp_For_Model Status_eComp_For_Model_output; + tStatus_External_For_Model Status_External_For_Model_output; + tStatus_EMS_For_Model Status_EMS_For_Model_output; + tStatus_Ionizer_Aroma_For_Model Status_Ionizer_Aroma_For_Model_output; + tStatus_Duct_Select_For_Model Status_Duct_Select_For_Model_output; + + osMessageQueueId_t queue_output_set_Status_Set; + osMessageQueueId_t queue_output_set_Status_Actuator_DoorsActuator; + osMessageQueueId_t queue_output_set_Status_Duct_Tgt; + osMessageQueueId_t queue_output_set_Status_Eva_Tgt; + osMessageQueueId_t queue_output_set_Status_IO; + osMessageQueueId_t queue_output_set_Status_Pwm; + osMessageQueueId_t queue_output_set_Status_eComp; + osMessageQueueId_t queue_output_set_Status_External; + osMessageQueueId_t queue_output_set_Status_EMS; + osMessageQueueId_t queue_output_set_Status_Ionizer_Aroma; + osMessageQueueId_t queue_output_set_Status_Duct_Select; + + tStaticThreadBlock(384) T_can_Uds; } tCanUds; @@ -263,4 +314,6 @@ void CanUds_Init( void CanSerialPortCanUds_Start(tCanUds *env); +void CanUdsOutput_Set_Model(tCanUds *env); + #endif //HVAC_M7_CANUDS_H