реклама на сайте
подробности

 
 
> Писать/читать члены структуры генерик способом.
Jenya7
сообщение Jul 20 2017, 11:30
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
k155la3
сообщение Jul 20 2017, 12:40
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(Jenya7 @ Jul 20 2017, 14:30) *
. . .
но тут возникает вопрос - получается мне нужна еще одна функция которая тупо переберет 20 (или сколько там членов структуры) кейсов и найдет на какой член структуры указывать. как то получается довольно монструозно и не гибко.


Если параметров достаточно много и разных ( а даже - и немного)
имеет смысл все параметры перечислить в некой "базе", и далее работать с ними для записи-чтения по коду (номеру в базе)
Причем при такой методе параметры могут быть самые "разношерстные", а доступ ведется перебором или по номеру-индексу.
Можно создавать списки из различных наборов переменных для записи.

Пишу "все оптом", тк использую флеш, а для нее - что байт, что страница - всеравно.
Код
struct SVarBase
{
    int     VarID;        // уникальный код переменной по e_VarIdCode
    void     * VarPtr;    // адрес переменной
    int        VarType;    // тип переменной по кодификации enum e_TypeVar
                // VarTypes.h
};

typedef const SVarBase TVarBase;


__root TVarBase VarBase[] =
{
  // ------------------- DATA --------------------------
     [eV_MM_Au     ]  = { eV_MM_Au,       &MM_Au,          T_REAL },
     // ----------
     [eV_MM_A1234_0]  = { eV_MM_A1234_0,  &MM_A1234[0],       T_REAL },
     [eV_MM_A1234_1]  = { eV_MM_A1234_1,  &MM_A1234[1],       T_REAL },
. . . .
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jul 20 2017, 12:44
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(k155la3 @ Jul 20 2017, 18:40) *
Если параметров достаточно много и разных ( а даже - и немного)
имеет смысл все параметры перечислить в некой "базе", и далее работать с ними для записи-чтения по коду (номеру в базе)
Причем при такой методе параметры могут быть самые "разношерстные", а доступ ведется перебором или по номеру-индексу.
Можно создавать списки из различных наборов переменных для записи.

Пишу "все оптом", тк использую флеш, а для нее - что байт, что страница - всеравно.
Код
struct SVarBase
{
    int     VarID;        // уникальный код переменной по e_VarIdCode
    void     * VarPtr;    // адрес переменной
    int        VarType;    // тип переменной по кодификации enum e_TypeVar
                // VarTypes.h
};

typedef const SVarBase TVarBase;


__root TVarBase VarBase[] =
{
  // ------------------- DATA --------------------------
     [eV_MM_Au     ]  = { eV_MM_Au,       &MM_Au,          T_REAL },
     // ----------
     [eV_MM_A1234_0]  = { eV_MM_A1234_0,  &MM_A1234[0],       T_REAL },
     [eV_MM_A1234_1]  = { eV_MM_A1234_1,  &MM_A1234[1],       T_REAL },
. . . .

а ну если так то я могу засунуть указатель в структуру принятой команды
Код
typedef struct COMMAND_S
{
    char *name;  //command name
    uint32_t command_type;
    uint32_t minargs;
    uint32_t maxargs;
    uint32_t (*fp)(unsigned int, char **); //fuction poiner

    //это я добавляю
    uint32_t *vp; //variable pointer
}COMMAND;

я все равно инициализирую структуру команд. так я добавлю указатель на переменную
Код
COMMAND commands[] =
{
    [0] = { "stop",  0, 1, MAX_ARGS, .fp = OneGlobFunc, .vp = NULL },
    [1] = { "start", 0, 1, MAX_ARGS, .fp = OneGlobFunc, .vp = NULL },
    [2] = { "fwd",   0, 1, MAX_ARGS, .fp = OneGlobFunc, .vp = NULL},
    [3] = { "rev",   0, 1, MAX_ARGS, .fp = OneGlobFunc, .vp = NULL},
    [4] = { "mot",   0, 1, MAX_ARGS, .fp = OneGlobFunc, .vp = NULL },
    [5] = { "pfb",   0, 1, MAX_ARGS, .fp = OneGlobFunc, .vp = &mot_data.pfb},
    [6] = { "ifb",   0, 1, MAX_ARGS, .fp = OneGlobFunc, .vp = &mot_data.ifb},
    [7] = { "ftop",  0, 1, MAX_ARGS, .fp = OneGlobFunc  .vp = &mot_data.fwd_max_pos },
    [8] = { "rtop",  0, 1, MAX_ARGS, .fp = OneGlobFunc  .vp = &mot_data.rev_max_pos}
};


ситуация несколько усложнилась. у меня мултиаксис поэтому массив структур mot_data[AXIS_NUM] . то есть мне надо инициализировать так
.vp = &mot_data[AXIS].pfb
проблема что AXIS передается аргументом в команде.

Сообщение отредактировал Jenya7 - Jul 20 2017, 12:57
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Jenya7   Писать/читать члены структуры генерик способом.   Jul 20 2017, 11:30
- - Tiro   Цитата(Jenya7 @ Jul 20 2017, 14:30) Есть ...   Jul 20 2017, 11:50
|- - Jenya7   Цитата(Tiro @ Jul 20 2017, 17:50) Структу...   Jul 20 2017, 12:05
|- - Tiro   Цитата(Jenya7 @ Jul 20 2017, 15:05) опера...   Jul 20 2017, 12:07
|- - Jenya7   Цитата(Tiro @ Jul 20 2017, 18:07) А кто п...   Jul 20 2017, 12:24
|- - Tiro   Цитата(Jenya7 @ Jul 20 2017, 15:24) Измен...   Jul 20 2017, 12:31
|- - 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


Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th June 2025 - 18:55
Рейтинг@Mail.ru


Страница сгенерированна за 0.01421 секунд с 7
ELECTRONIX ©2004-2016