📄 evermore.c
字号:
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 + -