|
Писать/читать члены структуры генерик способом. |
|
|
|
Jul 20 2017, 11:30
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Есть структура с разными данными 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 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; В общем все команды одинаковы за исключением mot_data.член_структуры. Получается одна переменная - одна функция. Для того чтоб написать одну генерик функцию я думал создать указатель на член структуры Код uint32_t *ptr; ptr = &mot_data.max_ovc; //write *ptr = arguments[0]; //read Parser_SendInt(COM_USART, *ptr, 1, 0); и изменять только его в функции. но тут возникает вопрос - получается мне нужна еще одна функция которая тупо переберет 20 (или сколько там членов структуры) кейсов и найдет на какой член структуры указывать. как то получается довольно монструозно и не гибко.
Сообщение отредактировал Jenya7 - Jul 20 2017, 11:31
|
|
|
|
|
 |
Ответов
|
Jul 20 2017, 11:50
|
Знающий
   
Группа: Свой
Сообщений: 781
Регистрация: 3-10-04
Из: Санкт-Петербург
Пользователь №: 768

|
Цитата(Jenya7 @ Jul 20 2017, 14:30)  Есть структура с разными данными 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;
Структура маленькая, получайте и заполняйте ее целиком, парсить каждую уставку бессмысленно.
|
|
|
|
|
Jul 20 2017, 12:07
|
Знающий
   
Группа: Свой
Сообщений: 781
Регистрация: 3-10-04
Из: Санкт-Петербург
Пользователь №: 768

|
Цитата(Jenya7 @ Jul 20 2017, 15:05)  оператор хочет изменить/прочитать один параметр. он в команде передает мне какой. А кто протокол обмена придумал? Изменил один параметр, шлешь все уставки. P.S. Если нет команды поменять все, то начнется беда. Нужно применить набор новых уставок - будешь менять по одной. Так и вижу, как шлются и парсятся 20+ пакетов на изменение содержимого структуры )) А что, процессор зато занят )) P.P.S. К тому же писать сразу в ЕЕПРОМ совершенно незачем. Есть и врЕменные уставки.
|
|
|
|
|
Jul 20 2017, 12:31
|
Знающий
   
Группа: Свой
Сообщений: 781
Регистрация: 3-10-04
Из: Санкт-Петербург
Пользователь №: 768

|
Цитата(Jenya7 @ Jul 20 2017, 15:24)  Изменил один параметр, шлешь все уставки? Зачем? А какие противопоказания? Цитата вопрос когда записать в ЕЕПРОМ если не сразу? По команде. Можно и по другим признакам, кол-во перемен или время. Но надо ли? Команда "сохранить уставки" все решит.
|
|
|
|
Сообщений в этой теме
Jenya7 Писать/читать члены структуры генерик способом. Jul 20 2017, 11:30 k155la3 Цитата(Jenya7 @ Jul 20 2017, 14:30) . . .... Jul 20 2017, 12:40 Jenya7 Цитата(k155la3 @ Jul 20 2017, 18:40) Если... Jul 20 2017, 12:44 Tiro Цитата(k155la3 @ Jul 20 2017, 15:40) Если... Jul 20 2017, 12:55  Jenya7 Цитата(Tiro @ Jul 20 2017, 18:55) Вот тол... Jul 20 2017, 13:07   Tiro Цитата(Jenya7 @ Jul 20 2017, 16:07) Я отм... Jul 20 2017, 13:13  k155la3 Цитата(Tiro @ Jul 20 2017, 15:55) (1) Вот... Jul 20 2017, 13:46   Tiro Цитата(k155la3 @ Jul 20 2017, 16:46) (1) ... Jul 20 2017, 13:58 Jenya7 что то я туплю. как там математика с указателями? ... Jul 20 2017, 13:17 Tiro Цитата(Jenya7 @ Jul 20 2017, 16:17) что т... Jul 20 2017, 13:23  Jenya7 Цитата(Tiro @ Jul 20 2017, 19:23) Зачем? ... Jul 20 2017, 13:28   Tiro Цитата(Jenya7 @ Jul 20 2017, 16:28) мне н... Jul 20 2017, 13:33 Jenya7 еще раз
uint32_t *base_ptr;
base_ptr = mot_data+(s... Jul 20 2017, 13:59 Tiro Цитата(Jenya7 @ Jul 20 2017, 16:59) еще р... Jul 20 2017, 14:07  Jenya7 Цитата(Tiro @ Jul 20 2017, 20:07) Если пр... Jul 20 2017, 14:18   Tiro Цитата(Jenya7 @ Jul 20 2017, 17:18) это н... Jul 20 2017, 14:22 k155la3 Цитата(Jenya7 @ Jul 20 2017, 16:59) uint3... Jul 20 2017, 14:24  Tiro Цитата(k155la3 @ Jul 20 2017, 17:24) може... Jul 20 2017, 14:26  Jenya7 Цитата(k155la3 @ Jul 20 2017, 20:24) може... Jul 20 2017, 14:47   Tiro Цитата(Jenya7 @ Jul 20 2017, 17:47) а да?... Jul 20 2017, 14:49 Kabdim siplasplas Jul 20 2017, 14:03 Jenya7 можно так
при инициализации
.vp = &mot_data[... Jul 20 2017, 14:36 Tiro Цитата(Jenya7 @ Jul 20 2017, 17:36) ... Jul 20 2017, 14:44
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|