MicroNMEALocationProvider.h 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. #pragma once
  2. #include "LocationProvider.h"
  3. #include <MicroNMEA.h>
  4. #include <RTClib.h>
  5. #ifndef GPS_EN
  6. #define GPS_EN (-1)
  7. #endif
  8. #ifndef GPS_RESET
  9. #define GPS_RESET (-1)
  10. #endif
  11. #ifndef GPS_RESET_FORCE
  12. #define GPS_RESET_FORCE LOW
  13. #endif
  14. class MicroNMEALocationProvider : public LocationProvider {
  15. char _nmeaBuffer[100];
  16. MicroNMEA nmea;
  17. mesh::RTCClock* _clock;
  18. Stream* _gps_serial;
  19. int _pin_reset;
  20. int _pin_en;
  21. long next_check = 0;
  22. long time_valid = 0;
  23. public :
  24. MicroNMEALocationProvider(Stream& ser, mesh::RTCClock* clock = &rtc_clock, int pin_reset = GPS_RESET, int pin_en = GPS_EN) :
  25. _gps_serial(&ser), nmea(_nmeaBuffer, sizeof(_nmeaBuffer)), _pin_reset(pin_reset), _pin_en(pin_en), _clock(clock) {
  26. if (_pin_reset != -1) {
  27. pinMode(_pin_reset, OUTPUT);
  28. digitalWrite(_pin_reset, GPS_RESET_FORCE);
  29. }
  30. if (_pin_en != -1) {
  31. pinMode(_pin_en, OUTPUT);
  32. digitalWrite(_pin_en, LOW);
  33. }
  34. }
  35. void begin() override {
  36. if (_pin_reset != -1) {
  37. digitalWrite(_pin_reset, !GPS_RESET_FORCE);
  38. }
  39. if (_pin_en != -1) {
  40. digitalWrite(_pin_en, HIGH);
  41. }
  42. }
  43. void reset() override {
  44. if (_pin_reset != -1) {
  45. digitalWrite(_pin_reset, GPS_RESET_FORCE);
  46. delay(100);
  47. digitalWrite(_pin_reset, !GPS_RESET_FORCE);
  48. }
  49. }
  50. void stop() override {
  51. if (_pin_en != -1) {
  52. digitalWrite(_pin_en, LOW);
  53. }
  54. }
  55. void syncTime() override { nmea.clear(); LocationProvider::syncTime(); }
  56. long getLatitude() override { return nmea.getLatitude(); }
  57. long getLongitude() override { return nmea.getLongitude(); }
  58. long getAltitude() override {
  59. long alt = 0;
  60. nmea.getAltitude(alt);
  61. return alt;
  62. }
  63. long satellitesCount() override { return nmea.getNumSatellites(); }
  64. bool isValid() override { return nmea.isValid(); }
  65. long getTimestamp() override {
  66. DateTime dt(nmea.getYear(), nmea.getMonth(),nmea.getDay(),nmea.getHour(),nmea.getMinute(),nmea.getSecond());
  67. return dt.unixtime();
  68. }
  69. void sendSentence(const char *sentence) override {
  70. nmea.sendSentence(*_gps_serial, sentence);
  71. }
  72. void loop() override {
  73. while (_gps_serial->available()) {
  74. char c = _gps_serial->read();
  75. #ifdef GPS_NMEA_DEBUG
  76. Serial.print(c);
  77. #endif
  78. nmea.process(c);
  79. }
  80. if (!isValid()) time_valid = 0;
  81. if (millis() > next_check) {
  82. next_check = millis() + 1000;
  83. if (_time_sync_needed && time_valid > 2) {
  84. if (_clock != NULL) {
  85. rtc_clock.setCurrentTime(getTimestamp());
  86. _time_sync_needed = false;
  87. }
  88. }
  89. if (isValid()) {
  90. time_valid ++;
  91. }
  92. }
  93. }
  94. };