diff options
author | Eric S. Raymond <esr@thyrsus.com> | 2004-08-31 21:50:59 +0000 |
---|---|---|
committer | Eric S. Raymond <esr@thyrsus.com> | 2004-08-31 21:50:59 +0000 |
commit | b36e54ee6f17ac29b1f0efa9bb035f834c032df6 (patch) | |
tree | 05063364f043a0f3625cdf944ba0784d53b33332 /contrib | |
parent | 9a1bb37100ec540f069db771a6377cc96e5d2fa1 (diff) | |
download | gpsd-b36e54ee6f17ac29b1f0efa9bb035f834c032df6.tar.gz |
Add the contributed code to the repository.
Diffstat (limited to 'contrib')
-rw-r--r-- | contrib/README | 6 | ||||
-rw-r--r-- | contrib/gpsread.c | 883 | ||||
-rw-r--r-- | contrib/sirf.box | 492 |
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-- + |