mirror of https://github.com/meshcore-dev/MeshCore
5 changed files with 183 additions and 3 deletions
@ -0,0 +1,17 @@ |
|||
#pragma once |
|||
|
|||
#include "Mesh.h" |
|||
|
|||
|
|||
class LocationProvider { |
|||
|
|||
public: |
|||
virtual long getLatitude() = 0; |
|||
virtual long getLongitude() = 0; |
|||
virtual bool isValid() = 0; |
|||
virtual long getTimestamp() = 0; |
|||
virtual void reset(); |
|||
virtual void begin(); |
|||
virtual void stop(); |
|||
virtual void loop(); |
|||
}; |
|||
@ -0,0 +1,80 @@ |
|||
#pragma once |
|||
|
|||
#include "LocationProvider.h" |
|||
#include <MicroNMEA.h> |
|||
#include <RTClib.h> |
|||
|
|||
#ifndef GPS_EN |
|||
#define GPS_EN (-1) |
|||
#endif |
|||
|
|||
#ifndef GPS_RESET |
|||
#define GPS_RESET (-1) |
|||
#endif |
|||
|
|||
#ifndef GPS_RESET_FORCE |
|||
#define GPS_RESET_FORCE LOW |
|||
#endif |
|||
|
|||
class MicroNMEALocationProvider : public LocationProvider { |
|||
char _nmeaBuffer[100]; |
|||
MicroNMEA nmea; |
|||
Stream* _gps_serial; |
|||
int _pin_reset; |
|||
int _pin_en; |
|||
|
|||
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) { |
|||
if (_pin_reset != -1) { |
|||
pinMode(_pin_reset, OUTPUT); |
|||
digitalWrite(_pin_reset, GPS_RESET_FORCE); |
|||
} |
|||
if (_pin_en != -1) { |
|||
pinMode(_pin_en, OUTPUT); |
|||
digitalWrite(_pin_en, LOW); |
|||
} |
|||
} |
|||
|
|||
void begin() override { |
|||
if (_pin_reset != -1) { |
|||
digitalWrite(_pin_reset, !GPS_RESET_FORCE); |
|||
} |
|||
if (_pin_en != -1) { |
|||
digitalWrite(_pin_en, HIGH); |
|||
} |
|||
} |
|||
|
|||
void reset() override { |
|||
if (_pin_reset != -1) { |
|||
digitalWrite(_pin_reset, GPS_RESET_FORCE); |
|||
delay(100); |
|||
digitalWrite(_pin_reset, !GPS_RESET_FORCE); |
|||
} |
|||
} |
|||
|
|||
void stop() override { |
|||
if (_pin_en != -1) { |
|||
digitalWrite(_pin_en, LOW); |
|||
} |
|||
} |
|||
|
|||
long getLatitude() override { return nmea.getLatitude(); } |
|||
long getLongitude() override { return nmea.getLongitude(); } |
|||
bool isValid() override { return nmea.isValid(); } |
|||
|
|||
long getTimestamp() override { |
|||
DateTime dt(nmea.getYear(), nmea.getMonth(),nmea.getDay(),nmea.getHour(),nmea.getMinute(),nmea.getSecond()); |
|||
return dt.unixtime(); |
|||
} |
|||
|
|||
void loop() override { |
|||
while (_gps_serial->available()) { |
|||
char c = _gps_serial->read(); |
|||
#ifdef GPS_NMEA_DEBUG |
|||
Serial.print(c); |
|||
#endif |
|||
nmea.process(c); |
|||
} |
|||
} |
|||
}; |
|||
Loading…
Reference in new issue