From 62498d0935568b1a07af6f686f66f70ec1dee655 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=B6ttgens?= Date: Wed, 5 Oct 2022 14:59:07 +0200 Subject: [PATCH] GPS Rollup, incorporates changes from @pmarches and @lewisxhe --- .vscode/settings.json | 3 +- src/gps/GPS.cpp | 100 ++++------------------------------- src/gps/NMEAGPS.cpp | 24 ++++----- variants/t-echo/variant.h | 3 ++ variants/tbeam_v07/variant.h | 3 +- 5 files changed, 25 insertions(+), 108 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index fa125784a..21b7b97b7 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -53,7 +53,8 @@ "iostream": "cpp", "esp_nimble_hci.h": "c", "map": "cpp", - "random": "cpp" + "random": "cpp", + "*.tpp": "cpp" }, "cSpell.words": [ "Blox", diff --git a/src/gps/GPS.cpp b/src/gps/GPS.cpp index c4cdb39b6..534a0ebea 100644 --- a/src/gps/GPS.cpp +++ b/src/gps/GPS.cpp @@ -146,7 +146,7 @@ bool GPS::setupGPS() didSerialInit = true; #ifdef ARCH_ESP32 - // In esp32s3 framework, setRxBufferSize needs to be initialized before Serial + // In esp32 framework, setRxBufferSize needs to be initialized before Serial _serial_gps->setRxBufferSize(2048); // the default is 256 #endif @@ -157,7 +157,6 @@ bool GPS::setupGPS() _serial_gps->begin(GPS_BAUDRATE); #endif -#ifdef LILYGO_TBEAM_S3_CORE /* * T-Beam-S3-Core will be preset to use gps Probe here, and other boards will not be changed first */ @@ -246,86 +245,6 @@ bool GPS::setupGPS() DEBUG_MSG("WARNING: Unable to enable NMEA GGA.\n"); } } -#endif - -#ifdef TTGO_T_ECHO - // Switch to 9600 baud, then close and reopen port - _serial_gps->end(); - delay(250); - _serial_gps->begin(4800); - delay(250); - _serial_gps->write("$PCAS01,1*1D\r\n"); - delay(250); - _serial_gps->end(); - delay(250); - _serial_gps->begin(9600); - delay(250); - // Initialize the L76K Chip, use GPS + GLONASS - _serial_gps->write("$PCAS04,5*1C\r\n"); - delay(250); - // only ask for RMC and GGA - _serial_gps->write("$PCAS03,1,0,0,0,1,0,0,0,0,0,,,0,0*02\r\n"); - delay(250); - // Switch to Vehicle Mode, since SoftRF enables Aviation < 2g - _serial_gps->write("$PCAS11,3*1E\r\n"); - delay(250); -#endif -#ifdef GPS_UBLOX - delay(250); - // Set the UART port to output NMEA only - byte _message_nmea[] = {0xB5, 0x62, 0x06, 0x00, 0x14, 0x00, 0x01, 0x00, 0x00, 0x00, 0xC0, 0x08, 0x00, 0x00, - 0x80, 0x25, 0x00, 0x00, 0x07, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x91, 0xAF}; - _serial_gps->write(_message_nmea, sizeof(_message_nmea)); - if (!getACK(0x06, 0x00)) { - DEBUG_MSG("WARNING: Unable to enable NMEA Mode.\n"); - return true; - } - - // disable GGL - byte _message_GGL[] = {0xB5, 0x62, 0x06, 0x01, 0x08, 0x00, 0xF0, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x05, 0x3A}; - _serial_gps->write(_message_GGL, sizeof(_message_GGL)); - if (!getACK(0x06, 0x01)) { - DEBUG_MSG("WARNING: Unable to disable NMEA GGL.\n"); - return true; - } - - // disable GSA - byte _message_GSA[] = {0xB5, 0x62, 0x06, 0x01, 0x08, 0x00, 0xF0, 0x02, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x06, 0x41}; - _serial_gps->write(_message_GSA, sizeof(_message_GSA)); - if (!getACK(0x06, 0x01)) { - DEBUG_MSG("WARNING: Unable to disable NMEA GSA.\n"); - return true; - } - - // disable GSV - byte _message_GSV[] = {0xB5, 0x62, 0x06, 0x01, 0x08, 0x00, 0xF0, 0x03, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x07, 0x48}; - _serial_gps->write(_message_GSV, sizeof(_message_GSV)); - if (!getACK(0x06, 0x01)) { - DEBUG_MSG("WARNING: Unable to disable NMEA GSV.\n"); - return true; - } - - // disable VTG - byte _message_VTG[] = {0xB5, 0x62, 0x06, 0x01, 0x08, 0x00, 0xF0, 0x05, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x09, 0x56}; - _serial_gps->write(_message_VTG, sizeof(_message_VTG)); - if (!getACK(0x06, 0x01)) { - DEBUG_MSG("WARNING: Unable to disable NMEA VTG.\n"); - return true; - } - - // enable RMC - byte _message_RMC[] = {0xB5, 0x62, 0x06, 0x01, 0x08, 0x00, 0xF0, 0x04, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x09, 0x54}; - _serial_gps->write(_message_RMC, sizeof(_message_RMC)); - if (!getACK(0x06, 0x01)) { - DEBUG_MSG("WARNING: Unable to enable NMEA RMC.\n"); - return true; - } - - // enable GGA - byte _message_GGA[] = {0xB5, 0x62, 0x06, 0x01, 0x08, 0x00, 0xF0, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x05, 0x38}; - _serial_gps->write(_message_GGA, sizeof(_message_GGA)); - if (!getACK(0x06, 0x01)) DEBUG_MSG("WARNING: Unable to enable NMEA GGA.\n"); -#endif } return true; @@ -485,7 +404,6 @@ int32_t GPS::runOnce() // if we have received valid NMEA claim we are connected setConnected(); } else { -#if defined(LILYGO_TBEAM_S3_CORE) if(gnssModel == GNSS_MODEL_UBLOX){ // reset the GPS on next bootup if(devicestate.did_gps_reset && (millis() > 60000) && !hasFlow()) { @@ -494,14 +412,6 @@ int32_t GPS::runOnce() nodeDB.saveDeviceStateToDisk(); } } -#elif defined(GPS_UBLOX) - // reset the GPS on next bootup - if(devicestate.did_gps_reset && (millis() > 60000) && !hasFlow()) { - DEBUG_MSG("GPS is not communicating, trying factory reset on next bootup.\n"); - devicestate.did_gps_reset = false; - nodeDB.saveDeviceStateToDisk(); - } -#endif } // If we are overdue for an update, turn on the GPS and at least publish the current status @@ -603,6 +513,13 @@ int GPS::prepareDeepSleep(void *unused) GnssModel_t GPS::probe() { + // return immediately if the model is set by the variant.h file +#ifdef GPS_UBLOX + return GNSS_MODEL_UBLOX; +#elif defined(GPS_L76K) + return GNSS_MODEL_MTK; +#else + // we use autodetect, only T-BEAM S3 for now... uint8_t buffer[256]; /* * The GNSS module information variable is temporarily placed inside the function body, @@ -697,6 +614,7 @@ GnssModel_t GPS::probe() } return GNSS_MODEL_UBLOX; +#endif } #if HAS_GPS diff --git a/src/gps/NMEAGPS.cpp b/src/gps/NMEAGPS.cpp index 380aa6419..1b103f534 100644 --- a/src/gps/NMEAGPS.cpp +++ b/src/gps/NMEAGPS.cpp @@ -19,27 +19,21 @@ static int32_t toDegInt(RawDegrees d) bool NMEAGPS::factoryReset() { - /** - * First use the macro definition to distinguish, - * if there is no problem, the macro definition will be deleted - * */ -#if defined(LILYGO_TBEAM_S3_CORE) - if(gnssModel == GNSS_MODEL_UBLOX){ - // Factory Reset - byte _message_reset[] = {0xB5, 0x62, 0x06, 0x09, 0x0D, 0x00, 0xFF, - 0xFB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0x17, 0x2B, 0x7E}; - _serial_gps->write(_message_reset,sizeof(_message_reset)); - delay(1000); - } -#elif defined(GPS_UBLOX) +#ifdef PIN_GPS_REINIT + //The L76K GNSS on the T-Echo requires the RESET pin to be pulled LOW + digitalWrite(PIN_GPS_REINIT, 0); + pinMode(PIN_GPS_REINIT, OUTPUT); + delay(150); //The L76K datasheet calls for at least 100MS delay + digitalWrite(PIN_GPS_REINIT, 1); +#endif + + // send the UBLOX Factory Reset Command regardless of detect state, something is very wrong, just assume it's UBLOX. // Factory Reset byte _message_reset[] = {0xB5, 0x62, 0x06, 0x09, 0x0D, 0x00, 0xFF, 0xFB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x17, 0x2B, 0x7E}; _serial_gps->write(_message_reset,sizeof(_message_reset)); delay(1000); -#endif return true; } diff --git a/variants/t-echo/variant.h b/variants/t-echo/variant.h index 353c47ae0..bfcff0d3b 100644 --- a/variants/t-echo/variant.h +++ b/variants/t-echo/variant.h @@ -168,6 +168,9 @@ External serial flash WP25R1635FZUIL0 * GPS pins */ +#define GPS_L76K +#define PIN_GPS_REINIT (32 + 5) // An output to reset L76K GPS. As per datasheet, low for > 100ms will reset the L76K + #define PIN_GPS_WAKE (32 + 2) // An output to wake GPS, low means allow sleep, high means force wake // Seems to be missing on this new board // #define PIN_GPS_PPS (32 + 4) // Pulse per second input from the GPS diff --git a/variants/tbeam_v07/variant.h b/variants/tbeam_v07/variant.h index 359641aa4..17a6e8e87 100644 --- a/variants/tbeam_v07/variant.h +++ b/variants/tbeam_v07/variant.h @@ -17,4 +17,5 @@ #undef GPS_RX_PIN #undef GPS_TX_PIN #define GPS_RX_PIN 12 -#define GPS_TX_PIN 15 \ No newline at end of file +#define GPS_TX_PIN 15 +#define GPS_UBLOX \ No newline at end of file