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