From 7b09fbe049c7e780d959a786f4880506e54a99ce Mon Sep 17 00:00:00 2001 From: geeksville Date: Sat, 22 Aug 2020 09:06:54 -0700 Subject: [PATCH] fix #327 side effect noticed by @smarti2019 --- src/gps/UBloxGPS.cpp | 121 ++++++++++++++++++++++--------------------- 1 file changed, 63 insertions(+), 58 deletions(-) diff --git a/src/gps/UBloxGPS.cpp b/src/gps/UBloxGPS.cpp index cab1ada4c..80d7064bb 100644 --- a/src/gps/UBloxGPS.cpp +++ b/src/gps/UBloxGPS.cpp @@ -102,8 +102,13 @@ bool UBloxGPS::factoryReset() // It is useful to force back into factory defaults (9600baud, NEMA to test the behavior of boards that don't have // GPS_TX connected) ublox.factoryReset(); - delay(3000); + delay(5000); tryConnect(); // sets isConnected + + // try a second time, the ublox lib serial parsing is buggy? + if (!tryConnect()) + tryConnect(); + DEBUG_MSG("GPS Factory reset success=%d\n", isConnected); if (isConnected) ok = setUBXMode(); @@ -122,72 +127,72 @@ int UBloxGPS::prepareSleep(void *unused) void UBloxGPS::doTask() { - uint8_t fixtype = 3; // If we are only using the RX pin, assume we have a 3d fix + if (isConnected) { + // Consume all characters that have arrived - assert(isConnected); + uint8_t fixtype = 3; // If we are only using the RX pin, assume we have a 3d fix - // Consume all characters that have arrived + // if using i2c or serial look too see if any chars are ready + ublox.checkUblox(); // See if new data is available. Process bytes as they come in. - // if using i2c or serial look too see if any chars are ready - ublox.checkUblox(); // See if new data is available. Process bytes as they come in. + // If we don't have a fix (a quick check), don't try waiting for a solution) + // Hmmm my fix type reading returns zeros for fix, which doesn't seem correct, because it is still sptting out positions + // turn off for now + uint16_t maxWait = i2cAddress ? 300 : 0; // If using i2c we must poll with wait + fixtype = ublox.getFixType(maxWait); + DEBUG_MSG("GPS fix type %d\n", fixtype); - // If we don't have a fix (a quick check), don't try waiting for a solution) - // Hmmm my fix type reading returns zeros for fix, which doesn't seem correct, because it is still sptting out positions - // turn off for now - uint16_t maxWait = i2cAddress ? 300 : 0; // If using i2c we must poll with wait - fixtype = ublox.getFixType(maxWait); - DEBUG_MSG("GPS fix type %d\n", fixtype); + // DEBUG_MSG("sec %d\n", ublox.getSecond()); + // DEBUG_MSG("lat %d\n", ublox.getLatitude()); - // DEBUG_MSG("sec %d\n", ublox.getSecond()); - // DEBUG_MSG("lat %d\n", ublox.getLatitude()); + // any fix that has time - // any fix that has time + if (ublox.getT(maxWait)) { + /* Convert to unix time + The Unix epoch (or Unix time or POSIX time or Unix timestamp) is the number of seconds that have elapsed since January + 1, 1970 (midnight UTC/GMT), not counting leap seconds (in ISO 8601: 1970-01-01T00:00:00Z). + */ + struct tm t; + t.tm_sec = ublox.getSecond(0); + t.tm_min = ublox.getMinute(0); + t.tm_hour = ublox.getHour(0); + t.tm_mday = ublox.getDay(0); + t.tm_mon = ublox.getMonth(0) - 1; + t.tm_year = ublox.getYear(0) - 1900; + t.tm_isdst = false; + perhapsSetRTC(t); + } - if (ublox.getT(maxWait)) { - /* Convert to unix time -The Unix epoch (or Unix time or POSIX time or Unix timestamp) is the number of seconds that have elapsed since January 1, 1970 -(midnight UTC/GMT), not counting leap seconds (in ISO 8601: 1970-01-01T00:00:00Z). -*/ - struct tm t; - t.tm_sec = ublox.getSecond(0); - t.tm_min = ublox.getMinute(0); - t.tm_hour = ublox.getHour(0); - t.tm_mday = ublox.getDay(0); - t.tm_mon = ublox.getMonth(0) - 1; - t.tm_year = ublox.getYear(0) - 1900; - t.tm_isdst = false; - perhapsSetRTC(t); + latitude = ublox.getLatitude(0); + longitude = ublox.getLongitude(0); + altitude = ublox.getAltitude(0) / 1000; // in mm convert to meters + dop = ublox.getPDOP(0); // PDOP (an accuracy metric) is reported in 10^2 units so we have to scale down when we use it + heading = ublox.getHeading(0); + numSatellites = ublox.getSIV(0); + + // bogus lat lon is reported as 0 or 0 (can be bogus just for one) + // Also: apparently when the GPS is initially reporting lock it can output a bogus latitude > 90 deg! + hasValidLocation = + (latitude != 0) && (longitude != 0) && (latitude <= 900000000 && latitude >= -900000000) && (numSatellites > 0); + + // we only notify if position has changed due to a new fix + if ((fixtype >= 3 && fixtype <= 4) && ublox.getP(maxWait)) // rd fixes only + { + if (hasValidLocation) { + wantNewLocation = false; + // ublox.powerOff(); + } + } else // we didn't get a location update, go back to sleep and hope the characters show up + wantNewLocation = true; + + // Notify any status instances that are observing us + const meshtastic::GPSStatus status = + meshtastic::GPSStatus(hasLock(), isConnected, latitude, longitude, altitude, dop, heading, numSatellites); + newStatus.notifyObservers(&status); } - latitude = ublox.getLatitude(0); - longitude = ublox.getLongitude(0); - altitude = ublox.getAltitude(0) / 1000; // in mm convert to meters - dop = ublox.getPDOP(0); // PDOP (an accuracy metric) is reported in 10^2 units so we have to scale down when we use it - heading = ublox.getHeading(0); - numSatellites = ublox.getSIV(0); - - // bogus lat lon is reported as 0 or 0 (can be bogus just for one) - // Also: apparently when the GPS is initially reporting lock it can output a bogus latitude > 90 deg! - hasValidLocation = - (latitude != 0) && (longitude != 0) && (latitude <= 900000000 && latitude >= -900000000) && (numSatellites > 0); - - // we only notify if position has changed due to a new fix - if ((fixtype >= 3 && fixtype <= 4) && ublox.getP(maxWait)) // rd fixes only - { - if (hasValidLocation) { - wantNewLocation = false; - // ublox.powerOff(); - } - } else // we didn't get a location update, go back to sleep and hope the characters show up - wantNewLocation = true; - - // Notify any status instances that are observing us - const meshtastic::GPSStatus status = - meshtastic::GPSStatus(hasLock(), isConnected, latitude, longitude, altitude, dop, heading, numSatellites); - newStatus.notifyObservers(&status); - - // Once we have sent a location once we only poll the GPS rarely, otherwise check back every 1s until we have something over - // the serial + // Once we have sent a location once we only poll the GPS rarely, otherwise check back every 10s until we have something + // over the serial setPeriod(hasValidLocation && !wantNewLocation ? 30 * 1000 : 10 * 1000); }