Skip to content

3.2 pony_init

danniknikolaev edited this page Jun 14, 2019 · 2 revisions

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;
		}
            }

}

Clone this wiki locally