summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoriain <iain@linux.intel.com>2011-08-12 17:45:40 +0100
committeriain <iain@linux.intel.com>2011-08-12 17:45:40 +0100
commit6efcdd861898b7e4330e826579097588a1522ee8 (patch)
tree43d071a012824bf6014e83fe64ff9e14cdf6ed9d
parent4ec0ece8c595da3d79350ff7c582e088e17196ad (diff)
Remove nmea-gen.[ch] as wel don't need them anymore
-rw-r--r--src/nmea-gen.c472
-rw-r--r--src/nmea-gen.h67
2 files changed, 0 insertions, 539 deletions
diff --git a/src/nmea-gen.c b/src/nmea-gen.c
deleted file mode 100644
index a8c2483..0000000
--- a/src/nmea-gen.c
+++ /dev/null
@@ -1,472 +0,0 @@
-/*
- Garmin protocol to NMEA 0183 converter
- Copyright (C) 2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Input:
- - D800_Pvt_Data_Type (PID 51)
- - satellite data record (PID 114)
-
- Available output sentences:
- GPGGA, GPRMC, GPGLL, GPGSA, GPGSV
-
- Known caveats:
- - DOP (Dilution of Precision) information not available
- (Garmin protocol includes EPE only)
- - DGPS information in GPGGA sentence not returned
- - speed and course over ground are calculated from the
- north/east velocity and may not be accurate
- - magnetic variation information not available
- - Garmin 16-bit SNR scale unknown
-
- ---------------------------------------------------------------------------
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include <math.h>
-#include <stdio.h>
-#include <string.h>
-
-#include <glib.h>
-
-#include "nmea.h"
-#include "garmin.h"
-#include "nmea-gen.h"
-
-#define NMEA_BUF_SIZE 256
-#define NMEA_LATLON_SIZE 16
-#define NMEA_UTC_SIZE 16
-
-double g_lastcourse = -1;
-
-void nmea_getutc(D800_Pvt_Data_Type *pvt, char *utctime, char *utcdate) {
- int tmp = 0, dtmp=0;
-
- /* UTC time of position fix
- Reminder:
- pvt->tow = seconds (including fractions) since the start of the week.
- pvt->wn_days = days since 31-DEC-1989 for the start of the current week
- (neither is adjusted for leap seconds)
- pvt->leap_scnds = leap second adjustment required.
- */
-
- /*
- The receivers can (and do) return times like 86299.999999 instead
- of 86300.0 Rounding is required to get the correct time.
-
- Just capture wn_days for now.
- */
- tmp = rint(pvt->tow);
- dtmp = pvt->wn_days;
-
- /*
- If the result is 604800, it's really the first sample
- of the new week, so zero out tmp and increment dtmp
- by a week ( 7 days ).
- */
- if (tmp >= 604800)
- {
- dtmp += 7;
- tmp = 0;
- }
-
- /*
- At this point we have tmp = seconds since the start
- of the week, and dtmp = the first day of the week.
- We now need to correct for leap seconds. This may actually
- result in reversing the previous adjustment but the code
- required to combine the two operations wouldn't be clear.
- */
- tmp -= pvt->leap_scnds;
- if (tmp < 0)
- {
- tmp+= 604800;
- dtmp -= 7;
- }
-
- /*
- Now we have tmp = seconds since the start if the week,
- and dtmp = the first day of the week, all corrected for
- rounding and leap seconds.
-
- We now convert dtmp to today's day number and tmp to
- seconds since midnignt.
- */
-
- dtmp += (tmp / 86400);
- tmp %= 86400;
-
- if (utctime) {
- int h, m, s;
- h = tmp / 3600;
- m = (tmp - h*3600) / 60;
- s = (tmp - h*3600 - m*60);
- sprintf(utctime, "%02d%02d%02d", h, m, s);
- }
-
- if (utcdate) {
- /* Garmin format: number of days since December 31, 1989 */
- unsigned long jd = dtmp + 2447892;
- unsigned long w, x, a, b, c, d, e, f;
- unsigned long day, month, year;
-
- w = (unsigned long)((jd - 1867216.25)/36524.25);
- x = w/4;
- a = jd + 1 + w - x;
- b = a + 1524;
- c = (unsigned long)((b - 122.1)/365.25);
- d = (unsigned long)(365.25 * c);
- e = (unsigned long)((b-d)/30.6001);
- f = (unsigned long)(30.6001 * e);
-
- day = b - d - f;
- month = e - 1;
- if (month > 12)
- month -= 12;
- year = c - 4716;
- if (month == 1 || month == 2)
- year++;
-
- year -= 2000;
-
- sprintf(utcdate, "%02d%02d%02d", day, month, year);
- }
-}
-
-void nmea_fmtlat(double lat, char *latstr) {
- double latdeg, tmp;
- latdeg = rad2deg(fabs(lat));
- tmp = floor(latdeg);
- sprintf(latstr, "%02d%07.4f,%c", (int)tmp, (latdeg - tmp) * 60,
- (lat >= 0) ? 'N' : 'S');
-}
-
-void nmea_fmtlon(double lon, char *lonstr) {
- double londeg, tmp;
- londeg = rad2deg(fabs(lon));
- tmp = floor(londeg);
- sprintf(lonstr, "%03d%07.4f,%c", (int)tmp, (londeg - tmp) * 60,
- (lon >= 0) ? 'E' : 'W');
-}
-
-/*
- nmea_gpgga()
- NMEA Global Positioning System Fix Data (GGA)
-
- sat may be NULL (= 0 satellites in view)
-
- Caveats:
- - Horizontal dilution of precision (DOP) not available
- - DGPS information not available
-*/
-int nmea_gpgga(D800_Pvt_Data_Type *pvt, cpo_sat_data *sat, char *nmeastc) {
-
- char buf[NMEA_BUF_SIZE];
- char slat[NMEA_LATLON_SIZE], slon[NMEA_LATLON_SIZE];
- char utc[NMEA_UTC_SIZE];
- unsigned char cksum;
- int fix, nsat, i;
-
- nmea_getutc(pvt, utc, NULL);
-
- /* latitude */
- nmea_fmtlat(pvt->lat, slat);
-
- /* longitude */
- nmea_fmtlon(pvt->lon, slon);
-
- /* GPS quality indication */
- if (pvt->fix == 0 || pvt->fix == 1)
- fix = 0;
- else if (pvt->fix == 2 || pvt->fix == 3)
- fix = 1;
- else if (pvt->fix == 4 || pvt->fix == 5)
- fix = 2;
- else {
- fix = 0;
- fprintf(stderr, "WARNING: unknown fix type %d\n", pvt->fix);
- }
-
- /* number of satellites in view */
- nsat = 0;
- if (sat != NULL) {
- for (i = 0; i < SAT_MAX_COUNT; i++) {
- if (((sat[i].status & SAT_STATUS_MASK) == SAT_STATUS_GOOD) && (sat[i].svid <= MAX_SAT_SVID))
- nsat++;
- }
- }
-
- sprintf(buf, "GPGGA,%s,%s,%s,%d,%02d,,%.1f,M,%.1f,M,,", utc, slat, slon, fix, nsat,
- pvt->msl_hght + pvt->alt, -pvt->msl_hght);
-
- cksum = nmea_cksum(buf);
-
- sprintf(nmeastc, "$%s*%02X\r\n", buf, cksum);
-
- return 0;
-}
-
-/*
- nmea_gprmc()
- NMEA Recommended Minimum Specific GPS/TRANSIT Data (RMC)
-
- Caveats:
- - Speed and course over ground are calculated from
- the north/east velocity and may not be accurate
- - Magnetic variation not available
-*/
-int nmea_gprmc(D800_Pvt_Data_Type *pvt, char *nmeastc) {
-
- char buf[NMEA_BUF_SIZE];
- char slat[NMEA_LATLON_SIZE], slon[NMEA_LATLON_SIZE];
- char utctime[NMEA_UTC_SIZE], utcdate[NMEA_UTC_SIZE];
- double speed, course;
- unsigned char cksum;
-
- nmea_getutc(pvt, utctime, utcdate);
-
- /* latitude */
- nmea_fmtlat(pvt->lat, slat);
-
- /* longitude */
- nmea_fmtlon(pvt->lon, slon);
-
- /* speed over ground */
- speed = sqrt(pvt->east*pvt->east + pvt->north*pvt->north) * 3.6 / KNOTS_TO_KMH;
-
- /* course */
- if (speed < 1.0) {
- if (g_lastcourse >= 0)
- course = g_lastcourse;
- else
- course = 0; /* too low to determine course */
- } else {
- course = atan2(pvt->east, pvt->north);
- if (course < 0)
- course += 2*G_PI;
- course = rad2deg(course);
- g_lastcourse = course; /* remember for later */
- }
-
- sprintf(buf, "GPRMC,%s,%c,%s,%s,%05.1f,%05.1f,%s,,", utctime,
- (pvt->fix >= 2 && pvt->fix <= 5) ? 'A' : 'V',
- slat, slon, speed, course, utcdate);
-
- cksum = nmea_cksum(buf);
-
- sprintf(nmeastc, "$%s*%02X\r\n", buf, cksum);
-
- return 0;
-}
-
-/*
- nmea_gpgll()
- NMEA Geographic Position (GLL)
-*/
-int nmea_gpgll(D800_Pvt_Data_Type *pvt, char *nmeastc) {
-
- char buf[NMEA_BUF_SIZE];
- char slat[NMEA_LATLON_SIZE], slon[NMEA_LATLON_SIZE];
- char utctime[NMEA_UTC_SIZE];
- unsigned char cksum;
-
- nmea_getutc(pvt, utctime, NULL);
-
- /* latitude */
- nmea_fmtlat(pvt->lat, slat);
-
- /* longitude */
- nmea_fmtlon(pvt->lon, slon);
-
- sprintf(buf, "GPGLL,%s,%s,%s,%c", slat, slon, utctime,
- (pvt->fix >= 2 && pvt->fix <= 5) ? 'A' : 'V');
-
- cksum = nmea_cksum(buf);
-
- sprintf(nmeastc, "$%s*%02X\r\n", buf, cksum);
-
- return 0;
-}
-
-/*
- nmea_gpgsa()
- NMEA GPS DOP and Active Satellites (GSA)
-
- sat may be NULL (= 0 satellites)
-
- Caveats:
- - DOP information not available
-*/
-int nmea_gpgsa(D800_Pvt_Data_Type *pvt, cpo_sat_data *sat, char *nmeastc) {
-
- char buf[NMEA_BUF_SIZE];
- int fix, i, nsat = 0;
- unsigned char cksum;
-
- if (pvt->fix == 0 || pvt->fix == 1)
- fix = 1;
- else if (pvt->fix == 2 || pvt->fix == 4)
- fix = 2;
- else if (pvt->fix == 3 || pvt->fix == 5)
- fix = 3;
- else {
- fix = 1;
- fprintf(stderr, "WARNING: unknown fix type %d\n", pvt->fix);
- }
-
- sprintf(buf, "GPGSA,A,%d", fix);
-
- if (sat != NULL) {
- for (i = 0; i < SAT_MAX_COUNT; i++) {
-// if (((sat[i].status & SAT_STATUS_MASK) == SAT_STATUS_GOOD) && (sat[i].svid <= MAX_SAT_SVID) && (sat[i].snr > 0)) {
- if (((sat[i].status & SAT_STATUS_MASK) == SAT_STATUS_GOOD) && (sat[i].svid <= MAX_SAT_SVID)) {
-#ifdef DEBUG
- g_debug ("%s: using sat %2d", __FUNCTION__, sat[i].svid);
-#endif
- sprintf(buf+strlen(buf), ",%02d", sat[i].svid);
- nsat++;
- }
- else
- {
-#ifdef DEBUG
- g_debug ("%s: not using sat %2d", __FUNCTION__, sat[i].svid);
-#endif
- }
- }
- /* pad out the rest of the sentence with commas if needed */
- if (nsat < SAT_MAX_COUNT)
- for (i = 0; i < (SAT_MAX_COUNT - nsat); i++)
- strcat(buf, ",");
-
- } else {
- strcat(buf, ",,,,,,,,,,,,");
- }
-
- sprintf(buf+strlen(buf), ",,,"); // this should be DOP info
-
- cksum = nmea_cksum(buf);
- sprintf(nmeastc, "$%s*%02X\r\n", buf, cksum);
-
- return 0;
-}
-
-/*
- nmea_gpgsv()
- NMEA GPS Satellites in View (GSV)
-
- sat may be NULL (= 0 satellites in view)
-
- Caveats:
- - Garmin SNR conversion factor not known
-*/
-int nmea_gpgsv(cpo_sat_data *sat, char *nmeastc) {
-
- char buf[256];
- unsigned char cksum;
- int nsat, i, nout, msgi;
-
- if (sat == NULL) {
- sprintf(buf, "GPGSV,1,1,00");
- cksum = nmea_cksum(buf);
- sprintf(nmeastc, "$%s*%02X\r\n", buf, cksum);
- return 0;
- }
-
- /* scan through the sat array and count the good sats */
- nsat = 0;
- for (i = 0; i < SAT_MAX_COUNT; i++) {
-
-#ifdef DEBUG
- g_debug ("%s: sat %3d: status = %02x SNR = %d", __FUNCTION__, sat[i].svid, sat[i].status & SAT_STATUS_MASK, sat[i].snr);
-#endif
- if (((sat[i].status & SAT_STATUS_MASK) == SAT_STATUS_GOOD) && (sat[i].svid <= MAX_SAT_SVID)) {
-
-// this should not be needed since a sat with bad SNR will not have good status
-// if (sat[i].snr == SAT_SNR_BAD) {
-// g_debug ("%s: Sat %02d: bogus SNR = %d", __FUNCTION__, sat[i].svid, sat[i].snr);
-// sat[i].snr = 0;
-// }
-
- nsat++;
- }
- }
-
-#ifdef DEBUG
- g_debug ("%s: nsat = %d", __FUNCTION__, nsat);
-#endif
-
- if (nsat == 0) {
- /* build a 'null' GPGSV string */
- sprintf(buf, "GPGSV,1,1,00");
- cksum = nmea_cksum(buf);
- sprintf(nmeastc, "$%s*%02X\r\n", buf, cksum);
- } else {
- /* scan the array again and build the GPGSV string(s) of active sats */
- nout = 0;
- msgi = 1;
- nmeastc[0] = 0;
- sprintf(buf, "GPGSV,%d,%d,%02d", (nsat-1)/4+1, msgi, nsat);
- for (i = 0; i < SAT_MAX_COUNT; i++) {
- if (((sat[i].status & SAT_STATUS_MASK) == SAT_STATUS_GOOD) && (sat[i].svid <= MAX_SAT_SVID)) {
- int snr;
-
-// not needed - see above if (sat[i].snr == 0)
-// snr = 0;
-// else
- snr = sat[i].snr/100; /* empirically, this seems to be the correct factor */
-
- sprintf(buf+strlen(buf), ",%02d,%02d,%03d,%02d",
- sat[i].svid, sat[i].elev, sat[i].azmth, snr);
- nout++;
-
- /* if we have accumulated a group of 4 sats, write out the string */
- if (nout == 4) {
- cksum = nmea_cksum(buf);
- sprintf(nmeastc+strlen(nmeastc), "$%s*%02X\r\n", buf, cksum);
- msgi++;
- nout = 0;
- sprintf(buf, "GPGSV,%d,%d,%02d", (nsat-1)/4+1, msgi, nsat);
- }
- }
- }
-
- if (nout != 0) {
- cksum = nmea_cksum(buf);
- sprintf(nmeastc+strlen(nmeastc), "$%s*%02X\r\n", buf, cksum);
- }
- }
-
- return 0;
-}
-
-unsigned char nmea_cksum(char *str) {
-
- int i;
- unsigned char cksum = 0;
-
- for (i = 0; str[i]; i++) {
- cksum ^= (unsigned char)str[i];
- }
-
- return cksum;
-}
diff --git a/src/nmea-gen.h b/src/nmea-gen.h
deleted file mode 100644
index a8000a7..0000000
--- a/src/nmea-gen.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- Garmin protocol to NMEA 0183 converter
- Copyright (C) 2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Input:
- - D800_Pvt_Data_Type (PID 51)
- - satellite data record (PID 114)
-
- Available output sentences:
- GPGGA, GPRMC, GPGLL, GPGSA, GPGSV
-
- Known caveats:
- - DOP (Dilution of Precision) information not available
- (Garmin protocol includes EPE only)
- - DGPS information in GPGGA sentence not returned
- - speed and course over ground are calculated from the
- north/east velocity and may not be accurate
- - magnetic variation information not available
- - Garmin 16-bit SNR scale unknown
-
- ---------------------------------------------------------------------------
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef NMEAGEN_H
-#define NMEAGEN_H
-
-#include "garmin.h"
-
-#define KNOTS_TO_KMH 1.852
-#ifndef G_PI
-#define G_PI 3.14159265358979324
-#endif
-#define rad2deg(x) ((x) * 180.0 / G_PI)
-
-void nmea_getutc(D800_Pvt_Data_Type *pvt, char *utctime, char *utcdate);
-void nmea_fmtlat(double lat, char *latstr);
-void nmea_fmtlon(double lon, char *lonstr);
-int nmea_gpgga(D800_Pvt_Data_Type *pvt, cpo_sat_data *sat, char *nmeastc);
-int nmea_gprmc(D800_Pvt_Data_Type *pvt, char *nmeastc);
-int nmea_gpgll(D800_Pvt_Data_Type *pvt, char *nmeastc);
-int nmea_gpgsa(D800_Pvt_Data_Type *pvt, cpo_sat_data *sat, char *nmeastc);
-int nmea_gpgsv(cpo_sat_data *sat, char *nmeastc);
-unsigned char nmea_cksum(char *str);
-
-#endif