summaryrefslogtreecommitdiff
path: root/contrib
diff options
context:
space:
mode:
authorEric S. Raymond <esr@thyrsus.com>2004-08-31 21:50:59 +0000
committerEric S. Raymond <esr@thyrsus.com>2004-08-31 21:50:59 +0000
commitb36e54ee6f17ac29b1f0efa9bb035f834c032df6 (patch)
tree05063364f043a0f3625cdf944ba0784d53b33332 /contrib
parent9a1bb37100ec540f069db771a6377cc96e5d2fa1 (diff)
downloadgpsd-b36e54ee6f17ac29b1f0efa9bb035f834c032df6.tar.gz
Add the contributed code to the repository.
Diffstat (limited to 'contrib')
-rw-r--r--contrib/README6
-rw-r--r--contrib/gpsread.c883
-rw-r--r--contrib/sirf.box492
3 files changed, 1381 insertions, 0 deletions
diff --git a/contrib/README b/contrib/README
new file mode 100644
index 00000000..7a1bf9b8
--- /dev/null
+++ b/contrib/README
@@ -0,0 +1,6 @@
+This directory contains various pieces of code for talking to GPSses
+rgat have been contributed to gpsd.
+
+Someday, ideas from this code might make it into gpsd. If you are looking
+for things to hack on, picking a useful idea from here and integrating
+it would be a good place to start.
diff --git a/contrib/gpsread.c b/contrib/gpsread.c
new file mode 100644
index 00000000..f92cfeea
--- /dev/null
+++ b/contrib/gpsread.c
@@ -0,0 +1,883 @@
+/************************************************************************
+** gpsread.c
+**
+** H.Berns, U.Washington, Seattle, for WALTA/Quarknet/CROP
+** last edited: 22 May 2002
+**
+** This is a test program to set up a Leadtek GPS-9532 receiver
+** through the serial port. Before startup, please reset the
+** GPS-9532 (e.g. power off for approx. 1 minute) so it will start
+** in default mode with NMEA protocol at 4800 baud.
+*************************************************************************
+**
+** This program runs the following sequence:
+** - setup serial port COM1 (/dev/ttyS0) to 4800 baud, 8N1, ascii.
+** - read a couple of lines of NMEA serial data at 4800 baud and
+** send NMEA command $PSRF105 to switch GPS "Development Data ON"
+** - send NMEA command $PSRF100 to switch GPS to SiRF mode & 19200 baud
+** - switch serial port COM1 to 19200 baud, 8N1, binary (EOL=0xb3).
+** - read a couple of SiRF messages and
+** send SiRF command 0x97 to set GPS trickle power to "continuous".
+** - send SiRF command 0x81 to switch GPS to NMEA with only
+** RMC and GGA messaging enabled at 19200 baud.
+** - set serial port COM1 back to ascii default at 19200 baud.
+** - read NMEA lines indefinitely (until CTRL-C).
+**
+*************************************************************************
+** The serial port routines are based on an example found at
+** ftp://sunsite.unc.edu:/pub/Linux/docs/HOWTO/Serial-Programming-HOWTO
+** "The Linux Serial Programming HOWTO" [v1.0, 22 January 1998]
+** by Peter H. Baumann, Peter.Baumann@dlr.de
+** (chapter 3.1. "Canonical Input Processing")
+************************************************************************/
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <termios.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <sys/time.h>
+#include <unistd.h>
+
+/* baudrate settings are defined in <asm/termbits.h>, which is
+ included by <termios.h> */
+
+#define BAUDRATE_4800 B4800 /* 4800 baud */
+#define BAUDRATE_19200 B19200 /* 19200 baud */
+
+/* change this definition for the correct port
+** COM1: /dev/ttyS0, COM2: /dev/ttyS1, etc.
+**
+** Note: with a default Linux setup, only the superuser (root) has
+** read/write permission to the serial port, unless permission is
+** set for all users. E.g. set permission from root with command
+** `chmod 666 /dev/ttyS?`
+*/
+#define MODEMDEVICE "/dev/ttyS2" /* COM1 */
+
+#define _POSIX_SOURCE 1 /* POSIX compliant source */
+#define FALSE 0
+#define TRUE 1
+#define DEBUG 1 /* 1=debug 0=no_debug */
+#define BUFMAX 10000
+#define HEXFILE "log/gps.hex"
+#define LOGFILE "log/gps.log"
+#define DATFILE "log/gps.dat"
+
+/* global variables */
+struct termios oldtio, newtio;
+struct timeval sys_time, prev_sys_time;
+struct timezone tz;
+int fd;
+short buf2[2*BUFMAX];
+char buf[2*BUFMAX], buf_nmea[2*BUFMAX], payload[BUFMAX];
+int sats=0, pos_fix=0;
+int STOP=FALSE, START=TRUE;
+float altitude=-1.0, hdop=-1.0;
+FILE *out, *dout;
+
+/* -------------------------- main program --------------------------------- */
+
+main(int argc, char *argv[])
+{
+ int i, j, k, n, res, sent, SiRF_loop=100, NMEA_loop=20;
+ int STOP=FALSE, START=FALSE;
+ char ctemp, choice;
+ short mnem[4];
+ FILE *hout;
+
+ if ((out=fopen(LOGFILE,"w")) == NULL)
+ {
+ fprintf(stderr,"can't open %s !\n", LOGFILE);
+ exit(1);
+ }
+
+ if ((hout=fopen(HEXFILE,"w")) == NULL)
+ {
+ fprintf(stderr,"can't open %s !\n", HEXFILE);
+ exit(1);
+ }
+
+ if ((dout=fopen(DATFILE,"w")) == NULL)
+ {
+ fprintf(stderr,"can't open %s !\n", DATFILE);
+ exit(1);
+ }
+ fprintf(stderr,"Did the Leadtek GPS just reset (power off/on) [y/n]? ");
+ choice = getc(stdin);
+ if (choice==0x59 || choice==0x79) START = TRUE;
+
+ fprintf(stderr,"###################################################\n");
+ fprintf(stderr,"# %s started\n# to stop program hit <CTRL><C>\n",argv[0]);
+ fprintf(stderr,"###################################################\n");
+
+ j=0;
+ bzero(buf_nmea, sizeof(buf_nmea));
+ bzero(buf, sizeof(buf));
+ gettimeofday(&prev_sys_time, &tz); /* read precision system time from PC */
+
+ if (START)
+ {
+ fprintf(stderr,"now waiting for serial NMEA data at 4800 baud from ");
+ if (strstr(MODEMDEVICE,"ttyS0")) fprintf(stderr,"COM1");
+ if (strstr(MODEMDEVICE,"ttyS1")) fprintf(stderr,"COM2");
+ if (strstr(MODEMDEVICE,"ttyS2")) fprintf(stderr,"COM3");
+ if (strstr(MODEMDEVICE,"ttyS3")) fprintf(stderr,"COM4");
+ fprintf(stderr," ...\n");
+
+ /* Open modem device for reading and writing and not as controlling
+ tty because we don't want to get killed if linenoise sends CTRL-C.
+ */
+
+ fd = setup_terminal(fd,0); /* mode=0 = NMEA mode at 4800 baud */
+
+ for (i=0; i<NMEA_loop; i++)
+ {
+ res = (int) read(fd, buf, BUFMAX);
+ gettimeofday(&sys_time, &tz); /* read precision system time from PC */
+
+ for (n=0; n<res; n++)
+ {
+ fprintf(stderr,"%c", buf[n] & 0xff);
+ fprintf(out,"%c", buf[n] & 0xff);
+ if (buf[n]==0x24) /* "$" */
+ {
+ buf_nmea[j] = 0;
+ if (!strncmp(buf_nmea,"$GPRMC,",7)) extract_RMC_data();
+ if (!strncmp(buf_nmea,"$GPGGA,",7)) extract_GGA_data();
+ buf_nmea[0] = buf[n] & 0xff;
+ j=1;
+ }
+ else
+ {
+ buf_nmea[j] = buf[n] & 0xff;
+ j++;
+ }
+ }
+ fflush(out);
+ memcpy(&prev_sys_time, &sys_time, sizeof(sys_time)); /* save system time for next readout */
+
+ if (i==20)
+ {
+ /* send NMEA command - switch "Development Data" on */
+ sprintf(payload,"PSRF105,1");
+ send_NMEA_message(9);
+ }
+ if (DEBUG && i>=30 && i<=35)
+ {
+ /* send NMEA commands to set query controls */
+
+ if (i==30) sprintf(payload,"PSRF103,00,00,10,01"); /* set GGA to 1/10 Hz */
+ if (i==31) sprintf(payload,"PSRF103,01,00,00,01"); /* disable GLL */
+ if (i==32) sprintf(payload,"PSRF103,02,00,00,01"); /* disable GSA */
+ if (i==33) sprintf(payload,"PSRF103,03,00,00,01"); /* disable GSV */
+ if (i==34) sprintf(payload,"PSRF103,04,00,01,01"); /* set RMC to 1 Hz */
+ if (i==35) sprintf(payload,"PSRF103,05,00,00,01"); /* disable VTG */
+ send_NMEA_message(19);
+ }
+ }
+
+ /* send NMEA command to switch GPS to SiRF mode and 19200 baud */
+
+ sprintf(payload,"PSRF100,0,19200,8,1,0");
+ send_NMEA_message(21);
+
+ if (DEBUG)
+ {
+ sprintf(payload,"PSRF100,0,19200,8,1,0"); /* send again to make sure... */
+ send_NMEA_message(21);
+ }
+
+ /* switch PC's serial port now to 19200 baud */
+
+ sleep(1); /* wait 1 second */
+ restore_terminal(fd);
+ fprintf(stderr,"\n================================================\n");
+ fprintf(stderr,"Switch to 19200 baud for SiRF binary protocol\n");
+ fprintf(stderr,"================================================\n");
+ fd = setup_terminal(fd,1); /* mode=1 = SiRF mode at 19200 baud */
+
+ /* poll software version */
+
+ j = k = 0;
+ for (i=0; i<4; i++) mnem[i]=0;
+
+ for (i=0; i<SiRF_loop; i++) /* loop over some serial port readout lines */
+ {
+ /* read blocks program execution until a line terminating character
+ is input, even if more than BUFMAX chars are input. If the number
+ of characters read is smaller than the number of chars available,
+ subsequent reads will return the remaining chars. res will be set
+ to the actual number of characters actually read
+ */
+
+ res = (int) read(fd, buf, BUFMAX);
+
+ for (n=0; n<res; n++)
+ {
+ mnem[j%4] = (short) buf[n] & 0xff;
+ buf2[k] = (short) buf[n] & 0xff;
+
+ if (j>1) fprintf(hout,"%02x", mnem[(j-2)%4]);
+
+ if (mnem[(j-3)%4]==176 && mnem[(j-2)%4]==179 && mnem[(j-1)%4]==160 && mnem[j%4]==162)
+ {
+ fprintf(stderr,"\nSiRF ID %2d (%3d bytes): ", buf2[4], k-1);
+
+ if (buf2[4]==2) display_SiRF_message_02();
+ if (buf2[4]==4) display_SiRF_message_04();
+ if (buf2[4]==6) display_SiRF_message_06();
+ if (buf2[4]==11) display_SiRF_message_11();
+ if (buf2[4]==12) display_SiRF_message_12();
+ if (buf2[4]==19) display_SiRF_message_19();
+
+ k=1;
+ buf2[0] = 160;
+ buf2[1] = 162;
+ fprintf(hout,"\n");
+ fflush(hout);
+ }
+ k++;
+ j++;
+ }
+
+ /* send SiRF commands at certain times */
+
+ if (i==4)
+ {
+ /* poll software version */
+
+ payload[0] = 0x84;
+ payload[1] = 0x00;
+ send_SiRF_message(2);
+ }
+ if (i==5)
+ {
+ /* Enable WAAS */
+
+ payload[0] = 0x81;
+ payload[1] = 0x01;
+ payload[2] = 0x00;
+ payload[3] = 0x00;
+ send_SiRF_message(4);
+ }
+ else if (i==6)
+ {
+ /* set trickle power parameters to "continuous" */
+/*
+ payload[0] = 0x97;
+ payload[1] = 0x00;
+ payload[2] = 0x00;
+ payload[3] = 0x03;
+ payload[4] = 0xe8;
+ payload[5] = 0x00;
+ payload[6] = 0x00;
+ payload[7] = 0x01;
+ payload[8] = 0xf4;
+*/
+ payload[0] = 0x97;
+ payload[1] = 0x00;
+ payload[2] = 0x00;
+ payload[3] = 0xc8;
+ payload[4] = 0x00;
+ payload[5] = 0x00;
+ payload[6] = 0x00;
+ payload[7] = 0xc8;
+ payload[8] = 0x00;
+ send_SiRF_message(9);
+ }
+ else if (i==8)
+ {
+ /* poll Navigation parameters */
+
+ payload[0] = 0x98;
+ payload[1] = 0x00;
+ send_SiRF_message(2);
+ }
+ else if (i==(SiRF_loop-10))
+ {
+ /* switch to NMEA protocol */
+
+ payload[0] = 0x81; /* message ID 129 (0x81) */
+ payload[1] = 0x02;
+ payload[2] = 0x0a; /* GGA on at 10 second interval */
+ payload[3] = 0x01;
+ payload[4] = 0x00; /* GLL off */
+ payload[5] = 0x01;
+ payload[6] = 0x00; /* GSA off */
+ payload[7] = 0x01;
+ payload[8] = 0x00; /* GSV off */
+ payload[9] = 0x01;
+ payload[10] = 0x01; /* RMC on at 1 second */
+ payload[11] = 0x01;
+ payload[12] = 0x00; /* VTG message off */
+ payload[13] = 0x01;
+ payload[14] = 0x00;
+ payload[15] = 0x01;
+ payload[16] = 0x00;
+ payload[17] = 0x01;
+ payload[18] = 0x00;
+ payload[19] = 0x01;
+ payload[20] = 0x00;
+ payload[21] = 0x01;
+ payload[22] = 0x4b; /* baudrate = 19200 */
+ payload[23] = 0x00;
+ send_SiRF_message(24);
+ }
+ }
+ fclose(hout);
+
+ /* done with SiRF protocol, now switch back to NMEA protocol */
+
+ restore_terminal(fd);
+ sleep(1);
+
+ fprintf(stderr,"\n================================================\n");
+ fprintf(stderr,"Switch back to NMEA protocol, stay at 19200 baud\n");
+ fprintf(stderr,"================================================\n");
+ }
+
+ fd = setup_terminal(fd,2); /* mode=0 = NMEA mode at 19200 baud */
+
+ sprintf(payload,"PSRF105,1"); /* "Development Data" on */
+ send_NMEA_message(9);
+ sprintf(payload,"PSRF103,00,00,05,01"); /* set GGA to 5 sec interval */
+ send_NMEA_message(19);
+ sprintf(payload,"PSRF103,01,00,00,01"); /* disable GLL */
+ send_NMEA_message(19);
+ sprintf(payload,"PSRF103,02,00,00,01"); /* disable GSA */
+ send_NMEA_message(19);
+ sprintf(payload,"PSRF103,03,00,00,01"); /* disable GSV */
+ send_NMEA_message(19);
+ sprintf(payload,"PSRF103,04,00,01,01"); /* set RMC to 1 sec interval */
+ send_NMEA_message(19);
+ sprintf(payload,"PSRF103,05,00,00,01"); /* disable VTG */
+ send_NMEA_message(19);
+
+ j=0;
+ gettimeofday(&prev_sys_time, &tz);
+
+/* START = FALSE; */
+
+/* for (;;) /* run indefinitely or until CTRL-C */
+ for (i=0; i<NMEA_loop; i++)
+ {
+ gettimeofday(&prev_sys_time, &tz);
+ res = (int) read(fd, buf, BUFMAX);
+
+ for (n=0; n<res; n++)
+ {
+ fprintf(stderr,"%c", buf[n] & 0xff);
+ fprintf(out,"%c", buf[n] & 0xff);
+
+ buf_nmea[j] = buf[n] & 0xff;
+ if (buf_nmea[j]==0x0a)
+ {
+ buf_nmea[j+1]=0;
+ if (!strncmp(buf_nmea,"$GPRMC,",7)) extract_RMC_data();
+ if (!strncmp(buf_nmea,"$GPGGA,",7)) extract_GGA_data();
+ j=0;
+ }
+ else
+ {
+ j++;
+ }
+ }
+ fflush(out);
+ }
+ /* send NMEA command to switch GPS to NMEA mode and 4800 baud */
+
+ sprintf(payload,"PSRF100,1,4800,8,1,0");
+ send_NMEA_message(21);
+ sleep(1);
+
+ sprintf(payload,"PSRF100,1,4800,8,1,0");
+ send_NMEA_message(21);
+
+ restore_terminal(fd);
+ sleep(1);
+
+ fprintf(stderr,"\n================================================\n");
+ fprintf(stderr,"Switch back to NMEA protocol, 4800 baud\n");
+ fprintf(stderr,"================================================\n");
+ fd = setup_terminal(fd,0); /* mode=0 = NMEA mode at 4800 baud */
+
+ sprintf(payload,"PSRF105,1"); /* "Development Data" on */
+ send_NMEA_message(9);
+ sprintf(payload,"PSRF108,1"); /* "WAAS" on */
+ send_NMEA_message(9);
+ sprintf(payload,"PSRF103,00,00,01,01"); /* set GGA to 5 sec interval */
+ send_NMEA_message(19);
+ sprintf(payload,"PSRF103,01,00,01,01"); /* disable GLL */
+ send_NMEA_message(19);
+ sprintf(payload,"PSRF103,02,00,01,01"); /* disable GSA */
+ send_NMEA_message(19);
+ sprintf(payload,"PSRF103,03,00,01,01"); /* disable GSV */
+ send_NMEA_message(19);
+ sprintf(payload,"PSRF103,04,00,01,01"); /* set RMC to 1 sec interval */
+ send_NMEA_message(19);
+ sprintf(payload,"PSRF103,05,00,01,01"); /* disable VTG */
+ send_NMEA_message(19);
+
+ for (i=0; i<NMEA_loop; i++)
+ {
+ gettimeofday(&prev_sys_time, &tz);
+ res = (int) read(fd, buf, BUFMAX);
+
+ for (n=0; n<res; n++)
+ {
+ fprintf(stderr,"%c", buf[n] & 0xff);
+ fprintf(out,"%c", buf[n] & 0xff);
+
+ buf_nmea[j] = buf[n] & 0xff;
+ if (buf_nmea[j]==0x0a)
+ {
+ buf_nmea[j+1]=0;
+ if (!strncmp(buf_nmea,"$GPRMC,",7)) extract_RMC_data();
+ if (!strncmp(buf_nmea,"$GPGGA,",7)) extract_GGA_data();
+ j=0;
+ }
+ else
+ {
+ j++;
+ }
+ }
+ fflush(out);
+ }
+
+ fclose(out);
+ fclose(dout);
+}
+
+/* ------------------------------ subroutines ------------------------------ */
+
+int setup_terminal(int fd, int mode)
+{
+ /* mode: 0 = NMEA mode at 4800 baud (GPS power up default)
+ 1 = SiRF mode at 19200 baud
+ 2 = NMEA mode at 19200 baud
+ */
+
+ fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );
+ if (fd <0) { perror(MODEMDEVICE); exit(-1); }
+
+ if (DEBUG) fprintf(stderr," %s open\n", MODEMDEVICE);
+
+ tcgetattr(fd,&oldtio); /* save current serial port settings */
+ bzero(&newtio, sizeof(newtio)); /* clear struct for new port settings */
+
+ /* BAUDRATE: Set bps rate. You could also use cfsetispeed and
+ cfsetospeed.
+ CRTSCTS : output hardware flow control (only used if the cable has
+ all necessary lines. See sect. 7 of Serial-HOWTO)
+ [not used here = no flow control]
+ CS8 : 8n1 (8bit,no parity,1 stopbit)
+ CLOCAL : local connection, no modem contol
+ CREAD : enable receiving characters
+ */
+
+/* newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD; */
+
+ if (mode==0)
+ {
+ newtio.c_cflag = BAUDRATE_4800 | CS8 | CLOCAL | CREAD; /* no flow control */
+ }
+ else
+ {
+ newtio.c_cflag = BAUDRATE_19200 | CS8 | CLOCAL | CREAD; /* no flow control */
+ }
+
+ /* IGNPAR : ignore bytes with parity errors
+ ICRNL : map CR to NL (otherwise a CR input on the other computer
+ will not terminate input)
+ otherwise make device raw (no other input processing)
+ */
+
+ newtio.c_iflag = IGNPAR;
+
+ /* Raw output. */
+
+ newtio.c_oflag = 0;
+
+ /* ICANON : enable canonical input
+ disable all echo functionality, and don't send signals to calling
+ program
+ */
+
+ newtio.c_lflag = ICANON;
+
+ /* initialize all control characters
+ default values can be found in /usr/include/termios.h, and are
+ given in the comments, but we don't need them here
+ */
+
+ newtio.c_cc[VINTR] = 0; /* Ctrl-c */
+ newtio.c_cc[VQUIT] = 0; /* Ctrl-\ */
+ newtio.c_cc[VERASE] = 0; /* del */
+ newtio.c_cc[VKILL] = 0; /* @ */
+ newtio.c_cc[VEOF] = 0; /* Ctrl-d */
+ newtio.c_cc[VTIME] = 0; /* inter-character timer unused */
+ newtio.c_cc[VMIN] = 0; /* blocking read until 1 character arrives */
+ newtio.c_cc[VSWTC] = 0; /* '\0' */
+ newtio.c_cc[VSTART] = 0; /* Ctrl-q */
+ newtio.c_cc[VSTOP] = 0; /* Ctrl-s */
+ newtio.c_cc[VSUSP] = 0; /* Ctrl-z */
+ if (mode==1)
+ {
+ newtio.c_cc[VEOL] = 0xb3; /* EOL character for SiRF mode = 0xb3 */
+ }
+ else
+ {
+ newtio.c_cc[VEOL] = 0; /* 0='\0' */
+ }
+ newtio.c_cc[VREPRINT] = 0; /* Ctrl-r */
+ newtio.c_cc[VDISCARD] = 0; /* Ctrl-u */
+ newtio.c_cc[VWERASE] = 0; /* Ctrl-w */
+ newtio.c_cc[VLNEXT] = 0; /* Ctrl-v */
+ newtio.c_cc[VEOL2] = 0; /* '\0' */
+
+ /* now clean the modem line and activate the settings for the port */
+
+ if (DEBUG) fprintf(stderr," %s new terminal settings loaded\n",MODEMDEVICE);
+
+ tcflush(fd, TCIFLUSH);
+ tcsetattr(fd,TCSANOW,&newtio);
+
+ /* terminal settings done, now handle input
+ In this example, inputting a 'z' at the beginning of a line will
+ exit the program.
+ */
+
+ if (DEBUG) fprintf(stderr," %s activated ...\n",MODEMDEVICE);
+ return(fd);
+}
+
+restore_terminal(int fd)
+{
+ /* restore the old port settings */
+
+ tcsetattr(fd,TCSANOW,&oldtio);
+}
+
+display_SiRF_message_02()
+{
+ /* Message ID 2: Navigation & Time data */
+
+ u_int week, t100, seconds, day, hour, min, sec;
+ int n, Xpos, Ypos, Zpos, mode, sats;
+
+ /* x,y,z position in meters (from Earth center) */
+
+ Xpos = ((buf2[5] << 24) & 0xff000000) + \
+ ((buf2[6] << 16) & 0x00ff0000) + \
+ ((buf2[7] << 8) & 0x0000ff00) + \
+ (buf2[8] & 0x000000ff);
+ Ypos = ((buf2[9] << 24) & 0xff000000) + \
+ ((buf2[10] << 16) & 0x00ff0000) + \
+ ((buf2[11] << 8) & 0x0000ff00) + \
+ (buf2[12] & 0x000000ff);
+ Zpos = ((buf2[13] << 24) & 0xff000000) + \
+ ((buf2[14] << 16) & 0x00ff0000) + \
+ ((buf2[15] << 8) & 0x0000ff00) + \
+ (buf2[16] & 0x000000ff);
+
+ /* GPS week since Jan. 1980 (modulo 1024) */
+
+ week = ((buf2[26] << 8) & 0x0000ff00) + \
+ (buf2[27] & 0x000000ff);
+
+ /* time in 1/100 seconds since start of GPS week */
+
+ t100 = ((buf2[28] << 24) & 0xff000000) + \
+ ((buf2[29] << 16) & 0x00ff0000) + \
+ ((buf2[30] << 8) & 0x0000ff00) + \
+ (buf2[31] & 0x000000ff);
+
+ seconds = t100/100;
+ day = seconds / 86400;
+ hour = (seconds%86400) / 3600;
+ min = (seconds%3600) / 60;
+ sec = seconds%60;
+
+ mode = (int) buf2[23]; /* satellite tracking mode */
+ sats = (int) buf2[32]; /* number of tracked satellites */
+
+ fprintf(stderr," Week=%d Time=%d:%02d:%02d:%02d.%02d mode=%02x X=%d Y=%d Z=%d sats=%d",\
+ week, day, hour, min, sec, t100%100, mode, Xpos, Ypos, Zpos, sats);
+ if (sats>0)
+ {
+ fprintf(stderr," sat#");
+ for (n=0; n<sats; n++) fprintf(stderr," %02d", buf2[33+n]);
+ }
+}
+
+display_SiRF_message_04()
+{
+ /* Message ID 4: Tracker data */
+
+ u_int week, t100, seconds, day, hour, min, sec;
+
+ /* GPS week */
+
+ week = ((buf2[5] << 8) & 0x0000ff00) + \
+ (buf2[6] & 0x000000ff);
+
+ /* time in 1/100 seconds since start of GPS week */
+
+ t100 = ((buf2[7] << 24) & 0xff000000) + \
+ ((buf2[8] << 16) & 0x00ff0000) + \
+ ((buf2[9] << 8) & 0x0000ff00) + \
+ (buf2[10] & 0x000000ff);
+
+ seconds = t100/100;
+ day = seconds / 86400;
+ hour = (seconds%86400) / 3600;
+ min = (seconds%3600) / 60;
+ sec = seconds%60;
+
+ fprintf(stderr," Week=%d Time=%d:%02d:%02d:%02d.%02d",\
+ week, day, hour, min, sec, t100%100);
+}
+
+display_SiRF_message_06()
+{
+ /* Message ID 6: Software version */
+
+ int n=0;
+
+ fprintf(stderr," = S/W VERSION: ");
+ while(n<20 && buf2[n+5]!=0)
+ {
+ fprintf(stderr,"%c",(char) buf2[n+5]);
+ n++;
+ }
+}
+
+display_SiRF_message_11()
+{
+ /* Message ID 11: Command Acknowledgement */
+
+ fprintf(stderr," => Command 0x%02x acknowledged", buf2[5]);
+}
+
+display_SiRF_message_12()
+{
+ /* Message ID 12: Command NAcknowledgement */
+
+ fprintf(stderr," => Command 0x%02x not understood - ERROR!!", buf2[5]);
+}
+
+display_SiRF_message_19()
+{
+ /* Message ID 19: Navigation Parameter response */
+
+ int n;
+
+ fprintf(stderr," Navigation Parameters: ");
+ for (n=0; n<23; n++) fprintf(stderr,"%02x", buf2[n+5]);
+}
+
+send_SiRF_message(int numpayload)
+{
+ short checksum=0;
+ int n, sent, numbytes;
+ char bufs[BUFMAX];
+
+ bufs[0] = 0xa0;
+ bufs[1] = 0xa2;
+ bufs[2] = (numpayload >> 8) & 0xff;
+ bufs[3] = numpayload & 0xff;
+
+ for (n=0; n<numpayload; n++)
+ {
+ bufs[n+4] = payload[n] & 0xff;
+ checksum += (short) (payload[n] & 0xff);
+ }
+
+ bufs[numpayload+4] = (checksum >> 8) & 0xff;
+ bufs[numpayload+5] = checksum & 0xff;
+ bufs[numpayload+6] = 0xb0;
+ bufs[numpayload+7] = 0xb3;
+
+ numbytes = numpayload + 8;
+
+ sent = (int) write(fd, bufs, numbytes);
+ if (sent != numbytes)
+ {
+ fprintf(stderr,"\nSerial Port Write Error, wstat=%d\n", sent);
+ }
+ else
+ {
+ fprintf(stderr,"\n---------------------------------------------\n");
+ fprintf(stderr,"SiRF message %d sent with %d bytes\n", payload[0] & 0xff, numbytes);
+ fprintf(stderr,"---------------------------------------------\n");
+ }
+}
+
+send_NMEA_message(int numpayload)
+{
+ char checksum=0, check_sum[2];
+ int n, sent, numbytes;
+ char bufs[BUFMAX];
+
+ bufs[0] = 0x24; /* "$" */
+
+ for (n=0; n<numpayload; n++)
+ {
+ bufs[n+1] = payload[n] & 0xff;
+ checksum ^= payload[n] & 0xff;
+ }
+
+ sprintf(check_sum,"%02x",checksum & 0xff);
+
+ bufs[numpayload+1] = 0x2a; /* "*" */
+ bufs[numpayload+2] = check_sum[0] & 0xff;
+ bufs[numpayload+3] = check_sum[1] & 0xff;
+ bufs[numpayload+4] = 0x0d; /* <CR> */
+ bufs[numpayload+5] = 0x0a; /* <LF> */
+
+ numbytes = numpayload + 6;
+
+ sent = (int) write(fd, bufs, numbytes);
+ if (sent != numbytes)
+ {
+ fprintf(stderr,"\nSerial Port Write Error, wstat=%d\n", sent);
+ }
+ else if (START) /* display sent message for debug */
+ {
+ fprintf(stderr,"\n-----------------------------------------------------------\n");
+ fprintf(stderr,"NMEA message sent (%d bytes): ", numbytes);
+ for (n=0; n<numbytes; n++) fprintf(stderr,"%c", bufs[n] & 0xff);
+ fprintf(stderr,"-----------------------------------------------------------\n");
+ }
+}
+
+extract_RMC_data()
+{
+ int DATA_VALID=FALSE;
+ int itime, mtime, ilat, mlat, ilong, mlong;
+ int date, year, month, day, hour, min, sec, msec;
+ int latdeg, latmin, longdeg, longmin;
+ int igps_sec;
+ float course, speed;
+ long double gps_sec, sys_sec, psys_sec, diff_sec, wait_sec;
+ char valid_flag[10], lat_dir[10], long_dir[10];
+
+ if (!START) gettimeofday(&sys_time, &tz);
+
+// fprintf(stderr,"RMC data detected: %s\n", buf_nmea);
+
+ if (12==sscanf(buf_nmea,"$GPRMC,%6d.%3d,%[AV],%4d.%4d,%[NS],%5d.%4d,%[EW],%f,%f,%6d", \
+ &itime, &msec, valid_flag, &ilat, &mlat, lat_dir, &ilong, &mlong, \
+ long_dir, &speed, &course, &date))
+ {
+ DATA_VALID=TRUE;
+ }
+ else if(11==sscanf(buf_nmea,"$GPRMC,%6d.%3d,%[AV],%4d.%4d,%[NS],%5d.%4d,%[EW],%f,,%6d", \
+ &itime, &msec, valid_flag, &ilat, &mlat, lat_dir, &ilong, &mlong, \
+ long_dir, &speed, &date))
+ {
+ DATA_VALID=TRUE;
+ }
+ else if (10==sscanf(buf_nmea,"$GPRMC,%6d.%3d,%[AV],%4d.%4d,%[NS],%5d.%4d,%[EW],,,%6d", \
+ &itime, &msec, valid_flag, &ilat, &mlat, lat_dir, &ilong, &mlong, \
+ long_dir, &date))
+ {
+ DATA_VALID=TRUE;
+ }
+ else
+ {
+ DATA_VALID=FALSE;
+ }
+
+ if (DATA_VALID)
+ {
+
+ hour = itime/10000;
+ min = (itime%10000)/100;
+ sec = itime%100;
+
+ year = 2000 + (date%100);
+ month = (date%10000)/100;
+ day = date/10000;
+
+ igps_sec = calc_daytime(year, month, day, hour, min, sec);
+ gps_sec = (long double) igps_sec + (long double) msec / 1000.0;
+ sys_sec = (long double) sys_time.tv_sec + (long double) sys_time.tv_usec / 1000000.0;
+ psys_sec = (long double) prev_sys_time.tv_sec + (long double) prev_sys_time.tv_usec / 1000000.0;
+ diff_sec = sys_sec - gps_sec;
+ wait_sec = sys_sec - psys_sec;
+
+ latdeg = ilat/100;
+ latmin = ilat%100;
+
+ longdeg = ilong/100;
+ longmin = ilong%100;
+
+ fprintf(dout,"%4d/%02d/%02d", year, month, day);
+ fprintf(dout," %02d:%02d:%02d.%03d %c", hour, min, sec, msec, valid_flag[0]);
+ fprintf(dout," Lat=%02d:%02d.%04d-%c", latdeg, latmin, mlat, lat_dir[0]);
+ fprintf(dout," Lng=%03d:%02d.%04d-%c", longdeg, longmin, mlong, long_dir[0]);
+ fprintf(dout," Alt=%05.1f sats=%02d", altitude, sats);
+ fprintf(dout," hdop=%04.1f fix=%d", hdop, pos_fix);
+ fprintf(dout," SYS-GPS=%5.3Lf wait=%5.3Lf\n", diff_sec, wait_sec);
+ fflush(dout);
+ }
+}
+
+extract_GGA_data()
+{
+ float latsec, longsec;
+ int itime, mtime, ilat, mlat, ilong, mlong;
+ int date, year, month, day, hour, min, sec, msec;
+ int latdeg, latmin, longdeg, longmin;
+ char valid_flag[10], lat_dir[10], long_dir[10];
+
+// fprintf(stderr,"GGA data detected: %s\n", buf_nmea);
+
+ if (12==sscanf(buf_nmea,"$GPGGA,%6d.%3d,%4d.%4d%[NS,]%5d.%4d%[EW,]%d,%2d,%f,%f", \
+ &itime, &msec, &ilat, &mlat, lat_dir, &ilong, &mlong, long_dir, \
+ &pos_fix, &sats, &hdop, &altitude))
+ {
+ hour = itime/10000;
+ min = (itime%10000)/100;
+ sec = itime%100;
+
+ latdeg = ilat/100;
+ latmin = ilat%100;
+ latsec = (float) mlat * 0.006;
+
+ longdeg = ilong/100;
+ longmin = ilong%100;
+ longsec = (float) mlong * 0.006;
+ }
+}
+
+int calc_daytime(int year,int month,int day,int hh,int mm,int ss)
+{
+ /* author credits: M.Kohama for K2K GPS, Japan, 4/7/1999 */
+
+ static int year0 = 1970;
+ static int m[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
+ int i,daytime,k1,k2,k3,k4,d0,u1,time0,timeu0;
+
+ u1 = 24 * 3600;
+ d0 = 365 * 24 * 3600;
+
+ timeu0 = (year0-1)/4 - (year0-1)/100 + (year0-1)/400;
+ time0 = (year0-1) * 365 + timeu0;
+
+ k1 = (year-1)/4 - (year-1)/100 + (year-1)/400;
+ k2 = ((year-1) * 365 + k1 - time0 )* u1;
+
+ k3 = 0;
+ for(i=0;i<month-1;i++) k3 += u1*m[i];
+ if ((year%4)==0 && ((year%100)!=0 || (year%400)==0) && month>2) k3 += u1;
+
+ k4 = (day-1) * u1 + 3600 * hh + 60 * mm + ss;
+ daytime = k2 + k3 + k4;
+ return daytime;
+}
diff --git a/contrib/sirf.box b/contrib/sirf.box
new file mode 100644
index 00000000..1a2080e7
--- /dev/null
+++ b/contrib/sirf.box
@@ -0,0 +1,492 @@
+From lmendez19@austin.rr.com Tue Aug 31 14:03:34 2004
+Return-Path: <lmendez19@austin.rr.com>
+Received: from localhost (localhost [127.0.0.1])
+ by snark.thyrsus.com (8.12.11/8.12.11) with ESMTP id i7VI3XHC030622
+ for <esr@localhost>; Tue, 31 Aug 2004 14:03:34 -0400
+Received: from grelber.thyrsus.com [192.168.1.31]
+ by localhost with IMAP (fetchmail-6.2.5)
+ for esr@localhost (single-drop); Tue, 31 Aug 2004 14:03:34 -0400 (EDT)
+Received: from ms-smtp-02-eri0.texas.rr.com (ms-smtp-02.texas.rr.com [24.93.47.41])
+ by grelber.thyrsus.com (8.12.11/8.12.11) with ESMTP id i7VI2AsC018087
+ for <esr@thyrsus.com>; Tue, 31 Aug 2004 14:02:10 -0400
+Received: from jedi (cs679161-75.austin.rr.com [67.9.161.75])
+ by ms-smtp-02-eri0.texas.rr.com (8.12.10/8.12.7) with SMTP id i7VHwfHv022431
+ for <esr@thyrsus.com>; Tue, 31 Aug 2004 12:58:43 -0500 (CDT)
+Message-ID: <000f01c48f84$2cfeaf00$0500a8c0@jedi>
+From: "Lonnie Mendez" <lmendez19@austin.rr.com>
+To: <esr@thyrsus.com>
+References: <20040831110333.GE16228@us.netrek.org> <20040831164431.GB14818@thyrsus.com>
+Subject: Re: [Gpsd-dev] CS7 or CS8
+Date: Tue, 31 Aug 2004 12:58:50 -0500
+MIME-Version: 1.0
+Content-Type: multipart/mixed;
+ boundary="----=_NextPart_000_000C_01C48F5A.42AFE9B0"
+X-Priority: 3
+X-MSMail-Priority: Normal
+X-Mailer: Microsoft Outlook Express 6.00.2900.2180
+X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180
+X-Virus-Scanned: Symantec AntiVirus Scan Engine
+X-Bogosity: No, tests=bogofilter, spamicity=0.000000, version=0.16.4
+X-Spam-Checker-Version: SpamAssassin 2.63 (2004-01-11) on snark.thyrsus.com
+X-Spam-Level:
+X-Spam-Status: No, hits=-3.8 required=5.0 tests=BAYES_00,FROM_ENDS_IN_NUMS,
+ RCVD_IN_SORBS autolearn=no version=2.63
+Status: RO
+Content-Length: 33325
+Lines: 454
+
+This is a multi-part message in MIME format.
+
+------=_NextPart_000_000C_01C48F5A.42AFE9B0
+Content-Type: text/plain;
+ format=flowed;
+ charset="iso-8859-1";
+ reply-type=original
+Content-Transfer-Encoding: 7bit
+
+ I just got back from having surgery, so please forgive my english..etc.
+
+ I have some code I've been using to message around with my usb earthmate
+in sirf binary protocol mode.... I thought it might be of some use for you
+and the project. The code is definitely not a good example in programming
+style and tactics, but it should allow for messing around with the device
+and enabling/disabling nmea messages, setting power rate, etc (ephemeris and
+almanac not supported). Since I have not used this in soo long and have no
+plans for using it later, I might as well contribute it... another example
+of sirf handling would be the Janszoon sirf library, which uses wgs84 for
+lla to xyz datum calculations. It can be found at freshmeat.net. The sirf
+lib is attached to this message. I can imagine, if this were to be made
+functional, using it for obtaining sirf data for the gpstk library would be
+the most practical use...as they spent well over a million dollars to
+develop the library!
+
+Datasheet for SiRF binary protocol I used here (General Downloads->GPS):
+http://www.rayming.com/downloads.asp#7
+
+Best regards,
+ Lonnie Mendez
+
+
+
+------=_NextPart_000_000C_01C48F5A.42AFE9B0
+Content-Type: application/octet-stream;
+ name="libsirf-devel-0.1.tar.bz2"
+Content-Transfer-Encoding: base64
+Content-Disposition: attachment;
+ filename="libsirf-devel-0.1.tar.bz2"
+
+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
+
+------=_NextPart_000_000C_01C48F5A.42AFE9B0--
+