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); }