backup
authorBenoit Papillault <benoit.papillault@luceor.com>
Tue, 19 Dec 2017 22:53:35 +0000 (23:53 +0100)
committerBenoit Papillault <benoit.papillault@luceor.com>
Tue, 19 Dec 2017 22:53:35 +0000 (23:53 +0100)
Makefile
sirf.c

index e6b875d..4c8d61e 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -14,9 +14,9 @@ LDLIBS                += -lgps -lm
 # for gpstk
 #GPSTK_HOME    = $(HOME)/gpstk
 GPSTK_HOME     = /usr/local
-CPPFLAGS       += -I$(GPSTK_HOME)/include/gpstk/
-LDFLAGS                += -L$(GPSTK_HOME)/lib
-LDLIBS         += -lprocframe -lgpstk
+#CPPFLAGS      += -I$(GPSTK_HOME)/include/gpstk/
+#LDFLAGS               += -L$(GPSTK_HOME)/lib
+#LDLIBS                += -lprocframe -lgpstk
 
 default: mygps sirf
 
diff --git a/sirf.c b/sirf.c
index 8d0254b..bede599 100644 (file)
--- a/sirf.c
+++ b/sirf.c
@@ -13,6 +13,8 @@
 #include <termios.h>
 #include <unistd.h>
 #include <string.h>
+#include <time.h>
+#include <math.h>
 
 /* return 1 if message is a valid SiRF message, 0 if invalid */
 
@@ -201,7 +203,7 @@ int decode_sirf_msg_2(unsigned char * buf, int n)
        p += 1;
        printf("  GPS Week : %u\n", get_sirf_2u(buf+p));
        p += 2;
-       printf("  GPS Time of Week : %f\n", (double)get_sirf_4u(buf+p)/100.0);
+       printf("  GPS Time of Week : %.2f s\n", (double)get_sirf_4u(buf+p)/100);
        p += 4;
        printf("  Satellites used : %d\n", n_sat = buf[p]);
        p += 1;
@@ -220,7 +222,7 @@ int decode_sirf_msg_4(unsigned char *buf, int n)
        p += 1;
        printf("  GPS Week : %d\n", get_sirf_2s(buf + p));
        p += 2;
-       printf("  GPS Time of Week : %u\n", get_sirf_4u(buf + p));
+       printf("  GPS Time of Week : %.2f s\n", (double)get_sirf_4u(buf + p)/100);
        p += 4;
        printf("  Channels : %d\n", buf[p]);
        p += 1;
@@ -239,16 +241,22 @@ int decode_sirf_msg_4(unsigned char *buf, int n)
        return 0;
 }
 
-int decode_sirf_msg_7(unsigned char *buf, int n)
+int decode_sirf_msg_7(unsigned char *buf, int n, struct timeval *tv)
 {
        int p = 0;
+       time_t t;
+       struct tm * tm;
+       unsigned int week;
+       double seconds;
+       double t1, t2;
+       const int leapsecond = 17;
 
        printf("Clock Status Data\n");
        p += 1;
-       printf("  Extended GPS Week : %u\n", get_sirf_2u(buf + p));
+       printf("  Extended GPS Week : %u\n", week = get_sirf_2u(buf + p));
        p += 2;
-       printf("  GPS Time of Week : %.3f s\n",
-              (double)get_sirf_4u(buf + p) / 100.0);
+       printf("  GPS Time of Week : %.2f s\n",
+              seconds = (double)get_sirf_4u(buf + p)/100);
        p += 4;
        printf("  Satellites used : %u\n", buf[p]);
        p += 1;
@@ -259,6 +267,26 @@ int decode_sirf_msg_7(unsigned char *buf, int n)
        printf("  Estimated GPS Time : %.3f s\n", 1e-3*(double)get_sirf_4u(buf + p));
        p += 4;
 
+       /* Convert tv into YYYY-mm-dd HH:MM:SS UTC */
+       t1 = tv->tv_sec + 1e-6*tv->tv_usec;
+       t = floor(t1);
+       tm = gmtime(&t);
+       printf("  Local time : %4u-%02u-%02u %02u:%02u:%02u %06lu\n",
+              1900 + tm->tm_year, 1 + tm->tm_mon, tm->tm_mday,
+              tm->tm_hour, tm->tm_min, tm->tm_sec,
+              (unsigned long)(1e6*(t1-t)));
+
+       /* Convert GPS time into YYYY-mm-dd HH:MM:SS UTC
+        * (origin : 1980-01-06)
+        */
+       t2 = 315964800 + week * 604800 + seconds - leapsecond;
+       t = floor(t2);
+       tm = gmtime(&t);
+       printf("  GPS time   : %4u-%02u-%02u %02u:%02u:%02u %06lu [diff %.6f]\n",
+              1900 + tm->tm_year, 1 + tm->tm_mon, tm->tm_mday,
+              tm->tm_hour, tm->tm_min, tm->tm_sec,
+              (unsigned long)(1e6*(t2-t)), t1-t2);
+
        return 0;
 }
 
