Beispiel #1
0
/****f* xml_element/xml_elem_new
 * NAME
 *   xml_elem_new
 * SYNOPSIS
 *   xml_element* xml_elem_new()
 * FUNCTION
 *   allocates and initializes a new xml_element
 * INPUTS
 *   none
 * RESULT
 *   xml_element* or NULL.  NULL indicates an out-of-memory condition.
 * NOTES
 * SEE ALSO
 *   xml_elem_free ()
 *   xml_elem_free_non_recurse ()
 * SOURCE
 */
xml_element* xml_elem_new() {
   xml_element* elem = calloc(1, sizeof(xml_element));
   if(elem) {
      Q_Init(&elem->children);
      Q_Init(&elem->attrs);
      simplestring_init(&elem->text);

      /* init empty string in case we don't find any char data */
      simplestring_addn(&elem->text, "", 0);
   }
   return elem;
}
int main(int argc, char *argv[])
{
	int 				policy;
	struct 	sched_param param;
	pthread_attr_t 		attr;
	char				buffer[1024];
	int 				err;

	dprintf("init\n");
	if(argc != 2) {
		perr(AR_ERR_BAD_INIT_PARAM);
		printf("Useage: %s INSTANCE\n", AR_MODULE_NAME);
		return(AR_ERR_BAD_INIT_PARAM);
	}

	memset(&config, 0, sizeof(config));
	erret(init_config(AR_MODULE_NAME, atoi(argv[1]), &config.base));
	erret(read_config_int(config.base.name, 	"PRIORITY", &config.priority));
	erret(read_config_int(config.base.name, 	"PRIORITY_DGPS_CORR_DATA", &config.priority_dgps_corr_data));
	erret(read_config_string(config.base.name,	"DEVICE", config.ser_device, sizeof(config.ser_device)));
	err = read_config_int_tab(config.base.name, "QUEUE_INDEX", "QUEUE_IN_GPS_CORR", &config.queue_corr_data);
	if(err != 0) {
		erret(read_config_string(config.base.name,	"DEVICE_CORR_DATA_READ", config.ser_device_corr_data_read, sizeof(config.ser_device_corr_data_read)));
//		fprintf(stderr, "DGPS correction data from ser. device <%s>\n", config.ser_device_corr_data_read);
	} else {
//		fprintf(stderr, "DGPS correction data from queue <%d>\n", config.queue_corr_data);
	}
	memset(buffer, 0, sizeof(buffer));
	config.corr_mode = -1;
	erret(read_config_string(config.base.name,	"CORRECTION_MODE", buffer, sizeof(buffer)));
	if(strnicmp(buffer, "RTCA", strlen("RTCA")) == 0) {
		config.corr_mode = OEM4_RTCA_MODE;
	} else if(strnicmp(buffer, "RTCM", strlen("RTCM")) == 0) {
		config.corr_mode = OEM4_RTCM_MODE;
	} else {
		perrs(AR_ERR_BAD_INIT_PARAM, "Correction data mode not specified (RTCA | RTCM).");
	//	return(AR_ERR_BAD_INIT_PARAM);
	}
	erret(read_config_int_tab(config.base.name, "SHM_INDEX", "SHM_OUT_GPS_POS",	&config.ishm_pos_out));
	erret(read_config_int_tab(config.base.name, "SHM_INDEX", "SHM_OUT_GPS_VEL",	&config.ishm_vel_out));
	if(read_config_int(config.base.name, "UTC_OFFSET", &config.utc_offset)) {
		config.utc_offset = 15;
	}

	erret(SHM_Init());
	erret(SHM_InitSlot(config.ishm_pos_out, sizeof(gps_pos_novatel_t)));
	erret(SHM_InitSlot(config.ishm_vel_out, sizeof(gps_vel_novatel_t)));

	if(config.queue_corr_data != 0) {
		erret(Q_Init());
		erret(Q_InitSlot(config.queue_corr_data, sizeof(gps_corr_t), MAX_GPS_CORRECTION_Q_ITEMS_NUMBER, 1));
	} else if (strlen(config.ser_device_corr_data_read)>0){
		erret(open_comport(&fd_corr_data_read, config.ser_device_corr_data_read, O_RDWR, 115200));
	}

	erret(open_comport(&fd, config.ser_device, O_RDWR, 57600));
	if(0){
		struct termios 	termios_p;
		if(tcgetattr(fd, &termios_p)==0) {
			termios_p.c_cc[VTIME] = 1; // 2*0.1s = 0.2s
			termios_p.c_cc[VMIN] = 0;
			tcsetattr(fd, TCSADRAIN, &termios_p);
		} else fprintf(stderr, "failed to set read timeout\n");
	}


	//create thread for reading and writing of the correction data:
	ifret(pthread_getschedparam(pthread_self(), &policy, &param), AR_ERR_SYS_RESOURCES);
	param.sched_priority = config.priority_dgps_corr_data;
	pthread_attr_init( &attr );
	ifret(pthread_attr_setschedparam(&attr, &param), AR_ERR_SYS_RESOURCES);
	ifret(pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED), AR_ERR_SYS_RESOURCES);
	ifret(pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED), AR_ERR_SYS_RESOURCES);
	if(config.corr_mode == OEM4_RTCA_MODE) {
		ifret(write(fd, OEM4_INIT_ROVER_RTCA, strlen(OEM4_INIT_ROVER_RTCA))==-1, AR_ERR_IO_ERROR);
		ifret(pthread_create(&pthreads[0], &attr, &corr_data_thread_func, NULL), AR_ERR_SYS_RESOURCES);
	} else if(config.corr_mode == OEM4_RTCM_MODE) {
		ifret(write(fd, OEM4_INIT_ROVER_RTCM, strlen(OEM4_INIT_ROVER_RTCM))==-1, AR_ERR_IO_ERROR);
		ifret(pthread_create(&pthreads[0], &attr, &corr_data_thread_func, NULL), AR_ERR_SYS_RESOURCES);
	} else
	{
		ifret(write(fd, OEM4_INIT_ROVER_COM1, strlen(OEM4_INIT_ROVER_COM1))==-1, AR_ERR_IO_ERROR);
		printf("running without differential data\n");
	}


	ifret(pthread_getschedparam(pthread_self(), &policy, &param), AR_ERR_SYS_RESOURCES);
	param.sched_priority = config.priority;
	ifret(pthread_setschedparam(pthread_self(), policy, &param), AR_ERR_SYS_RESOURCES);
	while(1) {
		errp(read_data());
	}
	return 0;
}
Beispiel #3
0
/**
 * @ingroup app
 * @brief
 * ״̬����ʼ������ʼ����ָ��״̬S0
 * @details
 * @param ��
 * @retval  ��
 * @note
 * @code
 * @endcode
 */
