void GPSManager::init() { gps_rec = new gpsmm("localhost", DEFAULT_GPSD_PORT); lastStatus = STATUS_NO_FIX; lastLatitude = lastLongitude = lastAltitude = 0; emit statusChanged(lastStatus); emit gpsFix(NAN, NAN, NAN); if (!gps_rec->stream(WATCH_ENABLE|WATCH_JSON)) { qDebug() << Q_FUNC_INFO << "Warning: no GPSD running"; emit ready(false); return; } else { pollTimer.start(); } }
void GPSManager::processData(gps_data_t *data) { if(lastStatus != data->status) { lastStatus = data->status; emit statusChanged(lastStatus); } if(lastStatus != STATUS_NO_FIX) { if(lastLatitude != data->fix.latitude || lastLongitude != data->fix.longitude || lastAltitude != data->fix.altitude) { lastLatitude = data->fix.latitude; lastLongitude = data->fix.longitude; lastAltitude = data->fix.altitude; emit gpsFix(lastLatitude, lastLongitude, lastAltitude); if(!gotInitialFix) { gotInitialFix = true; emit ready(true); } } } }
inline int parseGpsCmd(int type) { switch(cmdRead()) { case 'F': switch(cmdRead()) { case 'V': switch(cmdLook()) { case LINE_TERMINATOR: cmdRead(); case '+': // READ "Fix value" ShowValueU(gpsFix()); goto pgc_ok; } goto pgc_error; } goto pgc_error; case 'G': switch(cmdRead()) { case 'S': switch(cmdLook()) { case LINE_TERMINATOR: cmdRead(); case '+': // READ "Ground speed" ShowValueD(gpsSpeed()); goto pgc_ok; } goto pgc_error; } goto pgc_error; case 'H': switch(cmdRead()) { case 'P': switch(cmdLook()) { case LINE_TERMINATOR: cmdRead(); case '+': // READ "HDOP" ShowValueD(gpsHdop()); goto pgc_ok; } goto pgc_error; } goto pgc_error; case 'L': switch(cmdRead()) { case 'A': switch(cmdLook()) { case LINE_TERMINATOR: cmdRead(); case '+': // READ "Lat" if (gpsIsPosValid()) { ShowValueD(gpsLat()); } else Serial_printStr("NA "); goto pgc_ok; } goto pgc_error; case 'O': switch(cmdLook()) { case LINE_TERMINATOR: cmdRead(); case '+': // READ "Lon" if (gpsIsPosValid()) { ShowValueD(gpsLon()); } else Serial_printStr("NA "); goto pgc_ok; } goto pgc_error; } goto pgc_error; case 'P': switch(cmdRead()) { case 'S': switch(cmdLook()) { case LINE_TERMINATOR: cmdRead(); case '+': // READ "Power State" ShowValueU(d_gpsPowerState); goto pgc_ok; case '=': // WRITE "Power State" cmdRead(); ReadValueU(d_gpsPowerState); goto pgc_ok; } goto pgc_error; } goto pgc_error; case 'S': switch(cmdRead()) { case 'C': switch(cmdLook()) { case LINE_TERMINATOR: cmdRead(); case '=': // WRITE "GPS Command" cmdRead(); ReadValueUL(d_gpsNextCmd); goto pgc_ok; } goto pgc_error; } goto pgc_error; case 'T': switch(cmdRead()) { case 'D': switch(cmdLook()) { case LINE_TERMINATOR: cmdRead(); case '+': // READ "Track Degree" ShowValueD(gpsDegree()); goto pgc_ok; } goto pgc_error; } goto pgc_error; } pgc_error: return ERROR; pgc_ok: return OK; }