diff --git a/master/master/lib/gps.c b/master/master/lib/gps.c
--- a/master/master/lib/gps.c
+++ b/master/master/lib/gps.c
@@ -1,15 +1,28 @@
/*
* Master Firmware: NMEA Parser
*
- * Wireless Observational Modular Aerial Network
+ * This file is part of OpenTrack.
+ *
+ * OpenTrack is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * OpenTrack is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with OpenTrack. If not, see .
*
* Ethan Zonca
* Matthew Kanning
* Kyle Ripperger
* Matthew Kroening
*
- */
-
+ */
+
#include
#include
#include
@@ -19,21 +32,21 @@
#include "serial.h"
#include "../config.h"
#include "led.h"
-#include "logger.h"
-
-// Circular buffer for incoming data
-uint8_t nmeaBuffer[NMEABUFFER_SIZE];
-
-// Location of parser in the buffer
-uint8_t nmeaBufferParsePosition = 0;
-
-// Location of receive byte interrupt in the buffer
-volatile uint16_t nmeaBufferDataPosition = 0;
+#include "logger.h"
+
+// Circular buffer for incoming data
+uint8_t nmeaBuffer[NMEABUFFER_SIZE];
+
+// Location of parser in the buffer
+uint8_t nmeaBufferParsePosition = 0;
+
+// Location of receive byte interrupt in the buffer
+volatile uint16_t nmeaBufferDataPosition = 0;
// holds the byte ALREADY PARSED. includes starting character
int bytesReceived = 0;
-//data (and checksum) of most recent transmission
+//data (and checksum) of most recent transmission
char data[16];
//used to skip over bytes during parse
@@ -148,23 +161,23 @@ int calculatedChecksum;
int receivedChecksum;
// transmission state machine
-enum decodeState {
- //shared fields
- INITIALIZE=0,
- GET_TYPE,
- GPS_CHECKSUM, //XOR of all the bytes between the $ and the * (not including the delimiters themselves), written in hexadecimal
- //GGA data fields
- GGA_TIME,
- GGA_LATITUDE,
- GGA_LONGITUDE,
- GGA_QUALITY,
- GGA_SATELLITES,
- GGA_HDOP,
- GGA_ALTITUDE,
- GGA_WGS84,
- GGA_LAST_UPDATE,
- GGA_STATION_ID,
- //RMC data fields
+enum decodeState {
+ //shared fields
+ INITIALIZE=0,
+ GET_TYPE,
+ GPS_CHECKSUM, //XOR of all the bytes between the $ and the * (not including the delimiters themselves), written in hexadecimal
+ //GGA data fields
+ GGA_TIME,
+ GGA_LATITUDE,
+ GGA_LONGITUDE,
+ GGA_QUALITY,
+ GGA_SATELLITES,
+ GGA_HDOP,
+ GGA_ALTITUDE,
+ GGA_WGS84,
+ GGA_LAST_UPDATE,
+ GGA_STATION_ID,
+ //RMC data fields
RMC_TIME,
RMC_VALIDITY,
RMC_LATITUDE,
@@ -177,10 +190,10 @@ enum decodeState {
}decodeState;
-ISR(USART1_RX_vect)
-{
- nmeaBuffer[nmeaBufferDataPosition % NMEABUFFER_SIZE] = UDR1;
- nmeaBufferDataPosition = (nmeaBufferDataPosition + 1) % NMEABUFFER_SIZE;
+ISR(USART1_RX_vect)
+{
+ nmeaBuffer[nmeaBufferDataPosition % NMEABUFFER_SIZE] = UDR1;
+ nmeaBufferDataPosition = (nmeaBufferDataPosition + 1) % NMEABUFFER_SIZE;
}
void gps_setup()
@@ -196,21 +209,21 @@ void gps_setup()
}
-// Could inline if program space available
-static void setParserState(uint8_t state)
-{
- decodeState = state;
-
-
- // If resetting, clear vars
- if(state == INITIALIZE)
- {
- calculatedChecksum = 0;
- }
-
- // Every time we change state, we have parsed a byte
- nmeaBufferParsePosition = (nmeaBufferParsePosition + 1) % NMEABUFFER_SIZE;
-}
+// Could inline if program space available
+static void setParserState(uint8_t state)
+{
+ decodeState = state;
+
+
+ // If resetting, clear vars
+ if(state == INITIALIZE)
+ {
+ calculatedChecksum = 0;
+ }
+
+ // Every time we change state, we have parsed a byte
+ nmeaBufferParsePosition = (nmeaBufferParsePosition + 1) % NMEABUFFER_SIZE;
+}
@@ -249,289 +262,289 @@ void parse_gps_transmission(void){
}
//parse transmission type
- else if (decodeState == GET_TYPE)
- {
- tramsmissionType[numBytes] = byte;
- numBytes++;
+ else if (decodeState == GET_TYPE)
+ {
+ tramsmissionType[numBytes] = byte;
+ numBytes++;
#ifdef DEBUG_NMEA
- serial0_sendString("stored a type byte\r\n");
- #endif
-
- if(byte == ',') //end of this data type
- {
- tramsmissionType[5] = 0x00;
-
- if (tramsmissionType[2] == 'G' &&
- tramsmissionType[3] == 'G' &&
- tramsmissionType[4] == 'A')
- {
- setParserState(GGA_TIME);
- numBytes = 0;
- }
- else if (tramsmissionType[2] == 'R' &&
- tramsmissionType[3] == 'M' &&
- tramsmissionType[4] == 'C')
- {
- setParserState(RMC_TIME);
- numBytes = 0;
- }
- else //this is an invalid transmission type
- {
- setParserState(INITIALIZE);
- }
- }
- else {
- // continue
- setParserState(GET_TYPE);
- }
-
- }
-
+ serial0_sendString("stored a type byte\r\n");
+ #endif
+
+ if(byte == ',') //end of this data type
+ {
+ tramsmissionType[5] = 0x00;
+
+ if (tramsmissionType[2] == 'G' &&
+ tramsmissionType[3] == 'G' &&
+ tramsmissionType[4] == 'A')
+ {
+ setParserState(GGA_TIME);
+ numBytes = 0;
+ }
+ else if (tramsmissionType[2] == 'R' &&
+ tramsmissionType[3] == 'M' &&
+ tramsmissionType[4] == 'C')
+ {
+ setParserState(RMC_TIME);
+ numBytes = 0;
+ }
+ else //this is an invalid transmission type
+ {
+ setParserState(INITIALIZE);
+ }
+ }
+ else {
+ // continue
+ setParserState(GET_TYPE);
+ }
+
+ }
+
///parses GGA transmissions START
/// $--GGA,hhmmss.ss,llll.ll,a,yyyyy.yy,a,x,xx,x.x,x.x,M,x.x,M,x.x,xxxx*xx
//timestamp
- else if (decodeState == GGA_TIME)
- {
- if (byte == ',') //end of this data type
- {
- timestamp[4] = 0x00; // Cut off at 4 (no seconds) for APRS
- setParserState(GGA_LATITUDE);
- skipBytes = 0; //prep for next phase of parse
- numBytes = 0;
- }
- else //store data
- {
+ else if (decodeState == GGA_TIME)
+ {
+ if (byte == ',') //end of this data type
+ {
+ timestamp[4] = 0x00; // Cut off at 4 (no seconds) for APRS
+ setParserState(GGA_LATITUDE);
+ skipBytes = 0; //prep for next phase of parse
+ numBytes = 0;
+ }
+ else //store data
+ {
#ifdef DEBUG_NMEA
- serial0_sendString("found GGA time byte\r\n");
- #endif
-
- setParserState(GGA_TIME);
- timestamp[numBytes] = byte; //byte; //adjust number of bytes to fit array
- numBytes++;
- }
- }
-
- //latitude
- else if (decodeState == GGA_LATITUDE)
- {
- if (byte == ',' && skipBytes == 0) //discard this byte
- {
+ serial0_sendString("found GGA time byte\r\n");
+ #endif
+
+ setParserState(GGA_TIME);
+ timestamp[numBytes] = byte; //byte; //adjust number of bytes to fit array
+ numBytes++;
+ }
+ }
+
+ //latitude
+ else if (decodeState == GGA_LATITUDE)
+ {
+ if (byte == ',' && skipBytes == 0) //discard this byte
+ {
#ifdef DEBUG_NMEA
- serial0_sendString("found lat skip byte\r\n");
- #endif
-
- skipBytes = 1;
- setParserState(GGA_LATITUDE);
- }
- else if (byte == ',') //end of this data type
- {
-
- latitude[numBytes] = 0x00; // null terminate
-
- setParserState(GGA_LONGITUDE);
- skipBytes = 0; //prep for next phase of parse
- numBytes = 0;
- }
- else //store data
- {
+ serial0_sendString("found lat skip byte\r\n");
+ #endif
+
+ skipBytes = 1;
+ setParserState(GGA_LATITUDE);
+ }
+ else if (byte == ',') //end of this data type
+ {
+
+ latitude[numBytes] = 0x00; // null terminate
+
+ setParserState(GGA_LONGITUDE);
+ skipBytes = 0; //prep for next phase of parse
+ numBytes = 0;
+ }
+ else //store data
+ {
#ifdef DEBUG_NMEA
- serial0_sendString("found lat byte\r\n");
- #endif
-
- latitude[numBytes] = byte; //adjust number of bytes to fit array
- numBytes++;
- setParserState(GGA_LATITUDE);
- }
- }
-
- //longitude
- else if (decodeState == GGA_LONGITUDE)
- {
- if (byte == ',' && skipBytes == 0) //discard this byte
- {
+ serial0_sendString("found lat byte\r\n");
+ #endif
+
+ latitude[numBytes] = byte; //adjust number of bytes to fit array
+ numBytes++;
+ setParserState(GGA_LATITUDE);
+ }
+ }
+
+ //longitude
+ else if (decodeState == GGA_LONGITUDE)
+ {
+ if (byte == ',' && skipBytes == 0) //discard this byte
+ {
#ifdef DEBUG_NMEA
- serial0_sendString("found long skip byte\r\n");
- #endif
-
- skipBytes = 1;
- setParserState(GGA_LONGITUDE);
- }
- else if (byte == ',') //end of this data type
- {
- longitude[numBytes] = 0x00;
- setParserState(GGA_QUALITY);
- numBytes = 0; //prep for next phase of parse
- skipBytes = 0;
- }
- else //store data
- {
+ serial0_sendString("found long skip byte\r\n");
+ #endif
+
+ skipBytes = 1;
+ setParserState(GGA_LONGITUDE);
+ }
+ else if (byte == ',') //end of this data type
+ {
+ longitude[numBytes] = 0x00;
+ setParserState(GGA_QUALITY);
+ numBytes = 0; //prep for next phase of parse
+ skipBytes = 0;
+ }
+ else //store data
+ {
#ifdef DEBUG_NMEA
- serial0_sendString("found long byte\r\n");
- #endif
-
- longitude[numBytes] = byte; //adjust number of bytes to fit array
- numBytes++;
- setParserState(GGA_LONGITUDE);
- }
- }
-
- //GGA quality
- else if (decodeState == GGA_QUALITY)
- {
- if (byte == ',') //end of this data type
- {
- setParserState(GGA_SATELLITES);
- numBytes = 0; //prep for next phase of parse
- }
- else //store data
- {
+ serial0_sendString("found long byte\r\n");
+ #endif
+
+ longitude[numBytes] = byte; //adjust number of bytes to fit array
+ numBytes++;
+ setParserState(GGA_LONGITUDE);
+ }
+ }
+
+ //GGA quality
+ else if (decodeState == GGA_QUALITY)
+ {
+ if (byte == ',') //end of this data type
+ {
+ setParserState(GGA_SATELLITES);
+ numBytes = 0; //prep for next phase of parse
+ }
+ else //store data
+ {
#ifdef DEBUG_NMEA
- serial0_sendString("found quality byte\r\n");
- #endif
-
- quality = byte; //maybe reset if invalid data ??
- setParserState(GGA_QUALITY);
- }
- }
-
- //number of satellites
- else if (decodeState == GGA_SATELLITES)
- {
- if (byte == ',') //end of this data type
- {
- numSatellites[numBytes] = 0x00;
- setParserState(GGA_HDOP);
- numBytes = 0; //prep for next phase of parse
- }
- else //store data
- {
- numSatellites[numBytes] = byte; //adjust number of bytes to fit array
- numBytes++;
- setParserState(GGA_SATELLITES);
- }
- }
-
- //HDOP
- else if (decodeState == GGA_HDOP)
- {
- if (byte == ',' ) //end of this data type
- {
- hdop[numBytes] = 0x00;
- setParserState(GGA_ALTITUDE);
- numBytes = 0; //prep for next phase of parse
- skipBytes = 0;
- }
- else //store data
- {
- hdop[numBytes] = byte; //adjust number of bytes to fit array
- numBytes++;
- setParserState(GGA_HDOP);
- }
- }
-
- //altitude
- else if (decodeState == GGA_ALTITUDE)
- {
- if (byte == ',' && skipBytes == 0) //discard this byte
- {
- altitude[numBytes] = 0x00;
- skipBytes = 1;
- setParserState(GGA_ALTITUDE);
- }
- else if(byte == ',') //end of this data type
- {
- altitude[numBytes] = 0x00;
- setParserState(GGA_WGS84);
- numBytes = 0; //prep for next phase of parse
- }
- else //store data
- {
- altitude[numBytes] = byte; //adjust number of bytes to fit array
- numBytes++;
- setParserState(GGA_ALTITUDE);
- }
- }
-
- //WGS84 Height
- else if (decodeState == GGA_WGS84)
- {
- if (byte == ',' && skipBytes == 0) //discard this byte
- {
- skipBytes = 1;
- setParserState(GGA_WGS84);
- }
- else if(byte == ',') //end of this data type
- {
- wgs84Height[numBytes] = 0x00;
- setParserState(GGA_LAST_UPDATE);
- skipBytes = 0; //prep for next phase of parse
- numBytes = 0;
- }
- else //store data
- {
- wgs84Height[numBytes] = byte; //adjust number of bytes to fit array
- numBytes++;
- setParserState(GGA_WGS84);
- }
- }
-
- //last GGA DGPS update
- else if (decodeState == GGA_LAST_UPDATE)
- {
- if (byte == ',') //end of this data type
- {
- lastUpdated[numBytes] = 0x00;
- setParserState(GGA_STATION_ID);
- numBytes = 0; //prep for next phase of parse
- }
- else //store data - this should be blank
- {
- lastUpdated[numBytes] = byte; //adjust number of bytes to fit array
- numBytes++;
- setParserState(GGA_LAST_UPDATE);
- }
- }
-
- //GGA DGPS station ID
- else if (decodeState == GGA_STATION_ID)
- {
- if (byte == ',' || byte == '*') //end of this data type
- {
- stationID[numBytes] = 0x00;
- setParserState(GPS_CHECKSUM);
- numBytes = 0; //prep for next phase of parse
- }
- else //store data - this should be blank
- {
- stationID[numBytes] = byte; //adjust number of bytes to fit array
- numBytes++;
- setParserState(GGA_STATION_ID);
- }
- }
- ///parses GGA transmissions END
-
+ serial0_sendString("found quality byte\r\n");
+ #endif
+
+ quality = byte; //maybe reset if invalid data ??
+ setParserState(GGA_QUALITY);
+ }
+ }
+
+ //number of satellites
+ else if (decodeState == GGA_SATELLITES)
+ {
+ if (byte == ',') //end of this data type
+ {
+ numSatellites[numBytes] = 0x00;
+ setParserState(GGA_HDOP);
+ numBytes = 0; //prep for next phase of parse
+ }
+ else //store data
+ {
+ numSatellites[numBytes] = byte; //adjust number of bytes to fit array
+ numBytes++;
+ setParserState(GGA_SATELLITES);
+ }
+ }
+
+ //HDOP
+ else if (decodeState == GGA_HDOP)
+ {
+ if (byte == ',' ) //end of this data type
+ {
+ hdop[numBytes] = 0x00;
+ setParserState(GGA_ALTITUDE);
+ numBytes = 0; //prep for next phase of parse
+ skipBytes = 0;
+ }
+ else //store data
+ {
+ hdop[numBytes] = byte; //adjust number of bytes to fit array
+ numBytes++;
+ setParserState(GGA_HDOP);
+ }
+ }
+
+ //altitude
+ else if (decodeState == GGA_ALTITUDE)
+ {
+ if (byte == ',' && skipBytes == 0) //discard this byte
+ {
+ altitude[numBytes] = 0x00;
+ skipBytes = 1;
+ setParserState(GGA_ALTITUDE);
+ }
+ else if(byte == ',') //end of this data type
+ {
+ altitude[numBytes] = 0x00;
+ setParserState(GGA_WGS84);
+ numBytes = 0; //prep for next phase of parse
+ }
+ else //store data
+ {
+ altitude[numBytes] = byte; //adjust number of bytes to fit array
+ numBytes++;
+ setParserState(GGA_ALTITUDE);
+ }
+ }
+
+ //WGS84 Height
+ else if (decodeState == GGA_WGS84)
+ {
+ if (byte == ',' && skipBytes == 0) //discard this byte
+ {
+ skipBytes = 1;
+ setParserState(GGA_WGS84);
+ }
+ else if(byte == ',') //end of this data type
+ {
+ wgs84Height[numBytes] = 0x00;
+ setParserState(GGA_LAST_UPDATE);
+ skipBytes = 0; //prep for next phase of parse
+ numBytes = 0;
+ }
+ else //store data
+ {
+ wgs84Height[numBytes] = byte; //adjust number of bytes to fit array
+ numBytes++;
+ setParserState(GGA_WGS84);
+ }
+ }
+
+ //last GGA DGPS update
+ else if (decodeState == GGA_LAST_UPDATE)
+ {
+ if (byte == ',') //end of this data type
+ {
+ lastUpdated[numBytes] = 0x00;
+ setParserState(GGA_STATION_ID);
+ numBytes = 0; //prep for next phase of parse
+ }
+ else //store data - this should be blank
+ {
+ lastUpdated[numBytes] = byte; //adjust number of bytes to fit array
+ numBytes++;
+ setParserState(GGA_LAST_UPDATE);
+ }
+ }
+
+ //GGA DGPS station ID
+ else if (decodeState == GGA_STATION_ID)
+ {
+ if (byte == ',' || byte == '*') //end of this data type
+ {
+ stationID[numBytes] = 0x00;
+ setParserState(GPS_CHECKSUM);
+ numBytes = 0; //prep for next phase of parse
+ }
+ else //store data - this should be blank
+ {
+ stationID[numBytes] = byte; //adjust number of bytes to fit array
+ numBytes++;
+ setParserState(GGA_STATION_ID);
+ }
+ }
+ ///parses GGA transmissions END
+
/// $GPRMC,hhmmss.ss,A,llll.ll,a,yyyyy.yy,a,x.x,x.x,ddmmyy,x.x,a*hh
///parses RMC transmissions
//time
// emz: commented setter, GMC time better?
else if(decodeState == RMC_TIME)
{
- if (byte == ',') //end of this data type
- {
- //timestamp[numBytes] = 0x00;
- setParserState(RMC_VALIDITY);
- numBytes = 0; //prep for next phase of parse
- }
- else //store data
- {
+ if (byte == ',') //end of this data type
+ {
+ //timestamp[numBytes] = 0x00;
+ setParserState(RMC_VALIDITY);
+ numBytes = 0; //prep for next phase of parse
+ }
+ else //store data
+ {
#ifdef DEBUG_NMEA
- serial0_sendString("found time byte\r\n");
- #endif
-
- //timestamp[numBytes] = byte; //adjust number of bytes to fit array
- numBytes++;
- setParserState(RMC_TIME);
+ serial0_sendString("found time byte\r\n");
+ #endif
+
+ //timestamp[numBytes] = byte; //adjust number of bytes to fit array
+ numBytes++;
+ setParserState(RMC_TIME);
}
}
@@ -539,196 +552,196 @@ void parse_gps_transmission(void){
// not needed? dupe gga
else if(decodeState == RMC_VALIDITY)
{
- if (byte == ',') //end of this data type
- {
- setParserState(RMC_LATITUDE);
- skipBytes = 0; //prep for next phase of parse
- numBytes = 0;
- }
- else //store data
- {
+ if (byte == ',') //end of this data type
+ {
+ setParserState(RMC_LATITUDE);
+ skipBytes = 0; //prep for next phase of parse
+ numBytes = 0;
+ }
+ else //store data
+ {
#ifdef DEBUG_NMEA
- serial0_sendString("found valid byte\r\n");
- #endif
-
- //quality = byte;
- numBytes++;
- setParserState(RMC_VALIDITY);
+ serial0_sendString("found valid byte\r\n");
+ #endif
+
+ //quality = byte;
+ numBytes++;
+ setParserState(RMC_VALIDITY);
}
}
//latitude RMC (we don't need this, commented out setter)
else if(decodeState == RMC_LATITUDE)
{
- if (byte == ',' && skipBytes == 0) //discard this byte
- {
+ if (byte == ',' && skipBytes == 0) //discard this byte
+ {
#ifdef DEBUG_NMEA
- serial0_sendString("found lat skip byte\r\n");
- #endif
-
- skipBytes = 1;
- setParserState(RMC_LATITUDE);
- }
- else if (byte == ',') //end of this data type
- {
- setParserState(RMC_LONGITUDE);
- skipBytes = 0; //prep for next phase of parse
- numBytes = 0;
- }
- else //store data
- {
+ serial0_sendString("found lat skip byte\r\n");
+ #endif
+
+ skipBytes = 1;
+ setParserState(RMC_LATITUDE);
+ }
+ else if (byte == ',') //end of this data type
+ {
+ setParserState(RMC_LONGITUDE);
+ skipBytes = 0; //prep for next phase of parse
+ numBytes = 0;
+ }
+ else //store data
+ {
#ifdef DEBUG_NMEA
- serial0_sendString("found lat byte\r\n");
- #endif
-
- //latitude[numBytes]= byte; //adjust number of bytes to fit array
- numBytes++;
- setParserState(RMC_LATITUDE);
+ serial0_sendString("found lat byte\r\n");
+ #endif
+
+ //latitude[numBytes]= byte; //adjust number of bytes to fit array
+ numBytes++;
+ setParserState(RMC_LATITUDE);
}
}
//longitude RMC (we don't need this, commented out setter)
else if(decodeState == RMC_LONGITUDE)
{
- if (byte == ',' && skipBytes == 0) //discard this byte
- {
+ if (byte == ',' && skipBytes == 0) //discard this byte
+ {
#ifdef DEBUG_NMEA
- serial0_sendString("found long byte\r\n");
- #endif
-
- skipBytes = 1;
- setParserState(RMC_LONGITUDE);
- }
- else if (byte == ',') //end of this data type
- {
- setParserState(RMC_KNOTS);
- skipBytes = 0;
- numBytes = 0;
- }
- else //store data
- {
+ serial0_sendString("found long byte\r\n");
+ #endif
+
+ skipBytes = 1;
+ setParserState(RMC_LONGITUDE);
+ }
+ else if (byte == ',') //end of this data type
+ {
+ setParserState(RMC_KNOTS);
+ skipBytes = 0;
+ numBytes = 0;
+ }
+ else //store data
+ {
#ifdef DEBUG_NMEA
- serial0_sendString("found long byte\r\n");
- #endif
-
- //longitude[numBytes]= byte; //adjust number of bytes to fit array
- numBytes++;
- setParserState(RMC_LONGITUDE);
+ serial0_sendString("found long byte\r\n");
+ #endif
+
+ //longitude[numBytes]= byte; //adjust number of bytes to fit array
+ numBytes++;
+ setParserState(RMC_LONGITUDE);
}
}
//knots
else if(decodeState == RMC_KNOTS)
{
- if (byte == ',') //end of this data type
- {
- knots[numBytes] = 0x00;
- setParserState(RMC_COURSE);
- numBytes = 0; //prep for next phase of parse
- }
- else //store data
- {
- setParserState(RMC_KNOTS);
- knots[numBytes]= byte; //adjust number of bytes to fit array
- numBytes++;
+ if (byte == ',') //end of this data type
+ {
+ knots[numBytes] = 0x00;
+ setParserState(RMC_COURSE);
+ numBytes = 0; //prep for next phase of parse
+ }
+ else //store data
+ {
+ setParserState(RMC_KNOTS);
+ knots[numBytes]= byte; //adjust number of bytes to fit array
+ numBytes++;
}
}
//course
else if(decodeState == RMC_COURSE)
{
- if (byte == ',') //end of this data type
- {
- course[numBytes] = 0x00;
- setParserState(RMC_DATE);
- numBytes = 0; //prep for next phase of parse
- }
- else //store data
- {
- setParserState(RMC_COURSE);
- course[numBytes] = byte; //adjust number of bytes to fit array
- numBytes++;
+ if (byte == ',') //end of this data type
+ {
+ course[numBytes] = 0x00;
+ setParserState(RMC_DATE);
+ numBytes = 0; //prep for next phase of parse
+ }
+ else //store data
+ {
+ setParserState(RMC_COURSE);
+ course[numBytes] = byte; //adjust number of bytes to fit array
+ numBytes++;
}
}
//date
else if(decodeState == RMC_DATE)
{
- if (byte == ',') //end of this data type
- {
- // Cut it off at day of month. Also has month and year if we ever need it.
- dayofmonth[2] = 0x00;
- setParserState(RMC_MAG_VARIATION);
- skipBytes = 0; //prep for next phase of parse
- numBytes = 0;
- }
- else //store data
- {
- setParserState(RMC_DATE);
- dayofmonth[numBytes] = byte; //adjust number of bytes to fit array
- numBytes++;
+ if (byte == ',') //end of this data type
+ {
+ // Cut it off at day of month. Also has month and year if we ever need it.
+ dayofmonth[2] = 0x00;
+ setParserState(RMC_MAG_VARIATION);
+ skipBytes = 0; //prep for next phase of parse
+ numBytes = 0;
+ }
+ else //store data
+ {
+ setParserState(RMC_DATE);
+ dayofmonth[numBytes] = byte; //adjust number of bytes to fit array
+ numBytes++;
}
}
//magnetic variation
else if(decodeState == RMC_MAG_VARIATION)
{
- if (byte == '*') //end of this data type
- {
- variation[numBytes] = 0x00;
- setParserState(GPS_CHECKSUM);
- numBytes = 0; //prep for next phase of parse
- }
- else //store data
- {
- setParserState(RMC_MAG_VARIATION);
- variation[numBytes] = byte; //adjust number of bytes to fit array
- numBytes++;
+ if (byte == '*') //end of this data type
+ {
+ variation[numBytes] = 0x00;
+ setParserState(GPS_CHECKSUM);
+ numBytes = 0; //prep for next phase of parse
+ }
+ else //store data
+ {
+ setParserState(RMC_MAG_VARIATION);
+ variation[numBytes] = byte; //adjust number of bytes to fit array
+ numBytes++;
}
}
- ///parses RMC transmissions END
-
-
- //checksum
- else if (decodeState == GPS_CHECKSUM)
- {
- if (numBytes == 2) //end of data - terminating character ??
- {
- //checksum calculator for testing http://www.hhhh.org/wiml/proj/nmeaxor.html
- //TODO: must determine what to do with correct and incorrect messages
- receivedChecksum = checksum[0] + (checksum[1]*16); //convert bytes to int
- if(calculatedChecksum==receivedChecksum)
- {
-
- }
- else
- {
-
- }
+ ///parses RMC transmissions END
+
+
+ //checksum
+ else if (decodeState == GPS_CHECKSUM)
+ {
+ if (numBytes == 2) //end of data - terminating character ??
+ {
+ //checksum calculator for testing http://www.hhhh.org/wiml/proj/nmeaxor.html
+ //TODO: must determine what to do with correct and incorrect messages
+ receivedChecksum = checksum[0] + (checksum[1]*16); //convert bytes to int
+ if(calculatedChecksum==receivedChecksum)
+ {
+
+ }
+ else
+ {
+
+ }
#ifdef DEBUG_NMEA
- serial0_sendString("OMG GOT TO CHECKSUM!\r\n");
- #endif
-
- setParserState(INITIALIZE);
- numBytes = 0; //prep for next phase of parse
- }
- else //store data
- {
- setParserState(GPS_CHECKSUM);
- checksum[numBytes] = byte; //adjust number of bytes to fit array
- numBytes++;
- }
+ serial0_sendString("OMG GOT TO CHECKSUM!\r\n");
+ #endif
+
+ setParserState(INITIALIZE);
+ numBytes = 0; //prep for next phase of parse
+ }
+ else //store data
+ {
+ setParserState(GPS_CHECKSUM);
+ checksum[numBytes] = byte; //adjust number of bytes to fit array
+ numBytes++;
+ }
}
else {
setParserState(INITIALIZE);
}
- if (decodeState!=GPS_CHECKSUM && decodeState!=INITIALIZE) //want bytes between '$' and '*'
- {
+ if (decodeState!=GPS_CHECKSUM && decodeState!=INITIALIZE) //want bytes between '$' and '*'
+ {
//input byte into running checksum
- XORbyteWithChecksum(byte);
- }
- led_off(LED_ACTIVITY);
+ XORbyteWithChecksum(byte);
+ }
+ led_off(LED_ACTIVITY);
}