mirror of
https://github.com/meshtastic/firmware.git
synced 2025-04-28 10:42:08 +00:00
bug #376 wip - we now respect the new gps_operating_mode pref.
This commit is contained in:
parent
3c1c11e439
commit
736642455f
@ -3,17 +3,9 @@ gps todo - bug 376
|
||||
for taiwan region:
|
||||
bin/run.sh --set region 8
|
||||
|
||||
after sleep we declare success without real new data
|
||||
|
||||
handle the various GPS modes
|
||||
|
||||
fix poll interval for sending commands to ublox
|
||||
|
||||
handle maxint parameters
|
||||
|
||||
if not sharing location, don't even power up the GPS
|
||||
|
||||
if we go to sleep without getting a location set hasValidLocation to false
|
||||
change defaults to 2 min
|
||||
|
||||
properly handle time only modes
|
||||
|
||||
|
@ -172,7 +172,7 @@ bool Power::axp192Init()
|
||||
DEBUG_MSG("----------------------------------------\n");
|
||||
|
||||
axp.setPowerOutPut(AXP192_LDO2, AXP202_ON); // LORA radio
|
||||
axp.setPowerOutPut(AXP192_LDO3, AXP202_ON); // GPS main power
|
||||
// axp.setPowerOutPut(AXP192_LDO3, AXP202_ON); // GPS main power - now turned on in setGpsPower
|
||||
axp.setPowerOutPut(AXP192_DCDC2, AXP202_ON);
|
||||
axp.setPowerOutPut(AXP192_EXTEN, AXP202_ON);
|
||||
axp.setPowerOutPut(AXP192_DCDC1, AXP202_ON);
|
||||
|
@ -130,15 +130,32 @@ void GPS::setAwake(bool on)
|
||||
}
|
||||
}
|
||||
|
||||
GpsOperation GPS::getGpsOp() const
|
||||
{
|
||||
auto op = radioConfig.preferences.gps_operation;
|
||||
|
||||
if (op == GpsOperation_GpsOpUnset)
|
||||
op = (radioConfig.preferences.location_share == LocationSharing_LocDisabled) ? GpsOperation_GpsOpTimeOnly
|
||||
: GpsOperation_GpsOpMobile;
|
||||
|
||||
return op;
|
||||
}
|
||||
|
||||
/** Get how long we should stay looking for each aquisition in msecs
|
||||
*/
|
||||
uint32_t GPS::getWakeTime() const
|
||||
{
|
||||
uint32_t t = radioConfig.preferences.gps_attempt_time;
|
||||
|
||||
// fixme check modes
|
||||
auto op = getGpsOp();
|
||||
if ((timeSetFromGPS && op == GpsOperation_GpsOpTimeOnly) || (op == GpsOperation_GpsOpDisabled))
|
||||
t = UINT32_MAX; // Sleep forever now
|
||||
|
||||
if (t == UINT32_MAX)
|
||||
return t; // already maxint
|
||||
|
||||
if (t == 0)
|
||||
t = 30;
|
||||
t = 2 * 60; // default to 2 mins
|
||||
|
||||
t *= 1000; // msecs
|
||||
|
||||
@ -151,9 +168,12 @@ uint32_t GPS::getSleepTime() const
|
||||
{
|
||||
uint32_t t = radioConfig.preferences.gps_update_interval;
|
||||
|
||||
if (t == UINT32_MAX)
|
||||
return t; // already maxint
|
||||
|
||||
// fixme check modes
|
||||
if (t == 0)
|
||||
t = 30;
|
||||
t = 30; // 2 mins
|
||||
|
||||
t *= 1000;
|
||||
|
||||
@ -180,7 +200,8 @@ void GPS::loop()
|
||||
// If we are overdue for an update, turn on the GPS and at least publish the current status
|
||||
uint32_t now = millis();
|
||||
|
||||
if ((now - lastSleepStartMsec) > getSleepTime() && !isAwake) {
|
||||
auto sleepTime = getSleepTime();
|
||||
if (!isAwake && sleepTime != UINT32_MAX && (now - lastSleepStartMsec) > sleepTime) {
|
||||
// We now want to be awake - so wake up the GPS
|
||||
setAwake(true);
|
||||
}
|
||||
@ -195,10 +216,12 @@ void GPS::loop()
|
||||
bool gotLoc = lookForLocation();
|
||||
|
||||
// We've been awake too long - force sleep
|
||||
bool tooLong = (now - lastWakeStartMsec) > getWakeTime();
|
||||
auto wakeTime = getWakeTime();
|
||||
bool tooLong = wakeTime != UINT32_MAX && (now - lastWakeStartMsec) > wakeTime;
|
||||
|
||||
// Once we get a location we no longer desperately want an update
|
||||
if (gotLoc || tooLong) {
|
||||
// or if we got a time and we are in GpsOpTimeOnly mode
|
||||
if (gotLoc || tooLong || (gotTime && getGpsOp() == GpsOperation_GpsOpTimeOnly)) {
|
||||
if (gotLoc)
|
||||
hasValidLocation = true;
|
||||
|
||||
@ -216,8 +239,8 @@ void GPS::loop()
|
||||
void GPS::forceWake(bool on)
|
||||
{
|
||||
if (on) {
|
||||
DEBUG_MSG("Looking for GPS lock\n");
|
||||
lastSleepStartMsec = 0; // Force an update ASAP
|
||||
DEBUG_MSG("llowing GPS lock\n");
|
||||
// lastSleepStartMsec = 0; // Force an update ASAP
|
||||
wakeAllowed = true;
|
||||
} else {
|
||||
wakeAllowed = false;
|
||||
|
@ -133,6 +133,8 @@ class GPS
|
||||
*/
|
||||
uint32_t getSleepTime() const;
|
||||
|
||||
GpsOperation getGpsOp() const;
|
||||
|
||||
/**
|
||||
* Tell users we have new GPS readings
|
||||
*/
|
||||
|
@ -167,7 +167,10 @@ bool UBloxGPS::lookForLocation()
|
||||
longitude = ublox.getLongitude(0);
|
||||
altitude = ublox.getAltitudeMSL(0) / 1000; // in mm convert to meters
|
||||
dop = ublox.getPDOP(0); // PDOP (an accuracy metric) is reported in 10^2 units so we have to scale down when we use it
|
||||
heading = ublox.getHeading(0);
|
||||
|
||||
// Note: heading is only currently implmented in the ublox for the 8m chipset - therefore
|
||||
// don't read it here - it will generate an ignored getPVT command on the 6ms
|
||||
// heading = ublox.getHeading(0);
|
||||
numSatellites = ublox.getSIV(0);
|
||||
|
||||
// bogus lat lon is reported as 0 or 0 (can be bogus just for one)
|
||||
@ -176,6 +179,8 @@ bool UBloxGPS::lookForLocation()
|
||||
(latitude != 0) && (longitude != 0) && (latitude <= 900000000 && latitude >= -900000000) && (numSatellites > 0);
|
||||
} else {
|
||||
// Ask for a new position fix - hopefully it will have results ready by next time
|
||||
ublox.getSIV(maxWait());
|
||||
ublox.getPDOP(maxWait());
|
||||
ublox.getP(maxWait());
|
||||
}
|
||||
}
|
||||
|
@ -176,7 +176,8 @@ void doDeepSleep(uint64_t msecToWake)
|
||||
|
||||
// axp.setPowerOutPut(AXP192_LDO2, AXP202_OFF); // LORA radio
|
||||
|
||||
setGPSPower(false);
|
||||
// now done by UBloxGPS.cpp
|
||||
// setGPSPower(false);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user