diff --git a/Conf.cpp b/Conf.cpp
index 1e0d230..1695f3f 100644
--- a/Conf.cpp
+++ b/Conf.cpp
@@ -55,7 +55,8 @@ enum SECTION {
SECTION_NEXTION,
SECTION_OLED,
SECTION_LCDPROC,
- SECTION_LOCK_FILE
+ SECTION_LOCK_FILE,
+ SECTION_MOBILE_GPS
};
CConf::CConf(const std::string& file) :
@@ -242,7 +243,10 @@ m_lcdprocLocalPort(0U),
m_lcdprocDisplayClock(false),
m_lcdprocUTC(false),
m_lockFileEnabled(false),
-m_lockFileName()
+m_lockFileName(),
+m_mobileGPSEnabled(false),
+m_mobileGPSAddress(),
+m_mobileGPSPort(0U)
{
}
@@ -320,6 +324,8 @@ bool CConf::read()
section = SECTION_LCDPROC;
else if (::strncmp(buffer, "[Lock File]", 11U) == 0)
section = SECTION_LOCK_FILE;
+ else if (::strncmp(buffer, "[Mobile GPS]", 12U) == 0)
+ section = SECTION_MOBILE_GPS;
else
section = SECTION_NONE;
@@ -800,6 +806,13 @@ bool CConf::read()
m_lockFileEnabled = ::atoi(value) == 1;
else if (::strcmp(key, "File") == 0)
m_lockFileName = value;
+ } else if (section == SECTION_MOBILE_GPS) {
+ if (::strcmp(key, "Enable") == 0)
+ m_mobileGPSEnabled = ::atoi(value) == 1;
+ else if (::strcmp(key, "Address") == 0)
+ m_mobileGPSAddress = value;
+ else if (::strcmp(key, "Port") == 0)
+ m_mobileGPSPort = (unsigned int)::atoi(value);
}
}
@@ -1727,3 +1740,19 @@ std::string CConf::getLockFileName() const
{
return m_lockFileName;
}
+
+bool CConf::getMobileGPSEnabled() const
+{
+ return m_mobileGPSEnabled;
+}
+
+std::string CConf::getMobileGPSAddress() const
+{
+ return m_mobileGPSAddress;
+}
+
+unsigned int CConf::getMobileGPSPort() const
+{
+ return m_mobileGPSPort;
+}
+
diff --git a/Conf.h b/Conf.h
index 7016308..c3a2d38 100644
--- a/Conf.h
+++ b/Conf.h
@@ -268,6 +268,10 @@ public:
bool getLockFileEnabled() const;
std::string getLockFileName() const;
+ // The Mobile GPS section
+ bool getMobileGPSEnabled() const;
+ std::string getMobileGPSAddress() const;
+ unsigned int getMobileGPSPort() const;
private:
std::string m_file;
@@ -481,6 +485,10 @@ private:
bool m_lockFileEnabled;
std::string m_lockFileName;
+
+ bool m_mobileGPSEnabled;
+ std::string m_mobileGPSAddress;
+ unsigned int m_mobileGPSPort;
};
#endif
diff --git a/MMDVM.ini b/MMDVM.ini
index 85e3925..78d00b3 100644
--- a/MMDVM.ini
+++ b/MMDVM.ini
@@ -247,3 +247,8 @@ UTC=0
Enable=0
File=/tmp/MMDVM_Active.lck
+[Mobile GPS]
+Enable=0
+Address=127.0.0.1
+Port=7834
+
diff --git a/MMDVMHost.cpp b/MMDVMHost.cpp
index d5b9c13..98272e2 100644
--- a/MMDVMHost.cpp
+++ b/MMDVMHost.cpp
@@ -157,7 +157,8 @@ m_callsign(),
m_id(0U),
m_cwCallsign(),
m_lockFileEnabled(false),
-m_lockFileName()
+m_lockFileName(),
+m_mobileGPS(NULL)
{
}
@@ -941,6 +942,9 @@ int CMMDVMHost::run()
if (m_pocsagNetwork != NULL)
m_pocsagNetwork->clock(ms);
+ if (m_mobileGPS != NULL)
+ m_mobileGPS->clock(ms);
+
m_cwIdTimer.clock(ms);
if (m_cwIdTimer.isRunning() && m_cwIdTimer.hasExpired()) {
if (m_mode == MODE_IDLE && !m_modem->hasTX()){
@@ -996,6 +1000,11 @@ int CMMDVMHost::run()
m_display->close();
delete m_display;
+ if (m_mobileGPS != NULL) {
+ m_mobileGPS->close();
+ delete m_mobileGPS;
+ }
+
if (m_ump != NULL) {
m_ump->close();
delete m_ump;
@@ -1222,6 +1231,24 @@ bool CMMDVMHost::createDMRNetwork()
return false;
}
+ bool mobileGPSEnabled = m_conf.getMobileGPSEnabled();
+ if (mobileGPSEnabled) {
+ std::string mobileGPSAddress = m_conf.getMobileGPSAddress();
+ unsigned int mobileGPSPort = m_conf.getMobileGPSPort();
+
+ LogInfo("Mobile GPS Parameters");
+ LogInfo(" Address: %s", mobileGPSAddress.c_str());
+ LogInfo(" Port; %u", mobileGPSPort);
+
+ m_mobileGPS = new CMobileGPS(address, port, m_dmrNetwork);
+
+ ret = m_mobileGPS->open();
+ if (!ret) {
+ delete m_mobileGPS;
+ m_mobileGPS = NULL;
+ }
+ }
+
m_dmrNetwork->enable(true);
return true;
diff --git a/MMDVMHost.h b/MMDVMHost.h
index e0c2b43..7ebcfdd 100644
--- a/MMDVMHost.h
+++ b/MMDVMHost.h
@@ -27,6 +27,7 @@
#include "P25Network.h"
#include "DMRNetwork.h"
#include "DMRLookup.h"
+#include "MobileGPS.h"
#include "Display.h"
#include "Timer.h"
#include "Modem.h"
@@ -87,6 +88,7 @@ private:
std::string m_cwCallsign;
bool m_lockFileEnabled;
std::string m_lockFileName;
+ CMobileGPS* m_mobileGPS;
void readParams();
bool createModem();
diff --git a/MMDVMHost.vcxproj b/MMDVMHost.vcxproj
index 7c565a0..83cba81 100644
--- a/MMDVMHost.vcxproj
+++ b/MMDVMHost.vcxproj
@@ -187,6 +187,7 @@
+
@@ -274,6 +275,7 @@
+
@@ -325,4 +327,4 @@
-
\ No newline at end of file
+
diff --git a/MMDVMHost.vcxproj.filters b/MMDVMHost.vcxproj.filters
index 328f121..200ee23 100644
--- a/MMDVMHost.vcxproj.filters
+++ b/MMDVMHost.vcxproj.filters
@@ -275,6 +275,9 @@
Header Files
+
+ Header Files
+
@@ -514,5 +517,8 @@
Source Files
+
+ Source Files
+
-
\ No newline at end of file
+
diff --git a/Makefile b/Makefile
index 195652d..c4d22d5 100644
--- a/Makefile
+++ b/Makefile
@@ -9,7 +9,7 @@ LDFLAGS = -g
OBJECTS = \
AMBEFEC.o BCH.o BPTC19696.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o \
DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o \
- DStarSlowData.o Golay2087.o Golay24128.o Hamming.o I2CController.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o \
+ DStarSlowData.o Golay2087.o Golay24128.o Hamming.o I2CController.o LCDproc.o Log.o MMDVMHost.o MobileGPS.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o \
Nextion.o NullDisplay.o NXDNAudio.o NXDNControl.o NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o \
NXDNSACCH.o NXDNUDCH.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o POCSAGControl.o \
POCSAGNetwork.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o SHA256.o StopWatch.o Sync.o TFTSerial.o Thread.o \
diff --git a/Makefile.Pi b/Makefile.Pi
index 0c14f6c..dc8e1aa 100644
--- a/Makefile.Pi
+++ b/Makefile.Pi
@@ -9,7 +9,7 @@ LDFLAGS = -g -L/usr/local/lib
OBJECTS = \
AMBEFEC.o BCH.o BPTC19696.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o \
DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o \
- DStarSlowData.o Golay2087.o Golay24128.o Hamming.o I2CController.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o \
+ DStarSlowData.o Golay2087.o Golay24128.o Hamming.o I2CController.o LCDproc.o Log.o MMDVMHost.o MobileGPS.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o \
NullDisplay.o NXDNAudio.o NXDNControl.o NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o NXDNSACCH.o \
NXDNUDCH.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o POCSAGControl.o POCSAGNetwork.o \
QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o SHA256.o StopWatch.o Sync.o TFTSerial.o Thread.o Timer.o UDPSocket.o \
diff --git a/Makefile.Pi.Adafruit b/Makefile.Pi.Adafruit
index 2fa1a02..1065ed3 100644
--- a/Makefile.Pi.Adafruit
+++ b/Makefile.Pi.Adafruit
@@ -9,7 +9,7 @@ LDFLAGS = -g -L/usr/local/lib
OBJECTS = \
AMBEFEC.o BCH.o BPTC19696.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o \
DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o \
- DStarSlowData.o Golay2087.o Golay24128.o Hamming.o HD44780.o I2CController.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o \
+ DStarSlowData.o Golay2087.o Golay24128.o Hamming.o HD44780.o I2CController.o LCDproc.o Log.o MMDVMHost.o MobileGPS.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o \
Nextion.o NullDisplay.o NXDNAudio.o NXDNControl.o NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o \
NXDNSACCH.o NXDNUDCH.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o POCSAGControl.o \
POCSAGNetwork.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o SHA256.o StopWatch.o Sync.o TFTSerial.o Thread.o \
diff --git a/Makefile.Pi.HD44780 b/Makefile.Pi.HD44780
index 918710a..fd3c32f 100644
--- a/Makefile.Pi.HD44780
+++ b/Makefile.Pi.HD44780
@@ -9,7 +9,7 @@ LDFLAGS = -g -L/usr/local/lib
OBJECTS = \
AMBEFEC.o BCH.o BPTC19696.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o \
DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o \
- DStarSlowData.o Golay2087.o Golay24128.o Hamming.o HD44780.o I2CController.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o \
+ DStarSlowData.o Golay2087.o Golay24128.o Hamming.o HD44780.o I2CController.o LCDproc.o Log.o MMDVMHost.o MobileGPS.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o \
Nextion.o NullDisplay.o NXDNAudio.o NXDNControl.o NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o \
NXDNSACCH.o NXDNUDCH.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o POCSAGControl.o \
POCSAGNetwork.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o SHA256.o StopWatch.o Sync.o TFTSerial.o Thread.o \
diff --git a/Makefile.Pi.OLED b/Makefile.Pi.OLED
index 6b305cb..9c17f06 100644
--- a/Makefile.Pi.OLED
+++ b/Makefile.Pi.OLED
@@ -9,7 +9,7 @@ LDFLAGS = -g -L/usr/local/lib
OBJECTS = \
AMBEFEC.o BCH.o BPTC19696.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o \
DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o \
- DStarSlowData.o Golay2087.o Golay24128.o Hamming.o I2CController.o OLED.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o \
+ DStarSlowData.o Golay2087.o Golay24128.o Hamming.o I2CController.o OLED.o LCDproc.o Log.o MMDVMHost.o MobileGPS.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o \
Nextion.o NullDisplay.o NXDNAudio.o NXDNControl.o NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o \
NXDNSACCH.o NXDNUDCH.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o POCSAGControl.o \
POCSAGNetwork.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o SHA256.o StopWatch.o Sync.o TFTSerial.o Thread.o \
diff --git a/Makefile.Pi.PCF8574 b/Makefile.Pi.PCF8574
index 1075ea6..29dba7c 100644
--- a/Makefile.Pi.PCF8574
+++ b/Makefile.Pi.PCF8574
@@ -9,7 +9,7 @@ LDFLAGS = -g -L/usr/local/lib
OBJECTS = \
AMBEFEC.o BCH.o BPTC19696.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o \
DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o \
- DStarSlowData.o Golay2087.o Golay24128.o Hamming.o HD44780.o I2CController.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o \
+ DStarSlowData.o Golay2087.o Golay24128.o Hamming.o HD44780.o I2CController.o LCDproc.o Log.o MMDVMHost.o MobileGPS.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o \
Nextion.o NullDisplay.o NXDNAudio.o NXDNControl.o NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o \
NXDNSACCH.o NXDNUDCH.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o POCSAGControl.o \
POCSAGNetwork.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o SHA256.o StopWatch.o Sync.o TFTSerial.o Thread.o \
diff --git a/Makefile.Solaris b/Makefile.Solaris
index a42b044..b82ee32 100644
--- a/Makefile.Solaris
+++ b/Makefile.Solaris
@@ -9,7 +9,7 @@ LDFLAGS = -g
OBJECTS = \
AMBEFEC.o BCH.o BPTC19696.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o \
DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o \
- DStarSlowData.o Golay2087.o Golay24128.o Hamming.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o \
+ DStarSlowData.o Golay2087.o Golay24128.o Hamming.o LCDproc.o Log.o MMDVMHost.o MobileGPS.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o \
NullDisplay.o NXDNAudio.o NXDNControl.o NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o NXDNSACCH.o \
NXDNUDCH.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o POCSAGControl.o POCSAGNetwork.o \
QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o SHA256.o StopWatch.o Sync.o TFTSerial.o Thread.o Timer.o UDPSocket.o \
diff --git a/MobileGPS.cpp b/MobileGPS.cpp
new file mode 100644
index 0000000..6f92aae
--- /dev/null
+++ b/MobileGPS.cpp
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2018 by Jonathan Naylor G4KLX
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "MobileGPS.h"
+
+#include
+#include
+#include
+#include
+
+CMobileGPS::CMobileGPS(const std::string& address, unsigned int port, CDMRNetwork* network) :
+m_idTimer(1000U, 60U),
+m_address(),
+m_port(port),
+m_socket(),
+m_network(network)
+{
+ assert(!address.empty());
+ assert(port > 0U);
+ assert(network != NULL);
+
+ m_address = CUDPSocket::lookup(address);
+}
+
+CMobileGPS::~CMobileGPS()
+{
+}
+
+bool CMobileGPS::open()
+{
+ bool ret = m_socket.open();
+ if (!ret)
+ return false;
+
+ m_idTimer.start();
+
+ return true;
+}
+
+void CMobileGPS::clock(unsigned int ms)
+{
+ m_idTimer.clock(ms);
+
+ if (m_idTimer.hasExpired()) {
+ pollGPS();
+ m_idTimer.start();
+ }
+
+ sendReport();
+}
+
+void CMobileGPS::close()
+{
+ m_socket.close();
+}
+
+bool CMobileGPS::pollGPS()
+{
+ return m_socket.write((unsigned char*)"MMDVMHost", 9U, m_address, m_port);
+}
+
+void CMobileGPS::sendReport()
+{
+ // Grab GPS data if it's available
+ unsigned char buffer[200U];
+ in_addr address;
+ unsigned int port;
+ int ret = m_socket.read(buffer, 200U, address, port);
+ if (ret <= 0)
+ return;
+
+ buffer[ret] = '\0';
+
+ // Parse the GPS data
+ char* pLatitude = ::strtok((char*)buffer, ",\n"); // Latitude
+ char* pLongitude = ::strtok(NULL, ",\n"); // Longitude
+
+ if (pLatitude == NULL || pLongitude == NULL)
+ return;
+
+ float latitude = ::atof(pLatitude);
+ float longitude = ::atof(pLongitude);
+
+ m_network->writeHomePosition(latitude, longitude);
+}
+
diff --git a/MobileGPS.h b/MobileGPS.h
new file mode 100644
index 0000000..8d69572
--- /dev/null
+++ b/MobileGPS.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2018 by Jonathan Naylor G4KLX
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef MobileGPS_H
+#define MobileGPS_H
+
+#include "DMRNetwork.h"
+#include "UDPSocket.h"
+#include "Timer.h"
+
+#include
+
+#if !defined(_WIN32) && !defined(_WIN64)
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#else
+#include
+#endif
+
+class CMobileGPS {
+public:
+ CMobileGPS(const std::string& address, unsigned int port, CDMRNetwork* network);
+ ~CMobileGPS();
+
+ bool open();
+
+ void clock(unsigned int ms);
+
+ void close();
+
+private:
+ CTimer m_idTimer;
+ in_addr m_address;
+ unsigned int m_port;
+ CUDPSocket m_socket;
+ CDMRNetwork* m_network;
+
+ bool pollGPS();
+ void sendReport();
+};
+
+#endif