LoRaWAN-Signal-Mapping/iot/main/gps.cpp

49 lines
1.2 KiB
C++

#include "gps.h"
#include "settings.h"
// The GPS message decoder
TinyGPSPlus gps;
// The serial connection to the GPS device
SoftwareSerial serial_gps(PIN_GPS_RX, PIN_GPS_TX);
void gps_begin() {
// Initialise the software-based serial connection to the GPS device
serial_gps.begin(BAUD_GPS);
}
TinyGPSLocation gps_location() {
Serial.print("[gps] Getting location: ");
// We WILL discover our location - if it's the last thing we do!
while(true) {
if(millis() > 5000 && gps.charsProcessed() < 10) {
Serial.print(F("\n[error] Failed to initialise GPS device."));
while(true) { delay(1); }
}
// Make sure there's something to read
if(serial_gps.available() <= 0) {
continue;
}
// If it failed, go around again
if(!gps.encode(serial_gps.read()))
continue;
// If we haven't acquired a lock yet, go around again
// Also go around again if the location is the same hasn't yet been updated (GPS devices are strange)
if(!gps.location.isValid() || gps.location.isUpdated()) {
Serial.print(".");
delay(100);
continue;
}
// Hooray!
Serial.println("ok");
return gps.location;
}
}
void gps_end() {
Serial.println(F("[warning] Putting the GPS device to sleep isn't implemented yet."));
}