diff --git a/src/GPS.cpp b/src/GPS.cpp index db841860..dd5ef82c 100644 --- a/src/GPS.cpp +++ b/src/GPS.cpp @@ -137,72 +137,75 @@ bool GPS::canSleep() /// Prepare the GPS for the cpu entering deep or light sleep, expect to be gone for at least 100s of msecs void GPS::prepareSleep() { - ublox.powerOff(); + if (isConnected) + ublox.powerOff(); } void GPS::doTask() { #ifdef GPS_RX_PIN - // Consume all characters that have arrived - - // getPVT automatically calls checkUblox - ublox.checkUblox(); //See if new data is available. Process bytes as they come in. - - // DEBUG_MSG("sec %d\n", ublox.getSecond()); - // DEBUG_MSG("lat %d\n", ublox.getLatitude()); - - // If we don't have a fix (a quick check), don't try waiting for a solution) - uint8_t fixtype = ublox.getFixType(); - DEBUG_MSG("fix type %d\n", fixtype); - - // any fix that has time - if ((fixtype >= 2 && fixtype <= 5) && !timeSetFromGPS && ublox.getT()) + if (isConnected) { - struct timeval tv; + // Consume all characters that have arrived - isConnected = true; // We just received a packet, so we must have a GPS + // getPVT automatically calls checkUblox + ublox.checkUblox(); //See if new data is available. Process bytes as they come in. - /* Convert to unix time + // DEBUG_MSG("sec %d\n", ublox.getSecond()); + // DEBUG_MSG("lat %d\n", ublox.getLatitude()); + + // If we don't have a fix (a quick check), don't try waiting for a solution) + uint8_t fixtype = ublox.getFixType(); + DEBUG_MSG("fix type %d\n", fixtype); + + // any fix that has time + if ((fixtype >= 2 && fixtype <= 5) && !timeSetFromGPS && ublox.getT()) + { + struct timeval tv; + + isConnected = true; // We just received a packet, so we must have a GPS + + /* 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(); - t.tm_min = ublox.getMinute(); - t.tm_hour = ublox.getHour(); - t.tm_mday = ublox.getDay(); - t.tm_mon = ublox.getMonth() - 1; - t.tm_year = ublox.getYear() - 1900; - t.tm_isdst = false; - time_t res = mktime(&t); - tv.tv_sec = res; - tv.tv_usec = 0; // time.centisecond() * (10 / 1000); + struct tm t; + t.tm_sec = ublox.getSecond(); + t.tm_min = ublox.getMinute(); + t.tm_hour = ublox.getHour(); + t.tm_mday = ublox.getDay(); + t.tm_mon = ublox.getMonth() - 1; + t.tm_year = ublox.getYear() - 1900; + t.tm_isdst = false; + time_t res = mktime(&t); + tv.tv_sec = res; + tv.tv_usec = 0; // time.centisecond() * (10 / 1000); - DEBUG_MSG("Got time from GPS month=%d, year=%d, unixtime=%ld\n", t.tm_mon, t.tm_year, tv.tv_sec); + DEBUG_MSG("Got time from GPS month=%d, year=%d, unixtime=%ld\n", t.tm_mon, t.tm_year, tv.tv_sec); - perhapsSetRTC(&tv); - } - - if ((fixtype >= 3 && fixtype <= 4) && ublox.getP()) // rd fixes only - { - // we only notify if position has changed - isConnected = true; // We just received a packet, so we must have a GPS - - latitude = ublox.getLatitude() * 1e-7; - longitude = ublox.getLongitude() * 1e-7; - altitude = ublox.getAltitude() / 1000; // in mm convert to meters - DEBUG_MSG("new gps pos lat=%f, lon=%f, alt=%d\n", latitude, longitude, altitude); - - hasValidLocation = (latitude != 0) || (longitude != 0); // bogus lat lon is reported as 0,0 - if (hasValidLocation) - { - wantNewLocation = false; - notifyObservers(); - //ublox.powerOff(); + perhapsSetRTC(&tv); } - } - else // we didn't get a location update, go back to sleep and hope the characters show up - wantNewLocation = true; + if ((fixtype >= 3 && fixtype <= 4) && ublox.getP()) // rd fixes only + { + // we only notify if position has changed + isConnected = true; // We just received a packet, so we must have a GPS + + latitude = ublox.getLatitude() * 1e-7; + longitude = ublox.getLongitude() * 1e-7; + altitude = ublox.getAltitude() / 1000; // in mm convert to meters + DEBUG_MSG("new gps pos lat=%f, lon=%f, alt=%d\n", latitude, longitude, altitude); + + hasValidLocation = (latitude != 0) || (longitude != 0); // bogus lat lon is reported as 0,0 + if (hasValidLocation) + { + wantNewLocation = false; + notifyObservers(); + //ublox.powerOff(); + } + } + else // we didn't get a location update, go back to sleep and hope the characters show up + wantNewLocation = true; + } #endif // 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 diff --git a/src/configuration.h b/src/configuration.h index 93e3408a..8f8286da 100644 --- a/src/configuration.h +++ b/src/configuration.h @@ -41,8 +41,8 @@ along with this program. If not, see . // Select which board is being used. If the outside build environment has sent a choice, just use that #if !defined(T_BEAM_V10) && !defined(HELTEC_LORA32) -#define T_BEAM_V10 // AKA Rev1 (second board released) -// #define HELTEC_LORA32 +// #define T_BEAM_V10 // AKA Rev1 (second board released) +#define HELTEC_LORA32 #define HW_VERSION_US // We encode the hardware freq range in the hw version string, so sw update can eventually install the correct build #endif @@ -84,14 +84,12 @@ along with this program. If not, see . #define GPS_SERIAL_NUM 1 #define GPS_BAUDRATE 9600 -#if defined(T_BEAM_V10) #define GPS_RX_PIN 34 #ifdef USE_JTAG #define GPS_TX_PIN -1 #else #define GPS_TX_PIN 12 #endif -#endif // ----------------------------------------------------------------------------- // LoRa SPI