diff --git a/src/gps/GPS.cpp b/src/gps/GPS.cpp index 274d497ba..9f6499a4f 100644 --- a/src/gps/GPS.cpp +++ b/src/gps/GPS.cpp @@ -512,6 +512,8 @@ bool GPS::setup() speedSelect = 0; ++probeTries; } + } else { + currentStep = 0; } } // Rare Serial Speeds @@ -523,6 +525,8 @@ bool GPS::setup() LOG_WARN("Give up on GPS probe and set to %d", GPS_BAUDRATE); return true; } + } else { + currentStep = 0; } } #endif @@ -539,86 +543,133 @@ bool GPS::setup() * t-beam-s3-core uses the same L76K GNSS module as t-echo. * Unlike t-echo, L76K uses 9600 baud rate for communication by default. * */ - - // Initialize the L76K Chip, use GPS + GLONASS + BEIDOU - _serial_gps->write("$PCAS04,7*1E\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); + if (currentStep == 0) { + // Initialize the L76K Chip, use GPS + GLONASS + BEIDOU + _serial_gps->write("$PCAS04,7*1E\r\n"); + currentStep++; + currentDelay = 250; + return false; + } else if (currentStep == 1) { + // 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"); + currentStep++; + currentDelay = 250; + return false; + } else if (currentStep == 2) { + // Switch to Vehicle Mode, since SoftRF enables Aviation < 2g + _serial_gps->write("$PCAS11,3*1E\r\n"); + currentDelay = 250; + } } else if (gnssModel == GNSS_MODEL_MTK_L76B) { // Waveshare Pico-GPS hat uses the L76B with 9600 baud // Initialize the L76B Chip, use GPS + GLONASS // See note in L76_Series_GNSS_Protocol_Specification, chapter 3.29 - _serial_gps->write("$PMTK353,1,1,0,0,0*2B\r\n"); - // Above command will reset the GPS and takes longer before it will accept new commands - delay(1000); - // only ask for RMC and GGA (GNRMC and GNGGA) - // See note in L76_Series_GNSS_Protocol_Specification, chapter 2.1 - _serial_gps->write("$PMTK314,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*28\r\n"); - delay(250); - // Enable SBAS - _serial_gps->write("$PMTK301,2*2E\r\n"); - delay(250); - // Enable PPS for 2D/3D fix only - _serial_gps->write("$PMTK285,3,100*3F\r\n"); - delay(250); - // Switch to Fitness Mode, for running and walking purpose with low speed (<5 m/s) - _serial_gps->write("$PMTK886,1*29\r\n"); - delay(250); + if (currentStep == 0) { + _serial_gps->write("$PMTK353,1,1,0,0,0*2B\r\n"); + currentStep++; + currentDelay = 1000; + return false; + } else if (currentStep == 1) { + // Above command will reset the GPS and takes longer before it will accept new commands + // only ask for RMC and GGA (GNRMC and GNGGA) + // See note in L76_Series_GNSS_Protocol_Specification, chapter 2.1 + _serial_gps->write("$PMTK314,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*28\r\n"); + currentStep++; + currentDelay = 250; + return false; + } else if (currentStep == 2) { + // Enable SBAS + _serial_gps->write("$PMTK301,2*2E\r\n"); + currentStep++; + currentDelay = 250; + return false; + } else if (currentStep == 3) { + // Enable PPS for 2D/3D fix only + _serial_gps->write("$PMTK285,3,100*3F\r\n"); + currentStep++; + currentDelay = 250; + return false; + } else if (currentStep == 4) { + // Switch to Fitness Mode, for running and walking purpose with low speed (<5 m/s) + _serial_gps->write("$PMTK886,1*29\r\n"); + currentDelay = 250; + } } else if (gnssModel == GNSS_MODEL_MTK_PA1010D) { // PA1010D is used in the Pimoroni GPS board. - - // Enable all constellations. - _serial_gps->write("$PMTK353,1,1,1,1,1*2A\r\n"); - // Above command will reset the GPS and takes longer before it will accept new commands - delay(1000); - // Only ask for RMC and GGA (GNRMC and GNGGA) - _serial_gps->write("$PMTK314,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*28\r\n"); - delay(250); - // Enable SBAS / WAAS - _serial_gps->write("$PMTK301,2*2E\r\n"); - delay(250); + if (currentStep == 0) { + // Enable all constellations. + _serial_gps->write("$PMTK353,1,1,1,1,1*2A\r\n"); + currentStep++; + currentDelay = 1000; + return false; + } else if (currentStep == 1) { + // Above command will reset the GPS and takes longer before it will accept new commands + // Only ask for RMC and GGA (GNRMC and GNGGA) + _serial_gps->write("$PMTK314,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*28\r\n"); + currentStep++; + currentDelay = 250; + return false; + } else if (currentStep == 2) { + // Enable SBAS / WAAS + _serial_gps->write("$PMTK301,2*2E\r\n"); + currentDelay = 250; + } } else if (gnssModel == GNSS_MODEL_MTK_PA1616S) { // PA1616S is used in some GPS breakout boards from Adafruit // PA1616S does not have GLONASS capability. PA1616D does, but is not implemented here. - _serial_gps->write("$PMTK353,1,0,0,0,0*2A\r\n"); - // Above command will reset the GPS and takes longer before it will accept new commands - delay(1000); - // Only ask for RMC and GGA (GNRMC and GNGGA) - _serial_gps->write("$PMTK314,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*28\r\n"); - delay(250); - // Enable SBAS / WAAS - _serial_gps->write("$PMTK301,2*2E\r\n"); - delay(250); + if (currentStep == 0) { + _serial_gps->write("$PMTK353,1,0,0,0,0*2A\r\n"); + currentStep++; + currentDelay = 1000; + return false; + } else if (currentStep == 1) { + // Above command will reset the GPS and takes longer before it will accept new commands + // Only ask for RMC and GGA (GNRMC and GNGGA) + _serial_gps->write("$PMTK314,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*28\r\n"); + currentStep++; + currentDelay = 250; + return false; + } else if (currentStep == 2) { + // Enable SBAS / WAAS + _serial_gps->write("$PMTK301,2*2E\r\n"); + currentDelay = 250; + } } else if (gnssModel == GNSS_MODEL_ATGM336H) { - // Set the initial configuration of the device - these _should_ work for most AT6558 devices - msglen = makeCASPacket(0x06, 0x07, sizeof(_message_CAS_CFG_NAVX_CONF), _message_CAS_CFG_NAVX_CONF); - _serial_gps->write(UBXscratch, msglen); - if (getACKCas(0x06, 0x07, 250) != GNSS_RESPONSE_OK) { - LOG_WARN("ATGM336H: Could not set Config"); - } - - // Set the update frequency to 1Hz - msglen = makeCASPacket(0x06, 0x04, sizeof(_message_CAS_CFG_RATE_1HZ), _message_CAS_CFG_RATE_1HZ); - _serial_gps->write(UBXscratch, msglen); - if (getACKCas(0x06, 0x04, 250) != GNSS_RESPONSE_OK) { - LOG_WARN("ATGM336H: Could not set Update Frequency"); - } - - // Set the NEMA output messages - // Ask for only RMC and GGA - uint8_t fields[] = {CAS_NEMA_RMC, CAS_NEMA_GGA}; - for (unsigned int i = 0; i < sizeof(fields); i++) { + if (currentStep == 0) { + // Set the initial configuration of the device - these _should_ work for most AT6558 devices + msglen = makeCASPacket(0x06, 0x07, sizeof(_message_CAS_CFG_NAVX_CONF), _message_CAS_CFG_NAVX_CONF); + _serial_gps->write(UBXscratch, msglen); + if (getACKCas(0x06, 0x07, 250) != GNSS_RESPONSE_OK) { + LOG_WARN("ATGM336H: Could not set Config"); + } + currentStep++; + return false; + } else if (currentStep == 1) { + // Set the update frequency to 1Hz + msglen = makeCASPacket(0x06, 0x04, sizeof(_message_CAS_CFG_RATE_1HZ), _message_CAS_CFG_RATE_1HZ); + _serial_gps->write(UBXscratch, msglen); + if (getACKCas(0x06, 0x04, 250) != GNSS_RESPONSE_OK) { + LOG_WARN("ATGM336H: Could not set Update Frequency"); + } + currentStep++; + return false; + } else if (currentStep == 2) { + // Set the NEMA output messages - Ask for only RMC and GGA // Construct a CAS-CFG-MSG packet - uint8_t cas_cfg_msg_packet[] = {0x4e, fields[i], 0x01, 0x00}; + uint8_t cas_cfg_msg_packet[] = {0x4e, CAS_NEMA_RMC, 0x01, 0x00}; msglen = makeCASPacket(0x06, 0x01, sizeof(cas_cfg_msg_packet), cas_cfg_msg_packet); _serial_gps->write(UBXscratch, msglen); if (getACKCas(0x06, 0x01, 250) != GNSS_RESPONSE_OK) { - LOG_WARN("ATGM336H: Could not enable NMEA MSG: %d", fields[i]); + LOG_WARN("ATGM336H: Could not enable NMEA MSG: %d", CAS_NEMA_RMC); + } + currentStep++; + return false; + } else if (currentStep == 3) { + uint8_t cas_cfg_msg_packet[] = {0x4e, CAS_NEMA_GGA, 0x01, 0x00}; + msglen = makeCASPacket(0x06, 0x01, sizeof(cas_cfg_msg_packet), cas_cfg_msg_packet); + _serial_gps->write(UBXscratch, msglen); + if (getACKCas(0x06, 0x01, 250) != GNSS_RESPONSE_OK) { + LOG_WARN("ATGM336H: Could not enable NMEA MSG: %d", CAS_NEMA_GGA); } } } else if (gnssModel == GNSS_MODEL_UC6580) { @@ -626,195 +677,363 @@ bool GPS::setup() // use GPS L1 & L5 + BDS B1I & B2a + GLONASS L1 + GALILEO E1 & E5a + SBAS + QZSS // This will reset the receiver, so wait a bit afterwards // The paranoid will wait for the OK*04 confirmation response after each command. - _serial_gps->write("$CFGSYS,h35155\r\n"); - delay(750); - // Must be done after the CFGSYS command - // Turn off GSV messages, we don't really care about which and where the sats are, maybe someday. - _serial_gps->write("$CFGMSG,0,3,0\r\n"); - delay(250); - // Turn off GSA messages, TinyGPS++ doesn't use this message. - _serial_gps->write("$CFGMSG,0,2,0\r\n"); - delay(250); - // Turn off NOTICE __TXT messages, these may provide Unicore some info but we don't care. - _serial_gps->write("$CFGMSG,6,0,0\r\n"); - delay(250); - _serial_gps->write("$CFGMSG,6,1,0\r\n"); - delay(250); + if (currentStep == 0) { + _serial_gps->write("$CFGSYS,h35155\r\n"); + currentStep++; + currentDelay = 750; + return false; + } else if (currentStep == 1) { + // Must be done after the CFGSYS command + // Turn off GSV messages, we don't really care about which and where the sats are, maybe someday. + _serial_gps->write("$CFGMSG,0,3,0\r\n"); + currentStep++; + currentDelay = 250; + return false; + } else if (currentStep == 2) { + // Turn off GSA messages, TinyGPS++ doesn't use this message. + _serial_gps->write("$CFGMSG,0,2,0\r\n"); + currentStep++; + currentDelay = 250; + return false; + } else if (currentStep == 3) { + // Turn off NOTICE __TXT messages, these may provide Unicore some info but we don't care. + _serial_gps->write("$CFGMSG,6,0,0\r\n"); + currentStep++; + currentDelay = 250; + return false; + } else if (currentStep == 4) { + _serial_gps->write("$CFGMSG,6,1,0\r\n"); + currentDelay = 250; + } } else if (IS_ONE_OF(gnssModel, GNSS_MODEL_AG3335, GNSS_MODEL_AG3352)) { - - if (config.lora.region == meshtastic_Config_LoRaConfig_RegionCode_IN || - config.lora.region == meshtastic_Config_LoRaConfig_RegionCode_NP_865) { - _serial_gps->write("$PAIR066,1,0,1,0,0,1*3B\r\n"); // Enable GPS+GALILEO+NAVIC - // GPS GLONASS GALILEO BDS QZSS NAVIC - // 1 0 1 0 0 1 - } else { - _serial_gps->write("$PAIR066,1,1,1,1,0,0*3A\r\n"); // Enable GPS+GLONASS+GALILEO+BDS - // GPS GLONASS GALILEO BDS QZSS NAVIC - // 1 1 1 1 0 0 + if (currentStep == 0) { + if (config.lora.region == meshtastic_Config_LoRaConfig_RegionCode_IN || + config.lora.region == meshtastic_Config_LoRaConfig_RegionCode_NP_865) { + _serial_gps->write("$PAIR066,1,0,1,0,0,1*3B\r\n"); // Enable GPS+GALILEO+NAVIC + // GPS GLONASS GALILEO BDS QZSS NAVIC + // 1 0 1 0 0 1 + } else { + _serial_gps->write("$PAIR066,1,1,1,1,0,0*3A\r\n"); // Enable GPS+GLONASS+GALILEO+BDS + // GPS GLONASS GALILEO BDS QZSS NAVIC + // 1 1 1 1 0 0 + } + currentStep++; + return false; + } else if (currentStep == 1) { + // Configure NMEA (sentences will output once per fix) + _serial_gps->write("$PAIR062,0,1*3F\r\n"); // GGA ON + currentStep++; + return false; + } else if (currentStep == 2) { + _serial_gps->write("$PAIR062,1,0*3F\r\n"); // GLL OFF + currentStep++; + return false; + } else if (currentStep == 3) { + _serial_gps->write("$PAIR062,2,0*3C\r\n"); // GSA OFF + currentStep++; + return false; + } else if (currentStep == 4) { + _serial_gps->write("$PAIR062,3,0*3D\r\n"); // GSV OFF + currentStep++; + return false; + } else if (currentStep == 5) { + _serial_gps->write("$PAIR062,4,1*3B\r\n"); // RMC ON + currentStep++; + return false; + } else if (currentStep == 6) { + _serial_gps->write("$PAIR062,5,0*3B\r\n"); // VTG OFF + currentStep++; + return false; + } else if (currentStep == 7) { + _serial_gps->write("$PAIR062,6,0*38\r\n"); // ZDA ON + currentStep++; + currentDelay = 250; + return false; + } else if (currentStep == 8) { + _serial_gps->write("$PAIR513*3D\r\n"); // save configuration } - // Configure NMEA (sentences will output once per fix) - _serial_gps->write("$PAIR062,0,1*3F\r\n"); // GGA ON - _serial_gps->write("$PAIR062,1,0*3F\r\n"); // GLL OFF - _serial_gps->write("$PAIR062,2,0*3C\r\n"); // GSA OFF - _serial_gps->write("$PAIR062,3,0*3D\r\n"); // GSV OFF - _serial_gps->write("$PAIR062,4,1*3B\r\n"); // RMC ON - _serial_gps->write("$PAIR062,5,0*3B\r\n"); // VTG OFF - _serial_gps->write("$PAIR062,6,0*38\r\n"); // ZDA ON - - delay(250); - _serial_gps->write("$PAIR513*3D\r\n"); // save configuration } else if (gnssModel == GNSS_MODEL_UBLOX6) { - clearBuffer(); - SEND_UBX_PACKET(0x06, 0x02, _message_DISABLE_TXT_INFO, "disable text info messages", 500); - SEND_UBX_PACKET(0x06, 0x39, _message_JAM_6_7, "enable interference resistance", 500); - SEND_UBX_PACKET(0x06, 0x23, _message_NAVX5, "configure NAVX5 settings", 500); - - // Turn off unwanted NMEA messages, set update rate - SEND_UBX_PACKET(0x06, 0x08, _message_1HZ, "set GPS update rate", 500); - SEND_UBX_PACKET(0x06, 0x01, _message_GLL, "disable NMEA GLL", 500); - SEND_UBX_PACKET(0x06, 0x01, _message_GSA, "enable NMEA GSA", 500); - SEND_UBX_PACKET(0x06, 0x01, _message_GSV, "disable NMEA GSV", 500); - SEND_UBX_PACKET(0x06, 0x01, _message_VTG, "disable NMEA VTG", 500); - SEND_UBX_PACKET(0x06, 0x01, _message_RMC, "enable NMEA RMC", 500); - SEND_UBX_PACKET(0x06, 0x01, _message_GGA, "enable NMEA GGA", 500); - - clearBuffer(); - SEND_UBX_PACKET(0x06, 0x11, _message_CFG_RXM_ECO, "enable powersave ECO mode for Neo-6", 500); - SEND_UBX_PACKET(0x06, 0x3B, _message_CFG_PM2, "enable powersave details for GPS", 500); - SEND_UBX_PACKET(0x06, 0x01, _message_AID, "disable UBX-AID", 500); - - msglen = makeUBXPacket(0x06, 0x09, sizeof(_message_SAVE), _message_SAVE); - _serial_gps->write(UBXscratch, msglen); - if (getACK(0x06, 0x09, 2000) != GNSS_RESPONSE_OK) { - LOG_WARN("Unable to save GNSS module config"); - } else { - LOG_INFO("GNSS module config saved!"); + if (currentStep == 0) { + clearBuffer(); + SEND_UBX_PACKET(0x06, 0x02, _message_DISABLE_TXT_INFO, "disable text info messages", 500); + currentStep++; + return false; + } else if (currentStep == 1) { + SEND_UBX_PACKET(0x06, 0x39, _message_JAM_6_7, "enable interference resistance", 500); + currentStep++; + return false; + } else if (currentStep == 2) { + SEND_UBX_PACKET(0x06, 0x23, _message_NAVX5, "configure NAVX5 settings", 500); + currentStep++; + return false; + } else if (currentStep == 3) { + // Turn off unwanted NMEA messages, set update rate + SEND_UBX_PACKET(0x06, 0x08, _message_1HZ, "set GPS update rate", 500); + currentStep++; + return false; + } else if (currentStep == 4) { + SEND_UBX_PACKET(0x06, 0x01, _message_GLL, "disable NMEA GLL", 500); + currentStep++; + return false; + } else if (currentStep == 5) { + SEND_UBX_PACKET(0x06, 0x01, _message_GSA, "enable NMEA GSA", 500); + currentStep++; + return false; + } else if (currentStep == 6) { + SEND_UBX_PACKET(0x06, 0x01, _message_GSV, "disable NMEA GSV", 500); + currentStep++; + return false; + } else if (currentStep == 7) { + SEND_UBX_PACKET(0x06, 0x01, _message_VTG, "disable NMEA VTG", 500); + currentStep++; + return false; + } else if (currentStep == 8) { + SEND_UBX_PACKET(0x06, 0x01, _message_RMC, "enable NMEA RMC", 500); + currentStep++; + return false; + } else if (currentStep == 9) { + SEND_UBX_PACKET(0x06, 0x01, _message_GGA, "enable NMEA GGA", 500); + currentStep++; + return false; + } else if (currentStep == 10) { + clearBuffer(); + SEND_UBX_PACKET(0x06, 0x11, _message_CFG_RXM_ECO, "enable powersave ECO mode for Neo-6", 500); + currentStep++; + return false; + } else if (currentStep == 11) { + SEND_UBX_PACKET(0x06, 0x3B, _message_CFG_PM2, "enable powersave details for GPS", 500); + currentStep++; + return false; + } else if (currentStep == 12) { + SEND_UBX_PACKET(0x06, 0x01, _message_AID, "disable UBX-AID", 500); + currentStep++; + return false; + } else if (currentStep == 13) { + msglen = makeUBXPacket(0x06, 0x09, sizeof(_message_SAVE), _message_SAVE); + _serial_gps->write(UBXscratch, msglen); + if (getACK(0x06, 0x09, 2000) != GNSS_RESPONSE_OK) { + LOG_WARN("Unable to save GNSS module config"); + } else { + LOG_INFO("GNSS module config saved!"); + } } } else if (IS_ONE_OF(gnssModel, GNSS_MODEL_UBLOX7, GNSS_MODEL_UBLOX8, GNSS_MODEL_UBLOX9)) { - if (gnssModel == GNSS_MODEL_UBLOX7) { - LOG_DEBUG("Set GPS+SBAS"); - msglen = makeUBXPacket(0x06, 0x3e, sizeof(_message_GNSS_7), _message_GNSS_7); - _serial_gps->write(UBXscratch, msglen); - } else { // 8,9 - msglen = makeUBXPacket(0x06, 0x3e, sizeof(_message_GNSS_8), _message_GNSS_8); - _serial_gps->write(UBXscratch, msglen); - } - - if (getACK(0x06, 0x3e, 800) == GNSS_RESPONSE_NAK) { - // It's not critical if the module doesn't acknowledge this configuration. - LOG_DEBUG("reconfigure GNSS - defaults maintained. Is this module GPS-only?"); - } else { + if (currentStep == 0) { if (gnssModel == GNSS_MODEL_UBLOX7) { - LOG_INFO("GPS+SBAS configured"); + LOG_DEBUG("Set GPS+SBAS"); + msglen = makeUBXPacket(0x06, 0x3e, sizeof(_message_GNSS_7), _message_GNSS_7); + _serial_gps->write(UBXscratch, msglen); } else { // 8,9 - LOG_INFO("GPS+SBAS+GLONASS+Galileo configured"); + msglen = makeUBXPacket(0x06, 0x3e, sizeof(_message_GNSS_8), _message_GNSS_8); + _serial_gps->write(UBXscratch, msglen); } - // Documentation say, we need wait at least 0.5s after reconfiguration of GNSS module, before sending next - // commands for the M8 it tends to be more... 1 sec should be enough ;>) - delay(1000); - } - - // Disable Text Info messages //6,7,8,9 - clearBuffer(); - SEND_UBX_PACKET(0x06, 0x02, _message_DISABLE_TXT_INFO, "disable text info messages", 500); - - if (gnssModel == GNSS_MODEL_UBLOX8) { // 8 + if (getACK(0x06, 0x3e, 800) == GNSS_RESPONSE_NAK) { + // It's not critical if the module doesn't acknowledge this configuration. + LOG_DEBUG("reconfigure GNSS - defaults maintained. Is this module GPS-only?"); + } else { + if (gnssModel == GNSS_MODEL_UBLOX7) { + LOG_INFO("GPS+SBAS configured"); + } else { // 8,9 + LOG_INFO("GPS+SBAS+GLONASS+Galileo configured"); + } + // Documentation say, we need wait at least 0.5s after reconfiguration of GNSS module, before sending next + // commands for the M8 it tends to be more... 1 sec should be enough ;>) + delay(1000); + } + currentStep++; + return false; + } else if (currentStep == 1) { + // Disable Text Info messages //6,7,8,9 clearBuffer(); - SEND_UBX_PACKET(0x06, 0x39, _message_JAM_8, "enable interference resistance", 500); - - clearBuffer(); - SEND_UBX_PACKET(0x06, 0x23, _message_NAVX5_8, "configure NAVX5_8 settings", 500); - } else { // 6,7,9 - SEND_UBX_PACKET(0x06, 0x39, _message_JAM_6_7, "enable interference resistance", 500); - SEND_UBX_PACKET(0x06, 0x23, _message_NAVX5, "configure NAVX5 settings", 500); - } - // Turn off unwanted NMEA messages, set update rate - SEND_UBX_PACKET(0x06, 0x08, _message_1HZ, "set GPS update rate", 500); - SEND_UBX_PACKET(0x06, 0x01, _message_GLL, "disable NMEA GLL", 500); - SEND_UBX_PACKET(0x06, 0x01, _message_GSA, "enable NMEA GSA", 500); - SEND_UBX_PACKET(0x06, 0x01, _message_GSV, "disable NMEA GSV", 500); - SEND_UBX_PACKET(0x06, 0x01, _message_VTG, "disable NMEA VTG", 500); - SEND_UBX_PACKET(0x06, 0x01, _message_RMC, "enable NMEA RMC", 500); - SEND_UBX_PACKET(0x06, 0x01, _message_GGA, "enable NMEA GGA", 500); - - if (ublox_info.protocol_version >= 18) { - clearBuffer(); - SEND_UBX_PACKET(0x06, 0x86, _message_PMS, "enable powersave for GPS", 500); + SEND_UBX_PACKET(0x06, 0x02, _message_DISABLE_TXT_INFO, "disable text info messages", 500); + currentStep++; + return false; + } else if (currentStep == 2) { + if (gnssModel == GNSS_MODEL_UBLOX8) { // 8 + clearBuffer(); + SEND_UBX_PACKET(0x06, 0x39, _message_JAM_8, "enable interference resistance", 500); + } else { // 7,9 + SEND_UBX_PACKET(0x06, 0x39, _message_JAM_6_7, "enable interference resistance", 500); + } + currentStep++; + return false; + } else if (currentStep == 3) { + if (gnssModel == GNSS_MODEL_UBLOX8) { // 8 + clearBuffer(); + SEND_UBX_PACKET(0x06, 0x23, _message_NAVX5_8, "configure NAVX5_8 settings", 500); + } else { // 7,9 + SEND_UBX_PACKET(0x06, 0x23, _message_NAVX5, "configure NAVX5 settings", 500); + } + currentStep++; + return false; + } else if (currentStep == 4) { + // Turn off unwanted NMEA messages, set update rate + SEND_UBX_PACKET(0x06, 0x08, _message_1HZ, "set GPS update rate", 500); + currentStep++; + return false; + } else if (currentStep == 5) { + SEND_UBX_PACKET(0x06, 0x01, _message_GLL, "disable NMEA GLL", 500); + currentStep++; + return false; + } else if (currentStep == 6) { + SEND_UBX_PACKET(0x06, 0x01, _message_GSA, "enable NMEA GSA", 500); + currentStep++; + return false; + } else if (currentStep == 7) { + SEND_UBX_PACKET(0x06, 0x01, _message_GSV, "disable NMEA GSV", 500); + currentStep++; + return false; + } else if (currentStep == 8) { + SEND_UBX_PACKET(0x06, 0x01, _message_VTG, "disable NMEA VTG", 500); + currentStep++; + return false; + } else if (currentStep == 9) { + SEND_UBX_PACKET(0x06, 0x01, _message_RMC, "enable NMEA RMC", 500); + currentStep++; + return false; + } else if (currentStep == 10) { + SEND_UBX_PACKET(0x06, 0x01, _message_GGA, "enable NMEA GGA", 500); + currentStep++; + return false; + } else if (currentStep == 11) { + if (ublox_info.protocol_version >= 18) { + clearBuffer(); + SEND_UBX_PACKET(0x06, 0x86, _message_PMS, "enable powersave for GPS", 500); + } else { + SEND_UBX_PACKET(0x06, 0x11, _message_CFG_RXM_PSM, "enable powersave mode for GPS", 500); + } + currentStep++; + return false; + } else if (currentStep == 12) { SEND_UBX_PACKET(0x06, 0x3B, _message_CFG_PM2, "enable powersave details for GPS", 500); - + currentStep++; + return false; + } else if (currentStep == 13) { // For M8 we want to enable NMEA version 4.10 so we can see the additional sats. - if (gnssModel == GNSS_MODEL_UBLOX8) { + if (ublox_info.protocol_version >= 18 && gnssModel == GNSS_MODEL_UBLOX8) { clearBuffer(); SEND_UBX_PACKET(0x06, 0x17, _message_NMEA, "enable NMEA 4.10", 500); + currentStep++; + return false; + } + msglen = makeUBXPacket(0x06, 0x09, sizeof(_message_SAVE), _message_SAVE); + _serial_gps->write(UBXscratch, msglen); + if (getACK(0x06, 0x09, 2000) != GNSS_RESPONSE_OK) { + LOG_WARN("Unable to save GNSS module config"); + } else { + LOG_INFO("GNSS module configuration saved!"); + } + } else if (currentStep == 14) { + msglen = makeUBXPacket(0x06, 0x09, sizeof(_message_SAVE), _message_SAVE); + _serial_gps->write(UBXscratch, msglen); + if (getACK(0x06, 0x09, 2000) != GNSS_RESPONSE_OK) { + LOG_WARN("Unable to save GNSS module config"); + } else { + LOG_INFO("GNSS module configuration saved!"); } - } else { - SEND_UBX_PACKET(0x06, 0x11, _message_CFG_RXM_PSM, "enable powersave mode for GPS", 500); - SEND_UBX_PACKET(0x06, 0x3B, _message_CFG_PM2, "enable powersave details for GPS", 500); - } - - msglen = makeUBXPacket(0x06, 0x09, sizeof(_message_SAVE), _message_SAVE); - _serial_gps->write(UBXscratch, msglen); - if (getACK(0x06, 0x09, 2000) != GNSS_RESPONSE_OK) { - LOG_WARN("Unable to save GNSS module config"); - } else { - LOG_INFO("GNSS module configuration saved!"); } } else if (gnssModel == GNSS_MODEL_UBLOX10) { - delay(1000); - clearBuffer(); - SEND_UBX_PACKET(0x06, 0x8A, _message_VALSET_DISABLE_NMEA_RAM, "disable NMEA messages in M10 RAM", 300); - delay(750); - clearBuffer(); - SEND_UBX_PACKET(0x06, 0x8A, _message_VALSET_DISABLE_NMEA_BBR, "disable NMEA messages in M10 BBR", 300); - delay(750); - clearBuffer(); - SEND_UBX_PACKET(0x06, 0x8A, _message_VALSET_DISABLE_TXT_INFO_RAM, "disable Info messages for M10 GPS RAM", 300); - delay(750); - // Next disable Info txt messages in BBR layer - clearBuffer(); - SEND_UBX_PACKET(0x06, 0x8A, _message_VALSET_DISABLE_TXT_INFO_BBR, "disable Info messages for M10 GPS BBR", 300); - delay(750); - // Do M10 configuration for Power Management. - SEND_UBX_PACKET(0x06, 0x8A, _message_VALSET_PM_RAM, "enable powersave for M10 GPS RAM", 300); - delay(750); - SEND_UBX_PACKET(0x06, 0x8A, _message_VALSET_PM_BBR, "enable powersave for M10 GPS BBR", 300); - delay(750); - SEND_UBX_PACKET(0x06, 0x8A, _message_VALSET_ITFM_RAM, "enable jam detection M10 GPS RAM", 300); - delay(750); - SEND_UBX_PACKET(0x06, 0x8A, _message_VALSET_ITFM_BBR, "enable jam detection M10 GPS BBR", 300); - delay(750); - // Here is where the init commands should go to do further M10 initialization. - SEND_UBX_PACKET(0x06, 0x8A, _message_VALSET_DISABLE_SBAS_RAM, "disable SBAS M10 GPS RAM", 300); - delay(750); // will cause a receiver restart so wait a bit - SEND_UBX_PACKET(0x06, 0x8A, _message_VALSET_DISABLE_SBAS_BBR, "disable SBAS M10 GPS BBR", 300); - delay(750); // will cause a receiver restart so wait a bit - - // Done with initialization, Now enable wanted NMEA messages in BBR layer so they will survive a periodic - // sleep. - SEND_UBX_PACKET(0x06, 0x8A, _message_VALSET_ENABLE_NMEA_BBR, "enable messages for M10 GPS BBR", 300); - delay(750); - // Next enable wanted NMEA messages in RAM layer - SEND_UBX_PACKET(0x06, 0x8A, _message_VALSET_ENABLE_NMEA_RAM, "enable messages for M10 GPS RAM", 500); - delay(750); - - // As the M10 has no flash, the best we can do to preserve the config is to set it in RAM and BBR. - // BBR will survive a restart, and power off for a while, but modules with small backup - // batteries or super caps will not retain the config for a long power off time. - msglen = makeUBXPacket(0x06, 0x09, sizeof(_message_SAVE_10), _message_SAVE_10); - _serial_gps->write(UBXscratch, msglen); - if (getACK(0x06, 0x09, 2000) != GNSS_RESPONSE_OK) { - LOG_WARN("Unable to save GNSS module config"); - } else { - LOG_INFO("GNSS module configuration saved!"); + if (currentStep == 0) { + LOG_INFO("Configuring M10 GPS step 0"); + delay(1000); + clearBuffer(); + SEND_UBX_PACKET(0x06, 0x8A, _message_VALSET_DISABLE_NMEA_RAM, "disable NMEA messages in M10 RAM", 300); + currentStep++; + currentDelay = 750; + return false; + } else if (currentStep == 1) { + LOG_INFO("Configuring M10 GPS step 1"); + clearBuffer(); + SEND_UBX_PACKET(0x06, 0x8A, _message_VALSET_DISABLE_NMEA_BBR, "disable NMEA messages in M10 BBR", 300); + currentStep++; + currentDelay = 750; + return false; + } else if (currentStep == 2) { + clearBuffer(); + SEND_UBX_PACKET(0x06, 0x8A, _message_VALSET_DISABLE_TXT_INFO_RAM, "disable Info messages for M10 GPS RAM", 300); + currentStep++; + currentDelay = 750; + return false; + } else if (currentStep == 3) { + // Next disable Info txt messages in BBR layer + clearBuffer(); + SEND_UBX_PACKET(0x06, 0x8A, _message_VALSET_DISABLE_TXT_INFO_BBR, "disable Info messages for M10 GPS BBR", 300); + currentStep++; + currentDelay = 750; + return false; + } else if (currentStep == 4) { + // Do M10 configuration for Power Management. + SEND_UBX_PACKET(0x06, 0x8A, _message_VALSET_PM_RAM, "enable powersave for M10 GPS RAM", 300); + currentStep++; + currentDelay = 750; + return false; + } else if (currentStep == 5) { + // Next enable powersave in BBR layer + SEND_UBX_PACKET(0x06, 0x8A, _message_VALSET_PM_BBR, "enable powersave for M10 GPS BBR", 300); + currentStep++; + currentDelay = 750; + return false; + } else if (currentStep == 6) { + SEND_UBX_PACKET(0x06, 0x8A, _message_VALSET_ITFM_RAM, "enable jam detection M10 GPS RAM", 300); + currentStep++; + currentDelay = 750; + return false; + } else if (currentStep == 7) { + SEND_UBX_PACKET(0x06, 0x8A, _message_VALSET_ITFM_BBR, "enable jam detection M10 GPS BBR", 300); + currentStep++; + currentDelay = 750; + return false; + } else if (currentStep == 8) { + // Here is where the init commands should go to do further M10 initialization. + SEND_UBX_PACKET(0x06, 0x8A, _message_VALSET_DISABLE_SBAS_RAM, "disable SBAS M10 GPS RAM", 300); + currentStep++; + currentDelay = 750; + return false; + } else if (currentStep == 9) { + // will cause a receiver restart so wait a bit + SEND_UBX_PACKET(0x06, 0x8A, _message_VALSET_DISABLE_SBAS_BBR, "disable SBAS M10 GPS BBR", 300); + currentStep++; + currentDelay = 750; + return false; + } else if (currentStep == 10) { + // Done with initialization, Now enable wanted NMEA messages in BBR layer so they will survive a periodic + // sleep. + SEND_UBX_PACKET(0x06, 0x8A, _message_VALSET_ENABLE_NMEA_BBR, "enable messages for M10 GPS BBR", 300); + currentStep++; + currentDelay = 750; + return false; + } else if (currentStep == 11) { + // Next enable wanted NMEA messages in RAM layer + SEND_UBX_PACKET(0x06, 0x8A, _message_VALSET_ENABLE_NMEA_RAM, "enable messages for M10 GPS RAM", 500); + currentStep++; + currentDelay = 750; + return false; + } else if (currentStep == 12) { + // As the M10 has no flash, the best we can do to preserve the config is to set it in RAM and BBR. + // BBR will survive a restart, and power off for a while, but modules with small backup + // batteries or super caps will not retain the config for a long power off time. + msglen = makeUBXPacket(0x06, 0x09, sizeof(_message_SAVE_10), _message_SAVE_10); + _serial_gps->write(UBXscratch, msglen); + if (getACK(0x06, 0x09, 2000) != GNSS_RESPONSE_OK) { + LOG_WARN("Unable to save GNSS module config"); + } else { + LOG_INFO("GNSS module configuration saved!"); + } + didSerialInit = true; } } else if (gnssModel == GNSS_MODEL_CM121) { // only ask for RMC and GGA - // enable GGA - _serial_gps->write("$CFGMSG,0,0,1,1*1B\r\n"); - delay(250); - // enable RMC - _serial_gps->write("$CFGMSG,0,4,1,1*1F\r\n"); - delay(250); + if (currentStep == 0) { + // enable GGA + _serial_gps->write("$CFGMSG,0,0,1,1*1B\r\n"); + currentStep++; + currentDelay = 250; + return false; + } else if (currentStep == 1) { + // enable RMC + _serial_gps->write("$CFGMSG,0,4,1,1*1F\r\n"); + currentDelay = 250; + } } didSerialInit = true; }