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

📄 italk.c

📁 gpsd, a popular GPS daemon.
💻 C
📖 第 1 页 / 共 2 页
字号:
    case ITALK_SEARCH_DONE:    case ITALK_TRACK_DROP:    case ITALK_TRACK_STATUS:    case ITALK_HANDOVER_DATA:    case ITALK_CORE_SYNC:    case ITALK_WAAS_RAWDATA:    case ITALK_ASSISTANCE:    case ITALK_PULL_FIX:    case ITALK_MEMCTRL:    case ITALK_STOP_TASK:	gpsd_report(LOG_IO, "iTalk not processing packet: id 0x%02x length %d\n", type, len);	break;    default:	gpsd_report(LOG_IO, "iTalk unknown packet: id 0x%02x length %d\n", type, len);    }    if (mask == ERROR_SET)	mask = 0;    else	(void)snprintf(session->gpsdata.tag, sizeof(session->gpsdata.tag),	   "ITK-%02x",type);    return mask | ONLINE_SET;}/*@ -charint @*/static gps_mask_t italk_parse_input(struct gps_device_t *session){    gps_mask_t st;    if (session->packet.type == ITALK_PACKET){	st = italk_parse(session, session->packet.outbuffer, session->packet.outbuflen);	session->gpsdata.driver_mode = 1;	/* binary */	return st;#ifdef NMEA_ENABLE    } else if (session->packet.type == NMEA_PACKET) {	st = nmea_parse((char *)session->packet.outbuffer, session);	session->gpsdata.driver_mode = 0;	/* NMEA */	return st;#endif /* NMEA_ENABLE */    } else	return 0;}static bool italk_set_mode(struct gps_device_t *session UNUSED, 			      speed_t speed UNUSED, bool mode UNUSED){    /*@ +charint @*/    unsigned char msg[] = {0,};    /* HACK THE MESSAGE */    return italk_write(session->gpsdata.gps_fd, msg, sizeof(msg));    /*@ +charint @*/}static bool italk_speed(struct gps_device_t *session, speed_t speed){    return italk_set_mode(session, speed, true);}static void italk_mode(struct gps_device_t *session, int mode){    if (mode == 0) {	(void)gpsd_switch_driver(session, "Generic NMEA");	(void)italk_set_mode(session, session->gpsdata.baudrate, false);	session->gpsdata.driver_mode = 0;	/* NMEA */    } else	session->gpsdata.driver_mode = 1;	/* binary */}#ifdef ALLOW_RECONFIGUREstatic void italk_configurator(struct gps_device_t *session, unsigned int seq){    if (seq == 0 && session->packet.type == NMEA_PACKET)	(void)italk_set_mode(session, session->gpsdata.baudrate, true);}#endif /* ALLOW_RECONFIGURE */#ifdef __not_yet__static void italk_ping(struct gps_device_t *session)/* send a "ping". it may help us detect an itrax more quickly */{    char *ping = "<?>";    (void)gpsd_write(session, ping, 3);}#endif /* __not_yet__ *//* this is everything we export */struct gps_type_t italk_binary ={    .type_name      = "iTalk binary",	/* full name of type */    .trigger        = NULL,		/* recognize the type */    .channels       = 12,		/* consumer-grade GPS */    .probe_wakeup   = NULL,		/* no wakeup to be done before hunt */    .probe_detect   = NULL,        	/* how to detect at startup time */    .probe_subtype  = NULL,        	/* initialize the device */#ifdef ALLOW_RECONFIGURE    .configurator   = italk_configurator,/* configure the device */#endif /* ALLOW_RECONFIGURE */    .get_packet     = generic_get,	/* use generic packet grabber */    .parse_packet   = italk_parse_input,/* parse message packets */    .rtcm_writer    = pass_rtcm,	/* send RTCM data straight */    .speed_switcher = italk_speed,	/* we can change baud rates */    .mode_switcher  = italk_mode,	/* there is a mode switcher */    .rate_switcher  = NULL,		/* no sample-rate switcher */    .cycle_chars    = -1,		/* not relevant, no rate switch */#ifdef ALLOW_RECONFIGURE    .revert         = NULL,		/* no setting-reversion method */#endif /* ALLOW_RECONFIGURE */    .wrapup         = NULL,		/* no close hook */    .cycle          = 1,		/* updates every second */};#endif /* defined(ITRAX_ENABLE) && defined(BINARY_ENABLE) */#ifdef ANCIENT_ITRAX_ENABLE/************************************************************************** * * The NMEA mode of the iTrax chipset, as used in the FastTrax and others. * * As described by v1.31 of the NMEA Protocol Specification for the * iTrax02 Evaluation Kit, 2003-06-12. * v1.18 of the  manual, 2002-19-6, describes effectively * the same protocol, but without ZDA. * **************************************************************************//* * Enable GGA=0x2000, RMC=0x8000, GSA=0x0002, GSV=0x0001, ZDA=0x0004. * Disable GLL=0x1000, VTG=0x4000, FOM=0x0020, PPS=0x0010. * This is 82+75+67+(3*60)+34 = 438 characters  *  * 1200   => at most 1 fix per 4 seconds * 2400   => at most 1 fix per 2 seconds * 4800   => at most 1 fix per 1 seconds * 9600   => at most 2 fixes per second * 19200  => at most 4 fixes per second * 57600  => at most 13 fixes per second * 115200 => at most 26 fixes per second * * We'd use FOM, but they don't specify a confidence interval. */#define ITRAX_MODESTRING	"$PFST,NMEA,A007,%d\r\n"static int literal_send(int fd, const char *fmt, ... )/* ship a raw command to the GPS */{    int status;    char buf[BUFSIZ];    va_list ap;    va_start(ap, fmt) ;    (void)vsnprintf(buf, sizeof(buf), fmt, ap);    va_end(ap);    status = (int)write(fd, buf, strlen(buf));    if (status == (int)strlen(buf)) {	gpsd_report(LOG_IO, "=> GPS: %s\n", buf);	return status;    } else {	gpsd_report(LOG_WARN, "=> GPS: %s FAILED\n", buf);	return -1;    }}static void itrax_probe_subtype(struct gps_device_t *session, unsigned int seq)/* start it reporting */{    if (seq == 0) {	/* initialize GPS clock with current system time */ 	struct tm when;	double integral, fractional;	time_t intfixtime;	char buf[31], frac[6];	fractional = modf(timestamp(), &integral);	intfixtime = (time_t)integral;	(void)gmtime_r(&intfixtime, &when);	/* FIXME: so what if my local clock is wrong? */	(void)strftime(buf, sizeof(buf), "$PFST,INITAID,%H%M%S.XX,%d%m%y\r\n", &when);	(void)snprintf(frac, sizeof(frac), "%.2f", fractional);	buf[21] = frac[2]; buf[22] = frac[3];	(void)literal_send(session->gpsdata.gps_fd, buf);	/* maybe this should be considered a reconfiguration? */	(void)literal_send(session->gpsdata.gps_fd, "$PFST,START\r\n");    }}#ifdef ALLOW_RECONFIGUREstatic void itrax_configurator(struct gps_device_t *session, int seq)/* set synchronous mode */{    if (seq == 0) {	(void)literal_send(session->gpsdata.gps_fd, "$PFST,SYNCMODE,1\r\n");	(void)literal_send(session->gpsdata.gps_fd, 		    ITRAX_MODESTRING, session->gpsdata.baudrate);    }}#endif /* ALLOW_RECONFIGURE */static bool itrax_speed(struct gps_device_t *session, speed_t speed)/* change the baud rate */{#ifdef ALLOW_RECONFIGURE    return literal_send(session->gpsdata.gps_fd, ITRAX_MODESTRING, speed) >= 0;#else    return false;#endif /* ALLOW_RECONFIGURE */}static bool itrax_rate(struct gps_device_t *session, double rate)/* change the sample rate of the GPS */{#ifdef ALLOW_RECONFIGURE    return literal_send(session->gpsdata.gps_fd, "$PSFT,FIXRATE,%d\r\n", rate) >= 0;#else    return false;#endif /* ALLOW_RECONFIGURE */}static void itrax_wrap(struct gps_device_t *session)/* stop navigation, this cuts the power drain */{#ifdef ALLOW_RECONFIGURE    (void)literal_send(session->gpsdata.gps_fd, "$PFST,SYNCMODE,0\r\n");#endif /* ALLOW_RECONFIGURE */    (void)literal_send(session->gpsdata.gps_fd, "$PFST,STOP\r\n");}/*@ -redef @*/static struct gps_type_t itrax = {    .type_name     = "iTrax",		/* full name of type */    .trigger       = "$PFST,OK",	/* tells us to switch to Itrax */    .channels      = 12,		/* consumer-grade GPS */    .probe_wakeup  = NULL,		/* no wakeup to be done before hunt */    .probe_detect  = NULL,		/* no probe */    .probe_subtype = itrax_probe_subtype,	/* initialize */#ifdef ALLOW_RECONFIGURE    .configurator  = itrax_configurator,/* set synchronous mode */#endif /* ALLOW_RECONFIGURE */    .get_packet    = generic_get,	/* how to get a packet */    .parse_packet  = nmea_parse_input,	/* how to interpret a packet */    .rtcm_writer   = NULL,		/* iTrax doesn't support DGPS/WAAS/EGNOS */    .speed_switcher= itrax_speed,	/* no speed switcher */    .mode_switcher = NULL,		/* no mode switcher */    .rate_switcher = itrax_rate,	/* there's a sample-rate switcher */    .cycle_chars   = 438,		/* not relevant, no rate switch */#ifdef ALLOW_RECONFIGURE    .revert         = NULL,		/* no setting-reversion method */#endif /* ALLOW_RECONFIGURE */    .wrapup         = itrax_wrap,	/* sleep the receiver */    .cycle          = 1,		/* updates every second */};/*@ -redef @*/#endif /* ITRAX_ENABLE */

⌨️ 快捷键说明

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