Esempio n. 1
0
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;
}
Esempio n. 2
0
int main(int argc, char** argv) {
    struct GpsFix fix = parseRmc(rmc);
    std::cout << fix.toString() << std::endl;
    return 0;
}