36 lines
1.7 KiB
C++
36 lines
1.7 KiB
C++
#include <TinyGPSPlus.h>
|
|
#include "gps.h"
|
|
#include "sensor_node_config.h"
|
|
namespace { TinyGPSPlus parser; }
|
|
|
|
namespace {
|
|
uint32_t activeBaud = GPS_BAUD;
|
|
}
|
|
|
|
void initGps(HardwareSerial& serial) {
|
|
serial.begin(activeBaud, SERIAL_8N1, GPS_RX_PIN, GPS_TX_PIN);
|
|
Serial.print("Starting GPS UART at ");
|
|
Serial.println(activeBaud);
|
|
}
|
|
|
|
void updateGps(HardwareSerial& serial, GpsState& s) {
|
|
while (serial.available()) { s.lastByteMs = millis(); parser.encode(serial.read()); }
|
|
s.charactersProcessed = parser.charsProcessed();
|
|
s.sentencesPassed = parser.passedChecksum();
|
|
s.sentencesFailed = parser.failedChecksum();
|
|
s.baud = activeBaud;
|
|
s.hdopValid = parser.hdop.isValid();
|
|
if (s.hdopValid) s.hdop = parser.hdop.hdop();
|
|
s.locationAgeMs = parser.location.isValid() ? parser.location.age() : ULONG_MAX;
|
|
s.timeAgeMs = parser.time.isValid() ? parser.time.age() : ULONG_MAX;
|
|
s.online = s.lastByteMs && millis() - s.lastByteMs <= SENSOR_STALE_MS;
|
|
s.fix = parser.location.isValid() && parser.location.age() <= SENSOR_STALE_MS;
|
|
s.satellites = parser.satellites.isValid() ? parser.satellites.value() : 0;
|
|
if (parser.location.isValid()) { s.latitude = parser.location.lat(); s.longitude = parser.location.lng(); }
|
|
if (parser.altitude.isValid()) s.altitudeMeters = parser.altitude.meters();
|
|
if (parser.speed.isValid()) s.speedKph = parser.speed.kmph();
|
|
if (parser.course.isValid()) s.courseDegrees = parser.course.deg();
|
|
if (parser.date.isValid()) { s.year = parser.date.year(); s.month = parser.date.month(); s.day = parser.date.day(); }
|
|
if (parser.time.isValid()) { s.hour = parser.time.hour(); s.minute = parser.time.minute(); s.second = parser.time.second(); }
|
|
}
|