void Initial(QEVENT const *e)
{
   bFoo = false;
   Q_Init((QSTATE)s0);
}
int main(int argc, char* argv[])
{
	int 				policy;
	struct 	sched_param param;
	char				buffer[1024];

	dprintf("init\n");

	if(argc != 2)
	{
		perr(AR_ERR_BAD_INIT_PARAM);
		printf("Useage: %s INSTANCE\n", AR_MODULE_NAME);
		return(AR_ERR_BAD_INIT_PARAM);
	}

	erret(init_config(AR_MODULE_NAME, atoi(argv[1]), &config.base));
	erret(read_config_int(config.base.name, "PRIORITY", &config.priority));
	erret(read_config_string(config.base.name, "DEVICE", config.ser_device, sizeof(config.ser_device)));

	memset(buffer, 0, sizeof(buffer));
	erret(read_config_string(config.base.name, "CORRECTION_MODE", buffer, sizeof(buffer)));
	if(strnicmp(buffer, "RTCA", strlen("RTCA")) == 0)
		config.corr_mode = OEMX_RTCA_MODE;
	else if(strnicmp(buffer, "RTCM", strlen("RTCM")) == 0)
		config.corr_mode = OEMX_RTCM_MODE;
	else {
		perrs(AR_ERR_BAD_INIT_PARAM, "Correction data mode not specified (RTCA | RTCM).");
		return(AR_ERR_BAD_INIT_PARAM);
	}

	erret(open_comport(&fd, config.ser_device, O_RDWR, 115200));
	memset(buffer, 0, sizeof(buffer));
	erret(read_config_string(config.base.name, "GPS_MODE", buffer, sizeof(buffer)));
	if(strnicmp(buffer, "OEM4", strlen("OEM4")) == 0)
		config.gps_mode = OEM4_GPS;
	else if(strnicmp(buffer, "OEM5", strlen("OEM5")) == 0)
		config.gps_mode = OEM4_GPS;
	else {
		perrs(AR_ERR_BAD_INIT_PARAM, "GPS_MODE must be OEM4 or OEM5.");
		return(AR_ERR_BAD_INIT_PARAM);
	}

	//ifret(write(fd, OEM4_INIT_ROVER_COM1, strlen(OEM4_INIT_ROVER_COM1))==-1, AR_ERR_IO_ERROR);
/*
	if(config.gps_mode == OEM4_GPS && config.corr_mode == OEMX_RTCA_MODE) {
		ifret(write(fd, OEM4_INIT_RTCA, strlen(OEM4_INIT_RTCA))==-1, AR_ERR_IO_ERROR);
		printf("INIT RTCA\n");
	} else if(config.gps_mode == OEM4_GPS && config.corr_mode == OEMX_RTCM_MODE) {
		struct termios 	termios_p;
		int rlen=0;
		if(tcgetattr(fd, &termios_p)==0) {
			termios_p.c_cc[VTIME] = 10; // 2*0.1s = 0.2s
			termios_p.c_cc[VMIN] = 0;
			tcsetattr(fd, TCSANOW, &termios_p);
		}
		sprintf(buffer, "unlogall com2\n\r");
		sleep(1);
		write(fd,buffer, strlen(buffer));
		rlen=read(fd,buffer,sizeof(buffer)-1);
		buffer[rlen]=0;
		printf("%s\n---\n",buffer);
		ifret(write(fd, OEM4_INIT_RTCM, strlen(OEM4_INIT_RTCM))==-1, AR_ERR_IO_ERROR);
		sleep(1);
		write(fd,buffer, strlen(buffer));
		rlen=read(fd,buffer,sizeof(buffer)-1);
		buffer[rlen]=0;
		printf("%s\n---\n",buffer);

		printf("INIT RTCM\n");
	} else {
		perrs(AR_ERR_BAD_INIT_PARAM, "can not initialized mode for corr. data\n");
		return(AR_ERR_BAD_INIT_PARAM);
	}
*/

	config.queue_corr_data_1 = 0;
	config.queue_corr_data_2 = 0;
	config.queue_corr_data_3 = 0;
	config.queue_corr_data_4 = 0;
	config.queue_corr_data_5 = 0;
	config.queue_corr_data_6 = 0;
	erret(read_config_int_tab(config.base.name, "QUEUE_INDEX", "QUEUE_OUT_GPS_CORRCTION_1", &config.queue_corr_data_1));
	erret(Q_Init());
	erret(Q_InitSlot(config.queue_corr_data_1, sizeof(gps_corr_t), MAX_GPS_CORRECTION_Q_ITEMS_NUMBER, 0));
	if(read_config_int_tab(config.base.name, "QUEUE_INDEX", "QUEUE_OUT_GPS_CORRCTION_2", &config.queue_corr_data_2)==0) {
		erret(Q_InitSlot(config.queue_corr_data_2, sizeof(gps_corr_t), MAX_GPS_CORRECTION_Q_ITEMS_NUMBER, 0));
	}
	if(read_config_int_tab(config.base.name, "QUEUE_INDEX", "QUEUE_OUT_GPS_CORRCTION_3", &config.queue_corr_data_3)==0) {
		erret(Q_InitSlot(config.queue_corr_data_3, sizeof(gps_corr_t), MAX_GPS_CORRECTION_Q_ITEMS_NUMBER, 0));
	}
	if(read_config_int_tab(config.base.name, "QUEUE_INDEX", "QUEUE_OUT_GPS_CORRCTION_4", &config.queue_corr_data_4)==0) {
		erret(Q_InitSlot(config.queue_corr_data_4, sizeof(gps_corr_t), MAX_GPS_CORRECTION_Q_ITEMS_NUMBER, 0));
	}
	if(read_config_int_tab(config.base.name, "QUEUE_INDEX", "QUEUE_OUT_GPS_CORRCTION_5", &config.queue_corr_data_5)==0) {
		erret(Q_InitSlot(config.queue_corr_data_5, sizeof(gps_corr_t), MAX_GPS_CORRECTION_Q_ITEMS_NUMBER, 0));
	}
	if(read_config_int_tab(config.base.name, "QUEUE_INDEX", "QUEUE_OUT_GPS_CORRCTION_6", &config.queue_corr_data_6)==0) {
		erret(Q_InitSlot(config.queue_corr_data_6, sizeof(gps_corr_t), MAX_GPS_CORRECTION_Q_ITEMS_NUMBER, 0));
	}
	//both queues are initialized in non-blocking mode; if one of communicators is blocked,
	//the second one continues to transmit the data

	ifret(pthread_getschedparam(pthread_self(), &policy, &param), AR_ERR_SYS_RESOURCES);
	param.sched_priority = config.priority;
	ifret(pthread_setschedparam(pthread_self(), policy, &param), AR_ERR_SYS_RESOURCES);

	read_corr_data_loop();

	return(0);
}