@@ -318,6 +346,10 @@ int decode_sirf_msg_28(unsigned char *buf, int n)
 
        printf("Navigation Library Measurement Data - Channel %d\n", buf[p+1]);
        p += 2;
+       /* It seems that Time Tag is a clock running at 16368000 Hz
+        * (16.369 MHz according to the datasheet) and starting at 0
+        * when the GPS is inserted into the USB port. There is a
+        * rollover every 262 seconds */
        printf("  Time Tag = 0x%08x\n", get_sirf_4u(buf+p));
        p += 4;
        printf("  SatID : %d\n", buf[p]);
@@ -396,7 +428,7 @@ int decode_sirf_msg_255(unsigned char *buf, int n)
 
 /* (buf,n) is a full SiRF message, including start/stop sequence */
 
-int decode_sirf_msg(unsigned char *buf, int n, int *ack) {
+int decode_sirf_msg(unsigned char *buf, int n, int *ack, struct timeval *tv) {
        int p = 4;
 
        switch (buf[p]) {
@@ -415,7 +447,7 @@ int decode_sirf_msg(unsigned char *buf, int n, int *ack) {
                break;
                
        case 7: /* Clock Status Data */
-               decode_sirf_msg_7(buf + 4, n - 8);
+           decode_sirf_msg_7(buf + 4, n - 8, tv);
                break;
                
        case 8: /* 50 BPS Data */
@@ -455,7 +487,7 @@ int decode_sirf_msg(unsigned char *buf, int n, int *ack) {
        case 30: /* Navigation Library SV State Data */
                printf("Navigation Library SV State Data - SatID : %d\n", buf[p+1]);
                p += 2;
-               printf("  GPS Time : %f s\n", get_sirf_dbl(buf+p));
+               printf("  GPS Time : %.6f s\n", get_sirf_dbl(buf+p));
                p += 8;
                printf("  Position X : %f m\n", get_sirf_dbl(buf+p));
                p += 8;
@@ -510,7 +542,7 @@ int decode_sirf_msg(unsigned char *buf, int n, int *ack) {
                break;
 
        default:
-               printf("Message ID %d is not decoded yet ...\n", buf[p]);
+               printf("MID %d is not decoded yet ...\n", buf[p]);
                break;
        }
 
@@ -530,11 +562,10 @@ void dump_msg(unsigned char *buf, int n) {
 
 /* return 0 on success, -1 on error */
 
-int do_read(int fd, int * ack) {
+int do_read(int fd, int * ack, struct timeval *tvp) {
        /* SiRF message size is limited to 912 bytes */
        int i, n;
-       struct timeval tv;
-       static struct timeval tv_last = { 0, 0 };
+       static struct timeval tv0;
 
        static unsigned char sbuffer[912*2];
        static int p = 0;
@@ -545,11 +576,18 @@ int do_read(int fd, int * ack) {
                return -1;
        }
 
+       if (p == 0) {
+           if (tvp != NULL)
+               tv0 = *tvp;
+           else
+               tv0.tv_sec = tv0.tv_usec = 0;
+       }
+
        n = read(fd, sbuffer + p, sizeof(sbuffer) - p);
-       gettimeofday(&tv, NULL);
        if (n <= 0) {
+           if (n < 0)
                perror("read");
-               return -1;
+           return -1;
        }
 
        if (n == 0) {
@@ -557,13 +595,6 @@ int do_read(int fd, int * ack) {
                return 0;
        }
 
-       double diff = (tv.tv_sec+1e-6*tv.tv_usec) - 
-           (tv_last.tv_sec+1e-6*tv_last.tv_usec);
-
-       if (diff > 0.010)
-           printf("tv %lu.%06lu (diff %f)\n", tv.tv_sec, tv.tv_usec, diff);
-       tv_last = tv;
-
        /* for debug only :
        printf("%d bytes received (total = %d):", n, p+n);
        for (i=0; i<n; i++) {
@@ -606,11 +637,12 @@ int do_read(int fd, int * ack) {
                                stop_found = 1;
          
                                if (start_found && stop_found) {
-                                       printf("recv: Message ID %d (%d bytes)\n",
-                                              sbuffer[4], i+2); 
+                                       printf("recv: MID %d (%d bytes) - tv %lu.%06lu\n",
+                                              sbuffer[4], i+2,
+                                              tv0.tv_sec, tv0.tv_usec); 
                                        if (check_sirf_msg(sbuffer, i+2)) {
                                                decode_sirf_msg(sbuffer, i+2,
-                                                               ack);
+                                                               ack, &tv0);
                                        }
                                }
          
@@ -674,12 +706,12 @@ int sirf_msg_send(int fd, unsigned char *buf, int n) {
                return -1;
        }
 
-       printf("send: Message ID %d (%d bytes)\n", buf[0], total_len);
+       printf("send: MID %d (%d bytes)\n", buf[0], total_len);
 
        /* wait for ACK */
        for (;;) {
                int ack = 0;
-               if (do_read(fd, &ack) < 0) {
+               if (do_read(fd, &ack, NULL) < 0) {
                        printf("do_read failed!\n");
                        return -1;
                }
@@ -726,6 +758,23 @@ int main(int argc, const char *argv[])
        /* -1 : we do not want to send the null terminating character */
        //write(fd, to_sirf, sizeof(to_sirf)-1);
 
+       /* switc from SiRF binary format to NMEA */
+       unsigned char msg_129[] = { 129,
+                                   0, /* Enable NMEA debug messages */
+                                   1, 1, /* GGA Message with checksum */
+                                   1, 1, /* GLL Message with checksum */
+                                   1, 1, /* GSA Message with checksum */
+                                   1, 1, /* GSV Message with checksum */
+                                   1, 1, /* RMC Message with checksum */
+                                   1, 1, /* VTG Message with checksum */
+                                   1, 1, /* MSS Message with checksum */
+                                   1, 1, /* EPE Message with checksum */
+                                   1, 1, /* ZDA Message with checksum */
+                                   0, 0, /* unused */
+                                    /* 4800 bauds */
+                                   (4800 >> 8) & 0xff, (4800 >> 0) & 0xff};
+       //sirf_msg_send(fd, msg_129, sizeof(msg_129));
+
        /* Set Binary Serial Port.  Note : the effect of changing the baud
           rate is not immediate at all */
 
@@ -760,7 +809,7 @@ int main(int argc, const char *argv[])
        */
 
        /* Poll Software Version */
-       unsigned char msg_132[] = { 132, 0x00 };
+       //unsigned char msg_132[] = { 132, 0x00 };
        //sirf_msg_send(fd, msg_132, sizeof(msg_132));
 
        /* Initialize GPS/DR Navigation */
@@ -789,21 +838,25 @@ int main(int argc, const char *argv[])
                                    12, /* 12 channels */
                                    /* Clear memory */
                                    /* (1<<2) | */
-                                   /*(1<<3)|*//* Factory Reset = reset baud rate */
-                                   (1<<4)| /* Enable raw track */
-                                   (1<<5)  /* debug data */ };
-       //sirf_msg_send(fd, msg_128, sizeof(msg_128));
+                                   //(1<<3)|/* Factory Reset = reset baud rate */
+                                   //(1<<4) /* Enable raw track */
+                                   /*(1<<5)*/  /* debug data */ };
+       sirf_msg_send(fd, msg_128, sizeof(msg_128));
+
+       /* Enable MID 7 = Clock Status Data (contains clock bias in ns) */
+       unsigned char msg_166_7[] = { 166, 0, 7, 1, 0, 0, 0, 0 };
+       //sirf_msg_send(fd, msg_166_7, sizeof(msg_166_7));
 
-       /* Enable MID 8 */
-       unsigned char msg_166_8[] = { 166, 0, 8, 1, 0, 0, 0, 0 };
-       sirf_msg_send(fd, msg_166_8, sizeof(msg_166_8));
+       /* Enable MID 8 = 50 BPS Data (first data to be sent every 6s cycle) */
+       unsigned char msg_166_8[] = { 166, 0, 8, 0, 0, 0, 0, 0 };
+       //sirf_msg_send(fd, msg_166_8, sizeof(msg_166_8));
 
-       /* Enable MID 29 */
-       unsigned char msg_166_29[] = { 166, 0, 29, 1, 0, 0, 0, 0 };
-       //sirf_msg_send(fd, msg_166_29, sizeof(msg_166_29));
+       /* Enable MID 28 = Navigation Library Measurement Data (contains GPS SW time in us) */
+       unsigned char msg_166_28[] = { 166, 0, 28, 1, 0, 0, 0, 0 };
+       //sirf_msg_send(fd, msg_166_28, sizeof(msg_166_28));
 
        /* Enable MID 52 : we got a NACK since this feature is not available */
-       unsigned char msg_166_52[] = { 166,  0, 52, 1, 0, 0, 0, 0 };
+       //unsigned char msg_166_52[] = { 166,  0, 52, 1, 0, 0, 0, 0 };
        //sirf_msg_send(fd, msg_166_52, sizeof(msg_166_52));
 
        /* Try to enable all messages. We got a ACK for :
@@ -850,6 +903,7 @@ int main(int argc, const char *argv[])
                FD_SET(fd, &fdr);
 
                r = select(FD_SETSIZE, &fdr, NULL, NULL, NULL);
+               gettimeofday(&tv, NULL);
                if (r < 0) {
                        perror("select");
                        break;
@@ -857,7 +911,7 @@ int main(int argc, const char *argv[])
 
                if (FD_ISSET(fd, &fdr)) {
                        int ack = 0;
-                       if (do_read(fd, &ack) < 0)
+                       if (do_read(fd, &ack, &tv) < 0)
                                break;
                        if (ack != 0) {
                                printf("ACK for cmd %d\n", ack);