else if ( IIRValue == IIR_RDA ){ /* Receive Data Available */
char_rcv = LPC_UART3->RBR;
UART3Buffer[UART3Count] = char_rcv;
UART3Count++;
if ( UART3Count == BUFSIZE ){
UART3Count = 0; /* buffer overflow */
}
// now try to see where this character fits in the NMEA GGA message we're trying to decipher
switch ( nmea_state ) // evaluate expression
{
case ( 1 ): // wait for 'G'
if ( char_rcv == 'G')
nmea_state++;
break;
case ( 2 ): // wait for 'G'
if ( char_rcv == 'G')
nmea_state++;
else
nmea_state=1; //Si no es una G volvemos al principio
break;
case ( 3 ): // wait for 'A'
if ( char_rcv == 'A')
nmea_state++;
else
nmea_state=1; //Si no es una G volvemos al principio
break;
case ( 4 ): // wait for ','
if ( char_rcv == ',')
nmea_state++;
break;
case ( 5 ): // Estoy en el Campo UTS
if ( char_rcv == ','){ //Si ya finalizó el campo
nmea_state++; //Paso al siguiente estado
idx=0;
}else{
gps_UTC[idx] = char_rcv; // Voy almacenando los caracteres recividos
idx++; // Incremento el índice dentro del campo actual
}
calculateoutputgps=0;
break;
case ( 6 ): // Estamos en el Campo LATITUD
if ( char_rcv == ','){ //Si ya finalizó el campo
nmea_state++; //Paso al siguiente estado
idx=0;
}else{
idx++; // Incremento el índice dentro del campo actual
gps_latitud[idx] = char_rcv; // Voy almacenando los caracteres recividos
}
break;
case ( 7 ):
if ( char_rcv == 'N') // Si es Norte
gps_latitud[0] = '+'; // Latitud positiva
else // Si es Sur
gps_latitud[0] = '-'; // Latitud negativa
nmea_state++;
break;
case ( 8 ): // this is a comma
nmea_state++;
break;
case ( 9 ): // Estamos en el Campo LONGITUD
if ( char_rcv == ','){ //Si ya finalizó el campo
nmea_state++; //Paso al siguiente estado
idx=0;
}else{
idx++; // Incremento el índice dentro del campo actual
gps_longitud[idx] = char_rcv; // Voy almacenando los caracteres recividos
}
break;
case ( 10 ):
if ( char_rcv == 'E') // Si es Este
gps_longitud[0] = '+'; // Latitud positiva
else // Si es Sur
gps_longitud[0] = '-'; // Latitud negativa
nmea_state++;
break;
case ( 11 ): // this is a comma
nmea_state++;
break;
case ( 12 ): // Este campo es Fix quality
nmea_state++;
break;
case (13): // Este es una ','
nmea_state++;
break;
case (14): // Este es el campo de número de satelites linkeados.
if ( char_rcv == ','){ //Si ya finalizó el campo
nmea_state++; //Paso al siguiente estado
idx=0;
}else{
gps_Sats[idx] = char_rcv; // Voy almacenando los caracteres recividos
idx++; // Incremento el índice dentro del campo actual
}
break;
case (15): // this is the 4th comma
if ( char_rcv == 0x2C) {
// move to the next state
nmea_state++;
// but first prepare the meters input variable
gps_height[0]= 0x30;
gps_height[1]= 0x30;
gps_height[2]= 0x30;
gps_height[3]= 0x30;
gps_height[4]= 0x30;
}
break;
case (16): // this is the heigth in meters
if ( char_rcv == 0x2e) { // waiting for a decimal point
// no more numbers? OK, done with the shifting, move to the next step
nmea_state++;
}
else {
// oh no, 1 more number! Just shift the digits around and we'll be fine
gps_height[0]=gps_height[1];
gps_height[1]=gps_height[2];
gps_height[2]=gps_height[3];
gps_height[3]=gps_height[4];
gps_height[4]=char_rcv;
}
break;
case (17): // this is the decimal part of the heigth
gps_height_decimeters = char_rcv;
// notify the main loop we have gps data available
calculateoutputgps = 1;
// and wait for the next NMEA message
nmea_state = 1;
break;
default:
nmea_state = 1; // we'll never and up here, but in case of a brownout make sure we start at the beginning
break;
}
}