diff --git a/CHANGES.txt b/CHANGES.txt index 0661426..d5b4c0e 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1481,3 +1481,9 @@ Simplify the Linux build. -------- Support the GPS data from the Kenwood TH-D74. + +2018xxxx +-------- + +Add support for external GPS input for mobile systems. + diff --git a/Common/APRSWriter.cpp b/Common/APRSWriter.cpp index a40f594..b027e34 100644 --- a/Common/APRSWriter.cpp +++ b/Common/APRSWriter.cpp @@ -120,9 +120,12 @@ bool CAPRSEntry::isOK() CAPRSWriter::CAPRSWriter(const wxString& hostname, unsigned int port, const wxString& gateway, const wxString& password, const wxString& address) : m_thread(NULL), -m_idTimer(1000U, 20U * 60U), // 20 minutes +m_idTimer(1000U), m_gateway(), -m_array() +m_array(), +m_address(), +m_port(0U), +m_socket(NULL) { wxASSERT(!hostname.IsEmpty()); wxASSERT(port > 0U); @@ -144,7 +147,7 @@ CAPRSWriter::~CAPRSWriter() m_array.clear(); } -void CAPRSWriter::setPort(const wxString& callsign, const wxString& band, double frequency, double offset, double range, double latitude, double longitude, double agl) +void CAPRSWriter::setPortFixed(const wxString& callsign, const wxString& band, double frequency, double offset, double range, double latitude, double longitude, double agl) { wxString temp = callsign; temp.resize(LONG_CALLSIGN_LENGTH - 1U, wxT(' ')); @@ -153,16 +156,41 @@ void CAPRSWriter::setPort(const wxString& callsign, const wxString& band, double m_array[temp] = new CAPRSEntry(callsign, band, frequency, offset, range, latitude, longitude, agl); } +void CAPRSWriter::setPortMobile(const wxString& callsign, const wxString& band, double frequency, double offset, double range, const wxString& address, unsigned int port) +{ + wxString temp = callsign; + temp.resize(LONG_CALLSIGN_LENGTH - 1U, wxT(' ')); + temp.Append(band); + + m_array[temp] = new CAPRSEntry(callsign, band, frequency, offset, range, 0.0, 0.0, 0.0); + + if (m_socket == NULL) { + m_address = CUDPReaderWriter::lookup(address); + m_port = port; + + m_socket = new CUDPReaderWriter; + } +} + bool CAPRSWriter::open() { - bool ret = m_thread->start(); - if(ret) { - sendIdFrames(); - m_idTimer.start(); - return ret; + if (m_socket != NULL) { + bool ret = m_socket->open(); + if (!ret) { + delete m_socket; + m_socket = NULL; + return false; + } + + // Poll the GPS every minute + m_idTimer.setTimeout(60U); + } else { + m_idTimer.setTimeout(20U * 60U); } - return false; + m_idTimer.start(); + + return m_thread->start(); } void CAPRSWriter::writeHeader(const wxString& callsign, const CHeaderData& header) @@ -256,9 +284,18 @@ void CAPRSWriter::clock(unsigned int ms) { m_idTimer.clock(ms); - if (m_idTimer.hasExpired()) { - sendIdFrames(); - m_idTimer.start(); + if (m_socket != NULL) { + if (m_idTimer.hasExpired()) { + pollGPS(); + m_idTimer.start(); + } + + sendIdFrameMobile(); + } else { + if (m_idTimer.hasExpired()) { + sendIdFrameFixed(); + m_idTimer.start(); + } } for (CEntry_t::iterator it = m_array.begin(); it != m_array.end(); ++it) @@ -272,10 +309,22 @@ bool CAPRSWriter::isConnected() const void CAPRSWriter::close() { + if (m_socket != NULL) { + m_socket->close(); + delete m_socket; + } + m_thread->stop(); } -void CAPRSWriter::sendIdFrames() +bool CAPRSWriter::pollGPS() +{ + assert(m_socket != NULL); + + return m_socket->write((unsigned char*)"ircDDBGateway", 13U, m_address, m_port); +} + +void CAPRSWriter::sendIdFramesFixed() { if (!m_thread->isConnected()) return; @@ -357,12 +406,12 @@ void CAPRSWriter::sendIdFrames() lon.Replace(wxT(","), wxT(".")); wxString output; - output.Printf(wxT("%s-S>APDG01,TCPIP*,qAC,%s-GS:;%-7s%-2s*%02d%02d%02dz%s%cD%s%caRNG%04.0lf %s %s"), + output.Printf(wxT("%s-S>APDG01,TCPIP*,qAC,%s-GS:;%-7s%-2s*%02d%02d%02dz%s%cD%s%ca/A=%06.0lfRNG%04.0lf %s %s"), m_gateway.c_str(), m_gateway.c_str(), entry->getCallsign().c_str(), entry->getBand().c_str(), tm->tm_mday, tm->tm_hour, tm->tm_min, lat.c_str(), (entry->getLatitude() < 0.0F) ? wxT('S') : wxT('N'), lon.c_str(), (entry->getLongitude() < 0.0F) ? wxT('W') : wxT('E'), - entry->getRange() * 0.6214, band.c_str(), desc.c_str()); + entry->getAGL() * 3.28, entry->getRange() * 0.6214, band.c_str(), desc.c_str()); char ascii[300U]; ::memset(ascii, 0x00, 300U); @@ -372,11 +421,11 @@ void CAPRSWriter::sendIdFrames() m_thread->write(ascii); if (entry->getBand().Len() == 1U) { - output.Printf(wxT("%s-%s>APDG02,TCPIP*,qAC,%s-%sS:!%s%cD%s%c&RNG%04.0lf %s %s"), + output.Printf(wxT("%s-%s>APDG02,TCPIP*,qAC,%s-%sS:!%s%cD%s%c&/A=%06.0lfRNG%04.0lf %s %s"), entry->getCallsign().c_str(), entry->getBand().c_str(), entry->getCallsign().c_str(), entry->getBand().c_str(), lat.c_str(), (entry->getLatitude() < 0.0F) ? wxT('S') : wxT('N'), lon.c_str(), (entry->getLongitude() < 0.0F) ? wxT('W') : wxT('E'), - entry->getRange() * 0.6214, band.c_str(), desc.c_str()); + entry->getAGL() * 3.28, entry->getRange() * 0.6214, band.c_str(), desc.c_str()); ::memset(ascii, 0x00, 300U); for (unsigned int i = 0U; i < output.Len(); i++) @@ -385,6 +434,158 @@ void CAPRSWriter::sendIdFrames() m_thread->write(ascii); } } - - m_idTimer.start(); } + +void CAPRSWriter::sendIdFramesMobile() +{ + // 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; + + if (!m_thread->isConnected()) + return; + + buffer[ret] = '\0'; + + // Parse the GPS data + char* pLatitude = ::strtok((char*)buffer, ",\n"); // Latitude + char* pLongitude = ::strtok(NULL, ",\n"); // Longitude + char* pAltitude = ::strtok(NULL, ",\n"); // Altitude (m) + char* pVelocity = ::strtok(NULL, ",\n"); // Velocity (kms/h) + char* pBearing = ::strtok(NULL, "\n"); // Bearing + + if (pLatitude == NULL || pLongitude == NULL || pAltitude == NULL) + return; + + double rawLatitude = ::atof(pLatitude); + double rawLongitude = ::atof(pLongitude); + double rawAltitude = ::atof(pAltitude); + + time_t now; + ::time(&now); + struct tm* tm = ::gmtime(&now); + + for (CEntry_t::iterator it = m_array.begin(); it != m_array.end(); ++it) { + CAPRSEntry* entry = it->second; + if (entry == NULL) + continue; + + wxString desc; + if (entry->getBand().Len() > 1U) { + if (entry->getFrequency() != 0.0) + desc.Printf(wxT("Data %.5lfMHz"), entry->getFrequency()); + else + desc = wxT("Data"); + } else { + if (entry->getFrequency() != 0.0) + desc.Printf(wxT("Voice %.5lfMHz %c%.4lfMHz"), + entry->getFrequency(), + entry->getOffset() < 0.0 ? wxT('-') : wxT('+'), + ::fabs(entry->getOffset())); + else + desc = wxT("Voice"); + } + + wxString band; + if (entry->getFrequency() >= 1200.0) + band = wxT("1.2"); + else if (entry->getFrequency() >= 420.0) + band = wxT("440"); + else if (entry->getFrequency() >= 144.0) + band = wxT("2m"); + else if (entry->getFrequency() >= 50.0) + band = wxT("6m"); + else if (entry->getFrequency() >= 28.0) + band = wxT("10m"); + + double tempLat = ::fabs(rawLatitude); + double tempLong = ::fabs(rawLongitude); + + double latitude = ::floor(tempLat); + double longitude = ::floor(tempLong); + + latitude = (tempLat - latitude) * 60.0 + latitude * 100.0; + longitude = (tempLong - longitude) * 60.0 + longitude * 100.0; + + wxString lat; + if (latitude >= 1000.0F) + lat.Printf(wxT("%.2lf"), latitude); + else if (latitude >= 100.0F) + lat.Printf(wxT("0%.2lf"), latitude); + else if (latitude >= 10.0F) + lat.Printf(wxT("00%.2lf"), latitude); + else + lat.Printf(wxT("000%.2lf"), latitude); + + wxString lon; + if (longitude >= 10000.0F) + lon.Printf(wxT("%.2lf"), longitude); + else if (longitude >= 1000.0F) + lon.Printf(wxT("0%.2lf"), longitude); + else if (longitude >= 100.0F) + lon.Printf(wxT("00%.2lf"), longitude); + else if (longitude >= 10.0F) + lon.Printf(wxT("000%.2lf"), longitude); + else + lon.Printf(wxT("0000%.2lf"), longitude); + + // Convert commas to periods in the latitude and longitude + lat.Replace(wxT(","), wxT(".")); + lon.Replace(wxT(","), wxT(".")); + + wxString output1; + output1.Printf(wxT("%s-S>APDG01,TCPIP*,qAC,%s-GS:;%-7s%-2s*%02d%02d%02dz%s%cD%s%ca/A=%06.0lf"), + m_gateway.c_str(), m_gateway.c_str(), entry->getCallsign().c_str(), entry->getBand().c_str(), + tm->tm_mday, tm->tm_hour, tm->tm_min, + lat.c_str(), (rawLatitude < 0.0) ? wxT('S') : wxT('N'), + lon.c_str(), (rawLongitude < 0.0) ? wxT('W') : wxT('E'), + rawAltitude * 3.28); + + wxString output2; + if (pBearing != NULL && pVelocity != NULL) { + double rawBearing = ::atof(pBearing); + double rawVelocity = ::atof(pVelocity); + + output2.Printf(wxT("%03.0lf/%03.0lf"), rawBearing, rawVelocity * 0.539957F); + } + + wxString output3; + output3.Printf(wxT("RNG%04.0lf %s %s"), entry->getRange() * 0.6214, band.c_str(), desc.c_str()); + + char ascii[300U]; + ::memset(ascii, 0x00, 300U); + unsigned int n = 0U; + for (unsigned int i = 0U; i < output1.Len(); i++, n++) + ascii[n] = output1.GetChar(i); + for (unsigned int i = 0U; i < output2.Len(); i++, n++) + ascii[n] = output2.GetChar(i); + for (unsigned int i = 0U; i < output3.Len(); i++, n++) + ascii[n] = output3.GetChar(i); + + m_thread->write(ascii); + + if (entry->getBand().Len() == 1U) { + output1.Printf(wxT("%s-%s>APDG02,TCPIP*,qAC,%s-%sS:!%s%cD%s%c&/A=%06.0lf"), + entry->getCallsign().c_str(), entry->getBand().c_str(), entry->getCallsign().c_str(), entry->getBand().c_str(), + lat.c_str(), (rawLatitude < 0.0) ? wxT('S') : wxT('N'), + lon.c_str(), (rawLongitude < 0.0) ? wxT('W') : wxT('E'), + rawAltitude * 3.28); + + ::memset(ascii, 0x00, 300U); + unsigned int n = 0U; + for (unsigned int i = 0U; i < output1.Len(); i++, n++) + ascii[n] = output1.GetChar(i); + for (unsigned int i = 0U; i < output2.Len(); i++, n++) + ascii[n] = output2.GetChar(i); + for (unsigned int i = 0U; i < output3.Len(); i++, n++) + ascii[n] = output3.GetChar(i); + + m_thread->write(ascii); + } + } +} + diff --git a/Common/APRSWriter.h b/Common/APRSWriter.h index 2a5485c..7e7438b 100644 --- a/Common/APRSWriter.h +++ b/Common/APRSWriter.h @@ -20,6 +20,7 @@ #define APRSWriter_H #include "APRSWriterThread.h" +#include "UDPReaderWriter.h" #include "APRSCollector.h" #include "DStarDefines.h" #include "HeaderData.h" @@ -72,7 +73,9 @@ public: bool open(); - void setPort(const wxString& callsign, const wxString& band, double frequency, double offset, double range, double latitude, double longitude, double agl); + void setFixedPort(const wxString& callsign, const wxString& band, double frequency, double offset, double range, double latitude, double longitude, double agl); + + void setMobilePort(const wxString& callsign, const wxString& band, double frequency, double offset, double range, const wxString& address, unsigned int port); void writeHeader(const wxString& callsign, const CHeaderData& header); @@ -89,8 +92,14 @@ private: CTimer m_idTimer; wxString m_gateway; CEntry_t m_array; + in_addr m_address; + unsigned int m_port; + CUDPReaderWriter* m_socket; - void sendIdFrames(); + bool pollGPS(); + void sendIdFramesFixed(); + void sendIdFramesMobile(); }; #endif + diff --git a/Common/IRCDDBGatewayConfig.cpp b/Common/IRCDDBGatewayConfig.cpp index 7e3da47..3748933 100644 --- a/Common/IRCDDBGatewayConfig.cpp +++ b/Common/IRCDDBGatewayConfig.cpp @@ -202,6 +202,9 @@ const wxString KEY_ECHO_ENABLED = wxT("echoEnabled"); const wxString KEY_LOG_ENABLED = wxT("logEnabled"); const wxString KEY_DRATS_ENABLED = wxT("dratsEnabled"); const wxString KEY_DTMF_ENABLED = wxT("dtmfEnabled"); +const wxString KEY_MOBILE_GPS_ENABLED = wxT("mobileGPSEnabled"); +const wxString KEY_MOBILE_GPS_ADDRESS = wxT("mobileGPSAddress"); +const wxString KEY_MOBILE_GPS_PORT = wxT("mobileGPSPort"); const wxString KEY_WINDOW_X = wxT("windowX"); const wxString KEY_WINDOW_Y = wxT("windowY"); @@ -285,6 +288,9 @@ const bool DEFAULT_INFO_ENABLED = true; const bool DEFAULT_ECHO_ENABLED = true; const bool DEFAULT_DRATS_ENABLED = false; const bool DEFAULT_DTMF_ENABLED = true; +const bool DEFAULT_MOBILE_GPS_ENABLED = false; +const wxString DEFAULT_MOBILE_GPS_ADDRESS = wxT("127.0.0.1"); +const unsigned int DEFAULT_MOBILE_GPS_PORT = 7834U; const int DEFAULT_WINDOW_X = -1; const int DEFAULT_WINDOW_Y = -1; @@ -477,6 +483,9 @@ m_echoEnabled(DEFAULT_ECHO_ENABLED), m_logEnabled(DEFAULT_LOG_ENABLED), m_dratsEnabled(DEFAULT_DRATS_ENABLED), m_dtmfEnabled(DEFAULT_DTMF_ENABLED), +m_mobileGPSEnabled(DEFAULT_MOBILE_GPS_ENABLED), +m_mobileGPSAddress(DEFAULT_MOBILE_GPS_ADDRESS), +m_mobileGPSPort(DEFAULT_MOBILE_GPS_PORT), m_x(DEFAULT_WINDOW_X), m_y(DEFAULT_WINDOW_Y) { @@ -892,6 +901,13 @@ m_y(DEFAULT_WINDOW_Y) m_config->Read(m_name + KEY_DTMF_ENABLED, &m_dtmfEnabled, DEFAULT_DTMF_ENABLED); + m_config->Read(m_name + KEY_MOBILE_GPS_ENABLED, &m_mobileGPSEnabled, DEFAULT_MOBILE_GPS_ENABLED); + + m_config->Read(m_name + KEY_MOBILE_GPS_ADDRESS, &m_mobileGPSAddress, DEFAULT_MOBILE_GPS_ADDRESS); + + m_config->Read(m_name + KEY_MOBILE_GPS_PORT, &temp, long(DEFAULT_MOBILE_GPS_PORT)); + m_mobileGPSPort = (unsigned int)temp; + m_config->Read(m_name + KEY_WINDOW_X, &temp, long(DEFAULT_WINDOW_X)); m_x = int(temp); @@ -1090,6 +1106,9 @@ m_echoEnabled(DEFAULT_ECHO_ENABLED), m_logEnabled(DEFAULT_LOG_ENABLED), m_dratsEnabled(DEFAULT_DRATS_ENABLED), m_dtmfEnabled(DEFAULT_DTMF_ENABLED), +m_mobileGPSEnabled(DEFAULT_MOBILE_GPS_ENABLED), +m_mobileGPSAddress(DEFAULT_MOBILE_GPS_ADDRESS), +m_mobileGPSPort(DEFAULT_MOBILE_GPS_PORT), m_x(DEFAULT_WINDOW_X), m_y(DEFAULT_WINDOW_Y) { @@ -1570,6 +1589,14 @@ m_y(DEFAULT_WINDOW_Y) } else if (key.IsSameAs(KEY_DTMF_ENABLED)) { val.ToLong(&temp1); m_dtmfEnabled = temp1 == 1L; + } else if (key.IsSameAs(KEY_MOBILE_GPS_ENABLED)) { + val.ToLong(&temp1); + m_mobileGPSEnabled = temp1 == 1L; + } else if (key.IsSameAs(KEY_MOBILE_GPS_ADDRESS)) { + m_mobileGPSAddress = val; + } else if (key.IsSameAs(KEY_MOBILE_GPS_PORT)) { + val.ToULong(&temp2); + m_mobileGPSPort = (unsigned int)temp2; } else if (key.IsSameAs(KEY_WINDOW_X)) { val.ToLong(&temp1); m_x = int(temp1); @@ -2199,6 +2226,20 @@ void CIRCDDBGatewayConfig::setMiscellaneous(TEXT_LANG language, bool infoEnabled m_dtmfEnabled = dtmfEnabled; } +void CIRCDDBGatewayConfig::getMobileGPS(bool& enabled, wxString& address, unsigned int& port) const +{ + enabled = m_mobileGPSEnabled; + address = m_mobileGPSAddress; + port = m_mobileGPSPort; +} + +void CIRCDDBGatewayConfig::setMobileGPS(bool enabled, const wxString& address, unsigned int port) +{ + m_mobileGPSEnabled = enabled; + m_mobileGPSAddress = address; + m_mobileGPSPort = port; +} + void CIRCDDBGatewayConfig::getPosition(int& x, int& y) const { x = m_x; @@ -2439,6 +2480,9 @@ bool CIRCDDBGatewayConfig::write() m_config->Write(m_name + KEY_LOG_ENABLED, m_logEnabled); m_config->Write(m_name + KEY_DRATS_ENABLED, m_dratsEnabled); m_config->Write(m_name + KEY_DTMF_ENABLED, m_dtmfEnabled); + m_config->Write(m_name + KEY_MOBILE_GPS_ENABLED, m_mobileGPSEnabled); + m_config->Write(m_name + KEY_MOBILE_GPS_ADDRESS, m_mobileGPSAddress); + m_config->Write(m_name + KEY_MOBILE_GPS_PORT, long(m_mobileGPSPort)); m_config->Write(m_name + KEY_WINDOW_X, long(m_x)); m_config->Write(m_name + KEY_WINDOW_Y, long(m_y)); m_config->Flush(); @@ -2647,6 +2691,9 @@ bool CIRCDDBGatewayConfig::write() buffer.Printf(wxT("%s=%d"), KEY_LOG_ENABLED.c_str(), m_logEnabled ? 1 : 0); file.AddLine(buffer); buffer.Printf(wxT("%s=%d"), KEY_DRATS_ENABLED.c_str(), m_dratsEnabled ? 1 : 0); file.AddLine(buffer); buffer.Printf(wxT("%s=%d"), KEY_DTMF_ENABLED.c_str(), m_dtmfEnabled ? 1 : 0); file.AddLine(buffer); + buffer.Printf(wxT("%s=%d"), KEY_MOBILE_GPS_ENABLED.c_str(), m_mobileGPSEnabled ? 1 : 0); file.AddLine(buffer); + buffer.Printf(wxT("%s=%s"), KEY_MOBILE_GPS_ADDRESS.c_str(), m_mobileGPSAddress.c_str()); file.AddLine(buffer); + buffer.Printf(wxT("%s=%u"), KEY_MOBILE_GPS_PORT.c_str(), m_mobileGPSPort); file.AddLine(buffer); buffer.Printf(wxT("%s=%d"), KEY_WINDOW_X.c_str(), m_x); file.AddLine(buffer); buffer.Printf(wxT("%s=%d"), KEY_WINDOW_Y.c_str(), m_y); file.AddLine(buffer); diff --git a/Common/IRCDDBGatewayConfig.h b/Common/IRCDDBGatewayConfig.h index 5583b91..b3a1dc9 100644 --- a/Common/IRCDDBGatewayConfig.h +++ b/Common/IRCDDBGatewayConfig.h @@ -112,6 +112,9 @@ public: void getMiscellaneous(TEXT_LANG& language, bool& infoEnabled, bool& echoEnabled, bool& logEnabled, bool& dratsEnabled, bool& dtmfEnabled) const; void setMiscellaneous(TEXT_LANG language, bool infoEnabled, bool echoEnabled, bool logEnabled, bool dratsEnabled, bool dtmfEnabled); + void getMobileGPS(bool& enabled, wxString& address, unsigned int& port) const; + void setMobileGPS(bool enabled, const wxString& address, unsigned int port); + void getPosition(int& x, int& y) const; void setPosition(int x, int y); @@ -305,6 +308,9 @@ private: bool m_logEnabled; bool m_dratsEnabled; bool m_dtmfEnabled; + bool m_mobileGPSEnabled; + wxString m_mobileGPSAddress; + unsigned int m_mobileGPSPort; int m_x; int m_y; }; diff --git a/ircDDBGateway/IRCDDBGatewayApp.cpp b/ircDDBGateway/IRCDDBGatewayApp.cpp index 2be5ca8..798183e 100644 --- a/ircDDBGateway/IRCDDBGatewayApp.cpp +++ b/ircDDBGateway/IRCDDBGatewayApp.cpp @@ -276,6 +276,12 @@ void CIRCDDBGatewayApp::createThread() m_config->getMiscellaneous(language, infoEnabled, echoEnabled, logEnabled, dratsEnabled, dtmfEnabled); wxLogInfo(wxT("Language: %d, info enabled: %d, echo enabled: %d, log enabled : %d, D-RATS enabled: %d, DTMF control enabled: %d"), int(language), int(infoEnabled), int(echoEnabled), int(logEnabled), int(dratsEnabled), int(dtmfEnabled)); + bool mobileGPSEnabled; + wxString mobileGPSAddress; + unsigned int mobileGPSPort; + m_config->getMobileGPS(mobileGPSEnabled, mobileGPSAddress, mobileGPSPort); + wxLogInfo(wxT("Mobile GPS: %d, address: %s, port: %u"), int(mobileGPSEnabled), mobileGPSAddress.c_str(), m_mobileGPSPort); + CIcomRepeaterProtocolHandler* icomRepeaterHandler = NULL; CHBRepeaterProtocolHandler* hbRepeaterHandler = NULL; CDummyRepeaterProtocolHandler* dummyRepeaterHandler = NULL; @@ -351,15 +357,23 @@ void CIRCDDBGatewayApp::createThread() wxLogInfo(wxT("Repeater 1 bands: %u %u %u"), band11, band12, band13); thread->addRepeater(callsign1, repeaterBand1, repeaterAddress1, repeaterPort1, repeaterType1, reflector1, atStartup1, reconnect1, dratsEnabled, frequency1, offset1, range1, latitude1, longitude1, agl1, description11, description12, url1, icomRepeaterHandler, band11, band12, band13); - if (aprs != NULL) - aprs->setPort(callsign1, repeaterBand1, frequency1, offset1, range1, latitude1, longitude1, agl1); + if (aprs != NULL) { + if (mobileGPSEnabled) + aprs->setPortMobile(callsign1, repeaterBand1, frequency1, offset1, range1, m_mobileGPSAddress, m_mobileGPSPort); + else + aprs->setPortFixed(callsign1, repeaterBand1, frequency1, offset1, range1, latitude1, longitude1, agl1); + } icomCount++; } else if (repeaterType1 == HW_HOMEBREW && hbRepeaterHandler != NULL) { thread->addRepeater(callsign1, repeaterBand1, repeaterAddress1, repeaterPort1, repeaterType1, reflector1, atStartup1, reconnect1, dratsEnabled, frequency1, offset1, range1, latitude1, longitude1, agl1, description11, description12, url1, hbRepeaterHandler); - if (aprs != NULL) - aprs->setPort(callsign1, repeaterBand1, frequency1, offset1, range1, latitude1, longitude1, agl1); + if (aprs != NULL) { + if (mobileGPSEnabled) + aprs->setPortMobile(callsign1, repeaterBand1, frequency1, offset1, range1, m_mobileGPSAddress, m_mobileGPSPort); + else + aprs->setPortFixed(callsign1, repeaterBand1, frequency1, offset1, range1, latitude1, longitude1, agl1); + } } else if (repeaterType1 == HW_DUMMY && dummyRepeaterHandler != NULL) { thread->addRepeater(callsign1, repeaterBand1, repeaterAddress1, repeaterPort1, repeaterType1, reflector1, atStartup1, reconnect1, dratsEnabled, frequency1, offset1, range1, latitude1, longitude1, agl1, description11, description12, url1, dummyRepeaterHandler); } @@ -439,15 +453,23 @@ void CIRCDDBGatewayApp::createThread() wxLogInfo(wxT("Repeater 2 bands: %u %u %u"), band21, band22, band23); thread->addRepeater(callsign2, repeaterBand2, repeaterAddress2, repeaterPort2, repeaterType2, reflector2, atStartup2, reconnect2, dratsEnabled, frequency2, offset2, range2, latitude2, longitude2, agl2, description21, description22, url2, icomRepeaterHandler, band21, band22, band23); - if (aprs != NULL) - aprs->setPort(callsign2, repeaterBand2, frequency2, offset2, range2, latitude2, longitude2, agl2); + if (aprs != NULL) { + if (mobileGPSEnabled) + aprs->setPortMobile(callsign2, repeaterBand2, frequency2, offset2, range2, m_mobileGPSAddress, m_mobileGPSPort); + else + aprs->setPortFixed(callsign2, repeaterBand2, frequency2, offset2, range2, latitude2, longitude2, agl2); + } icomCount++; } else if (repeaterType2 == HW_HOMEBREW && hbRepeaterHandler != NULL) { thread->addRepeater(callsign2, repeaterBand2, repeaterAddress2, repeaterPort2, repeaterType2, reflector2, atStartup2, reconnect2, dratsEnabled, frequency2, offset2, range2, latitude2, longitude2, agl2, description21, description22, url2, hbRepeaterHandler); - if (aprs != NULL) - aprs->setPort(callsign2, repeaterBand2, frequency2, offset2, range2, latitude2, longitude2, agl2); + if (aprs != NULL) { + if (mobileGPSEnabled) + aprs->setPortMobile(callsign2, repeaterBand2, frequency2, offset2, range2, m_mobileGPSAddress, m_mobileGPSPort); + else + aprs->setPortFixed(callsign2, repeaterBand2, frequency2, offset2, range2, latitude2, longitude2, agl2); + } } else if (repeaterType2 == HW_DUMMY && dummyRepeaterHandler != NULL) { thread->addRepeater(callsign2, repeaterBand2, repeaterAddress2, repeaterPort2, repeaterType2, reflector2, atStartup2, reconnect2, dratsEnabled, frequency2, offset2, range2, latitude2, longitude2, agl2, description21, description22, url2, dummyRepeaterHandler); } @@ -531,15 +553,23 @@ void CIRCDDBGatewayApp::createThread() wxLogInfo(wxT("Repeater 3 bands: %u %u %u"), band31, band32, band33); thread->addRepeater(callsign3, repeaterBand3, repeaterAddress3, repeaterPort3, repeaterType3, reflector3, atStartup3, reconnect3, dratsEnabled, frequency3, offset3, range3, latitude3, longitude3, agl3, description31, description32, url3, icomRepeaterHandler, band31, band32, band33); - if (aprs != NULL) - aprs->setPort(callsign3, repeaterBand3, frequency3, offset3, range3, latitude3, longitude3, agl3); + if (aprs != NULL) { + if (mobileGPSEnabled) + aprs->setPortMobile(callsign3, repeaterBand3, frequency3, offset3, range3, m_mobileGPSAddress, m_mobileGPSPort); + else + aprs->setPortFixed(callsign3, repeaterBand3, frequency3, offset3, range3, latitude3, longitude3, agl3); + } icomCount++; } else if (repeaterType3 == HW_HOMEBREW && hbRepeaterHandler != NULL) { thread->addRepeater(callsign3, repeaterBand3, repeaterAddress3, repeaterPort3, repeaterType3, reflector3, atStartup3, reconnect3, dratsEnabled, frequency3, offset3, range3, latitude3, longitude3, agl3, description31, description32, url3, hbRepeaterHandler); - if (aprs != NULL) - aprs->setPort(callsign3, repeaterBand3, frequency3, offset3, range3, latitude3, longitude3, agl3); + if (aprs != NULL) { + if (mobileGPSEnabled) + aprs->setPortMobile(callsign3, repeaterBand3, frequency3, offset3, range3, m_mobileGPSAddress, m_mobileGPSPort); + else + aprs->setPortFixed(callsign3, repeaterBand3, frequency3, offset3, range3, latitude3, longitude3, agl3); + } } else if (repeaterType3 == HW_DUMMY && dummyRepeaterHandler != NULL) { thread->addRepeater(callsign3, repeaterBand3, repeaterAddress3, repeaterPort3, repeaterType3, reflector3, atStartup3, reconnect3, dratsEnabled, frequency3, offset3, range3, latitude3, longitude3, agl3, description31, description32, url3, dummyRepeaterHandler); } @@ -627,15 +657,23 @@ void CIRCDDBGatewayApp::createThread() wxLogInfo(wxT("Repeater 4 bands: %u %u %u"), band41, band42, band43); thread->addRepeater(callsign4, repeaterBand4, repeaterAddress4, repeaterPort4, repeaterType4, reflector4, atStartup4, reconnect4, dratsEnabled, frequency4, offset4, range4, latitude4, longitude4, agl4, description41, description42, url4, icomRepeaterHandler, band41, band42, band43); - if (aprs != NULL) - aprs->setPort(callsign4, repeaterBand4, frequency4, offset4, range4, latitude4, longitude4, agl4); + if (aprs != NULL) { + if (mobileGPSEnabled) + aprs->setPortMobile(callsign4, repeaterBand4, frequency4, offset4, range4, m_mobileGPSAddress, m_mobileGPSPort); + else + aprs->setPortFixed(callsign4, repeaterBand4, frequency4, offset4, range4, latitude4, longitude4, agl4); + } icomCount++; } else if (repeaterType4 == HW_HOMEBREW && hbRepeaterHandler != NULL) { thread->addRepeater(callsign4, repeaterBand4, repeaterAddress4, repeaterPort4, repeaterType4, reflector4, atStartup4, reconnect4, dratsEnabled, frequency4, offset4, range4, latitude4, longitude4, agl4, description41, description42, url4, hbRepeaterHandler); - if (aprs != NULL) - aprs->setPort(callsign4, repeaterBand4, frequency4, offset4, range4, latitude4, longitude4, agl4); + if (aprs != NULL) { + if (mobileGPSEnabled) + aprs->setPortMobile(callsign4, repeaterBand4, frequency4, offset4, range4, m_mobileGPSAddress, m_mobileGPSPort); + else + aprs->setPortFixed(callsign4, repeaterBand4, frequency4, offset4, range4, latitude4, longitude4, agl4); + } } else if (repeaterType4 == HW_DUMMY && dummyRepeaterHandler != NULL) { thread->addRepeater(callsign4, repeaterBand4, repeaterAddress4, repeaterPort4, repeaterType4, reflector4, atStartup4, reconnect4, dratsEnabled, frequency4, offset4, range4, latitude4, longitude4, agl4, description41, description42, url4, dummyRepeaterHandler); } diff --git a/ircDDBGateway/IRCDDBGatewayAppD.cpp b/ircDDBGateway/IRCDDBGatewayAppD.cpp index 4f0a438..00122c4 100644 --- a/ircDDBGateway/IRCDDBGatewayAppD.cpp +++ b/ircDDBGateway/IRCDDBGatewayAppD.cpp @@ -265,6 +265,12 @@ bool CIRCDDBGatewayAppD::createThread() config.getMiscellaneous(language, infoEnabled, echoEnabled, logEnabled, dratsEnabled, dtmfEnabled); wxLogInfo(wxT("Language: %d, info enabled: %d, echo enabled: %d, log enabled : %d, D-RATS enabled: %d, DTMF control enabled: %d"), int(language), int(infoEnabled), int(echoEnabled), int(logEnabled), int(dratsEnabled), int(dtmfEnabled)); + bool mobileGPSEnabled; + wxString mobileGPSAddress; + unsigned int mobileGPSPort; + config.getMobileGPS(mobileGPSEnabled, mobileGPSAddress, mobileGPSPort); + wxLogInfo(wxT("Mobile GPS: %d, address: %s, port: %u"), int(mobileGPSEnabled), mobileGPSAddress.c_str(), m_mobileGPSPort); + CIcomRepeaterProtocolHandler* icomRepeaterHandler = NULL; CHBRepeaterProtocolHandler* hbRepeaterHandler = NULL; CDummyRepeaterProtocolHandler* dummyRepeaterHandler = NULL; @@ -340,15 +346,23 @@ bool CIRCDDBGatewayAppD::createThread() wxLogInfo(wxT("Repeater 1 bands: %u %u %u"), band11, band12, band13); m_thread->addRepeater(callsign1, repeaterBand1, repeaterAddress1, repeaterPort1, repeaterType1, reflector1, atStartup1, reconnect1, dratsEnabled, frequency1, offset1, range1, latitude1, longitude1, agl1, description11, description12, url1, icomRepeaterHandler, band11, band12, band13); - if (aprs != NULL) - aprs->setPort(callsign1, repeaterBand1, frequency1, offset1, range1, latitude1, longitude1, agl1); + if (aprs != NULL) { + if (mobileGPSEnabled) + aprs->setPortMobile(callsign1, repeaterBand1, frequency1, offset1, range1, m_mobileGPSAddress, m_mobileGPSPort); + else + aprs->setPortFixed(callsign1, repeaterBand1, frequency1, offset1, range1, latitude1, longitude1, agl1); + } icomCount++; } else if (repeaterType1 == HW_HOMEBREW && hbRepeaterHandler != NULL) { m_thread->addRepeater(callsign1, repeaterBand1, repeaterAddress1, repeaterPort1, repeaterType1, reflector1, atStartup1, reconnect1, dratsEnabled, frequency1, offset1, range1, latitude1, longitude1, agl1, description11, description12, url1, hbRepeaterHandler); - if (aprs != NULL) - aprs->setPort(callsign1, repeaterBand1, frequency1, offset1, range1, latitude1, longitude1, agl1); + if (aprs != NULL) { + if (mobileGPSEnabled) + aprs->setPortMobile(callsign1, repeaterBand1, frequency1, offset1, range1, m_mobileGPSAddress, m_mobileGPSPort); + else + aprs->setPortFixed(callsign1, repeaterBand1, frequency1, offset1, range1, latitude1, longitude1, agl1); + } } else if (repeaterType1 == HW_DUMMY && dummyRepeaterHandler != NULL) { m_thread->addRepeater(callsign1, repeaterBand1, repeaterAddress1, repeaterPort1, repeaterType1, reflector1, atStartup1, reconnect1, dratsEnabled, frequency1, offset1, range1, latitude1, longitude1, agl1, description11, description12, url1, dummyRepeaterHandler); } @@ -428,15 +442,23 @@ bool CIRCDDBGatewayAppD::createThread() wxLogInfo(wxT("Repeater 2 bands: %u %u %u"), band21, band22, band23); m_thread->addRepeater(callsign2, repeaterBand2, repeaterAddress2, repeaterPort2, repeaterType2, reflector2, atStartup2, reconnect2, dratsEnabled, frequency2, offset2, range2, latitude2, longitude2, agl2, description21, description22, url2, icomRepeaterHandler, band21, band22, band23); - if (aprs != NULL) - aprs->setPort(callsign2, repeaterBand2, frequency2, offset2, range2, latitude2, longitude2, agl2); + if (aprs != NULL) { + if (mobileGPSEnabled) + aprs->setPortMobile(callsign2, repeaterBand2, frequency2, offset2, range2, m_mobileGPSAddress, m_mobileGPSPort); + else + aprs->setPortFixed(callsign2, repeaterBand2, frequency2, offset2, range2, latitude2, longitude2, agl2); + } icomCount++; } else if (repeaterType2 == HW_HOMEBREW && hbRepeaterHandler != NULL) { m_thread->addRepeater(callsign2, repeaterBand2, repeaterAddress2, repeaterPort2, repeaterType2, reflector2, atStartup2, reconnect2, dratsEnabled, frequency2, offset2, range2, latitude2, longitude2, agl2, description21, description22, url2, hbRepeaterHandler); - if (aprs != NULL) - aprs->setPort(callsign2, repeaterBand2, frequency2, offset2, range2, latitude2, longitude2, agl2); + if (aprs != NULL) { + if (mobileGPSEnabled) + aprs->setPortMobile(callsign2, repeaterBand2, frequency2, offset2, range2, m_mobileGPSAddress, m_mobileGPSPort); + else + aprs->setPortFixed(callsign2, repeaterBand2, frequency2, offset2, range2, latitude2, longitude2, agl1); + } } else if (repeaterType2 == HW_DUMMY && dummyRepeaterHandler != NULL) { m_thread->addRepeater(callsign2, repeaterBand2, repeaterAddress2, repeaterPort2, repeaterType2, reflector2, atStartup2, reconnect2, dratsEnabled, frequency2, offset2, range2, latitude2, longitude2, agl2, description21, description22, url2, dummyRepeaterHandler); } @@ -520,15 +542,23 @@ bool CIRCDDBGatewayAppD::createThread() wxLogInfo(wxT("Repeater 3 bands: %u %u %u"), band31, band32, band33); m_thread->addRepeater(callsign3, repeaterBand3, repeaterAddress3, repeaterPort3, repeaterType3, reflector3, atStartup3, reconnect3, dratsEnabled, frequency3, offset3, range3, latitude3, longitude3, agl3, description31, description32, url3, icomRepeaterHandler, band31, band32, band33); - if (aprs != NULL) - aprs->setPort(callsign3, repeaterBand3, frequency3, offset3, range3, latitude3, longitude3, agl3); + if (aprs != NULL) { + if (mobileGPSEnabled) + aprs->setPortMobile(callsign3, repeaterBand3, frequency3, offset3, range3, m_mobileGPSAddress, m_mobileGPSPort); + else + aprs->setPortFixed(callsign3, repeaterBand3, frequency3, offset3, range3, latitude3, longitude3, agl3); + } icomCount++; } else if (repeaterType3 == HW_HOMEBREW && hbRepeaterHandler != NULL) { m_thread->addRepeater(callsign3, repeaterBand3, repeaterAddress3, repeaterPort3, repeaterType3, reflector3, atStartup3, reconnect3, dratsEnabled, frequency3, offset3, range3, latitude3, longitude3, agl3, description31, description32, url3, hbRepeaterHandler); - if (aprs != NULL) - aprs->setPort(callsign3, repeaterBand3, frequency3, offset3, range3, latitude3, longitude3, agl3); + if (aprs != NULL) { + if (mobileGPSEnabled) + aprs->setPortMobile(callsign3, repeaterBand3, frequency3, offset3, range3, m_mobileGPSAddress, m_mobileGPSPort); + else + aprs->setPortFixed(callsign3, repeaterBand3, frequency3, offset3, range3, latitude3, longitude3, agl3); + } } else if (repeaterType3 == HW_DUMMY && dummyRepeaterHandler != NULL) { m_thread->addRepeater(callsign3, repeaterBand3, repeaterAddress3, repeaterPort3, repeaterType3, reflector3, atStartup3, reconnect3, dratsEnabled, frequency3, offset3, range3, latitude3, longitude3, agl3, description31, description32, url3, dummyRepeaterHandler); } @@ -616,15 +646,23 @@ bool CIRCDDBGatewayAppD::createThread() wxLogInfo(wxT("Repeater 4 bands: %u %u %u"), band41, band42, band43); m_thread->addRepeater(callsign4, repeaterBand4, repeaterAddress4, repeaterPort4, repeaterType4, reflector4, atStartup4, reconnect4, dratsEnabled, frequency4, offset4, range4, latitude4, longitude4, agl4, description41, description42, url4, icomRepeaterHandler, band41, band42, band43); - if (aprs != NULL) - aprs->setPort(callsign4, repeaterBand4, frequency4, offset4, range4, latitude4, longitude4, agl4); + if (aprs != NULL) { + if (mobileGPSEnabled) + aprs->setPortMobile(callsign4, repeaterBand4, frequency4, offset4, range4, m_mobileGPSAddress, m_mobileGPSPort); + else + aprs->setPortFixed(callsign4, repeaterBand4, frequency4, offset4, range4, latitude4, longitude4, agl4); + } icomCount++; } else if (repeaterType4 == HW_HOMEBREW && hbRepeaterHandler != NULL) { m_thread->addRepeater(callsign4, repeaterBand4, repeaterAddress4, repeaterPort4, repeaterType4, reflector4, atStartup4, reconnect4, dratsEnabled, frequency4, offset4, range4, latitude4, longitude4, agl4, description41, description42, url4, hbRepeaterHandler); - if (aprs != NULL) - aprs->setPort(callsign4, repeaterBand4, frequency4, offset4, range4, latitude4, longitude4, agl4); + if (aprs != NULL) { + if (mobileGPSEnabled) + aprs->setPortMobile(callsign4, repeaterBand4, frequency4, offset4, range4, m_mobileGPSAddress, m_mobileGPSPort); + else + aprs->setPortFixed(callsign4, repeaterBand4, frequency4, offset4, range4, latitude4, longitude4, agl4); + } } else if (repeaterType4 == HW_DUMMY && dummyRepeaterHandler != NULL) { m_thread->addRepeater(callsign4, repeaterBand4, repeaterAddress4, repeaterPort4, repeaterType4, reflector4, atStartup4, reconnect4, dratsEnabled, frequency4, offset4, range4, latitude4, longitude4, agl4, description41, description42, url4, dummyRepeaterHandler); }