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

📄 evermore.c

📁 gpsd, a popular GPS daemon.
💻 C
📖 第 1 页 / 共 2 页
字号:
	session->gpsdata.hdop = (double)getub(buf2, 10)*0.1;	session->gpsdata.vdop = (double)getub(buf2, 11)*0.1;	session->gpsdata.tdop = (double)getub(buf2, 12)*0.1;	switch (getub(buf2, 13)) {	case 0:	/* no position fix */	case 1:	/* manual calls this "1D navigation" */	    session->gpsdata.status = STATUS_NO_FIX;	    session->gpsdata.fix.mode = MODE_NO_FIX;	    break;	case 2:	/* 2D navigation */	    session->gpsdata.status = STATUS_FIX;	    session->gpsdata.fix.mode = MODE_2D;	    break;	case 3:	/* 3D navigation */	    session->gpsdata.status = STATUS_FIX;	    session->gpsdata.fix.mode = MODE_3D;	    break;	case 4:	/* 3D navigation with DGPS */	    session->gpsdata.status = STATUS_DGPS_FIX;	    session->gpsdata.fix.mode = MODE_3D;	    break;	}	/* that's all the information in this packet */	gpsd_report(LOG_PROG, "DDO 0x04: mode=%d, status=%d\n", 		    session->gpsdata.fix.mode,		    session->gpsdata.status);	return TIME_SET | DOP_SET | MODE_SET | STATUS_SET;    case 0x06:	/* Channel Status Output */	session->gpsdata.fix.time = session->gpsdata.sentence_time	    = gpstime_to_unix((int)getuw(buf2, 2), getul(buf2, 4)*0.01) - session->context->leap_seconds;	session->gpsdata.satellites = (int)getub(buf2, 8);	session->gpsdata.satellites_used = 0;	memset(session->gpsdata.used, 0, sizeof(session->gpsdata.used));	if (session->gpsdata.satellites > 12) {		gpsd_report(LOG_WARN, "Warning: EverMore packet has information about %d satellites!\n",				session->gpsdata.satellites);	}	if (session->gpsdata.satellites > EVERMORE_CHANNELS) session->gpsdata.satellites = EVERMORE_CHANNELS;	satcnt = 0;	for (i = 0; i < (size_t)session->gpsdata.satellites; i++) {	    int prn;	    // channel = getub(buf2, 7*i+7+2)            prn = (int)getub(buf2, 7*i+7+3);	    if (prn == 0) continue;  /* satellite record is not valid */	    session->gpsdata.PRN[satcnt] = prn;	    session->gpsdata.azimuth[satcnt] = (int)getuw(buf2, 7*i+7+4);	    session->gpsdata.elevation[satcnt] = (int)getub(buf2, 7*i+7+6);	    session->gpsdata.ss[satcnt] = (int)getub(buf2, 7*i+7+7);	    /*	     * Status bits at offset 8:	     * bit0 = 1 satellite acquired	     * bit1 = 1 code-tracking loop locked	     * bit2 = 1 carrier-tracking loop locked	     * bit3 = 1 data-bit synchronization done	     * bit4 = 1 frame synchronization done	     * bit5 = 1 ephemeris data collected	     * bit6 = 1 used for position fix	     */	    if (getub(buf2, 7*i+7+8) & 0x40) {		session->gpsdata.used[session->gpsdata.satellites_used++]=prn;	    }	    satcnt++;			}	session->gpsdata.satellites = (int)satcnt;	/* that's all the information in this packet */	gpsd_report(LOG_PROG, "CSO 0x04: %d satellites used\n", 		    session->gpsdata.satellites_used);	return TIME_SET | SATELLITE_SET | USED_SET;    case 0x08:	/* Measurement Data Output */	/* clock offset is a manufacturer diagnostic */	/* (int)getuw(buf2, 8);  clock offset, 29000..29850 ?? */	session->gpsdata.fix.time = session->gpsdata.sentence_time	    = gpstime_to_unix((int)getuw(buf2, 2), getul(buf2, 4)*0.01) - session->context->leap_seconds;	visible = getub(buf2, 10);	/* FIXME: read full statellite status for each channel */	/* we can get pseudo range (m), delta-range (m/s), doppler (Hz) and status for each channel */	/* gpsd_report(LOG_PROG, "MDO 0x04: visible=%d\n", visible); */	gpsd_report(LOG_PROG, "MDO 0x04:\n");	return TIME_SET;        case 0x20:	/* LogConfig Info, could be used as a probe for EverMore GPS */	gpsd_report(LOG_IO, "LogConfig EverMore packet, length %d: %s\n", datalen, gpsd_hexdump(buf2, datalen));	return ONLINE_SET;    case 0x22:	/* LogData */	gpsd_report(LOG_IO, "LogData EverMore packet, length %d: %s\n", datalen, gpsd_hexdump(buf2, datalen));	return ONLINE_SET;    case 0x38:	/* ACK */	gpsd_report(LOG_PROG, "EverMore command %02X ACK\n", getub(buf2, 2));	return ONLINE_SET;        default:	gpsd_report(LOG_WARN, "unknown EverMore packet id 0x%02x, length %d: %s\n", buf2[0], datalen, gpsd_hexdump(buf2, datalen));	return 0;    }}/*@ -charint @*/static gps_mask_t evermore_parse_input(struct gps_device_t *session){    gps_mask_t st;    if (session->packet.type == EVERMORE_PACKET){	st = evermore_parse(session, session->packet.outbuffer, session->packet.outbuflen);	return st;#ifdef NMEA_ENABLE    } else if (session->packet.type == NMEA_PACKET) {	st = nmea_parse((char *)session->packet.outbuffer, session);	return st;#endif /* NMEA_ENABLE */    } else	return 0;}static bool evermore_speed(struct gps_device_t *session, speed_t speed){    /*@ -type @*/    unsigned char tmp8;    unsigned char msg[] = {	    0x89,          /*  0: msg ID, Serial Port Configuration */	    0x01,          /*  1: bit 0 cfg for main serial, bit 1 cfg for DGPS port */	    0x00,          /*  2: baud rate for main serial; 4800(0), 9600(1), 19200(2), 38400(3) */	    0x00,          /*  3: baud rate for DGPS serial port; 4800(0), 9600(1), etc */    };    gpsd_report(LOG_PROG, "evermore_speed(%d)\n", speed);    switch (speed) {	    case 4800:  tmp8 = 0; break;	    case 9600:  tmp8 = 1; break;	    case 19200: tmp8 = 2; break;	    case 38400: tmp8 = 3; break;	    default: return false;    }    msg[2] = tmp8;    return evermore_write(session, msg, sizeof(msg));    /*@ +type @*/}static bool evermore_protocol(struct gps_device_t *session, int protocol){    /*@ +charint */    unsigned char tmp8;    unsigned char evrm_protocol_config[] = {	    0x84,    /* 0: msg ID, Protocol Configuration */	    0x00,    /* 1: mode; EverMore binary(0), NMEA(1) */	    0x00,    /* 2: reserved */	    0x00,    /* 3: reserved */    };    /*@ -charint */    gpsd_report(LOG_PROG, "evermore_protocol(%d)\n", protocol);    /*@i1@*/tmp8 = (protocol != 0) ? 1 : 0;   /* NMEA : binary */    evrm_protocol_config[1] = tmp8;    return evermore_write(session, evrm_protocol_config, sizeof(evrm_protocol_config));}static bool evermore_nmea_config(struct gps_device_t *session, int mode)/* mode = 0 : EverMore default *//* mode = 1 : gpsd best *//* mode = 2 : EverMore search, activate PEMT101 message */{    unsigned char tmp8;    /*@ +charint */    unsigned char evrm_nmeaout_config[] = {	    0x8e,	/*  0: msg ID, NMEA Message Control */	    0xff,       /*  1: NMEA sentence bitmask, GGA(0), GLL(1), GSA(2), GSV(3), ... */	    0x01,       /*  2: nmea checksum no(0), yes(1) */	    1,          /*  3: GPGGA, interval 0-255s */	    0,          /*  4: GPGLL, interval 0-255s */	    1,          /*  5: GPGSA, interval 0-255s */	    1,          /*  6: GPGSV, interval 0-255s */	    1,          /*  7: GPRMC, interval 0-255s */	    0,          /*  8: GPVTG, interval 0-255s */	    0,          /*  9: PEMT,101, interval 0-255s */	    0, 0, 0, 0, 0, 0, /* 10-15: reserved */    };    /*@ -charint */    gpsd_report(LOG_PROG, "evermore_nmea_config(%d)\n", mode);    /*@i1@*/tmp8 = (mode == 1) ? 5 : 1;   /* NMEA GPGSV, gpsd  */    evrm_nmeaout_config[6] = tmp8;           /* GPGSV, 1s or 5s */    /*@i1@*/tmp8 = (mode == 2) ? 1 : 0;   /* NMEA PEMT101 */    evrm_nmeaout_config[9] = tmp8;           /* PEMT101, 1s or 0s */    return evermore_write(session, evrm_nmeaout_config, sizeof(evrm_nmeaout_config));}static void evermore_mode(struct gps_device_t *session, int mode){    gpsd_report(LOG_PROG, "evermore_mode(%d), %d\n", mode, session->back_to_nmea ? 1 : 0);    if (mode == 0) {        /* NMEA */        (void) evermore_protocol(session, 1);        session->gpsdata.driver_mode = 0;        (void) evermore_nmea_config(session, 1); /* configure NMEA messages for gpsd */    } else {        /* binary */        (void) evermore_protocol(session, 0);        session->back_to_nmea = false;        session->gpsdata.driver_mode = 1;    }}#ifdef ALLOW_RECONFIGUREstatic void evermore_configurator(struct gps_device_t *session, unsigned int seq){    gpsd_report(LOG_PROG, "evermore_configurator(%d)\n", seq);    (void) evermore_nmea_config(session, 1); /* configure NMEA messages for gpsd (GPGSV every 5s) */    if (seq == 0) {        if (session->packet.type == NMEA_PACKET) {	    gpsd_report(LOG_WARN, "NMEA_PACKET packet\n");        }        (void) evermore_mode(session, 1); /* switch GPS to binary mode */        session->back_to_nmea = true;    }}#endif /* ALLOW_RECONFIGURE */static void evermore_wrap(struct gps_device_t *session){    gpsd_report(LOG_PROG, "evermore_wrap\n");    (void) evermore_nmea_config(session, 0); /* configure NMEA messages to default */}/* this is everything we export */struct gps_type_t evermore_binary ={    .type_name      = "EverMore binary",	/* full name of type */    .trigger        = "$PEMT,", 		/* recognize the type */    .channels       = EVERMORE_CHANNELS,	/* consumer-grade GPS */    .probe_wakeup   = NULL,			/* no wakeup to be done before hunt */    .probe_detect   = NULL,			/* no probe */    .probe_subtype  = NULL,			/* no subtype probing */#ifdef ALLOW_RECONFIGURE    .configurator   = evermore_configurator,	/* switch to binary */#endif /* ALLOW_RECONFIGURE */    .get_packet     = generic_get,		/* use generic one */    .parse_packet   = evermore_parse_input,	/* parse message packets */    .rtcm_writer    = pass_rtcm,		/* send RTCM data straight */    .speed_switcher = evermore_speed,		/* we can change baud rates */    .mode_switcher  = evermore_mode,		/* there is a mode switcher */    .rate_switcher  = NULL,			/* no sample-rate switcher */    .cycle_chars    = -1,			/* ignore, no rate switch */#ifdef ALLOW_RECONFIGURE    .revert         = NULL,			/* reversion code */#endif /* ALLOW_RECONFIGURE */    .wrapup         = evermore_wrap,		/* wrapup method */    .cycle          = 1,			/* updates every second */};#endif /* defined(EVERMORE_ENABLE) && defined(BINARY_ENABLE) */

⌨️ 快捷键说明

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