( GPS ( Change to have two machines ( $GPGGA Output Sentence: ( $GPGGA, ( 180432.00, UTC of position fix in hhmmss.ss format ( 4027.027912, Geographic latitude in ddmm.mmmmmm format ( N, Direction of latitude (N - North, S - South) ( 08704.857070, Geographic longitude in dddmm.mmmmmm format ( W, Direction of longitude (E - East, W - West) ( 2, GPS quality indicator (0 - fix not valid, 1 - GPS fix, 2 - DGPS fix) ( 07, Number of satellites in use (00-12) ( 1.0, Horizontal DOP ( 212.15, Antenna height above Mean Sea Level reference (212.15 m) ( M, Unit of altitude (meters) ( -33.81, Geoidal separation (-33.81 m) ( M, Unit of geoidal separation (meters) ( 4.2, Age of differential GPS data record ( 0555 Base station ID (0000-1023) ( *73 Asteric & Hex checksum ( $GPRMC Output Sentence: ( $GPRMC, ( 180432, UTC of position fix in hhmmss format ( A, Status (A - data is valid, V - warning) ( 4027.027912, Geographic latitude in ddmm.mmmmmm format ( N, Direction of latitude (N - North, S - South) ( 08704.857070,Geographic longitude in dddmm.mmmmmm format ( W, Direction of longitude (E - East, W - West) ( 000.04, Speed over ground (0.04 knots) ( 181.9, Track made good [heading] (181.9º) ( 131000, Date in ddmmyy format (October 13, 2000) ( 1.8, Magnetic variation (1.8º) ( W, Direction of magnetic variation (E - East, W - West) ( *25 Asteric & Hex checksum ( Set up SCRUB DECIMAL 0 RAM ! HERE 80 4 + ALLOT CONSTANT RBUFF EEWORD RBUFF 80 4 + SCI0 RXBUFFER ( RBUFF 80 4 + SCI1 RXBUFFER HERE 80 4 + ALLOT CONSTANT TBUFF EEWORD TBUFF 80 4 + SCI0 TXBUFFER HERE 240 4 + ALLOT CONSTANT RBUFF1 EEWORD RBUFF1 240 4 + SCI1 RXBUFFER HERE 240 4 + ALLOT CONSTANT TBUFF1 EEWORD TBUFF1 240 4 + SCI1 TXBUFFER VARIABLE NEWKEY EEWORD VARIABLE CHKSUM EEWORD VARIABLE SAVCHKSUM EEWORD 2VARIABLE NUM EEWORD VARIABLE vSIGN EEWORD 2VARIABLE zz EEWORD 2VARIABLE yy EEWORD 2VARIABLE xx EEWORD 2VARIABLE .x EEWORD VARIABLE .xDPL EEWORD ( $GPGGA, VARIABLES 2VARIABLE GGA:time:hh EEWORD 2VARIABLE GGA:time:mm EEWORD 2VARIABLE GGA:time:ss EEWORD 2VARIABLE GGA:time:.s EEWORD 2VARIABLE GGA:lat:dd EEWORD 2VARIABLE GGA:lat:mm EEWORD 2VARIABLE GGA:lat:.m EEWORD 2VARIABLE GGA:lat:N/S EEWORD 2VARIABLE GGA:lon:ddd EEWORD 2VARIABLE GGA:lon:mm EEWORD 2VARIABLE GGA:lon:.m EEWORD 2VARIABLE GGA:lon:E/W EEWORD 2VARIABLE GGA:GPSQual EEWORD 2VARIABLE GGA:#Sat EEWORD 2VARIABLE GGA:DOP EEWORD 2VARIABLE GGA:AntHi EEWORD 2VARIABLE GGA:UnitAlt EEWORD 2VARIABLE GGA:GeoidalSep EEWORD 2VARIABLE GGA:Unitgeoidalsep EEWORD 2VARIABLE GGA:AgeDiff EEWORD 2VARIABLE GGA:BaseStaID EEWORD 2VARIABLE GGA:chkchk EEWORD ( $GPRMC, VARIABLES 2VARIABLE RMC:time:hh EEWORD 2VARIABLE RMC:time:mm EEWORD 2VARIABLE RMC:time:ss EEWORD 2VARIABLE RMC:A/V EEWORD 2VARIABLE RMC:lat:dd EEWORD 2VARIABLE RMC:lat:mm EEWORD 2VARIABLE RMC:lat:.m EEWORD 2VARIABLE RMC:lat:N/S EEWORD 2VARIABLE RMC:lon:ddd EEWORD 2VARIABLE RMC:lon:mm EEWORD 2VARIABLE RMC:lon:.m EEWORD 2VARIABLE RMC:lon:E/W EEWORD 2VARIABLE RMC:SOG EEWORD 2VARIABLE RMC:TMG EEWORD 2VARIABLE RMC:date:dd EEWORD 2VARIABLE RMC:date:mm EEWORD 2VARIABLE RMC:date:yy EEWORD 2VARIABLE RMC:MV:deg EEWORD 2VARIABLE RMC:MV:E/W EEWORD 2VARIABLE RMC:chkchk EEWORD ( $GPGGA, ( $GPRMC, HEX 24 CONSTANT "$" EEWORD 47 CONSTANT "G" EEWORD 50 CONSTANT "P" EEWORD 47 CONSTANT "G" EEWORD ( 47 CONSTANT "G" EEWORD 41 CONSTANT "A" EEWORD ( 24 CONSTANT "$" EEWORD ( 47 CONSTANT "G" EEWORD ( 50 CONSTANT "P" EEWORD 52 CONSTANT "R" EEWORD 4D CONSTANT "M" EEWORD 43 CONSTANT "C" EEWORD 4E CONSTANT "N" EEWORD 45 CONSTANT "E" EEWORD 57 CONSTANT "W" EEWORD 53 CONSTANT "S" EEWORD ( 41 CONSTANT "A" EEWORD 56 CONSTANT "V" EEWORD ( 41 CONSTANT "A" EEWORD 44 CONSTANT "D" EEWORD ( 4E CONSTANT "N" EEWORD ( 4D CONSTANT "M" EEWORD 2A CONSTANT "*" EEWORD 2C CONSTANT "," EEWORD 2D CONSTANT "-" EEWORD 2E CONSTANT "." EEWORD 0D CONSTANT "CR" EEWORD 0A CONSTANT "LF" EEWORD : CHKKEY SCI1 RX? IF SCI1 RX ELSE FFFF THEN NEWKEY ! ; EEWORD : CLRKEY FFFF NEWKEY ! ; EEWORD : ISNEWKEY? NEWKEY @ = ; EEWORD : ISNEWKEY?NOT ISNEWKEY? NOT NEWKEY @ FFFF = NOT AND ; EEWORD : XOR2CHKSUM NEWKEY @ CHKSUM @ XOR CHKSUM ! ; EEWORD : CLRNUM 0.0 NUM 2! ; EEWORD : CLRALL CLRNUM 0 vSIGN ! 0.0 zz 2! 0.0 yy 2! 0.0 xx 2! 0.0 .x 2! 0 .xDPL ! 0 DPL ! ; EEWORD : CONVNUM "." ISNEWKEY? IF 0 DPL ! ELSE NUM 2@ A. D* NEWKEY @ 30 - 9 MIN 0 D+ NUM 2! DPL 1+! THEN ; EEWORD : CONVNUMT CONVNUM TRUE ; EEWORD : CONVHEXT NUM 2@ 10. D* NEWKEY @ 30 - 9 OVER U< IF 7 - THEN F MIN 0 D+ NUM 2! DPL 1+! TRUE ; EEWORD MACHINE CONV-FIELD EEWORD ON-MACHINE CONV-FIELD APPEND-STATE CF:CHAR EEWORD ( CHAR ENTRY POINT APPEND-STATE CF:zz2 EEWORD ( TIME ENTRY POINT APPEND-STATE CF:zz1 EEWORD APPEND-STATE CF:yy3 EEWORD ( LON ENTRY POINT APPEND-STATE CF:yy2 EEWORD ( LAT ENTRY POINT APPEND-STATE CF:yy1 EEWORD APPEND-STATE CF:xx4 EEWORD ( BASESTAID ENTRY POINT APPEND-STATE CF:xx3 EEWORD APPEND-STATE CF:-x. EEWORD ( GeoidalSep ENTRY POINT APPEND-STATE CF:xx2 EEWORD APPEND-STATE CF:xx1 EEWORD APPEND-STATE CF:x.x EEWORD APPEND-STATE CF:hh2 EEWORD APPEND-STATE CF:hh1 EEWORD APPEND-STATE CF:POST EEWORD ( TERMINUS FOR ALL IN-STATE CF:CHAR CONDITION TRUE CAUSES NEWKEY @ 0 xx 2! CLRNUM THEN-STATE CF:POST TO-HAPPEN IN-EE IN-STATE CF:zz2 CONDITION CONVNUMT CAUSES NUM 2@ zz 2! THEN-STATE CF:zz1 TO-HAPPEN IN-EE IN-STATE CF:zz2 CONDITION "." ISNEWKEY? CAUSES CLRNUM THEN-STATE CF:x.x TO-HAPPEN IN-EE IN-STATE CF:zz1 CONDITION CONVNUMT CAUSES NUM 2@ zz 2! CLRNUM THEN-STATE CF:yy2 TO-HAPPEN IN-EE IN-STATE CF:zz1 CONDITION "." ISNEWKEY? CAUSES CLRNUM THEN-STATE CF:yy2 TO-HAPPEN IN-EE IN-STATE CF:yy3 CONDITION CONVNUMT CAUSES NUM 2@ yy 2! THEN-STATE CF:yy2 TO-HAPPEN IN-EE IN-STATE CF:yy3 CONDITION "." ISNEWKEY? CAUSES CLRNUM THEN-STATE CF:x.x TO-HAPPEN IN-EE IN-STATE CF:yy2 CONDITION CONVNUMT CAUSES NUM 2@ yy 2! THEN-STATE CF:yy1 TO-HAPPEN IN-EE IN-STATE CF:yy2 CONDITION "." ISNEWKEY? CAUSES CLRNUM THEN-STATE CF:x.x TO-HAPPEN IN-EE IN-STATE CF:yy1 CONDITION CONVNUMT CAUSES NUM 2@ yy 2! CLRNUM THEN-STATE CF:xx2 TO-HAPPEN IN-EE IN-STATE CF:yy1 CONDITION "." ISNEWKEY? CAUSES CLRNUM THEN-STATE CF:x.x TO-HAPPEN IN-EE IN-STATE CF:xx4 CONDITION CONVNUMT CAUSES NUM 2@ xx 2! THEN-STATE CF:xx3 TO-HAPPEN IN-EE IN-STATE CF:xx3 CONDITION CONVNUMT CAUSES NUM 2@ xx 2! THEN-STATE CF:xx2 TO-HAPPEN IN-EE IN-STATE CF:-x. CONDITION "-" ISNEWKEY? CAUSES TRUE vSIGN ! THEN-STATE CF:x.x ( TO-HAPPEN IN-EE THIS-TIME IN-EE ( IN-STATE ( CF:-x. ( CONDITION ( "-" ISNEWKEY?NOT ( CAUSES ( CONVNUM ( NUM 2@ .x 2! ( THEN-STATE ( CF:x. ( TO-HAPPEN IN-EE IN-STATE CF:xx2 CONDITION CONVNUMT CAUSES NUM 2@ xx 2! THEN-STATE CF:xx1 TO-HAPPEN IN-EE IN-STATE CF:xx1 CONDITION CONVNUMT CAUSES NUM 2@ xx 2! CLRNUM THEN-STATE CF:x.x TO-HAPPEN IN-EE IN-STATE CF:x.x CONDITION CONVNUMT CAUSES NUM 2@ .x 2! DPL @ .xDPL ! ( CLRNUM THEN-STATE CF:x.x TO-HAPPEN IN-EE IN-STATE CF:hh2 CONDITION CONVHEXT CAUSES NUM 2@ xx 2! THEN-STATE CF:hh1 TO-HAPPEN IN-EE IN-STATE CF:hh1 CONDITION CONVHEXT CAUSES NUM 2@ xx 2! CLRNUM THEN-STATE CF:POST TO-HAPPEN IN-EE MACHINE GPGGA EEWORD ON-MACHINE GPGGA APPEND-STATE GPGGAw4:G1 EEWORD APPEND-STATE GPGGAw4:P EEWORD APPEND-STATE GPGGAw4:G2 EEWORD APPEND-STATE GPGGAw4:G3 EEWORD APPEND-STATE GPGGAw4:A EEWORD APPEND-STATE GPGGA:PASS EEWORD APPEND-STATE GPGGA:FAIL EEWORD IN-STATE GPGGAw4:G1 CONDITION "G" ISNEWKEY? CAUSES ( THEN-STATE GPGGAw4:P TO-HAPPEN IN-EE IN-STATE GPGGAw4:G1 CONDITION "G" ISNEWKEY?NOT CAUSES ( THEN-STATE GPGGA:FAIL TO-HAPPEN IN-EE IN-STATE GPGGAw4:P CONDITION "P" ISNEWKEY? CAUSES ( THEN-STATE GPGGAw4:G2 TO-HAPPEN IN-EE IN-STATE GPGGAw4:P CONDITION "P" ISNEWKEY?NOT CAUSES ( THEN-STATE GPGGA:FAIL TO-HAPPEN IN-EE IN-STATE GPGGAw4:G2 CONDITION "G" ISNEWKEY? CAUSES ( THEN-STATE GPGGAw4:G3 TO-HAPPEN IN-EE IN-STATE GPGGAw4:G2 CONDITION "G" ISNEWKEY?NOT CAUSES ( THEN-STATE GPGGA:FAIL TO-HAPPEN IN-EE IN-STATE GPGGAw4:G3 CONDITION "G" ISNEWKEY? CAUSES ( THEN-STATE GPGGAw4:A TO-HAPPEN IN-EE IN-STATE GPGGAw4:G3 CONDITION "G" ISNEWKEY?NOT CAUSES ( THEN-STATE GPGGA:FAIL TO-HAPPEN IN-EE IN-STATE GPGGAw4:A CONDITION "A" ISNEWKEY? CAUSES ( REDLED ON THEN-STATE GPGGA:PASS TO-HAPPEN IN-EE IN-STATE GPGGAw4:A CONDITION "A" ISNEWKEY?NOT CAUSES ( REDLED OFF THEN-STATE GPGGA:FAIL TO-HAPPEN IN-EE IN-STATE GPGGA:PASS CONDITION TRUE CAUSES ( REDLED ON THEN-STATE GPGGA:PASS TO-HAPPEN IN-EE IN-STATE GPGGA:FAIL CONDITION TRUE CAUSES ( REDLED OFF THEN-STATE GPGGA:FAIL TO-HAPPEN IN-EE MACHINE GPRMC EEWORD ON-MACHINE GPRMC APPEND-STATE GPRMCw4:G1 EEWORD APPEND-STATE GPRMCw4:P EEWORD APPEND-STATE GPRMCw4:R EEWORD APPEND-STATE GPRMCw4:M EEWORD APPEND-STATE GPRMCw4:C EEWORD APPEND-STATE GPRMC:PASS EEWORD APPEND-STATE GPRMC:FAIL EEWORD IN-STATE GPRMCw4:G1 CONDITION "G" ISNEWKEY? CAUSES ( THEN-STATE GPRMCw4:P TO-HAPPEN IN-EE IN-STATE GPRMCw4:G1 CONDITION "G" ISNEWKEY?NOT CAUSES ( THEN-STATE GPRMC:FAIL TO-HAPPEN IN-EE IN-STATE GPRMCw4:P CONDITION "P" ISNEWKEY? CAUSES ( THEN-STATE GPRMCw4:R TO-HAPPEN IN-EE IN-STATE GPRMCw4:P CONDITION "P" ISNEWKEY?NOT CAUSES ( THEN-STATE GPRMC:FAIL TO-HAPPEN IN-EE IN-STATE GPRMCw4:R CONDITION "R" ISNEWKEY? CAUSES ( THEN-STATE GPRMCw4:M TO-HAPPEN IN-EE IN-STATE GPRMCw4:R CONDITION "R" ISNEWKEY?NOT CAUSES ( THEN-STATE GPRMC:FAIL TO-HAPPEN IN-EE IN-STATE GPRMCw4:M CONDITION "M" ISNEWKEY? CAUSES ( THEN-STATE GPRMCw4:C TO-HAPPEN IN-EE IN-STATE GPRMCw4:M CONDITION "M" ISNEWKEY?NOT CAUSES ( THEN-STATE GPRMC:FAIL TO-HAPPEN IN-EE IN-STATE GPRMCw4:C CONDITION "C" ISNEWKEY? CAUSES ( ( YELLED ON THEN-STATE GPRMC:PASS TO-HAPPEN IN-EE IN-STATE GPRMCw4:C CONDITION "C" ISNEWKEY?NOT CAUSES ( ( YELLED OFF THEN-STATE GPRMC:FAIL TO-HAPPEN IN-EE IN-STATE GPRMC:PASS CONDITION TRUE CAUSES YELLED ON THEN-STATE GPRMC:PASS TO-HAPPEN IN-EE IN-STATE GPRMC:FAIL CONDITION TRUE CAUSES YELLED OFF THEN-STATE GPRMC:FAIL TO-HAPPEN IN-EE : DELIMITER? "," ISNEWKEY? "*" ISNEWKEY? OR "CR" ISNEWKEY? OR "LF" ISNEWKEY? OR ; EEWORD : ?CONV-FIELD DUP NOT IF CONV-FIELD THEN ; EEWORD MACHINE PARSE,FIELD EEWORD ON-MACHINE PARSE,FIELD APPEND-STATE P,F:F0 EEWORD APPEND-STATE P,F:GGA:F1 EEWORD ( time, APPEND-STATE P,F:GGA:F2 EEWORD ( lat, APPEND-STATE P,F:GGA:F3 EEWORD ( N/S, APPEND-STATE P,F:GGA:F4 EEWORD ( lon, APPEND-STATE P,F:GGA:F5 EEWORD ( E/W, APPEND-STATE P,F:GGA:F6 EEWORD ( GPSQual, APPEND-STATE P,F:GGA:F7 EEWORD ( #Sat, APPEND-STATE P,F:GGA:F8 EEWORD ( DOP, APPEND-STATE P,F:GGA:F9 EEWORD ( AntHi, APPEND-STATE P,F:GGA:F10 EEWORD ( UnitAlt, APPEND-STATE P,F:GGA:F11 EEWORD ( GeoidalSep, APPEND-STATE P,F:GGA:F12 EEWORD ( Unitgeoidalsep, APPEND-STATE P,F:GGA:F13 EEWORD ( AgeDiff, APPEND-STATE P,F:GGA:F14 EEWORD ( BaseStaID* APPEND-STATE P,F:GGA:F15 EEWORD ( chksum APPEND-STATE P,F:RMC:F1 EEWORD ( time, APPEND-STATE P,F:RMC:F2 EEWORD ( A/V, APPEND-STATE P,F:RMC:F3 EEWORD ( lat, APPEND-STATE P,F:RMC:F4 EEWORD ( N/S, APPEND-STATE P,F:RMC:F5 EEWORD ( lon, APPEND-STATE P,F:RMC:F6 EEWORD ( E/W, APPEND-STATE P,F:RMC:F7 EEWORD ( SOG, APPEND-STATE P,F:RMC:F8 EEWORD ( TMG, APPEND-STATE P,F:RMC:F9 EEWORD ( date, APPEND-STATE P,F:RMC:F10 EEWORD ( deg, APPEND-STATE P,F:RMC:F11 EEWORD ( E/W, APPEND-STATE P,F:RMC:F12 EEWORD ( chksum APPEND-STATE P,F:POST EEWORD IN-STATE P,F:F0 CONDITION GPGGA "," ISNEWKEY? GPGGA:PASS IS-STATE? AND CAUSES ( CF:zz2 SET-STATE THEN-STATE P,F:GGA:F1 ( time, TO-HAPPEN IN-EE IN-STATE P,F:F0 CONDITION GPRMC "," ISNEWKEY? GPRMC:PASS IS-STATE? AND CAUSES CLRALL ( next sequencer CF:zz2 SET-STATE THEN-STATE P,F:RMC:F1 ( time, TO-HAPPEN IN-EE IN-STATE P,F:GGA:F1 ( time, CONDITION DELIMITER? ?CONV-FIELD CAUSES zz 2@ GGA:time:hh 2! yy 2@ GGA:time:mm 2! xx 2@ GGA:time:ss 2! .x 2@ GGA:time:.s 2! CLRALL ( next sequencer CF:yy2 SET-STATE THEN-STATE P,F:GGA:F2 ( lat, TO-HAPPEN IN-EE IN-STATE P,F:GGA:F2 ( lat, CONDITION DELIMITER? ?CONV-FIELD CAUSES ( take data yy 2@ GGA:lat:dd 2! xx 2@ GGA:lat:mm 2! .x 2@ GGA:lat:.m 2! CLRALL ( next sequencer CF:CHAR SET-STATE THEN-STATE P,F:GGA:F3 ( N/S, TO-HAPPEN IN-EE IN-STATE P,F:GGA:F3 ( N/S, CONDITION DELIMITER? ?CONV-FIELD CAUSES ( take data xx 2@ GGA:lat:N/S 2! CLRALL ( next sequencer CF:yy3 SET-STATE THEN-STATE P,F:GGA:F4 ( lon, TO-HAPPEN IN-EE IN-STATE P,F:GGA:F4 ( lon, CONDITION DELIMITER? ?CONV-FIELD CAUSES ( take data yy 2@ GGA:lon:ddd 2! xx 2@ GGA:lon:mm 2! .x 2@ GGA:lon:.m 2! CLRALL ( next sequencer CF:CHAR SET-STATE THEN-STATE P,F:GGA:F5 ( E/W, TO-HAPPEN IN-EE IN-STATE P,F:GGA:F5 ( E/W, CONDITION DELIMITER? ?CONV-FIELD CAUSES ( take data xx 2@ GGA:lon:E/W 2! CLRALL ( next sequencer CF:xx1 SET-STATE THEN-STATE P,F:GGA:F6 ( GPSQual, TO-HAPPEN IN-EE IN-STATE P,F:GGA:F6 ( GPSQual, CONDITION DELIMITER? ?CONV-FIELD CAUSES ( take data xx 2@ GGA:GPSQual 2! CLRALL ( next sequencer CF:xx2 SET-STATE THEN-STATE P,F:GGA:F7 ( #Sat, TO-HAPPEN IN-EE IN-STATE P,F:GGA:F7 ( #Sat, CONDITION DELIMITER? ?CONV-FIELD CAUSES ( take data xx 2@ GGA:#Sat 2! CLRALL ( next sequencer CF:x.x SET-STATE THEN-STATE P,F:GGA:F8 ( DOP, TO-HAPPEN IN-EE IN-STATE P,F:GGA:F8 ( DOP, CONDITION DELIMITER? ?CONV-FIELD CAUSES ( take data .x 2@ GGA:DOP 2! DPL @ .xDPL ! CLRALL ( next sequencer CF:x.x SET-STATE THEN-STATE P,F:GGA:F9 ( AntHi, TO-HAPPEN IN-EE IN-STATE P,F:GGA:F9 ( AntHi, CONDITION DELIMITER? ?CONV-FIELD CAUSES ( take data .x 2@ GGA:AntHi 2! DPL @ .xDPL ! CLRALL ( next sequencer CF:CHAR SET-STATE THEN-STATE P,F:GGA:F10 ( UnitAlt, TO-HAPPEN IN-EE IN-STATE P,F:GGA:F10 ( UnitAlt, CONDITION DELIMITER? ?CONV-FIELD CAUSES xx 2@ GGA:UnitAlt 2! CLRALL ( next sequencer CF:x.x SET-STATE THEN-STATE P,F:GGA:F11 ( GeoidalSep, TO-HAPPEN IN-EE IN-STATE P,F:GGA:F11 ( GeoidalSep, CONDITION DELIMITER? ?CONV-FIELD CAUSES .x 2@ GGA:GeoidalSep 2! DPL @ .xDPL ! CLRALL ( next sequencer CF:CHAR SET-STATE THEN-STATE P,F:GGA:F12 ( Unitgeoidalsep, TO-HAPPEN IN-EE IN-STATE P,F:GGA:F12 ( Unitgeoidalsep, CONDITION DELIMITER? ?CONV-FIELD CAUSES xx 2@ GGA:Unitgeoidalsep 2! CLRALL ( next sequencer CF:x.x SET-STATE THEN-STATE P,F:GGA:F13 ( AgeDiff, TO-HAPPEN IN-EE IN-STATE P,F:GGA:F13 ( AgeDiff, CONDITION DELIMITER? ?CONV-FIELD CAUSES .x 2@ GGA:AgeDiff 2! DPL @ .xDPL ! CLRALL ( next sequencer CF:xx4 SET-STATE THEN-STATE P,F:GGA:F14 ( BaseStaID* TO-HAPPEN IN-EE IN-STATE P,F:GGA:F14 ( BaseStaID* CONDITION DELIMITER? ?CONV-FIELD CAUSES xx 2@ GGA:BaseStaID 2! CLRALL ( next sequencer CF:hh2 SET-STATE THEN-STATE P,F:GGA:F15 ( chksum TO-HAPPEN IN-EE IN-STATE P,F:GGA:F15 ( chksum CONDITION DELIMITER? ?CONV-FIELD CAUSES ( take data xx 2@ DROP SAVCHKSUM @ = ." GOT GGA1" ( MOVE DATA IF ." GOT GGA2" ( MOVE DATA THEN ( next sequencer CLRALL THEN-STATE P,F:POST TO-HAPPEN IN-EE IN-STATE P,F:RMC:F1 ( time, CONDITION DELIMITER? ?CONV-FIELD CAUSES zz 2@ RMC:time:hh 2! yy 2@ RMC:time:mm 2! xx 2@ RMC:time:ss 2! ( .x 2@ RMC:time:.s 2! ( next sequencer CLRALL CF:CHAR SET-STATE THEN-STATE P,F:RMC:F2 ( A/V, TO-HAPPEN IN-EE IN-STATE P,F:RMC:F2 ( A/V, CONDITION DELIMITER? ?CONV-FIELD CAUSES ( take data xx 2@ RMC:A/V 2! ( next sequencer CLRALL CF:yy2 SET-STATE THEN-STATE P,F:RMC:F3 ( lat, TO-HAPPEN IN-EE IN-STATE P,F:RMC:F3 ( lat, CONDITION DELIMITER? ?CONV-FIELD CAUSES ( take data yy 2@ RMC:lat:dd 2! xx 2@ RMC:lat:mm 2! .x 2@ RMC:lat:.m 2! ( next sequencer CLRALL CF:CHAR SET-STATE THEN-STATE P,F:RMC:F4 ( N/S, TO-HAPPEN IN-EE IN-STATE P,F:RMC:F4 ( N/S, CONDITION DELIMITER? ?CONV-FIELD CAUSES ( take data xx 2@ RMC:lat:N/S 2! ( next sequencer CLRALL CF:yy3 SET-STATE THEN-STATE P,F:RMC:F5 ( lon, TO-HAPPEN IN-EE IN-STATE P,F:RMC:F5 ( lon, CONDITION DELIMITER? ?CONV-FIELD CAUSES ( take data yy 2@ RMC:lon:ddd 2! xx 2@ RMC:lon:mm 2! .x 2@ RMC:lon:.m 2! ( next sequencer CLRALL CF:CHAR SET-STATE THEN-STATE P,F:RMC:F6 ( E/W, TO-HAPPEN IN-EE IN-STATE P,F:RMC:F6 ( E/W, CONDITION DELIMITER? ?CONV-FIELD CAUSES ( take data xx 2@ RMC:lon:E/W 2! ( next sequencer CLRALL CF:x.x SET-STATE THEN-STATE P,F:RMC:F7 ( SOG, TO-HAPPEN IN-EE IN-STATE P,F:RMC:F7 ( SOG, CONDITION DELIMITER? ?CONV-FIELD CAUSES ( take data xx 2@ RMC:SOG 2! ( next sequencer CLRALL CF:x.x SET-STATE THEN-STATE P,F:RMC:F8 ( TMG, TO-HAPPEN IN-EE IN-STATE P,F:RMC:F8 ( TMG, CONDITION DELIMITER? ?CONV-FIELD CAUSES ( take data xx 2@ RMC:TMG 2! ( next sequencer CLRALL CF:zz2 SET-STATE THEN-STATE P,F:RMC:F9 ( date, TO-HAPPEN IN-EE IN-STATE P,F:RMC:F9 ( date, CONDITION DELIMITER? ?CONV-FIELD CAUSES ( take data zz 2@ RMC:date:dd 2! yy 2@ RMC:date:mm 2! xx 2@ RMC:date:yy 2! ( next sequencer CLRALL CF:x.x SET-STATE THEN-STATE P,F:RMC:F10 ( deg, TO-HAPPEN IN-EE IN-STATE P,F:RMC:F10 ( deg, CONDITION DELIMITER? ?CONV-FIELD CAUSES ( take data .x 2@ RMC:MV:deg 2! ( next sequencer CLRALL CF:CHAR SET-STATE THEN-STATE P,F:RMC:F11 ( E/W, TO-HAPPEN IN-EE IN-STATE P,F:RMC:F11 ( E/W, CONDITION DELIMITER? ?CONV-FIELD CAUSES ( take data xx 2@ RMC:MV:E/W 2! ( next sequencer CLRALL CF:hh2 SET-STATE THEN-STATE P,F:RMC:F12 ( chksum TO-HAPPEN IN-EE IN-STATE P,F:RMC:F12 ( chksum CONDITION DELIMITER? ?CONV-FIELD CAUSES ( take data ." GOT RMC1" xx 2@ DROP SAVCHKSUM @ = IF ." GOT RMC2" ( MOVE DATA THEN ( next sequencer CLRALL THEN-STATE P,F:POST TO-HAPPEN IN-EE MACHINE GPS$SENTENCE EEWORD ON-MACHINE GPS$SENTENCE APPEND-STATE w4$ EEWORD APPEND-STATE w4$> EEWORD IN-STATE w4$ CONDITION "$" ISNEWKEY? GRNLED OFF CAUSES GRNLED ON 0 CHKSUM ! P,F:F0 SET-STATE ( PARSE,FIELD GPGGAw4:G1 SET-STATE ( GPGGA GPRMCw4:G1 SET-STATE ( GPRMC THEN-STATE w4$> TO-HAPPEN IN-EE IN-STATE w4$> CONDITION "$" ISNEWKEY?NOT CAUSES "*" ISNEWKEY? IF CHKSUM @ SAVCHKSUM ! THEN XOR2CHKSUM PARSE,FIELD THEN-STATE w4$> TO-HAPPEN IN-EE IN-STATE w4$> CONDITION "CR" ISNEWKEY? "LF" ISNEWKEY? OR CAUSES ( THEN-STATE w4$ TO-HAPPEN IN-EE ( IN-STATE ( w4$> ( CONDITION ( "$" ISNEWKEY? ( CAUSES ( 0 CHKSUM ! ( W4G1 SET-STATE ( THEN-STATE ( w4$> ( TO-HAPPEN IN-EE MACHINE-CHAIN ALL CHKKEY NEWKEY @ FFFF = NOT IF NEWKEY @ EMIT ( ECHO COPY ON SCI0 GPS$SENTENCE THEN CLRKEY END-MACHINE-CHAIN EEWORD DECIMAL : STARTUP RBUFF 80 4 + SCI0 RXBUFFER TBUFF 80 4 + SCI0 TXBUFFER RBUFF1 240 4 + SCI1 RXBUFFER TBUFF1 240 4 + SCI1 TXBUFFER ( SCI1 4800 BAUD CR ." GPS" CR CF:POST SET-STATE ( CONV-FIELD GPGGA:FAIL SET-STATE ( GPGGA GPRMC:FAIL SET-STATE ( GPRMC P,F:F0 SET-STATE ( PARSE,FIELD w4$> SET-STATE ( GPS$SENTENCE EVERY 10000 CYCLES SCHEDULE-RUNS ALL ( 500cps ; EEWORD DECIMAL SAVE-RAM ( AUTOSTART STARTUP ( 80x V.7 VERSION ( HEX EC00 AUTOSTART STARTUP DECIMAL ( 807 V.6 VERSION ( HEX 3C00 AUTOSTART STARTUP DECIMAL ( 805 V.6 VERSION