CODE
typedef struct MOTOR_DATA_S
{
uint32_t mot_num;
uint32_t mot_ena;
uint32_t sprof_ena;
uint32_t tprof_ena;
//run time
uint32_t state;
uint32_t dir;
uint32_t speed;
int32_t position;
uint32_t current;
uint32_t ovc;
uint32_t soft_start;
uint32_t soft_stop;
//hardware interface
uint32_t lim_sw_fwd;
uint32_t lim_sw_rev;
uint32_t pwm_tim;
uint32_t pwm_num;
uint32_t fwd_pwm_chan;
uint32_t rev_pwm_chan;
uint32_t adc_chan;
uint32_t enc_num;
uint32_t enc_type;
uint32_t start_stop;
//max limits
uint32_t fwd_pwm_run;
uint32_t rev_pwm_run;
uint32_t fwd_max_pos;
uint32_t rev_max_pos;
uint32_t max_current;
uint32_t max_ovc;
SPEED_PROFILE fwd_profile[MAX_PROFILES];
SPEED_PROFILE rev_profile[MAX_PROFILES];
TRAPEZ_PROFILE start_profile;
TRAPEZ_PROFILE stop_profile;
} MOTOR_DATA;
MOTOR_DATA mot_data;
{
uint32_t mot_num;
uint32_t mot_ena;
uint32_t sprof_ena;
uint32_t tprof_ena;
//run time
uint32_t state;
uint32_t dir;
uint32_t speed;
int32_t position;
uint32_t current;
uint32_t ovc;
uint32_t soft_start;
uint32_t soft_stop;
//hardware interface
uint32_t lim_sw_fwd;
uint32_t lim_sw_rev;
uint32_t pwm_tim;
uint32_t pwm_num;
uint32_t fwd_pwm_chan;
uint32_t rev_pwm_chan;
uint32_t adc_chan;
uint32_t enc_num;
uint32_t enc_type;
uint32_t start_stop;
//max limits
uint32_t fwd_pwm_run;
uint32_t rev_pwm_run;
uint32_t fwd_max_pos;
uint32_t rev_max_pos;
uint32_t max_current;
uint32_t max_ovc;
SPEED_PROFILE fwd_profile[MAX_PROFILES];
SPEED_PROFILE rev_profile[MAX_PROFILES];
TRAPEZ_PROFILE start_profile;
TRAPEZ_PROFILE stop_profile;
} MOTOR_DATA;
MOTOR_DATA mot_data;
Я пишу читаю члены структуры посредством команд пришедших с терминала. Ну например так
Код
uint32_t COM_Ovc(uint32_t argc, char** args)
{
uint32_t arguments[argc];
uint32_t addr_offset;
if (GetIntArguments(argc, args, arguments) == MSG_OK)
{
if (ValidateArgument(arguments[0], 0, 0xFFFF))
{
if (argc >0) // argument - write
{
mot_data.max_ovc = arguments[0];
EE_WriteVariable(EPR_ADR_OVC, arguments[0]);
}
else //no argument - read
Parser_SendInt(COM_USART, mot_data.max_ovc, 1, 0);
}
else
return MSG_INV_ARG;
}
else
return MSG_MIS_ARG;
return MSG_OK;
{
uint32_t arguments[argc];
uint32_t addr_offset;
if (GetIntArguments(argc, args, arguments) == MSG_OK)
{
if (ValidateArgument(arguments[0], 0, 0xFFFF))
{
if (argc >0) // argument - write
{
mot_data.max_ovc = arguments[0];
EE_WriteVariable(EPR_ADR_OVC, arguments[0]);
}
else //no argument - read
Parser_SendInt(COM_USART, mot_data.max_ovc, 1, 0);
}
else
return MSG_INV_ARG;
}
else
return MSG_MIS_ARG;
return MSG_OK;
В общем все команды одинаковы за исключением mot_data.член_структуры. Получается одна переменная - одна функция.
Для того чтоб написать одну генерик функцию я думал создать указатель на член структуры
Код
uint32_t *ptr;
ptr = &mot_data.max_ovc;
//write
*ptr = arguments[0];
//read
Parser_SendInt(COM_USART, *ptr, 1, 0);
ptr = &mot_data.max_ovc;
//write
*ptr = arguments[0];
//read
Parser_SendInt(COM_USART, *ptr, 1, 0);
и изменять только его в функции.
но тут возникает вопрос - получается мне нужна еще одна функция которая тупо переберет 20 (или сколько там членов структуры) кейсов и найдет на какой член структуры указывать.
как то получается довольно монструозно и не гибко.