mirror of
https://github.com/meshtastic/firmware.git
synced 2025-04-28 18:47:40 +00:00
Remove extraneous flag, use gps_enabled. Ensure factory reset is not triggered while chip is off and gps_enabled=0
This commit is contained in:
parent
53da7cb036
commit
8507125e98
@ -5,7 +5,6 @@
|
|||||||
#include "configuration.h"
|
#include "configuration.h"
|
||||||
#include "graphics/Screen.h"
|
#include "graphics/Screen.h"
|
||||||
#include "power.h"
|
#include "power.h"
|
||||||
#include "GPS.h"
|
|
||||||
#include <OneButton.h>
|
#include <OneButton.h>
|
||||||
|
|
||||||
namespace concurrency
|
namespace concurrency
|
||||||
@ -164,7 +163,7 @@ class ButtonThread : public concurrency::OSThread
|
|||||||
digitalWrite(PIN_EINK_EN, digitalRead(PIN_EINK_EN) == LOW);
|
digitalWrite(PIN_EINK_EN, digitalRead(PIN_EINK_EN) == LOW);
|
||||||
#endif
|
#endif
|
||||||
#if defined(GPS_POWER_TOGGLE)
|
#if defined(GPS_POWER_TOGGLE)
|
||||||
if(gps->gpsPowerflag)
|
if(config.position.gps_enabled)
|
||||||
{
|
{
|
||||||
DEBUG_MSG("Flag set to false for gps power\n");
|
DEBUG_MSG("Flag set to false for gps power\n");
|
||||||
}
|
}
|
||||||
@ -172,8 +171,8 @@ class ButtonThread : public concurrency::OSThread
|
|||||||
{
|
{
|
||||||
DEBUG_MSG("Flag set to true to restore power\n");
|
DEBUG_MSG("Flag set to true to restore power\n");
|
||||||
}
|
}
|
||||||
gps->gpsPowerflag = !(gps->gpsPowerflag);
|
config.position.gps_enabled = !(config.position.gps_enabled);
|
||||||
doGPSpowersave(gps->gpsPowerflag);
|
doGPSpowersave(config.position.gps_enabled);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,16 +20,19 @@ class GPSStatus : public Status
|
|||||||
bool hasLock = false; // default to false, until we complete our first read
|
bool hasLock = false; // default to false, until we complete our first read
|
||||||
bool isConnected = false; // Do we have a GPS we are talking to
|
bool isConnected = false; // Do we have a GPS we are talking to
|
||||||
|
|
||||||
|
bool isPowerSaving = false; //Are we in power saving state
|
||||||
|
|
||||||
Position p = Position_init_default;
|
Position p = Position_init_default;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
GPSStatus() { statusType = STATUS_TYPE_GPS; }
|
GPSStatus() { statusType = STATUS_TYPE_GPS; }
|
||||||
|
|
||||||
// preferred method
|
// preferred method
|
||||||
GPSStatus(bool hasLock, bool isConnected, const Position &pos) : Status()
|
GPSStatus(bool hasLock, bool isConnected, bool isPowerSaving, const Position &pos) : Status()
|
||||||
{
|
{
|
||||||
this->hasLock = hasLock;
|
this->hasLock = hasLock;
|
||||||
this->isConnected = isConnected;
|
this->isConnected = isConnected;
|
||||||
|
this->isPowerSaving = isPowerSaving;
|
||||||
|
|
||||||
// all-in-one struct copy
|
// all-in-one struct copy
|
||||||
this->p = pos;
|
this->p = pos;
|
||||||
@ -44,6 +47,8 @@ class GPSStatus : public Status
|
|||||||
|
|
||||||
bool getIsConnected() const { return isConnected; }
|
bool getIsConnected() const { return isConnected; }
|
||||||
|
|
||||||
|
bool getIsPowerSaving() const { return isPowerSaving;}
|
||||||
|
|
||||||
int32_t getLatitude() const
|
int32_t getLatitude() const
|
||||||
{
|
{
|
||||||
if (config.position.fixed_position) {
|
if (config.position.fixed_position) {
|
||||||
@ -94,7 +99,7 @@ class GPSStatus : public Status
|
|||||||
#ifdef GPS_EXTRAVERBOSE
|
#ifdef GPS_EXTRAVERBOSE
|
||||||
DEBUG_MSG("GPSStatus.match() new pos@%x to old pos@%x\n", newStatus->p.pos_timestamp, p.pos_timestamp);
|
DEBUG_MSG("GPSStatus.match() new pos@%x to old pos@%x\n", newStatus->p.pos_timestamp, p.pos_timestamp);
|
||||||
#endif
|
#endif
|
||||||
return (newStatus->hasLock != hasLock || newStatus->isConnected != isConnected ||
|
return (newStatus->hasLock != hasLock || newStatus->isConnected != isConnected || newStatus->isPowerSaving !=isPowerSaving ||
|
||||||
newStatus->p.latitude_i != p.latitude_i || newStatus->p.longitude_i != p.longitude_i ||
|
newStatus->p.latitude_i != p.latitude_i || newStatus->p.longitude_i != p.longitude_i ||
|
||||||
newStatus->p.altitude != p.altitude || newStatus->p.altitude_hae != p.altitude_hae ||
|
newStatus->p.altitude != p.altitude || newStatus->p.altitude_hae != p.altitude_hae ||
|
||||||
newStatus->p.PDOP != p.PDOP || newStatus->p.ground_track != p.ground_track ||
|
newStatus->p.PDOP != p.PDOP || newStatus->p.ground_track != p.ground_track ||
|
||||||
|
@ -270,6 +270,12 @@ bool GPS::setup()
|
|||||||
pinMode(PIN_GPS_EN, OUTPUT);
|
pinMode(PIN_GPS_EN, OUTPUT);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAS_PMU
|
||||||
|
if(config.position.gps_enabled){
|
||||||
|
setGPSPower(true);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef PIN_GPS_RESET
|
#ifdef PIN_GPS_RESET
|
||||||
digitalWrite(PIN_GPS_RESET, 1); // assert for 10ms
|
digitalWrite(PIN_GPS_RESET, 1); // assert for 10ms
|
||||||
pinMode(PIN_GPS_RESET, OUTPUT);
|
pinMode(PIN_GPS_RESET, OUTPUT);
|
||||||
@ -282,8 +288,12 @@ bool GPS::setup()
|
|||||||
if (ok) {
|
if (ok) {
|
||||||
notifySleepObserver.observe(¬ifySleep);
|
notifySleepObserver.observe(¬ifySleep);
|
||||||
notifyDeepSleepObserver.observe(¬ifyDeepSleep);
|
notifyDeepSleepObserver.observe(¬ifyDeepSleep);
|
||||||
|
notifyGPSSleepObserver.observe(¬ifyGPSSleep);
|
||||||
|
}
|
||||||
|
if (config.position.gps_enabled==false) {
|
||||||
|
setAwake(false);
|
||||||
|
doGPSpowersave(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ok;
|
return ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -292,6 +302,7 @@ GPS::~GPS()
|
|||||||
// we really should unregister our sleep observer
|
// we really should unregister our sleep observer
|
||||||
notifySleepObserver.unobserve(¬ifySleep);
|
notifySleepObserver.unobserve(¬ifySleep);
|
||||||
notifyDeepSleepObserver.unobserve(¬ifyDeepSleep);
|
notifyDeepSleepObserver.unobserve(¬ifyDeepSleep);
|
||||||
|
notifyGPSSleepObserver.observe(¬ifyGPSSleep);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GPS::hasLock()
|
bool GPS::hasLock()
|
||||||
@ -404,7 +415,7 @@ void GPS::publishUpdate()
|
|||||||
DEBUG_MSG("publishing pos@%x:2, hasVal=%d, GPSlock=%d\n", p.timestamp, hasValidLocation, hasLock());
|
DEBUG_MSG("publishing pos@%x:2, hasVal=%d, GPSlock=%d\n", p.timestamp, hasValidLocation, hasLock());
|
||||||
|
|
||||||
// Notify any status instances that are observing us
|
// Notify any status instances that are observing us
|
||||||
const meshtastic::GPSStatus status = meshtastic::GPSStatus(hasValidLocation, isConnected(), p);
|
const meshtastic::GPSStatus status = meshtastic::GPSStatus(hasValidLocation, isConnected(), isPowerSaving(), p);
|
||||||
newStatus.notifyObservers(&status);
|
newStatus.notifyObservers(&status);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -415,7 +426,7 @@ 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(gnssModel == GNSS_MODEL_UBLOX){
|
if((config.position.gps_enabled == 1) && (gnssModel == GNSS_MODEL_UBLOX)){
|
||||||
// reset the GPS on next bootup
|
// reset the GPS on next bootup
|
||||||
if(devicestate.did_gps_reset && (millis() > 60000) && !hasFlow()) {
|
if(devicestate.did_gps_reset && (millis() > 60000) && !hasFlow()) {
|
||||||
DEBUG_MSG("GPS is not communicating, trying factory reset on next bootup.\n");
|
DEBUG_MSG("GPS is not communicating, trying factory reset on next bootup.\n");
|
||||||
@ -517,6 +528,7 @@ int GPS::prepareDeepSleep(void *unused)
|
|||||||
DEBUG_MSG("GPS deep sleep!\n");
|
DEBUG_MSG("GPS deep sleep!\n");
|
||||||
|
|
||||||
// For deep sleep we also want abandon any lock attempts (because we want minimum power)
|
// For deep sleep we also want abandon any lock attempts (because we want minimum power)
|
||||||
|
getSleepTime();
|
||||||
setAwake(false);
|
setAwake(false);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -652,6 +664,11 @@ GPS *createGps()
|
|||||||
return new_gps;
|
return new_gps;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else{
|
||||||
|
GPS *new_gps = new NMEAGPS();
|
||||||
|
new_gps->setup();
|
||||||
|
return new_gps;
|
||||||
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -49,6 +49,7 @@ class GPS : private concurrency::OSThread
|
|||||||
|
|
||||||
CallbackObserver<GPS, void *> notifySleepObserver = CallbackObserver<GPS, void *>(this, &GPS::prepareSleep);
|
CallbackObserver<GPS, void *> notifySleepObserver = CallbackObserver<GPS, void *>(this, &GPS::prepareSleep);
|
||||||
CallbackObserver<GPS, void *> notifyDeepSleepObserver = CallbackObserver<GPS, void *>(this, &GPS::prepareDeepSleep);
|
CallbackObserver<GPS, void *> notifyDeepSleepObserver = CallbackObserver<GPS, void *>(this, &GPS::prepareDeepSleep);
|
||||||
|
CallbackObserver<GPS, void *> notifyGPSSleepObserver = CallbackObserver<GPS, void *>(this, &GPS::prepareDeepSleep);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/** If !NULL we will use this serial port to construct our GPS */
|
/** If !NULL we will use this serial port to construct our GPS */
|
||||||
@ -77,7 +78,7 @@ class GPS : private concurrency::OSThread
|
|||||||
/// Return true if we are connected to a GPS
|
/// Return true if we are connected to a GPS
|
||||||
bool isConnected() const { return hasGPS; }
|
bool isConnected() const { return hasGPS; }
|
||||||
|
|
||||||
bool gpsPowerflag = 1;
|
bool isPowerSaving() const { return !config.position.gps_enabled;}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Restart our lock attempt - try to get and broadcast a GPS reading ASAP
|
* Restart our lock attempt - try to get and broadcast a GPS reading ASAP
|
||||||
|
@ -29,7 +29,9 @@ Observable<void *> preflightSleep;
|
|||||||
|
|
||||||
/// Called to tell observers we are now entering sleep and you should prepare. Must return 0
|
/// Called to tell observers we are now entering sleep and you should prepare. Must return 0
|
||||||
/// notifySleep will be called for light or deep sleep, notifyDeepSleep is only called for deep sleep
|
/// notifySleep will be called for light or deep sleep, notifyDeepSleep is only called for deep sleep
|
||||||
|
/// notifyGPSSleep will be called when config.position.gps_enabled is set to 0 or from buttonthread when GPS_POWER_TOGGLE is enabled.
|
||||||
Observable<void *> notifySleep, notifyDeepSleep;
|
Observable<void *> notifySleep, notifyDeepSleep;
|
||||||
|
Observable<void *> notifyGPSSleep;
|
||||||
|
|
||||||
// deep sleep support
|
// deep sleep support
|
||||||
RTC_DATA_ATTR int bootCount = 0;
|
RTC_DATA_ATTR int bootCount = 0;
|
||||||
@ -169,6 +171,7 @@ static void waitEnterSleep()
|
|||||||
|
|
||||||
void doGPSpowersave(bool on)
|
void doGPSpowersave(bool on)
|
||||||
{
|
{
|
||||||
|
#ifdef HAS_PMU
|
||||||
if (on)
|
if (on)
|
||||||
{
|
{
|
||||||
DEBUG_MSG("Turning GPS back on\n");
|
DEBUG_MSG("Turning GPS back on\n");
|
||||||
@ -178,9 +181,10 @@ void doGPSpowersave(bool on)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
DEBUG_MSG("Turning off GPS chip\n");
|
DEBUG_MSG("Turning off GPS chip\n");
|
||||||
notifySleep.notifyObservers(NULL);
|
notifyGPSSleep.notifyObservers(NULL);
|
||||||
setGPSPower(0);
|
setGPSPower(0);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void doDeepSleep(uint64_t msecToWake)
|
void doDeepSleep(uint64_t msecToWake)
|
||||||
|
@ -37,4 +37,6 @@ extern Observable<void *> notifySleep;
|
|||||||
/// Called to tell observers we are now entering (deep) sleep and you should prepare. Must return 0
|
/// Called to tell observers we are now entering (deep) sleep and you should prepare. Must return 0
|
||||||
extern Observable<void *> notifyDeepSleep;
|
extern Observable<void *> notifyDeepSleep;
|
||||||
|
|
||||||
|
/// Called to tell GPS thread to enter deep sleep independently of LoRa/MCU sleep, prior to full poweroff. Must return 0
|
||||||
|
extern Observable<void *> notifyGPSSleep;
|
||||||
void enableModemSleep();
|
void enableModemSleep();
|
Loading…
Reference in New Issue
Block a user