mirror of
https://github.com/meshtastic/firmware.git
synced 2025-06-09 14:42:05 +00:00
Make Ublox code more readable (#4727)
* Simplify Ublox code Ublox comes in a myriad of versions and settings. Presently our configuration code does a lot of branching based on versions being or not being present. This patch adds version detection earlier in the piece and branches on the set gnssModel instead to create separate setup methods for Ublox 6, Ublox 7/8/9, and Ublox10. Additionally, adds a macro to make the code much shorter and more readable. * Make trunk happy * Make trunk happy --------- Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
This commit is contained in:
parent
7db98ca1da
commit
2e24d244be
410
src/gps/GPS.cpp
410
src/gps/GPS.cpp
@ -525,268 +525,144 @@ bool GPS::setup()
|
|||||||
|
|
||||||
delay(250);
|
delay(250);
|
||||||
_serial_gps->write("$PAIR513*3D\r\n"); // save configuration
|
_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, "Unable to disable text info messages.\n", 500);
|
||||||
|
SEND_UBX_PACKET(0x06, 0x39, _message_JAM_6_7, "Unable to enable interference resistance.\n", 500);
|
||||||
|
SEND_UBX_PACKET(0x06, 0x23, _message_NAVX5, "Unable to configure NAVX5 settings.\n", 500);
|
||||||
|
|
||||||
} else if (gnssModel == GNSS_MODEL_UBLOX) {
|
// Turn off unwanted NMEA messages, set update rate
|
||||||
// Configure GNSS system to GPS+SBAS+GLONASS (Module may restart after this command)
|
SEND_UBX_PACKET(0x06, 0x08, _message_1HZ, "Unable to set GPS update rate.\n", 500);
|
||||||
// We need set it because by default it is GPS only, and we want to use GLONASS too
|
SEND_UBX_PACKET(0x06, 0x01, _message_GLL, "Unable to disable NMEA GLL.\n", 500);
|
||||||
// Also we need SBAS for better accuracy and extra features
|
SEND_UBX_PACKET(0x06, 0x01, _message_GSA, "Unable to Enable NMEA GSA.\n", 500);
|
||||||
// ToDo: Dynamic configure GNSS systems depending of LoRa region
|
SEND_UBX_PACKET(0x06, 0x01, _message_GSV, "Unable to disable NMEA GSV.\n", 500);
|
||||||
|
SEND_UBX_PACKET(0x06, 0x01, _message_VTG, "Unable to disable NMEA VTG.\n", 500);
|
||||||
|
SEND_UBX_PACKET(0x06, 0x01, _message_RMC, "Unable to enable NMEA RMC.\n", 500);
|
||||||
|
SEND_UBX_PACKET(0x06, 0x01, _message_GGA, "Unable to enable NMEA GGA.\n", 500);
|
||||||
|
|
||||||
if (strncmp(info.hwVersion, "000A0000", 8) != 0) {
|
clearBuffer();
|
||||||
if (strncmp(info.hwVersion, "00040007", 8) != 0) {
|
SEND_UBX_PACKET(0x06, 0x11, _message_CFG_RXM_ECO, "Unable to enable powersaving ECO mode for Neo-6.\n", 500);
|
||||||
// The original ublox Neo-6 is GPS only and doesn't support the UBX-CFG-GNSS message
|
SEND_UBX_PACKET(0x06, 0x3B, _message_CFG_PM2, "Unable to enable powersaving details for GPS.\n", 500);
|
||||||
// Max7 seems to only support GPS *or* GLONASS
|
SEND_UBX_PACKET(0x06, 0x01, _message_AID, "Unable to disable UBX-AID.\n", 500);
|
||||||
// Neo-7 is supposed to support GPS *and* GLONASS but NAKs the CFG-GNSS command to do it
|
|
||||||
// So treat all the u-blox 7 series as GPS only
|
|
||||||
// M8 can support 3 constallations at once so turn on GPS, GLONASS and Galileo (or BeiDou)
|
|
||||||
|
|
||||||
if (strncmp(info.hwVersion, "00070000", 8) == 0) {
|
msglen = makeUBXPacket(0x06, 0x09, sizeof(_message_SAVE), _message_SAVE);
|
||||||
LOG_DEBUG("Setting GPS+SBAS\n");
|
_serial_gps->write(UBXscratch, msglen);
|
||||||
msglen = makeUBXPacket(0x06, 0x3e, sizeof(_message_GNSS_7), _message_GNSS_7);
|
if (getACK(0x06, 0x09, 2000) != GNSS_RESPONSE_OK) {
|
||||||
_serial_gps->write(UBXscratch, msglen);
|
LOG_WARN("Unable to save GNSS module configuration.\n");
|
||||||
} else {
|
} else {
|
||||||
msglen = makeUBXPacket(0x06, 0x3e, sizeof(_message_GNSS_8), _message_GNSS_8);
|
LOG_INFO("GNSS module configuration saved!\n");
|
||||||
_serial_gps->write(UBXscratch, msglen);
|
}
|
||||||
}
|
} else if (gnssModel == GNSS_MODEL_UBLOX7 || gnssModel == GNSS_MODEL_UBLOX8 || gnssModel == GNSS_MODEL_UBLOX9) {
|
||||||
|
if (gnssModel == GNSS_MODEL_UBLOX7) {
|
||||||
|
LOG_DEBUG("Setting GPS+SBAS\n");
|
||||||
|
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) {
|
if (getACK(0x06, 0x3e, 800) == GNSS_RESPONSE_NAK) {
|
||||||
// It's not critical if the module doesn't acknowledge this configuration.
|
// It's not critical if the module doesn't acknowledge this configuration.
|
||||||
LOG_INFO("Unable to reconfigure GNSS - defaults maintained. Is this module GPS-only?\n");
|
LOG_INFO("Unable to reconfigure GNSS - defaults maintained. Is this module GPS-only?\n");
|
||||||
} else {
|
} else {
|
||||||
if (strncmp(info.hwVersion, "00070000", 8) == 0) {
|
if (gnssModel == GNSS_MODEL_UBLOX7) {
|
||||||
LOG_INFO("GNSS configured for GPS+SBAS. Pause for 0.75s before sending next command.\n");
|
LOG_INFO("GNSS configured for GPS+SBAS.\n");
|
||||||
} else {
|
} else { // 8,9
|
||||||
LOG_INFO(
|
LOG_INFO("GNSS configured for GPS+SBAS+GLONASS+Galileo.\n");
|
||||||
"GNSS configured for GPS+SBAS+GLONASS+Galileo. Pause for 0.75s before sending next command.\n");
|
|
||||||
}
|
|
||||||
// Documentation say, we need wait atleast 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
|
// Documentation say, we need wait atleast 0.5s after reconfiguration of GNSS module, before sending next
|
||||||
msglen = makeUBXPacket(0x06, 0x02, sizeof(_message_DISABLE_TXT_INFO), _message_DISABLE_TXT_INFO);
|
// 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, "Unable to disable text info messages.\n", 500);
|
||||||
|
|
||||||
|
if (gnssModel == GNSS_MODEL_UBLOX8) { // 8
|
||||||
clearBuffer();
|
clearBuffer();
|
||||||
_serial_gps->write(UBXscratch, msglen);
|
SEND_UBX_PACKET(0x06, 0x39, _message_JAM_8, "Unable to enable interference resistance.\n", 500);
|
||||||
if (getACK(0x06, 0x02, 500) != GNSS_RESPONSE_OK) {
|
|
||||||
LOG_WARN("Unable to disable text info messages.\n");
|
clearBuffer();
|
||||||
}
|
SEND_UBX_PACKET(0x06, 0x23, _message_NAVX5_8, "Unable to configure NAVX5_8 settings.\n", 500);
|
||||||
// ToDo add M10 tests for below
|
} else { // 6,7,9
|
||||||
if (strncmp(info.hwVersion, "00080000", 8) == 0) {
|
SEND_UBX_PACKET(0x06, 0x39, _message_JAM_6_7, "Unable to enable interference resistance.\n", 500);
|
||||||
msglen = makeUBXPacket(0x06, 0x39, sizeof(_message_JAM_8), _message_JAM_8);
|
SEND_UBX_PACKET(0x06, 0x23, _message_NAVX5, "Unable to configure NAVX5 settings.\n", 500);
|
||||||
|
}
|
||||||
|
// Turn off unwanted NMEA messages, set update rate
|
||||||
|
SEND_UBX_PACKET(0x06, 0x08, _message_1HZ, "Unable to set GPS update rate.\n", 500);
|
||||||
|
SEND_UBX_PACKET(0x06, 0x01, _message_GLL, "Unable to disable NMEA GLL.\n", 500);
|
||||||
|
SEND_UBX_PACKET(0x06, 0x01, _message_GSA, "Unable to Enable NMEA GSA.\n", 500);
|
||||||
|
SEND_UBX_PACKET(0x06, 0x01, _message_GSV, "Unable to disable NMEA GSV.\n", 500);
|
||||||
|
SEND_UBX_PACKET(0x06, 0x01, _message_VTG, "Unable to disable NMEA VTG.\n", 500);
|
||||||
|
SEND_UBX_PACKET(0x06, 0x01, _message_RMC, "Unable to enable NMEA RMC.\n", 500);
|
||||||
|
SEND_UBX_PACKET(0x06, 0x01, _message_GGA, "Unable to enable NMEA GGA.\n", 500);
|
||||||
|
|
||||||
|
if (uBloxProtocolVersion >= 18) {
|
||||||
|
clearBuffer();
|
||||||
|
SEND_UBX_PACKET(0x06, 0x86, _message_PMS, "Unable to enable powersaving for GPS.\n", 500);
|
||||||
|
SEND_UBX_PACKET(0x06, 0x3B, _message_CFG_PM2, "Unable to enable powersaving details for GPS.\n", 500);
|
||||||
|
|
||||||
|
// For M8 we want to enable NMEA vserion 4.10 so we can see the additional sats.
|
||||||
|
if (gnssModel == GNSS_MODEL_UBLOX8) {
|
||||||
clearBuffer();
|
clearBuffer();
|
||||||
_serial_gps->write(UBXscratch, msglen);
|
SEND_UBX_PACKET(0x06, 0x17, _message_NMEA, "Unable to enable NMEA 4.10.\n", 500);
|
||||||
if (getACK(0x06, 0x39, 500) != GNSS_RESPONSE_OK) {
|
|
||||||
LOG_WARN("Unable to enable interference resistance.\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
msglen = makeUBXPacket(0x06, 0x23, sizeof(_message_NAVX5_8), _message_NAVX5_8);
|
|
||||||
clearBuffer();
|
|
||||||
_serial_gps->write(UBXscratch, msglen);
|
|
||||||
if (getACK(0x06, 0x23, 500) != GNSS_RESPONSE_OK) {
|
|
||||||
LOG_WARN("Unable to configure NAVX5_8 settings.\n");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
msglen = makeUBXPacket(0x06, 0x39, sizeof(_message_JAM_6_7), _message_JAM_6_7);
|
|
||||||
_serial_gps->write(UBXscratch, msglen);
|
|
||||||
if (getACK(0x06, 0x39, 500) != GNSS_RESPONSE_OK) {
|
|
||||||
LOG_WARN("Unable to enable interference resistance.\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
msglen = makeUBXPacket(0x06, 0x23, sizeof(_message_NAVX5), _message_NAVX5);
|
|
||||||
_serial_gps->write(UBXscratch, msglen);
|
|
||||||
if (getACK(0x06, 0x23, 500) != GNSS_RESPONSE_OK) {
|
|
||||||
LOG_WARN("Unable to configure NAVX5 settings.\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Turn off unwanted NMEA messages, set update rate
|
|
||||||
|
|
||||||
msglen = makeUBXPacket(0x06, 0x08, sizeof(_message_1HZ), _message_1HZ);
|
|
||||||
_serial_gps->write(UBXscratch, msglen);
|
|
||||||
if (getACK(0x06, 0x08, 500) != GNSS_RESPONSE_OK) {
|
|
||||||
LOG_WARN("Unable to set GPS update rate.\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
msglen = makeUBXPacket(0x06, 0x01, sizeof(_message_GLL), _message_GLL);
|
|
||||||
_serial_gps->write(UBXscratch, msglen);
|
|
||||||
if (getACK(0x06, 0x01, 500) != GNSS_RESPONSE_OK) {
|
|
||||||
LOG_WARN("Unable to disable NMEA GLL.\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
msglen = makeUBXPacket(0x06, 0x01, sizeof(_message_GSA), _message_GSA);
|
|
||||||
_serial_gps->write(UBXscratch, msglen);
|
|
||||||
if (getACK(0x06, 0x01, 500) != GNSS_RESPONSE_OK) {
|
|
||||||
LOG_WARN("Unable to Enable NMEA GSA.\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
msglen = makeUBXPacket(0x06, 0x01, sizeof(_message_GSV), _message_GSV);
|
|
||||||
_serial_gps->write(UBXscratch, msglen);
|
|
||||||
if (getACK(0x06, 0x01, 500) != GNSS_RESPONSE_OK) {
|
|
||||||
LOG_WARN("Unable to disable NMEA GSV.\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
msglen = makeUBXPacket(0x06, 0x01, sizeof(_message_VTG), _message_VTG);
|
|
||||||
_serial_gps->write(UBXscratch, msglen);
|
|
||||||
if (getACK(0x06, 0x01, 500) != GNSS_RESPONSE_OK) {
|
|
||||||
LOG_WARN("Unable to disable NMEA VTG.\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
msglen = makeUBXPacket(0x06, 0x01, sizeof(_message_RMC), _message_RMC);
|
|
||||||
_serial_gps->write(UBXscratch, msglen);
|
|
||||||
if (getACK(0x06, 0x01, 500) != GNSS_RESPONSE_OK) {
|
|
||||||
LOG_WARN("Unable to enable NMEA RMC.\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
msglen = makeUBXPacket(0x06, 0x01, sizeof(_message_GGA), _message_GGA);
|
|
||||||
_serial_gps->write(UBXscratch, msglen);
|
|
||||||
if (getACK(0x06, 0x01, 500) != GNSS_RESPONSE_OK) {
|
|
||||||
LOG_WARN("Unable to enable NMEA GGA.\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (uBloxProtocolVersion >= 18) {
|
|
||||||
msglen = makeUBXPacket(0x06, 0x86, sizeof(_message_PMS), _message_PMS);
|
|
||||||
clearBuffer();
|
|
||||||
_serial_gps->write(UBXscratch, msglen);
|
|
||||||
if (getACK(0x06, 0x86, 500) != GNSS_RESPONSE_OK) {
|
|
||||||
LOG_WARN("Unable to enable powersaving for GPS.\n");
|
|
||||||
}
|
|
||||||
msglen = makeUBXPacket(0x06, 0x3B, sizeof(_message_CFG_PM2), _message_CFG_PM2);
|
|
||||||
_serial_gps->write(UBXscratch, msglen);
|
|
||||||
if (getACK(0x06, 0x3B, 500) != GNSS_RESPONSE_OK) {
|
|
||||||
LOG_WARN("Unable to enable powersaving details for GPS.\n");
|
|
||||||
}
|
|
||||||
// For M8 we want to enable NMEA vserion 4.10 so we can see the additional sats.
|
|
||||||
if (strncmp(info.hwVersion, "00080000", 8) == 0) {
|
|
||||||
msglen = makeUBXPacket(0x06, 0x17, sizeof(_message_NMEA), _message_NMEA);
|
|
||||||
clearBuffer();
|
|
||||||
_serial_gps->write(UBXscratch, msglen);
|
|
||||||
if (getACK(0x06, 0x17, 500) != GNSS_RESPONSE_OK) {
|
|
||||||
LOG_WARN("Unable to enable NMEA 4.10.\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (strncmp(info.hwVersion, "00040007", 8) == 0) { // This PSM mode is only for Neo-6
|
|
||||||
msglen = makeUBXPacket(0x06, 0x11, 0x2, _message_CFG_RXM_ECO);
|
|
||||||
_serial_gps->write(UBXscratch, msglen);
|
|
||||||
if (getACK(0x06, 0x11, 500) != GNSS_RESPONSE_OK) {
|
|
||||||
LOG_WARN("Unable to enable powersaving ECO mode for Neo-6.\n");
|
|
||||||
}
|
|
||||||
msglen = makeUBXPacket(0x06, 0x3B, sizeof(_message_CFG_PM2), _message_CFG_PM2);
|
|
||||||
_serial_gps->write(UBXscratch, msglen);
|
|
||||||
if (getACK(0x06, 0x3B, 500) != GNSS_RESPONSE_OK) {
|
|
||||||
LOG_WARN("Unable to enable powersaving details for GPS.\n");
|
|
||||||
}
|
|
||||||
msglen = makeUBXPacket(0x06, 0x01, sizeof(_message_AID), _message_AID);
|
|
||||||
_serial_gps->write(UBXscratch, msglen);
|
|
||||||
if (getACK(0x06, 0x01, 500) != GNSS_RESPONSE_OK) {
|
|
||||||
LOG_WARN("Unable to disable UBX-AID.\n");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
msglen = makeUBXPacket(0x06, 0x11, 0x2, _message_CFG_RXM_PSM);
|
|
||||||
_serial_gps->write(UBXscratch, msglen);
|
|
||||||
if (getACK(0x06, 0x11, 500) != GNSS_RESPONSE_OK) {
|
|
||||||
LOG_WARN("Unable to enable powersaving mode for GPS.\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
msglen = makeUBXPacket(0x06, 0x3B, sizeof(_message_CFG_PM2), _message_CFG_PM2);
|
|
||||||
_serial_gps->write(UBXscratch, msglen);
|
|
||||||
if (getACK(0x06, 0x3B, 500) != GNSS_RESPONSE_OK) {
|
|
||||||
LOG_WARN("Unable to enable powersaving details for GPS.\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// LOG_INFO("u-blox M10 hardware found.\n");
|
SEND_UBX_PACKET(0x06, 0x11, _message_CFG_RXM_PSM, "Unable to enable powersaving mode for GPS.\n", 500);
|
||||||
delay(1000);
|
SEND_UBX_PACKET(0x06, 0x3B, _message_CFG_PM2, "Unable to enable powersaving details for GPS.\n", 500);
|
||||||
// First disable all NMEA messages in RAM layer
|
|
||||||
msglen = makeUBXPacket(0x06, 0x8A, sizeof(_message_VALSET_DISABLE_NMEA_RAM), _message_VALSET_DISABLE_NMEA_RAM);
|
|
||||||
clearBuffer();
|
|
||||||
_serial_gps->write(UBXscratch, msglen);
|
|
||||||
if (getACK(0x06, 0x8A, 300) != GNSS_RESPONSE_OK) {
|
|
||||||
LOG_WARN("Unable to disable NMEA messages for M10 GPS RAM.\n");
|
|
||||||
}
|
|
||||||
delay(250);
|
|
||||||
// Next disable unwanted NMEA messages in BBR layer
|
|
||||||
msglen = makeUBXPacket(0x06, 0x8A, sizeof(_message_VALSET_DISABLE_NMEA_BBR), _message_VALSET_DISABLE_NMEA_BBR);
|
|
||||||
clearBuffer();
|
|
||||||
_serial_gps->write(UBXscratch, msglen);
|
|
||||||
if (getACK(0x06, 0x8A, 300) != GNSS_RESPONSE_OK) {
|
|
||||||
LOG_WARN("Unable to disable NMEA messages for M10 GPS BBR.\n");
|
|
||||||
}
|
|
||||||
delay(250);
|
|
||||||
// Disable Info txt messages in RAM layer
|
|
||||||
msglen =
|
|
||||||
makeUBXPacket(0x06, 0x8A, sizeof(_message_VALSET_DISABLE_TXT_INFO_RAM), _message_VALSET_DISABLE_TXT_INFO_RAM);
|
|
||||||
clearBuffer();
|
|
||||||
_serial_gps->write(UBXscratch, msglen);
|
|
||||||
if (getACK(0x06, 0x8A, 300) != GNSS_RESPONSE_OK) {
|
|
||||||
LOG_WARN("Unable to disable Info messages for M10 GPS RAM.\n");
|
|
||||||
}
|
|
||||||
delay(250);
|
|
||||||
// Next disable Info txt messages in BBR layer
|
|
||||||
msglen =
|
|
||||||
makeUBXPacket(0x06, 0x8A, sizeof(_message_VALSET_DISABLE_TXT_INFO_BBR), _message_VALSET_DISABLE_TXT_INFO_BBR);
|
|
||||||
clearBuffer();
|
|
||||||
_serial_gps->write(UBXscratch, msglen);
|
|
||||||
if (getACK(0x06, 0x8A, 300) != GNSS_RESPONSE_OK) {
|
|
||||||
LOG_WARN("Unable to disable Info messages for M10 GPS BBR.\n");
|
|
||||||
}
|
|
||||||
// Do M10 configuration for Power Management.
|
|
||||||
|
|
||||||
msglen = makeUBXPacket(0x06, 0x8A, sizeof(_message_VALSET_PM_RAM), _message_VALSET_PM_RAM);
|
|
||||||
_serial_gps->write(UBXscratch, msglen);
|
|
||||||
if (getACK(0x06, 0x8A, 300) != GNSS_RESPONSE_OK) {
|
|
||||||
LOG_WARN("Unable to enable powersaving for M10 GPS RAM.\n");
|
|
||||||
}
|
|
||||||
msglen = makeUBXPacket(0x06, 0x8A, sizeof(_message_VALSET_PM_BBR), _message_VALSET_PM_BBR);
|
|
||||||
_serial_gps->write(UBXscratch, msglen);
|
|
||||||
if (getACK(0x06, 0x8A, 300) != GNSS_RESPONSE_OK) {
|
|
||||||
LOG_WARN("Unable to enable powersaving for M10 GPS BBR.\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
delay(250);
|
|
||||||
msglen = makeUBXPacket(0x06, 0x8A, sizeof(_message_VALSET_ITFM_RAM), _message_VALSET_ITFM_RAM);
|
|
||||||
_serial_gps->write(UBXscratch, msglen);
|
|
||||||
if (getACK(0x06, 0x8A, 300) != GNSS_RESPONSE_OK) {
|
|
||||||
LOG_WARN("Unable to enable Jamming detection M10 GPS RAM.\n");
|
|
||||||
}
|
|
||||||
msglen = makeUBXPacket(0x06, 0x8A, sizeof(_message_VALSET_ITFM_BBR), _message_VALSET_ITFM_BBR);
|
|
||||||
_serial_gps->write(UBXscratch, msglen);
|
|
||||||
if (getACK(0x06, 0x8A, 300) != GNSS_RESPONSE_OK) {
|
|
||||||
LOG_WARN("Unable to enable Jamming detection M10 GPS BBR.\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Here is where the init commands should go to do further M10 initialization.
|
|
||||||
delay(250);
|
|
||||||
msglen = makeUBXPacket(0x06, 0x8A, sizeof(_message_VALSET_DISABLE_SBAS_RAM), _message_VALSET_DISABLE_SBAS_RAM);
|
|
||||||
_serial_gps->write(UBXscratch, msglen);
|
|
||||||
if (getACK(0x06, 0x8A, 300) != GNSS_RESPONSE_OK) {
|
|
||||||
LOG_WARN("Unable to disable SBAS M10 GPS RAM.\n");
|
|
||||||
}
|
|
||||||
delay(750); // will cause a receiver restart so wait a bit
|
|
||||||
msglen = makeUBXPacket(0x06, 0x8A, sizeof(_message_VALSET_DISABLE_SBAS_BBR), _message_VALSET_DISABLE_SBAS_BBR);
|
|
||||||
_serial_gps->write(UBXscratch, msglen);
|
|
||||||
if (getACK(0x06, 0x8A, 300) != GNSS_RESPONSE_OK) {
|
|
||||||
LOG_WARN("Unable to disable SBAS M10 GPS BBR.\n");
|
|
||||||
}
|
|
||||||
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.
|
|
||||||
msglen = makeUBXPacket(0x06, 0x8A, sizeof(_message_VALSET_ENABLE_NMEA_BBR), _message_VALSET_ENABLE_NMEA_BBR);
|
|
||||||
_serial_gps->write(UBXscratch, msglen);
|
|
||||||
if (getACK(0x06, 0x8A, 300) != GNSS_RESPONSE_OK) {
|
|
||||||
LOG_WARN("Unable to enable messages for M10 GPS BBR.\n");
|
|
||||||
}
|
|
||||||
delay(250);
|
|
||||||
// Next enable wanted NMEA messages in RAM layer
|
|
||||||
msglen = makeUBXPacket(0x06, 0x8A, sizeof(_message_VALSET_ENABLE_NMEA_RAM), _message_VALSET_ENABLE_NMEA_RAM);
|
|
||||||
_serial_gps->write(UBXscratch, msglen);
|
|
||||||
if (getACK(0x06, 0x8A, 300) != GNSS_RESPONSE_OK) {
|
|
||||||
LOG_WARN("Unable to enable messages for M10 GPS RAM.\n");
|
|
||||||
}
|
|
||||||
// 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), _message_SAVE);
|
||||||
|
_serial_gps->write(UBXscratch, msglen);
|
||||||
|
if (getACK(0x06, 0x09, 2000) != GNSS_RESPONSE_OK) {
|
||||||
|
LOG_WARN("Unable to save GNSS module configuration.\n");
|
||||||
|
} else {
|
||||||
|
LOG_INFO("GNSS module configuration saved!\n");
|
||||||
|
}
|
||||||
|
} else if (gnssModel == GNSS_MODEL_UBLOX10) {
|
||||||
|
delay(1000);
|
||||||
|
clearBuffer();
|
||||||
|
SEND_UBX_PACKET(0x06, 0x8A, _message_VALSET_DISABLE_NMEA_RAM, "Unable to disable NMEA messages in M10 RAM.\n", 300);
|
||||||
|
delay(750);
|
||||||
|
clearBuffer();
|
||||||
|
SEND_UBX_PACKET(0x06, 0x8A, _message_VALSET_DISABLE_NMEA_BBR, "Unable to disable NMEA messages in M10 BBR.\n", 300);
|
||||||
|
delay(750);
|
||||||
|
clearBuffer();
|
||||||
|
SEND_UBX_PACKET(0x06, 0x8A, _message_VALSET_DISABLE_TXT_INFO_RAM,
|
||||||
|
"Unable to disable Info messages for M10 GPS RAM.\n", 300);
|
||||||
|
delay(750);
|
||||||
|
// Next disable Info txt messages in BBR layer
|
||||||
|
clearBuffer();
|
||||||
|
SEND_UBX_PACKET(0x06, 0x8A, _message_VALSET_DISABLE_TXT_INFO_BBR,
|
||||||
|
"Unable to disable Info messages for M10 GPS BBR.\n", 300);
|
||||||
|
delay(750);
|
||||||
|
// Do M10 configuration for Power Management.
|
||||||
|
SEND_UBX_PACKET(0x06, 0x8A, _message_VALSET_PM_RAM, "Unable to enable powersaving for M10 GPS RAM.\n", 300);
|
||||||
|
delay(750);
|
||||||
|
SEND_UBX_PACKET(0x06, 0x8A, _message_VALSET_PM_BBR, "Unable to enable powersaving for M10 GPS BBR.\n", 300);
|
||||||
|
delay(750);
|
||||||
|
SEND_UBX_PACKET(0x06, 0x8A, _message_VALSET_ITFM_RAM, "Unable to enable Jamming detection M10 GPS RAM.\n", 300);
|
||||||
|
delay(750);
|
||||||
|
SEND_UBX_PACKET(0x06, 0x8A, _message_VALSET_ITFM_BBR, "Unable to enable Jamming detection M10 GPS BBR.\n", 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, "Unable to disable SBAS M10 GPS RAM.\n", 300);
|
||||||
|
delay(750); // will cause a receiver restart so wait a bit
|
||||||
|
SEND_UBX_PACKET(0x06, 0x8A, _message_VALSET_DISABLE_SBAS_BBR, "Unable to disable SBAS M10 GPS BBR.\n", 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, "Unable to enable messages for M10 GPS BBR.\n", 300);
|
||||||
|
delay(750);
|
||||||
|
// Next enable wanted NMEA messages in RAM layer
|
||||||
|
SEND_UBX_PACKET(0x06, 0x8A, _message_VALSET_ENABLE_NMEA_RAM, "Unable to enable messages for M10 GPS RAM.\n", 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), _message_SAVE);
|
msglen = makeUBXPacket(0x06, 0x09, sizeof(_message_SAVE), _message_SAVE);
|
||||||
_serial_gps->write(UBXscratch, msglen);
|
_serial_gps->write(UBXscratch, msglen);
|
||||||
if (getACK(0x06, 0x09, 2000) != GNSS_RESPONSE_OK) {
|
if (getACK(0x06, 0x09, 2000) != GNSS_RESPONSE_OK) {
|
||||||
@ -949,7 +825,8 @@ void GPS::setPowerPMU(bool on)
|
|||||||
void GPS::setPowerUBLOX(bool on, uint32_t sleepMs)
|
void GPS::setPowerUBLOX(bool on, uint32_t sleepMs)
|
||||||
{
|
{
|
||||||
// Abort: if not UBLOX hardware
|
// Abort: if not UBLOX hardware
|
||||||
if (gnssModel != GNSS_MODEL_UBLOX)
|
if (!(gnssModel == GNSS_MODEL_UBLOX6 || gnssModel == GNSS_MODEL_UBLOX7 || gnssModel == GNSS_MODEL_UBLOX8 ||
|
||||||
|
gnssModel == GNSS_MODEL_UBLOX9 || gnssModel == GNSS_MODEL_UBLOX10))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// If waking
|
// If waking
|
||||||
@ -972,7 +849,7 @@ void GPS::setPowerUBLOX(bool on, uint32_t sleepMs)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Determine hardware version
|
// Determine hardware version
|
||||||
if (strncmp(info.hwVersion, "000A0000", 8) != 0) {
|
if (gnssModel == GNSS_MODEL_UBLOX10) {
|
||||||
// Encode the sleep time in millis into the packet
|
// Encode the sleep time in millis into the packet
|
||||||
for (int i = 0; i < 4; i++)
|
for (int i = 0; i < 4; i++)
|
||||||
gps->_message_PMREQ[0 + i] = sleepMs >> (i * 8);
|
gps->_message_PMREQ[0 + i] = sleepMs >> (i * 8);
|
||||||
@ -1031,7 +908,9 @@ void GPS::down()
|
|||||||
// Check whether the GPS hardware is capable of GPS_SOFTSLEEP
|
// Check whether the GPS hardware is capable of GPS_SOFTSLEEP
|
||||||
// If not, fallback to GPS_HARDSLEEP instead
|
// If not, fallback to GPS_HARDSLEEP instead
|
||||||
bool softsleepSupported = false;
|
bool softsleepSupported = false;
|
||||||
if (gnssModel == GNSS_MODEL_UBLOX) // U-blox is supported via PMREQ
|
// U-blox is supported via PMREQ
|
||||||
|
if (gnssModel == GNSS_MODEL_UBLOX6 || gnssModel == GNSS_MODEL_UBLOX7 || gnssModel == GNSS_MODEL_UBLOX8 ||
|
||||||
|
gnssModel == GNSS_MODEL_UBLOX9 || gnssModel == GNSS_MODEL_UBLOX10)
|
||||||
softsleepSupported = true;
|
softsleepSupported = true;
|
||||||
#ifdef PIN_GPS_STANDBY // L76B, L76K and clones have a standby pin
|
#ifdef PIN_GPS_STANDBY // L76B, L76K and clones have a standby pin
|
||||||
softsleepSupported = true;
|
softsleepSupported = true;
|
||||||
@ -1106,7 +985,9 @@ int32_t GPS::runOnce()
|
|||||||
// if we have received valid NMEA claim we are connected
|
// if we have received valid NMEA claim we are connected
|
||||||
setConnected();
|
setConnected();
|
||||||
} else {
|
} else {
|
||||||
if ((config.position.gps_mode == meshtastic_Config_PositionConfig_GpsMode_ENABLED) && (gnssModel == GNSS_MODEL_UBLOX)) {
|
if ((config.position.gps_mode == meshtastic_Config_PositionConfig_GpsMode_ENABLED) &&
|
||||||
|
(gnssModel == GNSS_MODEL_UBLOX6 || gnssModel == GNSS_MODEL_UBLOX7 || gnssModel == GNSS_MODEL_UBLOX8 ||
|
||||||
|
gnssModel == GNSS_MODEL_UBLOX9 || gnssModel == GNSS_MODEL_UBLOX10)) {
|
||||||
// reset the GPS on next bootup
|
// reset the GPS on next bootup
|
||||||
if (devicestate.did_gps_reset && scheduling.elapsedSearchMs() > 60 * 1000UL && !hasFlow()) {
|
if (devicestate.did_gps_reset && scheduling.elapsedSearchMs() > 60 * 1000UL && !hasFlow()) {
|
||||||
LOG_DEBUG("GPS is not communicating, trying factory reset on next bootup.\n");
|
LOG_DEBUG("GPS is not communicating, trying factory reset on next bootup.\n");
|
||||||
@ -1335,9 +1216,9 @@ GnssModel_t GPS::probe(int serialSpeed)
|
|||||||
strncpy((char *)buffer, &(info.extension[i][4]), sizeof(buffer));
|
strncpy((char *)buffer, &(info.extension[i][4]), sizeof(buffer));
|
||||||
// LOG_DEBUG("GetModel:%s\n", (char *)buffer);
|
// LOG_DEBUG("GetModel:%s\n", (char *)buffer);
|
||||||
if (strlen((char *)buffer)) {
|
if (strlen((char *)buffer)) {
|
||||||
LOG_INFO("UBlox GNSS probe succeeded, using UBlox %s GNSS Module\n", (char *)buffer);
|
LOG_INFO("%s detected, using GNSS_MODEL_UBLOX\n", (char *)buffer);
|
||||||
} else {
|
} else {
|
||||||
LOG_INFO("UBlox GNSS probe succeeded, using UBlox GNSS Module\n");
|
LOG_INFO("Generic Ublox detected, using GNSS_MODEL_UBLOX\n");
|
||||||
}
|
}
|
||||||
} else if (!strncmp(info.extension[i], "PROTVER", 7)) {
|
} else if (!strncmp(info.extension[i], "PROTVER", 7)) {
|
||||||
char *ptr = nullptr;
|
char *ptr = nullptr;
|
||||||
@ -1352,9 +1233,20 @@ GnssModel_t GPS::probe(int serialSpeed)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (strncmp(info.hwVersion, "00040007", 8) == 0) {
|
||||||
|
return GNSS_MODEL_UBLOX6;
|
||||||
|
} else if (strncmp(info.hwVersion, "00070000", 8) == 0) {
|
||||||
|
return GNSS_MODEL_UBLOX7;
|
||||||
|
} else if (strncmp(info.hwVersion, "00080000", 8) == 0) {
|
||||||
|
return GNSS_MODEL_UBLOX8;
|
||||||
|
} else if (strncmp(info.hwVersion, "00190000", 8) == 0) {
|
||||||
|
return GNSS_MODEL_UBLOX9;
|
||||||
|
} else if (strncmp(info.hwVersion, "000A0000", 8) == 0) {
|
||||||
|
return GNSS_MODEL_UBLOX10;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return GNSS_MODEL_UBLOX;
|
return GNSS_MODEL_UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
GPS *GPS::createGps()
|
GPS *GPS::createGps()
|
||||||
|
@ -26,7 +26,11 @@ struct uBloxGnssModelInfo {
|
|||||||
typedef enum {
|
typedef enum {
|
||||||
GNSS_MODEL_ATGM336H,
|
GNSS_MODEL_ATGM336H,
|
||||||
GNSS_MODEL_MTK,
|
GNSS_MODEL_MTK,
|
||||||
GNSS_MODEL_UBLOX,
|
GNSS_MODEL_UBLOX6,
|
||||||
|
GNSS_MODEL_UBLOX7,
|
||||||
|
GNSS_MODEL_UBLOX8,
|
||||||
|
GNSS_MODEL_UBLOX9,
|
||||||
|
GNSS_MODEL_UBLOX10,
|
||||||
GNSS_MODEL_UC6580,
|
GNSS_MODEL_UC6580,
|
||||||
GNSS_MODEL_UNKNOWN,
|
GNSS_MODEL_UNKNOWN,
|
||||||
GNSS_MODEL_MTK_L76B,
|
GNSS_MODEL_MTK_L76B,
|
||||||
@ -310,4 +314,4 @@ class GPS : private concurrency::OSThread
|
|||||||
};
|
};
|
||||||
|
|
||||||
extern GPS *gps;
|
extern GPS *gps;
|
||||||
#endif // Exclude GPS
|
#endif // Exclude GPS
|
@ -1,3 +1,10 @@
|
|||||||
|
#define SEND_UBX_PACKET(TYPE, ID, DATA, ERRMSG, TIMEOUT) \
|
||||||
|
msglen = makeUBXPacket(TYPE, ID, sizeof(DATA), DATA); \
|
||||||
|
_serial_gps->write(UBXscratch, msglen); \
|
||||||
|
if (getACK(TYPE, ID, TIMEOUT) != GNSS_RESPONSE_OK) { \
|
||||||
|
LOG_WARN(#ERRMSG); \
|
||||||
|
}
|
||||||
|
|
||||||
// Power Management
|
// Power Management
|
||||||
|
|
||||||
uint8_t GPS::_message_PMREQ[] PROGMEM = {
|
uint8_t GPS::_message_PMREQ[] PROGMEM = {
|
||||||
|
Loading…
Reference in New Issue
Block a user