Changeset - 24036113890a
[Not reviewed]
default
0 1 0
mkanning@CL-SEC241-10.cedarville.edu - 12 years ago 2012-11-20 11:28:36
mkanning@CL-SEC241-10.cedarville.edu
Finished first pass on NMEA parser for GGA type
1 file changed with 144 insertions and 11 deletions:
0 comments (0 inline, 0 general)
master/master/lib/trackuinoGPS/gpsMKa.c
Show inline comments
 
@@ -17,19 +17,24 @@ 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 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 { 
 
@@ -45,6 +50,7 @@ enum decodeState {
 
	GGA_WGS84,
 
	GGA_LAST_UPDATE,
 
	GGA_STATION_ID,
 
	GGA_CHECKSUM,
 
	RMC_TIME
 
}decodeState;
 

	
 
@@ -61,6 +67,7 @@ void parse_gps_transmission(void){
 
	{
 
		bytesReceived = 1; //resets transmission if '$' is found
 
		decodeState = GET_TYPE;
 
		numBytes = 0;
 
	}
 
	
 
	//parse transmission type
 
@@ -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,10 +124,12 @@ 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++;
 
		}	
 
	}
 
	
 
@@ -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++;
 
		}
 
	}
 
	
 
}
0 comments (0 inline, 0 general)