Добавлены некоторые IO и изменены стеки задач

This commit is contained in:
cfif 2026-07-23 15:03:05 +03:00
parent f510f6eeea
commit 7b5c4fd4e4
2 changed files with 154 additions and 74 deletions

214
CanUds.c
View File

@ -20,6 +20,31 @@
#define LOG_SIGN "CAN_UDS"
#define LOGGER env->logger
extern tStatus_Sensor_For_Model model_Status_Sensor_For_Model_input;
extern tStatus_Actuator_For_Model model_Status_Actuator_DoorsActuator_For_Model_input;
extern tStatus_Duct_Tgt_For_Model model_Status_Duct_Tgt_For_Model_input;
extern tStatus_Eva_Tgt_For_Model model_Status_Eva_Tgt_For_Model_input;
extern tStatus_IO_For_Model model_Status_IO_For_Model_input;
extern tStatus_Pwm_For_Model model_Status_Pwm_For_Model_input;
extern tStatus_eComp_For_Model model_Status_eComp_For_Model_input;
extern tStatus_External_For_Model model_Status_External_For_Model_input;
extern tStatus_EMS_For_Model model_Status_EMS_For_Model_input;
extern tStatus_Ionizer_Aroma_For_Model model_Status_Ionizer_Aroma_For_Model_input;
extern tStatus_Duct_Select_For_Model model_Status_Duct_Select_For_Model_input;
extern tStatus_Set_For_Model model_Status_Set_For_Model_output;
extern tStatus_Actuator_For_Model model_Status_Actuator_DoorsActuator_For_Model_output;
extern tStatus_Duct_Tgt_For_Model model_Status_Duct_Tgt_For_Model_output;
extern tStatus_Eva_Tgt_For_Model model_Status_Eva_Tgt_For_Model_output;
extern tStatus_IO_For_Model model_Status_IO_For_Model_output;
extern tStatus_Pwm_For_Model model_Status_Pwm_For_Model_output;
extern tStatus_eComp_For_Model model_Status_eComp_For_Model_output;
extern tStatus_External_For_Model model_Status_External_For_Model_output;
extern tStatus_EMS_For_Model model_Status_EMS_For_Model_output;
extern tStatus_Ionizer_Aroma_For_Model model_Status_Ionizer_Aroma_For_Model_output;
extern tStatus_Duct_Select_For_Model model_Status_Duct_Select_For_Model_output;
extern uint32_t generate_key(uint32_t seed);
@ -1809,59 +1834,59 @@ void CanUdsInput_Set_Model(tCanUds *env) {
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);
status = osMessageQueuePut(env->queue_input_get_Status_Sensor, &model_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);
&model_Status_Actuator_DoorsActuator_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);
status = osMessageQueuePut(env->queue_input_get_Status_Duct_Tgt, &model_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);
status = osMessageQueuePut(env->queue_input_get_Status_Eva_Tgt, &model_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);
status = osMessageQueuePut(env->queue_input_get_Status_IO, &model_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);
status = osMessageQueuePut(env->queue_input_get_Status_Pwm, &model_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);
status = osMessageQueuePut(env->queue_input_get_Status_eComp, &model_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);
status = osMessageQueuePut(env->queue_input_get_Status_External, &model_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);
status = osMessageQueuePut(env->queue_input_get_Status_EMS, &model_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);
&model_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,
status = osMessageQueuePut(env->queue_input_get_Status_Duct_Select, &model_Status_Duct_Select_For_Model_input, 0,
0);
}
}
@ -2065,42 +2090,8 @@ static void CanUdsInput_Get_Model(tCanUds *env) {
}
// Это с выхода UDS
void CanUdsOutput_Set_Model(tCanUds *env) {
static 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;
@ -2182,64 +2173,135 @@ void CanUdsOutput_Set_Model(tCanUds *env) {
osStatus_t status = osOK;
uint32_t countQueue_space = osMessageQueueGetSpace(env->queue_input_get_Status_Sensor);
uint32_t countQueue_space = osMessageQueueGetSpace(env->queue_output_set_Status_Set);
if (countQueue_space) {
status = osMessageQueuePut(env->queue_input_get_Status_Sensor, &env->Status_Set_For_Model_output, 0,
status = osMessageQueuePut(env->queue_output_set_Status_Set, &env->Status_Set_For_Model_output, 0,
0);
}
countQueue_space = osMessageQueueGetSpace(env->queue_input_get_Status_Actuator_DoorsActuator);
countQueue_space = osMessageQueueGetSpace(env->queue_output_set_Status_Actuator_DoorsActuator);
if (countQueue_space) {
status = osMessageQueuePut(env->queue_input_get_Status_Actuator_DoorsActuator,
status = osMessageQueuePut(env->queue_output_set_Status_Actuator_DoorsActuator,
&env->Status_Actuator_DoorsActuator_For_Model_output, 0, 0);
}
countQueue_space = osMessageQueueGetSpace(env->queue_input_get_Status_Duct_Tgt);
countQueue_space = osMessageQueueGetSpace(env->queue_output_set_Status_Duct_Tgt);
if (countQueue_space) {
status = osMessageQueuePut(env->queue_input_get_Status_Duct_Tgt, &env->Status_Duct_Tgt_For_Model_output, 0, 0);
status = osMessageQueuePut(env->queue_output_set_Status_Duct_Tgt, &env->Status_Duct_Tgt_For_Model_output, 0, 0);
}
countQueue_space = osMessageQueueGetSpace(env->queue_input_get_Status_Eva_Tgt);
countQueue_space = osMessageQueueGetSpace(env->queue_output_set_Status_Eva_Tgt);
if (countQueue_space) {
status = osMessageQueuePut(env->queue_input_get_Status_Eva_Tgt, &env->Status_Eva_Tgt_For_Model_output, 0, 0);
status = osMessageQueuePut(env->queue_output_set_Status_Eva_Tgt, &env->Status_Eva_Tgt_For_Model_output, 0, 0);
}
countQueue_space = osMessageQueueGetSpace(env->queue_input_get_Status_IO);
countQueue_space = osMessageQueueGetSpace(env->queue_output_set_Status_IO);
if (countQueue_space) {
status = osMessageQueuePut(env->queue_input_get_Status_IO, &env->Status_IO_For_Model_output, 0, 0);
status = osMessageQueuePut(env->queue_output_set_Status_IO, &env->Status_IO_For_Model_output, 0, 0);
}
countQueue_space = osMessageQueueGetSpace(env->queue_input_get_Status_Pwm);
countQueue_space = osMessageQueueGetSpace(env->queue_output_set_Status_Pwm);
if (countQueue_space) {
status = osMessageQueuePut(env->queue_input_get_Status_Pwm, &env->Status_Pwm_For_Model_output, 0, 0);
status = osMessageQueuePut(env->queue_output_set_Status_Pwm, &env->Status_Pwm_For_Model_output, 0, 0);
}
countQueue_space = osMessageQueueGetSpace(env->queue_input_get_Status_eComp);
countQueue_space = osMessageQueueGetSpace(env->queue_output_set_Status_eComp);
if (countQueue_space) {
status = osMessageQueuePut(env->queue_input_get_Status_eComp, &env->Status_eComp_For_Model_output, 0, 0);
status = osMessageQueuePut(env->queue_output_set_Status_eComp, &env->Status_eComp_For_Model_output, 0, 0);
}
countQueue_space = osMessageQueueGetSpace(env->queue_input_get_Status_External);
countQueue_space = osMessageQueueGetSpace(env->queue_output_set_Status_External);
if (countQueue_space) {
status = osMessageQueuePut(env->queue_input_get_Status_External, &env->Status_External_For_Model_output, 0, 0);
status = osMessageQueuePut(env->queue_output_set_Status_External, &env->Status_External_For_Model_output, 0, 0);
}
countQueue_space = osMessageQueueGetSpace(env->queue_input_get_Status_EMS);
countQueue_space = osMessageQueueGetSpace(env->queue_output_set_Status_EMS);
if (countQueue_space) {
status = osMessageQueuePut(env->queue_input_get_Status_EMS, &env->Status_EMS_For_Model_output, 0, 0);
status = osMessageQueuePut(env->queue_output_set_Status_EMS, &env->Status_EMS_For_Model_output, 0, 0);
}
countQueue_space = osMessageQueueGetSpace(env->queue_input_get_Status_Ionizer_Aroma);
countQueue_space = osMessageQueueGetSpace(env->queue_output_set_Status_Ionizer_Aroma);
if (countQueue_space) {
status = osMessageQueuePut(env->queue_input_get_Status_Ionizer_Aroma,
status = osMessageQueuePut(env->queue_output_set_Status_Ionizer_Aroma,
&env->Status_Ionizer_Aroma_For_Model_output,
0, 0);
}
countQueue_space = osMessageQueueGetSpace(env->queue_input_get_Status_Duct_Select);
countQueue_space = osMessageQueueGetSpace(env->queue_output_set_Status_Duct_Select);
if (countQueue_space) {
status = osMessageQueuePut(env->queue_input_get_Status_Duct_Select, &env->Status_Duct_Select_For_Model_output,
status = osMessageQueuePut(env->queue_output_set_Status_Duct_Select, &env->Status_Duct_Select_For_Model_output,
0,
0);
}
}
// Это на вход модели
void CanUdsOutput_Get_Model(tCanUds *env) {
osStatus_t status = osOK;
uint32_t countQueue_space = osMessageQueueGetSpace(env->queue_output_set_Status_Set);
if (countQueue_space == 0) {
status = osMessageQueueGet(env->queue_output_set_Status_Set, &model_Status_Set_For_Model_output, 0,
0);
}
countQueue_space = osMessageQueueGetSpace(env->queue_output_set_Status_Actuator_DoorsActuator);
if (countQueue_space == 0) {
status = osMessageQueueGet(env->queue_output_set_Status_Actuator_DoorsActuator,
&model_Status_Actuator_DoorsActuator_For_Model_output, 0, 0);
}
countQueue_space = osMessageQueueGetSpace(env->queue_output_set_Status_Duct_Tgt);
if (countQueue_space == 0) {
status = osMessageQueueGet(env->queue_output_set_Status_Duct_Tgt, &model_Status_Duct_Tgt_For_Model_output, 0, 0);
}
countQueue_space = osMessageQueueGetSpace(env->queue_output_set_Status_Eva_Tgt);
if (countQueue_space == 0) {
status = osMessageQueueGet(env->queue_output_set_Status_Eva_Tgt, &model_Status_Eva_Tgt_For_Model_output, 0, 0);
}
countQueue_space = osMessageQueueGetSpace(env->queue_output_set_Status_IO);
if (countQueue_space == 0) {
status = osMessageQueueGet(env->queue_output_set_Status_IO, &model_Status_IO_For_Model_output, 0, 0);
}
countQueue_space = osMessageQueueGetSpace(env->queue_output_set_Status_Pwm);
if (countQueue_space == 0) {
status = osMessageQueueGet(env->queue_output_set_Status_Pwm, &model_Status_Pwm_For_Model_output, 0, 0);
}
countQueue_space = osMessageQueueGetSpace(env->queue_output_set_Status_eComp);
if (countQueue_space == 0) {
status = osMessageQueueGet(env->queue_output_set_Status_eComp, &model_Status_eComp_For_Model_output, 0, 0);
}
countQueue_space = osMessageQueueGetSpace(env->queue_output_set_Status_External);
if (countQueue_space == 0) {
status = osMessageQueueGet(env->queue_output_set_Status_External, &model_Status_External_For_Model_output, 0, 0);
}
countQueue_space = osMessageQueueGetSpace(env->queue_output_set_Status_EMS);
if (countQueue_space == 0) {
status = osMessageQueueGet(env->queue_output_set_Status_EMS, &model_Status_EMS_For_Model_output, 0, 0);
}
countQueue_space = osMessageQueueGetSpace(env->queue_output_set_Status_Ionizer_Aroma);
if (countQueue_space == 0) {
status = osMessageQueueGet(env->queue_output_set_Status_Ionizer_Aroma,
&model_Status_Ionizer_Aroma_For_Model_output,
0, 0);
}
countQueue_space = osMessageQueueGetSpace(env->queue_output_set_Status_Duct_Select);
if (countQueue_space == 0) {
status = osMessageQueueGet(env->queue_output_set_Status_Duct_Select, &model_Status_Duct_Select_For_Model_output,
0,
0);
}
@ -2593,6 +2655,8 @@ void CanUds(tCanUds *env) {
}
CanUdsOutput_Set_Model(env);
osMutexRelease(env->access);
} else {
LoggerErrorStatic(LOGGER, LOG_SIGN, "Access error CanUds");
@ -2604,7 +2668,11 @@ void CanUds(tCanUds *env) {
void CanSerialPortCanUds_Start(tCanUds *env) {
ThreadBlock_Start(env->T_can_Uds, env, CanUds);
// ThreadBlock_Start(env->T_can_Uds, env, CanUds);
if (!env->thread_Uds.id) {
env->thread_Uds.id = osThreadNew((osThreadFunc_t) (CanUds), (void *) (env), &env->thread_Uds.attr);
}
CanSerialPortFrameTp_Start(&env->canSerialPortFrameTp);
}
@ -2648,8 +2716,7 @@ void CanUds_Init(
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_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);
@ -2712,5 +2779,8 @@ void CanUds_Init(
env->currentSession = UDS_session_defaultSession;
statusData.Status_Active_Diagnostic_Session.Active_Diagnostic_Session = UDS_session_defaultSession;
InitThreadBlock(env->T_can_Uds, "UdsTester", osPriorityNormal);
// InitThreadBlock(env->T_can_Uds, "UdsTester", osPriorityNormal);
InitThreadAtrStatic(&env->thread_Uds.attr, "UdsTester", env->thread_Uds.controlBlock, env->thread_Uds.stack,
osPriorityNormal);
};

View File

@ -287,8 +287,14 @@ typedef struct {
osMessageQueueId_t queue_output_set_Status_Ionizer_Aroma;
osMessageQueueId_t queue_output_set_Status_Duct_Select;
struct {
osThreadId_t id;
uint32_t stack[384];
StaticTask_t controlBlock;
osThreadAttr_t attr;
} thread_Uds;
tStaticThreadBlock(384) T_can_Uds;
// tStaticThreadBlock(384) T_can_Uds;
} tCanUds;
typedef uint16_t (*uds_func_ptr)(tCanUds *env);
@ -314,6 +320,10 @@ void CanUds_Init(
void CanSerialPortCanUds_Start(tCanUds *env);
void CanUdsOutput_Set_Model(tCanUds *env);
// Тут данные должны быть с модели &env->Status_Sensor_For_Model_input и т.д.
void CanUdsInput_Set_Model(tCanUds *env);
// Это на вход модели
void CanUdsOutput_Get_Model(tCanUds *env);
#endif //HVAC_M7_CANUDS_H