mirror of
https://github.com/meshtastic/firmware.git
synced 2025-04-25 01:42:15 +00:00
fix #327 always factory reset the GPS once
This commit is contained in:
parent
6a359e2124
commit
d7a1cef046
@ -52,39 +52,7 @@ bool UBloxGPS::setup()
|
|||||||
if (isConnected) {
|
if (isConnected) {
|
||||||
DEBUG_MSG("Connected to UBLOX GPS successfully\n");
|
DEBUG_MSG("Connected to UBLOX GPS successfully\n");
|
||||||
|
|
||||||
bool factoryReset = false;
|
if (!setUBXMode())
|
||||||
bool ok;
|
|
||||||
if (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);
|
|
||||||
tryConnect();
|
|
||||||
DEBUG_MSG("Factory reset success=%d\n", isConnected);
|
|
||||||
ok = ublox.saveConfiguration(3000);
|
|
||||||
assert(ok);
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
if (_serial_gps) {
|
|
||||||
ok = ublox.setUART1Output(COM_TYPE_UBX, 500); // Use native API
|
|
||||||
assert(ok);
|
|
||||||
}
|
|
||||||
if (i2cAddress) {
|
|
||||||
ok = ublox.setI2COutput(COM_TYPE_UBX, 500);
|
|
||||||
assert(ok);
|
|
||||||
}
|
|
||||||
|
|
||||||
ok = ublox.setNavigationFrequency(1, 500); // Produce 4x/sec to keep the amount of time we stall in getPVT low
|
|
||||||
assert(ok);
|
|
||||||
// ok = ublox.setAutoPVT(false); // Not implemented on NEO-6M
|
|
||||||
// assert(ok);
|
|
||||||
// ok = ublox.setDynamicModel(DYN_MODEL_BIKE); // probably PEDESTRIAN but just in case assume bike speeds
|
|
||||||
// assert(ok);
|
|
||||||
ok = ublox.powerSaveMode(true, 2000); // use power save mode, the default timeout (1100ms seems a bit too tight)
|
|
||||||
assert(ok);
|
|
||||||
}
|
|
||||||
ok = ublox.saveConfiguration(3000);
|
|
||||||
if (!ok)
|
|
||||||
recordCriticalError(UBloxInitFailed); // Don't halt the boot if saving the config fails, but do report the bug
|
recordCriticalError(UBloxInitFailed); // Don't halt the boot if saving the config fails, but do report the bug
|
||||||
|
|
||||||
concurrency::PeriodicTask::setup(); // We don't start our periodic task unless we actually found the device
|
concurrency::PeriodicTask::setup(); // We don't start our periodic task unless we actually found the device
|
||||||
@ -95,6 +63,54 @@ bool UBloxGPS::setup()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool UBloxGPS::setUBXMode()
|
||||||
|
{
|
||||||
|
if (_serial_gps) {
|
||||||
|
if (!ublox.setUART1Output(COM_TYPE_UBX, 1000)) // Use native API
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (i2cAddress) {
|
||||||
|
if (!ublox.setI2COutput(COM_TYPE_UBX, 1000))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ublox.setNavigationFrequency(1, 1000)) // Produce 4x/sec to keep the amount of time we stall in getPVT low
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// ok = ublox.setAutoPVT(false); // Not implemented on NEO-6M
|
||||||
|
// assert(ok);
|
||||||
|
// ok = ublox.setDynamicModel(DYN_MODEL_BIKE); // probably PEDESTRIAN but just in case assume bike speeds
|
||||||
|
// assert(ok);
|
||||||
|
if (!ublox.powerSaveMode(true, 2000)) // use power save mode, the default timeout (1100ms seems a bit too tight)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!ublox.saveConfiguration(3000))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reset our GPS back to factory settings
|
||||||
|
*
|
||||||
|
* @return true for success
|
||||||
|
*/
|
||||||
|
bool UBloxGPS::factoryReset()
|
||||||
|
{
|
||||||
|
bool ok = false;
|
||||||
|
|
||||||
|
// 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);
|
||||||
|
tryConnect(); // sets isConnected
|
||||||
|
DEBUG_MSG("GPS Factory reset success=%d\n", isConnected);
|
||||||
|
if (isConnected)
|
||||||
|
ok = setUBXMode();
|
||||||
|
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
/// Prepare the GPS for the cpu entering deep or light sleep, expect to be gone for at least 100s of msecs
|
/// Prepare the GPS for the cpu entering deep or light sleep, expect to be gone for at least 100s of msecs
|
||||||
int UBloxGPS::prepareSleep(void *unused)
|
int UBloxGPS::prepareSleep(void *unused)
|
||||||
{
|
{
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "../concurrency/PeriodicTask.h"
|
||||||
#include "GPS.h"
|
#include "GPS.h"
|
||||||
#include "Observer.h"
|
#include "Observer.h"
|
||||||
#include "../concurrency/PeriodicTask.h"
|
|
||||||
#include "SparkFun_Ublox_Arduino_Library.h"
|
#include "SparkFun_Ublox_Arduino_Library.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -33,12 +33,22 @@ class UBloxGPS : public GPS, public concurrency::PeriodicTask
|
|||||||
* called after the CPU wakes from light-sleep state */
|
* called after the CPU wakes from light-sleep state */
|
||||||
virtual void startLock();
|
virtual void startLock();
|
||||||
|
|
||||||
private:
|
/**
|
||||||
|
* Reset our GPS back to factory settings
|
||||||
|
*
|
||||||
|
* @return true for success
|
||||||
|
*/
|
||||||
|
bool factoryReset();
|
||||||
|
|
||||||
|
private:
|
||||||
/// Prepare the GPS for the cpu entering deep or light sleep, expect to be gone for at least 100s of msecs
|
/// Prepare the GPS for the cpu entering deep or light sleep, expect to be gone for at least 100s of msecs
|
||||||
/// always returns 0 to indicate okay to sleep
|
/// always returns 0 to indicate okay to sleep
|
||||||
int prepareSleep(void *unused);
|
int prepareSleep(void *unused);
|
||||||
|
|
||||||
/// Attempt to connect to our GPS, returns false if no gps is present
|
/// Attempt to connect to our GPS, returns false if no gps is present
|
||||||
bool tryConnect();
|
bool tryConnect();
|
||||||
|
|
||||||
|
/// Switch to our desired operating mode and save the settings to flash
|
||||||
|
/// returns true for success
|
||||||
|
bool setUBXMode();
|
||||||
};
|
};
|
||||||
|
17
src/main.cpp
17
src/main.cpp
@ -231,15 +231,18 @@ void setup()
|
|||||||
// If we know we have a L80 GPS, don't try UBLOX
|
// If we know we have a L80 GPS, don't try UBLOX
|
||||||
#ifndef L80_RESET
|
#ifndef L80_RESET
|
||||||
// Init GPS - first try ublox
|
// Init GPS - first try ublox
|
||||||
gps = new UBloxGPS();
|
auto ublox = new UBloxGPS();
|
||||||
|
gps = ublox;
|
||||||
if (!gps->setup()) {
|
if (!gps->setup()) {
|
||||||
DEBUG_MSG("ERROR: No UBLOX GPS found\n");
|
DEBUG_MSG("ERROR: No UBLOX GPS found\n");
|
||||||
|
|
||||||
|
delete ublox;
|
||||||
|
gps = ublox = NULL;
|
||||||
|
|
||||||
if (GPS::_serial_gps) {
|
if (GPS::_serial_gps) {
|
||||||
// Some boards might have only the TX line from the GPS connected, in that case, we can't configure it at all. Just
|
// Some boards might have only the TX line from the GPS connected, in that case, we can't configure it at all. Just
|
||||||
// assume NEMA at 9600 baud.
|
// assume NEMA at 9600 baud.
|
||||||
DEBUG_MSG("Hoping that NEMA might work\n");
|
DEBUG_MSG("Hoping that NEMA might work\n");
|
||||||
delete gps;
|
|
||||||
|
|
||||||
// dumb NEMA access only work for serial GPSes)
|
// dumb NEMA access only work for serial GPSes)
|
||||||
gps = new NEMAGPS();
|
gps = new NEMAGPS();
|
||||||
@ -255,6 +258,16 @@ void setup()
|
|||||||
|
|
||||||
service.init();
|
service.init();
|
||||||
|
|
||||||
|
// We have now loaded our saved preferences from flash
|
||||||
|
|
||||||
|
// ONCE we will factory reset the GPS for bug #327
|
||||||
|
if (ublox && !devicestate.did_gps_reset) {
|
||||||
|
if (ublox->factoryReset()) { // If we don't succeed try again next time
|
||||||
|
devicestate.did_gps_reset = true;
|
||||||
|
nodeDB.saveToDisk();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef SX1262_ANT_SW
|
#ifdef SX1262_ANT_SW
|
||||||
// make analog PA vs not PA switch on SX1262 eval board work properly
|
// make analog PA vs not PA switch on SX1262 eval board work properly
|
||||||
pinMode(SX1262_ANT_SW, OUTPUT);
|
pinMode(SX1262_ANT_SW, OUTPUT);
|
||||||
|
@ -193,6 +193,7 @@ typedef struct _DeviceState {
|
|||||||
MeshPacket rx_text_message;
|
MeshPacket rx_text_message;
|
||||||
uint32_t version;
|
uint32_t version;
|
||||||
bool no_save;
|
bool no_save;
|
||||||
|
bool did_gps_reset;
|
||||||
} DeviceState;
|
} DeviceState;
|
||||||
|
|
||||||
typedef struct _FromRadio {
|
typedef struct _FromRadio {
|
||||||
@ -250,7 +251,7 @@ typedef struct _ToRadio {
|
|||||||
#define RadioConfig_UserPreferences_init_default {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "", "", 0, 0, {0, 0, 0}}
|
#define RadioConfig_UserPreferences_init_default {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "", "", 0, 0, {0, 0, 0}}
|
||||||
#define NodeInfo_init_default {0, false, User_init_default, false, Position_init_default, 0, 0}
|
#define NodeInfo_init_default {0, false, User_init_default, false, Position_init_default, 0, 0}
|
||||||
#define MyNodeInfo_init_default {0, 0, 0, "", "", "", 0, 0, 0, 0, 0, 0, 0, 0}
|
#define MyNodeInfo_init_default {0, 0, 0, "", "", "", 0, 0, 0, 0, 0, 0, 0, 0}
|
||||||
#define DeviceState_init_default {false, RadioConfig_init_default, false, MyNodeInfo_init_default, false, User_init_default, 0, {NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default}, 0, {MeshPacket_init_default}, false, MeshPacket_init_default, 0, 0}
|
#define DeviceState_init_default {false, RadioConfig_init_default, false, MyNodeInfo_init_default, false, User_init_default, 0, {NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default}, 0, {MeshPacket_init_default}, false, MeshPacket_init_default, 0, 0, 0}
|
||||||
#define DebugString_init_default {""}
|
#define DebugString_init_default {""}
|
||||||
#define FromRadio_init_default {0, 0, {MeshPacket_init_default}}
|
#define FromRadio_init_default {0, 0, {MeshPacket_init_default}}
|
||||||
#define ToRadio_init_default {0, {MeshPacket_init_default}}
|
#define ToRadio_init_default {0, {MeshPacket_init_default}}
|
||||||
@ -266,7 +267,7 @@ typedef struct _ToRadio {
|
|||||||
#define RadioConfig_UserPreferences_init_zero {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "", "", 0, 0, {0, 0, 0}}
|
#define RadioConfig_UserPreferences_init_zero {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "", "", 0, 0, {0, 0, 0}}
|
||||||
#define NodeInfo_init_zero {0, false, User_init_zero, false, Position_init_zero, 0, 0}
|
#define NodeInfo_init_zero {0, false, User_init_zero, false, Position_init_zero, 0, 0}
|
||||||
#define MyNodeInfo_init_zero {0, 0, 0, "", "", "", 0, 0, 0, 0, 0, 0, 0, 0}
|
#define MyNodeInfo_init_zero {0, 0, 0, "", "", "", 0, 0, 0, 0, 0, 0, 0, 0}
|
||||||
#define DeviceState_init_zero {false, RadioConfig_init_zero, false, MyNodeInfo_init_zero, false, User_init_zero, 0, {NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero}, 0, {MeshPacket_init_zero}, false, MeshPacket_init_zero, 0, 0}
|
#define DeviceState_init_zero {false, RadioConfig_init_zero, false, MyNodeInfo_init_zero, false, User_init_zero, 0, {NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero}, 0, {MeshPacket_init_zero}, false, MeshPacket_init_zero, 0, 0, 0}
|
||||||
#define DebugString_init_zero {""}
|
#define DebugString_init_zero {""}
|
||||||
#define FromRadio_init_zero {0, 0, {MeshPacket_init_zero}}
|
#define FromRadio_init_zero {0, 0, {MeshPacket_init_zero}}
|
||||||
#define ToRadio_init_zero {0, {MeshPacket_init_zero}}
|
#define ToRadio_init_zero {0, {MeshPacket_init_zero}}
|
||||||
@ -363,6 +364,7 @@ typedef struct _ToRadio {
|
|||||||
#define DeviceState_version_tag 8
|
#define DeviceState_version_tag 8
|
||||||
#define DeviceState_rx_text_message_tag 7
|
#define DeviceState_rx_text_message_tag 7
|
||||||
#define DeviceState_no_save_tag 9
|
#define DeviceState_no_save_tag 9
|
||||||
|
#define DeviceState_did_gps_reset_tag 10
|
||||||
#define FromRadio_packet_tag 2
|
#define FromRadio_packet_tag 2
|
||||||
#define FromRadio_my_info_tag 3
|
#define FromRadio_my_info_tag 3
|
||||||
#define FromRadio_node_info_tag 4
|
#define FromRadio_node_info_tag 4
|
||||||
@ -516,7 +518,8 @@ X(a, STATIC, REPEATED, MESSAGE, node_db, 4) \
|
|||||||
X(a, STATIC, REPEATED, MESSAGE, receive_queue, 5) \
|
X(a, STATIC, REPEATED, MESSAGE, receive_queue, 5) \
|
||||||
X(a, STATIC, OPTIONAL, MESSAGE, rx_text_message, 7) \
|
X(a, STATIC, OPTIONAL, MESSAGE, rx_text_message, 7) \
|
||||||
X(a, STATIC, SINGULAR, UINT32, version, 8) \
|
X(a, STATIC, SINGULAR, UINT32, version, 8) \
|
||||||
X(a, STATIC, SINGULAR, BOOL, no_save, 9)
|
X(a, STATIC, SINGULAR, BOOL, no_save, 9) \
|
||||||
|
X(a, STATIC, SINGULAR, BOOL, did_gps_reset, 10)
|
||||||
#define DeviceState_CALLBACK NULL
|
#define DeviceState_CALLBACK NULL
|
||||||
#define DeviceState_DEFAULT NULL
|
#define DeviceState_DEFAULT NULL
|
||||||
#define DeviceState_radio_MSGTYPE RadioConfig
|
#define DeviceState_radio_MSGTYPE RadioConfig
|
||||||
@ -614,7 +617,7 @@ extern const pb_msgdesc_t ManufacturingData_msg;
|
|||||||
#define RadioConfig_UserPreferences_size 188
|
#define RadioConfig_UserPreferences_size 188
|
||||||
#define NodeInfo_size 132
|
#define NodeInfo_size 132
|
||||||
#define MyNodeInfo_size 110
|
#define MyNodeInfo_size 110
|
||||||
#define DeviceState_size 5427
|
#define DeviceState_size 5429
|
||||||
#define DebugString_size 258
|
#define DebugString_size 258
|
||||||
#define FromRadio_size 322
|
#define FromRadio_size 322
|
||||||
#define ToRadio_size 316
|
#define ToRadio_size 316
|
||||||
|
Loading…
Reference in New Issue
Block a user