mirror of
https://github.com/meshtastic/firmware.git
synced 2025-04-28 02:32:09 +00:00
WIP add support for i2C GPS
This commit is contained in:
parent
5b07d454b1
commit
1415f2bed7
@ -5,6 +5,7 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
|
// If we have a serial GPS port it will not be null
|
||||||
#ifdef GPS_RX_PIN
|
#ifdef GPS_RX_PIN
|
||||||
HardwareSerial _serial_gps_real(GPS_SERIAL_NUM);
|
HardwareSerial _serial_gps_real(GPS_SERIAL_NUM);
|
||||||
HardwareSerial *GPS::_serial_gps = &_serial_gps_real;
|
HardwareSerial *GPS::_serial_gps = &_serial_gps_real;
|
||||||
@ -15,6 +16,8 @@ HardwareSerial *GPS::_serial_gps = &Serial1;
|
|||||||
HardwareSerial *GPS::_serial_gps = NULL;
|
HardwareSerial *GPS::_serial_gps = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
uint8_t GPS::i2cAddress = 0;
|
||||||
|
|
||||||
bool timeSetFromGPS; // We try to set our time from GPS each time we wake from sleep
|
bool timeSetFromGPS; // We try to set our time from GPS each time we wake from sleep
|
||||||
|
|
||||||
GPS *gps;
|
GPS *gps;
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "Observer.h"
|
|
||||||
#include "GPSStatus.h"
|
|
||||||
#include "../concurrency/PeriodicTask.h"
|
#include "../concurrency/PeriodicTask.h"
|
||||||
|
#include "GPSStatus.h"
|
||||||
|
#include "Observer.h"
|
||||||
#include "sys/time.h"
|
#include "sys/time.h"
|
||||||
|
|
||||||
/// If we haven't yet set our RTC this boot, set it from a GPS derived time
|
/// If we haven't yet set our RTC this boot, set it from a GPS derived time
|
||||||
@ -30,12 +30,17 @@ class GPS : public Observable<void *>
|
|||||||
protected:
|
protected:
|
||||||
bool hasValidLocation = false; // default to false, until we complete our first read
|
bool hasValidLocation = false; // default to false, until we complete our first read
|
||||||
|
|
||||||
|
public:
|
||||||
|
/** If !NULL we will use this serial port to construct our GPS */
|
||||||
static HardwareSerial *_serial_gps;
|
static HardwareSerial *_serial_gps;
|
||||||
|
|
||||||
public:
|
/** If !0 we will attempt to connect to the GPS over I2C */
|
||||||
|
static uint8_t i2cAddress;
|
||||||
|
|
||||||
int32_t latitude = 0, longitude = 0; // as an int mult by 1e-7 to get value as double
|
int32_t latitude = 0, longitude = 0; // as an int mult by 1e-7 to get value as double
|
||||||
int32_t altitude = 0;
|
int32_t altitude = 0;
|
||||||
uint32_t dop = 0; // Diminution of position; PDOP where possible (UBlox), HDOP otherwise (TinyGPS) in 10^2 units (needs scaling before use)
|
uint32_t dop = 0; // Diminution of position; PDOP where possible (UBlox), HDOP otherwise (TinyGPS) in 10^2 units (needs
|
||||||
|
// scaling before use)
|
||||||
uint32_t heading = 0; // Heading of motion, in degrees * 10^-5
|
uint32_t heading = 0; // Heading of motion, in degrees * 10^-5
|
||||||
uint32_t numSatellites = 0;
|
uint32_t numSatellites = 0;
|
||||||
|
|
||||||
|
@ -7,23 +7,35 @@ UBloxGPS::UBloxGPS() : concurrency::PeriodicTask()
|
|||||||
notifySleepObserver.observe(¬ifySleep);
|
notifySleepObserver.observe(¬ifySleep);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool UBloxGPS::tryConnect()
|
||||||
|
{
|
||||||
|
isConnected = false;
|
||||||
|
|
||||||
|
if (_serial_gps)
|
||||||
|
isConnected = ublox.begin(*_serial_gps);
|
||||||
|
|
||||||
|
if (!isConnected && i2cAddress)
|
||||||
|
isConnected = ublox.begin(Wire, i2cAddress);
|
||||||
|
|
||||||
|
return isConnected;
|
||||||
|
}
|
||||||
|
|
||||||
bool UBloxGPS::setup()
|
bool UBloxGPS::setup()
|
||||||
{
|
{
|
||||||
|
if (_serial_gps) {
|
||||||
#ifdef GPS_RX_PIN
|
#ifdef GPS_RX_PIN
|
||||||
_serial_gps->begin(GPS_BAUDRATE, SERIAL_8N1, GPS_RX_PIN, GPS_TX_PIN);
|
_serial_gps->begin(GPS_BAUDRATE, SERIAL_8N1, GPS_RX_PIN, GPS_TX_PIN);
|
||||||
#else
|
#else
|
||||||
_serial_gps->begin(GPS_BAUDRATE);
|
_serial_gps->begin(GPS_BAUDRATE);
|
||||||
#endif
|
#endif
|
||||||
// _serial_gps.setRxBufferSize(1024); // the default is 256
|
// _serial_gps.setRxBufferSize(1024); // the default is 256
|
||||||
|
}
|
||||||
|
|
||||||
// ublox.enableDebugging(Serial);
|
// ublox.enableDebugging(Serial);
|
||||||
|
|
||||||
// note: the lib's implementation has the wrong docs for what the return val is
|
|
||||||
// it is not a bool, it returns zero for success
|
|
||||||
isConnected = ublox.begin(*_serial_gps);
|
|
||||||
|
|
||||||
// try a second time, the ublox lib serial parsing is buggy?
|
// try a second time, the ublox lib serial parsing is buggy?
|
||||||
if (!isConnected)
|
if (!tryConnect())
|
||||||
isConnected = ublox.begin(*_serial_gps);
|
tryConnect();
|
||||||
|
|
||||||
if (isConnected) {
|
if (isConnected) {
|
||||||
DEBUG_MSG("Connected to UBLOX GPS successfully\n");
|
DEBUG_MSG("Connected to UBLOX GPS successfully\n");
|
||||||
@ -35,7 +47,7 @@ bool UBloxGPS::setup()
|
|||||||
// GPS_TX connected)
|
// GPS_TX connected)
|
||||||
ublox.factoryReset();
|
ublox.factoryReset();
|
||||||
delay(3000);
|
delay(3000);
|
||||||
isConnected = ublox.begin(*_serial_gps);
|
tryConnect();
|
||||||
DEBUG_MSG("Factory reset success=%d\n", isConnected);
|
DEBUG_MSG("Factory reset success=%d\n", isConnected);
|
||||||
ok = ublox.saveConfiguration(3000);
|
ok = ublox.saveConfiguration(3000);
|
||||||
assert(ok);
|
assert(ok);
|
||||||
@ -131,7 +143,8 @@ The Unix epoch (or Unix time or POSIX time or Unix timestamp) is the number of s
|
|||||||
wantNewLocation = true;
|
wantNewLocation = true;
|
||||||
|
|
||||||
// Notify any status instances that are observing us
|
// Notify any status instances that are observing us
|
||||||
const meshtastic::GPSStatus status = meshtastic::GPSStatus(hasLock(), isConnected, latitude, longitude, altitude, dop, heading, numSatellites);
|
const meshtastic::GPSStatus status =
|
||||||
|
meshtastic::GPSStatus(hasLock(), isConnected, latitude, longitude, altitude, dop, heading, numSatellites);
|
||||||
newStatus.notifyObservers(&status);
|
newStatus.notifyObservers(&status);
|
||||||
|
|
||||||
// Once we have sent a location once we only poll the GPS rarely, otherwise check back every 1s until we have something over
|
// Once we have sent a location once we only poll the GPS rarely, otherwise check back every 1s until we have something over
|
||||||
|
@ -38,4 +38,7 @@ class UBloxGPS : public GPS, public concurrency::PeriodicTask
|
|||||||
/// 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
|
||||||
|
bool tryConnect();
|
||||||
};
|
};
|
||||||
|
@ -269,9 +269,13 @@ void setup()
|
|||||||
// assume NEMA at 9600 baud.
|
// assume NEMA at 9600 baud.
|
||||||
DEBUG_MSG("ERROR: No UBLOX GPS found, hoping that NEMA might work\n");
|
DEBUG_MSG("ERROR: No UBLOX GPS found, hoping that NEMA might work\n");
|
||||||
delete gps;
|
delete gps;
|
||||||
|
|
||||||
|
if(GPS::_serial_gps) {
|
||||||
|
// dumb NEMA access only work for serial GPSes)
|
||||||
gps = new NEMAGPS();
|
gps = new NEMAGPS();
|
||||||
gps->setup();
|
gps->setup();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
gps = new NEMAGPS();
|
gps = new NEMAGPS();
|
||||||
gps->setup();
|
gps->setup();
|
||||||
|
Loading…
Reference in New Issue
Block a user