From e847711d1775bd4b3d91560edb1f3efc41ba2d5d Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Tue, 6 Nov 2018 12:14:57 +0000 Subject: [PATCH] Add MobileGPS support for DMR. --- Conf.cpp | 33 ++++++++++++- Conf.h | 8 +++ MMDVM.ini | 5 ++ MMDVMHost.cpp | 29 ++++++++++- MMDVMHost.h | 2 + MMDVMHost.vcxproj | 4 +- MMDVMHost.vcxproj.filters | 8 ++- Makefile | 2 +- Makefile.Pi | 2 +- Makefile.Pi.Adafruit | 2 +- Makefile.Pi.HD44780 | 2 +- Makefile.Pi.OLED | 2 +- Makefile.Pi.PCF8574 | 2 +- Makefile.Solaris | 2 +- MobileGPS.cpp | 101 ++++++++++++++++++++++++++++++++++++++ MobileGPS.h | 63 ++++++++++++++++++++++++ 16 files changed, 255 insertions(+), 12 deletions(-) create mode 100644 MobileGPS.cpp create mode 100644 MobileGPS.h 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