⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gpxlogger.c

📁 gpsd, a popular GPS daemon.
💻 C
字号:
/* $Id: gpxlogger.c 4542 2007-12-12 20:03:05Z ckuethe $ */#include <sys/types.h>#include <string.h>#include <stdlib.h>#include <syslog.h>#include <math.h>#include <time.h>#include <signal.h>#include <glib.h>#include <dbus/dbus.h>#include <dbus/dbus-glib-lowlevel.h>#include <dbus/dbus-glib.h>#include <glib/gprintf.h>#include "gpsd_config.h"#include "gps.h"DBusConnection* connection;static char *author = "Amaury Jacquot";static char *copyright = "BSD or GPL v 2.0";static int intrack = 0;static int first = 1;static time_t tracklimit = 5; /* seconds */static struct {	time_t	old_time;	time_t	time;	gint32	mode;	gdouble	ept;	gdouble	latitude;	gdouble	longitude;	gdouble eph;	gdouble altitude;	gdouble epv;	gdouble	track;	gdouble epd;	gdouble	speed;	gdouble	eps;	gdouble	climb;	gdouble epc;	//gdouble separation;} gpsfix;static void print_gpx_trk_start (void) {	fprintf (stdout, " <trk>\n");	fprintf (stdout, "  <trkseg>\n");	fflush (stdout);}static void print_gpx_trk_end (void) {	fprintf (stdout, "  </trkseg>\n");	fprintf (stdout, " </trk>\n");	fflush (stdout);}static DBusHandlerResult handle_gps_fix (DBusMessage* message) {	DBusError	error;	double		temp_time;	dbus_error_init (&error);	dbus_message_get_args (message,			       &error,			       DBUS_TYPE_DOUBLE, &temp_time,			       DBUS_TYPE_INT32,	 &gpsfix.mode,			       DBUS_TYPE_DOUBLE, &gpsfix.ept,			       DBUS_TYPE_DOUBLE, &gpsfix.latitude,			       DBUS_TYPE_DOUBLE, &gpsfix.longitude,			       DBUS_TYPE_DOUBLE, &gpsfix.eph,			       DBUS_TYPE_DOUBLE, &gpsfix.altitude,			       DBUS_TYPE_DOUBLE, &gpsfix.epv,			       DBUS_TYPE_DOUBLE, &gpsfix.track,			       DBUS_TYPE_DOUBLE, &gpsfix.epd,			       DBUS_TYPE_DOUBLE, &gpsfix.speed,			       DBUS_TYPE_DOUBLE, &gpsfix.eps,			       DBUS_TYPE_DOUBLE, &gpsfix.climb,			       DBUS_TYPE_DOUBLE, &gpsfix.epc,			       DBUS_TYPE_INVALID);	gpsfix.time = floor(temp_time);		/* 	 * we have a fix there - log the point	 */	if ((gpsfix.time!=gpsfix.old_time)&&gpsfix.mode>1) {		struct tm 	time;		/* Make new track if the jump in time is above		 * tracklimit.  Handle jumps both forward and		 * backwards in time.  The clock sometimes jump		 * backward when gpsd is submitting junk on the		 * dbus. */		if (fabs(gpsfix.time - gpsfix.old_time) > tracklimit && !first) {			print_gpx_trk_end();			intrack = 0;		}		if (!intrack) {			print_gpx_trk_start();			intrack = 1;			if (first)			    first = 0;		}				gpsfix.old_time = gpsfix.time;		fprintf (stdout, "   <trkpt lat=\"%f\" lon=\"%f\">\n", gpsfix.latitude, gpsfix.longitude);		fprintf (stdout, "    <ele>%f</ele>\n", gpsfix.altitude);		gmtime_r (&(gpsfix.time), &time);		fprintf (stdout, "    <time>%04d-%02d-%02dT%02d:%02d:%02dZ</time>\n",				time.tm_year+1900, time.tm_mon+1, time.tm_mday,				time.tm_hour, time.tm_min, time.tm_sec);		if (gpsfix.mode==1)			fprintf (stdout, "    <fix>none</fix>\n");		else			fprintf (stdout, "    <fix>%dd</fix>\n", gpsfix.mode);		fprintf (stdout, "   </trkpt>\n");		fflush (stdout);	}	return DBUS_HANDLER_RESULT_HANDLED;}static void print_gpx_header (void) {	fprintf (stdout, "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");	fprintf (stdout, "<gpx version=\"1.1\" creator=\"navsys logger\"\n");	fprintf (stdout, "        xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n");	fprintf (stdout, "        xmlns=\"http://www.topografix.com/GPX/1.1\"\n");	fprintf (stdout, "        xsi:schemaLocation=\"http://www.topografix.com/GPS/1/1\n");	fprintf (stdout, "        http://www.topografix.com/GPX/1/1/gpx.xsd\">\n");	fprintf (stdout, " <metadata>\n");	fprintf (stdout, "  <name>NavSys GPS logger dump</name>\n");	fprintf (stdout, "  <author>%s</author>\n", author);	fprintf (stdout, "  <copyright>%s</copyright>\n", copyright);	fprintf (stdout, " </metadata>\n");	fflush (stdout);}static void print_gpx_footer (void) {	if (intrack)		print_gpx_trk_end();	fprintf (stdout, "</gpx>\n");	fclose (stdout);}static void quit_handler (int signum) {	syslog (LOG_INFO, "exiting, signal %d received", signum);	print_gpx_footer ();	exit (0);}/* * Message dispatching function * */static DBusHandlerResult signal_handler (		DBusConnection* connection, DBusMessage* message) {	/* dummy, need to use the variable for some reason */	connection = NULL;		if (dbus_message_is_signal (message, "org.gpsd", "fix")) 		return handle_gps_fix (message);	/*	 * ignore all other messages	 */		return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;}int main (int argc, char** argv) {	GMainLoop* mainloop;	DBusError error;	/* initializes the gpsfix data structure */	gps_clear_fix(&gpsfix);	/* catch all interesting signals */	signal (SIGTERM, quit_handler);	signal (SIGQUIT, quit_handler);	signal (SIGINT, quit_handler);	//openlog ("gpxlogger", LOG_PID | LOG_NDELAY , LOG_DAEMON);	//syslog (LOG_INFO, "---------- STARTED ----------");		print_gpx_header ();		mainloop = g_main_loop_new (NULL, FALSE);	dbus_error_init (&error);	connection = dbus_bus_get (DBUS_BUS_SYSTEM, &error);	if (dbus_error_is_set (&error)) {		syslog (LOG_CRIT, "%s: %s", error.name, error.message);		return 3;	}		dbus_bus_add_match (connection, "type='signal'", &error);	if (dbus_error_is_set (&error)) {		syslog (LOG_CRIT, "unable to add match for signals %s: %s", error.name, error.message);		return 4;	}	if (!dbus_connection_add_filter (connection, (DBusHandleMessageFunction)signal_handler, NULL, NULL)) {		syslog (LOG_CRIT, "unable to register filter with the connection");		return 5;	}		dbus_connection_setup_with_g_main (connection, NULL);	g_main_loop_run (mainloop);	return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -