X-Git-Url: http://git.archive.openwrt.org/?a=blobdiff_plain;f=nmea.c;h=31e016829f1bb4987c551391d0d8d534b910f316;hb=6c94f90daf15d1bc7caf3251956fc234e2f51756;hp=ec0a350d33a7a1a8fbe950c774b87b41d4b12605;hpb=fc6274aeb808f6717449f66df8bb8b07f53d4678;p=project%2Fugps.git diff --git a/nmea.c b/nmea.c index ec0a350..31e0168 100644 --- a/nmea.c +++ b/nmea.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include @@ -60,7 +61,7 @@ nmea_txt_cb(void) if (nmea_params[3].num < 0 || nmea_params[3].num > 2) nmea_params[3].num = 0; - LOG("%s: %s\n", ids[nmea_params[3].num], nmea_params[4].str); + DEBUG(3, "%s: %s\n", ids[nmea_params[3].num], nmea_params[4].str); } static void @@ -71,7 +72,7 @@ nmea_rmc_cb(void) if (*nmea_params[2].str != 'A') { gps_valid = 0; - fprintf(stderr, "waiting for valid signal\n"); + DEBUG(4, "waiting for valid signal\n"); return; } @@ -89,7 +90,7 @@ nmea_rmc_cb(void) struct timeval cur; strftime(tmp, 256, "%D %02H:%02M:%02S", &tm); - LOG("date: %s UTC\n", tmp); + DEBUG(3, "date: %s UTC\n", tmp); tv.tv_sec -= timezone; if (daylight) @@ -107,13 +108,14 @@ nmea_rmc_cb(void) } } - if (strlen(nmea_params[3].str) != 9 || strlen(nmea_params[5].str) != 10) { - ERROR("lat/lng have invalid string length\n"); + if (strlen(nmea_params[3].str) < 9 || strlen(nmea_params[5].str) < 10) { + ERROR("lat/lng have invalid string length %d<9, %d<10\n", + strlen(nmea_params[3].str), strlen(nmea_params[5].str)); } else { int latd, latm, lats; int lngd, lngm, lngs; float flats, flngs; - LOG("position: %s, %s\n", + DEBUG(4, "position: %s, %s\n", nmea_params[3].str, nmea_params[5].str); latm = atoi(&nmea_params[3].str[2]); nmea_params[3].str[2] = '\0'; @@ -137,16 +139,16 @@ nmea_rmc_cb(void) flngs *= 60; flngs /= 10000; -#define ms_to_deg(x, y) (((x * 10000) + y) / 60) +#define ms_to_deg(x, y) (((x * 1000000) + y) / 60) - LOG("position: %d°%d.%04d, %d°%d.%04d\n", + DEBUG(4, "position: %d°%d.%04d, %d°%d.%04d\n", latd, latm, lats, lngd, lngm, lngs); - LOG("position: %d°%d'%.1f\" %d°%d'%.1f\"\n", + DEBUG(4, "position: %d°%d'%.1f\" %d°%d'%.1f\"\n", latd, latm, flats, lngd, lngm, flngs); - snprintf(latitude, sizeof(latitude), "%d.%d", latd, ms_to_deg(latm, lats)); - snprintf(longitude, sizeof(longitude), "%d.%d", lngd, ms_to_deg(lngm, lngs)); - LOG("position: %s %s\n", latitude, longitude); + snprintf(latitude, sizeof(latitude), "%d.%04d", latd, ms_to_deg(latm, lats)); + snprintf(longitude, sizeof(longitude), "%d.%04d", lngd, ms_to_deg(lngm, lngs)); + DEBUG(3, "position: %s %s\n", latitude, longitude); gps_timestamp(); } } @@ -157,7 +159,7 @@ nmea_gga_cb(void) if (!gps_valid) return; strncpy(elivation, nmea_params[9].str, sizeof(elivation)); - LOG("height: %s\n", elivation); + DEBUG(4, "height: %s\n", elivation); } static void @@ -166,9 +168,9 @@ nmea_vtg_cb(void) if (!gps_valid) return; strncpy(course, nmea_params[1].str, sizeof(course)); - strncpy(speed, nmea_params[6].str, sizeof(speed)); - LOG("course: %s\n", course); - LOG("speed: %s\n", speed); + strncpy(speed, nmea_params[7].str, sizeof(speed)); + DEBUG(4, "course: %s\n", course); + DEBUG(4, "speed: %s\n", speed); } static struct nmea_msg { @@ -221,13 +223,13 @@ static int nmea_tokenize(char *msg) { int cnt = 0; - char *tok = strtok(msg, ","); + char *tok = strsep(&msg, ","); while (tok && cnt < MAX_NMEA_PARAM) { nmea_params[cnt].str = tok; nmea_params[cnt].num = atoi(tok); cnt++; - tok = strtok(NULL, ","); + tok = strsep(&msg, ","); } return cnt; @@ -248,7 +250,7 @@ nmea_process(char *a) return; if (nmea_verify_checksum(a)) { - ERROR("nmea message has invlid checksum\n"); + ERROR("nmea message has invalid checksum\n"); return; } @@ -314,7 +316,7 @@ nmea_open(char *dev, struct ustream_fd *s, speed_t speed) tty = open(dev, O_RDWR | O_NOCTTY | O_NONBLOCK); if (tty < 0) { - ERROR("%s: device open failed\n", dev); + ERROR("%s: device open failed: %s\n", dev, strerror(errno)); return -1; }