uint8_t GPS_MTK3339::parseSentence(){ GPS_DEBUG_READ_PRINTLN("PARSING"); _machineState = GPS_MS_READY; #ifdef GPS_DEBUG_READ_PRINT_BUFFER GPS_DEBUG_READ_PRINTLN((char *)Buffer); #endif uint8_t sentenceName = getsentenceName(); uint8_t startByte = 0; uint8_t stopByte = startByte; uint8_t element = 0; bool elementParseSuccess = false; for(uint8_t i = 0; i < sizeof(Buffer); i++){ uint8_t b = Buffer[i]; // ',' or '*' if(b == GPS_ELEMENT_DELIM || b == GPS_CHKSUM_DELIM){ switch(sentenceName){ case GPS_STATUS_SUCCESS_RMC: elementParseSuccess = parseRmc(element, startByte, stopByte); break; case GPS_STATUS_SUCCESS_GGA: elementParseSuccess = parseGga(element, startByte, stopByte); break; default: elementParseSuccess = true; break; } if(elementParseSuccess == false){ GPS_DEBUG_READ_PRINTLN("element parse error"); _machineState = GPS_MS_ERROR; return GPS_ERROR_PARSE_ERR; } if(b == GPS_CHKSUM_DELIM){ if(verifyChecksum(i)){ loadValues(); return sentenceName; } GPS_DEBUG_READ_PRINTLN("invalid checksum"); _machineState = GPS_MS_ERROR; return GPS_ERROR_CHECKSUM; } startByte = i + 1; stopByte = startByte; element++; } else{ stopByte++; } } GPS_DEBUG_READ_PRINTLN("unexpected end of parse"); _machineState = GPS_MS_ERROR; return GPS_ERROR_PARSE_ERR; }
int main(int argc, char** argv) { struct GpsFix fix = parseRmc(rmc); std::cout << fix.toString() << std::endl; return 0; }