|
|
@@ -19,13 +19,16 @@
|
|
|
class MicroNMEALocationProvider : public LocationProvider {
|
|
|
char _nmeaBuffer[100];
|
|
|
MicroNMEA nmea;
|
|
|
+ mesh::RTCClock* _clock;
|
|
|
Stream* _gps_serial;
|
|
|
int _pin_reset;
|
|
|
int _pin_en;
|
|
|
+ long next_check = 0;
|
|
|
+ long time_valid = 0;
|
|
|
|
|
|
public :
|
|
|
- MicroNMEALocationProvider(Stream& ser, int pin_reset = GPS_RESET, int pin_en = GPS_EN) :
|
|
|
- _gps_serial(&ser), nmea(_nmeaBuffer, sizeof(_nmeaBuffer)), _pin_reset(pin_reset), _pin_en(pin_en) {
|
|
|
+ MicroNMEALocationProvider(Stream& ser, mesh::RTCClock* clock = &rtc_clock, int pin_reset = GPS_RESET, int pin_en = GPS_EN) :
|
|
|
+ _gps_serial(&ser), nmea(_nmeaBuffer, sizeof(_nmeaBuffer)), _pin_reset(pin_reset), _pin_en(pin_en), _clock(clock) {
|
|
|
if (_pin_reset != -1) {
|
|
|
pinMode(_pin_reset, OUTPUT);
|
|
|
digitalWrite(_pin_reset, GPS_RESET_FORCE);
|
|
|
@@ -59,6 +62,7 @@ public :
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ void syncTime() override { nmea.clear(); LocationProvider::syncTime(); }
|
|
|
long getLatitude() override { return nmea.getLatitude(); }
|
|
|
long getLongitude() override { return nmea.getLongitude(); }
|
|
|
long getAltitude() override {
|
|
|
@@ -66,6 +70,7 @@ public :
|
|
|
nmea.getAltitude(alt);
|
|
|
return alt;
|
|
|
}
|
|
|
+ long satellitesCount() override { return nmea.getNumSatellites(); }
|
|
|
bool isValid() override { return nmea.isValid(); }
|
|
|
|
|
|
long getTimestamp() override {
|
|
|
@@ -73,7 +78,12 @@ public :
|
|
|
return dt.unixtime();
|
|
|
}
|
|
|
|
|
|
+ void sendSentence(const char *sentence) override {
|
|
|
+ nmea.sendSentence(*_gps_serial, sentence);
|
|
|
+ }
|
|
|
+
|
|
|
void loop() override {
|
|
|
+
|
|
|
while (_gps_serial->available()) {
|
|
|
char c = _gps_serial->read();
|
|
|
#ifdef GPS_NMEA_DEBUG
|
|
|
@@ -81,5 +91,20 @@ public :
|
|
|
#endif
|
|
|
nmea.process(c);
|
|
|
}
|
|
|
+
|
|
|
+ if (!isValid()) time_valid = 0;
|
|
|
+
|
|
|
+ if (millis() > next_check) {
|
|
|
+ next_check = millis() + 1000;
|
|
|
+ if (_time_sync_needed && time_valid > 2) {
|
|
|
+ if (_clock != NULL) {
|
|
|
+ rtc_clock.setCurrentTime(getTimestamp());
|
|
|
+ _time_sync_needed = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (isValid()) {
|
|
|
+ time_valid ++;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
};
|