3.2 pony_init - p-o-n-y/pony GitHub Wiki
pony_init инициализирует структуру pony.
cfg - строка конфигурации.
Функция возвращает 0 при успешном завершении и -1 при неуспешном завершении.
char pony_init(char* cfg)
{
int i;
int grouplen;
char* groupptr;
for (pony.cfglength = 0; cfg[pony.cfglength]; pony.cfglength++);
if ((pony.cfg = (char *)malloc(sizeof(char) * (pony.cfglength + 1))) == NULL)
{
pony_free();
return 0;
}
for (i = 0; i < pony.cfglength; i++)
pony.cfg[i] = cfg[i];
pony.cfg[pony.cfglength] = '\0';
pony_locatecfggroup("", pony.cfg, pony.cfglength, &pony.bus.cfg, &pony.bus.cfglength); // выделяет общую часть конфигурации.
// инициализация подключаемых частей pony
pony.exitplnum = -1;
return 1;
}
Инициализация части pony состоит из двух частей: независящей от архитектуры pony и зависящей
Шаблон обязательной части:
if (pony_locatecfggroup("название группы:", ссылка на подстроку конфигурации, длина подстроки конфигурации, &groupptr, &grouplen))
{
if ((подструктура на pony = (название типа структуры*)calloc(sizeof(название типа структуры), 1)) == NULL)
{
pony_free();
return 0; // прерывает imu в случае неудачи.
}
подструктура на pony->cfg = groupptr;
подструктура на pony->cfglength = grouplen;
}
Пример:
if (pony_locatecfggroup("imu:", pony.cfg, pony.cfglength, &groupptr, &grouplen))
{
if ((pony.bus.imu = (pony_imu*)calloc(sizeof(pony_imu), 1)) == NULL)
{
pony_free();
return 0;
}
pony.bus.imu->cfg = groupptr;
pony.bus.imu->cfglength = grouplen;
}
После строки подструктура на pony->cfglength = grouplen;
пишется часть, зависящая от структуры pony.
В нее могут входить собственные определения пользователя, а также обязаны входить выделения памяти указателям и проверка на успешность этого. При использовании setDASize
нудно использовать конструкцию
if (!(pony_setDASize(&(инициализируемый dataArray 1), необходимый размер) && pony_setDASize(&(инициализируемый dataArray 2), необходимый размер) && pony_setDASize(&(инициализируемый dataArray 3), необходимый размер)))
{
pony_free();
return 0;
}
Пример:
if (!( pony_setDASize(&(pony.bus.gnss->gps->iono_a), 4) && pony_setDASize(&(pony.bus.gnss->gps->iono_b), 4) && pony_setDASize(&(pony.bus.gnss->gps->clock_corr), 3)))
{
pony_free();
return 0;
}
При самостоятельной инициализации необходимо использовать конструкцию
if ((указатель на массив = (название типа данных*)calloc(sizeof(название типа данных), размер массива)) == NULL)
{
pony_free();
return 0;
}
Пример:
if ((pony.bus.gnss->gps->sat = (pony_gnss_sat*)calloc(sizeof(pony_gnss_sat), pony.bus.gnss->gps->max_sat_num)) == NULL)
{
pony_free();
return 0;
}
Части pony могут быть вложены друг в друга, поэтому и инициализировать их надо поочередно.
Пример:
if (pony_locatecfggroup("gnss:", pony.cfg, pony.cfglength, &groupptr, &grouplen))
{
if ((pony.bus.gnss = (pony_gnss*)calloc(sizeof(pony_gnss), 1)) == NULL)
{
pony_free();
return 0;
}
pony.bus.gnss->cfg = groupptr;
pony.bus.gnss->cfglength = grouplen;
pony_locatecfggroup("", pony.bus.gnss->cfg, pony.bus.gnss->cfglength, &(pony.bus.gnss->wcfg), &(pony.bus.gnss->wcfglength));
if (pony_locatecfggroup("gps:", pony.bus.gnss->cfg, pony.bus.gnss->cfglength, &groupptr, &grouplen))
{
if ((pony.bus.gnss->gps = (pony_gnss_gps*)calloc(sizeof(pony_gnss_gps), 1)) == NULL)
{
pony_free();
return 0;
}
pony.bus.gnss->gps->cfg = groupptr;
pony.bus.gnss->gps->cfglength = grouplen;
pony.bus.gnss->gps->max_sat_num = gps_max_sat_number;
if ((pony.bus.gnss->gps->sat = (pony_gnss_sat*)calloc(sizeof(pony_gnss_sat), pony.bus.gnss->gps->max_sat_num)) == NULL)
{
pony_free();
return 0;
}
}
}