diff --git a/master/master/lib/trackuinoGPS/gpsMKa.c b/master/master/lib/trackuinoGPS/gpsMKa.c --- a/master/master/lib/trackuinoGPS/gpsMKa.c +++ b/master/master/lib/trackuinoGPS/gpsMKa.c @@ -1,9 +1,9 @@ /* - * gpsMKa.c - * - * Created: 11/15/2012 12:02:38 PM - * Author: mkanning - */ +* gpsMKa.c +* +* Created: 11/15/2012 12:02:38 PM +* Author: mkanning +*/ #include #include #include "gpsMKa.h" @@ -17,22 +17,27 @@ char data[16]; //used to skip over bytes during parse int skipBytes = 0; +//used to index data arrays during data collection +int numBytes = 0; + //variables to store data from transmission +//least significant digit is stored at location 0 of arrays uint8_t tramsmissionType; -uint8_t timestamp[9]; //hhmmss.ss -uint8_t latitude[8]; //llll.ll,a -uint8_t longitude[8]; //yyyyy.yy,a +uint8_t timestamp[9]; //hhmmss.ss +uint8_t latitude[8]; //llll.ll,a +uint8_t longitude[8]; //yyyyy.yy,a uint8_t quality; -uint8_t numSatellites; -uint8_t hdop; -uint8_t altitude; -uint8_t wgs84Height; -uint8_t lastUpdated; -uint8_t stationID; -uint8_t checksum; +uint8_t numSatellites[2]; +uint8_t hdop[4]; //xx.x +uint8_t altitude[8]; //xxxxxx.x +uint8_t wgs84Height[6]; //sxxx.x +uint8_t lastUpdated[6]; //blank - included for testing +uint8_t stationID[6]; //blank - included for testing +uint8_t checksum; //xx + // transmission state machine -enum decodeState { +enum decodeState { INITIALIZE=0, GET_TYPE, GGA_TIME, @@ -45,6 +50,7 @@ enum decodeState { GGA_WGS84, GGA_LAST_UPDATE, GGA_STATION_ID, + GGA_CHECKSUM, RMC_TIME }decodeState; @@ -56,11 +62,12 @@ void parse_gps_transmission(void){ char byte = uart_getchar(); // $--GGA,hhmmss.ss,llll.ll,a,yyyyy.yy,a,x,xx,x.x,x.x,M,x.x,M,x.x,xxxx - // ^8 ^18 ^28 + // ^8 ^18 ^28 if(byte == '$') //start of transmission sentence { bytesReceived = 1; //resets transmission if '$' is found decodeState = GET_TYPE; + numBytes = 0; } //parse transmission type @@ -76,17 +83,17 @@ void parse_gps_transmission(void){ if (tramsmissionType == 'G') { decodeState = GGA_TIME; - } + } else if(tramsmissionType == 'R') { decodeState = RMC_TIME; //not implemented } else { - //reset + //reset decodeState = INITIALIZE; bytesReceived = 0; - } + } } } @@ -97,10 +104,12 @@ void parse_gps_transmission(void){ { decodeState = GGA_LATITUDE; skipBytes = 0; //prep for next phase of parse + numBytes = 0; } else //store the byte of timestamp data { - timestamp[bytesReceived-7] = byte; //adjust number of bytes to fit array + timestamp[numBytes] = byte; //adjust number of bytes to fit array + numBytes++; } } @@ -115,11 +124,13 @@ void parse_gps_transmission(void){ { decodeState = GGA_LONGITUDE; skipBytes = 0; //prep for next phase of parse + numBytes = 0; } else { - latitude[bytesReceived-17] = byte; //adjust number of bytes to fit array - } + latitude[numBytes] = byte; //adjust number of bytes to fit array + numBytes++; + } } //parse GGA longitude data @@ -132,17 +143,139 @@ void parse_gps_transmission(void){ else if (byte == ',') //end of latitude data { decodeState = GGA_QUALITY; + numBytes = 0; } else { - longitude[bytesReceived-17] = byte; //adjust number of bytes to fit array - } + longitude[numBytes] = byte; //adjust number of bytes to fit array + numBytes++; + } } //parse GGA quality data else if (decodeState = GGA_QUALITY) { - quality = byte; + if (byte = ',')//end of quality data + { + decodeState = GGA_SATELLITES; + skipBytes = 0; //prep for next phase of parse + } + else + { + quality = byte; //maybe reset if invalid data ?? + } + } + + //parse GGA number of satellites data + else if (decodeState = GGA_SATELLITES) + { + if (byte = ',')//end of data + { + decodeState = GGA_HDOP; + skipBytes = 0; //prep for next phase of parse + numBytes = 0; + } + else //store data + { + numSatellites[numBytes] = byte; + numBytes++; + } + } + + //parse GGA HDOP data + else if (decodeState = GGA_HDOP) + { + if (byte = ',')//end of data + { + decodeState = GGA_ALTITUDE; + skipBytes = 0; //prep for next phase of parse + numBytes = 0; + } + else //store data + { + hdop[numBytes] = byte; //store byte of data + numBytes++; + } + } + + //parse GGA altitude data + else if (decodeState = GGA_ALTITUDE) + { + if (byte = ',')//end of data + { + decodeState = GGA_WGS84; + skipBytes = 0; //prep for next phase of parse + numBytes = 0; + } + else //store data + { + altitude[numBytes] = byte; + numBytes++; + } + } + + //parse GGA WGS84 Height data + else if (decodeState = GGA_WGS84) + { + if (byte = ',')//end of data + { + decodeState = GGA_LAST_UPDATE; + skipBytes = 0; //prep for next phase of parse + numBytes = 0; + } + else //store data + { + wgs84Height[numBytes] = byte; + numBytes++; + } + } + + //parse GGA last DGPS update data + else if (decodeState = GGA_LAST_UPDATE) + { + if (byte = ',')//end of data + { + decodeState = GGA_STATION_ID; + skipBytes = 0; //prep for next phase of parse + numBytes = 0; + } + else //store data - this should be blank + { + lastUpdated[numBytes] = byte; + numBytes++; + } + } + + //parse GGA DGPS station ID data + else if (decodeState = GGA_STATION_ID) + { + if (byte = ',')//end of data + { + decodeState = GGA_CHECKSUM; + skipBytes = 0; //prep for next phase of parse + numBytes = 0; + } + else //store data - this should be blank + { + stationID[numBytes] = byte; + numBytes++; + } + } + + //parse GGA checksum data + else if (decodeState = GGA_CHECKSUM) + { + if (byte = ',')//end of data - terminating character ?? + { + decodeState = INITIALIZE; + skipBytes = 0; //prep for next phase of parse + numBytes = 0; + } + else //store data + { + checksum[numBytes] = byte; + numBytes++; + } } }