Merge branch 'master' into master

This commit is contained in:
Sergei 2020-06-22 15:38:53 +03:00 committed by GitHub
commit 56fb73ee67
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
94 changed files with 3865 additions and 1785 deletions

2
.gitignore vendored
View file

@ -8,4 +8,4 @@ Release
*.bak *.bak
.vs .vs
*.a *.a
*.d

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2014 by Jonathan Naylor G4KLX * Copyright (C) 2014,2020 by Jonathan Naylor G4KLX
* APRSTransmit Copyright (C) 2015 Geoffrey Merck F4FXL / KC3FRA * APRSTransmit Copyright (C) 2015 Geoffrey Merck F4FXL / KC3FRA
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
@ -24,7 +24,7 @@
CAPRSTransmit::CAPRSTransmit(const wxString& callsign, const wxString& text) : CAPRSTransmit::CAPRSTransmit(const wxString& callsign, const wxString& text) :
m_socket(wxEmptyString, 0U), m_socket(),
m_repeaterCallsign(callsign), m_repeaterCallsign(callsign),
m_APRSCallsign(callsign), m_APRSCallsign(callsign),
m_text(text) m_text(text)

View file

@ -22,29 +22,29 @@
<ProjectGuid>{F26EA1DB-74CF-4C52-A425-00235C8ABED2}</ProjectGuid> <ProjectGuid>{F26EA1DB-74CF-4C52-A425-00235C8ABED2}</ProjectGuid>
<RootNamespace>APRSTransmit</RootNamespace> <RootNamespace>APRSTransmit</RootNamespace>
<Keyword>Win32Proj</Keyword> <Keyword>Win32Proj</Keyword>
<WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion> <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
@ -80,9 +80,11 @@
<OutDir>$(SolutionDir)$(Configuration)\</OutDir> <OutDir>$(SolutionDir)$(Configuration)\</OutDir>
<IntDir>$(Configuration)\$(ProjectName)</IntDir> <IntDir>$(Configuration)\$(ProjectName)</IntDir>
<LinkIncremental>false</LinkIncremental> <LinkIncremental>false</LinkIncremental>
<IncludePath>$(WXWIN)\include;$(WXWIN)\lib\vc_dll\mswu;$(IncludePath)</IncludePath>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental> <LinkIncremental>false</LinkIncremental>
<IncludePath>$(WXWIN)\include;$(WXWIN)\lib\vc_x64_dll\mswu;$(IncludePath)</IncludePath>
</PropertyGroup> </PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile> <ClCompile>

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2014 by Jonathan Naylor G4KLX * Copyright (C) 2014,2018,2020 by Jonathan Naylor G4KLX
* APRSTransmit Copyright (C) 2015 Geoffrey Merck F4FXL / KC3FRA * APRSTransmit Copyright (C) 2015 Geoffrey Merck F4FXL / KC3FRA
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
@ -20,7 +20,6 @@
#include "DStarDefines.h" #include "DStarDefines.h"
#include "APRSTransmit.h" #include "APRSTransmit.h"
#include "APRSTransmitAppD.h" #include "APRSTransmitAppD.h"
#include "APRSWriterThread.h"
#include <wx/textfile.h> #include <wx/textfile.h>
#include <wx/cmdline.h> #include <wx/cmdline.h>
@ -35,7 +34,6 @@
const wxChar* REPEATER_PARAM = wxT("Repeater"); const wxChar* REPEATER_PARAM = wxT("Repeater");
const wxChar* APRS_HOST = wxT("host"); const wxChar* APRS_HOST = wxT("host");
const wxChar* APRS_PORT = wxT("port"); const wxChar* APRS_PORT = wxT("port");
const wxChar* APRS_FILTER = wxT("filter");
const wxChar* DAEMON_SWITCH = wxT("daemon"); const wxChar* DAEMON_SWITCH = wxT("daemon");
static CAPRSTransmitAppD* m_aprsTransmit = NULL; static CAPRSTransmitAppD* m_aprsTransmit = NULL;
@ -45,12 +43,6 @@ static void handler(int signum)
m_aprsTransmit->kill(); m_aprsTransmit->kill();
} }
static void aprsFrameCallback(const wxString& aprsFrame)
{
//wxLogMessage(wxT("Received APRS Frame : ") + aprsFrame);
m_aprsTransmit->m_aprsFramesQueue->addData(new wxString(aprsFrame.Clone()));
}
int main(int argc, char** argv) int main(int argc, char** argv)
{ {
bool res = ::wxInitialize(); bool res = ::wxInitialize();
@ -63,7 +55,6 @@ int main(int argc, char** argv)
parser.AddParam(REPEATER_PARAM, wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL); parser.AddParam(REPEATER_PARAM, wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL);
parser.AddOption(APRS_HOST, wxEmptyString, wxEmptyString, wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL); parser.AddOption(APRS_HOST, wxEmptyString, wxEmptyString, wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL);
parser.AddOption(APRS_PORT, wxEmptyString, wxEmptyString, wxCMD_LINE_VAL_NUMBER, wxCMD_LINE_PARAM_OPTIONAL); parser.AddOption(APRS_PORT, wxEmptyString, wxEmptyString, wxCMD_LINE_VAL_NUMBER, wxCMD_LINE_PARAM_OPTIONAL);
parser.AddOption(APRS_FILTER, wxEmptyString, wxEmptyString, wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL);
parser.AddSwitch(DAEMON_SWITCH, wxEmptyString, wxEmptyString, wxCMD_LINE_PARAM_OPTIONAL); parser.AddSwitch(DAEMON_SWITCH, wxEmptyString, wxEmptyString, wxCMD_LINE_PARAM_OPTIONAL);
int cmd = parser.Parse(); int cmd = parser.Parse();
@ -73,7 +64,7 @@ int main(int argc, char** argv)
} }
if (parser.GetParamCount() < 1U) { if (parser.GetParamCount() < 1U) {
::fprintf(stderr, "aprstransmitd: invalid command line usage: aprstransmitd <repeater> [-host <aprs_server>] [-port <aprs_port>] [-filter <aprsis_filter1>[;<aprsis_filter2]] [-daemon] exiting\n"); ::fprintf(stderr, "aprstransmitd: invalid command line usage: aprstransmitd <repeater> [-host <aprs_server>] [-port <aprs_port>] [-daemon] exiting\n");
::wxUninitialize(); ::wxUninitialize();
return 1; return 1;
} }
@ -91,26 +82,17 @@ int main(int argc, char** argv)
repeater.MakeUpper(); repeater.MakeUpper();
long aprsPort; long aprsPort;
if(!parser.Found(APRS_PORT, &aprsPort)) if (!parser.Found(APRS_PORT, &aprsPort))
aprsPort = 14580; aprsPort = 14580L;
wxString aprsHost; wxString aprsHost;
if(!parser.Found(APRS_HOST, &aprsHost)){ if (!parser.Found(APRS_HOST, &aprsHost))
aprsHost = wxT("rotate.aprs2.net"); aprsHost = wxT("rotate.aprs2.net");
}
wxString aprsFilter;
if(!parser.Found(APRS_FILTER, &aprsFilter)) {
/* no filter specified on command line,
build one which will tell the APRS server to pass
us all stations 50km around our repeater */
aprsFilter = wxT("m/50");
}
bool daemon = parser.Found(DAEMON_SWITCH); bool daemon = parser.Found(DAEMON_SWITCH);
#if defined(__WINDOWS__) #if defined(__WINDOWS__)
m_aprsTransmit = new CAPRSTransmitAppD(repeater, aprsHost, aprsPort, aprsFilter, daemon); m_aprsTransmit = new CAPRSTransmitAppD(repeater, aprsHost, aprsPort, daemon);
if (!m_aprsTransmit->init()) { if (!m_aprsTransmit->init()) {
::wxUninitialize(); ::wxUninitialize();
return 1; return 1;
@ -143,7 +125,7 @@ int main(int argc, char** argv)
::fclose(fp); ::fclose(fp);
} }
m_aprsTransmit = new CAPRSTransmitAppD(repeater, aprsHost, aprsPort, aprsFilter, daemon); m_aprsTransmit = new CAPRSTransmitAppD(repeater, aprsHost, aprsPort, daemon);
if (!m_aprsTransmit->init()) { if (!m_aprsTransmit->init()) {
::wxUninitialize(); ::wxUninitialize();
return 1; return 1;
@ -162,13 +144,12 @@ int main(int argc, char** argv)
CAPRSTransmitAppD::CAPRSTransmitAppD(const wxString& repeater, const wxString& aprsHost, unsigned int aprsPort, const wxString& aprsFilter, bool daemon) : CAPRSTransmitAppD::CAPRSTransmitAppD(const wxString& repeater, const wxString& aprsHost, unsigned int aprsPort, bool daemon) :
m_aprsFramesQueue(NULL), m_aprsFramesQueue(NULL),
m_repeater(repeater), m_repeater(repeater),
m_aprsHost(aprsHost), m_aprsHost(aprsHost),
m_aprsFilter(aprsFilter),
m_aprsPort(aprsPort), m_aprsPort(aprsPort),
m_aprsThread(NULL), m_aprsSocket(NULL),
m_run(false), m_run(false),
m_checker(NULL), m_checker(NULL),
m_daemon(daemon) m_daemon(daemon)
@ -220,9 +201,8 @@ void CAPRSTransmitAppD::run()
if(m_run) return; if(m_run) return;
m_aprsFramesQueue = new CRingBuffer<wxString*>(30U); m_aprsFramesQueue = new CRingBuffer<wxString*>(30U);
m_aprsThread = new CAPRSWriterThread(m_repeater, wxT("0.0.0.0"), m_aprsHost, m_aprsPort, m_aprsFilter, wxT("APRSTransmit 1.1")); m_aprsSocket = new CUDPReaderWriter;
m_aprsThread->setReadAPRSCallback(aprsFrameCallback); m_aprsSocket->open();
m_aprsThread->start();
wxString * aprsFrame; wxString * aprsFrame;
@ -230,38 +210,36 @@ void CAPRSTransmitAppD::run()
while(m_run){ while(m_run){
wxMilliSleep(10U); wxMilliSleep(10U);
aprsFrame = m_aprsFramesQueue->getData(); aprsFrame = m_aprsFramesQueue->getData();
if(aprsFrame){ if (aprsFrame != NULL) {
CAPRSTransmit aprsTransmit(m_repeater, wxString(*aprsFrame)); CAPRSTransmit aprsTransmit(m_repeater, wxString(*aprsFrame));
aprsTransmit.run(); aprsTransmit.run();
delete aprsFrame; delete aprsFrame;
} }
} }
m_aprsThread->stop();
cleanup(); cleanup();
} }
void CAPRSTransmitAppD::cleanup() void CAPRSTransmitAppD::cleanup()
{ {
m_aprsThread->setReadAPRSCallback(NULL); if (m_aprsFramesQueue != NULL)
if(m_aprsFramesQueue)
{ {
while(m_aprsFramesQueue->peek()) delete m_aprsFramesQueue->getData(); while (m_aprsFramesQueue->peek()) delete m_aprsFramesQueue->getData();
delete m_aprsFramesQueue; delete m_aprsFramesQueue;
m_aprsFramesQueue = NULL; m_aprsFramesQueue = NULL;
} }
if(m_checker) {
if (m_checker != NULL) {
delete m_checker; delete m_checker;
m_checker = NULL; m_checker = NULL;
} }
if(m_aprsThread) if (m_aprsSocket != NULL)
{ {
delete m_aprsThread; m_aprsSocket->close();
m_aprsThread = NULL; delete m_aprsSocket;
m_aprsSocket = NULL;
} }
} }

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2014 by Jonathan Naylor G4KLX * Copyright (C) 2014,2018,2020 by Jonathan Naylor G4KLX
* APRSTransmit Copyright (C) 2015 Geoffrey Merck F4FXL / KC3FRA * APRSTransmit Copyright (C) 2015 Geoffrey Merck F4FXL / KC3FRA
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
@ -20,8 +20,8 @@
#ifndef APRSTransmitAppD_H #ifndef APRSTransmitAppD_H
#define APRSTransmitAppD_H #define APRSTransmitAppD_H
#include "UDPReaderWriter.h"
#include "RingBuffer.h" #include "RingBuffer.h"
#include "APRSWriterThread.h"
#include <wx/wx.h> #include <wx/wx.h>
#include <wx/config.h> #include <wx/config.h>
@ -31,7 +31,7 @@
class CAPRSTransmitAppD { class CAPRSTransmitAppD {
public: public:
CAPRSTransmitAppD(const wxString& repeater, const wxString& aprsHost, unsigned int aprsPort, const wxString& aprsFilter, bool daemon); CAPRSTransmitAppD(const wxString& repeater, const wxString& aprsHost, unsigned int aprsPort, bool daemon);
~CAPRSTransmitAppD(); ~CAPRSTransmitAppD();
CRingBuffer<wxString*> * m_aprsFramesQueue; CRingBuffer<wxString*> * m_aprsFramesQueue;
@ -41,9 +41,9 @@ public:
void kill(); void kill();
private: private:
wxString m_repeater, m_aprsHost, m_aprsFilter; wxString m_repeater, m_aprsHost;
unsigned int m_aprsPort; unsigned int m_aprsPort;
CAPRSWriterThread * m_aprsThread; CUDPReaderWriter * m_aprsSocket;
bool m_run; bool m_run;
wxSingleInstanceChecker * m_checker; wxSingleInstanceChecker * m_checker;
bool m_daemon; bool m_daemon;

View file

@ -22,29 +22,29 @@
<ProjectGuid>{C706EF5D-3917-4796-8BEB-823498A1B13C}</ProjectGuid> <ProjectGuid>{C706EF5D-3917-4796-8BEB-823498A1B13C}</ProjectGuid>
<RootNamespace>APRSTransmit</RootNamespace> <RootNamespace>APRSTransmit</RootNamespace>
<Keyword>Win32Proj</Keyword> <Keyword>Win32Proj</Keyword>
<WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion> <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
@ -80,9 +80,11 @@
<OutDir>$(SolutionDir)$(Configuration)\</OutDir> <OutDir>$(SolutionDir)$(Configuration)\</OutDir>
<IntDir>$(Configuration)\$(ProjectName)\</IntDir> <IntDir>$(Configuration)\$(ProjectName)\</IntDir>
<LinkIncremental>false</LinkIncremental> <LinkIncremental>false</LinkIncremental>
<IncludePath>$(WXWIN)\include;$(WXWIN)\lib\vc_dll\mswu;$(IncludePath)</IncludePath>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental> <LinkIncremental>false</LinkIncremental>
<IncludePath>$(WXWIN)\include;$(WXWIN)\lib\vc_x64_dll\mswu;$(IncludePath)</IncludePath>
</PropertyGroup> </PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile> <ClCompile>

View file

@ -1,16 +1,24 @@
OBJECTS = APRSParser.o APRSTransmitAppD.o APRSTransmit.o OBJECTS = APRSParser.o APRSTransmitAppD.o APRSTransmit.o
.PHONY: all
all: aprstransmitd all: aprstransmitd
aprstransmitd: $(OBJECTS) aprstransmitd: $(OBJECTS) ../Common/Common.a
$(CXX) $(OBJECTS) ../Common/Common.a $(LDFLAGS) $(LIBS) -o aprstransmitd $(CXX) $(OBJECTS) ../Common/Common.a $(LDFLAGS) $(LIBS) -o aprstransmitd
-include $(OBJECTS:.o=.d)
%.o: %.cpp %.o: %.cpp
$(CXX) -DwxUSE_GUI=0 $(CFLAGS) -I../Common -c -o $@ $< $(CXX) -DwxUSE_GUI=0 $(CFLAGS) -I../Common -c -o $@ $<
$(CXX) -MM -DwxUSE_GUI=0 $(CFLAGS) -I../Common $< > $*.d
.PHONY: install
install: install:
install -g bin -o root -m 0775 aprstransmitd $(BINDIR) install -g root -o root -m 0755 aprstransmitd $(DESTDIR)$(BINDIR)
.PHONY: clean
clean: clean:
$(RM) aprstransmitd *.o *.d *.bak *~ $(RM) aprstransmitd *.o *.d *.bak *~
../Common/Common.a:

85
BUILD.md Normal file
View file

@ -0,0 +1,85 @@
# Building ircDDBGateway
## Windows
To use the ircDDB Gateway software you will first need to build the latest
version of wxWidgets (http://www.wxwidgets.org), the version I used was 3.0.4.
I also installed it in the default location which is C:\wxWidgets-3.0.4.
For compiling I use Visual C++ 2017 Community Edition downloaded from Microsoft
for free. I recommend that you use the same.
To build wxWidgets, you simply need to open Visual Studio 2017 using the File ->
Open -> Projects/Solutions and load the wx_vc12.sln file to be found in
wxWidgets-3.0.4\build\msw directory and then go into Batch Build and select the
DLL Debug and DLL Release entries for every one, this take a little time! Then
build them.
The path names for wxWidgets are embedded within the Solution and Project
preferences, and will need changing if anything other than these default
locations are used. The first pass through the compiler will no doubt tell
you all that you need to know if there are problems.
Once you have built the executables, you will need to copy the correct wxWidgets
files to the same location as the executables. For 32-bit systems these are
wxbase30u_vc_custom.dll, wxmsw30u_adv_vc_custom.dll, and
wxmsw30u_core_vc_custom.dll. On 64-bit systems you'll need
wxbase30u_vc_x64_custom.dll, wxmsw30u_adv_vc_x64_custom.dll, and
wxmsw30u_core_vc_x64_custom.dll
If you are running in debug mode then the required wxWidgets files have the names
xxx30ud_xxxx instead. These can be found in the wxWidgets-3.0.4\lib\vc_dll
directory.
It is also probable that you'll need to install a copy of the latest Visual C++
run-time libraries from Microsoft, if you are not running the gateway software
on the same machine as the development/compilation was done on. You can find the
latest versions at https://support.microsoft.com/en-gb/help/2977003/the-latest-supported-visual-c-downloads
## Linux
You need to ensure that wxGTK is already installed on your machine.
Debian, Ubuntu:
```sh
sudo apt install libwxgtk3.0-dev
```
Fedora, CentOS, RedHat:
```sh
sudo dnf install wxGTK3-devel
```
To install them from scratch, you need to get wxGTK from
<http://www.wxwidgets.org>. If you do a "make install" on it then they'll
be installed in the right places and nothing more needs to be done.
To actually build the software, type "make" in the same directory as this file
and all should build without errors, there may be a warning or two though. Once
compiled log in as root or use the sudo command, and do "make install".
You can optionally specify some make variables to alter the default behavior:
| Parameter | Default | Description |
| --------- | --------- | --------------------------------- |
| BUILD | `debug` | `debug` or `release` |
| TARGET | _not set_ | when set to `opendv`, installs files in legacy locations |
| DATADIR | `/usr/share/ircddbgateway` | where AMBE voice and host lists are kept |
| LOGDIR | `/var/log` | location of log files |
| CONFDIR | `/etc` | location of configuration files |
| BINDIR | `/usr/bin` | program binaries installed here |
| DESTDIR | _not set_ | destination for staged build |
### Example
```sh
cd ircDDBGateway
make -j4 BUILD=release CONFDIR=/etc/dstar
sudo make install
```
This would build and install all the programs in this repo using 4 threads
(parallel build jobs), in release mode (no debug symbols) with a modified
configuration directory.

View file

@ -1,4 +1,4 @@
ircDDB Gateway - 20180509 ircDDB Gateway - 20180627
========================= =========================
20101010 20101010
@ -1476,3 +1476,15 @@ Added APRSTransmit program from F4FXL.
Move to wxWidgets-3.0.x. Move to wxWidgets-3.0.x.
UPdate to VS2017 on Windows for 32 and 64 bit compilation. UPdate to VS2017 on Windows for 32 and 64 bit compilation.
Simplify the Linux build. Simplify the Linux build.
20180627
--------
Support the GPS data from the Kenwood TH-D74.
2018xxxx
--------
Add support for external GPS input for mobile systems.
Add audio bypass processing for fast data mode.

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2010,2012,2013,2014 by Jonathan Naylor G4KLX * Copyright (C) 2010,2012,2013,2014,2018 by Jonathan Naylor G4KLX
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -24,6 +24,9 @@ const unsigned int APRS_CSUM_LENGTH = 4U;
const unsigned int APRS_DATA_LENGTH = 300U; const unsigned int APRS_DATA_LENGTH = 300U;
const unsigned int SLOW_DATA_BLOCK_LENGTH = 6U; const unsigned int SLOW_DATA_BLOCK_LENGTH = 6U;
const char APRS_OVERLAY = '\\';
const char APRS_SYMBOL = 'K';
CAPRSCollector::CAPRSCollector() : CAPRSCollector::CAPRSCollector() :
m_state(AS_NONE), m_state(AS_NONE),
m_ggaData(NULL), m_ggaData(NULL),
@ -35,16 +38,14 @@ m_rmcValid(false),
m_crcData(NULL), m_crcData(NULL),
m_crcLength(0U), m_crcLength(0U),
m_crcValid(false), m_crcValid(false),
m_txtData(NULL),
m_txtLength(0U),
m_txtValid(false),
m_buffer(NULL), m_buffer(NULL),
m_slowData(SS_FIRST) m_slowData(SS_FIRST),
m_collector(),
m_callsign()
{ {
m_ggaData = new unsigned char[APRS_DATA_LENGTH]; m_ggaData = new unsigned char[APRS_DATA_LENGTH];
m_rmcData = new unsigned char[APRS_DATA_LENGTH]; m_rmcData = new unsigned char[APRS_DATA_LENGTH];
m_crcData = new unsigned char[APRS_DATA_LENGTH]; m_crcData = new unsigned char[APRS_DATA_LENGTH];
m_txtData = new unsigned char[APRS_DATA_LENGTH];
m_buffer = new unsigned char[SLOW_DATA_BLOCK_LENGTH]; m_buffer = new unsigned char[SLOW_DATA_BLOCK_LENGTH];
} }
@ -53,10 +54,14 @@ CAPRSCollector::~CAPRSCollector()
delete[] m_ggaData; delete[] m_ggaData;
delete[] m_rmcData; delete[] m_rmcData;
delete[] m_crcData; delete[] m_crcData;
delete[] m_txtData;
delete[] m_buffer; delete[] m_buffer;
} }
void CAPRSCollector::writeHeader(const wxString& callsign)
{
m_callsign = callsign;
}
bool CAPRSCollector::writeData(const unsigned char* data) bool CAPRSCollector::writeData(const unsigned char* data)
{ {
wxASSERT(data != NULL); wxASSERT(data != NULL);
@ -77,11 +82,11 @@ bool CAPRSCollector::writeData(const unsigned char* data)
break; break;
} }
// Is it GPS data, or are we collecting data already? // Is it GPS data?
if ((m_buffer[0U] & SLOW_DATA_TYPE_MASK) != SLOW_DATA_TYPE_GPS) if ((m_buffer[0U] & SLOW_DATA_TYPE_MASK) == SLOW_DATA_TYPE_GPS)
return false; return addGPSData(m_buffer + 1U);
return addData(m_buffer + 1U); return false;
} }
void CAPRSCollector::reset() void CAPRSCollector::reset()
@ -93,9 +98,9 @@ void CAPRSCollector::reset()
m_rmcValid = false; m_rmcValid = false;
m_crcLength = 0U; m_crcLength = 0U;
m_crcValid = false; m_crcValid = false;
m_txtLength = 0U;
m_txtValid = false;
m_slowData = SS_FIRST; m_slowData = SS_FIRST;
m_collector.Clear();
m_callsign.Clear();
} }
void CAPRSCollector::sync() void CAPRSCollector::sync()
@ -103,193 +108,175 @@ void CAPRSCollector::sync()
m_slowData = SS_FIRST; m_slowData = SS_FIRST;
} }
bool CAPRSCollector::addData(const unsigned char* data) bool CAPRSCollector::addGPSData(const unsigned char* data)
{ {
wxASSERT(data != NULL); wxASSERT(data != NULL);
if (::memcmp(data, "$GPGG", 5U) == 0) { m_collector.Append((char*)data, 5U);
if (m_state == AS_GGA) {
addGGAData();
return false;
} else if (m_state == AS_RMC) {
return addRMCData();
} else if (m_state == AS_CRC) {
return addCRCData();
}
if (m_state != AS_GGA && m_collector.Find(wxT("$GPGGA")) != wxNOT_FOUND) {
m_state = AS_GGA; m_state = AS_GGA;
m_ggaLength = 0U; m_ggaLength = 0U;
m_ggaValid = false; m_ggaValid = false;
m_rmcLength = 0U; m_rmcLength = 0U;
m_rmcValid = false; m_rmcValid = false;
m_txtLength = 0U;
m_txtValid = false;
addGGAData(data);
return false; return false;
} else if (::memcmp(data, "$GPRM", 5U) == 0) { } else if (m_state != AS_RMC && m_collector.Find(wxT("$GPRMC")) != wxNOT_FOUND) {
m_state = AS_RMC; m_state = AS_RMC;
m_rmcLength = 0U; m_rmcLength = 0U;
m_rmcValid = false; m_rmcValid = false;
m_txtLength = 0U;
m_txtValid = false;
addRMCData(data);
return false; return false;
} else if (::memcmp(data, "$$CRC", 5U) == 0) { } else if (m_state != AS_CRC && m_collector.Find(wxT("$$CRC")) != wxNOT_FOUND) {
m_state = AS_CRC; m_state = AS_CRC;
m_crcLength = 0U; m_crcLength = 0U;
m_crcValid = false; m_crcValid = false;
return addCRCData(data);
} else if (m_state == AS_RMC && m_rmcLength == 0U) {
m_state = AS_TXT;
m_txtLength = 0U;
m_txtValid = false;
addTXTData(data);
return false;
} else if (m_state == AS_GGA) {
addGGAData(data);
return false;
} else if (m_state == AS_RMC) {
addRMCData(data);
return false;
} else if (m_state == AS_CRC) {
return addCRCData(data);
} else if (m_state == AS_TXT) {
return addTXTData(data);
} }
return false; return false;
} }
void CAPRSCollector::addGGAData(const unsigned char* data) void CAPRSCollector::addGGAData()
{ {
for (unsigned int i = 0U; i < 5U; i++) { int n2 = m_collector.Find(wxT('\x0A'), true);
unsigned char c = data[i]; if (n2 == wxNOT_FOUND)
return;
m_ggaData[m_ggaLength] = c & 0x7FU; int n1 = m_collector.Find(wxT("$GPGGA"));
m_ggaLength++; if (n1 == wxNOT_FOUND)
return;
if (m_ggaLength >= APRS_DATA_LENGTH) { if (n2 < n1)
// CUtils::dump(wxT("Missed end of $GPGGA data"), m_ggaData, m_ggaLength); return;
unsigned int len = n2 - n1;
if (len >= APRS_DATA_LENGTH) {
m_ggaLength = 0U; m_ggaLength = 0U;
m_ggaValid = false; m_ggaValid = false;
m_state = AS_NONE; m_state = AS_NONE;
return; return;
} }
if (c == 0x0AU) { m_ggaLength = 0U;
for (int i = n1; i <= n2; i++) {
m_ggaData[m_ggaLength] = m_collector.GetChar(i);
m_ggaData[m_ggaLength] &= 0x7FU;
m_ggaLength++;
}
bool ret = checkXOR(m_ggaData + 1U, m_ggaLength - 1U); bool ret = checkXOR(m_ggaData + 1U, m_ggaLength - 1U);
if (ret) { if (ret) {
// CUtils::dump(wxT("$GPGGA Valid"), m_ggaData, m_ggaLength); // CUtils::dump(wxT("$GPGGA Valid"), m_ggaData, m_ggaLength);
m_ggaValid = true; m_ggaValid = true;
m_state = AS_RMC; m_state = AS_RMC;
return;
} else { } else {
// CUtils::dump(wxT("$GPGGA Bad checksum"), m_ggaData, m_ggaLength); // CUtils::dump(wxT("$GPGGA Bad checksum"), m_ggaData, m_ggaLength);
m_ggaLength = 0U; m_ggaLength = 0U;
m_ggaValid = false; m_ggaValid = false;
m_state = AS_RMC; m_state = AS_RMC;
return;
}
}
} }
m_collector = m_collector.Mid(n2);
} }
void CAPRSCollector::addRMCData(const unsigned char* data) bool CAPRSCollector::addRMCData()
{ {
for (unsigned int i = 0U; i < 5U; i++) { int n2 = m_collector.Find(wxT('\x0A'), true);
unsigned char c = data[i]; if (n2 == wxNOT_FOUND)
return false;
m_rmcData[m_rmcLength] = c & 0x7FU; int n1 = m_collector.Find(wxT("$GPRMC"));
m_rmcLength++; if (n1 == wxNOT_FOUND)
return false;
if (m_rmcLength >= APRS_DATA_LENGTH) { if (n2 < n1)
// CUtils::dump(wxT("Missed end of $GPRMC data"), m_rmcData, m_rmcLength); return false;
unsigned int len = n2 - n1;
if (len >= APRS_DATA_LENGTH) {
m_rmcLength = 0U; m_rmcLength = 0U;
m_rmcValid = false; m_rmcValid = false;
m_state = AS_NONE; m_state = AS_NONE;
return; return false;
}
m_rmcLength = 0U;
for (int i = n1; i <= n2; i++) {
m_rmcData[m_rmcLength] = m_collector.GetChar(i);
m_rmcData[m_rmcLength] &= 0x7FU;
m_rmcLength++;
} }
if (c == 0x0AU) {
bool ret = checkXOR(m_rmcData + 1U, m_rmcLength - 1U); bool ret = checkXOR(m_rmcData + 1U, m_rmcLength - 1U);
if (ret) { if (ret) {
// CUtils::dump(wxT("$GPRMC Valid"), m_rmcData, m_rmcLength); // CUtils::dump(wxT("$GPRMC Valid"), m_rmcData, m_rmcLength);
m_rmcValid = true; m_rmcValid = true;
m_state = AS_TXT;
return;
} else { } else {
// CUtils::dump(wxT("$GPRMC Bad checksum"), m_rmcData, m_rmcLength); // CUtils::dump(wxT("$GPRMC Bad checksum"), m_rmcData, m_rmcLength);
m_rmcLength = 0U; m_rmcLength = 0U;
m_rmcValid = false; m_rmcValid = false;
m_state = AS_TXT;
return;
}
}
} }
m_collector = m_collector.Mid(n2);
m_state = AS_NONE;
return true;
} }
bool CAPRSCollector::addCRCData(const unsigned char* data) bool CAPRSCollector::addCRCData()
{ {
for (unsigned int i = 0U; i < 5U; i++) { int n2 = m_collector.Find(wxT('\x0D'), true);
unsigned char c = data[i]; if (n2 == wxNOT_FOUND)
return false;
// m_crcData[m_crcLength] = c & 0x7FU; // XXX int n1 = m_collector.Find(wxT("$$CRC"));
m_crcData[m_crcLength] = c; if (n1 == wxNOT_FOUND)
m_crcLength++; return false;
if (m_crcLength >= APRS_DATA_LENGTH) { if (n2 < n1)
// CUtils::dump(wxT("Missed end of $$CRC data"), m_crcData, m_crcLength); return false;
m_state = AS_NONE;
unsigned int len = n2 - n1;
if (len >= APRS_DATA_LENGTH) {
m_crcLength = 0U; m_crcLength = 0U;
m_crcValid = false; m_crcValid = false;
m_state = AS_NONE;
return false; return false;
} }
if (c == 0x0DU) { m_crcLength = 0U;
for (int i = n1; i <= n2; i++) {
m_crcData[m_crcLength] = m_collector.GetChar(i);
m_crcLength++;
}
bool ret = checkCRC(m_crcData, m_crcLength); bool ret = checkCRC(m_crcData, m_crcLength);
if (ret) { if (ret) {
// CUtils::dump(wxT("$$CRC Valid"), m_crcData, m_crcLength); // CUtils::dump(wxT("$$CRC Valid"), m_crcData, m_crcLength);
m_state = AS_NONE;
m_crcValid = true; m_crcValid = true;
m_state = AS_NONE;
m_collector = m_collector.Mid(n2);
return true; return true;
} else { } else {
// CUtils::dump(wxT("$$CRC Bad checksum"), m_crcData, m_crcLength); // CUtils::dump(wxT("$$CRC Bad checksum"), m_crcData, m_crcLength);
m_state = AS_NONE;
m_crcLength = 0U; m_crcLength = 0U;
m_crcValid = false; m_crcValid = false;
return false;
}
}
}
return false;
}
bool CAPRSCollector::addTXTData(const unsigned char* data)
{
for (unsigned int i = 0U; i < 5U; i++) {
unsigned char c = data[i];
m_txtData[m_txtLength] = c & 0x7FU;
m_txtLength++;
if (m_txtLength >= APRS_DATA_LENGTH) {
// CUtils::dump(wxT("Missed end of TEXT data"), m_txtData, m_txtLength);
m_state = AS_NONE; m_state = AS_NONE;
m_txtLength = 0U; m_collector = m_collector.Mid(n2);
m_txtValid = false;
return false; return false;
} }
if (c == 0x0AU) {
bool ret = checkXOR(m_txtData, m_txtLength);
if (ret) {
// CUtils::dump(wxT("TEXT Valid"), m_txtData, m_txtLength);
m_state = AS_NONE;
m_txtValid = true;
return true;
} else {
// CUtils::dump(wxT("TEXT Bad checksum"), m_txtData, m_txtLength);
m_state = AS_NONE;
m_txtLength = 0U;
m_txtValid = false;
return false;
}
}
}
return false;
} }
unsigned int CAPRSCollector::getData(unsigned char* data, unsigned int length) unsigned int CAPRSCollector::getData(unsigned char* data, unsigned int length)
@ -310,30 +297,26 @@ unsigned int CAPRSCollector::getData(unsigned char* data, unsigned int length)
return len; return len;
} }
// Have we got GGA and text data? // Have we got GGA data?
if (m_ggaValid && m_txtValid) { if (m_ggaValid) {
unsigned int len = convertNMEA1(data, length); unsigned int len = convertNMEA1(data, length);
m_ggaLength = 0U; m_ggaLength = 0U;
m_rmcLength = 0U; m_rmcLength = 0U;
m_txtLength = 0U;
m_ggaValid = false; m_ggaValid = false;
m_rmcValid = false; m_rmcValid = false;
m_txtValid = false;
return len; return len;
} }
// Have we got RMC and text data? // Have we got RMC data?
if (m_rmcValid && m_txtValid) { if (m_rmcValid) {
unsigned int len = convertNMEA2(data, length); unsigned int len = convertNMEA2(data, length);
m_ggaLength = 0U; m_ggaLength = 0U;
m_rmcLength = 0U; m_rmcLength = 0U;
m_txtLength = 0U;
m_ggaValid = false; m_ggaValid = false;
m_rmcValid = false; m_rmcValid = false;
m_txtValid = false;
return len; return len;
} }
@ -418,7 +401,7 @@ unsigned int CAPRSCollector::convertNMEA1(unsigned char* data, unsigned int)
unsigned int nGGA = 0U; unsigned int nGGA = 0U;
char* str = (char*)m_ggaData; char* str = (char*)m_ggaData;
for (;;) { while (nGGA < 20U) {
char* p = mystrsep(&str, ",\r\n"); char* p = mystrsep(&str, ",\r\n");
pGGA[nGGA++] = p; pGGA[nGGA++] = p;
@ -435,25 +418,9 @@ unsigned int CAPRSCollector::convertNMEA1(unsigned char* data, unsigned int)
return 0U; return 0U;
char callsign[10U]; char callsign[10U];
::memset(callsign, ' ', 10U); dstarCallsignToAPRS(m_callsign, callsign);
::strncpy(callsign, (char*)m_txtData, 7U);
// This can't fail! ::sprintf((char*)data, "%s>APDPRS,DSTAR*:!%.7s%s%c%.8s%s%c", callsign, pGGA[2U], pGGA[3U], APRS_OVERLAY, pGGA[4U], pGGA[5U], APRS_SYMBOL);
char* p = ::strchr(callsign, ' ');
if (m_txtData[6U] == ' ' && m_txtData[7U] != ' ') {
*p++ = '-';
*p++ = m_txtData[7U];
} else if (m_txtData[6U] != ' ' && m_txtData[7U] != ' ') {
*p++ = m_txtData[7U];
}
*p = '\0';
char symbol, overlay;
getSymbol(m_txtData + 9U, symbol, overlay);
::sprintf((char*)data, "%s>APDPRS,DSTAR*:!%.7s%s%c%.8s%s%c", callsign, pGGA[2U], pGGA[3U], overlay, pGGA[4U], pGGA[5U], symbol);
// Get the bearing and speed from the RMC data // Get the bearing and speed from the RMC data
if (m_rmcValid) { if (m_rmcValid) {
@ -464,7 +431,7 @@ unsigned int CAPRSCollector::convertNMEA1(unsigned char* data, unsigned int)
str = (char*)m_rmcData; str = (char*)m_rmcData;
for (;;) { for (;;) {
p = mystrsep(&str, ",\r\n"); char* p = mystrsep(&str, ",\r\n");
pRMC[nRMC++] = p; pRMC[nRMC++] = p;
if (p == NULL) if (p == NULL)
@ -480,21 +447,6 @@ unsigned int CAPRSCollector::convertNMEA1(unsigned char* data, unsigned int)
} }
} }
::strcat((char*)data, " ");
// Insert the message text
unsigned int j = ::strlen((char*)data);
for (unsigned int i = 13U; i < 29U; i++) {
unsigned char c = m_txtData[i];
if (c == '*') {
data[j] = '\0';
break;
}
data[j++] = c;
}
if (pGGA[9U] != NULL && ::strlen(pGGA[9U]) > 0U) { if (pGGA[9U] != NULL && ::strlen(pGGA[9U]) > 0U) {
// Convert altitude from metres to feet // Convert altitude from metres to feet
int altitude = ::atoi(pGGA[9U]); int altitude = ::atoi(pGGA[9U]);
@ -512,7 +464,7 @@ unsigned int CAPRSCollector::convertNMEA2(unsigned char* data, unsigned int)
unsigned int nRMC = 0U; unsigned int nRMC = 0U;
char* str = (char*)m_rmcData; char* str = (char*)m_rmcData;
for (;;) { while (nRMC < 20U) {
char* p = mystrsep(&str, ",\r\n"); char* p = mystrsep(&str, ",\r\n");
pRMC[nRMC++] = p; pRMC[nRMC++] = p;
@ -529,25 +481,9 @@ unsigned int CAPRSCollector::convertNMEA2(unsigned char* data, unsigned int)
return 0U; return 0U;
char callsign[10U]; char callsign[10U];
::memset(callsign, ' ', 10U); dstarCallsignToAPRS(m_callsign, callsign);
::strncpy(callsign, (char*)m_txtData, 7U);
// This can't fail! ::sprintf((char*)data, "%s>APDPRS,DSTAR*:!%.7s%s%c%.8s%s%c", callsign, pRMC[3U], pRMC[4U], APRS_OVERLAY, pRMC[5U], pRMC[6U], APRS_SYMBOL);
char* p = ::strchr(callsign, ' ');
if (m_txtData[6U] == ' ' && m_txtData[7U] != ' ') {
*p++ = '-';
*p++ = m_txtData[7U];
} else if (m_txtData[6U] != ' ' && m_txtData[7U] != ' ') {
*p++ = m_txtData[7U];
}
*p = '\0';
char symbol, overlay;
getSymbol(m_txtData + 9U, symbol, overlay);
::sprintf((char*)data, "%s>APDPRS,DSTAR*:!%.7s%s%c%.8s%s%c", callsign, pRMC[3U], pRMC[4U], overlay, pRMC[5U], pRMC[6U], symbol);
if (pRMC[7U] != NULL && pRMC[8U] != NULL && ::strlen(pRMC[7U]) > 0U && ::strlen(pRMC[8U]) > 0U) { if (pRMC[7U] != NULL && pRMC[8U] != NULL && ::strlen(pRMC[7U]) > 0U && ::strlen(pRMC[8U]) > 0U) {
int bearing = ::atoi(pRMC[8U]); int bearing = ::atoi(pRMC[8U]);
@ -556,90 +492,29 @@ unsigned int CAPRSCollector::convertNMEA2(unsigned char* data, unsigned int)
::sprintf((char*)data + ::strlen((char*)data), "%03d/%03d", bearing, speed); ::sprintf((char*)data + ::strlen((char*)data), "%03d/%03d", bearing, speed);
} }
if (m_txtData[13U] != '*')
::strcat((char*)data, " ");
// Insert the message text
unsigned int j = ::strlen((char*)data);
for (unsigned int i = 13U; i < 29U; i++) {
unsigned char c = m_txtData[i];
if (c == '*') {
data[j] = '\0';
break;
}
data[j++] = c;
}
return ::strlen((char*)data); return ::strlen((char*)data);
} }
// Function taken from DPRSIntf.java from Pete Loveall AE5PL void CAPRSCollector::dstarCallsignToAPRS(const wxString& dstarCallsign, char* aprsCallsign) const
void CAPRSCollector::getSymbol(const unsigned char* data, char& symbol, char& overlay)
{ {
symbol = '.'; wxASSERT(aprsCallsign != NULL);
if (data[3U] == ' ') { wxString first = dstarCallsign.BeforeFirst(wxT(' '));
int offset = -1; wxString last = dstarCallsign.AfterLast(wxT(' '));
switch (data[0U]) { if (last.IsEmpty() || first.IsSameAs(last)) {
case 'B': unsigned int n = 0U;
case 'O': for (unsigned int i = 0U; i < first.Len(); i++)
offset = -33; aprsCallsign[n++] = first.GetChar(i);
break; aprsCallsign[n++] = '\0';
case 'P': } else {
case 'A': unsigned int n = 0U;
offset = 0; for (unsigned int i = 0U; i < first.Len(); i++)
break; aprsCallsign[n++] = first.GetChar(i);
case 'M': aprsCallsign[n++] = '-';
case 'N': for (unsigned int i = 0U; i < last.Len(); i++)
offset = -24; aprsCallsign[n++] = last.GetChar(i);
break; aprsCallsign[n++] = '\0';
case 'H':
case 'D':
offset = 8;
break;
case 'L':
case 'S':
offset = 32;
break;
case 'J':
case 'Q':
offset = 74;
break;
default:
break;
}
if (offset != -1 && ::isalnum(data[1U])) {
bool altIcons = false;
// x is valid, lets get y
switch (data[0U]) {
case 'O':
case 'A':
case 'N':
case 'D':
case 'S':
case 'Q':
altIcons = true;
break;
}
symbol = char(data[1U] + offset);
overlay = '/';
if (altIcons) {
if (data[2] == ' ')
overlay = '\\';
else if (::isalnum(data[2]))
overlay = data[2U];
else
overlay = 0;
}
}
} }
} }

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2010,2012 by Jonathan Naylor G4KLX * Copyright (C) 2010,2012,2018 by Jonathan Naylor G4KLX
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -27,8 +27,7 @@ enum APRS_STATE {
AS_NONE, AS_NONE,
AS_GGA, AS_GGA,
AS_RMC, AS_RMC,
AS_CRC, AS_CRC
AS_TXT
}; };
class CAPRSCollector { class CAPRSCollector {
@ -36,12 +35,14 @@ public:
CAPRSCollector(); CAPRSCollector();
~CAPRSCollector(); ~CAPRSCollector();
void writeHeader(const wxString& callsign);
bool writeData(const unsigned char* data); bool writeData(const unsigned char* data);
void sync();
void reset(); void reset();
void sync();
unsigned int getData(unsigned char* data, unsigned int length); unsigned int getData(unsigned char* data, unsigned int length);
private: private:
@ -55,17 +56,16 @@ private:
unsigned char* m_crcData; unsigned char* m_crcData;
unsigned int m_crcLength; unsigned int m_crcLength;
bool m_crcValid; bool m_crcValid;
unsigned char* m_txtData;
unsigned int m_txtLength;
bool m_txtValid;
unsigned char* m_buffer; unsigned char* m_buffer;
SLOWDATA_STATE m_slowData; SLOWDATA_STATE m_slowData;
wxString m_collector;
wxString m_callsign;
bool addData(const unsigned char* data); bool addGPSData(const unsigned char* data);
void addGGAData(const unsigned char* data);
void addRMCData(const unsigned char* data); void addGGAData();
bool addCRCData(const unsigned char* data); bool addRMCData();
bool addTXTData(const unsigned char* data); bool addCRCData();
bool checkXOR(const unsigned char* data, unsigned int length) const; bool checkXOR(const unsigned char* data, unsigned int length) const;
unsigned char calcXOR(const unsigned char* buffer, unsigned int length) const; unsigned char calcXOR(const unsigned char* buffer, unsigned int length) const;
@ -76,7 +76,7 @@ private:
unsigned int convertNMEA1(unsigned char* data, unsigned int length); unsigned int convertNMEA1(unsigned char* data, unsigned int length);
unsigned int convertNMEA2(unsigned char* data, unsigned int length); unsigned int convertNMEA2(unsigned char* data, unsigned int length);
void getSymbol(const unsigned char* data, char& symbol, char& overlay); void dstarCallsignToAPRS(const wxString& dstarCallsign, char* aprsCallsign) const;
char* mystrsep(char** sp, const char* sep) const; char* mystrsep(char** sp, const char* sep) const;
}; };

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2010-2014 by Jonathan Naylor G4KLX * Copyright (C) 2010-2014,2018,2020 by Jonathan Naylor G4KLX
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -118,22 +118,29 @@ bool CAPRSEntry::isOK()
} }
} }
CAPRSWriter::CAPRSWriter(const wxString& hostname, unsigned int port, const wxString& gateway, const wxString& address) : CAPRSWriter::CAPRSWriter(const wxString& address, unsigned int port, const wxString& gateway) :
m_thread(NULL), m_idTimer(1000U),
m_enabled(false),
m_idTimer(1000U, 20U * 60U), // 20 minutes
m_gateway(), m_gateway(),
m_array() m_array(),
m_aprsAddress(),
m_aprsPort(port),
m_aprsSocket()
#if defined(USE_GPSD)
,m_gpsdEnabled(false),
m_gpsdAddress(),
m_gpsdPort(),
m_gpsdData()
#endif
{ {
wxASSERT(!hostname.IsEmpty()); wxASSERT(!address.IsEmpty());
wxASSERT(port > 0U); wxASSERT(port > 0U);
wxASSERT(!gateway.IsEmpty()); wxASSERT(!gateway.IsEmpty());
m_thread = new CAPRSWriterThread(gateway, address, hostname, port);
m_gateway = gateway; m_gateway = gateway;
m_gateway.Truncate(LONG_CALLSIGN_LENGTH - 1U); m_gateway.Truncate(LONG_CALLSIGN_LENGTH - 1U);
m_gateway.Trim(); m_gateway.Trim();
m_aprsAddress = CUDPReaderWriter::lookup(address);
} }
CAPRSWriter::~CAPRSWriter() CAPRSWriter::~CAPRSWriter()
@ -144,7 +151,7 @@ CAPRSWriter::~CAPRSWriter()
m_array.clear(); 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; wxString temp = callsign;
temp.resize(LONG_CALLSIGN_LENGTH - 1U, wxT(' ')); temp.resize(LONG_CALLSIGN_LENGTH - 1U, wxT(' '));
@ -153,9 +160,64 @@ void CAPRSWriter::setPort(const wxString& callsign, const wxString& band, double
m_array[temp] = new CAPRSEntry(callsign, band, frequency, offset, range, latitude, longitude, agl); m_array[temp] = new CAPRSEntry(callsign, band, frequency, offset, range, latitude, longitude, agl);
} }
void CAPRSWriter::setPortGPSD(const wxString& callsign, const wxString& band, double frequency, double offset, double range, const wxString& address, const wxString& port)
{
#if defined(USE_GPSD)
wxASSERT(!address.IsEmpty());
wxASSERT(!port.IsEmpty());
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);
m_gpsdEnabled = true;
m_gpsdAddress = address;
m_gpsdPort = port;
#endif
}
bool CAPRSWriter::open() bool CAPRSWriter::open()
{ {
return m_thread->start(); #if defined(USE_GPSD)
if (m_gpsdEnabled) {
int ret = ::gps_open(m_gpsdAddress.mb_str(), m_gpsdPort.mb_str(), &m_gpsdData);
if (ret != 0) {
wxLogError(wxT("Error when opening access to gpsd - %d - %s"), errno, ::gps_errstr(errno));
return false;
}
::gps_stream(&m_gpsdData, WATCH_ENABLE | WATCH_JSON, NULL);
wxLogMessage(wxT("Connected to GPSD"));
}
#endif
bool ret = m_aprsSocket.open();
if (!ret)
return false;
wxLogMessage(wxT("Opened connection to the APRS Gateway"));
m_idTimer.setTimeout(60U);
m_idTimer.start();
return true;
}
void CAPRSWriter::writeHeader(const wxString& callsign, const CHeaderData& header)
{
CAPRSEntry* entry = m_array[callsign];
if (entry == NULL) {
wxLogError(wxT("Cannot find the callsign \"%s\" in the APRS array"), callsign.c_str());
return;
}
entry->reset();
CAPRSCollector* collector = entry->getCollector();
collector->writeHeader(header.getMyCall1());
} }
void CAPRSWriter::writeData(const wxString& callsign, const CAMBEData& data) void CAPRSWriter::writeData(const wxString& callsign, const CAMBEData& data)
@ -183,16 +245,6 @@ void CAPRSWriter::writeData(const wxString& callsign, const CAMBEData& data)
if (!complete) if (!complete)
return; return;
if (!m_enabled) {
collector->reset();
return;
}
if (!m_thread->isConnected()) {
collector->reset();
return;
}
// Check the transmission timer // Check the transmission timer
bool ok = entry->isOK(); bool ok = entry->isOK();
if (!ok) { if (!ok) {
@ -223,67 +275,59 @@ void CAPRSWriter::writeData(const wxString& callsign, const CAMBEData& data)
body = body.Left(n); body = body.Left(n);
wxString output; wxString output;
output.Printf(wxT("%s,qAR,%s-%s:%s"), header.c_str(), entry->getCallsign().c_str(), entry->getBand().c_str(), body.c_str()); output.Printf(wxT("%s,qAR,%s-%s:%s\r\n"), header.c_str(), entry->getCallsign().c_str(), entry->getBand().c_str(), body.c_str());
char ascii[500U]; char ascii[500U];
::memset(ascii, 0x00, 500U); ::memset(ascii, 0x00, 500U);
for (unsigned int i = 0U; i < output.Len(); i++) for (unsigned int i = 0U; i < output.Len(); i++)
ascii[i] = output.GetChar(i); ascii[i] = output.GetChar(i);
m_thread->write(ascii); wxLogDebug(wxT("APRS ==> %s"), output.c_str());
m_aprsSocket.write((unsigned char*)ascii, (unsigned int)::strlen(ascii), m_aprsAddress, m_aprsPort);
collector->reset(); collector->reset();
} }
void CAPRSWriter::reset(const wxString& callsign)
{
CAPRSEntry* entry = m_array[callsign];
if (entry == NULL) {
wxLogError(wxT("Cannot find the callsign \"%s\" in the APRS array"), callsign.c_str());
return;
}
entry->reset();
}
void CAPRSWriter::setEnabled(bool enabled)
{
m_enabled = enabled;
if (m_enabled) {
sendIdFrames();
m_idTimer.start();
}
}
void CAPRSWriter::clock(unsigned int ms) void CAPRSWriter::clock(unsigned int ms)
{ {
m_idTimer.clock(ms); m_idTimer.clock(ms);
#if defined(USE_GPSD)
if (m_gpsdEnabled) {
if (m_idTimer.hasExpired()) { if (m_idTimer.hasExpired()) {
sendIdFrames(); sendIdFramesMobile();
m_idTimer.start(); m_idTimer.start();
} }
} else {
#endif
if (m_idTimer.hasExpired()) {
sendIdFramesFixed();
m_idTimer.setTimeout(20U * 60U);
m_idTimer.start();
}
#if defined(USE_GPSD)
}
#endif
for (CEntry_t::iterator it = m_array.begin(); it != m_array.end(); ++it) for (CEntry_t::iterator it = m_array.begin(); it != m_array.end(); ++it)
it->second->clock(ms); it->second->clock(ms);
} }
bool CAPRSWriter::isConnected() const
{
return m_thread->isConnected();
}
void CAPRSWriter::close() void CAPRSWriter::close()
{ {
m_thread->stop(); m_aprsSocket.close();
#if defined(USE_GPSD)
if (m_gpsdEnabled) {
::gps_stream(&m_gpsdData, WATCH_DISABLE, NULL);
::gps_close(&m_gpsdData);
}
#endif
} }
void CAPRSWriter::sendIdFrames() void CAPRSWriter::sendIdFramesFixed()
{ {
if (!m_thread->isConnected())
return;
time_t now; time_t now;
::time(&now); ::time(&now);
struct tm* tm = ::gmtime(&now); struct tm* tm = ::gmtime(&now);
@ -361,34 +405,196 @@ void CAPRSWriter::sendIdFrames()
lon.Replace(wxT(","), wxT(".")); lon.Replace(wxT(","), wxT("."));
wxString output; 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%caRNG%04.0lf/A=%06.0lf %s %s\r\n"),
m_gateway.c_str(), m_gateway.c_str(), entry->getCallsign().c_str(), entry->getBand().c_str(), 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, tm->tm_mday, tm->tm_hour, tm->tm_min,
lat.c_str(), (entry->getLatitude() < 0.0F) ? wxT('S') : wxT('N'), lat.c_str(), (entry->getLatitude() < 0.0F) ? wxT('S') : wxT('N'),
lon.c_str(), (entry->getLongitude() < 0.0F) ? wxT('W') : wxT('E'), lon.c_str(), (entry->getLongitude() < 0.0F) ? wxT('W') : wxT('E'),
entry->getRange() * 0.6214, band.c_str(), desc.c_str()); entry->getRange() * 0.6214, entry->getAGL() * 3.28, band.c_str(), desc.c_str());
char ascii[300U]; char ascii[300U];
::memset(ascii, 0x00, 300U); ::memset(ascii, 0x00, 300U);
for (unsigned int i = 0U; i < output.Len(); i++) for (unsigned int i = 0U; i < output.Len(); i++)
ascii[i] = output.GetChar(i); ascii[i] = output.GetChar(i);
m_thread->write(ascii); wxLogDebug(wxT("APRS ==> %s"), output.c_str());
m_aprsSocket.write((unsigned char*)ascii, (unsigned int)::strlen(ascii), m_aprsAddress, m_aprsPort);
if (entry->getBand().Len() == 1U) { 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&RNG%04.0lf/A=%06.0lf %s %s\r\n"),
entry->getCallsign().c_str(), entry->getBand().c_str(), entry->getCallsign().c_str(), entry->getBand().c_str(), 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'), lat.c_str(), (entry->getLatitude() < 0.0F) ? wxT('S') : wxT('N'),
lon.c_str(), (entry->getLongitude() < 0.0F) ? wxT('W') : wxT('E'), lon.c_str(), (entry->getLongitude() < 0.0F) ? wxT('W') : wxT('E'),
entry->getRange() * 0.6214, band.c_str(), desc.c_str()); entry->getRange() * 0.6214, entry->getAGL() * 3.28, band.c_str(), desc.c_str());
::memset(ascii, 0x00, 300U); ::memset(ascii, 0x00, 300U);
for (unsigned int i = 0U; i < output.Len(); i++) for (unsigned int i = 0U; i < output.Len(); i++)
ascii[i] = output.GetChar(i); ascii[i] = output.GetChar(i);
m_thread->write(ascii); wxLogDebug(wxT("APRS ==> %s"), output.c_str());
m_aprsSocket.write((unsigned char*)ascii, (unsigned int)::strlen(ascii), m_aprsAddress, m_aprsPort);
} }
} }
}
#if defined(USE_GPSD)
void CAPRSWriter::sendIdFramesMobile()
{
if (!m_gpsdEnabled)
return;
if (!::gps_waiting(&m_gpsdData, 0))
return;
if (::gps_read(&m_gpsdData, NULL, 0) <= 0)
return;
if (m_gpsdData.status != STATUS_FIX)
return;
bool latlonSet = (m_gpsdData.set & LATLON_SET) == LATLON_SET;
bool altitudeSet = (m_gpsdData.set & ALTITUDE_SET) == ALTITUDE_SET;
bool velocitySet = (m_gpsdData.set & SPEED_SET) == SPEED_SET;
bool bearingSet = (m_gpsdData.set & TRACK_SET) == TRACK_SET;
if (!latlonSet)
return;
float rawLatitude = float(m_gpsdData.fix.latitude);
float rawLongitude = float(m_gpsdData.fix.longitude);
float rawAltitude = float(m_gpsdData.fix.altMSL);
float rawVelocity = float(m_gpsdData.fix.speed);
float rawBearing = float(m_gpsdData.fix.track);
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");
}
m_idTimer.start(); 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 (bearingSet && velocitySet)
output2.Printf(wxT("%03.0lf/%03.0lf"), rawBearing, rawVelocity * 0.539957F);
wxString output3;
output3.Printf(wxT("RNG%04.0lf %s %s\r\n"), 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);
wxLogDebug(wxT("APRS ==> %s%s%s"), output1.c_str(), output2.c_str(), output3.c_str());
m_aprsSocket.write((unsigned char*)ascii, (unsigned int)::strlen(ascii), m_aprsAddress, m_aprsPort);
if (entry->getBand().Len() == 1U) {
if (altitudeSet)
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);
else
output1.Printf(wxT("%s-%s>APDG02,TCPIP*,qAC,%s-%sS:!%s%cD%s%c&"),
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'));
::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);
wxLogDebug(wxT("APRS ==> %s%s%s"), output1.c_str(), output2.c_str(), output3.c_str());
m_aprsSocket.write((unsigned char*)ascii, (unsigned int)::strlen(ascii), m_aprsAddress, m_aprsPort);
}
}
} }
#endif

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2010,2011,2012 by Jonathan Naylor G4KLX * Copyright (C) 2010,2011,2012,2018,2020 by Jonathan Naylor G4KLX
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -19,13 +19,18 @@
#ifndef APRSWriter_H #ifndef APRSWriter_H
#define APRSWriter_H #define APRSWriter_H
#include "APRSWriterThread.h" #include "UDPReaderWriter.h"
#include "APRSCollector.h" #include "APRSCollector.h"
#include "DStarDefines.h" #include "DStarDefines.h"
#include "HeaderData.h"
#include "AMBEData.h" #include "AMBEData.h"
#include "Timer.h" #include "Timer.h"
#include "Defs.h" #include "Defs.h"
#if defined(USE_GPSD)
#include <gps.h>
#endif
#include <wx/wx.h> #include <wx/wx.h>
class CAPRSEntry { class CAPRSEntry {
@ -66,33 +71,40 @@ WX_DECLARE_STRING_HASH_MAP(CAPRSEntry*, CEntry_t);
class CAPRSWriter { class CAPRSWriter {
public: public:
CAPRSWriter(const wxString& hostname, unsigned int port, const wxString& gateway, const wxString& address); CAPRSWriter(const wxString& address, unsigned int port, const wxString& gateway);
~CAPRSWriter(); ~CAPRSWriter();
bool open(); bool open();
void setPort(const wxString& callsign, const wxString& band, double frequency, double offset, double range, double latitude, double longitude, double agl); void setPortFixed(const wxString& callsign, const wxString& band, double frequency, double offset, double range, double latitude, double longitude, double agl);
void setPortGPSD(const wxString& callsign, const wxString& band, double frequency, double offset, double range, const wxString& address, const wxString& port);
void writeHeader(const wxString& callsign, const CHeaderData& header);
void writeData(const wxString& callsign, const CAMBEData& data); void writeData(const wxString& callsign, const CAMBEData& data);
void reset(const wxString& callsign);
void setEnabled(bool enable);
bool isConnected() const;
void clock(unsigned int ms); void clock(unsigned int ms);
void close(); void close();
private: private:
CAPRSWriterThread* m_thread;
bool m_enabled;
CTimer m_idTimer; CTimer m_idTimer;
wxString m_gateway; wxString m_gateway;
CEntry_t m_array; CEntry_t m_array;
in_addr m_aprsAddress;
unsigned int m_aprsPort;
CUDPReaderWriter m_aprsSocket;
#if defined(USE_GPSD)
bool m_gpsdEnabled;
wxString m_gpsdAddress;
wxString m_gpsdPort;
struct gps_data_t m_gpsdData;
#endif
void sendIdFrames(); void sendIdFramesFixed();
void sendIdFramesMobile();
}; };
#endif #endif

View file

@ -1,263 +0,0 @@
/*
* Copyright (C) 2010-2014 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 "APRSWriterThread.h"
#include "DStarDefines.h"
#include "Utils.h"
#include "Defs.h"
// #define DUMP_TX
const unsigned int APRS_TIMEOUT = 10U;
CAPRSWriterThread::CAPRSWriterThread(const wxString& callsign, const wxString& address, const wxString& hostname, unsigned int port) :
wxThread(wxTHREAD_JOINABLE),
m_username(callsign),
m_ssid(callsign),
m_socket(hostname, port, address),
m_queue(20U),
m_exit(false),
m_connected(false),
m_APRSReadCallback(NULL),
m_filter(wxT("")),
m_clientName(wxT("ircDDBGateway"))
{
wxASSERT(!callsign.IsEmpty());
wxASSERT(!hostname.IsEmpty());
wxASSERT(port > 0U);
m_username.SetChar(LONG_CALLSIGN_LENGTH - 1U, wxT(' '));
m_username.Trim();
m_username.MakeUpper();
m_ssid = m_ssid.SubString(LONG_CALLSIGN_LENGTH - 1U, 1);
}
CAPRSWriterThread::CAPRSWriterThread(const wxString& callsign, const wxString& address, const wxString& hostname, unsigned int port, const wxString& filter, const wxString& clientName) :
wxThread(wxTHREAD_JOINABLE),
m_username(callsign),
m_ssid(callsign),
m_socket(hostname, port, address),
m_queue(20U),
m_exit(false),
m_connected(false),
m_APRSReadCallback(NULL),
m_filter(filter),
m_clientName(clientName)
{
wxASSERT(!callsign.IsEmpty());
wxASSERT(!hostname.IsEmpty());
wxASSERT(port > 0U);
m_username.SetChar(LONG_CALLSIGN_LENGTH - 1U, wxT(' '));
m_username.Trim();
m_username.MakeUpper();
m_ssid = m_ssid.SubString(LONG_CALLSIGN_LENGTH - 1U, 1);
}
CAPRSWriterThread::~CAPRSWriterThread()
{
m_username.Clear();
}
bool CAPRSWriterThread::start()
{
Create();
Run();
return true;
}
void* CAPRSWriterThread::Entry()
{
wxLogMessage(wxT("Starting the APRS Writer thread"));
m_connected = connect();
try {
while (!m_exit) {
if (!m_connected) {
m_connected = connect();
if (!m_connected){
wxLogError(wxT("Reconnect attempt to the APRS server has failed"));
Sleep(10000UL); // 10 secs
}
}
if (m_connected) {
if(!m_queue.isEmpty()){
char* p = m_queue.getData();
wxString text(p, wxConvLocal);
wxLogMessage(wxT("APRS ==> %s"), text.c_str());
::strcat(p, "\r\n");
bool ret = m_socket.write((unsigned char*)p, ::strlen(p));
if (!ret) {
m_connected = false;
m_socket.close();
wxLogError(wxT("Connection to the APRS thread has failed"));
}
delete[] p;
}
{
wxString line;
int length = m_socket.readLine(line, APRS_TIMEOUT);
/*if (length == 0)
wxLogWarning(wxT("No response from the APRS server after %u seconds"), APRS_TIMEOUT);*/
if (length < 0) {
m_connected = false;
m_socket.close();
wxLogError(wxT("Error when reading from the APRS server"));
}
if(length > 0 && line.GetChar(0) != '#'//check if we have something and if that something is an APRS frame
&& m_APRSReadCallback != NULL)//do we have someone wanting an APRS Frame?
{
//wxLogMessage(wxT("Received APRS Frame : ") + line);
m_APRSReadCallback(wxString(line));
}
}
}
}
if (m_connected)
m_socket.close();
while (!m_queue.isEmpty()) {
char* p = m_queue.getData();
delete[] p;
}
}
catch (std::exception& e) {
wxString message(e.what(), wxConvLocal);
wxLogError(wxT("Exception raised in the APRS Writer thread - \"%s\""), message.c_str());
}
catch (...) {
wxLogError(wxT("Unknown exception raised in the APRS Writer thread"));
}
wxLogMessage(wxT("Stopping the APRS Writer thread"));
return NULL;
}
void CAPRSWriterThread::setReadAPRSCallback(ReadAPRSFrameCallback cb)
{
m_APRSReadCallback = cb;
}
void CAPRSWriterThread::write(const char* data)
{
wxASSERT(data != NULL);
if (!m_connected)
return;
unsigned int len = ::strlen(data);
char* p = new char[len + 5U];
::strcpy(p, data);
m_queue.addData(p);
}
bool CAPRSWriterThread::isConnected() const
{
return m_connected;
}
void CAPRSWriterThread::stop()
{
m_exit = true;
Wait();
}
bool CAPRSWriterThread::connect()
{
unsigned int password = getAPRSPassword(m_username);
bool ret = m_socket.open();
if (!ret)
return false;
//wait for lgin banner
int length;
wxString serverResponse(wxT(""));
length = m_socket.readLine(serverResponse, APRS_TIMEOUT);
if (length == 0) {
wxLogError(wxT("No reply from the APRS server after %u seconds"), APRS_TIMEOUT);
m_socket.close();
return false;
}
wxLogMessage(wxT("Received login banner : ") + serverResponse);
wxString filter(m_filter);
if (filter.Length() > 0) filter.Prepend(wxT(" filter "));
wxString connectString = wxString::Format(wxT("user %s-%s pass %u vers %s%s\n"), m_username.c_str(), m_ssid.c_str(), password,
(m_clientName.Length() ? m_clientName : wxT("ircDDBGateway")).c_str(),
filter.c_str());
//wxLogMessage(wxT("Connect String : ") + connectString);
ret = m_socket.writeLine(connectString);
if (!ret) {
m_socket.close();
return false;
}
length = m_socket.readLine(serverResponse, APRS_TIMEOUT);
if (length == 0) {
wxLogError(wxT("No reply from the APRS server after %u seconds"), APRS_TIMEOUT);
m_socket.close();
return false;
}
if (length < 0) {
wxLogError(wxT("Error when reading from the APRS server"));
m_socket.close();
return false;
}
wxLogMessage(wxT("Response from APRS server: ") + serverResponse);
wxLogMessage(wxT("Connected to the APRS server"));
return true;
}
unsigned int CAPRSWriterThread::getAPRSPassword(wxString callsign) const
{
unsigned int len = callsign.Length();
wxUint16 hash = 0x73E2U;
for (unsigned int i = 0U; i < len; i += 2U) {
hash ^= (char)callsign.GetChar(i) << 8;
if(i + 1 < len)
hash ^= (char)callsign.GetChar(i + 1);
}
return hash & 0x7FFFU;
}

View file

@ -1,61 +0,0 @@
/*
* Copyright (C) 2010,2011,2012 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 APRSWriterThread_H
#define APRSWriterThread_H
#include "TCPReaderWriterClient.h"
#include "RingBuffer.h"
#include <wx/wx.h>
typedef void (*ReadAPRSFrameCallback)(const wxString&);
class CAPRSWriterThread : public wxThread {
public:
CAPRSWriterThread(const wxString& callsign, const wxString& address, const wxString& hostname, unsigned int port);
CAPRSWriterThread(const wxString& callsign, const wxString& address, const wxString& hostname, unsigned int port, const wxString& filter, const wxString& clientName);
virtual ~CAPRSWriterThread();
virtual bool start();
virtual bool isConnected() const;
virtual void write(const char* data);
virtual void* Entry();
virtual void stop();
void setReadAPRSCallback(ReadAPRSFrameCallback cb);
private:
wxString m_username;
wxString m_ssid;
CTCPReaderWriterClient m_socket;
CRingBuffer<char*> m_queue;
bool m_exit;
bool m_connected;
ReadAPRSFrameCallback m_APRSReadCallback;
wxString m_filter;
wxString m_clientName;
bool connect();
unsigned int getAPRSPassword(wxString username) const;
};
#endif

View file

@ -22,29 +22,29 @@
<ProjectGuid>{E793CB8E-2AC9-431A-BBFC-3F52537BB3CF}</ProjectGuid> <ProjectGuid>{E793CB8E-2AC9-431A-BBFC-3F52537BB3CF}</ProjectGuid>
<RootNamespace>Common</RootNamespace> <RootNamespace>Common</RootNamespace>
<Keyword>Win32Proj</Keyword> <Keyword>Win32Proj</Keyword>
<WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion> <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType> <ConfigurationType>StaticLibrary</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType> <ConfigurationType>StaticLibrary</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType> <ConfigurationType>StaticLibrary</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType> <ConfigurationType>StaticLibrary</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
@ -77,6 +77,10 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<OutDir>$(SolutionDir)$(Configuration)\</OutDir> <OutDir>$(SolutionDir)$(Configuration)\</OutDir>
<IntDir>$(Configuration)\</IntDir> <IntDir>$(Configuration)\</IntDir>
<IncludePath>$(WXWIN)\include;$(WXWIN)\lib\vc_dll\mswu;$(IncludePath)</IncludePath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<IncludePath>$(WXWIN)\include;$(WXWIN)\lib\vc_x64_dll\mswu;$(IncludePath)</IncludePath>
</PropertyGroup> </PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<PreBuildEvent> <PreBuildEvent>
@ -150,7 +154,6 @@
<ClCompile Include="AnnouncementUnit.cpp" /> <ClCompile Include="AnnouncementUnit.cpp" />
<ClCompile Include="APRSCollector.cpp" /> <ClCompile Include="APRSCollector.cpp" />
<ClCompile Include="APRSWriter.cpp" /> <ClCompile Include="APRSWriter.cpp" />
<ClCompile Include="APRSWriterThread.cpp" />
<ClCompile Include="AudioUnit.cpp" /> <ClCompile Include="AudioUnit.cpp" />
<ClCompile Include="CacheManager.cpp" /> <ClCompile Include="CacheManager.cpp" />
<ClCompile Include="CallsignList.cpp" /> <ClCompile Include="CallsignList.cpp" />
@ -189,6 +192,7 @@
<ClCompile Include="IRCDDBGatewayConfig.cpp" /> <ClCompile Include="IRCDDBGatewayConfig.cpp" />
<ClCompile Include="LogEvent.cpp" /> <ClCompile Include="LogEvent.cpp" />
<ClCompile Include="Logger.cpp" /> <ClCompile Include="Logger.cpp" />
<ClCompile Include="NatTraversalHandler.cpp" />
<ClCompile Include="PollData.cpp" /> <ClCompile Include="PollData.cpp" />
<ClCompile Include="RemoteHandler.cpp" /> <ClCompile Include="RemoteHandler.cpp" />
<ClCompile Include="RemoteLinkData.cpp" /> <ClCompile Include="RemoteLinkData.cpp" />
@ -218,7 +222,6 @@
<ClInclude Include="AnnouncementUnit.h" /> <ClInclude Include="AnnouncementUnit.h" />
<ClInclude Include="APRSCollector.h" /> <ClInclude Include="APRSCollector.h" />
<ClInclude Include="APRSWriter.h" /> <ClInclude Include="APRSWriter.h" />
<ClInclude Include="APRSWriterThread.h" />
<ClInclude Include="AudioUnit.h" /> <ClInclude Include="AudioUnit.h" />
<ClInclude Include="CacheManager.h" /> <ClInclude Include="CacheManager.h" />
<ClInclude Include="CallsignList.h" /> <ClInclude Include="CallsignList.h" />
@ -260,6 +263,7 @@
<ClInclude Include="IRCDDBGatewayConfig.h" /> <ClInclude Include="IRCDDBGatewayConfig.h" />
<ClInclude Include="LogEvent.h" /> <ClInclude Include="LogEvent.h" />
<ClInclude Include="Logger.h" /> <ClInclude Include="Logger.h" />
<ClInclude Include="NatTraversalHandler.h" />
<ClInclude Include="PollData.h" /> <ClInclude Include="PollData.h" />
<ClInclude Include="ReflectorCallback.h" /> <ClInclude Include="ReflectorCallback.h" />
<ClInclude Include="RemoteHandler.h" /> <ClInclude Include="RemoteHandler.h" />

View file

@ -23,9 +23,6 @@
<ClCompile Include="APRSWriter.cpp"> <ClCompile Include="APRSWriter.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="APRSWriterThread.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="AudioUnit.cpp"> <ClCompile Include="AudioUnit.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
@ -53,6 +50,9 @@
<ClCompile Include="ConnectData.cpp"> <ClCompile Include="ConnectData.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="ConsoleLogger.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="DCSHandler.cpp"> <ClCompile Include="DCSHandler.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
@ -209,6 +209,9 @@
<ClCompile Include="XLXHostsFileDownloader.cpp"> <ClCompile Include="XLXHostsFileDownloader.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="NatTraversalHandler.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="AMBEData.h"> <ClInclude Include="AMBEData.h">
@ -223,9 +226,6 @@
<ClInclude Include="APRSWriter.h"> <ClInclude Include="APRSWriter.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="APRSWriterThread.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="AudioUnit.h"> <ClInclude Include="AudioUnit.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
@ -256,6 +256,9 @@
<ClInclude Include="ConnectData.h"> <ClInclude Include="ConnectData.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="ConsoleLogger.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="DCSHandler.h"> <ClInclude Include="DCSHandler.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
@ -433,5 +436,8 @@
<ClInclude Include="XLXHostsFileDownloader.h"> <ClInclude Include="XLXHostsFileDownloader.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="NatTraversalHandler.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
</Project> </Project>

48
Common/ConsoleLogger.cpp Normal file
View file

@ -0,0 +1,48 @@
/*
* Copyright (C) 2002,2003,2009,2011,2012,2019 by Jonathan Naylor G4KLX
* Copyright (C) 2020 by Adam Kolakowski SQ7LRX
*
* 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 "ConsoleLogger.h"
const char CConsoleLogger::S_LEVELS[] = "FEWMMIDTPU";
CConsoleLogger::CConsoleLogger() :
wxLog(),
m_stdout(new wxMessageOutputStderr(stdout)),
m_stderr(new wxMessageOutputStderr(stderr))
{
}
CConsoleLogger::~CConsoleLogger()
{
}
void CConsoleLogger::DoLogRecord(wxLogLevel level, const wxString& msg, const wxLogRecordInfo& info)
{
if (level > 9)
level = 9;
if (level <= wxLOG_Error) {
m_stderr->Printf(wxT("%c: %s\n"), CConsoleLogger::S_LEVELS[level], msg.c_str());
} else {
m_stdout->Printf(wxT("%c: %s\n"), CConsoleLogger::S_LEVELS[level], msg.c_str());
}
if (level == wxLOG_FatalError)
::abort();
}

41
Common/ConsoleLogger.h Normal file
View file

@ -0,0 +1,41 @@
/*
* Copyright (C) 2002,2003,2009,2011,2012,2019 by Jonathan Naylor G4KLX
* Copyright (C) 2020 by Adam Kolakowski SQ7LRX
*
* 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 ConsoleLogger_H
#define ConsoleLogger_H
#include <wx/wx.h>
class CConsoleLogger : public wxLog {
public:
CConsoleLogger();
virtual ~CConsoleLogger();
virtual void DoLogRecord(wxLogLevel level, const wxString& msg, const wxLogRecordInfo& info);
private:
const static char S_LEVELS[];
wxMessageOutput *m_stdout;
wxMessageOutput *m_stderr;
};
#endif

View file

@ -39,6 +39,8 @@ CCallsignList* CDCSHandler::m_blackList = NULL;
CDCSHandler::CDCSHandler(IReflectorCallback* handler, const wxString& reflector, const wxString& repeater, CDCSProtocolHandler* protoHandler, const in_addr& address, unsigned int port, DIRECTION direction) : CDCSHandler::CDCSHandler(IReflectorCallback* handler, const wxString& reflector, const wxString& repeater, CDCSProtocolHandler* protoHandler, const in_addr& address, unsigned int port, DIRECTION direction) :
m_reflector(reflector.Clone()), m_reflector(reflector.Clone()),
m_xlxReflector(),
m_isXlx(false),
m_repeater(repeater.Clone()), m_repeater(repeater.Clone()),
m_handler(protoHandler), m_handler(protoHandler),
m_yourAddress(address), m_yourAddress(address),
@ -78,6 +80,11 @@ m_rptCall2()
m_linkState = DCS_LINKED; m_linkState = DCS_LINKED;
} else { } else {
m_linkState = DCS_LINKING; m_linkState = DCS_LINKING;
m_isXlx = m_reflector.StartsWith(wxT("XLX"));
if (m_isXlx) {
m_xlxReflector = m_reflector.Clone();
m_reflector = wxT("DCS") + m_reflector.Right(m_reflector.length() - 3);
}
m_tryTimer.start(); m_tryTimer.start();
} }
} }
@ -162,10 +169,10 @@ void CDCSHandler::getInfo(IReflectorCallback* handler, CRemoteRepeaterData& data
if (reflector->m_destination == handler) { if (reflector->m_destination == handler) {
if (reflector->m_direction == DIR_INCOMING && reflector->m_repeater.IsEmpty()) { if (reflector->m_direction == DIR_INCOMING && reflector->m_repeater.IsEmpty()) {
if (reflector->m_linkState != DCS_UNLINKING) if (reflector->m_linkState != DCS_UNLINKING)
data.addLink(reflector->m_reflector, PROTO_DCS, reflector->m_linkState == DCS_LINKED, DIR_INCOMING, true); data.addLink(GET_DISP_REFLECTOR(reflector), PROTO_DCS, reflector->m_linkState == DCS_LINKED, DIR_INCOMING, true);
} else { } else {
if (reflector->m_linkState != DCS_UNLINKING) if (reflector->m_linkState != DCS_UNLINKING)
data.addLink(reflector->m_reflector, PROTO_DCS, reflector->m_linkState == DCS_LINKED, reflector->m_direction, false); data.addLink(GET_DISP_REFLECTOR(reflector), PROTO_DCS, reflector->m_linkState == DCS_LINKED, reflector->m_direction, false);
} }
} }
} }
@ -634,10 +641,10 @@ bool CDCSHandler::processInt(CConnectData& connect, CD_TYPE type)
return false; return false;
if (m_linkState == DCS_LINKING) { if (m_linkState == DCS_LINKING) {
wxLogMessage(wxT("DCS ACK message received from %s"), m_reflector.c_str()); wxLogMessage(wxT("DCS ACK message received from %s"), GET_DISP_REFLECTOR(this).c_str());
if (m_direction == DIR_OUTGOING && m_destination != NULL) if (m_direction == DIR_OUTGOING && m_destination != NULL)
m_destination->linkUp(DP_DCS, m_reflector); m_destination->linkUp(DP_DCS, GET_DISP_REFLECTOR(this));
m_tryTimer.stop(); m_tryTimer.stop();
m_stateChange = true; m_stateChange = true;
@ -651,16 +658,16 @@ bool CDCSHandler::processInt(CConnectData& connect, CD_TYPE type)
return false; return false;
if (m_linkState == DCS_LINKING) { if (m_linkState == DCS_LINKING) {
wxLogMessage(wxT("DCS NAK message received from %s"), m_reflector.c_str()); wxLogMessage(wxT("DCS NAK message received from %s"), GET_DISP_REFLECTOR(this).c_str());
if (m_direction == DIR_OUTGOING && m_destination != NULL) if (m_direction == DIR_OUTGOING && m_destination != NULL)
m_destination->linkRefused(DP_DCS, m_reflector); m_destination->linkRefused(DP_DCS, GET_DISP_REFLECTOR(this));
return true; return true;
} }
if (m_linkState == DCS_UNLINKING) { if (m_linkState == DCS_UNLINKING) {
wxLogMessage(wxT("DCS NAK message received from %s"), m_reflector.c_str()); wxLogMessage(wxT("DCS NAK message received from %s"), GET_DISP_REFLECTOR(this).c_str());
if (m_direction == DIR_OUTGOING && m_destination != NULL) if (m_direction == DIR_OUTGOING && m_destination != NULL)
m_destination->linkFailed(DP_DCS, m_reflector, false); m_destination->linkFailed(DP_DCS, m_reflector, false);
@ -675,10 +682,10 @@ bool CDCSHandler::processInt(CConnectData& connect, CD_TYPE type)
return false; return false;
if (m_linkState == DCS_LINKED) { if (m_linkState == DCS_LINKED) {
wxLogMessage(wxT("DCS disconnect message received from %s"), m_reflector.c_str()); wxLogMessage(wxT("DCS disconnect message received from %s"), GET_DISP_REFLECTOR(this).c_str());
if (m_direction == DIR_OUTGOING && m_destination != NULL) if (m_direction == DIR_OUTGOING && m_destination != NULL)
m_destination->linkFailed(DP_DCS, m_reflector, false); m_destination->linkFailed(DP_DCS, GET_DISP_REFLECTOR(this), false);
m_stateChange = true; m_stateChange = true;
} }
@ -706,20 +713,20 @@ bool CDCSHandler::clockInt(unsigned int ms)
switch (m_linkState) { switch (m_linkState) {
case DCS_LINKING: case DCS_LINKING:
wxLogMessage(wxT("DCS link to %s has failed to connect"), m_reflector.c_str()); wxLogMessage(wxT("DCS link to %s has failed to connect"), GET_DISP_REFLECTOR(this).c_str());
break; break;
case DCS_LINKED: case DCS_LINKED:
wxLogMessage(wxT("DCS link to %s has failed (poll inactivity)"), m_reflector.c_str()); wxLogMessage(wxT("DCS link to %s has failed (poll inactivity)"), GET_DISP_REFLECTOR(this).c_str());
break; break;
case DCS_UNLINKING: case DCS_UNLINKING:
wxLogMessage(wxT("DCS link to %s has failed to disconnect cleanly"), m_reflector.c_str()); wxLogMessage(wxT("DCS link to %s has failed to disconnect cleanly"), GET_DISP_REFLECTOR(this).c_str());
break; break;
default: default:
break; break;
} }
if (m_direction == DIR_OUTGOING) { if (m_direction == DIR_OUTGOING) {
bool reconnect = m_destination->linkFailed(DP_DCS, m_reflector, true); bool reconnect = m_destination->linkFailed(DP_DCS, GET_DISP_REFLECTOR(this), true);
if (reconnect) { if (reconnect) {
CConnectData reply(m_gatewayType, m_repeater, m_reflector, CT_LINK1, m_yourAddress, m_yourPort); CConnectData reply(m_gatewayType, m_repeater, m_reflector, CT_LINK1, m_yourAddress, m_yourPort);
m_handler->writeConnect(reply); m_handler->writeConnect(reply);
@ -844,7 +851,7 @@ void CDCSHandler::writeStatus(wxFFile& file)
wxString text; wxString text;
text.Printf(wxT("%04d-%02d-%02d %02d:%02d:%02d: DCS link - Type: Repeater Rptr: %s Refl: %s Dir: Outgoing\n"), text.Printf(wxT("%04d-%02d-%02d %02d:%02d:%02d: DCS link - Type: Repeater Rptr: %s Refl: %s Dir: Outgoing\n"),
tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec,
reflector->m_repeater.c_str(), reflector->m_reflector.c_str()); reflector->m_repeater.c_str(), GET_DISP_REFLECTOR(reflector).c_str());
file.Write(text); file.Write(text);
} }
break; break;
@ -854,7 +861,7 @@ void CDCSHandler::writeStatus(wxFFile& file)
wxString text; wxString text;
text.Printf(wxT("%04d-%02d-%02d %02d:%02d:%02d: DCS link - Type: Repeater Rptr: %s Refl: %s Dir: Incoming\n"), text.Printf(wxT("%04d-%02d-%02d %02d:%02d:%02d: DCS link - Type: Repeater Rptr: %s Refl: %s Dir: Incoming\n"),
tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec,
reflector->m_repeater.c_str(), reflector->m_reflector.c_str()); reflector->m_repeater.c_str(), GET_DISP_REFLECTOR(reflector).c_str());
file.Write(text); file.Write(text);
} }
break; break;

View file

@ -39,6 +39,8 @@
#include <wx/wx.h> #include <wx/wx.h>
#include <wx/ffile.h> #include <wx/ffile.h>
#define GET_DISP_REFLECTOR(refl) (refl->m_isXlx ? refl->m_xlxReflector : refl->m_reflector)
enum DCS_STATE { enum DCS_STATE {
DCS_LINKING, DCS_LINKING,
DCS_LINKED, DCS_LINKED,
@ -109,6 +111,8 @@ private:
static CCallsignList* m_blackList; static CCallsignList* m_blackList;
wxString m_reflector; wxString m_reflector;
wxString m_xlxReflector;
bool m_isXlx;
wxString m_repeater; wxString m_repeater;
CDCSProtocolHandler* m_handler; CDCSProtocolHandler* m_handler;
in_addr m_yourAddress; in_addr m_yourAddress;

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2011,2012,2013 by Jonathan Naylor G4KLX * Copyright (C) 2011,2012,2013,2018 by Jonathan Naylor G4KLX
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -22,8 +22,7 @@
#include <wx/filename.h> #include <wx/filename.h>
#if !defined(WIN32) #if defined(__linux__)
// XXX Check these
#include <net/if.h> #include <net/if.h>
#include <arpa/inet.h> #include <arpa/inet.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
@ -103,7 +102,7 @@ void CDDHandler::initialise(unsigned int maxRoutes, const wxString& name)
// Add a dummy entry for "DX-Cluster" multicast // Add a dummy entry for "DX-Cluster" multicast
m_list[2] = new CEthernet(DX_MULTICAST_ADDRESS, wxT("CQCQCQ ")); m_list[2] = new CEthernet(DX_MULTICAST_ADDRESS, wxT("CQCQCQ "));
#if !defined(WIN32) #if defined(__linux__)
m_fd = ::open("/dev/net/tun", O_RDWR); m_fd = ::open("/dev/net/tun", O_RDWR);
if (m_fd < 0) { if (m_fd < 0) {
wxLogError(wxT("Cannot open /dev/net/tun")); wxLogError(wxT("Cannot open /dev/net/tun"));
@ -238,7 +237,7 @@ void CDDHandler::process(CDDData& data)
} }
} }
#if !defined(WIN32) #if defined(__linux__)
unsigned int length = data.getEthernetFrame(m_buffer, BUFFER_LENGTH); unsigned int length = data.getEthernetFrame(m_buffer, BUFFER_LENGTH);
ssize_t len = ::write(m_fd, (char*)m_buffer, length); ssize_t len = ::write(m_fd, (char*)m_buffer, length);
@ -253,7 +252,7 @@ CDDData* CDDHandler::read()
if (m_maxRoutes == 0U) if (m_maxRoutes == 0U)
return NULL; return NULL;
#if defined(WIN32) #if defined(__WINDOWS__)
return NULL; return NULL;
#else #else
// Check that the read() won't block // Check that the read() won't block

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2010-2015 by Jonathan Naylor G4KLX * Copyright (C) 2010-2015,2018,2019 by Jonathan Naylor G4KLX
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -22,12 +22,9 @@
#include "Utils.h" #include "Utils.h"
#include "Defs.h" #include "Defs.h"
const wxString OPENDSTAR_HOSTNAME = wxT("opendstar.org"); const wxString OPENDSTAR_HOSTNAME = wxT("auth.dstargateway.org");
const unsigned int OPENDSTAR_PORT = 20001U; const unsigned int OPENDSTAR_PORT = 20001U;
const wxString DUTCHSTAR_HOSTNAME = wxT("dpns.dutch-star.eu");
const unsigned int DUTCHSTAR_PORT = 20001U;
const unsigned int TCP_TIMEOUT = 10U; const unsigned int TCP_TIMEOUT = 10U;
CDPlusAuthenticator::CDPlusAuthenticator(const wxString& loginCallsign, const wxString& gatewayCallsign, const wxString& address, CCacheManager* cache) : CDPlusAuthenticator::CDPlusAuthenticator(const wxString& loginCallsign, const wxString& gatewayCallsign, const wxString& address, CCacheManager* cache) :
@ -37,7 +34,6 @@ m_gatewayCallsign(gatewayCallsign),
m_address(address), m_address(address),
m_cache(cache), m_cache(cache),
m_timer(1U, 6U * 3600U), // 6 hours m_timer(1U, 6U * 3600U), // 6 hours
m_pollTimer(1U, 60U), // 1 minute
m_killed(false) m_killed(false)
{ {
wxASSERT(!loginCallsign.IsEmpty()); wxASSERT(!loginCallsign.IsEmpty());
@ -68,28 +64,19 @@ void* CDPlusAuthenticator::Entry()
wxLogMessage(wxT("Starting the D-Plus Authenticator thread")); wxLogMessage(wxT("Starting the D-Plus Authenticator thread"));
authenticate(m_loginCallsign, OPENDSTAR_HOSTNAME, OPENDSTAR_PORT, '2', true); authenticate(m_loginCallsign, OPENDSTAR_HOSTNAME, OPENDSTAR_PORT, '2', true);
authenticate(m_gatewayCallsign, DUTCHSTAR_HOSTNAME, DUTCHSTAR_PORT, 'K', false);
m_timer.start(); m_timer.start();
m_pollTimer.start();
try { try {
while (!m_killed) { while (!m_killed) {
if (m_pollTimer.hasExpired()) {
poll(m_gatewayCallsign, DUTCHSTAR_HOSTNAME, DUTCHSTAR_PORT, 'K');
m_pollTimer.start();
}
if (m_timer.hasExpired()) { if (m_timer.hasExpired()) {
authenticate(m_loginCallsign, OPENDSTAR_HOSTNAME, OPENDSTAR_PORT, '2', true); authenticate(m_loginCallsign, OPENDSTAR_HOSTNAME, OPENDSTAR_PORT, '2', true);
authenticate(m_gatewayCallsign, DUTCHSTAR_HOSTNAME, DUTCHSTAR_PORT, 'K', false);
m_timer.start(); m_timer.start();
} }
Sleep(1000UL); Sleep(1000UL);
m_timer.clock(); m_timer.clock();
m_pollTimer.clock();
} }
} }
catch (std::exception& e) { catch (std::exception& e) {

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2010-2013 by Jonathan Naylor G4KLX * Copyright (C) 2010-2013,2019 by Jonathan Naylor G4KLX
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -48,7 +48,6 @@ private:
wxString m_address; wxString m_address;
CCacheManager* m_cache; CCacheManager* m_cache;
CTimer m_timer; CTimer m_timer;
CTimer m_pollTimer;
bool m_killed; bool m_killed;
bool poll(const wxString& callsign, const wxString& hostname, unsigned int port, unsigned char id); bool poll(const wxString& callsign, const wxString& hostname, unsigned int port, unsigned char id);

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2009-2015 by Jonathan Naylor, G4KLX * Copyright (C) 2009-2015,2018,2019 by Jonathan Naylor, G4KLX
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -31,8 +31,7 @@ const bool DATA_SYNC_BITS[] = {true, false, true, false, true, false, true,
true, false, true, true, false, true, false, false, true, false, true, true, false, true, false, false,
false, true, true, false, true, false, false, false}; false, true, true, false, true, false, false, false};
const unsigned char END_PATTERN_BYTES[] = {0x55, 0x55, 0x55, 0x55, 0xC8, 0x7A, const unsigned char END_PATTERN_BYTES[] = {0x55, 0x55, 0x55, 0x55, 0xC8, 0x7A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
const bool END_PATTERN_BITS[] = {true, false, true, false, true, false, true, false, const bool END_PATTERN_BITS[] = {true, false, true, false, true, false, true, false,
true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false,
true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false,
@ -87,6 +86,10 @@ const unsigned char SLOW_DATA_TYPE_MASK = 0xF0U;
const unsigned char SLOW_DATA_TYPE_GPS = 0x30U; const unsigned char SLOW_DATA_TYPE_GPS = 0x30U;
const unsigned char SLOW_DATA_TYPE_TEXT = 0x40U; const unsigned char SLOW_DATA_TYPE_TEXT = 0x40U;
const unsigned char SLOW_DATA_TYPE_HEADER = 0x50U; const unsigned char SLOW_DATA_TYPE_HEADER = 0x50U;
const unsigned char SLOW_DATA_TYPE_FAST_DATA1 = 0x80U;
const unsigned char SLOW_DATA_TYPE_FAST_DATA2 = 0x90U;
const unsigned char SLOW_DATA_TYPE_SQUELCH = 0xC0U;
const unsigned char SLOW_DATA_LENGTH_MASK = 0x0FU;
const unsigned char DATA_MASK = 0x80U; const unsigned char DATA_MASK = 0x80U;
const unsigned char REPEATER_MASK = 0x40U; const unsigned char REPEATER_MASK = 0x40U;

View file

@ -167,6 +167,8 @@ wxString CDTMF::translate()
return processReflector(wxT("XRF"), command.Mid(1U)); return processReflector(wxT("XRF"), command.Mid(1U));
else if (command.GetChar(0U) == wxT('D')) else if (command.GetChar(0U) == wxT('D'))
return processReflector(wxT("DCS"), command.Mid(1U)); return processReflector(wxT("DCS"), command.Mid(1U));
else if (command.GetChar(0U) == wxT('A'))
return processReflector(wxT("XLX"), command.Mid(1U));
else else
return processCCS(command); return processCCS(command);
} }

View file

@ -144,6 +144,20 @@ CAMBEData* CG2ProtocolHandler::readAMBE()
return data; return data;
} }
#if defined(ENABLE_NAT_TRAVERSAL)
void CG2ProtocolHandler::traverseNat(const wxString& address)
{
unsigned char buffer[1];
::memset(buffer, 0, 1);
in_addr addr = CUDPReaderWriter::lookup(address);
//wxLogError(wxT("Punching hole to %s"), address.mb_str());
m_socket.write(buffer, 1, addr, G2_DV_PORT);
}
#endif
void CG2ProtocolHandler::close() void CG2ProtocolHandler::close()
{ {
m_socket.close(); m_socket.close();

View file

@ -52,6 +52,10 @@ public:
CHeaderData* readHeader(); CHeaderData* readHeader();
CAMBEData* readAMBE(); CAMBEData* readAMBE();
#if defined(ENABLE_NAT_TRAVERSAL)
void traverseNat(const wxString& addr);
#endif
void close(); void close();
private: private:

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2010-2015 by Jonathan Naylor G4KLX * Copyright (C) 2010-2015,2018,2020 by Jonathan Naylor G4KLX
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -112,10 +112,10 @@ const wxString KEY_URL4 = wxT("url4");
const wxString KEY_BAND41 = wxT("band4_1"); const wxString KEY_BAND41 = wxT("band4_1");
const wxString KEY_BAND42 = wxT("band4_2"); const wxString KEY_BAND42 = wxT("band4_2");
const wxString KEY_BAND43 = wxT("band4_3"); const wxString KEY_BAND43 = wxT("band4_3");
const wxString KEY_IRCDDB_ENABLED = wxT("ircddbEnabled"); const wxString KEY_IRCDDB_ENABLED1 = wxT("ircddbEnabled");
const wxString KEY_IRCDDB_HOSTNAME = wxT("ircddbHostname"); const wxString KEY_IRCDDB_HOSTNAME1 = wxT("ircddbHostname");
const wxString KEY_IRCDDB_USERNAME = wxT("ircddbUsername"); const wxString KEY_IRCDDB_USERNAME1 = wxT("ircddbUsername");
const wxString KEY_IRCDDB_PASSWORD = wxT("ircddbPassword"); const wxString KEY_IRCDDB_PASSWORD1 = wxT("ircddbPassword");
const wxString KEY_IRCDDB_ENABLED2 = wxT("ircddbEnabled2"); const wxString KEY_IRCDDB_ENABLED2 = wxT("ircddbEnabled2");
const wxString KEY_IRCDDB_HOSTNAME2 = wxT("ircddbHostname2"); const wxString KEY_IRCDDB_HOSTNAME2 = wxT("ircddbHostname2");
const wxString KEY_IRCDDB_USERNAME2 = wxT("ircddbUsername2"); const wxString KEY_IRCDDB_USERNAME2 = wxT("ircddbUsername2");
@ -129,7 +129,7 @@ const wxString KEY_IRCDDB_HOSTNAME4 = wxT("ircddbHostname4");
const wxString KEY_IRCDDB_USERNAME4 = wxT("ircddbUsername4"); const wxString KEY_IRCDDB_USERNAME4 = wxT("ircddbUsername4");
const wxString KEY_IRCDDB_PASSWORD4 = wxT("ircddbPassword4"); const wxString KEY_IRCDDB_PASSWORD4 = wxT("ircddbPassword4");
const wxString KEY_APRS_ENABLED = wxT("aprsEnabled"); const wxString KEY_APRS_ENABLED = wxT("aprsEnabled");
const wxString KEY_APRS_HOSTNAME = wxT("aprsHostname"); const wxString KEY_APRS_ADDRESS = wxT("aprsAddress");
const wxString KEY_APRS_PORT = wxT("aprsPort"); const wxString KEY_APRS_PORT = wxT("aprsPort");
const wxString KEY_DEXTRA_ENABLED = wxT("dextraEnabled"); const wxString KEY_DEXTRA_ENABLED = wxT("dextraEnabled");
const wxString KEY_DEXTRA_MAXDONGLES = wxT("dextraMaxDongles"); const wxString KEY_DEXTRA_MAXDONGLES = wxT("dextraMaxDongles");
@ -140,7 +140,6 @@ const wxString KEY_DCS_ENABLED = wxT("dcsEnabled");
const wxString KEY_CCS_ENABLED = wxT("ccsEnabled"); const wxString KEY_CCS_ENABLED = wxT("ccsEnabled");
const wxString KEY_CCS_HOST = wxT("ccsHost"); const wxString KEY_CCS_HOST = wxT("ccsHost");
const wxString KEY_XLX_ENABLED = wxT("xlxEnabled"); const wxString KEY_XLX_ENABLED = wxT("xlxEnabled");
const wxString KEY_XLX_OVERRIDE_LOCAL = wxT("xlxOverrideLocal");
const wxString KEY_XLX_HOSTS_FILE_URL = wxT("xlxHostsFileUrl"); const wxString KEY_XLX_HOSTS_FILE_URL = wxT("xlxHostsFileUrl");
const wxString KEY_STARNET_BAND1 = wxT("starNetBand1"); const wxString KEY_STARNET_BAND1 = wxT("starNetBand1");
const wxString KEY_STARNET_CALLSIGN1 = wxT("starNetCallsign1"); const wxString KEY_STARNET_CALLSIGN1 = wxT("starNetCallsign1");
@ -201,6 +200,9 @@ const wxString KEY_ECHO_ENABLED = wxT("echoEnabled");
const wxString KEY_LOG_ENABLED = wxT("logEnabled"); const wxString KEY_LOG_ENABLED = wxT("logEnabled");
const wxString KEY_DRATS_ENABLED = wxT("dratsEnabled"); const wxString KEY_DRATS_ENABLED = wxT("dratsEnabled");
const wxString KEY_DTMF_ENABLED = wxT("dtmfEnabled"); const wxString KEY_DTMF_ENABLED = wxT("dtmfEnabled");
const wxString KEY_GPSD_ENABLED = wxT("gpsdEnabled");
const wxString KEY_GPSD_ADDRESS = wxT("gpsdAddress");
const wxString KEY_GPSD_PORT = wxT("gpsdPort");
const wxString KEY_WINDOW_X = wxT("windowX"); const wxString KEY_WINDOW_X = wxT("windowX");
const wxString KEY_WINDOW_Y = wxT("windowY"); const wxString KEY_WINDOW_Y = wxT("windowY");
@ -234,10 +236,10 @@ const unsigned int DEFAULT_REPEATER_PORT1 = 20011U;
const unsigned int DEFAULT_REPEATER_PORT2 = 20012U; const unsigned int DEFAULT_REPEATER_PORT2 = 20012U;
const unsigned int DEFAULT_REPEATER_PORT3 = 20013U; const unsigned int DEFAULT_REPEATER_PORT3 = 20013U;
const unsigned int DEFAULT_REPEATER_PORT4 = 20014U; const unsigned int DEFAULT_REPEATER_PORT4 = 20014U;
const bool DEFAULT_IRCDDB_ENABLED = true; const bool DEFAULT_IRCDDB_ENABLED1 = true;
const wxString DEFAULT_IRCDDB_HOSTNAME = wxT("group1-irc.ircddb.net"); const wxString DEFAULT_IRCDDB_HOSTNAME1 = wxT("group1-irc.ircddb.net");
const wxString DEFAULT_IRCDDB_USERNAME = wxEmptyString; const wxString DEFAULT_IRCDDB_USERNAME1 = wxEmptyString;
const wxString DEFAULT_IRCDDB_PASSWORD = wxEmptyString; const wxString DEFAULT_IRCDDB_PASSWORD1 = wxEmptyString;
const bool DEFAULT_IRCDDB_ENABLED2 = true; const bool DEFAULT_IRCDDB_ENABLED2 = true;
const wxString DEFAULT_IRCDDB_HOSTNAME2 = wxT("rr.openquad.net"); const wxString DEFAULT_IRCDDB_HOSTNAME2 = wxT("rr.openquad.net");
const wxString DEFAULT_IRCDDB_USERNAME2 = wxEmptyString; const wxString DEFAULT_IRCDDB_USERNAME2 = wxEmptyString;
@ -250,9 +252,9 @@ const bool DEFAULT_IRCDDB_ENABLED4 = false;
const wxString DEFAULT_IRCDDB_HOSTNAME4 = wxEmptyString; const wxString DEFAULT_IRCDDB_HOSTNAME4 = wxEmptyString;
const wxString DEFAULT_IRCDDB_USERNAME4 = wxEmptyString; const wxString DEFAULT_IRCDDB_USERNAME4 = wxEmptyString;
const wxString DEFAULT_IRCDDB_PASSWORD4 = wxEmptyString; const wxString DEFAULT_IRCDDB_PASSWORD4 = wxEmptyString;
const bool DEFAULT_APRS_ENABLED = true; const bool DEFAULT_APRS_ENABLED = false;
const wxString DEFAULT_APRS_HOSTNAME = wxT("rotate.aprs2.net"); const wxString DEFAULT_APRS_ADDRESS = wxT("127.0.0.1");
const unsigned int DEFAULT_APRS_PORT = 14580U; const unsigned int DEFAULT_APRS_PORT = 8673U;
const bool DEFAULT_DEXTRA_ENABLED = true; const bool DEFAULT_DEXTRA_ENABLED = true;
const unsigned int DEFAULT_DEXTRA_MAXDONGLES = 5U; const unsigned int DEFAULT_DEXTRA_MAXDONGLES = 5U;
const bool DEFAULT_DPLUS_ENABLED = false; const bool DEFAULT_DPLUS_ENABLED = false;
@ -262,8 +264,7 @@ const bool DEFAULT_DCS_ENABLED = true;
const bool DEFAULT_CCS_ENABLED = true; const bool DEFAULT_CCS_ENABLED = true;
const wxString DEFAULT_CCS_HOST = wxT("CCS704 "); const wxString DEFAULT_CCS_HOST = wxT("CCS704 ");
const bool DEFAULT_XLX_ENABLED = true; const bool DEFAULT_XLX_ENABLED = true;
const bool DEFAULT_XLX_OVERRIDE_LOCAL = true; const wxString DEFAULT_XLX_HOSTS_FILE_URL = wxT("http://xlxapi.rlx.lu/api.php?do=GetXLXDMRMaster");//we use the XLXDMRMaster list because it starts with XLX instead of DCS, XRF etc ....
const wxString DEFAULT_XLX_HOSTS_FILE_URL = _T("http://xlxapi.rlx.lu/api.php?do=GetReflectorHostname");
const wxString DEFAULT_STARNET_BAND = wxEmptyString; const wxString DEFAULT_STARNET_BAND = wxEmptyString;
const wxString DEFAULT_STARNET_CALLSIGN = wxEmptyString; const wxString DEFAULT_STARNET_CALLSIGN = wxEmptyString;
const wxString DEFAULT_STARNET_LOGOFF = wxEmptyString; const wxString DEFAULT_STARNET_LOGOFF = wxEmptyString;
@ -283,6 +284,9 @@ const bool DEFAULT_INFO_ENABLED = true;
const bool DEFAULT_ECHO_ENABLED = true; const bool DEFAULT_ECHO_ENABLED = true;
const bool DEFAULT_DRATS_ENABLED = false; const bool DEFAULT_DRATS_ENABLED = false;
const bool DEFAULT_DTMF_ENABLED = true; const bool DEFAULT_DTMF_ENABLED = true;
const bool DEFAULT_GPSD_ENABLED = false;
const wxString DEFAULT_GPSD_ADDRESS = wxT("127.0.0.1");
const wxString DEFAULT_GPSD_PORT = wxT("2947");
const int DEFAULT_WINDOW_X = -1; const int DEFAULT_WINDOW_X = -1;
const int DEFAULT_WINDOW_Y = -1; const int DEFAULT_WINDOW_Y = -1;
@ -385,10 +389,10 @@ m_repeater4URL(DEFAULT_URL),
m_repeater4Band1(DEFAULT_BAND1), m_repeater4Band1(DEFAULT_BAND1),
m_repeater4Band2(DEFAULT_BAND2), m_repeater4Band2(DEFAULT_BAND2),
m_repeater4Band3(DEFAULT_BAND3), m_repeater4Band3(DEFAULT_BAND3),
m_ircddbEnabled(DEFAULT_IRCDDB_ENABLED), m_ircddbEnabled1(DEFAULT_IRCDDB_ENABLED1),
m_ircddbHostname(DEFAULT_IRCDDB_HOSTNAME), m_ircddbHostname1(DEFAULT_IRCDDB_HOSTNAME1),
m_ircddbUsername(DEFAULT_IRCDDB_USERNAME), m_ircddbUsername1(DEFAULT_IRCDDB_USERNAME1),
m_ircddbPassword(DEFAULT_IRCDDB_PASSWORD), m_ircddbPassword1(DEFAULT_IRCDDB_PASSWORD1),
m_ircddbEnabled2(DEFAULT_IRCDDB_ENABLED2), m_ircddbEnabled2(DEFAULT_IRCDDB_ENABLED2),
m_ircddbHostname2(DEFAULT_IRCDDB_HOSTNAME2), m_ircddbHostname2(DEFAULT_IRCDDB_HOSTNAME2),
m_ircddbUsername2(DEFAULT_IRCDDB_USERNAME2), m_ircddbUsername2(DEFAULT_IRCDDB_USERNAME2),
@ -402,7 +406,7 @@ m_ircddbHostname4(DEFAULT_IRCDDB_HOSTNAME4),
m_ircddbUsername4(DEFAULT_IRCDDB_USERNAME4), m_ircddbUsername4(DEFAULT_IRCDDB_USERNAME4),
m_ircddbPassword4(DEFAULT_IRCDDB_PASSWORD4), m_ircddbPassword4(DEFAULT_IRCDDB_PASSWORD4),
m_aprsEnabled(DEFAULT_APRS_ENABLED), m_aprsEnabled(DEFAULT_APRS_ENABLED),
m_aprsHostname(DEFAULT_APRS_HOSTNAME), m_aprsAddress(DEFAULT_APRS_ADDRESS),
m_aprsPort(DEFAULT_APRS_PORT), m_aprsPort(DEFAULT_APRS_PORT),
m_dextraEnabled(DEFAULT_DEXTRA_ENABLED), m_dextraEnabled(DEFAULT_DEXTRA_ENABLED),
m_dextraMaxDongles(DEFAULT_DEXTRA_MAXDONGLES), m_dextraMaxDongles(DEFAULT_DEXTRA_MAXDONGLES),
@ -413,7 +417,6 @@ m_dcsEnabled(DEFAULT_DCS_ENABLED),
m_ccsEnabled(DEFAULT_CCS_ENABLED), m_ccsEnabled(DEFAULT_CCS_ENABLED),
m_ccsHost(DEFAULT_CCS_HOST), m_ccsHost(DEFAULT_CCS_HOST),
m_xlxEnabled(DEFAULT_XLX_ENABLED), m_xlxEnabled(DEFAULT_XLX_ENABLED),
m_xlxOverrideLocal(DEFAULT_XLX_OVERRIDE_LOCAL),
m_xlxHostsFileUrl(DEFAULT_XLX_HOSTS_FILE_URL), m_xlxHostsFileUrl(DEFAULT_XLX_HOSTS_FILE_URL),
m_starNet1Band(DEFAULT_STARNET_BAND), m_starNet1Band(DEFAULT_STARNET_BAND),
m_starNet1Callsign(DEFAULT_STARNET_CALLSIGN), m_starNet1Callsign(DEFAULT_STARNET_CALLSIGN),
@ -474,6 +477,9 @@ m_echoEnabled(DEFAULT_ECHO_ENABLED),
m_logEnabled(DEFAULT_LOG_ENABLED), m_logEnabled(DEFAULT_LOG_ENABLED),
m_dratsEnabled(DEFAULT_DRATS_ENABLED), m_dratsEnabled(DEFAULT_DRATS_ENABLED),
m_dtmfEnabled(DEFAULT_DTMF_ENABLED), m_dtmfEnabled(DEFAULT_DTMF_ENABLED),
m_gpsdEnabled(DEFAULT_GPSD_ENABLED),
m_gpsdAddress(DEFAULT_GPSD_ADDRESS),
m_gpsdPort(DEFAULT_GPSD_PORT),
m_x(DEFAULT_WINDOW_X), m_x(DEFAULT_WINDOW_X),
m_y(DEFAULT_WINDOW_Y) m_y(DEFAULT_WINDOW_Y)
{ {
@ -701,29 +707,29 @@ m_y(DEFAULT_WINDOW_Y)
m_config->Read(m_name + KEY_BAND43, &temp, long(DEFAULT_BAND3)); m_config->Read(m_name + KEY_BAND43, &temp, long(DEFAULT_BAND3));
m_repeater4Band3 = (unsigned char)temp; m_repeater4Band3 = (unsigned char)temp;
m_config->Read(m_name + KEY_IRCDDB_ENABLED, &m_ircddbEnabled, DEFAULT_IRCDDB_ENABLED); m_config->Read(m_name + KEY_IRCDDB_ENABLED1, &m_ircddbEnabled1, DEFAULT_IRCDDB_ENABLED1);
m_config->Read(m_name + KEY_IRCDDB_HOSTNAME, &m_ircddbHostname, DEFAULT_IRCDDB_HOSTNAME); m_config->Read(m_name + KEY_IRCDDB_HOSTNAME1, &m_ircddbHostname1, DEFAULT_IRCDDB_HOSTNAME1);
m_config->Read(m_name + KEY_IRCDDB_USERNAME, &m_ircddbUsername, DEFAULT_IRCDDB_USERNAME); m_config->Read(m_name + KEY_IRCDDB_USERNAME1, &m_ircddbUsername1, DEFAULT_IRCDDB_USERNAME1);
m_config->Read(m_name + KEY_IRCDDB_PASSWORD, &m_ircddbPassword, DEFAULT_IRCDDB_PASSWORD); m_config->Read(m_name + KEY_IRCDDB_PASSWORD1, &m_ircddbPassword1, DEFAULT_IRCDDB_PASSWORD1);
m_config->Read(m_name + KEY_IRCDDB_ENABLED2, &m_ircddbEnabled, DEFAULT_IRCDDB_ENABLED2); m_config->Read(m_name + KEY_IRCDDB_ENABLED2, &m_ircddbEnabled2, DEFAULT_IRCDDB_ENABLED2);
m_config->Read(m_name + KEY_IRCDDB_HOSTNAME2, &m_ircddbHostname, DEFAULT_IRCDDB_HOSTNAME2); m_config->Read(m_name + KEY_IRCDDB_HOSTNAME2, &m_ircddbHostname2, DEFAULT_IRCDDB_HOSTNAME2);
m_config->Read(m_name + KEY_IRCDDB_USERNAME2, &m_ircddbUsername, DEFAULT_IRCDDB_USERNAME2); m_config->Read(m_name + KEY_IRCDDB_USERNAME2, &m_ircddbUsername2, DEFAULT_IRCDDB_USERNAME2);
m_config->Read(m_name + KEY_IRCDDB_PASSWORD2, &m_ircddbPassword, DEFAULT_IRCDDB_PASSWORD2); m_config->Read(m_name + KEY_IRCDDB_PASSWORD2, &m_ircddbPassword2, DEFAULT_IRCDDB_PASSWORD2);
m_config->Read(m_name + KEY_IRCDDB_ENABLED3, &m_ircddbEnabled, DEFAULT_IRCDDB_ENABLED3); m_config->Read(m_name + KEY_IRCDDB_ENABLED3, &m_ircddbEnabled3, DEFAULT_IRCDDB_ENABLED3);
m_config->Read(m_name + KEY_IRCDDB_HOSTNAME3, &m_ircddbHostname, DEFAULT_IRCDDB_HOSTNAME3); m_config->Read(m_name + KEY_IRCDDB_HOSTNAME3, &m_ircddbHostname3, DEFAULT_IRCDDB_HOSTNAME3);
m_config->Read(m_name + KEY_IRCDDB_USERNAME3, &m_ircddbUsername, DEFAULT_IRCDDB_USERNAME3); m_config->Read(m_name + KEY_IRCDDB_USERNAME3, &m_ircddbUsername3, DEFAULT_IRCDDB_USERNAME3);
m_config->Read(m_name + KEY_IRCDDB_PASSWORD3, &m_ircddbPassword, DEFAULT_IRCDDB_PASSWORD3); m_config->Read(m_name + KEY_IRCDDB_PASSWORD3, &m_ircddbPassword3, DEFAULT_IRCDDB_PASSWORD3);
m_config->Read(m_name + KEY_IRCDDB_ENABLED4, &m_ircddbEnabled, DEFAULT_IRCDDB_ENABLED4); m_config->Read(m_name + KEY_IRCDDB_ENABLED4, &m_ircddbEnabled4, DEFAULT_IRCDDB_ENABLED4);
m_config->Read(m_name + KEY_IRCDDB_HOSTNAME4, &m_ircddbHostname, DEFAULT_IRCDDB_HOSTNAME4); m_config->Read(m_name + KEY_IRCDDB_HOSTNAME4, &m_ircddbHostname4, DEFAULT_IRCDDB_HOSTNAME4);
m_config->Read(m_name + KEY_IRCDDB_USERNAME4, &m_ircddbUsername, DEFAULT_IRCDDB_USERNAME4); m_config->Read(m_name + KEY_IRCDDB_USERNAME4, &m_ircddbUsername4, DEFAULT_IRCDDB_USERNAME4);
m_config->Read(m_name + KEY_IRCDDB_PASSWORD4, &m_ircddbPassword, DEFAULT_IRCDDB_PASSWORD4); m_config->Read(m_name + KEY_IRCDDB_PASSWORD4, &m_ircddbPassword4, DEFAULT_IRCDDB_PASSWORD4);
m_config->Read(m_name + KEY_APRS_ENABLED, &m_aprsEnabled, DEFAULT_APRS_ENABLED); m_config->Read(m_name + KEY_APRS_ENABLED, &m_aprsEnabled, DEFAULT_APRS_ENABLED);
m_config->Read(m_name + KEY_APRS_HOSTNAME, &m_aprsHostname, DEFAULT_APRS_HOSTNAME); m_config->Read(m_name + KEY_APRS_ADDRESS, &m_aprsAddress, DEFAULT_APRS_ADDRESS);
m_config->Read(m_name + KEY_APRS_PORT, &temp, long(DEFAULT_APRS_PORT)); m_config->Read(m_name + KEY_APRS_PORT, &temp, long(DEFAULT_APRS_PORT));
m_aprsPort = (unsigned int)temp; m_aprsPort = (unsigned int)temp;
@ -748,9 +754,9 @@ m_y(DEFAULT_WINDOW_Y)
m_config->Read(m_name + KEY_XLX_ENABLED, &m_xlxEnabled, DEFAULT_XLX_ENABLED); m_config->Read(m_name + KEY_XLX_ENABLED, &m_xlxEnabled, DEFAULT_XLX_ENABLED);
m_config->Read(m_name + KEY_XLX_OVERRIDE_LOCAL, &m_xlxOverrideLocal, DEFAULT_XLX_OVERRIDE_LOCAL);
m_config->Read(m_name + KEY_XLX_HOSTS_FILE_URL, &m_xlxHostsFileUrl, DEFAULT_XLX_HOSTS_FILE_URL); m_config->Read(m_name + KEY_XLX_HOSTS_FILE_URL, &m_xlxHostsFileUrl, DEFAULT_XLX_HOSTS_FILE_URL);
if(m_xlxEnabled && m_xlxHostsFileUrl.Trim().IsEmpty())//To avoid support nightmare, fill the url with the default one when xlx is enabled and the url is left empty
m_xlxHostsFileUrl = DEFAULT_XLX_HOSTS_FILE_URL;
m_config->Read(m_name + KEY_STARNET_BAND1, &m_starNet1Band, DEFAULT_STARNET_BAND); m_config->Read(m_name + KEY_STARNET_BAND1, &m_starNet1Band, DEFAULT_STARNET_BAND);
@ -887,6 +893,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_DTMF_ENABLED, &m_dtmfEnabled, DEFAULT_DTMF_ENABLED);
m_config->Read(m_name + KEY_GPSD_ENABLED, &m_gpsdEnabled, DEFAULT_GPSD_ENABLED);
m_config->Read(m_name + KEY_GPSD_ADDRESS, &m_gpsdAddress, DEFAULT_GPSD_ADDRESS);
m_config->Read(m_name + KEY_GPSD_PORT, &temp, long(DEFAULT_GPSD_PORT));
m_gpsdPort = (unsigned int)temp;
m_config->Read(m_name + KEY_WINDOW_X, &temp, long(DEFAULT_WINDOW_X)); m_config->Read(m_name + KEY_WINDOW_X, &temp, long(DEFAULT_WINDOW_X));
m_x = int(temp); m_x = int(temp);
@ -995,10 +1008,10 @@ m_repeater4URL(DEFAULT_URL),
m_repeater4Band1(DEFAULT_BAND1), m_repeater4Band1(DEFAULT_BAND1),
m_repeater4Band2(DEFAULT_BAND2), m_repeater4Band2(DEFAULT_BAND2),
m_repeater4Band3(DEFAULT_BAND3), m_repeater4Band3(DEFAULT_BAND3),
m_ircddbEnabled(DEFAULT_IRCDDB_ENABLED), m_ircddbEnabled1(DEFAULT_IRCDDB_ENABLED1),
m_ircddbHostname(DEFAULT_IRCDDB_HOSTNAME), m_ircddbHostname1(DEFAULT_IRCDDB_HOSTNAME1),
m_ircddbUsername(DEFAULT_IRCDDB_USERNAME), m_ircddbUsername1(DEFAULT_IRCDDB_USERNAME1),
m_ircddbPassword(DEFAULT_IRCDDB_PASSWORD), m_ircddbPassword1(DEFAULT_IRCDDB_PASSWORD1),
m_ircddbEnabled2(DEFAULT_IRCDDB_ENABLED2), m_ircddbEnabled2(DEFAULT_IRCDDB_ENABLED2),
m_ircddbHostname2(DEFAULT_IRCDDB_HOSTNAME2), m_ircddbHostname2(DEFAULT_IRCDDB_HOSTNAME2),
m_ircddbUsername2(DEFAULT_IRCDDB_USERNAME2), m_ircddbUsername2(DEFAULT_IRCDDB_USERNAME2),
@ -1012,7 +1025,7 @@ m_ircddbHostname4(DEFAULT_IRCDDB_HOSTNAME4),
m_ircddbUsername4(DEFAULT_IRCDDB_USERNAME4), m_ircddbUsername4(DEFAULT_IRCDDB_USERNAME4),
m_ircddbPassword4(DEFAULT_IRCDDB_PASSWORD4), m_ircddbPassword4(DEFAULT_IRCDDB_PASSWORD4),
m_aprsEnabled(DEFAULT_APRS_ENABLED), m_aprsEnabled(DEFAULT_APRS_ENABLED),
m_aprsHostname(DEFAULT_APRS_HOSTNAME), m_aprsAddress(DEFAULT_APRS_ADDRESS),
m_aprsPort(DEFAULT_APRS_PORT), m_aprsPort(DEFAULT_APRS_PORT),
m_dextraEnabled(DEFAULT_DEXTRA_ENABLED), m_dextraEnabled(DEFAULT_DEXTRA_ENABLED),
m_dextraMaxDongles(DEFAULT_DEXTRA_MAXDONGLES), m_dextraMaxDongles(DEFAULT_DEXTRA_MAXDONGLES),
@ -1023,7 +1036,6 @@ m_dcsEnabled(DEFAULT_DCS_ENABLED),
m_ccsEnabled(DEFAULT_CCS_ENABLED), m_ccsEnabled(DEFAULT_CCS_ENABLED),
m_ccsHost(DEFAULT_CCS_HOST), m_ccsHost(DEFAULT_CCS_HOST),
m_xlxEnabled(DEFAULT_XLX_ENABLED), m_xlxEnabled(DEFAULT_XLX_ENABLED),
m_xlxOverrideLocal(DEFAULT_XLX_OVERRIDE_LOCAL),
m_xlxHostsFileUrl(DEFAULT_XLX_HOSTS_FILE_URL), m_xlxHostsFileUrl(DEFAULT_XLX_HOSTS_FILE_URL),
m_starNet1Band(DEFAULT_STARNET_BAND), m_starNet1Band(DEFAULT_STARNET_BAND),
m_starNet1Callsign(DEFAULT_STARNET_CALLSIGN), m_starNet1Callsign(DEFAULT_STARNET_CALLSIGN),
@ -1084,6 +1096,9 @@ m_echoEnabled(DEFAULT_ECHO_ENABLED),
m_logEnabled(DEFAULT_LOG_ENABLED), m_logEnabled(DEFAULT_LOG_ENABLED),
m_dratsEnabled(DEFAULT_DRATS_ENABLED), m_dratsEnabled(DEFAULT_DRATS_ENABLED),
m_dtmfEnabled(DEFAULT_DTMF_ENABLED), m_dtmfEnabled(DEFAULT_DTMF_ENABLED),
m_gpsdEnabled(DEFAULT_GPSD_ENABLED),
m_gpsdAddress(DEFAULT_GPSD_ADDRESS),
m_gpsdPort(DEFAULT_GPSD_PORT),
m_x(DEFAULT_WINDOW_X), m_x(DEFAULT_WINDOW_X),
m_y(DEFAULT_WINDOW_Y) m_y(DEFAULT_WINDOW_Y)
{ {
@ -1342,15 +1357,15 @@ m_y(DEFAULT_WINDOW_Y)
} else if (key.IsSameAs(KEY_BAND43)) { } else if (key.IsSameAs(KEY_BAND43)) {
val.ToULong(&temp2); val.ToULong(&temp2);
m_repeater4Band3 = (unsigned char)temp2; m_repeater4Band3 = (unsigned char)temp2;
} else if (key.IsSameAs(KEY_IRCDDB_ENABLED)) { } else if (key.IsSameAs(KEY_IRCDDB_ENABLED1)) {
val.ToLong(&temp1); val.ToLong(&temp1);
m_ircddbEnabled = temp1 == 1L; m_ircddbEnabled1 = temp1 == 1L;
} else if (key.IsSameAs(KEY_IRCDDB_HOSTNAME)) { } else if (key.IsSameAs(KEY_IRCDDB_HOSTNAME1)) {
m_ircddbHostname = val; m_ircddbHostname1 = val;
} else if (key.IsSameAs(KEY_IRCDDB_USERNAME)) { } else if (key.IsSameAs(KEY_IRCDDB_USERNAME1)) {
m_ircddbUsername = val; m_ircddbUsername1 = val;
} else if (key.IsSameAs(KEY_IRCDDB_PASSWORD)) { } else if (key.IsSameAs(KEY_IRCDDB_PASSWORD1)) {
m_ircddbPassword = val; m_ircddbPassword1 = val;
} else if (key.IsSameAs(KEY_IRCDDB_ENABLED2)) { } else if (key.IsSameAs(KEY_IRCDDB_ENABLED2)) {
val.ToLong(&temp1); val.ToLong(&temp1);
m_ircddbEnabled2 = temp1 == 1L; m_ircddbEnabled2 = temp1 == 1L;
@ -1381,8 +1396,8 @@ m_y(DEFAULT_WINDOW_Y)
} else if (key.IsSameAs(KEY_APRS_ENABLED)) { } else if (key.IsSameAs(KEY_APRS_ENABLED)) {
val.ToLong(&temp1); val.ToLong(&temp1);
m_aprsEnabled = temp1 == 1L; m_aprsEnabled = temp1 == 1L;
} else if (key.IsSameAs(KEY_APRS_HOSTNAME)) { } else if (key.IsSameAs(KEY_APRS_ADDRESS)) {
m_aprsHostname = val; m_aprsAddress = val;
} else if (key.IsSameAs(KEY_APRS_PORT)) { } else if (key.IsSameAs(KEY_APRS_PORT)) {
val.ToULong(&temp2); val.ToULong(&temp2);
m_aprsPort = (unsigned int)temp2; m_aprsPort = (unsigned int)temp2;
@ -1411,10 +1426,7 @@ m_y(DEFAULT_WINDOW_Y)
} else if (key.IsSameAs(KEY_XLX_ENABLED)) { } else if (key.IsSameAs(KEY_XLX_ENABLED)) {
val.ToLong(&temp1); val.ToLong(&temp1);
m_xlxEnabled = temp1 == 1L; m_xlxEnabled = temp1 == 1L;
} else if (key.IsSameAs(KEY_XLX_OVERRIDE_LOCAL)) { } else if (key.IsSameAs(KEY_XLX_HOSTS_FILE_URL) && !val.Trim().IsEmpty()) { //always load default url if the value in the config file is empty
val.ToLong(&temp1);
m_xlxOverrideLocal = temp1 == 1L;
} else if (key.IsSameAs(KEY_XLX_HOSTS_FILE_URL)) {
m_xlxHostsFileUrl = val; m_xlxHostsFileUrl = val;
} else if (key.IsSameAs(KEY_STARNET_BAND1)) { } else if (key.IsSameAs(KEY_STARNET_BAND1)) {
m_starNet1Band = val; m_starNet1Band = val;
@ -1562,6 +1574,13 @@ m_y(DEFAULT_WINDOW_Y)
} else if (key.IsSameAs(KEY_DTMF_ENABLED)) { } else if (key.IsSameAs(KEY_DTMF_ENABLED)) {
val.ToLong(&temp1); val.ToLong(&temp1);
m_dtmfEnabled = temp1 == 1L; m_dtmfEnabled = temp1 == 1L;
} else if (key.IsSameAs(KEY_GPSD_ENABLED)) {
val.ToLong(&temp1);
m_gpsdEnabled = temp1 == 1L;
} else if (key.IsSameAs(KEY_GPSD_ADDRESS)) {
m_gpsdAddress = val;
} else if (key.IsSameAs(KEY_GPSD_PORT)) {
m_gpsdPort = val;
} else if (key.IsSameAs(KEY_WINDOW_X)) { } else if (key.IsSameAs(KEY_WINDOW_X)) {
val.ToLong(&temp1); val.ToLong(&temp1);
m_x = int(temp1); m_x = int(temp1);
@ -1805,20 +1824,20 @@ void CIRCDDBGatewayConfig::setRepeater4(const wxString& band, HW_TYPE type, cons
m_repeater4URL = url; m_repeater4URL = url;
} }
void CIRCDDBGatewayConfig::getIrcDDB(bool& enabled, wxString& hostname, wxString& username, wxString& password) const void CIRCDDBGatewayConfig::getIrcDDB1(bool& enabled, wxString& hostname, wxString& username, wxString& password) const
{ {
enabled = m_ircddbEnabled; enabled = m_ircddbEnabled1;
hostname = m_ircddbHostname; hostname = m_ircddbHostname1;
username = m_ircddbUsername; username = m_ircddbUsername1;
password = m_ircddbPassword; password = m_ircddbPassword1;
} }
void CIRCDDBGatewayConfig::setIrcDDB(bool enabled, const wxString& hostname, const wxString& username, const wxString& password) void CIRCDDBGatewayConfig::setIrcDDB1(bool enabled, const wxString& hostname, const wxString& username, const wxString& password)
{ {
m_ircddbEnabled = enabled; m_ircddbEnabled1 = enabled;
m_ircddbHostname = hostname; m_ircddbHostname1 = hostname;
m_ircddbUsername = username; m_ircddbUsername1 = username;
m_ircddbPassword = password; m_ircddbPassword1 = password;
} }
void CIRCDDBGatewayConfig::getIrcDDB2(bool& enabled, wxString& hostname, wxString& username, wxString& password) const void CIRCDDBGatewayConfig::getIrcDDB2(bool& enabled, wxString& hostname, wxString& username, wxString& password) const
@ -1826,14 +1845,6 @@ void CIRCDDBGatewayConfig::getIrcDDB2(bool& enabled, wxString& hostname, wxStrin
enabled = m_ircddbEnabled2; enabled = m_ircddbEnabled2;
hostname = m_ircddbHostname2; hostname = m_ircddbHostname2;
username = m_ircddbUsername2; username = m_ircddbUsername2;
/*if(username.IsEmpty()){
//no user specified for openquad? use the one from the default network !
username = m_ircddbUsername;
if(username[0] >= '0' && username[0] <= '9')
username = wxT("r") + username;
}*/
password = m_ircddbPassword2; password = m_ircddbPassword2;
} }
@ -1877,17 +1888,17 @@ void CIRCDDBGatewayConfig::setIrcDDB4(bool enabled, const wxString& hostname, co
m_ircddbPassword4 = password; m_ircddbPassword4 = password;
} }
void CIRCDDBGatewayConfig::getDPRS(bool& enabled, wxString& hostname, unsigned int& port) const void CIRCDDBGatewayConfig::getDPRS(bool& enabled, wxString& address, unsigned int& port) const
{ {
enabled = m_aprsEnabled; enabled = m_aprsEnabled;
hostname = m_aprsHostname; address = m_aprsAddress;
port = m_aprsPort; port = m_aprsPort;
} }
void CIRCDDBGatewayConfig::setDPRS(bool enabled, const wxString& hostname, unsigned int port) void CIRCDDBGatewayConfig::setDPRS(bool enabled, const wxString& address, unsigned int port)
{ {
m_aprsEnabled = enabled; m_aprsEnabled = enabled;
m_aprsHostname = hostname; m_aprsAddress = address;
m_aprsPort = port; m_aprsPort = port;
} }
@ -1931,17 +1942,15 @@ void CIRCDDBGatewayConfig::setDCS(bool dcsEnabled, bool ccsEnabled, const wxStri
m_ccsHost = ccsHost; m_ccsHost = ccsHost;
} }
void CIRCDDBGatewayConfig::getXLX(bool& xlxEnabled, bool& xlxOverrideLocal, wxString& xlxHostsFileUrl) void CIRCDDBGatewayConfig::getXLX(bool& xlxEnabled, wxString& xlxHostsFileUrl)
{ {
xlxEnabled = m_xlxEnabled; xlxEnabled = m_xlxEnabled;
xlxOverrideLocal = m_xlxOverrideLocal;
xlxHostsFileUrl = m_xlxHostsFileUrl; xlxHostsFileUrl = m_xlxHostsFileUrl;
} }
void CIRCDDBGatewayConfig::setXLX(bool xlxEnabled, bool xlxOverrideLocal, wxString xlxHostsFileUrl) void CIRCDDBGatewayConfig::setXLX(bool xlxEnabled, wxString xlxHostsFileUrl)
{ {
m_xlxEnabled = xlxEnabled; m_xlxEnabled = xlxEnabled;
m_xlxOverrideLocal = xlxOverrideLocal;
m_xlxHostsFileUrl = xlxHostsFileUrl; m_xlxHostsFileUrl = xlxHostsFileUrl;
} }
@ -2189,6 +2198,20 @@ void CIRCDDBGatewayConfig::setMiscellaneous(TEXT_LANG language, bool infoEnabled
m_dtmfEnabled = dtmfEnabled; m_dtmfEnabled = dtmfEnabled;
} }
void CIRCDDBGatewayConfig::getGPSD(bool& enabled, wxString& address, wxString& port) const
{
enabled = m_gpsdEnabled;
address = m_gpsdAddress;
port = m_gpsdPort;
}
void CIRCDDBGatewayConfig::setGPSD(bool enabled, const wxString& address, const wxString& port)
{
m_gpsdEnabled = enabled;
m_gpsdAddress = address;
m_gpsdPort = port;
}
void CIRCDDBGatewayConfig::getPosition(int& x, int& y) const void CIRCDDBGatewayConfig::getPosition(int& x, int& y) const
{ {
x = m_x; x = m_x;
@ -2339,10 +2362,10 @@ bool CIRCDDBGatewayConfig::write()
m_config->Write(m_name + KEY_BAND41, long(m_repeater4Band1)); m_config->Write(m_name + KEY_BAND41, long(m_repeater4Band1));
m_config->Write(m_name + KEY_BAND42, long(m_repeater4Band2)); m_config->Write(m_name + KEY_BAND42, long(m_repeater4Band2));
m_config->Write(m_name + KEY_BAND43, long(m_repeater4Band3)); m_config->Write(m_name + KEY_BAND43, long(m_repeater4Band3));
m_config->Write(m_name + KEY_IRCDDB_ENABLED, m_ircddbEnabled); m_config->Write(m_name + KEY_IRCDDB_ENABLED1, m_ircddbEnabled1);
m_config->Write(m_name + KEY_IRCDDB_HOSTNAME, m_ircddbHostname); m_config->Write(m_name + KEY_IRCDDB_HOSTNAME1, m_ircddbHostname1);
m_config->Write(m_name + KEY_IRCDDB_USERNAME, m_ircddbUsername); m_config->Write(m_name + KEY_IRCDDB_USERNAME1, m_ircddbUsername1);
m_config->Write(m_name + KEY_IRCDDB_PASSWORD, m_ircddbPassword); m_config->Write(m_name + KEY_IRCDDB_PASSWORD1, m_ircddbPassword1);
m_config->Write(m_name + KEY_IRCDDB_ENABLED2, m_ircddbEnabled2); m_config->Write(m_name + KEY_IRCDDB_ENABLED2, m_ircddbEnabled2);
m_config->Write(m_name + KEY_IRCDDB_HOSTNAME2, m_ircddbHostname2); m_config->Write(m_name + KEY_IRCDDB_HOSTNAME2, m_ircddbHostname2);
m_config->Write(m_name + KEY_IRCDDB_USERNAME2, m_ircddbUsername2); m_config->Write(m_name + KEY_IRCDDB_USERNAME2, m_ircddbUsername2);
@ -2356,7 +2379,7 @@ bool CIRCDDBGatewayConfig::write()
m_config->Write(m_name + KEY_IRCDDB_USERNAME4, m_ircddbUsername4); m_config->Write(m_name + KEY_IRCDDB_USERNAME4, m_ircddbUsername4);
m_config->Write(m_name + KEY_IRCDDB_PASSWORD4, m_ircddbPassword4); m_config->Write(m_name + KEY_IRCDDB_PASSWORD4, m_ircddbPassword4);
m_config->Write(m_name + KEY_APRS_ENABLED, m_aprsEnabled); m_config->Write(m_name + KEY_APRS_ENABLED, m_aprsEnabled);
m_config->Write(m_name + KEY_APRS_HOSTNAME, m_aprsHostname); m_config->Write(m_name + KEY_APRS_ADDRESS, m_aprsAddress);
m_config->Write(m_name + KEY_APRS_PORT, long(m_aprsPort)); m_config->Write(m_name + KEY_APRS_PORT, long(m_aprsPort));
m_config->Write(m_name + KEY_DEXTRA_ENABLED, m_dextraEnabled); m_config->Write(m_name + KEY_DEXTRA_ENABLED, m_dextraEnabled);
m_config->Write(m_name + KEY_DEXTRA_MAXDONGLES, long(m_dextraMaxDongles)); m_config->Write(m_name + KEY_DEXTRA_MAXDONGLES, long(m_dextraMaxDongles));
@ -2367,7 +2390,6 @@ bool CIRCDDBGatewayConfig::write()
m_config->Write(m_name + KEY_CCS_ENABLED, m_ccsEnabled); m_config->Write(m_name + KEY_CCS_ENABLED, m_ccsEnabled);
m_config->Write(m_name + KEY_CCS_HOST, m_ccsHost); m_config->Write(m_name + KEY_CCS_HOST, m_ccsHost);
m_config->Write(m_name + KEY_XLX_ENABLED, m_xlxEnabled); m_config->Write(m_name + KEY_XLX_ENABLED, m_xlxEnabled);
m_config->Write(m_name + KEY_XLX_OVERRIDE_LOCAL, m_xlxOverrideLocal);
m_config->Write(m_name + KEY_XLX_HOSTS_FILE_URL, m_xlxHostsFileUrl); m_config->Write(m_name + KEY_XLX_HOSTS_FILE_URL, m_xlxHostsFileUrl);
m_config->Write(m_name + KEY_STARNET_BAND1, m_starNet1Band); m_config->Write(m_name + KEY_STARNET_BAND1, m_starNet1Band);
m_config->Write(m_name + KEY_STARNET_CALLSIGN1, m_starNet1Callsign); m_config->Write(m_name + KEY_STARNET_CALLSIGN1, m_starNet1Callsign);
@ -2428,6 +2450,9 @@ bool CIRCDDBGatewayConfig::write()
m_config->Write(m_name + KEY_LOG_ENABLED, m_logEnabled); 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_DRATS_ENABLED, m_dratsEnabled);
m_config->Write(m_name + KEY_DTMF_ENABLED, m_dtmfEnabled); m_config->Write(m_name + KEY_DTMF_ENABLED, m_dtmfEnabled);
m_config->Write(m_name + KEY_GPSD_ENABLED, m_gpsdEnabled);
m_config->Write(m_name + KEY_GPSD_ADDRESS, m_gpsdAddress);
m_config->Write(m_name + KEY_GPSD_PORT, m_gpsdPort);
m_config->Write(m_name + KEY_WINDOW_X, long(m_x)); m_config->Write(m_name + KEY_WINDOW_X, long(m_x));
m_config->Write(m_name + KEY_WINDOW_Y, long(m_y)); m_config->Write(m_name + KEY_WINDOW_Y, long(m_y));
m_config->Flush(); m_config->Flush();
@ -2546,10 +2571,10 @@ bool CIRCDDBGatewayConfig::write()
buffer.Printf(wxT("%s=%u"), KEY_BAND41.c_str(), m_repeater4Band1); file.AddLine(buffer); buffer.Printf(wxT("%s=%u"), KEY_BAND41.c_str(), m_repeater4Band1); file.AddLine(buffer);
buffer.Printf(wxT("%s=%u"), KEY_BAND42.c_str(), m_repeater4Band2); file.AddLine(buffer); buffer.Printf(wxT("%s=%u"), KEY_BAND42.c_str(), m_repeater4Band2); file.AddLine(buffer);
buffer.Printf(wxT("%s=%u"), KEY_BAND43.c_str(), m_repeater4Band3); file.AddLine(buffer); buffer.Printf(wxT("%s=%u"), KEY_BAND43.c_str(), m_repeater4Band3); file.AddLine(buffer);
buffer.Printf(wxT("%s=%d"), KEY_IRCDDB_ENABLED.c_str(), m_ircddbEnabled ? 1 : 0); file.AddLine(buffer); buffer.Printf(wxT("%s=%d"), KEY_IRCDDB_ENABLED1.c_str(), m_ircddbEnabled1 ? 1 : 0); file.AddLine(buffer);
buffer.Printf(wxT("%s=%s"), KEY_IRCDDB_HOSTNAME.c_str(), m_ircddbHostname.c_str()); file.AddLine(buffer); buffer.Printf(wxT("%s=%s"), KEY_IRCDDB_HOSTNAME1.c_str(), m_ircddbHostname1.c_str()); file.AddLine(buffer);
buffer.Printf(wxT("%s=%s"), KEY_IRCDDB_USERNAME.c_str(), m_ircddbUsername.c_str()); file.AddLine(buffer); buffer.Printf(wxT("%s=%s"), KEY_IRCDDB_USERNAME1.c_str(), m_ircddbUsername1.c_str()); file.AddLine(buffer);
buffer.Printf(wxT("%s=%s"), KEY_IRCDDB_PASSWORD.c_str(), m_ircddbPassword.c_str()); file.AddLine(buffer); buffer.Printf(wxT("%s=%s"), KEY_IRCDDB_PASSWORD1.c_str(), m_ircddbPassword1.c_str()); file.AddLine(buffer);
buffer.Printf("%s=%d", KEY_IRCDDB_ENABLED2.c_str(), m_ircddbEnabled2 ? 1 : 0); file.AddLine(buffer); buffer.Printf("%s=%d", KEY_IRCDDB_ENABLED2.c_str(), m_ircddbEnabled2 ? 1 : 0); file.AddLine(buffer);
buffer.Printf("%s=%s", KEY_IRCDDB_HOSTNAME2.c_str(), m_ircddbHostname2.c_str()); file.AddLine(buffer); buffer.Printf("%s=%s", KEY_IRCDDB_HOSTNAME2.c_str(), m_ircddbHostname2.c_str()); file.AddLine(buffer);
buffer.Printf("%s=%s", KEY_IRCDDB_USERNAME2.c_str(), m_ircddbUsername2.c_str()); file.AddLine(buffer); buffer.Printf("%s=%s", KEY_IRCDDB_USERNAME2.c_str(), m_ircddbUsername2.c_str()); file.AddLine(buffer);
@ -2563,7 +2588,7 @@ bool CIRCDDBGatewayConfig::write()
buffer.Printf("%s=%s", KEY_IRCDDB_USERNAME4.c_str(), m_ircddbUsername4.c_str()); file.AddLine(buffer); buffer.Printf("%s=%s", KEY_IRCDDB_USERNAME4.c_str(), m_ircddbUsername4.c_str()); file.AddLine(buffer);
buffer.Printf("%s=%s", KEY_IRCDDB_PASSWORD4.c_str(), m_ircddbPassword4.c_str()); file.AddLine(buffer); buffer.Printf("%s=%s", KEY_IRCDDB_PASSWORD4.c_str(), m_ircddbPassword4.c_str()); file.AddLine(buffer);
buffer.Printf(wxT("%s=%d"), KEY_APRS_ENABLED.c_str(), m_aprsEnabled ? 1 : 0); file.AddLine(buffer); buffer.Printf(wxT("%s=%d"), KEY_APRS_ENABLED.c_str(), m_aprsEnabled ? 1 : 0); file.AddLine(buffer);
buffer.Printf(wxT("%s=%s"), KEY_APRS_HOSTNAME.c_str(), m_aprsHostname.c_str()); file.AddLine(buffer); buffer.Printf(wxT("%s=%s"), KEY_APRS_ADDRESS.c_str(), m_aprsAddress.c_str()); file.AddLine(buffer);
buffer.Printf(wxT("%s=%u"), KEY_APRS_PORT.c_str(), m_aprsPort); file.AddLine(buffer); buffer.Printf(wxT("%s=%u"), KEY_APRS_PORT.c_str(), m_aprsPort); file.AddLine(buffer);
buffer.Printf(wxT("%s=%d"), KEY_DEXTRA_ENABLED.c_str(), m_dextraEnabled ? 1 : 0); file.AddLine(buffer); buffer.Printf(wxT("%s=%d"), KEY_DEXTRA_ENABLED.c_str(), m_dextraEnabled ? 1 : 0); file.AddLine(buffer);
buffer.Printf(wxT("%s=%u"), KEY_DEXTRA_MAXDONGLES.c_str(), m_dextraMaxDongles); file.AddLine(buffer); buffer.Printf(wxT("%s=%u"), KEY_DEXTRA_MAXDONGLES.c_str(), m_dextraMaxDongles); file.AddLine(buffer);
@ -2574,7 +2599,6 @@ bool CIRCDDBGatewayConfig::write()
buffer.Printf(wxT("%s=%d"), KEY_CCS_ENABLED.c_str(), m_ccsEnabled ? 1 : 0); file.AddLine(buffer); buffer.Printf(wxT("%s=%d"), KEY_CCS_ENABLED.c_str(), m_ccsEnabled ? 1 : 0); file.AddLine(buffer);
buffer.Printf(wxT("%s=%s"), KEY_CCS_HOST.c_str(), m_ccsHost.c_str()); file.AddLine(buffer); buffer.Printf(wxT("%s=%s"), KEY_CCS_HOST.c_str(), m_ccsHost.c_str()); file.AddLine(buffer);
buffer.Printf(wxT("%s=%d"), KEY_XLX_ENABLED.c_str(), m_xlxEnabled ? 1 : 0); file.AddLine(buffer); buffer.Printf(wxT("%s=%d"), KEY_XLX_ENABLED.c_str(), m_xlxEnabled ? 1 : 0); file.AddLine(buffer);
buffer.Printf(wxT("%s=%d"), KEY_XLX_OVERRIDE_LOCAL.c_str(), m_xlxOverrideLocal ? 1 : 0); file.AddLine(buffer);
buffer.Printf(wxT("%s=%s"), KEY_XLX_HOSTS_FILE_URL.c_str(), m_xlxHostsFileUrl.c_str()); file.AddLine(buffer); buffer.Printf(wxT("%s=%s"), KEY_XLX_HOSTS_FILE_URL.c_str(), m_xlxHostsFileUrl.c_str()); file.AddLine(buffer);
buffer.Printf(wxT("%s=%s"), KEY_STARNET_BAND1.c_str(), m_starNet1Band.c_str()); file.AddLine(buffer); buffer.Printf(wxT("%s=%s"), KEY_STARNET_BAND1.c_str(), m_starNet1Band.c_str()); file.AddLine(buffer);
buffer.Printf(wxT("%s=%s"), KEY_STARNET_CALLSIGN1.c_str(), m_starNet1Callsign.c_str()); file.AddLine(buffer); buffer.Printf(wxT("%s=%s"), KEY_STARNET_CALLSIGN1.c_str(), m_starNet1Callsign.c_str()); file.AddLine(buffer);
@ -2635,6 +2659,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_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_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_DTMF_ENABLED.c_str(), m_dtmfEnabled ? 1 : 0); file.AddLine(buffer);
buffer.Printf(wxT("%s=%d"), KEY_GPSD_ENABLED.c_str(), m_gpsdEnabled ? 1 : 0); file.AddLine(buffer);
buffer.Printf(wxT("%s=%s"), KEY_GPSD_ADDRESS.c_str(), m_gpsdAddress.c_str()); file.AddLine(buffer);
buffer.Printf(wxT("%s=%s"), KEY_GPSD_PORT.c_str(), m_gpsdPort.c_str()); 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_X.c_str(), m_x); file.AddLine(buffer);
buffer.Printf(wxT("%s=%d"), KEY_WINDOW_Y.c_str(), m_y); file.AddLine(buffer); buffer.Printf(wxT("%s=%d"), KEY_WINDOW_Y.c_str(), m_y); file.AddLine(buffer);
@ -2649,3 +2676,4 @@ bool CIRCDDBGatewayConfig::write()
return true; return true;
} }

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2010-2014 by Jonathan Naylor G4KLX * Copyright (C) 2010-2014,2018,2020 by Jonathan Naylor G4KLX
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -49,18 +49,18 @@ public:
void getRepeater4(wxString& callsign, wxString& band, HW_TYPE& type, wxString& address, unsigned int& port, unsigned char& band1, unsigned char& band2, unsigned char& band3, wxString& reflector, bool& atStartup, RECONNECT& reconnect, double& frequency, double& offset, double& range, double& latitude, double& longitude, double& agl, wxString& description1, wxString& description2, wxString& url) const; void getRepeater4(wxString& callsign, wxString& band, HW_TYPE& type, wxString& address, unsigned int& port, unsigned char& band1, unsigned char& band2, unsigned char& band3, wxString& reflector, bool& atStartup, RECONNECT& reconnect, double& frequency, double& offset, double& range, double& latitude, double& longitude, double& agl, wxString& description1, wxString& description2, wxString& url) const;
void setRepeater4(const wxString& band, HW_TYPE type, const wxString& address, unsigned int port, unsigned char band1, unsigned char band2, unsigned char band3, const wxString& reflector, bool atStartup, RECONNECT reconnect, double frequency, double offset, double range, double latitude, double longitude, double agl, const wxString& description1, const wxString& description2, const wxString& url); void setRepeater4(const wxString& band, HW_TYPE type, const wxString& address, unsigned int port, unsigned char band1, unsigned char band2, unsigned char band3, const wxString& reflector, bool atStartup, RECONNECT reconnect, double frequency, double offset, double range, double latitude, double longitude, double agl, const wxString& description1, const wxString& description2, const wxString& url);
void getIrcDDB(bool& enabled, wxString& hostname, wxString& username, wxString& password) const; void getIrcDDB1(bool& enabled, wxString& hostname, wxString& username, wxString& password) const;
void getIrcDDB2(bool& enabled, wxString& hostname, wxString& username, wxString& password) const; void getIrcDDB2(bool& enabled, wxString& hostname, wxString& username, wxString& password) const;
void getIrcDDB3(bool& enabled, wxString& hostname, wxString& username, wxString& password) const; void getIrcDDB3(bool& enabled, wxString& hostname, wxString& username, wxString& password) const;
void getIrcDDB4(bool& enabled, wxString& hostname, wxString& username, wxString& password) const; void getIrcDDB4(bool& enabled, wxString& hostname, wxString& username, wxString& password) const;
void setIrcDDB(bool enabled, const wxString& hostname, const wxString& username, const wxString& password); void setIrcDDB1(bool enabled, const wxString& hostname, const wxString& username, const wxString& password);
void setIrcDDB2(bool enabled, const wxString& hostname, const wxString& username, const wxString& password); void setIrcDDB2(bool enabled, const wxString& hostname, const wxString& username, const wxString& password);
void setIrcDDB3(bool enabled, const wxString& hostname, const wxString& username, const wxString& password); void setIrcDDB3(bool enabled, const wxString& hostname, const wxString& username, const wxString& password);
void setIrcDDB4(bool enabled, const wxString& hostname, const wxString& username, const wxString& password); void setIrcDDB4(bool enabled, const wxString& hostname, const wxString& username, const wxString& password);
void getDPRS(bool& enabled, wxString& hostname, unsigned int& port) const; void getDPRS(bool& enabled, wxString& address, unsigned int& port) const;
void setDPRS(bool enabled, const wxString& hostname, unsigned int port); void setDPRS(bool enabled, const wxString& address, unsigned int port);
void getDExtra(bool& enabled, unsigned int& maxDongles) const; void getDExtra(bool& enabled, unsigned int& maxDongles) const;
void setDExtra(bool enabled, unsigned int maxDongles); void setDExtra(bool enabled, unsigned int maxDongles);
@ -71,8 +71,8 @@ public:
void getDCS(bool& dcsEnabled, bool& ccsEnabled, wxString& ccsHost) const; void getDCS(bool& dcsEnabled, bool& ccsEnabled, wxString& ccsHost) const;
void setDCS(bool dcsEnabled, bool ccsEnabled, const wxString& ccsHost); void setDCS(bool dcsEnabled, bool ccsEnabled, const wxString& ccsHost);
void getXLX(bool& xlxEnabled, bool& xlxOverrideLocal, wxString& xlxHostsFileUrl); void getXLX(bool& xlxEnabled, wxString& xlxHostsFileUrl);
void setXLX(bool xlxEnabled, bool xlxOverrideLocal, wxString xlxHostsFileUrl); void setXLX(bool xlxEnabled, wxString xlxHostsFileUrl);
#if defined(DEXTRA_LINK) || defined(DCS_LINK) #if defined(DEXTRA_LINK) || defined(DCS_LINK)
void getStarNet1(wxString& band, wxString& callsign, wxString& logoff, wxString& info, wxString& permanent, unsigned int& userTimeout, unsigned int& groupTimeout, STARNET_CALLSIGN_SWITCH& callsignSwitch, bool& txMsgSwitch, wxString& reflector) const; void getStarNet1(wxString& band, wxString& callsign, wxString& logoff, wxString& info, wxString& permanent, unsigned int& userTimeout, unsigned int& groupTimeout, STARNET_CALLSIGN_SWITCH& callsignSwitch, bool& txMsgSwitch, wxString& reflector) const;
@ -112,6 +112,9 @@ public:
void getMiscellaneous(TEXT_LANG& language, bool& infoEnabled, bool& echoEnabled, bool& logEnabled, bool& dratsEnabled, bool& dtmfEnabled) const; 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 setMiscellaneous(TEXT_LANG language, bool infoEnabled, bool echoEnabled, bool logEnabled, bool dratsEnabled, bool dtmfEnabled);
void getGPSD(bool& enabled, wxString& address, wxString& port) const;
void setGPSD(bool enabled, const wxString& address, const wxString& port);
void getPosition(int& x, int& y) const; void getPosition(int& x, int& y) const;
void setPosition(int x, int y); void setPosition(int x, int y);
@ -215,10 +218,10 @@ private:
unsigned char m_repeater4Band1; unsigned char m_repeater4Band1;
unsigned char m_repeater4Band2; unsigned char m_repeater4Band2;
unsigned char m_repeater4Band3; unsigned char m_repeater4Band3;
bool m_ircddbEnabled; bool m_ircddbEnabled1;
wxString m_ircddbHostname; wxString m_ircddbHostname1;
wxString m_ircddbUsername; wxString m_ircddbUsername1;
wxString m_ircddbPassword; wxString m_ircddbPassword1;
bool m_ircddbEnabled2; bool m_ircddbEnabled2;
wxString m_ircddbHostname2; wxString m_ircddbHostname2;
wxString m_ircddbUsername2; wxString m_ircddbUsername2;
@ -232,7 +235,7 @@ private:
wxString m_ircddbUsername4; wxString m_ircddbUsername4;
wxString m_ircddbPassword4; wxString m_ircddbPassword4;
bool m_aprsEnabled; bool m_aprsEnabled;
wxString m_aprsHostname; wxString m_aprsAddress;
unsigned int m_aprsPort; unsigned int m_aprsPort;
bool m_dextraEnabled; bool m_dextraEnabled;
unsigned int m_dextraMaxDongles; unsigned int m_dextraMaxDongles;
@ -304,6 +307,9 @@ private:
bool m_logEnabled; bool m_logEnabled;
bool m_dratsEnabled; bool m_dratsEnabled;
bool m_dtmfEnabled; bool m_dtmfEnabled;
bool m_gpsdEnabled;
wxString m_gpsdAddress;
wxString m_gpsdPort;
int m_x; int m_x;
int m_y; int m_y;
}; };

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2002,2003,2009,2011,2012,2018 by Jonathan Naylor G4KLX * Copyright (C) 2002,2003,2009,2011,2012,2019 by Jonathan Naylor G4KLX
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -19,20 +19,17 @@
#include "Logger.h" #include "Logger.h"
CLogger::CLogger(const wxString& directory, const wxString& name) : CLogger::CLogger(const wxString& directory, const wxString& name) :
#if(defined(__WINDOWS__))
m_day(0),
#endif
wxLog(), wxLog(),
m_name(name), m_name(name),
m_file(NULL), m_file(NULL),
m_fileName() m_fileName(),
m_day(0)
{ {
m_file = new wxFFile; m_file = new wxFFile;
m_fileName.SetPath(directory); m_fileName.SetPath(directory);
m_fileName.SetExt(wxT("log")); m_fileName.SetExt(wxT("log"));
#if(defined(__WINDOWS__))
time_t timestamp; time_t timestamp;
::time(&timestamp); ::time(&timestamp);
struct tm* tm = ::gmtime(&timestamp); struct tm* tm = ::gmtime(&timestamp);
@ -42,9 +39,6 @@ m_fileName()
m_day = tm->tm_yday; m_day = tm->tm_yday;
m_fileName.SetName(text); m_fileName.SetName(text);
#else
m_fileName.SetName(m_name);
#endif
bool ret = m_file->Open(m_fileName.GetFullPath(), wxT("a+t")); bool ret = m_file->Open(m_fileName.GetFullPath(), wxT("a+t"));
if (!ret) { if (!ret) {
@ -85,18 +79,18 @@ void CLogger::DoLogRecord(wxLogLevel level, const wxString& msg, const wxLogReco
wxString message; wxString message;
message.Printf(wxT("%s: %04d-%02d-%02d %02d:%02d:%02d: %s\n"), letter.c_str(), tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, msg.c_str()); message.Printf(wxT("%s: %04d-%02d-%02d %02d:%02d:%02d: %s\n"), letter.c_str(), tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, msg.c_str());
logString(message, info.timestamp); writeLog(message.c_str(), info.timestamp);
if (level == wxLOG_FatalError) if (level == wxLOG_FatalError)
::abort(); ::abort();
} }
void CLogger::logString(const wxString& msg, time_t timestamp) void CLogger::writeLog(const wxChar* msg, time_t timestamp)
{ {
wxASSERT(m_file != NULL); wxASSERT(m_file != NULL);
wxASSERT(m_file->IsOpened()); wxASSERT(m_file->IsOpened());
wxASSERT(msg != NULL);
#if(defined(__WINDOWS__))
struct tm* tm = ::gmtime(&timestamp); struct tm* tm = ::gmtime(&timestamp);
int day = tm->tm_yday; int day = tm->tm_yday;
@ -115,8 +109,8 @@ void CLogger::logString(const wxString& msg, time_t timestamp)
return; return;
} }
} }
#endif
m_file->Write(msg); m_file->Write(wxString(msg));
m_file->Flush(); m_file->Flush();
} }

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2002,2003,2009,2011,2012,2018 by Jonathan Naylor G4KLX * Copyright (C) 2002,2003,2009,2011,2012,2019 by Jonathan Naylor G4KLX
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -22,7 +22,6 @@
#include <wx/wx.h> #include <wx/wx.h>
#include <wx/ffile.h> #include <wx/ffile.h>
#include <wx/filename.h> #include <wx/filename.h>
#include <wx/log.h>
class CLogger : public wxLog { class CLogger : public wxLog {
public: public:
@ -35,11 +34,10 @@ private:
wxString m_name; wxString m_name;
wxFFile* m_file; wxFFile* m_file;
wxFileName m_fileName; wxFileName m_fileName;
#if(defined(__WINDOWS__))
int m_day; int m_day;
#endif
void logString(const wxString& msg, time_t timestamp); void writeLog(const wxChar* msg, time_t timestamp);
}; };
#endif #endif

View file

@ -1,22 +1,28 @@
OBJECTS = AMBEData.o AnnouncementUnit.o APRSCollector.o APRSWriter.o APRSWriterThread.o AudioUnit.o CacheManager.o CallsignList.o \ OBJECTS = AMBEData.o AnnouncementUnit.o APRSCollector.o APRSWriter.o AudioUnit.o CacheManager.o CallsignList.o \
CallsignServer.o CCITTChecksum.o CCSData.o CCSHandler.o CCSProtocolHandler.o ConnectData.o DCSHandler.o DCSProtocolHandler.o \ CallsignServer.o CCITTChecksum.o CCSData.o CCSHandler.o CCSProtocolHandler.o ConnectData.o ConsoleLogger.o DCSHandler.o DCSProtocolHandler.o \
DCSProtocolHandlerPool.o DDData.o DDHandler.o DExtraHandler.o DExtraProtocolHandler.o DExtraProtocolHandlerPool.o \ DCSProtocolHandlerPool.o DDData.o DDHandler.o DExtraHandler.o DExtraProtocolHandler.o DExtraProtocolHandlerPool.o \
DPlusAuthenticator.o DPlusHandler.o DPlusProtocolHandler.o DPlusProtocolHandlerPool.o DRATSServer.o DTMF.o \ DPlusAuthenticator.o DPlusHandler.o DPlusProtocolHandler.o DPlusProtocolHandlerPool.o DRATSServer.o DTMF.o \
DummyRepeaterProtocolHandler.o DVTOOLFileReader.o EchoUnit.o G2Handler.o G2ProtocolHandler.o GatewayCache.o \ DummyRepeaterProtocolHandler.o DVTOOLFileReader.o EchoUnit.o G2Handler.o G2ProtocolHandler.o GatewayCache.o \
HBRepeaterProtocolHandler.o HeaderData.o HeaderLogger.o HeardData.o HostFile.o IcomRepeaterProtocolHandler.o IRCDDBGatewayConfig.o \ HBRepeaterProtocolHandler.o HeaderData.o HeaderLogger.o HeardData.o HostFile.o IcomRepeaterProtocolHandler.o IRCDDBGatewayConfig.o \
LogEvent.o Logger.o PollData.o RemoteHandler.o RemoteLinkData.o RemoteProtocolHandler.o RemoteRepeaterData.o RemoteStarNetGroup.o \ LogEvent.o Logger.o NatTraversalHandler.o PollData.o RemoteHandler.o RemoteLinkData.o RemoteProtocolHandler.o RemoteRepeaterData.o RemoteStarNetGroup.o \
RemoteStarNetUser.o RepeaterCache.o RepeaterHandler.o SHA256.o SlowDataEncoder.o StarNetHandler.o StatusData.o \ RemoteStarNetUser.o RepeaterCache.o RepeaterHandler.o SHA256.o SlowDataEncoder.o StarNetHandler.o StatusData.o \
TCPReaderWriterClient.o TCPReaderWriterServer.o TextCollector.o TextData.o Timer.o UDPReaderWriter.o UserCache.o Utils.o \ TCPReaderWriterClient.o TCPReaderWriterServer.o TextCollector.o TextData.o Timer.o UDPReaderWriter.o UserCache.o Utils.o \
VersionUnit.o XLXHostsFileDownloader.o VersionUnit.o XLXHostsFileDownloader.o
.PHONY: all
all: Common.a all: Common.a
Common.a: $(OBJECTS) Common.a: $(OBJECTS) ../ircDDB/IRCDDB.a
$(AR) rcs Common.a $(OBJECTS) $(AR) rcs Common.a $(OBJECTS)
-include $(OBJECTS:.o=.d)
%.o: %.cpp %.o: %.cpp
$(CXX) -DwxUSE_GUI=0 $(CFLAGS) -I../ircDDB -c -o $@ $< $(CXX) -DwxUSE_GUI=0 $(CFLAGS) -I../ircDDB -c -o $@ $<
$(CXX) -MM -DwxUSE_GUI=0 $(CFLAGS) -I../ircDDB $< > $*.d
.PHONY: clean
clean: clean:
$(RM) Common.a *.o *.d *.bak *~ $(RM) Common.a *.o *.d *.bak *~
../ircDDB/IRCDDB.a:

View file

@ -0,0 +1,61 @@
/*
* Copyright (C) 2010,2011,2012,2013,2014,2015,2016,2017,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.
*/
#if defined(ENABLE_NAT_TRAVERSAL)
#include "NatTraversalHandler.h"
const unsigned int CACHE_SIZE = 500U;
CNatTraversalHandler::CNatTraversalHandler() :
m_g2cache(CACHE_SIZE),
m_g2Handler(NULL)
{
}
CNatTraversalHandler::~CNatTraversalHandler()
{
for (CNatTraversalCache_t::iterator it = m_g2cache.begin(); it != m_g2cache.end(); ++it)
delete it->second;
}
void CNatTraversalHandler::setG2Handler(CG2ProtocolHandler * handler)
{
m_g2Handler = handler;
}
void CNatTraversalHandler::traverseNatG2(const wxString& address)
{
if(m_g2Handler != NULL){
CNatTraversalRecord* record = m_g2cache[address];
if(record == NULL) {
record = new CNatTraversalRecord(address);
m_g2cache[address] = record;
}
std::time_t currentTime = std::time(NULL);
if(currentTime - record->getTimestamp() > G2_TRAVERSAL_TIMEOUT) {
record->setTimestamp(currentTime);
m_g2Handler->traverseNat(address);
}
}
}
#endif

View file

@ -0,0 +1,80 @@
/*
* Copyright (C) 2010,2011,2012,2013,2014,2015,2016,2017,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.
*/
#if defined(ENABLE_NAT_TRAVERSAL)
#ifndef NatTraversalHandler_H
#define NatTraversalHandler_H
#define G2_TRAVERSAL_TIMEOUT 29 //seconds
#include "G2ProtocolHandler.h"
#include <wx/wx.h>
#include <ctime>
enum NAT_TRAVERSAL_TYPE {
NTT_G2,
//NTT_DEXTRA
//NTT_DCS
//NTT_DPLUS
};
class CNatTraversalRecord {
public:
CNatTraversalRecord(const wxString& address) :
m_address(address),
m_timestamp(0)
{
}
std::time_t getTimestamp() const
{
return m_timestamp;
}
void setTimestamp(std::time_t timestamp)
{
m_timestamp = timestamp;
}
private:
wxString m_address;
std::time_t m_timestamp;
};
WX_DECLARE_STRING_HASH_MAP(CNatTraversalRecord*, CNatTraversalCache_t);
/*
* This keeps track of when we UDP punched to one destination so to avoid unnecessary traffic on each ircddb reporting
*/
class CNatTraversalHandler {
public:
CNatTraversalHandler();
~CNatTraversalHandler();
void setG2Handler(CG2ProtocolHandler* handler);
void traverseNatG2(const wxString& address);
private:
CNatTraversalCache_t m_g2cache;
CG2ProtocolHandler* m_g2Handler;
};
#endif
#endif

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2010-2015 by Jonathan Naylor G4KLX * Copyright (C) 2010-2015,2018,2019 by Jonathan Naylor G4KLX
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -95,6 +95,7 @@ m_flag1(0x00U),
m_flag2(0x00U), m_flag2(0x00U),
m_flag3(0x00U), m_flag3(0x00U),
m_restricted(false), m_restricted(false),
m_fastData(false),
m_frames(0U), m_frames(0U),
m_silence(0U), m_silence(0U),
m_errors(0U), m_errors(0U),
@ -582,6 +583,9 @@ void CRepeaterHandler::processRepeater(CHeaderData& header)
m_silence = 0U; m_silence = 0U;
m_errors = 0U; m_errors = 0U;
// Assume voice mode
m_fastData = false;
// An RF header resets the reconnect timer // An RF header resets the reconnect timer
m_linkReconnectTimer.start(); m_linkReconnectTimer.start();
@ -594,7 +598,7 @@ void CRepeaterHandler::processRepeater(CHeaderData& header)
// Reset the APRS Writer if it's enabled // Reset the APRS Writer if it's enabled
if (m_aprsWriter != NULL) if (m_aprsWriter != NULL)
m_aprsWriter->reset(m_rptCallsign); m_aprsWriter->writeHeader(m_rptCallsign, header);
// Write to Header.log if it's enabled // Write to Header.log if it's enabled
if (m_headerLogger != NULL) if (m_headerLogger != NULL)
@ -736,6 +740,15 @@ void CRepeaterHandler::processRepeater(CAMBEData& data)
unsigned char buffer[DV_FRAME_MAX_LENGTH_BYTES]; unsigned char buffer[DV_FRAME_MAX_LENGTH_BYTES];
data.getData(buffer, DV_FRAME_MAX_LENGTH_BYTES); data.getData(buffer, DV_FRAME_MAX_LENGTH_BYTES);
// Check for the fast data signature
if (!m_fastData) {
unsigned char slowDataType = (buffer[VOICE_FRAME_LENGTH_BYTES] ^ SCRAMBLER_BYTE1) & SLOW_DATA_TYPE_MASK;
if (slowDataType == SLOW_DATA_TYPE_FAST_DATA1 || slowDataType == SLOW_DATA_TYPE_FAST_DATA2)
m_fastData = true;
}
// Don't do AMBE processing when in Fast Data mode
if (!m_fastData) {
if (::memcmp(buffer, NULL_AMBE_DATA_BYTES, VOICE_FRAME_LENGTH_BYTES) == 0) if (::memcmp(buffer, NULL_AMBE_DATA_BYTES, VOICE_FRAME_LENGTH_BYTES) == 0)
m_silence++; m_silence++;
@ -766,6 +779,7 @@ void CRepeaterHandler::processRepeater(CAMBEData& data)
} }
} }
} }
}
// Incoming links get everything // Incoming links get everything
sendToIncoming(data); sendToIncoming(data);

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2010-2015 by Jonathan Naylor G4KLX * Copyright (C) 2010-2015,2018 by Jonathan Naylor G4KLX
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -208,6 +208,7 @@ private:
unsigned char m_flag2; unsigned char m_flag2;
unsigned char m_flag3; unsigned char m_flag3;
bool m_restricted; bool m_restricted;
bool m_fastData;
// Statistics // Statistics
unsigned int m_frames; unsigned int m_frames;

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2006-2014 by Jonathan Naylor G4KLX * Copyright (C) 2006-2014,2018 by Jonathan Naylor G4KLX
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -37,6 +37,34 @@ m_fd(-1)
#endif #endif
} }
CUDPReaderWriter::CUDPReaderWriter(unsigned int port) :
m_address(),
m_port(port),
m_addr(),
m_fd(-1)
{
#if defined(__WINDOWS__)
WSAData data;
int wsaRet = ::WSAStartup(MAKEWORD(2, 2), &data);
if (wsaRet != 0)
wxLogError(wxT("Error from WSAStartup"));
#endif
}
CUDPReaderWriter::CUDPReaderWriter() :
m_address(),
m_port(0U),
m_addr(),
m_fd(-1)
{
#if defined(__WINDOWS__)
WSAData data;
int wsaRet = ::WSAStartup(MAKEWORD(2, 2), &data);
if (wsaRet != 0)
wxLogError(wxT("Error from WSAStartup"));
#endif
}
CUDPReaderWriter::~CUDPReaderWriter() CUDPReaderWriter::~CUDPReaderWriter()
{ {
#if defined(__WINDOWS__) #if defined(__WINDOWS__)

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2009-2011,2013 by Jonathan Naylor G4KLX * Copyright (C) 2009-2011,2013,2018 by Jonathan Naylor G4KLX
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -35,6 +35,8 @@
class CUDPReaderWriter { class CUDPReaderWriter {
public: public:
CUDPReaderWriter(const wxString& address, unsigned int port); CUDPReaderWriter(const wxString& address, unsigned int port);
CUDPReaderWriter(unsigned int port);
CUDPReaderWriter();
~CUDPReaderWriter(); ~CUDPReaderWriter();
static in_addr lookup(const wxString& hostName); static in_addr lookup(const wxString& hostName);

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2010-2015,2018 by Jonathan Naylor G4KLX * Copyright (C) 2010-2015,2018,2019,2020 by Jonathan Naylor G4KLX
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -24,9 +24,9 @@
const wxString VENDOR_NAME = wxT("G4KLX"); const wxString VENDOR_NAME = wxT("G4KLX");
#if defined(__WXDEBUG__) #if defined(__WXDEBUG__)
const wxString VERSION = wxT("20180509 - DEBUG"); const wxString VERSION = wxT("20200621 - DEBUG");
#else #else
const wxString VERSION = wxT("20180509"); const wxString VERSION = wxT("20190621");
#endif #endif
#endif #endif

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2010-2013,2015 by Jonathan Naylor G4KLX * Copyright (C) 2010-2013,2015,2018 by Jonathan Naylor G4KLX
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -28,6 +28,8 @@
wxString CXLXHostsFileDownloader::Download(const wxString & xlxHostsFileURL) wxString CXLXHostsFileDownloader::Download(const wxString & xlxHostsFileURL)
{ {
#ifdef XLX_USE_WGET #ifdef XLX_USE_WGET
wxLogMessage(_T("Downloading XLX reflector list from %s"), xlxHostsFileURL.c_str());
wxString xlxHostsFileName = wxFileName::CreateTempFileName(_T("XLX_Hosts_")); wxString xlxHostsFileName = wxFileName::CreateTempFileName(_T("XLX_Hosts_"));
wxString commandLine = _T("wget -q -O ") + xlxHostsFileName + _T(" ") + xlxHostsFileURL; wxString commandLine = _T("wget -q -O ") + xlxHostsFileName + _T(" ") + xlxHostsFileURL;
bool execResult = wxShell(commandLine); bool execResult = wxShell(commandLine);
@ -64,8 +66,8 @@ wxString CXLXHostsFileDownloader::Download(const wxString & xlxHostsFileURL)
return wxEmptyString; return wxEmptyString;
} }
wxInputStream* in = NULL; wxInputStream* in = http.GetInputStream(path);
if((in = http.GetInputStream(path)) && in->IsOk()) { if(in != NULL && in->IsOk()) {
wxFile file; wxFile file;
wxString xlxHostsFileName = wxFileName::CreateTempFileName(_T("XLX_Hosts_"), &file); wxString xlxHostsFileName = wxFileName::CreateTempFileName(_T("XLX_Hosts_"), &file);
wxLogMessage(_T("Created temporary file %s"), xlxHostsFileName); wxLogMessage(_T("Created temporary file %s"), xlxHostsFileName);

View file

@ -19,9 +19,13 @@
#ifndef XLXHostsFileDownloader_H #ifndef XLXHostsFileDownloader_H
#define XLXHostsFileDownloader_H #define XLXHostsFileDownloader_H
#define XLX_USE_WGET
#include <wx/wx.h> #include <wx/wx.h>
#if !defined (__WINDOWS__)
#define XLX_USE_WGET //for some reason libwx is missing the net stuff on some distros, therefore always use wget if we are not compiling under windows
#endif
class CXLXHostsFileDownloader { class CXLXHostsFileDownloader {
public: public:
static wxString Download(const wxString & xlxHostsFileURL); static wxString Download(const wxString & xlxHostsFileURL);

View file

@ -1,15 +1,19 @@
DCS000 206.208.56.92 # Prepared at ar-dns.net - Sun, 19 May 2019 12:38:05 GMT
DCS000 23.111.174.198
DCS001 dcs001.xreflector.net DCS001 dcs001.xreflector.net
DCS002 dcs002.xreflector.net DCS002 dcs002.xreflector.net
DCS003 dcs003.xreflector.net DCS003 dcs003.xreflector.net
DCS004 dcs004.xreflector.net DCS004 dcs004.xreflector.net
DCS005 www.bm-dmr.uk DCS005 dcs.bm-dmr.uk
DCS006 dcs006.xreflector.net DCS006 dcs006.xreflector.net
DCS006 146.168.196.187
DCS007 dcs007.xreflector.net DCS007 dcs007.xreflector.net
DCS008 dcs008.xreflector.net DCS008 dcs008.xreflector.net
DCS009 dcs009.xreflector.net DCS009 dcs009.xreflector.net
DCS010 85.197.129.86
DCS010 dcs010.xreflector.net DCS010 dcs010.xreflector.net
DCS011 dcs011.xreflector.net DCS011 dcs011.xreflector.net
DCS012 194.38.140.205
DCS012 dcs012.xreflector.net DCS012 dcs012.xreflector.net
DCS013 dcs013.xreflector.net DCS013 dcs013.xreflector.net
DCS014 dcs014.xreflector.net DCS014 dcs014.xreflector.net
@ -18,6 +22,7 @@ DCS016 dcs016.xreflector.net
DCS017 dcs017.xreflector.net DCS017 dcs017.xreflector.net
DCS018 dcs018.xreflector.net DCS018 dcs018.xreflector.net
DCS019 dcs019.xreflector.net DCS019 dcs019.xreflector.net
DCS020 3.208.40.45
DCS021 dcs021.xreflector.net DCS021 dcs021.xreflector.net
DCS022 dcs022.xreflector.net DCS022 dcs022.xreflector.net
DCS023 dcs023.xreflector.net DCS023 dcs023.xreflector.net
@ -25,220 +30,438 @@ DCS024 dcs024.xreflector.net
DCS025 dcs025.xreflector.net DCS025 dcs025.xreflector.net
DCS026 dcs026.xreflector.net DCS026 dcs026.xreflector.net
DCS027 dcs027.xreflector.net DCS027 dcs027.xreflector.net
DCS028 xlx028.org L DCS028 xlx028.org
DCS029 dcs029.xreflector.net DCS029 dcs029.xreflector.net
DCS030 194.59.177.44
DCS032 dcs032.xreflector.net DCS032 dcs032.xreflector.net
DCS033 dcs033.xreflector.net DCS033 dcs033.xreflector.net
DCS035 45.79.94.184 DCS035 45.79.94.184
DCS039 185.203.118.66 DCS036 151.12.36.112
DCS038 5.249.151.111
DCS039 31.14.142.119
DCS040 109.71.45.29 DCS040 109.71.45.29
DCS041 45.62.226.137 DCS041 45.62.226.137
DCS044 dcs044.xreflector.net DCS044 dcs044.xreflector.net
DCS045 64.137.172.60 DCS045 64.137.172.60
DCS046 176.10.140.161 DCS046 176.10.140.161
DCS047 121.94.218.243 DCS047 202.171.147.58
DCS050 212.237.17.133 DCS049 212.71.234.224
DCS050 80.211.155.206
DCS051 93.186.254.219 DCS051 93.186.254.219
DCS052 60.47.177.125 DCS052 121.116.69.175
DCS053 5.133.99.12
DCS054 52.86.180.251 DCS054 52.86.180.251
DCS055 52.80.4.154 DCS055 52.80.4.154
DCS057 74.193.209.20 DCS057 74.193.217.15
DCS058 118.236.151.192 DCS058 150.66.16.176
DCS059 18.219.32.21
DCS060 212.237.36.181 DCS060 212.237.36.181
DCS061 68.115.205.110 DCS061 208.71.169.83
DCS062 70.88.145.163 DCS062 72.17.20.173
DCS064 202.241.175.133 DCS064 122.222.1.50
DCS066 79.16.44.125 DCS066 79.55.195.190
DCS067 95.60.130.176
DCS068 92.222.145.202 DCS068 92.222.145.202
DCS069 89.36.214.120 DCS069 89.36.214.120
DCS071 211.60.41.185 DCS071 211.60.41.185
DCS072 211.60.41.186 DCS072 75.60.237.17
DCS073 114.224.6.211
DCS074 212.237.211.82
DCS075 5.135.162.136 DCS075 5.135.162.136
DCS076 203.137.116.117 DCS076 203.137.116.117
DCS077 5.249.151.111 DCS077 216.21.9.156
DCS078 109.10.128.221 DCS078 109.15.57.11
DCS079 121.162.91.94 DCS079 121.162.91.31
DCS080 121.85.180.61 DCS080 121.81.128.207
DCS081 121.84.13.151 DCS081 121.82.151.243
DCS082 108.21.232.21 DCS082 110.232.113.108
DCS083 108.21.232.22 DCS083 185.205.210.217
DCS085 27.92.11.123 DCS084 45.79.93.167
DCS086 220.133.89.28 DCS085 113.150.26.8
DCS086 52.80.139.252
DCS087 44.137.36.209 DCS087 44.137.36.209
DCS088 194.109.192.235 DCS088 194.109.192.235
DCS089 194.109.192.236 DCS089 194.109.192.236
DCS090 91.92.136.252 DCS090 91.92.136.252
DCS092 94.177.190.50 DCS092 104.200.25.53
DCS093 98.29.99.252 DCS093 185.177.59.221
DCS095 58.1.93.223 DCS095 203.137.76.53
DCS098 111.168.216.126 DCS097 80.211.154.173
DCS099 212.237.59.103 DCS098 203.136.233.165
DCS100 96.94.7.196 DCS099 80.211.27.75
DCS101 104.233.105.86 DCS100 45.62.234.223
DCS102 206.208.56.13 DCS101 64.137.236.164
DCS103 64.137.248.42 DCS102 23.111.174.196
DCS104 206.208.56.93 DCS103 64.137.224.126
DCS111 81.95.126.168 DCS104 23.111.174.197
DCS112 216.45.55.151 DCS105 51.254.99.78
DCS114 91.121.136.94 DCS109 115.179.53.132
DCS110 150.7.164.10
DCS111 61.195.96.160
DCS112 94.177.235.81
DCS113 151.12.36.103
DCS114 5.135.188.16
DCS115 217.182.128.3 DCS115 217.182.128.3
DCS116 31.185.101.211 DCS116 31.185.101.211
DCS118 5.249.148.252 DCS118 5.249.148.252
DCS119 125.129.207.86 DCS119 125.129.207.86
DCS120 24.43.83.140 DCS120 81.150.10.63
DCS121 174.37.249.156 DCS121 174.37.249.156
DCS122 83.137.45.126
DCS124 211.14.169.234 DCS124 211.14.169.234
DCS125 213.181.208.52 DCS125 213.181.208.52
DCS127 190.112.228.107 DCS127 190.112.228.107
DCS128 153.249.96.5 DCS128 153.248.144.11
DCS129 111.64.166.200
DCS130 194.59.177.45
DCS131 80.127.118.226
DCS132 91.203.55.87
DCS134 159.89.176.86
DCS135 74.208.214.69
DCS140 95.211.211.145
DCS142 44.168.48.8
DCS145 178.59.23.138 DCS145 178.59.23.138
DCS146 87.228.241.43 DCS146 213.7.197.202
DCS147 46.41.1.127 DCS147 46.41.1.127
DCS150 212.237.3.87 DCS150 80.211.10.212
DCS153 210.189.104.236
DCS155 18.235.96.93
DCS158 150.66.16.176
DCS160 61.195.109.179
DCS170 210.178.113.173 DCS170 210.178.113.173
DCS171 121.162.91.45 DCS171 210.178.113.123
DCS185 118.152.21.76 DCS175 162.248.92.25
DCS204 185.85.18.162 DCS180 192.241.240.7
DCS185 89.106.108.151
DCS190 190.194.12.53
DCS199 153.126.179.214
DCS200 185.203.119.158
DCS202 148.251.122.251
DCS204 85.214.126.111
DCS206 193.190.240.227 DCS206 193.190.240.227
DCS208 151.80.155.39 DCS208 151.80.155.39
DCS210 45.62.210.243 DCS210 64.137.224.107
DCS212 52.38.90.188 DCS212 52.38.90.188
DCS214 185.47.129.230 DCS214 185.47.129.230
DCS215 185.87.96.172
DCS216 74.214.25.135 DCS216 74.214.25.135
DCS222 93.189.136.50 DCS220 124.41.83.11
DCS227 86.122.173.9 DCS222 212.43.96.84
DCS228 212.237.33.114 DCS224 203.137.99.97
DCS226 2.226.183.226
DCS227 89.33.44.100
DCS228 85.6.171.146
DCS229 194.191.4.54
DCS230 80.250.3.114 DCS230 80.250.3.114
DCS232 213.47.219.169 DCS232 89.185.97.35
DCS235 5.150.254.97
DCS238 172.104.239.219
DCS241 151.80.158.227 DCS241 151.80.158.227
DCS242 73.14.84.43 DCS242 73.14.84.43
DCS246 172.93.48.159 DCS246 172.93.48.159
DCS248 158.69.206.45 DCS255 142.91.158.199
DCS252 118.21.66.186 DCS257 47.157.82.87
DCS255 245.115.35.52 DCS258 75.60.237.19
DCS261 44.144.0.23 DCS261 44.144.0.23
DCS262 44.144.0.24 DCS262 87.139.70.67
DCS263 85.214.193.146
DCS264 52.2.131.118 DCS264 52.2.131.118
DCS265 51.255.43.60 DCS265 212.237.51.82
DCS266 212.237.51.82
DCS268 194.38.140.204
DCS270 158.64.26.132 DCS270 158.64.26.132
DCS291 60.112.168.104 DCS272 177.194.25.234
DCS295 45.62.238.78 DCS274 75.115.207.48
DCS298 133.208.206.141 DCS280 87.19.134.242
DCS299 125.236.227.43 DCS282 210.188.25.17
DCS300 64.137.172.56 DCS284 95.158.165.32
DCS285 91.92.93.15
DCS287 43.245.172.2
DCS288 121.75.75.200
DCS290 44.182.7.20
DCS291 101.143.242.189
DCS295 45.62.224.93
DCS298 122.131.152.80
DCS299 203.86.194.92
DCS300 45.62.247.43
DCS302 144.217.241.23 DCS302 144.217.241.23
DCS307 104.36.40.243 DCS303 75.70.52.143
DCS310 64.137.165.141 DCS305 145.239.116.57
DCS311 78.47.206.12 DCS307 72.21.76.154
DCS313 xlx313.openstd.net DCS310 52.11.207.121
DCS311 46.41.0.214
DCS312 192.241.160.183
DCS313 34.213.108.164
DCS315 65.101.7.50
DCS317 44.48.8.15 DCS317 44.48.8.15
DCS321 31.207.110.231 DCS321 31.207.110.45
DCS328 212.237.33.114
DCS329 114.181.139.32
DCS330 18.222.199.205
DCS332 188.213.168.99
DCS333 194.116.29.73 DCS333 194.116.29.73
DCS334 199.119.98.174 DCS334 96.47.95.121
DCS335 185.206.145.2
DCS336 23.226.233.133 DCS336 23.226.233.133
DCS338 122.116.216.47
DCS339 198.98.53.247 DCS339 198.98.53.247
DCS357 52.39.82.54 DCS345 45.62.237.34
DCS359 79.232.250.96 DCS352 35.230.162.146
DCS357 93.152.167.4
DCS358 93.152.167.4
DCS359 94.156.172.213
DCS360 222.229.25.105
DCS364 159.65.231.53
DCS365 59.139.141.204 DCS365 59.139.141.204
DCS367 xrf367.ad6dm.net
DCS367 18.216.66.72
DCS370 188.213.168.24 DCS370 188.213.168.24
DCS373 101.143.24.88 DCS371 212.237.8.77
DCS382 61.116.7.187 DCS373 119.229.134.1
DCS389 106.71.106.79 DCS374 61.195.108.146
DCS390 31.14.140.230 DCS376 75.145.119.225
DCS377 186.159.96.100
DCS379 104.218.36.162
DCS380 160.16.65.39
DCS382 211.131.3.119
DCS388 138.197.67.52
DCS389 106.71.212.36
DCS389 xlxdmr.duckdns.org
DCS390 149.7.214.253
DCS393 139.91.200.186
DCS395 5.249.151.111
DCS398 45.62.243.153 DCS398 45.62.243.153
DCS399 185.227.110.247
DCS400 13.58.192.185
DCS404 91.229.143.187 DCS404 91.229.143.187
DCS412 42.151.104.175 DCS410 166.78.145.146
DCS411 82.171.119.45
DCS412 61.195.107.113
DCS420 174.138.113.116
DCS421 118.189.181.236
DCS431 61.195.98.225
DCS433 217.160.22.17 DCS433 217.160.22.17
DCS440 114.176.44.90 DCS434 51.254.128.134
DCS438 80.211.189.236
DCS440 153.176.140.229
DCS441 203.137.99.110 DCS441 203.137.99.110
DCS444 188.68.37.51 DCS444 188.68.37.51
DCS450 64.137.161.11 DCS449 159.89.183.117
DCS450 64.137.224.233
DCS454 218.250.250.21
DCS455 208.71.169.83
DCS456 xrf456.de
DCS456 54.37.204.187
DCS460 183.53.66.145
DCS464 52.192.129.174
DCS470 104.49.29.243
DCS477 139.162.213.89
DCS479 198.58.106.10
DCS486 51.255.172.249 DCS486 51.255.172.249
DCS499 59.157.4.151 DCS487 93.66.214.109
DCS500 172.104.32.192 DCS499 203.137.76.22
DCS502 74.208.88.137 DCS500 58.96.21.253
DCS515 163.44.167.125 DCS501 198.211.98.63
DCS502 190.148.222.28
DCS505 45.248.50.37
DCS506 121.200.19.211
DCS508 185.188.4.15
DCS510 110.141.219.161
DCS511 213.172.232.13
DCS515 203.137.78.35
DCS518 176.9.1.168 DCS518 176.9.1.168
DCS519 24.55.202.247 DCS519 149.56.165.76
DCS520 202.6.18.14 DCS520 xlx.dtdxa.com
DCS538 133.137.49.171 DCS521 150.129.184.54
DCS550 151.80.141.175 DCS522 14.102.146.160
DCS555 64.137.186.11 DCS523 175.142.199.32
DCS569 219.122.146.110 DCS525 80.211.68.38
DCS570 104.128.230.153 DCS530 116.251.193.99
DCS534 208.71.169.83
DCS538 131.129.217.94
DCS544 202.218.152.66
DCS550 89.36.222.146
DCS551 140.227.198.45
DCS553 45.79.92.86
DCS554 52.35.183.178
DCS555 xlx555.dtdxa.com
DCS567 212.91.156.69
DCS569 203.137.111.98
DCS570 172.104.13.31
DCS573 216.189.148.204 DCS573 216.189.148.204
DCS595 219.104.19.203 DCS583 116.70.240.104
DCS587 68.32.126.21
DCS595 220.146.24.34
DCS599 203.137.118.190
DCS600 13.69.14.204 DCS600 13.69.14.204
DCS601 51.141.52.193 DCS601 51.141.52.193
DCS602 212.56.100.200 DCS602 212.56.100.200
DCS603 24.233.107.8 DCS603 216.246.155.99
DCS610 103.1.213.21 DCS604 139.162.241.24
DCS616 44.103.39.7 DCS605 183.76.179.238
DCS626 202.137.244.157 DCS608 219.122.253.83
DCS666 54.144.216.63 DCS609 219.122.253.83
DCS610 89.186.80.81
DCS613 198.50.202.39
DCS619 167.99.168.82
DCS626 45.77.234.162
DCS627 121.75.75.200
DCS630 61.195.125.81
DCS634 222.148.104.64
DCS647 217.182.168.54
DCS651 198.96.90.144
DCS655 146.64.235.19
DCS666 86.153.215.35
DCS672 180.27.223.252
DCS673 180.147.243.178
DCS684 212.237.17.83
DCS689 97.107.128.47 DCS689 97.107.128.47
DCS695 155.254.33.145
DCS698 203.137.123.89
DCS699 82.102.5.239 DCS699 82.102.5.239
DCS700 78.47.222.93 DCS700 2.29.27.21
DCS701 61.195.107.77
DCS703 61.195.98.254
DCS704 150.66.34.110
DCS706 93.186.255.126 DCS706 93.186.255.126
DCS707 90.145.156.196 DCS707 90.145.156.196
DCS708 202.218.37.62 DCS708 150.66.20.222
DCS709 212.237.34.32 DCS709 212.237.34.32
DCS711 212.237.18.27 DCS711 212.237.18.27
DCS712 153.227.250.188 DCS712 153.215.181.34
DCS714 85.214.119.76 DCS713 218.251.63.99
DCS724 191.232.36.180 DCS714 81.169.140.163
DCS717 44.137.70.100
DCS722 80.211.2.161
DCS723 45.33.118.112
DCS724 xlx.dvbrazil.com.br
DCS724 75.99.228.35
DCS725 172.245.9.180
DCS730 190.14.50.165
DCS732 190.159.68.105
DCS733 45.56.117.158
DCS734 181.208.254.236
DCS735 104.131.81.32
DCS737 195.130.75.246 DCS737 195.130.75.246
DCS738 210.171.151.238
DCS740 104.167.114.230
DCS741 203.137.78.41
DCS746 178.254.34.44 DCS746 178.254.34.44
DCS747 93.209.43.173 DCS747 93.209.44.227
DCS748 64.137.197.36 DCS748 64.137.197.36
DCS749 45.77.102.203
DCS750 203.86.206.49 DCS750 203.86.206.49
DCS751 210.55.201.126 DCS751 203.118.145.79
DCS755 193.248.45.246 DCS752 66.154.105.195
DCS755 178.22.148.229
DCS757 43.229.63.42
DCS762 129.21.36.65
DCS766 201.62.48.61 DCS766 201.62.48.61
DCS773 94.177.175.230 DCS768 80.211.199.231
DCS777 45.62.251.163 DCS770 153.126.173.9
DCS781 175.179.238.153 DCS773 89.46.75.166
DCS787 87.154.55.113 DCS775 149.202.61.17
DCS789 75.144.65.122 DCS776 182.168.37.205
DCS800 52.26.26.195 DCS777 194.182.66.76
DCS801 77.117.160.175 DCS781 101.143.242.199
DCS807 118.8.17.123 DCS782 153.221.123.92
DCS812 126.25.168.252 DCS787 46.41.1.96
DCS788 192.168.0.96
DCS789 45.33.119.142
DCS794 101.143.242.95
DCS800 87.252.188.119
DCS801 213.47.71.17
DCS803 77.117.21.251
DCS806 92.107.25.23
DCS807 153.167.124.196
DCS808 18.220.252.27
DCS809 78.46.11.69
DCS810 71.41.121.228
DCS811 64.137.238.189
DCS812 203.145.233.141
DCS813 97.76.81.165 DCS813 97.76.81.165
DCS817 18.235.96.93
DCS818 120.79.155.116
DCS825 51.75.252.197
DCS828 195.225.116.244
DCS833 78.226.112.146
DCS844 137.226.79.122
DCS847 162.243.4.29
DCS850 88.198.94.77 DCS850 88.198.94.77
DCS852 42.2.140.44
DCS858 54.227.203.214
DCS859 54.227.203.214
DCS860 24.134.86.93
DCS861 66.175.218.63
DCS865 45.32.212.226
DCS866 93.233.182.237
DCS867 51.254.115.5
DCS870 103.3.234.95 DCS870 103.3.234.95
DCS871 182.245.190.200
DCS878 203.137.123.113
DCS880 176.10.105.211 DCS880 176.10.105.211
DCS883 153.179.224.224
DCS886 118.163.103.178 DCS886 118.163.103.178
DCS887 118.163.103.177 DCS887 118.163.103.177
DCS888 31.14.135.7 DCS888 46.18.142.169
DCS897 92.222.23.124 DCS889 130.149.36.93
DCS900 85.214.114.27 DCS893 104.223.59.212
DCS901 77.117.160.175 DCS897 212.237.2.183
DCS900 94.177.237.192
DCS903 80.211.29.226
DCS904 211.14.169.215
DCS906 212.237.11.53 DCS906 212.237.11.53
DCS908 212.237.2.183 DCS907 176.84.63.187
DCS908 92.222.23.124
DCS909 216.86.147.198 DCS909 216.86.147.198
DCS910 94.177.207.26 DCS910 94.177.207.26
DCS911 5.196.73.89 DCS911 xlx911.patrweb.com
DCS912 80.211.1.143
DCS915 72.28.30.93
DCS919 80.211.232.174
DCS920 81.150.10.62
DCS921 44.143.184.83 DCS921 44.143.184.83
DCS922 81.150.10.62
DCS925 90.255.232.101
DCS929 158.69.166.132 DCS929 158.69.166.132
DCS930 94.177.160.5 DCS930 94.177.160.5
DCS931 173.50.88.34 DCS931 68.131.30.206
DCS933 37.59.119.115 DCS933 164.132.104.167
DCS935 188.213.166.199
DCS940 202.218.37.121 DCS940 202.218.37.121
DCS944 202.218.34.210
DCS945 213.202.229.40
DCS946 212.227.174.45
DCS950 158.64.26.134 DCS950 158.64.26.134
DCS960 80.211.226.89 DCS951 18.188.166.109
DCS956 192.99.245.120
DCS959 203.137.98.121
DCS964 52.173.142.244 DCS964 52.173.142.244
DCS965 47.23.66.19
DCS966 203.150.19.24
DCS967 95.158.165.32 DCS967 95.158.165.32
DCS972 46.121.158.50 DCS969 142.93.46.36
DCS970 157.7.221.186
DCS972 109.226.48.53
DCS973 211.14.169.43
DCS974 94.177.217.52 DCS974 94.177.217.52
DCS975 176.31.161.9 DCS975 176.31.161.9
DCS976 212.237.36.71 DCS976 212.237.36.71
DCS978 193.70.0.229 DCS979 217.162.36.91
DCS986 81.89.102.160 DCS980 80.211.84.249
DCS986 194.59.205.218
DCS987 185.32.183.148 DCS987 185.32.183.148
DCS989 xrf989.bbhill.net DCS988 80.211.236.189
DCS989 50.27.131.75
DCS990 35.164.237.63 DCS990 35.164.237.63
DCS995 142.116.255.245 DCS991 80.211.19.121
DCS992 149.28.243.165
DCS993 97.64.20.63
DCS994 35.177.233.106
DCS995 118.27.30.92
DCS996 47.104.177.248
DCS997 94.177.187.40 DCS997 94.177.187.40
DCS998 44.140.236.20 DCS998 44.140.236.20
DCS999 94.177.173.53 DCS999 94.177.173.53
DSC034 dcs034.xreflector.net
# EOF - Sun, 19 May 2019 12:38:05 GMT

View file

@ -1,200 +1,746 @@
#>>Downloaded from W6KD host file server # Prepared at ar-dns.net - Sun, 19 May 2019 12:35:55 GMT
#>>Last updated 17 NOV 2016 by W6KD XRF000 23.111.174.198
XRF000 000.xreflector.org XRF000 000.xreflector.org
XRF001 77.57.24.143
XRF001 xlx001.homepc.it XRF001 xlx001.homepc.it
XRF002 140.82.62.162
XRF002 xrf002.dstar.club XRF002 xrf002.dstar.club
XRF003 xrf003.iw0red.it XRF003 173.199.124.183
XRF003 xlx003.xrefl.net
XRF004 44.103.34.3
XRF004 xrf004.kb8zgl.net XRF004 xrf004.kb8zgl.net
XRF005 216.16.240.236 XRF005 50.116.62.225
XRF005 ve3tnk.homelinux.net
XRF006 34.213.176.201
XRF006 xrf006.xrefl.net XRF006 xrf006.xrefl.net
XRF007 xrf007.ea5gf.es XRF007 82.223.18.138
XRF008 95.110.231.219 XRF008 45.77.153.132
XRF008 xrf008.kingsofdigital.net
XRF009 118.150.164.96
XRF009 www.hamtalk.net
XRF010 85.197.129.86
XRF010 xlx010.n8qq.com XRF010 xlx010.n8qq.com
XRF011 xlx011.n8qq.com XRF011 81.95.126.168
XRF011 xlx011.warn.org
XRF012 52.26.161.5
XRF012 xrf012.papasys.com XRF012 xrf012.papasys.com
XRF013 34.213.176.201
XRF013 xrf013.perform2themax.com
XRF014 xrf014.iz0rin.it XRF014 xrf014.iz0rin.it
XRF015 194.59.205.228
XRF015 xrf015.theapplecore.me XRF015 xrf015.theapplecore.me
XRF016 xrf016.ampr.at XRF016 xrf016.ampr.at
XRF018 99.167.129.166 XRF017 92.177.212.64
XRF019 66.30.81.236 XRF018 flatcap.badweather.net
XRF020 67.210.212.144 XRF019 46.28.108.233
XRF021 44.103.32.250 XRF019 xlx019.ok2it.com
XRF020 xrf020.k2dls.net
XRF021 44.103.34.4
XRF022 83.137.45.98
XRF022 xrf022.tms-it.net XRF022 xrf022.tms-it.net
XRF023 185.177.59.166
XRF023 xlx023.dtdns.net
XRF024 94.199.173.123
XRF024 xrf024.dstar.at XRF024 xrf024.dstar.at
XRF025 89.38.150.252
XRF025 025.ham-digital.es XRF025 025.ham-digital.es
XRF026 65.175.188.230
XRF027 194.116.29.78 XRF027 194.116.29.78
XRF028 172.104.63.79
XRF028 stn028.dstar.be XRF028 stn028.dstar.be
XRF029 80.123.238.76
XRF029 xrf029.tms-it.net XRF029 xrf029.tms-it.net
XRF030 194.59.177.44
XRF030 xrf030.oe3xht.at XRF030 xrf030.oe3xht.at
XRF031 83.241.141.245
XRF031 xlx031.ddns.net
XRF032 158.64.26.140
XRF032 xlx032.epf.lu XRF032 xlx032.epf.lu
XRF033 46.226.178.81 XRF033 46.226.178.81
XRF034 xrf034.dynu.net
XRF035 45.79.94.184
XRF035 xrf035.wa7dre.org XRF035 xrf035.wa7dre.org
XRF036 xrf036.ddns.net XRF036 151.12.36.112
XRF036 xlx036.macasoft.it
XRF037 185.58.193.163 XRF037 185.58.193.163
XRF038 66.6.171.228 XRF038 44.103.34.19
XRF039 31.14.142.119
XRF040 109.71.45.29
XRF040 xrf040.dyndns.org XRF040 xrf040.dyndns.org
XRF041 167.88.37.80 XRF041 167.88.37.80
XRF042 xrf042.luthienstar.fr XRF042 xrf042.luthienstar.fr
XRF043 xrf043.aotnet.it XRF043 xrf043.aotnet.it
XRF044 82.1.185.173 XRF044 82.1.185.173
XRF045 45.62.233.223 XRF045 45.62.233.223
XRF046 176.10.140.161
XRF046 xlx.c4fm.se XRF046 xlx.c4fm.se
XRF047 202.171.147.58
XRF047 xlx047.ddns.net XRF047 xlx047.ddns.net
XRF048 xrf048.n5uxt.org
XRF049 212.71.234.224
XRF050 80.211.155.206
XRF050 dstar.emcomspain.xreflector.es
XRF051 93.186.254.219
XRF052 121.119.96.205
XRF052 xrf052.dip.jp XRF052 xrf052.dip.jp
XRF055 95.110.229.195 XRF053 185.97.120.120
XRF053 xlx.grvdc.eu
XRF054 52.86.180.251
XRF054 xrf054.metro-uhf.org
XRF055 52.80.4.154
XRF055 dstar.zzux.com
XRF056 xrf056.homepc.it
XRF057 74.193.217.15
XRF057 xlx057.ddns.net
XRF058 133.208.235.3
XRF058 xrf058.dip.jp
XRF059 18.219.32.21
XRF060 212.237.36.181
XRF061 68.115.205.110 XRF061 68.115.205.110
XRF062 72.17.20.173
XRF062 xlx.maryland-dstar.net XRF062 xlx.maryland-dstar.net
XRF063 162.248.141.148 XRF063 162.248.141.148
XRF064 122.222.1.50
XRF064 xrf064.owari.biz XRF064 xrf064.owari.biz
XRF065 212.237.53.67
XRF066 87.7.192.18
XRF066 xlx066.homepc.it
XRF067 95.60.130.176
XRF067 xrf067.f5kav.org XRF067 xrf067.f5kav.org
XRF068 92.222.145.202
XRF068 xrf068.ircddb.it XRF068 xrf068.ircddb.it
XRF069 069.xreflector.es XRF069 xrf069.sustrai.org
XRF070 xrf070.iptime.org XRF070 xrf070.iptime.org
XRF071 211.60.41.185
XRF071 xrf.elechomebrew.com XRF071 xrf.elechomebrew.com
XRF072 75.60.237.17
XRF072 xrf072.dv.or.kr
XRF073 147.102.7.34 XRF073 147.102.7.34
XRF074 212.237.211.82
XRF074 xrf074.dyndns.org XRF074 xrf074.dyndns.org
XRF075 5.135.162.136
XRF075 xrf075.ir9bs.it XRF075 xrf075.ir9bs.it
XRF076 203.137.116.117
XRF076 xrf076.xreflector-jp.org XRF076 xrf076.xreflector-jp.org
XRF077 216.21.9.156
XRF077 xrf077.duckdns.org XRF077 xrf077.duckdns.org
XRF078 xrf078.duckdns.org XRF078 109.15.57.11
XRF080 jr3vh.jpn.ph.jp XRF078 xlx.grvdc.eu
XRF081 ja3gqj.dip.jp XRF079 184.23.183.98
XRF084 xrf084.fabbroni.eu XRF079 xlx079.dvham.com
XRF080 121.81.128.207
XRF080 jr3vh.dip.jp
XRF081 121.82.151.243
XRF081 jr3vh.dip.jp
XRF082 110.232.113.108
XRF082 xlx082.pungsan.com
XRF083 185.205.210.217
XRF083 xlx083.pungsan.com
XRF084 45.79.93.167
XRF085 113.150.26.8
XRF085 jr1ofp.dip.jp XRF085 jr1ofp.dip.jp
XRF086 52.80.139.252
XRF087 44.137.36.209
XRF088 194.109.192.235
XRF088 xrf088.pa4tw.nl XRF088 xrf088.pa4tw.nl
XRF091 091.xreflector.es XRF089 194.109.192.236
XRF089 xlx089.pa4tw.nl
XRF090 91.92.136.252
XRF091 89.36.219.197
XRF092 104.200.25.53
XRF093 185.177.59.221
XRF094 157.7.221.186
XRF095 203.137.76.53
XRF095 xrf095.xreflector-jp.org
XRF097 80.211.154.173
XRF098 203.136.233.165
XRF098 xrf098.dip.jp XRF098 xrf098.dip.jp
XRF099 80.211.27.75
XRF099 xlx099.iz7auh.net
XRF100 45.62.233.223
XRF100 xlx100.xlxreflector.org XRF100 xlx100.xlxreflector.org
XRF101 45.62.213.101
XRF101 xlx101.xlxreflector.org XRF101 xlx101.xlxreflector.org
XRF102 23.111.174.196
XRF102 xlx102.xlxreflector.org XRF102 xlx102.xlxreflector.org
XRF103 64.137.224.126
XRF103 xlx103.xlxreflector.org XRF103 xlx103.xlxreflector.org
XRF104 23.111.174.197
XRF104 xlx104.xlxreflector.org XRF104 xlx104.xlxreflector.org
XRF105 51.254.99.78
XRF105 xrf105.xlxreflector.org
XRF109 182.168.128.138
XRF109 xrf109.tokyo
XRF110 150.7.164.10
XRF110 xrf110.xreflector-jp.org
XRF111 61.195.96.160
XRF111 xrf111.xreflector-jp.org
XRF112 94.177.235.81
XRF112 112.xreflector.es XRF112 112.xreflector.es
XRF113 212.227.202.198
XRF113 xlx113.homepc.it XRF113 xlx113.homepc.it
XRF113 xrf113.dstarspain.es XRF114 5.135.188.16
XRF115 217.182.128.3
XRF115 reflector-xlx.hb9vd.ch
XRF116 31.185.101.211
XRF118 5.249.148.252
XRF118 xlx118.ns0.it XRF118 xlx118.ns0.it
XRF120 24.43.83.140 XRF119 125.129.207.86
XRF119 xlx119.dvham.com
XRF120 81.150.10.63
XRF121 174.37.249.156
XRF122 83.137.45.126
XRF122 xrf.vpn4ham.com
XRF123 213.126.90.100 XRF123 213.126.90.100
XRF124 211.14.169.234
XRF124 xrf124.xreflector-jp.org
XRF125 213.181.208.52
XRF125 xlx125.dyndns.hu XRF125 xlx125.dyndns.hu
XRF127 190.112.228.107
XRF127 pj2man.hopto.org
XRF128 153.147.157.213
XRF129 220.209.106.220
XRF129 guwgw.cir-ins.com
XRF130 194.59.177.45
XRF131 80.127.118.226
XRF131 xlx131.pe1er.nl
XRF132 91.203.55.87
XRF132 xrf132.dstar.radom.pl XRF132 xrf132.dstar.radom.pl
XRF133 xrf133.gb7de.co.uk XRF133 xrf133.gb7de.co.uk
XRF145 178.59.21.32 XRF134 159.89.176.86
XRF135 74.208.214.69
XRF140 95.211.211.145
XRF145 178.59.23.138
XRF146 213.7.90.5
XRF146 xlx146.ddns.net
XRF147 46.41.1.127 XRF147 46.41.1.127
XRF150 xrf150.dstarspain.es XRF150 80.211.10.212
XRF150 argentina.mmdvm.es
XRF153 210.189.104.236
XRF155 18.235.96.93
XRF158 150.66.16.176
XRF160 61.195.109.179
XRF164 122.222.1.50
XRF168 xrf168.duckdns.org
XRF170 210.178.113.173
XRF170 dvham.mooo.com XRF170 dvham.mooo.com
XRF171 210.178.113.123
XRF171 xrf171.dvham.com
XRF175 162.248.92.25
XRF177 xlx177.webandcloud.net XRF177 xlx177.webandcloud.net
XRF200 xrf200.theapplecore.co.uk XRF180 192.241.240.7
XRF180 xlx180.warn.org
XRF181 122.19.214.143
XRF185 89.106.108.151
XRF190 190.194.12.53
XRF199 153.126.179.214
XRF200 185.203.119.158
XRF200 xrf200.theapplecore.me
XRF202 148.251.122.251
XRF204 85.214.126.111
XRF204 xlx204.ph0dv.nl XRF204 xlx204.ph0dv.nl
XRF206 193.190.240.227
XRF208 151.80.155.39
XRF208 xlx208.f5kav.org
XRF210 64.137.224.107
XRF210 210.xreflector.org XRF210 210.xreflector.org
XRF212 52.38.90.188
XRF212 xlx212.dstar.club XRF212 xlx212.dstar.club
XRF214 185.47.129.230
XRF214 xlx214.sustrai.org XRF214 xlx214.sustrai.org
XRF215 185.87.96.172
XRF216 74.214.25.135 XRF216 74.214.25.135
XRF223 k0pra.ddns.net XRF220 124.41.83.11
XRF220 xlx220.sapotech.com
XRF222 212.43.96.84
XRF222 xlx222.webandcloud.net
XRF223 208.73.201.157
XRF223 xrf223.parkerradio.org
XRF224 203.137.99.97
XRF224 xrf224.xreflector-jp.org
XRF226 2.226.183.226
XRF226 xrf226.hamnet.ro
XRF227 89.33.44.100
XRF228 212.237.33.114
XRF229 194.191.4.54
XRF229 dstar.hamnet.xyz
XRF230 80.250.3.114
XRF230 ref.dstar.cz
XRF232 89.185.97.35
XRF232 xrf232.tms-it.net XRF232 xrf232.tms-it.net
XRF233 xlx233.f1smf.com
XRF235 5.150.254.97
XRF235 xlx235.duckdns.org
XRF238 172.104.239.219
XRF238 xlx.brandmeister.digital
XRF241 151.80.158.227
XRF242 73.14.84.43
XRF242 xrf242.k7edw.com
XRF246 172.93.48.159
XRF246 xlx.mkagawa.com
XRF248 xrf248.dyndns.org XRF248 xrf248.dyndns.org
XRF250 xrf250.dstar.su XRF250 xrf250.dstar.su
XRF255 xrf255.reflector.up4dar.de XRF252 je7zbu.jpn.ph
XRF255 142.91.158.199
XRF257 47.157.82.87
XRF258 75.60.237.19
XRF260 xrf260.radiocult.su XRF260 xrf260.radiocult.su
XRF262 xrf262.reflector.up4dar.de XRF261 44.144.0.23
XRF262 92.201.84.2
XRF263 85.214.193.146
XRF264 52.2.131.118 XRF264 52.2.131.118
XRF265 51.255.43.60
XRF266 212.237.51.82
XRF268 194.38.140.204
XRF270 158.64.26.132
XRF270 xrf270.reflector.up4dar.de XRF270 xrf270.reflector.up4dar.de
XRF272 200.231.36.188
XRF275 xrf275.dyndns.org XRF275 xrf275.dyndns.org
XRF277 xlx277.dyndns.org
XRF280 95.234.119.44
XRF282 210.188.25.17
XRF282 xrf282.dip.jp
XRF284 95.158.165.32
XRF285 91.92.93.15
XRF287 43.245.172.2
XRF288 99.108.210.100
XRF290 44.182.7.20
XRF291 101.143.242.189
XRF291 xrf291.xreflector-jp.org
XRF295 45.62.224.93
XRF295 xrf295.dyndns.org XRF295 xrf295.dyndns.org
XRF298 220.144.59.222
XRF298 xrf298.dip.jp
XRF299 203.86.194.92
XRF299 xlx299.zl2ro.nz
XRF300 45.62.244.43
XRF300 300.xreflector.org XRF300 300.xreflector.org
XRF302 144.217.241.23
XRF302 xlx302.hopto.org
XRF303 75.70.52.143
XRF305 145.239.116.57
XRF307 72.21.76.154
XRF307 xlx307.ddns.net XRF307 xlx307.ddns.net
XRF308 xlx308.w6kd.com XRF310 52.11.207.121
XRF310 xrf310.xrefl.net XRF310 xrf310.xrefl.net
XRF311 46.41.0.214
XRF311 xrf311.ernix.de XRF311 xrf311.ernix.de
XRF312 192.241.160.183
XRF312 xrf312.xrefl.net XRF312 xrf312.xrefl.net
XRF313 xlx313.xrefl.net XRF313 34.213.108.164
XRF314 xlx314.xrefl.net XRF313 xlx313.openstd.net
XRF314 162.248.10.154
XRF315 65.101.7.50
XRF317 44.48.8.15
XRF317 xrf317.crossroadsdmr.org XRF317 xrf317.crossroadsdmr.org
XRF318 xrf318.xrefl.net
XRF321 31.207.110.45
XRF321 vps.makeitrad.com XRF321 vps.makeitrad.com
XRF328 212.237.33.114
XRF328 cisarbasel.ddns.net
XRF329 114.181.139.32
XRF330 18.222.199.205
XRF332 188.213.168.99
XRF333 194.116.29.73
XRF333 xrf333.f1smf.com XRF333 xrf333.f1smf.com
XRF334 96.47.95.121
XRF335 185.206.145.2
XRF336 23.226.233.133
XRF336 xrf336.mawcg.org XRF336 xrf336.mawcg.org
XRF350 350.dstarspain.es XRF338 122.116.216.47
XRF339 198.98.53.247
XRF339 xlx339.avarc.ca
XRF345 45.62.237.34
XRF345 xrf345.dyndns.org
XRF350 350.opendstar.eu
XRF352 35.230.162.146
XRF353 94.173.206.53 XRF353 94.173.206.53
XRF356 93.152.167.4
XRF357 93.152.167.4
XRF357 xlx357.w6kd.com XRF357 xlx357.w6kd.com
XRF358 93.152.167.4
XRF359 94.156.172.213
XRF360 222.229.25.105
XRF360 xrf360.dip.jp
XRF364 159.65.231.53
XRF365 59.139.141.204
XRF365 xrf365.dip.jp
XRF367 18.216.66.72
XRF367 xrf367.ad6dm.net
XRF370 188.213.168.24
XRF370 xrf370.selfip.com XRF370 xrf370.selfip.com
XRF371 212.237.8.77
XRF371 xlx371.selfip.com
XRF373 119.229.134.1
XRF373 xrf73.dip.jp
XRF374 61.195.108.146
XRF374 xrf374.xreflector-jp.org
XRF376 75.145.119.225
XRF377 186.159.96.100
XRF379 104.218.36.162
XRF380 160.16.65.39
XRF380 kdk.ddns.net
XRF382 211.131.19.200
XRF382 xrf382.pgw.jp
XRF387 195.130.59.77 XRF387 195.130.59.77
XRF388 138.197.67.52
XRF389 106.70.187.224
XRF389 xlxdmr.duckdns.org
XRF390 149.7.214.253
XRF390 xrf390.aotnet.it XRF390 xrf390.aotnet.it
XRF393 139.91.200.186
XRF395 5.249.151.111
XRF398 104.167.117.71 XRF398 104.167.117.71
XRF400 xrf400.no-ip.org XRF399 185.227.110.247
XRF400 13.58.192.185
XRF400 xlx400.iz7auh.net
XRF404 91.229.143.187
XRF404 xlx.bendiksverden.net XRF404 xlx.bendiksverden.net
XRF413 xlx413.xrefl.net XRF410 xlx.n5amd.com
XRF411 82.171.119.45
XRF412 61.195.107.113
XRF412 xrf412.dip.jp
XRF420 174.138.113.116
XRF420 kc9qen.com XRF420 kc9qen.com
XRF421 118.189.181.236
XRF423 4ix.hacktic.de XRF423 4ix.hacktic.de
XRF431 61.195.98.225
XRF431 xrf431.xreflector-jp.org
XRF433 217.160.22.17
XRF433 xrf433.de XRF433 xrf433.de
XRF440 dg8rp.dynaccess.de XRF434 51.254.128.134
XRF438 80.211.189.236
XRF440 153.133.72.142
XRF440 xrf440.e-kyushu.net
XRF441 203.137.99.110
XRF441 xrf441.xreflector-jp.org
XRF443 xrf443.arisondrio.it XRF443 xrf443.arisondrio.it
XRF444 188.68.37.51
XRF444 xlx444.pa3dfn.nl XRF444 xlx444.pa3dfn.nl
XRF446 78.226.112.146
XRF449 159.89.183.117
XRF450 64.137.224.233
XRF450 450.xreflector.org XRF450 450.xreflector.org
XRF454 218.250.250.21
XRF455 208.71.169.83
XRF456 54.37.204.187
XRF456 xrf456.de XRF456 xrf456.de
XRF460 183.53.66.145
XRF464 52.192.129.174
XRF470 104.49.29.243
XRF473 104.49.29.243
XRF477 139.162.213.89
XRF479 198.58.106.10
XRF486 51.255.172.249
XRF486 xlx486.iz8gur.it
XRF487 93.66.214.109
XRF490 xrf490.dyndns.org XRF490 xrf490.dyndns.org
XRF499 203.137.76.22
XRF499 xrf499.xreflector-jp.org
XRF500 125.63.57.138 XRF500 125.63.57.138
XRF500 xrf500.org
XRF501 104.130.72.187
XRF502 74.208.88.137 XRF502 74.208.88.137
XRF505 110.141.219.161
XRF506 121.200.19.211
XRF508 185.188.4.15
XRF510 xrf510.s56g.net
XRF511 213.172.232.13
XRF511 xlx511.ddns.net
XRF515 203.137.78.35
XRF515 shounandstar.dip.jp
XRF518 176.9.1.168
XRF518 xrf518.n18.de XRF518 xrf518.n18.de
XRF519 24.55.196.105 XRF519 24.55.196.105
XRF519 xrf519.ve3zin.com
XRF520 xlx.dtdxa.com
XRF521 150.129.184.54
XRF522 14.102.146.160
XRF523 175.142.199.32
XRF525 80.211.68.38
XRF530 116.251.193.99
XRF534 208.71.169.83
XRF538 124.41.76.58
XRF538 xrf538.dip.jp
XRF544 202.218.152.66
XRF544 xlx544.ddns.net
XRF550 89.36.222.146
XRF550 550.xreflector.es XRF550 550.xreflector.es
XRF555 xrf555.w6kd.com XRF551 140.227.198.45
XRF553 45.79.92.86
XRF554 52.35.183.178
XRF555 xlx555.dtdxa.com
XRF556 xrf556.w6kd.com XRF556 xrf556.w6kd.com
XRF559 98.239.113.175
XRF567 212.91.156.69
XRF569 203.137.111.98
XRF569 xlxreflector.jpn.ph XRF569 xlxreflector.jpn.ph
XRF570 xrf.no-ip.org XRF570 104.128.230.153
XRF573 216.189.148.204 XRF573 216.189.148.204
XRF580 67.20.31.79 XRF580 67.20.31.79
XRF583 116.70.240.104
XRF587 68.32.126.21
XRF595 220.146.23.42
XRF595 hamradio.dip.jp
XRF599 203.137.118.190
XRF599 xrf599.n5wls.net
XRF600 13.69.14.204
XRF600 xrf600.gb7de.co.uk XRF600 xrf600.gb7de.co.uk
XRF601 51.141.52.193
XRF602 212.56.100.200
XRF603 216.246.155.99
XRF603 xlx603.cnharc.org XRF603 xlx603.cnharc.org
XRF604 139.162.241.24
XRF605 183.76.179.238
XRF608 219.122.253.83
XRF608 xrf608.dip.jp
XRF609 219.122.253.83
XRF610 89.186.80.81
XRF610 xrf610.vkradio.com XRF610 xrf610.vkradio.com
XRF613 198.50.202.39
XRF619 167.99.168.82
XRF626 45.77.234.162
XRF626 626.nz
XRF627 121.75.75.200
XRF630 61.195.125.81
XRF634 180.46.54.237
XRF634 xrf634.dip.jp
XRF647 217.182.168.54
XRF651 66.240.165.26
XRF655 146.64.235.19
XRF666 86.186.35.158
XRF666 vpngrf.webandcloud.net XRF666 vpngrf.webandcloud.net
XRF669 xrf669.no-ip.org XRF673 180.147.243.178
XRF673 xrf673.xreflector-jp.org
XRF678 xrf678.ddns.net XRF678 xrf678.ddns.net
XRF684 212.237.17.83
XRF689 97.107.128.47
XRF695 155.254.33.145
XRF698 203.137.123.89
XRF699 82.102.5.239
XRF699 xlx.tekniksnack.se XRF699 xlx.tekniksnack.se
XRF700 78.47.222.93
XRF700 xrf700.d-star.se XRF700 xrf700.d-star.se
XRF701 61.195.107.77
XRF701 xrf701.xreflector-jp.org
XRF703 61.195.98.254
XRF704 150.66.34.110
XRF706 93.186.255.126
XRF706 xlx706.iz0rin.it XRF706 xlx706.iz0rin.it
XRF707 90.145.156.196
XRF707 xrf707.openquad.net XRF707 xrf707.openquad.net
XRF708 202.218.37.62
XRF708 xrf708.xreflector-jp.org
XRF709 212.237.34.32
XRF709 xlx.dvmega.co.uk
XRF710 oe7mfi.ddns.net XRF710 oe7mfi.ddns.net
XRF711 212.237.18.27
XRF712 153.215.181.34
XRF712 xrf712.ddo.jp
XRF713 218.251.63.99
XRF714 85.214.119.76 XRF714 85.214.119.76
XRF714 xrf714.ea3hkb.com
XRF715 xlx715.ea3hkb.net
XRF716 xlx716.duckdns.org
XRF717 44.137.70.100
XRF719 199.227.117.121 XRF719 199.227.117.121
XRF720 23.237.16.149
XRF720 xrf720.freestar.us XRF720 xrf720.freestar.us
XRF724 191.232.36.180 XRF722 80.211.2.161
XRF722 722.xreflector.es
XRF723 45.33.118.112
XRF724 189.20.209.70
XRF724 xlx.dvbrazil.com.br
XRF725 172.245.9.180
XRF727 108.33.72.83
XRF727 w4icy.inerrantenergy.com XRF727 w4icy.inerrantenergy.com
XRF730 186.64.123.59
XRF732 190.159.68.105
XRF732 xlx.hk4km.co
XRF733 45.56.117.158
XRF733 xlx733.ddns.net
XRF735 104.131.81.32
XRF737 195.130.75.246 XRF737 195.130.75.246
XRF738 210.171.151.238
XRF740 104.167.114.230
XRF740 imagewell.duckdns.org XRF740 imagewell.duckdns.org
XRF741 203.137.78.41
XRF746 178.254.34.44
XRF747 87.147.142.9
XRF747 xrf747.de XRF747 xrf747.de
XRF748 64.137.197.36
XRF748 xrf748.dyndns.org XRF748 xrf748.dyndns.org
XRF750 104.128.230.153 XRF749 45.77.102.203
XRF750 203.86.206.49
XRF751 203.118.145.79
XRF752 66.154.105.195
XRF752 xlx752.zl2wl.nz
XRF755 178.22.148.229
XRF755 xlx.radioamateur.tk
XRF757 43.229.63.42
XRF757 xrf757.openquad.net XRF757 xrf757.openquad.net
XRF762 129.21.36.65
XRF766 201.62.48.61
XRF766 xlx.amrase.org.br XRF766 xlx.amrase.org.br
XRF767 xrf767.de XRF767 xrf767.de
XRF768 80.211.199.231
XRF770 153.126.173.9
XRF773 94.177.175.230
XRF773 xrf773.iz0rin.it XRF773 xrf773.iz0rin.it
XRF775 149.202.61.17
XRF776 218.221.181.241
XRF776 xlx776.tokyo
XRF777 112.218.40.91 XRF777 112.218.40.91
XRF780 96.53.97.22
XRF781 101.143.242.199
XRF781 xrf781.xreflector-jp.org
XRF782 122.16.56.210
XRF787 46.41.1.96
XRF787 xrf787.de XRF787 xrf787.de
XRF788 192.168.0.96
XRF789 45.33.119.142
XRF789 xrf789.dstarxlx.com.br XRF789 xrf789.dstarxlx.com.br
XRF794 101.143.242.95
XRF794 xrf794.xreflector-jp.org
XRF800 87.252.188.119
XRF801 213.47.71.17
XRF801 f4hin.fr
XRF803 77.117.21.251
XRF806 92.107.25.23
XRF807 122.18.165.164
XRF807 hajikko.iobb.net XRF807 hajikko.iobb.net
XRF808 18.220.252.27
XRF808 xrf808.n5wls.net
XRF809 78.46.11.69
XRF810 64.137.238.189
XRF810 810.xreflector.org XRF810 810.xreflector.org
XRF813 kj4qal.inerrantenergy.com XRF811 64.137.238.189
XRF812 203.145.233.141
XRF812 xrf812.xreflector-jp.org
XRF813 97.76.81.165
XRF813 xlx.inerrantenergy.com
XRF817 18.235.96.93
XRF818 120.79.155.116
XRF825 51.75.252.197
XRF828 195.225.116.244
XRF828 xlx828.ddnss.de XRF828 xlx828.ddnss.de
XRF833 78.226.112.146
XRF844 137.226.79.122
XRF847 162.243.4.29
XRF850 88.198.94.77
XRF850 xrf850.xrfmaster.net XRF850 xrf850.xrfmaster.net
XRF851 xrf851.rsdt.de XRF851 xrf851.rsdt.de
XRF852 42.2.140.44
XRF858 xrf858.ke0lmx.net
XRF859 54.227.203.214
XRF859 xlx859.ke0lmx.net
XRF860 24.134.86.93
XRF860 xrf.njpaasterisk.org XRF860 xrf.njpaasterisk.org
XRF870 103.18.207.114 XRF861 66.175.218.63
XRF865 45.32.212.226
XRF866 93.233.176.219
XRF867 51.254.115.5
XRF870 103.3.234.95
XRF870 xrf870.ddns.net
XRF871 222.172.252.56
XRF878 203.137.123.113
XRF878 xrf878.xreflector-jp.org
XRF880 176.10.105.211
XRF883 153.179.226.85
XRF883 xrf883.dip.jp
XRF886 118.163.103.178
XRF886 xrf886.metropit.net XRF886 xrf886.metropit.net
XRF887 118.163.103.177
XRF888 46.18.142.169
XRF888 xlx888.ns0.it XRF888 xlx888.ns0.it
XRF889 130.149.36.93
XRF893 104.223.59.212
XRF897 92.222.23.124 XRF897 92.222.23.124
XRF900 94.177.237.192
XRF901 xrf901.dyndns.org XRF901 xrf901.dyndns.org
XRF902 xrf902.dyndns.org XRF902 xrf902.dyndns.org
XRF903 80.211.29.226
XRF904 211.14.169.215
XRF905 199.212.121.20 XRF905 199.212.121.20
XRF906 212.237.11.53
XRF906 xrf906.radioclubveleta.es XRF906 xrf906.radioclubveleta.es
XRF909 xrf909.ealink.org XRF907 88.3.75.162
XRF911 5.196.73.89 XRF907 xlx907.ddns.net
XRF908 92.222.23.124
XRF909 216.86.147.198
XRF909 www.ealink.es
XRF910 92.177.212.64
XRF911 xlx911.patrweb.com
XRF912 80.211.1.143
XRF915 72.28.30.93
XRF919 80.211.232.174
XRF920 xrf920.oe7xxr.ampr.at XRF920 xrf920.oe7xxr.ampr.at
XRF921 44.143.184.83
XRF921 xlx921.oe7xxr.ampr.at
XRF922 81.150.10.62
XRF922 xrf922.mb6er.com
XRF925 90.255.232.101
XRF929 158.69.166.132
XRF929 xrf929.ddns.net XRF929 xrf929.ddns.net
XRF930 94.177.160.5
XRF930 xreflector.ddns.net XRF930 xreflector.ddns.net
XRF931 68.131.30.206
XRF931 xref.kw4yb.com
XRF933 164.132.104.167
XRF935 188.213.166.199
XRF935 xlx935.ddns.net
XRF940 202.218.37.121
XRF940 xrf940.xreflector-jp.org
XRF944 202.218.34.210
XRF944 xrf944.xreflector-jp.org
XRF945 213.202.229.40
XRF945 xlx945.xreflector.es
XRF946 212.227.174.45
XRF950 158.64.26.134
XRF950 xlx950.epf.lu XRF950 xlx950.epf.lu
XRF951 18.188.166.109
XRF956 192.99.245.120
XRF959 203.137.98.121
XRF960 80.211.226.89
XRF964 52.173.142.244
XRF965 47.23.66.19
XRF966 203.150.19.24
XRF967 95.158.165.32
XRF967 xlx967.uk.to
XRF969 142.93.46.36
XRF970 157.7.221.186
XRF972 46.121.158.50
XRF973 211.14.169.43
XRF973 xrf973.xreflector-jp.org
XRF974 94.177.217.52
XRF974 xlx974.dynu.net
XRF975 176.31.161.9
XRF976 212.237.36.71
XRF977 977.opendstar.eu
XRF978 74.104.179.159
XRF978 978.opendstar.eu
XRF979 217.162.36.91
XRF981 153.210.14.45
XRF986 81.89.102.160 XRF986 81.89.102.160
XRF987 185.32.183.148
XRF987 xrf987.metro-uhf.org XRF987 xrf987.metro-uhf.org
XRF988 80.211.236.189
XRF988 988.xreflector.es XRF988 988.xreflector.es
XRF989 50.27.131.75
XRF989 xrf989.bbhill.net XRF989 xrf989.bbhill.net
XRF990 35.164.237.63
XRF991 91.92.136.118
XRF993 97.64.20.63
XRF994 35.177.233.106
XRF995 118.27.30.92
XRF995 xlx995.ddns.net
XRF996 47.104.177.248
XRF997 94.177.187.40
XRF997 xrf997.iw2gob.it
XRF998 44.140.236.20
XRF998 xlx.sm7.hamnet.nu XRF998 xlx.sm7.hamnet.nu
XRF999 94.177.173.53
XRF999 xrf999.no-ip.org XRF999 xrf999.no-ip.org
XRFWDX 47.149.178.211
XRFWDX worldwidedx.com
# EOF - Sun, 19 May 2019 12:35:55 GMT

View file

@ -1,7 +1,4 @@
#>>Downloaded from W6KD host file server # Prepared at ar-dns.net - Sun, 19 May 2019 12:38:29 GMT
#>>Last updated 17 NOV 2016 by W6KD
#>>Request changes on this server's lists by posting at
#>>http://xrefl.boards.net/board/2/directory-changes-forum
REF001 ref001.dstargateway.org REF001 ref001.dstargateway.org
REF002 ref002.dstargateway.org REF002 ref002.dstargateway.org
REF003 ref003.dstargateway.org REF003 ref003.dstargateway.org
@ -74,37 +71,26 @@ REF069 ref069.dstargateway.org
REF070 ref070.dstargateway.org REF070 ref070.dstargateway.org
REF071 ref071.dstargateway.org REF071 ref071.dstargateway.org
REF072 ref072.dstargateway.org REF072 ref072.dstargateway.org
#REF073 ref073.dstargateway.org REF073 ref073.dstargateway.org
#REF074 ref074.dstargateway.org REF074 ref074.dstargateway.org
REF075 ref075.dstargateway.org REF075 ref075.dstargateway.org
REF076 ref076.dstargateway.org REF076 ref076.dstargateway.org
REF077 ref077.dstargateway.org REF077 ref077.dstargateway.org
REF078 ref078.dstargateway.org REF078 ref078.dstargateway.org
#REF079 ref079.dstargateway.org REF079 ref079.dstargateway.org
#REF080 ref080.dstargateway.org REF080 ref080.dstargateway.org
#REF081 ref081.dstargateway.org REF081 ref081.dstargateway.org
#REF082 ref082.dstargateway.org REF082 ref082.dstargateway.org
#REF083 ref083.dstargateway.org REF083 ref083.dstargateway.org
#REF084 ref084.dstargateway.org REF084 ref084.dstargateway.org
#REF085 ref085.dstargateway.org REF085 ref085.dstargateway.org
#REF086 ref086.dstargateway.org REF086 ref086.dstargateway.org
#REF087 ref087.dstargateway.org REF087 ref087.dstargateway.org
#REF088 ref088.dstargateway.org REF088 ref088.dstargateway.org
#REF089 ref089.dstargateway.org REF089 ref089.dstargateway.org
#REF090 ref090.dstargateway.org REF367 xrf367.ad6dm.net
#REF091 ref091.dstargateway.org REF425 xlx425.xlx.ar-dns.net
#REF092 ref092.dstargateway.org REF520 xlx.dtdxa.com
#REF093 ref093.dstargateway.org REF555 xlx555.dtdxa.com
#REF094 ref094.dstargateway.org REF911 xlx911.patrweb.com
#REF095 ref095.dstargateway.org # EOF - Sun, 19 May 2019 12:38:29 GMT
#REF096 ref096.dstargateway.org
#REF097 ref097.dstargateway.org
#REF098 ref098.dstargateway.org
#REF099 ref099.dstargateway.org
REF117 ref001.dstargateway.org
REF212 xlx212.dstar.club
REF308 xlx308.w6kd.com
REF313 xlx313.xrefl.net
REF357 xlx357.w6kd.com
REF404 xlx.bendiksverden.net
REF850 xrf850.xrfmaster.net

View file

@ -1,36 +1,37 @@
.PHONY: install
install: install:
install -d -g bin -o root -m 0775 $(DATADIR) install -d -g root -o root -m 0755 $(DESTDIR)$(DATADIR)
install -g bin -o root -m 0664 CCS_Hosts.txt $(DATADIR) install -g root -o root -m 0644 CCS_Hosts.txt $(DESTDIR)$(DATADIR)
install -g bin -o root -m 0664 DCS_Hosts.txt $(DATADIR) install -g root -o root -m 0644 DCS_Hosts.txt $(DESTDIR)$(DATADIR)
install -g bin -o root -m 0664 DExtra_Hosts.txt $(DATADIR) install -g root -o root -m 0644 DExtra_Hosts.txt $(DESTDIR)$(DATADIR)
install -g bin -o root -m 0664 DPlus_Hosts.txt $(DATADIR) install -g root -o root -m 0644 DPlus_Hosts.txt $(DESTDIR)$(DATADIR)
install -g bin -o root -m 0664 TIME_de_DE.ambe $(DATADIR) install -g root -o root -m 0644 TIME_de_DE.ambe $(DESTDIR)$(DATADIR)
install -g bin -o root -m 0664 TIME_de_DE.indx $(DATADIR) install -g root -o root -m 0644 TIME_de_DE.indx $(DESTDIR)$(DATADIR)
install -g bin -o root -m 0664 TIME_en_GB.ambe $(DATADIR) install -g root -o root -m 0644 TIME_en_GB.ambe $(DESTDIR)$(DATADIR)
install -g bin -o root -m 0664 TIME_en_GB.indx $(DATADIR) install -g root -o root -m 0644 TIME_en_GB.indx $(DESTDIR)$(DATADIR)
install -g bin -o root -m 0664 TIME_en_US.ambe $(DATADIR) install -g root -o root -m 0644 TIME_en_US.ambe $(DESTDIR)$(DATADIR)
install -g bin -o root -m 0664 TIME_en_US.indx $(DATADIR) install -g root -o root -m 0644 TIME_en_US.indx $(DESTDIR)$(DATADIR)
install -g bin -o root -m 0664 TIME_fr_FR.ambe $(DATADIR) install -g root -o root -m 0644 TIME_fr_FR.ambe $(DESTDIR)$(DATADIR)
install -g bin -o root -m 0664 TIME_fr_FR.indx $(DATADIR) install -g root -o root -m 0644 TIME_fr_FR.indx $(DESTDIR)$(DATADIR)
install -g bin -o root -m 0664 TIME_se_SE.ambe $(DATADIR) install -g root -o root -m 0644 TIME_se_SE.ambe $(DESTDIR)$(DATADIR)
install -g bin -o root -m 0664 TIME_se_SE.indx $(DATADIR) install -g root -o root -m 0644 TIME_se_SE.indx $(DESTDIR)$(DATADIR)
install -g bin -o root -m 0664 de_DE.ambe $(DATADIR) install -g root -o root -m 0644 de_DE.ambe $(DESTDIR)$(DATADIR)
install -g bin -o root -m 0664 de_DE.indx $(DATADIR) install -g root -o root -m 0644 de_DE.indx $(DESTDIR)$(DATADIR)
install -g bin -o root -m 0664 dk_DK.ambe $(DATADIR) install -g root -o root -m 0644 dk_DK.ambe $(DESTDIR)$(DATADIR)
install -g bin -o root -m 0664 dk_DK.indx $(DATADIR) install -g root -o root -m 0644 dk_DK.indx $(DESTDIR)$(DATADIR)
install -g bin -o root -m 0664 en_GB.ambe $(DATADIR) install -g root -o root -m 0644 en_GB.ambe $(DESTDIR)$(DATADIR)
install -g bin -o root -m 0664 en_GB.indx $(DATADIR) install -g root -o root -m 0644 en_GB.indx $(DESTDIR)$(DATADIR)
install -g bin -o root -m 0664 en_US.ambe $(DATADIR) install -g root -o root -m 0644 en_US.ambe $(DESTDIR)$(DATADIR)
install -g bin -o root -m 0664 en_US.indx $(DATADIR) install -g root -o root -m 0644 en_US.indx $(DESTDIR)$(DATADIR)
install -g bin -o root -m 0664 es_ES.ambe $(DATADIR) install -g root -o root -m 0644 es_ES.ambe $(DESTDIR)$(DATADIR)
install -g bin -o root -m 0664 es_ES.indx $(DATADIR) install -g root -o root -m 0644 es_ES.indx $(DESTDIR)$(DATADIR)
install -g bin -o root -m 0664 fr_FR.ambe $(DATADIR) install -g root -o root -m 0644 fr_FR.ambe $(DESTDIR)$(DATADIR)
install -g bin -o root -m 0664 fr_FR.indx $(DATADIR) install -g root -o root -m 0644 fr_FR.indx $(DESTDIR)$(DATADIR)
install -g bin -o root -m 0664 it_IT.ambe $(DATADIR) install -g root -o root -m 0644 it_IT.ambe $(DESTDIR)$(DATADIR)
install -g bin -o root -m 0664 it_IT.indx $(DATADIR) install -g root -o root -m 0644 it_IT.indx $(DESTDIR)$(DATADIR)
install -g bin -o root -m 0664 no_NO.ambe $(DATADIR) install -g root -o root -m 0644 no_NO.ambe $(DESTDIR)$(DATADIR)
install -g bin -o root -m 0664 no_NO.indx $(DATADIR) install -g root -o root -m 0644 no_NO.indx $(DESTDIR)$(DATADIR)
install -g bin -o root -m 0664 pl_PL.ambe $(DATADIR) install -g root -o root -m 0644 pl_PL.ambe $(DESTDIR)$(DATADIR)
install -g bin -o root -m 0664 pl_PL.indx $(DATADIR) install -g root -o root -m 0644 pl_PL.indx $(DESTDIR)$(DATADIR)
install -g bin -o root -m 0664 se_SE.ambe $(DATADIR) install -g root -o root -m 0644 se_SE.ambe $(DESTDIR)$(DATADIR)
install -g bin -o root -m 0664 se_SE.indx $(DATADIR) install -g root -o root -m 0644 se_SE.indx $(DESTDIR)$(DATADIR)

View file

@ -109,12 +109,13 @@ bool CDCSSet::Validate()
if (n == wxNOT_FOUND) if (n == wxNOT_FOUND)
return false; return false;
n = m_ccsEnabled->GetCurrentSelection(); bool ccsEnabled = m_ccsEnabled->GetCurrentSelection() == 1;
if (n == wxNOT_FOUND) bool ccsHostSelected = m_ccsHosts->GetCurrentSelection() != wxNOT_FOUND;
return false;
if (m_ccsHosts->GetCurrentSelection() == wxNOT_FOUND) if (ccsEnabled && !ccsHostSelected) {
wxMessageBox(_("CCS is enabled and no CCS host has been selected. Either disable CCS or select a CCS host."));
return false; return false;
}
return true; return true;
} }

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2010 by Jonathan Naylor G4KLX * Copyright (C) 2010,2018,2020 by Jonathan Naylor G4KLX
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -25,11 +25,11 @@ const unsigned int CONTROL_WIDTH2 = 80U;
const unsigned int PORT_LENGTH = 5U; const unsigned int PORT_LENGTH = 5U;
const unsigned int PASSWORD_LENGTH = 5U; const unsigned int PASSWORD_LENGTH = 5U;
CDPRSSet::CDPRSSet(wxWindow* parent, int id, const wxString& title, bool enabled, const wxString& hostname, unsigned int port) : CDPRSSet::CDPRSSet(wxWindow* parent, int id, const wxString& title, bool enabled, const wxString& address, unsigned int port) :
wxPanel(parent, id), wxPanel(parent, id),
m_title(title), m_title(title),
m_enabled(NULL), m_enabled(NULL),
m_hostname(NULL), m_address(NULL),
m_port(NULL) m_port(NULL)
{ {
wxFlexGridSizer* sizer = new wxFlexGridSizer(2); wxFlexGridSizer* sizer = new wxFlexGridSizer(2);
@ -43,11 +43,11 @@ m_port(NULL)
sizer->Add(m_enabled, 0, wxALL | wxALIGN_LEFT, BORDER_SIZE); sizer->Add(m_enabled, 0, wxALL | wxALIGN_LEFT, BORDER_SIZE);
m_enabled->SetSelection(enabled ? 1 : 0); m_enabled->SetSelection(enabled ? 1 : 0);
wxStaticText* hostnameLabel = new wxStaticText(this, -1, _("Hostname")); wxStaticText* addressLabel = new wxStaticText(this, -1, _("Address"));
sizer->Add(hostnameLabel, 0, wxALL | wxALIGN_LEFT, BORDER_SIZE); sizer->Add(addressLabel, 0, wxALL | wxALIGN_LEFT, BORDER_SIZE);
m_hostname = new wxTextCtrl(this, -1, hostname, wxDefaultPosition, wxSize(CONTROL_WIDTH1, -1)); m_address = new wxTextCtrl(this, -1, address, wxDefaultPosition, wxSize(CONTROL_WIDTH1, -1));
sizer->Add(m_hostname, 0, wxALL | wxALIGN_LEFT, BORDER_SIZE); sizer->Add(m_address, 0, wxALL | wxALIGN_LEFT, BORDER_SIZE);
wxStaticText* portLabel = new wxStaticText(this, -1, _("Port")); wxStaticText* portLabel = new wxStaticText(this, -1, _("Port"));
sizer->Add(portLabel, 0, wxALL | wxALIGN_LEFT, BORDER_SIZE); sizer->Add(portLabel, 0, wxALL | wxALIGN_LEFT, BORDER_SIZE);
@ -75,8 +75,8 @@ bool CDPRSSet::Validate()
if (n == wxNOT_FOUND) if (n == wxNOT_FOUND)
return false; return false;
wxString hostname = m_hostname->GetValue(); wxString address = m_address->GetValue();
if (hostname.IsEmpty()) if (address.IsEmpty())
return true; return true;
unsigned int port = getPort(); unsigned int port = getPort();
@ -99,9 +99,9 @@ bool CDPRSSet::getEnabled() const
return c == 1; return c == 1;
} }
wxString CDPRSSet::getHostname() const wxString CDPRSSet::getAddress() const
{ {
return m_hostname->GetValue(); return m_address->GetValue();
} }
unsigned int CDPRSSet::getPort() const unsigned int CDPRSSet::getPort() const

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2010 by Jonathan Naylor G4KLX * Copyright (C) 2010,2018,2020 by Jonathan Naylor G4KLX
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -25,19 +25,19 @@
class CDPRSSet : public wxPanel { class CDPRSSet : public wxPanel {
public: public:
CDPRSSet(wxWindow* parent, int id, const wxString& title, bool enabled, const wxString& hostname, unsigned int port); CDPRSSet(wxWindow* parent, int id, const wxString& title, bool enabled, const wxString& address, unsigned int port);
virtual ~CDPRSSet(); virtual ~CDPRSSet();
virtual bool Validate(); virtual bool Validate();
virtual bool getEnabled() const; virtual bool getEnabled() const;
virtual wxString getHostname() const; virtual wxString getAddress() const;
virtual unsigned int getPort() const; virtual unsigned int getPort() const;
private: private:
wxString m_title; wxString m_title;
wxChoice* m_enabled; wxChoice* m_enabled;
wxTextCtrl* m_hostname; wxTextCtrl* m_address;
CPortTextCtrl* m_port; CPortTextCtrl* m_port;
}; };

114
GUICommon/GPSDSet.cpp Normal file
View file

@ -0,0 +1,114 @@
/*
* Copyright (C) 2018,2020 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 "GPSDSet.h"
const unsigned int CONTROL_WIDTH1 = 130U;
const unsigned int CONTROL_WIDTH2 = 80U;
const unsigned int ADDRESS_LENGTH = 15U;
const unsigned int PORT_LENGTH = 5U;
const unsigned int BORDER_SIZE = 5U;
CGPSDSet::CGPSDSet(wxWindow* parent, int id, const wxString& title, bool enabled, const wxString& address, const wxString& port) :
wxPanel(parent, id),
m_title(title),
m_enabled(NULL),
m_address(NULL),
m_port(NULL)
{
wxFlexGridSizer* sizer = new wxFlexGridSizer(2);
wxStaticText* enabledLabel = new wxStaticText(this, -1, _("Mobile GPS"));
sizer->Add(enabledLabel, 0, wxALL | wxALIGN_RIGHT, BORDER_SIZE);
m_enabled = new wxChoice(this, -1, wxDefaultPosition, wxSize(CONTROL_WIDTH1, -1));
m_enabled->Append(_("Disabled"));
m_enabled->Append(_("Enabled"));
sizer->Add(m_enabled, 0, wxALL | wxALIGN_LEFT, BORDER_SIZE);
m_enabled->SetSelection(enabled ? 1 : 0);
wxStaticText* addressLabel = new wxStaticText(this, -1, _("Address"));
sizer->Add(addressLabel, 0, wxALL | wxALIGN_RIGHT, BORDER_SIZE);
m_address = new CAddressTextCtrl(this, -1, address, wxDefaultPosition, wxSize(CONTROL_WIDTH1, -1));
m_address->SetMaxLength(ADDRESS_LENGTH);
sizer->Add(m_address, 0, wxALL | wxALIGN_LEFT, BORDER_SIZE);
wxStaticText* portLabel = new wxStaticText(this, -1, _("Port"));
sizer->Add(portLabel, 0, wxALL | wxALIGN_RIGHT, BORDER_SIZE);
m_port = new CPortTextCtrl(this, -1, port, wxDefaultPosition, wxSize(CONTROL_WIDTH2, -1));
m_port->SetMaxLength(PORT_LENGTH);
sizer->Add(m_port, 0, wxALL | wxALIGN_LEFT, BORDER_SIZE);
SetAutoLayout(true);
SetSizer(sizer);
}
CGPSDSet::~CGPSDSet()
{
}
bool CGPSDSet::Validate()
{
if (m_enabled->GetCurrentSelection() == wxNOT_FOUND)
return false;
wxString address = getAddress();
if (address.IsEmpty()) {
wxMessageDialog dialog(this, _("The Mobile GPS Address is not valid"), m_title + _(" Error"), wxICON_ERROR);
dialog.ShowModal();
return false;
}
unsigned long port;
getPort().ToULong(&port);
if (port == 0UL || port > 65535UL) {
wxMessageDialog dialog(this, _("The Mobile GPS Port is not valid"), m_title + _(" Error"), wxICON_ERROR);
dialog.ShowModal();
return false;
}
return true;
}
bool CGPSDSet::getEnabled() const
{
int c = m_enabled->GetCurrentSelection();
if (c == wxNOT_FOUND)
return false;
return c == 1;
}
wxString CGPSDSet::getAddress() const
{
return m_address->GetValue();
}
wxString CGPSDSet::getPort() const
{
return m_port->GetValue();
}

46
GUICommon/GPSDSet.h Normal file
View file

@ -0,0 +1,46 @@
/*
* Copyright (C) 2018,2020 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 GPSDSet_H
#define GPSDSet_H
#include "AddressTextCtrl.h"
#include "PortTextCtrl.h"
#include "Defs.h"
#include <wx/wx.h>
class CGPSDSet: public wxPanel {
public:
CGPSDSet(wxWindow* parent, int id, const wxString& title, bool enabled, const wxString& address, const wxString& port);
virtual ~CGPSDSet();
virtual bool Validate();
virtual bool getEnabled() const;
virtual wxString getAddress() const;
virtual wxString getPort() const;
private:
wxString m_title;
wxChoice* m_enabled;
CAddressTextCtrl* m_address;
CPortTextCtrl* m_port;
};
#endif

View file

@ -22,29 +22,29 @@
<ProjectGuid>{02D03515-0BBE-4553-8C40-566A597478F8}</ProjectGuid> <ProjectGuid>{02D03515-0BBE-4553-8C40-566A597478F8}</ProjectGuid>
<RootNamespace>GUICommon</RootNamespace> <RootNamespace>GUICommon</RootNamespace>
<Keyword>Win32Proj</Keyword> <Keyword>Win32Proj</Keyword>
<WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion> <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType> <ConfigurationType>StaticLibrary</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType> <ConfigurationType>StaticLibrary</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType> <ConfigurationType>StaticLibrary</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType> <ConfigurationType>StaticLibrary</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
@ -77,6 +77,10 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<OutDir>$(SolutionDir)$(Configuration)\</OutDir> <OutDir>$(SolutionDir)$(Configuration)\</OutDir>
<IntDir>$(Configuration)\</IntDir> <IntDir>$(Configuration)\</IntDir>
<IncludePath>$(WXWIN)\include;$(WXWIN)\lib\vc_dll\mswu;$(IncludePath)</IncludePath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<IncludePath>$(WXWIN)\include;$(WXWIN)\lib\vc_x64_dll\mswu;$(IncludePath)</IncludePath>
</PropertyGroup> </PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile> <ClCompile>
@ -139,6 +143,7 @@
<ClCompile Include="DExtraSet.cpp" /> <ClCompile Include="DExtraSet.cpp" />
<ClCompile Include="DPlusSet.cpp" /> <ClCompile Include="DPlusSet.cpp" />
<ClCompile Include="DPRSSet.cpp" /> <ClCompile Include="DPRSSet.cpp" />
<ClCompile Include="GPSDSet.cpp" />
<ClCompile Include="PortTextCtrl.cpp" /> <ClCompile Include="PortTextCtrl.cpp" />
<ClCompile Include="RemoteSet.cpp" /> <ClCompile Include="RemoteSet.cpp" />
<ClCompile Include="RepeaterDataSet.cpp" /> <ClCompile Include="RepeaterDataSet.cpp" />
@ -155,6 +160,7 @@
<ClInclude Include="DExtraSet.h" /> <ClInclude Include="DExtraSet.h" />
<ClInclude Include="DPlusSet.h" /> <ClInclude Include="DPlusSet.h" />
<ClInclude Include="DPRSSet.h" /> <ClInclude Include="DPRSSet.h" />
<ClInclude Include="GPSDSet.h" />
<ClInclude Include="PortTextCtrl.h" /> <ClInclude Include="PortTextCtrl.h" />
<ClInclude Include="RemoteSet.h" /> <ClInclude Include="RemoteSet.h" />
<ClInclude Include="RepeaterDataSet.h" /> <ClInclude Include="RepeaterDataSet.h" />

View file

@ -32,6 +32,9 @@
<ClCompile Include="DPRSSet.cpp"> <ClCompile Include="DPRSSet.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="GPSDSet.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="PortTextCtrl.cpp"> <ClCompile Include="PortTextCtrl.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
@ -76,6 +79,9 @@
<ClInclude Include="DPRSSet.h"> <ClInclude Include="DPRSSet.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="GPSDSet.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="PortTextCtrl.h"> <ClInclude Include="PortTextCtrl.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>

View file

@ -1,14 +1,20 @@
OBJECTS = AddressTextCtrl.o CallsignTextCtrl.o DCSSet.o DescriptionTextCtrl.o DExtraSet.o DPlusSet.o DPRSSet.o PortTextCtrl.o RemoteSet.o \ OBJECTS = AddressTextCtrl.o CallsignTextCtrl.o DCSSet.o DescriptionTextCtrl.o DExtraSet.o DPlusSet.o DPRSSet.o GPSDSet.o PortTextCtrl.o RemoteSet.o \
RepeaterDataSet.o RepeaterInfoSet.o RestrictedTextCtrl.o StarNetSet.o XLXSet.o RepeaterDataSet.o RepeaterInfoSet.o RestrictedTextCtrl.o StarNetSet.o XLXSet.o
.PHONY: all
all: GUICommon.a all: GUICommon.a
GUICommon.a: $(OBJECTS) GUICommon.a: $(OBJECTS) ../Common/Common.a
$(AR) rcs GUICommon.a $(OBJECTS) $(AR) rcs GUICommon.a $(OBJECTS)
-include $(OBJECTS:.o=.d)
%.o: %.cpp %.o: %.cpp
$(CXX) $(CFLAGS) -I../Common -c -o $@ $< $(CXX) $(CFLAGS) -I../Common -c -o $@ $<
$(CXX) -MM $(CFLAGS) -I../Common $< > $*.d
.PHONY: clean
clean: clean:
$(RM) GUICommon.a *.o *.d *.bak *~ $(RM) GUICommon.a *.o *.d *.bak *~
../Common/Common.a:

View file

@ -20,6 +20,8 @@
#include "XLXSet.h" #include "XLXSet.h"
#include "Defs.h" #include "Defs.h"
#include <wx/url.h>
// TODO F4FXL try to figure out why below symbols are not found under ubuntu // TODO F4FXL try to figure out why below symbols are not found under ubuntu
//#include <wx/url.h> //#include <wx/url.h>
@ -34,11 +36,10 @@ BEGIN_EVENT_TABLE(CXLXSet, wxPanel)
END_EVENT_TABLE() END_EVENT_TABLE()
CXLXSet::CXLXSet(wxWindow* parent, int id, const wxString& title, bool xlxEnabled, bool xlxOverrideLocal, const wxString& xlxHostsFileUrl) : CXLXSet::CXLXSet(wxWindow* parent, int id, const wxString& title, bool xlxEnabled, const wxString& xlxHostsFileUrl) :
wxPanel(parent, id), wxPanel(parent, id),
m_title(title), m_title(title),
m_xlxEnabled(NULL), m_xlxEnabled(NULL),
m_xlxOverrideLocal(NULL),
m_xlxHostsFileUrl(NULL) m_xlxHostsFileUrl(NULL)
{ {
wxFlexGridSizer* sizer = new wxFlexGridSizer(2); wxFlexGridSizer* sizer = new wxFlexGridSizer(2);
@ -52,15 +53,6 @@ m_xlxHostsFileUrl(NULL)
sizer->Add(m_xlxEnabled, 0, wxALL | wxALIGN_LEFT, BORDER_SIZE); sizer->Add(m_xlxEnabled, 0, wxALL | wxALIGN_LEFT, BORDER_SIZE);
m_xlxEnabled->SetSelection(xlxEnabled ? 1 : 0); m_xlxEnabled->SetSelection(xlxEnabled ? 1 : 0);
wxStaticText* xlxOverrideLocalLabel = new wxStaticText(this, -1, _("Override local hosts files"));
sizer->Add(xlxOverrideLocalLabel, 0, wxALL | wxALIGN_RIGHT, BORDER_SIZE);
m_xlxOverrideLocal = new wxChoice(this, CHOICE_ENABLED, wxDefaultPosition, wxSize(CONTROL_WIDTH, -1));
m_xlxOverrideLocal->Append(_("No"));
m_xlxOverrideLocal->Append(_("Yes"));
sizer->Add(m_xlxOverrideLocal, 0, wxALL | wxALIGN_LEFT, BORDER_SIZE);
m_xlxOverrideLocal->SetSelection(xlxOverrideLocal ? 1 : 0);
wxStaticText* xlxHostsFileUrlLabel = new wxStaticText(this, -1, _("Hosts file URL")); wxStaticText* xlxHostsFileUrlLabel = new wxStaticText(this, -1, _("Hosts file URL"));
sizer->Add(xlxHostsFileUrlLabel, 0, wxALL | wxALIGN_RIGHT, BORDER_SIZE); sizer->Add(xlxHostsFileUrlLabel, 0, wxALL | wxALIGN_RIGHT, BORDER_SIZE);
@ -89,28 +81,22 @@ bool CXLXSet::Validate()
if (n == wxNOT_FOUND) if (n == wxNOT_FOUND)
return false; return false;
n = m_xlxOverrideLocal->GetCurrentSelection(); #if defined(__WINDOWS__)
if (n == wxNOT_FOUND)
return false;
// TODO F4FXL try to figure out why below symbols are not found under ubuntu // TODO F4FXL try to figure out why below symbols are not found under ubuntu
/*wxString value = m_xlxHostsFileUrl->GetValue(); wxString value = m_xlxHostsFileUrl->GetValue();
wxURL url(value); wxURL url(value);
if (url.GetError() != wxURL_NOERR) if (url.GetError() == wxURL_NOERR)
return false;*/
return true; return true;
}
bool CXLXSet::getXLXOverrideLocal() const wxMessageDialog dialog(this, _("The XLX host file URL is not valid"), m_title + _(" Error"), wxICON_ERROR);
{ dialog.ShowModal();
int c = m_xlxEnabled->GetCurrentSelection();
if (c == wxNOT_FOUND)
return false; return false;
#else
return c == 1; return true;
#endif
} }
bool CXLXSet::getXLXEnabled() const bool CXLXSet::getXLXEnabled() const
{ {
int c = m_xlxEnabled->GetCurrentSelection(); int c = m_xlxEnabled->GetCurrentSelection();
@ -124,13 +110,16 @@ wxString CXLXSet::getXLXHostsFileUrl() const
{ {
wxString value = m_xlxHostsFileUrl->GetValue(); wxString value = m_xlxHostsFileUrl->GetValue();
#if defined(__WINDOWS__)
// TODO F4FXL try to figure out why below symbols are not found under ubuntu // TODO F4FXL try to figure out why below symbols are not found under ubuntu
//wxURL url(value); wxURL url(value);
//if (url.GetError() == wxURL_NOERR) if (url.GetError() == wxURL_NOERR)
// return value; return value;
return wxEmptyString; return wxEmptyString;
#else
return value;
#endif
} }
void CXLXSet::onEnabled(wxCommandEvent &event) void CXLXSet::onEnabled(wxCommandEvent &event)

View file

@ -23,13 +23,12 @@
class CXLXSet : public wxPanel { class CXLXSet : public wxPanel {
public: public:
CXLXSet(wxWindow* parent, int id, const wxString& title, bool xlxEnabled, bool xlxOverrideLocal, const wxString& xlxHostsFileUrl); CXLXSet(wxWindow* parent, int id, const wxString& title, bool xlxEnabled, const wxString& xlxHostsFileUrl);
virtual ~CXLXSet(); virtual ~CXLXSet();
virtual bool Validate(); virtual bool Validate();
virtual bool getXLXEnabled() const; virtual bool getXLXEnabled() const;
virtual bool getXLXOverrideLocal() const;
virtual wxString getXLXHostsFileUrl() const; virtual wxString getXLXHostsFileUrl() const;
virtual void onEnabled(wxCommandEvent& event); virtual void onEnabled(wxCommandEvent& event);
@ -37,7 +36,6 @@ public:
private: private:
wxString m_title; wxString m_title;
wxChoice* m_xlxEnabled; wxChoice* m_xlxEnabled;
wxChoice* m_xlxOverrideLocal;
wxTextCtrl* m_xlxHostsFileUrl; wxTextCtrl* m_xlxHostsFileUrl;
DECLARE_EVENT_TABLE() DECLARE_EVENT_TABLE()

145
Makefile
View file

@ -1,76 +1,111 @@
export DATADIR := "/usr/share/ircddbgateway" export BUILD ?= debug
export LOGDIR := "/var/log" ifeq ($(TARGET), opendv)
export CONFDIR := "/etc" export DATADIR ?= /usr/share/opendv
export BINDIR := "/usr/bin" export LOGDIR ?= /var/log/opendv
export CONFDIR ?= /etc
export BINDIR ?= /usr/sbin
else
export DATADIR ?= /usr/share/ircddbgateway
export LOGDIR ?= /var/log
export CONFDIR ?= /etc
export BINDIR ?= /usr/bin
endif
# Add -DDCS_LINK to the end of the CFLAGS line below to add DCS linking to StarNet
# Add -DDEXTRA_LINK to the end of the CFLAGS line below to add DExtra linking to StarNet
# Add -DUSE_GPS to the end of the CFLAGS line to enable the use of gpsd, and add -lgps to
# end of the LIBS line.
DEBUGFLAGS := -g -D_DEBUG
RELEASEFLAGS := -DNDEBUG -DwxDEBUG_LEVEL=0
export CXX := $(shell wx-config --cxx) export CXX := $(shell wx-config --cxx)
export CFLAGS := -O2 -Wall $(shell wx-config --cxxflags) -DLOG_DIR='$(LOGDIR)' -DCONF_DIR='$(CONFDIR)' -DDATA_DIR='$(DATADIR)' export CFLAGS := -O2 -Wall $(shell wx-config --cxxflags) -DLOG_DIR='"$(LOGDIR)"' -DCONF_DIR='"$(CONFDIR)"' -DDATA_DIR='"$(DATADIR)"'
export GUILIBS := $(shell wx-config --libs adv,core,base) ifeq ($(BUILD), debug)
export LIBS := $(shell wx-config --libs base) export CFLAGS := $(CFLAGS) $(DEBUGFLAGS)
else ifeq ($(BUILD), release)
export CFLAGS := $(CFLAGS) $(RELEASEFLAGS)
endif
export LIBS := $(shell wx-config --libs base,net)
export LDFLAGS := export LDFLAGS :=
all: ircDDBGateway/ircddbgatewayd ircDDBGatewayConfig/ircddbgatewayconfig APRSTransmit/aprstransmitd RemoteControl/remotecontrold \ .PHONY: all
all: ircDDBGateway/ircddbgatewayd APRSTransmit/aprstransmitd RemoteControl/remotecontrold \
StarNetServer/starnetserverd TextTransmit/texttransmitd TimerControl/timercontrold TimeServer/timeserverd VoiceTransmit/voicetransmitd StarNetServer/starnetserverd TextTransmit/texttransmitd TimerControl/timercontrold TimeServer/timeserverd VoiceTransmit/voicetransmitd
ircDDBGateway/ircddbgatewayd: Common/Common.a ircDDB/IRCDDB.a ircDDBGateway/ircddbgatewayd: Common/Common.a ircDDB/IRCDDB.a force
make -C ircDDBGateway $(MAKE) -C ircDDBGateway
ircDDBGatewayConfig/ircddbgatewayconfig: GUICommon/GUICommon.a Common/Common.a APRSTransmit/aprstransmitd: Common/Common.a force
make -C ircDDBGatewayConfig $(MAKE) -C APRSTransmit
APRSTransmit/aprstransmitd: Common/Common.a RemoteControl/remotecontrold: Common/Common.a force
make -C APRSTransmit $(MAKE) -C RemoteControl
RemoteControl/remotecontrold: Common/Common.a StarNetServer/starnetserverd: Common/Common.a ircDDB/IRCDDB.a force
make -C RemoteControl $(MAKE) -C StarNetServer
StarNetServer/starnetserverd: Common/Common.a ircDDB/IRCDDB.a TextTransmit/texttransmitd: Common/Common.a force
make -C StarNetServer $(MAKE) -C TextTransmit
TextTransmit/texttransmitd: Common/Common.a TimerControl/timercontrold: Common/Common.a force
make -C TextTransmit $(MAKE) -C TimerControl
TimerControl/timercontrold: Common/Common.a GUICommon/GUICommon.a TimeServer/timeserverd: Common/Common.a force
make -C TimerControl $(MAKE) -C TimeServer
TimeServer/timeserverd: Common/Common.a GUICommon/GUICommon.a VoiceTransmit/voicetransmitd: Common/Common.a force
make -C TimeServer $(MAKE) -C VoiceTransmit
VoiceTransmit/voicetransmitd: Common/Common.a Common/Common.a: force
make -C VoiceTransmit $(MAKE) -C Common
GUICommon/GUICommon.a: ircDDB/IRCDDB.a: force
make -C GUICommon $(MAKE) -C ircDDB
Common/Common.a: .PHONY: installdirs
make -C Common installdirs: force
/bin/mkdir -p $(DESTDIR)$(DATADIR) $(DESTDIR)$(LOGDIR) $(DESTDIR)$(CONFDIR) $(DESTDIR)$(BINDIR)
ircDDB/IRCDDB.a: .PHONY: install
make -C ircDDB install: all installdirs
ifeq ($(TARGET), opendv)
useradd --user-group -M --system opendv --shell /bin/false || true
install: all # Add the opendv user to the audio group so that it can open audio
make -C Data install # devices when using the audio based drivers such as the Sound Card
make -C APRSTransmit install # one. Maybe this should be moved to DStarRepeater instead ...
make -C ircDDBGateway install usermod --groups audio --append opendv || true
make -C RemoteControl install usermod --groups dialout --append opendv || true
make -C StarNetServer install usermod --groups gpio --append opendv || true
make -C TextTransmit install mkdir /var/log/opendv || true
make -C TimerControl install chown opendv:opendv /var/log/opendv
make -C TimeServer install endif
make -C VoiceTransmit install $(MAKE) -C Data install
make -C ircDDBGatewayConfig install $(MAKE) -C APRSTransmit install
$(MAKE) -C ircDDBGateway install
$(MAKE) -C RemoteControl install
$(MAKE) -C StarNetServer install
$(MAKE) -C TextTransmit install
$(MAKE) -C TimerControl install
$(MAKE) -C TimeServer install
$(MAKE) -C VoiceTransmit install
.PHONY: clean
clean: clean:
make -C Common clean $(MAKE) -C Common clean
make -C ircDDB clean $(MAKE) -C ircDDB clean
make -C GUICommon clean $(MAKE) -C APRSTransmit clean
make -C APRSTransmit clean $(MAKE) -C ircDDBGateway clean
make -C ircDDBGateway clean $(MAKE) -C RemoteControl clean
make -C RemoteControl clean $(MAKE) -C StarNetServer clean
make -C StarNetServer clean $(MAKE) -C TextTransmit clean
make -C TextTransmit clean $(MAKE) -C TimerControl clean
make -C TimerControl clean $(MAKE) -C TimeServer clean
make -C TimeServer clean $(MAKE) -C VoiceTransmit clean
make -C VoiceTransmit clean $(MAKE) -C ircDDBGatewayConfig clean
make -C ircDDBGatewayConfig clean
.PHONY: force
force :
@true

95
MakefileGUI Normal file
View file

@ -0,0 +1,95 @@
ifeq ($(TARGET), opendv)
export DATADIR := "/usr/share/opendv"
export LOGDIR := "/var/log/opendv"
export CONFDIR := "/etc"
export BINDIR := "/usr/sbin"
else
export DATADIR := "/usr/share/ircddbgateway"
export LOGDIR := "/var/log"
export CONFDIR := "/etc"
export BINDIR := "/usr/bin"
endif
# Add -DDCS_LINK to the end of the CFLAGS line below to add DCS linking to StarNet
# Add -DDEXTRA_LINK to the end of the CFLAGS line below to add DExtra linking to StarNet
# Add -DUSE_GPS to the end of the CFLAGS line to enable the use of gpsd, and add -lgps to
# end of the LIBS and GUILIBS lines.
export CXX := $(shell wx-config --cxx)
export CFLAGS := -O2 -Wall $(shell wx-config --cxxflags) -DLOG_DIR='$(LOGDIR)' -DCONF_DIR='$(CONFDIR)' -DDATA_DIR='$(DATADIR)'
export GUILIBS := $(shell wx-config --libs adv,core,base)
export LIBS := $(shell wx-config --libs base,net)
export LDFLAGS :=
.PHONY: all
all: ircDDBGateway/ircddbgateway ircDDBGatewayConfig/ircddbgatewayconfig APRSTransmit/aprstransmitd RemoteControl/remotecontrol \
StarNetServer/starnetserver TextTransmit/texttransmitd TimerControl/timercontrol TimeServer/timeserver VoiceTransmit/voicetransmitd
ircDDBGateway/ircddbgateway: GUICommon/GUICommon.a Common/Common.a ircDDB/IRCDDB.a force
$(MAKE) -C ircDDBGateway -f MakefileGUI
ircDDBGatewayConfig/ircddbgatewayconfig: GUICommon/GUICommon.a Common/Common.a force
$(MAKE) -C ircDDBGatewayConfig
APRSTransmit/aprstransmitd: Common/Common.a force
$(MAKE) -C APRSTransmit
RemoteControl/remotecontrol: Common/Common.a force
$(MAKE) -C RemoteControl -f MakefileGUI
StarNetServer/starnetserver: Common/Common.a ircDDB/IRCDDB.a force
$(MAKE) -C StarNetServer -f MakefileGUI
TextTransmit/texttransmitd: Common/Common.a force
$(MAKE) -C TextTransmit
TimerControl/timercontrol: Common/Common.a GUICommon/GUICommon.a force
$(MAKE) -C TimerControl -f MakefileGUI
TimeServer/timeserver: Common/Common.a GUICommon/GUICommon.a force
$(MAKE) -C TimeServer -f MakefileGUI
VoiceTransmit/voicetransmitd: Common/Common.a force
$(MAKE) -C VoiceTransmit
GUICommon/GUICommon.a: force
$(MAKE) -C GUICommon
Common/Common.a: force
$(MAKE) -C Common
ircDDB/IRCDDB.a: force
$(MAKE) -C ircDDB
.PHONY: install
install: all
$(MAKE) -C Data install
$(MAKE) -C APRSTransmit install
$(MAKE) -C ircDDBGateway -f MakefileGUI install
$(MAKE) -C RemoteControl -f MakefileGUI install
$(MAKE) -C StarNetServer -f MakefileGUI install
$(MAKE) -C TextTransmit install
$(MAKE) -C TimerControl -f MakefileGUI install
$(MAKE) -C TimeServer -f MakefileGUI install
$(MAKE) -C VoiceTransmit install
$(MAKE) -C ircDDBGatewayConfig install
.PHONY: clean
clean:
$(MAKE) -C Common clean
$(MAKE) -C ircDDB clean
$(MAKE) -C GUICommon clean
$(MAKE) -C APRSTransmit clean
$(MAKE) -C ircDDBGateway -f MakefileGUI clean
$(MAKE) -C RemoteControl -f MakefileGUI clean
$(MAKE) -C StarNetServer -f MakefileGUI clean
$(MAKE) -C TextTransmit clean
$(MAKE) -C TimerControl -f MakefileGUI clean
$(MAKE) -C TimeServer -f MakefileGUI clean
$(MAKE) -C VoiceTransmit clean
$(MAKE) -C ircDDBGatewayConfig clean
.PHONY: force
force:
true;

View file

@ -10,7 +10,7 @@ This is the ircDDB Gateway. It allows a D-Star Repeater to interface into callsi
* XLX reflectors. * XLX reflectors.
* CCS7 routing. * CCS7 routing.
* D-RATS data transfers. * D-RATS data transfers.
* Gateway DPRS data to aprs.fi. * Gateway DPRS data to APRS-IS.
* Full multi lingual text and voice announcements. * Full multi lingual text and voice announcements.
* DTMF or UR call control. * DTMF or UR call control.
* Remote control interface. * Remote control interface.
@ -22,3 +22,24 @@ There are many external programs that allow for inserting voice or text messages
They all build on 32-bit and 64-bit Linux as well as on Windows using Visual Studio 2017 on x86 and x64. They all build on 32-bit and 64-bit Linux as well as on Windows using Visual Studio 2017 on x86 and x64.
This software is licenced under the GPL v2. This software is licenced under the GPL v2.
# Build and installing
## Regular build
```shell
make
make -f MakefileGUI #only required if you want to build the GUI programs
sudo make install
```
## Drop-in replacement for dl5di OpenDV packages
This will conpile the program to be used as a drop in replacement for the no longer maintained DL5DI OpenDV packages. Systemd files to run ircddbgatewayd as daemon will also be installed.
```shell
export TARGET=opendv
make
make -f MakefileGUI #only required if you want to build the GUI programs
sudo make install
```
Now you should edit the configuration in the file /etc/ircddbgateway to match your needs.
```shell
sudo systemctl enable ircddbgatewayd.service #enable service
sudo service ircddbgatewayd start
```

View file

@ -1,17 +1,24 @@
OBJECTS = RemoteControlAppD.o RemoteControlCallsignData.o RemoteControlConfig.o RemoteControlLinkData.o RemoteControlRemoteControlHandler.o \ OBJECTS = RemoteControlAppD.o RemoteControlCallsignData.o RemoteControlConfig.o RemoteControlLinkData.o RemoteControlRemoteControlHandler.o \
RemoteControlRepeaterData.o RemoteControlStarNetGroup.o RemoteControlStarNetUser.o RemoteControlRepeaterData.o RemoteControlStarNetGroup.o RemoteControlStarNetUser.o
.PHONY: all
all: remotecontrold all: remotecontrold
remotecontrold: $(OBJECTS) remotecontrold: $(OBJECTS) ../Common/Common.a
$(CXX) $(OBJECTS) ../Common/Common.a $(LDFLAGS) $(LIBS) -o remotecontrold $(CXX) $(OBJECTS) ../Common/Common.a $(LDFLAGS) $(LIBS) -o remotecontrold
-include $(OBJECTS:.o=.d)
%.o: %.cpp %.o: %.cpp
$(CXX) -DwxUSE_GUI=0 $(CFLAGS) -I../Common -c -o $@ $< $(CXX) -DwxUSE_GUI=0 $(CFLAGS) -I../Common -c -o $@ $<
$(CXX) -MM -DwxUSE_GUI=0 $(CFLAGS) -I../Common $< > $*.d
.PHONY: install
install: install:
install -g bin -o root -m 0775 remotecontrold $(BINDIR) install -g root -o root -m 0755 remotecontrold $(DESTDIR)$(BINDIR)
.PHONY: clean
clean: clean:
$(RM) remotecontrold *.o *.d *.bak *~ $(RM) remotecontrold *.o *.d *.bak *~
../Common/Common.a:

26
RemoteControl/MakefileGUI Normal file
View file

@ -0,0 +1,26 @@
OBJECTS = RemoteControlApp.o RemoteControlCallsignData.o RemoteControlConfig.o RemoteControlFrame.o RemoteControlLinkData.o \
RemoteControlPreferences.o RemoteControlRemoteControlHandler.o RemoteControlRemoteSet.o RemoteControlRepeaterData.o \
RemoteControlRepeaterPanel.o RemoteControlStarNetGroup.o RemoteControlStarNetPanel.o RemoteControlStarNetUser.o
.PHONY: all
all: remotecontrol
remotecontrol: $(OBJECTS) ../GUICommon/GUICommon.a ../Common/Common.a
$(CXX) $(OBJECTS) ../GUICommon/GUICommon.a ../Common/Common.a $(LDFLAGS) $(GUILIBS) -o remotecontrol
-include $(OBJECTS:.o=.d)
%.o: %.cpp
$(CXX) $(CFLAGS) -I../Common -I../GUICommon -c -o $@ $<
$(CXX) -MM $(CFLAGS) -I../Common -I../GUICommon $< > $*.d
.PHONY: install
install:
install -g bin -o root -m 0775 remotecontrol $(BINDIR)
.PHONY: clean
clean:
$(RM) remotecontrol *.o *.d *.bak *~
../GUICommon/GUICommon.a:
../Common/Common.a:

View file

@ -22,29 +22,29 @@
<ProjectGuid>{F7756875-1F58-4006-AD55-5C963AB682C0}</ProjectGuid> <ProjectGuid>{F7756875-1F58-4006-AD55-5C963AB682C0}</ProjectGuid>
<RootNamespace>RemoteControl</RootNamespace> <RootNamespace>RemoteControl</RootNamespace>
<Keyword>Win32Proj</Keyword> <Keyword>Win32Proj</Keyword>
<WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion> <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
@ -80,9 +80,11 @@
<OutDir>$(SolutionDir)$(Configuration)\</OutDir> <OutDir>$(SolutionDir)$(Configuration)\</OutDir>
<IntDir>$(Configuration)\</IntDir> <IntDir>$(Configuration)\</IntDir>
<LinkIncremental>false</LinkIncremental> <LinkIncremental>false</LinkIncremental>
<IncludePath>$(WXWIN)\include;$(WXWIN)\lib\vc_dll\mswu;$(IncludePath)</IncludePath>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental> <LinkIncremental>false</LinkIncremental>
<IncludePath>$(WXWIN)\include;$(WXWIN)\lib\vc_x64_dll\mswu;$(IncludePath)</IncludePath>
</PropertyGroup> </PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile> <ClCompile>

View file

@ -1,16 +1,24 @@
OBJECTS = StarNetServerAppD.o StarNetServerConfig.o StarNetServerThread.o StarNetServerThreadHelper.o OBJECTS = StarNetServerAppD.o StarNetServerConfig.o StarNetServerThread.o StarNetServerThreadHelper.o
.PHONY: all
all: starnetserverd all: starnetserverd
starnetserverd: $(OBJECTS) starnetserverd: $(OBJECTS) ../Common/Common.a ../ircDDB/IRCDDB.a
$(CXX) $(OBJECTS) ../Common/Common.a ../ircDDB/IRCDDB.a $(LDFLAGS) $(LIBS) -o starnetserverd $(CXX) $(OBJECTS) ../Common/Common.a ../ircDDB/IRCDDB.a $(LDFLAGS) $(LIBS) -o starnetserverd
-include $(OBJECTS:.o=.d)
%.o: %.cpp %.o: %.cpp
$(CXX) -DwxUSE_GUI=0 $(CFLAGS) -I../Common -I../ircDDB -c -o $@ $< $(CXX) -DwxUSE_GUI=0 $(CFLAGS) -I../Common -I../ircDDB -c -o $@ $<
$(CXX) -MM -DwxUSE_GUI=0 $(CFLAGS) -I../Common -I../ircDDB $< > $*.d
.PHONY: install
install: install:
install -g bin -o root -m 0775 starnetserverd $(BINDIR) install -g root -o root -m 0755 starnetserverd $(DESTDIR)$(BINDIR)
.PHONY: clean
clean: clean:
$(RM) starnetserverd *.o *.d *.bak *~ $(RM) starnetserverd *.o *.d *.bak *~
../Common/Common.a:
../ircDDB/IRCDDB.a:

26
StarNetServer/MakefileGUI Normal file
View file

@ -0,0 +1,26 @@
OBJECTS = StarNetServerApp.o StarNetServerCallsignSet.o StarNetServerConfig.o StarNetServerFrame.o StarNetServerIrcDDBSet.o \
StarNetServerLogRedirect.o StarNetServerMiscellaneousSet.o StarNetServerPreferences.o StarNetServerThread.o \
StarNetServerThreadHelper.o
.PHONY: all
all: starnetserver
starnetserver: $(OBJECTS) ../GUICommon/GUICommon.a ../Common/Common.a
$(CXX) $(OBJECTS) ../GUICommon/GUICommon.a ../Common/Common.a ../ircDDB/IRCDDB.a $(LDFLAGS) $(GUILIBS) -o starnetserver
-include $(OBJECTS:.o=.d)
%.o: %.cpp
$(CXX) $(CFLAGS) -I../Common -I../GUICommon -I../ircDDB -c -o $@ $<
$(CXX) -MM $(CFLAGS) -I../Common -I../GUICommon -I../ircDDB $< > $*.d
.PHONY: install
install:
install -g bin -o root -m 0775 starnetserver $(BINDIR)
.PHONY: clean
clean:
$(RM) starnetserver *.o *.d *.bak *~
../GUICommon/GUICommon.a:
../Common/Common.a:

View file

@ -22,29 +22,29 @@
<ProjectGuid>{4E9989C8-80D4-4F6E-BCA1-754DCED3AF5F}</ProjectGuid> <ProjectGuid>{4E9989C8-80D4-4F6E-BCA1-754DCED3AF5F}</ProjectGuid>
<RootNamespace>StarNetServer</RootNamespace> <RootNamespace>StarNetServer</RootNamespace>
<Keyword>Win32Proj</Keyword> <Keyword>Win32Proj</Keyword>
<WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion> <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
@ -80,9 +80,11 @@
<OutDir>$(SolutionDir)$(Configuration)\</OutDir> <OutDir>$(SolutionDir)$(Configuration)\</OutDir>
<IntDir>$(Configuration)\</IntDir> <IntDir>$(Configuration)\</IntDir>
<LinkIncremental>false</LinkIncremental> <LinkIncremental>false</LinkIncremental>
<IncludePath>$(WXWIN)\include;$(WXWIN)\lib\vc_dll\mswu;$(IncludePath)</IncludePath>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental> <LinkIncremental>false</LinkIncremental>
<IncludePath>$(WXWIN)\include;$(WXWIN)\lib\vc_x64_dll\mswu;$(IncludePath)</IncludePath>
</PropertyGroup> </PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile> <ClCompile>

View file

@ -1,16 +1,23 @@
OBJECTS = TextTransmit.o OBJECTS = TextTransmit.o
.PHONY: all
all: texttransmitd all: texttransmitd
texttransmitd: $(OBJECTS) texttransmitd: $(OBJECTS) ../Common/Common.a
$(CXX) $(OBJECTS) ../Common/Common.a $(LDFLAGS) $(LIBS) -o texttransmitd $(CXX) $(OBJECTS) ../Common/Common.a $(LDFLAGS) $(LIBS) -o texttransmitd
-include $(OBJECTS:.o=.d)
%.o: %.cpp %.o: %.cpp
$(CXX) -DwxUSE_GUI=0 $(CFLAGS) -I../Common -c -o $@ $< $(CXX) -DwxUSE_GUI=0 $(CFLAGS) -I../Common -c -o $@ $<
$(CXX) -MM -DwxUSE_GUI=0 $(CFLAGS) -I../Common $< > $*.d
.PHONY: install
install: install:
install -g bin -o root -m 0775 texttransmitd $(BINDIR) install -g root -o root -m 0755 texttransmitd $(DESTDIR)$(BINDIR)
.PHONY: clean
clean: clean:
$(RM) texttransmitd *.o *.d *.bak *~ $(RM) texttransmitd *.o *.d *.bak *~
../Common/Common.a:

View file

@ -22,29 +22,29 @@
<ProjectGuid>{AFB9BCE5-0D37-4707-93A1-DA14E39F2773}</ProjectGuid> <ProjectGuid>{AFB9BCE5-0D37-4707-93A1-DA14E39F2773}</ProjectGuid>
<RootNamespace>TextTransmit</RootNamespace> <RootNamespace>TextTransmit</RootNamespace>
<Keyword>Win32Proj</Keyword> <Keyword>Win32Proj</Keyword>
<WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion> <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
@ -80,9 +80,11 @@
<OutDir>$(SolutionDir)$(Configuration)\</OutDir> <OutDir>$(SolutionDir)$(Configuration)\</OutDir>
<IntDir>$(Configuration)\</IntDir> <IntDir>$(Configuration)\</IntDir>
<LinkIncremental>false</LinkIncremental> <LinkIncremental>false</LinkIncremental>
<IncludePath>$(WXWIN)\include;$(WXWIN)\lib\vc_dll\mswu;$(IncludePath)</IncludePath>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental> <LinkIncremental>false</LinkIncremental>
<IncludePath>$(WXWIN)\include;$(WXWIN)\lib\vc_x64_dll\mswu;$(IncludePath)</IncludePath>
</PropertyGroup> </PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile> <ClCompile>

View file

@ -1,16 +1,23 @@
OBJECTS = TimeServerD.o TimeServerConfig.o TimeServerThread.o TimeServerThreadHelper.o OBJECTS = TimeServerD.o TimeServerConfig.o TimeServerThread.o TimeServerThreadHelper.o
.PHONY: all
all: timeserverd all: timeserverd
timeserverd: $(OBJECTS) timeserverd: $(OBJECTS) ../Common/Common.a
$(CXX) $(OBJECTS) ../Common/Common.a $(LDFLAGS) $(LIBS) -o timeserverd $(CXX) $(OBJECTS) ../Common/Common.a $(LDFLAGS) $(LIBS) -o timeserverd
-include $(OBJECTS:.o=.d)
%.o: %.cpp %.o: %.cpp
$(CXX) -DwxUSE_GUI=0 $(CFLAGS) -I../Common -c -o $@ $< $(CXX) -DwxUSE_GUI=0 $(CFLAGS) -I../Common -c -o $@ $<
$(CXX) -MM -DwxUSE_GUI=0 $(CFLAGS) -I../Common $< > $*.d
.PHONY: install
install: install:
install -g bin -o root -m 0775 timeserverd $(BINDIR) install -g root -o root -m 0755 timeserverd $(DESTDIR)$(BINDIR)
.PHONY: clean
clean: clean:
$(RM) timeserverd *.o *.d *.bak *~ $(RM) timeserverd *.o *.d *.bak *~
../Common/Common.a:

25
TimeServer/MakefileGUI Normal file
View file

@ -0,0 +1,25 @@
OBJECTS = TimeServerApp.o TimeServerAnnouncementsSet.o TimeServerConfig.o TimeServerFrame.o TimeServerGatewaySet.o TimeServerLogRedirect.o \
TimeServerPreferences.o TimeServerThread.o TimeServerThreadHelper.o
.PHONY: all
all: timeserver
timeserver: $(OBJECTS) ../GUICommon/GUICommon.a ../Common/Common.a
$(CXX) $(OBJECTS) ../GUICommon/GUICommon.a ../Common/Common.a $(LDFLAGS) $(GUILIBS) -o timeserver
-include $(OBJECTS:.o=.d)
%.o: %.cpp
$(CXX) $(CFLAGS) -I../Common -I../GUICommon -c -o $@ $<
$(CXX) -MM $(CFLAGS) -I../Common -I../GUICommon $< > $*.d
.PHONY: install
install:
install -g bin -o root -m 0775 timeserver $(BINDIR)
.PHONY: clean
clean:
$(RM) timeserver *.o *.d *.bak *~
../GUICommon/GUICommon.a:
../Common/Common.a:

View file

@ -22,29 +22,29 @@
<ProjectGuid>{99F336A5-6E33-4919-BF75-D6D8BA26345E}</ProjectGuid> <ProjectGuid>{99F336A5-6E33-4919-BF75-D6D8BA26345E}</ProjectGuid>
<RootNamespace>TimeServer</RootNamespace> <RootNamespace>TimeServer</RootNamespace>
<Keyword>Win32Proj</Keyword> <Keyword>Win32Proj</Keyword>
<WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion> <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
@ -80,9 +80,11 @@
<OutDir>$(SolutionDir)$(Configuration)\</OutDir> <OutDir>$(SolutionDir)$(Configuration)\</OutDir>
<IntDir>$(Configuration)\</IntDir> <IntDir>$(Configuration)\</IntDir>
<LinkIncremental>false</LinkIncremental> <LinkIncremental>false</LinkIncremental>
<IncludePath>$(WXWIN)\include;$(WXWIN)\lib\vc_dll\mswu;$(IncludePath)</IncludePath>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental> <LinkIncremental>false</LinkIncremental>
<IncludePath>$(WXWIN)\include;$(WXWIN)\lib\vc_x64_dll\mswu;$(IncludePath)</IncludePath>
</PropertyGroup> </PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile> <ClCompile>

View file

@ -1,17 +1,25 @@
OBJECTS = TimerControlAppD.o TimerControlConfig.o TimerControlItemFile.o TimerControlRemoteControlHandler.o TimerControlThread.o \ OBJECTS = TimerControlAppD.o TimerControlConfig.o TimerControlItemFile.o TimerControlRemoteControlHandler.o TimerControlThread.o \
TimerControlThreadHelper.o TimerControlThreadHelper.o
.PHONY: all
all: timercontrold all: timercontrold
timercontrold: $(OBJECTS) timercontrold: $(OBJECTS) ../Common/Common.a
$(CXX) $(OBJECTS) ../Common/Common.a $(LDFLAGS) $(LIBS) -o timercontrold $(CXX) $(OBJECTS) ../Common/Common.a $(LDFLAGS) $(LIBS) -o timercontrold
-include $(OBJECTS:.o=.d)
%.o: %.cpp %.o: %.cpp
$(CXX) -DwxUSE_GUI=0 $(CFLAGS) -I../Common -c -o $@ $< $(CXX) -DwxUSE_GUI=0 $(CFLAGS) -I../Common -c -o $@ $<
$(CXX) -MM -DwxUSE_GUI=0 $(CFLAGS) -I../Common $< > $*.d
.PHONY: install
install: install:
install -g bin -o root -m 0775 timercontrold $(BINDIR) install -g root -o root -m 0755 timercontrold $(DESTDIR)$(BINDIR)
.PHONY: clean
clean: clean:
$(RM) timercontrold *.o *.d *.bak *~ $(RM) timercontrold *.o *.d *.bak *~
../Common/Common.a:

26
TimerControl/MakefileGUI Normal file
View file

@ -0,0 +1,26 @@
OBJECTS = TimerControlApp.o TimerControlConfig.o TimerControlFrame.o TimerControlItemFile.o TimerControlPreferences.o \
TimerControlRemoteControlHandler.o TimerControlRemoteSet.o TimerControlRepeaterPanel.o TimerControlThread.o \
TimerControlThreadHelper.o
.PHONY: all
all: timercontrol
timercontrol: $(OBJECTS) ../GUICommon/GUICommon.a ../Common/Common.a
$(CXX) $(OBJECTS) ../GUICommon/GUICommon.a ../Common/Common.a $(LDFLAGS) $(GUILIBS) -o timercontrol
-include $(OBJECTS:.o=.d)
%.o: %.cpp
$(CXX) $(CFLAGS) -I../Common -I../GUICommon -c -o $@ $<
$(CXX) -MM $(CFLAGS) -I../Common -I../GUICommon $< > $*.d
.PHONY: install
install:
install -g bin -o root -m 0775 timercontrol $(BINDIR)
.PHONY: clean
clean:
$(RM) timercontrol *.o *.d *.bak *~
../GUICommon/GUICommon.a:
../Common/Common.a:

View file

@ -22,29 +22,29 @@
<ProjectGuid>{68CFAB6D-AED3-4B8A-BCB3-EE4136CA00A3}</ProjectGuid> <ProjectGuid>{68CFAB6D-AED3-4B8A-BCB3-EE4136CA00A3}</ProjectGuid>
<RootNamespace>TimerControl</RootNamespace> <RootNamespace>TimerControl</RootNamespace>
<Keyword>Win32Proj</Keyword> <Keyword>Win32Proj</Keyword>
<WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion> <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
@ -80,9 +80,11 @@
<OutDir>$(SolutionDir)$(Configuration)\</OutDir> <OutDir>$(SolutionDir)$(Configuration)\</OutDir>
<IntDir>$(Configuration)\</IntDir> <IntDir>$(Configuration)\</IntDir>
<LinkIncremental>false</LinkIncremental> <LinkIncremental>false</LinkIncremental>
<IncludePath>$(WXWIN)\include;$(WXWIN)\lib\vc_dll\mswu;$(IncludePath)</IncludePath>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental> <LinkIncremental>false</LinkIncremental>
<IncludePath>$(WXWIN)\include;$(WXWIN)\lib\vc_x64_dll\mswu;$(IncludePath)</IncludePath>
</PropertyGroup> </PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile> <ClCompile>

View file

@ -1,16 +1,23 @@
OBJECTS = VoiceStore.o VoiceTransmit.o OBJECTS = VoiceStore.o VoiceTransmit.o
.PHONY: all
all: voicetransmitd all: voicetransmitd
voicetransmitd: $(OBJECTS) voicetransmitd: $(OBJECTS) ../Common/Common.a
$(CXX) $(OBJECTS) ../Common/Common.a $(LDFLAGS) $(LIBS) -o voicetransmitd $(CXX) $(OBJECTS) ../Common/Common.a $(LDFLAGS) $(LIBS) -o voicetransmitd
-include $(OBJECTS:.o=.d)
%.o: %.cpp %.o: %.cpp
$(CXX) -DwxUSE_GUI=0 $(CFLAGS) -I../Common -c -o $@ $< $(CXX) -DwxUSE_GUI=0 $(CFLAGS) -I../Common -c -o $@ $<
$(CXX) -MM -DwxUSE_GUI=0 $(CFLAGS) -I../Common $< > $*.d
.PHONY: install
install: install:
install -g bin -o root -m 0775 voicetransmitd $(BINDIR) install -g root -o root -m 0755 voicetransmitd $(DESTDIR)$(BINDIR)
.PHONY: clean
clean: clean:
$(RM) voicetransmitd *.o *.d *.bak *~ $(RM) voicetransmitd *.o *.d *.bak *~
../Common/Common.a:

View file

@ -22,29 +22,29 @@
<ProjectGuid>{27D44C4F-6849-4E15-A5BB-0B54BA296D98}</ProjectGuid> <ProjectGuid>{27D44C4F-6849-4E15-A5BB-0B54BA296D98}</ProjectGuid>
<RootNamespace>VoiceTransmit</RootNamespace> <RootNamespace>VoiceTransmit</RootNamespace>
<Keyword>Win32Proj</Keyword> <Keyword>Win32Proj</Keyword>
<WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion> <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
@ -80,9 +80,11 @@
<OutDir>$(SolutionDir)$(Configuration)\</OutDir> <OutDir>$(SolutionDir)$(Configuration)\</OutDir>
<IntDir>$(Configuration)\</IntDir> <IntDir>$(Configuration)\</IntDir>
<LinkIncremental>false</LinkIncremental> <LinkIncremental>false</LinkIncremental>
<IncludePath>$(WXWIN)\include;$(WXWIN)\lib\vc_dll\mswu;$(IncludePath)</IncludePath>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental> <LinkIncremental>false</LinkIncremental>
<IncludePath>$(WXWIN)\include;$(WXWIN)\lib\vc_x64_dll\mswu;$(IncludePath)</IncludePath>
</PropertyGroup> </PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile> <ClCompile>

View file

@ -1,14 +1,19 @@
OBJECTS = IRCClient.o IRCDDBApp.o IRCDDBClient.o IRCDDB.o IRCDDBMultiClient.o IRCMessage.o IRCMessageQueue.o IRCProtocol.o IRCReceiver.o \ OBJECTS = IRCClient.o IRCDDBApp.o IRCDDBClient.o IRCDDB.o IRCDDBMultiClient.o IRCMessage.o IRCMessageQueue.o IRCProtocol.o IRCReceiver.o \
IRCutils.o IRCutils.o
.PHONY: all
all: IRCDDB.a all: IRCDDB.a
IRCDDB.a: $(OBJECTS) IRCDDB.a: $(OBJECTS)
$(AR) rcs IRCDDB.a $(OBJECTS) $(AR) rcs IRCDDB.a $(OBJECTS)
-include $(OBJECTS:.o=.d)
%.o: %.cpp %.o: %.cpp
$(CXX) -DwxUSE_GUI=0 $(CFLAGS) -c -o $@ $< $(CXX) -DwxUSE_GUI=0 $(CFLAGS) -c -o $@ $<
$(CXX) -MM -DwxUSE_GUI=0 $(CFLAGS) $< > $*.d
.PHONY: clean
clean: clean:
$(RM) IRCDDB.a *.o *.d *.bak *~ $(RM) IRCDDB.a *.o *.d *.bak *~

View file

@ -22,29 +22,29 @@
<ProjectGuid>{276BC54D-5581-4A0C-AFD5-A5BDC947F0AD}</ProjectGuid> <ProjectGuid>{276BC54D-5581-4A0C-AFD5-A5BDC947F0AD}</ProjectGuid>
<RootNamespace>ircDDB</RootNamespace> <RootNamespace>ircDDB</RootNamespace>
<Keyword>Win32Proj</Keyword> <Keyword>Win32Proj</Keyword>
<WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion> <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType> <ConfigurationType>StaticLibrary</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType> <ConfigurationType>StaticLibrary</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType> <ConfigurationType>StaticLibrary</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType> <ConfigurationType>StaticLibrary</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
@ -77,6 +77,10 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<OutDir>$(SolutionDir)$(Configuration)\</OutDir> <OutDir>$(SolutionDir)$(Configuration)\</OutDir>
<IntDir>$(Configuration)\</IntDir> <IntDir>$(Configuration)\</IntDir>
<IncludePath>$(WXWIN)\include;$(WXWIN)\lib\vc_dll\mswu;$(IncludePath)</IncludePath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<IncludePath>$(WXWIN)\include;$(WXWIN)\lib\vc_x64_dll\mswu;$(IncludePath)</IncludePath>
</PropertyGroup> </PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile> <ClCompile>

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2010-2015,2018 by Jonathan Naylor G4KLX * Copyright (C) 2010-2015,2018,2020 by Jonathan Naylor G4KLX
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -40,6 +40,7 @@ wxIMPLEMENT_APP(CIRCDDBGatewayApp);
const wxChar* NAME_PARAM = wxT("Gateway Name"); const wxChar* NAME_PARAM = wxT("Gateway Name");
const wxChar* NOLOGGING_SWITCH = wxT("nolog"); const wxChar* NOLOGGING_SWITCH = wxT("nolog");
const wxChar* DEBUG_SWITCH = wxT("debug");
const wxChar* GUI_SWITCH = wxT("gui"); const wxChar* GUI_SWITCH = wxT("gui");
const wxChar* LOGDIR_OPTION = wxT("logdir"); const wxChar* LOGDIR_OPTION = wxT("logdir");
const wxChar* CONFDIR_OPTION = wxT("confdir"); const wxChar* CONFDIR_OPTION = wxT("confdir");
@ -50,6 +51,7 @@ CIRCDDBGatewayApp::CIRCDDBGatewayApp() :
wxApp(), wxApp(),
m_name(), m_name(),
m_nolog(false), m_nolog(false),
m_debug(false),
m_gui(false), m_gui(false),
m_logDir(), m_logDir(),
m_confDir(), m_confDir(),
@ -89,6 +91,14 @@ bool CIRCDDBGatewayApp::OnInit()
wxLog* log = new CLogger(m_logDir, logBaseName); wxLog* log = new CLogger(m_logDir, logBaseName);
wxLog::SetActiveTarget(log); wxLog::SetActiveTarget(log);
if (m_debug) {
wxLog::SetVerbose(true);
wxLog::SetLogLevel(wxLOG_Debug);
} else {
wxLog::SetVerbose(false);
wxLog::SetLogLevel(wxLOG_Message);
}
} else { } else {
new wxLogNull; new wxLogNull;
} }
@ -161,8 +171,10 @@ int CIRCDDBGatewayApp::OnExit()
wxLogInfo(APPLICATION_NAME + wxT(" is exiting")); wxLogInfo(APPLICATION_NAME + wxT(" is exiting"));
//m_thread->kill(); m_thread->kill();
wxGetApp().GetTopWindow()->Close(); wxWindow * topWin = wxGetApp().GetTopWindow();
if (topWin != NULL)
topWin->Close();
delete m_config; delete m_config;
@ -174,6 +186,7 @@ int CIRCDDBGatewayApp::OnExit()
void CIRCDDBGatewayApp::OnInitCmdLine(wxCmdLineParser& parser) void CIRCDDBGatewayApp::OnInitCmdLine(wxCmdLineParser& parser)
{ {
parser.AddSwitch(NOLOGGING_SWITCH, wxEmptyString, wxEmptyString, wxCMD_LINE_PARAM_OPTIONAL); parser.AddSwitch(NOLOGGING_SWITCH, wxEmptyString, wxEmptyString, wxCMD_LINE_PARAM_OPTIONAL);
parser.AddSwitch(DEBUG_SWITCH, wxEmptyString, wxEmptyString, wxCMD_LINE_PARAM_OPTIONAL);
parser.AddSwitch(GUI_SWITCH, wxEmptyString, wxEmptyString, wxCMD_LINE_PARAM_OPTIONAL); parser.AddSwitch(GUI_SWITCH, wxEmptyString, wxEmptyString, wxCMD_LINE_PARAM_OPTIONAL);
parser.AddOption(LOGDIR_OPTION, wxEmptyString, wxEmptyString, wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL); parser.AddOption(LOGDIR_OPTION, wxEmptyString, wxEmptyString, wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL);
parser.AddOption(CONFDIR_OPTION, wxEmptyString, wxEmptyString, wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL); parser.AddOption(CONFDIR_OPTION, wxEmptyString, wxEmptyString, wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL);
@ -188,6 +201,7 @@ bool CIRCDDBGatewayApp::OnCmdLineParsed(wxCmdLineParser& parser)
return false; return false;
m_nolog = parser.Found(NOLOGGING_SWITCH); m_nolog = parser.Found(NOLOGGING_SWITCH);
m_debug = parser.Found(DEBUG_SWITCH);
m_gui = parser.Found(GUI_SWITCH); m_gui = parser.Found(GUI_SWITCH);
wxString logDir; wxString logDir;
@ -254,15 +268,15 @@ void CIRCDDBGatewayApp::createThread()
thread->setGateway(gatewayType, gatewayCallsign, gatewayAddress); thread->setGateway(gatewayType, gatewayCallsign, gatewayAddress);
wxString aprsHostname; wxString aprsAddress;
unsigned int aprsPort; unsigned int aprsPort;
bool aprsEnabled; bool aprsEnabled;
m_config->getDPRS(aprsEnabled, aprsHostname, aprsPort); m_config->getDPRS(aprsEnabled, aprsAddress, aprsPort);
wxLogInfo(wxT("APRS enabled: %d, host: %s:%u"), int(aprsEnabled), aprsHostname.c_str(), aprsPort); wxLogInfo(wxT("APRS enabled: %d, host: %s:%u"), int(aprsEnabled), aprsAddress.c_str(), aprsPort);
CAPRSWriter* aprs = NULL; CAPRSWriter* aprs = NULL;
if (aprsEnabled && !gatewayCallsign.IsEmpty() && !aprsHostname.IsEmpty() && aprsPort != 0U) { if (aprsEnabled && !aprsAddress.IsEmpty() && aprsPort != 0U) {
aprs = new CAPRSWriter(aprsHostname, aprsPort, gatewayCallsign, gatewayAddress); aprs = new CAPRSWriter(aprsAddress, aprsPort, gatewayCallsign);
bool res = aprs->open(); bool res = aprs->open();
if (!res) if (!res)
@ -276,6 +290,11 @@ void CIRCDDBGatewayApp::createThread()
m_config->getMiscellaneous(language, infoEnabled, echoEnabled, logEnabled, dratsEnabled, dtmfEnabled); 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)); 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 gpsdEnabled;
wxString gpsdAddress, gpsdPort;
m_config->getGPSD(gpsdEnabled, gpsdAddress, gpsdPort);
wxLogInfo(wxT("GPSD: %d, address: %s, port: %s"), int(gpsdEnabled), gpsdAddress.c_str(), gpsdPort.c_str());
CIcomRepeaterProtocolHandler* icomRepeaterHandler = NULL; CIcomRepeaterProtocolHandler* icomRepeaterHandler = NULL;
CHBRepeaterProtocolHandler* hbRepeaterHandler = NULL; CHBRepeaterProtocolHandler* hbRepeaterHandler = NULL;
CDummyRepeaterProtocolHandler* dummyRepeaterHandler = NULL; CDummyRepeaterProtocolHandler* dummyRepeaterHandler = NULL;
@ -351,15 +370,23 @@ void CIRCDDBGatewayApp::createThread()
wxLogInfo(wxT("Repeater 1 bands: %u %u %u"), band11, band12, band13); 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); 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) if (aprs != NULL) {
aprs->setPort(callsign1, repeaterBand1, frequency1, offset1, range1, latitude1, longitude1, agl1); if (gpsdEnabled)
aprs->setPortGPSD(callsign1, repeaterBand1, frequency1, offset1, range1, gpsdAddress, gpsdPort);
else
aprs->setPortFixed(callsign1, repeaterBand1, frequency1, offset1, range1, latitude1, longitude1, agl1);
}
icomCount++; icomCount++;
} else if (repeaterType1 == HW_HOMEBREW && hbRepeaterHandler != NULL) { } 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); thread->addRepeater(callsign1, repeaterBand1, repeaterAddress1, repeaterPort1, repeaterType1, reflector1, atStartup1, reconnect1, dratsEnabled, frequency1, offset1, range1, latitude1, longitude1, agl1, description11, description12, url1, hbRepeaterHandler);
if (aprs != NULL) if (aprs != NULL) {
aprs->setPort(callsign1, repeaterBand1, frequency1, offset1, range1, latitude1, longitude1, agl1); if (gpsdEnabled)
aprs->setPortGPSD(callsign1, repeaterBand1, frequency1, offset1, range1, gpsdAddress, gpsdPort);
else
aprs->setPortFixed(callsign1, repeaterBand1, frequency1, offset1, range1, latitude1, longitude1, agl1);
}
} else if (repeaterType1 == HW_DUMMY && dummyRepeaterHandler != NULL) { } 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); thread->addRepeater(callsign1, repeaterBand1, repeaterAddress1, repeaterPort1, repeaterType1, reflector1, atStartup1, reconnect1, dratsEnabled, frequency1, offset1, range1, latitude1, longitude1, agl1, description11, description12, url1, dummyRepeaterHandler);
} }
@ -439,15 +466,23 @@ void CIRCDDBGatewayApp::createThread()
wxLogInfo(wxT("Repeater 2 bands: %u %u %u"), band21, band22, band23); 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); 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) if (aprs != NULL) {
aprs->setPort(callsign2, repeaterBand2, frequency2, offset2, range2, latitude2, longitude2, agl2); if (gpsdEnabled)
aprs->setPortGPSD(callsign2, repeaterBand2, frequency2, offset2, range2, gpsdAddress, gpsdPort);
else
aprs->setPortFixed(callsign2, repeaterBand2, frequency2, offset2, range2, latitude2, longitude2, agl2);
}
icomCount++; icomCount++;
} else if (repeaterType2 == HW_HOMEBREW && hbRepeaterHandler != NULL) { } 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); thread->addRepeater(callsign2, repeaterBand2, repeaterAddress2, repeaterPort2, repeaterType2, reflector2, atStartup2, reconnect2, dratsEnabled, frequency2, offset2, range2, latitude2, longitude2, agl2, description21, description22, url2, hbRepeaterHandler);
if (aprs != NULL) if (aprs != NULL) {
aprs->setPort(callsign2, repeaterBand2, frequency2, offset2, range2, latitude2, longitude2, agl2); if (gpsdEnabled)
aprs->setPortGPSD(callsign2, repeaterBand2, frequency2, offset2, range2, gpsdAddress, gpsdPort);
else
aprs->setPortFixed(callsign2, repeaterBand2, frequency2, offset2, range2, latitude2, longitude2, agl2);
}
} else if (repeaterType2 == HW_DUMMY && dummyRepeaterHandler != NULL) { } 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); thread->addRepeater(callsign2, repeaterBand2, repeaterAddress2, repeaterPort2, repeaterType2, reflector2, atStartup2, reconnect2, dratsEnabled, frequency2, offset2, range2, latitude2, longitude2, agl2, description21, description22, url2, dummyRepeaterHandler);
} }
@ -531,15 +566,23 @@ void CIRCDDBGatewayApp::createThread()
wxLogInfo(wxT("Repeater 3 bands: %u %u %u"), band31, band32, band33); 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); 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) if (aprs != NULL) {
aprs->setPort(callsign3, repeaterBand3, frequency3, offset3, range3, latitude3, longitude3, agl3); if (gpsdEnabled)
aprs->setPortGPSD(callsign3, repeaterBand3, frequency3, offset3, range3, gpsdAddress, gpsdPort);
else
aprs->setPortFixed(callsign3, repeaterBand3, frequency3, offset3, range3, latitude3, longitude3, agl3);
}
icomCount++; icomCount++;
} else if (repeaterType3 == HW_HOMEBREW && hbRepeaterHandler != NULL) { } 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); thread->addRepeater(callsign3, repeaterBand3, repeaterAddress3, repeaterPort3, repeaterType3, reflector3, atStartup3, reconnect3, dratsEnabled, frequency3, offset3, range3, latitude3, longitude3, agl3, description31, description32, url3, hbRepeaterHandler);
if (aprs != NULL) if (aprs != NULL) {
aprs->setPort(callsign3, repeaterBand3, frequency3, offset3, range3, latitude3, longitude3, agl3); if (gpsdEnabled)
aprs->setPortGPSD(callsign3, repeaterBand3, frequency3, offset3, range3, gpsdAddress, gpsdPort);
else
aprs->setPortFixed(callsign3, repeaterBand3, frequency3, offset3, range3, latitude3, longitude3, agl3);
}
} else if (repeaterType3 == HW_DUMMY && dummyRepeaterHandler != NULL) { } 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); thread->addRepeater(callsign3, repeaterBand3, repeaterAddress3, repeaterPort3, repeaterType3, reflector3, atStartup3, reconnect3, dratsEnabled, frequency3, offset3, range3, latitude3, longitude3, agl3, description31, description32, url3, dummyRepeaterHandler);
} }
@ -627,15 +670,23 @@ void CIRCDDBGatewayApp::createThread()
wxLogInfo(wxT("Repeater 4 bands: %u %u %u"), band41, band42, band43); 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); 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) if (aprs != NULL) {
aprs->setPort(callsign4, repeaterBand4, frequency4, offset4, range4, latitude4, longitude4, agl4); if (gpsdEnabled)
aprs->setPortGPSD(callsign4, repeaterBand4, frequency4, offset4, range4, gpsdAddress, gpsdPort);
else
aprs->setPortFixed(callsign4, repeaterBand4, frequency4, offset4, range4, latitude4, longitude4, agl4);
}
icomCount++; icomCount++;
} else if (repeaterType4 == HW_HOMEBREW && hbRepeaterHandler != NULL) { } 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); thread->addRepeater(callsign4, repeaterBand4, repeaterAddress4, repeaterPort4, repeaterType4, reflector4, atStartup4, reconnect4, dratsEnabled, frequency4, offset4, range4, latitude4, longitude4, agl4, description41, description42, url4, hbRepeaterHandler);
if (aprs != NULL) if (aprs != NULL) {
aprs->setPort(callsign4, repeaterBand4, frequency4, offset4, range4, latitude4, longitude4, agl4); if (gpsdEnabled)
aprs->setPortGPSD(callsign4, repeaterBand4, frequency4, offset4, range4, gpsdAddress, gpsdPort);
else
aprs->setPortFixed(callsign4, repeaterBand4, frequency4, offset4, range4, latitude4, longitude4, agl4);
}
} else if (repeaterType4 == HW_DUMMY && dummyRepeaterHandler != NULL) { } 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); thread->addRepeater(callsign4, repeaterBand4, repeaterAddress4, repeaterPort4, repeaterType4, reflector4, atStartup4, reconnect4, dratsEnabled, frequency4, offset4, range4, latitude4, longitude4, agl4, description41, description42, url4, dummyRepeaterHandler);
} }
@ -650,7 +701,7 @@ void CIRCDDBGatewayApp::createThread()
wxString ircDDBHostname3, ircDDBUsername3, ircDDBPassword3; wxString ircDDBHostname3, ircDDBUsername3, ircDDBPassword3;
wxString ircDDBHostname4, ircDDBUsername4, ircDDBPassword4; wxString ircDDBHostname4, ircDDBUsername4, ircDDBPassword4;
m_config->getIrcDDB(ircDDBEnabled1, ircDDBHostname1, ircDDBUsername1, ircDDBPassword1); m_config->getIrcDDB1(ircDDBEnabled1, ircDDBHostname1, ircDDBUsername1, ircDDBPassword1);
wxLogInfo(wxT("ircDDB 1 enabled: %d, host: %s, username: %s"), int(ircDDBEnabled1), ircDDBHostname1.c_str(), ircDDBUsername1.c_str()); wxLogInfo(wxT("ircDDB 1 enabled: %d, host: %s, username: %s"), int(ircDDBEnabled1), ircDDBHostname1.c_str(), ircDDBUsername1.c_str());
m_config->getIrcDDB2(ircDDBEnabled2, ircDDBHostname2, ircDDBUsername2, ircDDBPassword2); m_config->getIrcDDB2(ircDDBEnabled2, ircDDBHostname2, ircDDBUsername2, ircDDBPassword2);
@ -837,10 +888,9 @@ void CIRCDDBGatewayApp::createThread()
wxLogInfo(wxT("DCS enabled: %d, CCS enabled: %d, server: %s"), int(dcsEnabled), int(ccsEnabled), ccsHost.c_str()); wxLogInfo(wxT("DCS enabled: %d, CCS enabled: %d, server: %s"), int(dcsEnabled), int(ccsEnabled), ccsHost.c_str());
bool xlxEnabled; bool xlxEnabled;
bool xlxOverrideLocal;
wxString xlxHostsFileUrl; wxString xlxHostsFileUrl;
m_config->getXLX(xlxEnabled, xlxOverrideLocal, xlxHostsFileUrl); m_config->getXLX(xlxEnabled, xlxHostsFileUrl);
wxLogInfo(wxT("XLX enabled: %d, Override Local %d, Hosts file url: %s"), int(xlxEnabled), int(xlxOverrideLocal), xlxHostsFileUrl.c_str()); wxLogInfo(wxT("XLX enabled: %d, Hosts file url: %s"), int(xlxEnabled), xlxHostsFileUrl.c_str());
if (repeaterBand1.Len() > 1U || repeaterBand2.Len() > 1U || if (repeaterBand1.Len() > 1U || repeaterBand2.Len() > 1U ||
repeaterBand3.Len() > 1U || repeaterBand4.Len() > 1U) { repeaterBand3.Len() > 1U || repeaterBand4.Len() > 1U) {
@ -910,7 +960,7 @@ void CIRCDDBGatewayApp::createThread()
thread->setDExtra(dextraEnabled, dextraMaxDongles); thread->setDExtra(dextraEnabled, dextraMaxDongles);
thread->setDCS(dcsEnabled); thread->setDCS(dcsEnabled);
thread->setCCS(ccsEnabled, ccsHost); thread->setCCS(ccsEnabled, ccsHost);
thread->setXLX(xlxEnabled, xlxOverrideLocal, xlxEnabled ? CXLXHostsFileDownloader::Download(xlxHostsFileUrl) : wxString(wxEmptyString)); thread->setXLX(xlxEnabled, xlxEnabled ? CXLXHostsFileDownloader::Download(xlxHostsFileUrl) : wxString(wxEmptyString));
thread->setInfoEnabled(infoEnabled); thread->setInfoEnabled(infoEnabled);
thread->setEchoEnabled(echoEnabled); thread->setEchoEnabled(echoEnabled);
thread->setDTMFEnabled(dtmfEnabled); thread->setDTMFEnabled(dtmfEnabled);

View file

@ -54,6 +54,7 @@ public:
private: private:
wxString m_name; wxString m_name;
bool m_nolog; bool m_nolog;
bool m_debug;
bool m_gui; bool m_gui;
wxString m_logDir; wxString m_logDir;
wxString m_confDir; wxString m_confDir;

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2010-2013,2015,2018 by Jonathan Naylor G4KLX * Copyright (C) 2010-2013,2015,2018,2020 by Jonathan Naylor G4KLX
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -26,6 +26,7 @@
#include "APRSWriter.h" #include "APRSWriter.h"
#include "Version.h" #include "Version.h"
#include "Logger.h" #include "Logger.h"
#include "ConsoleLogger.h"
#include "IRCDDB.h" #include "IRCDDB.h"
#include "IRCDDBClient.h" #include "IRCDDBClient.h"
#include "IRCDDBMultiClient.h" #include "IRCDDBMultiClient.h"
@ -44,11 +45,13 @@
const wxChar* NAME_PARAM = wxT("Gateway Name"); const wxChar* NAME_PARAM = wxT("Gateway Name");
const wxChar* NOLOGGING_SWITCH = wxT("nolog"); const wxChar* NOLOGGING_SWITCH = wxT("nolog");
const wxChar* DEBUG_SWITCH = wxT("debug");
const wxChar* LOGDIR_OPTION = wxT("logdir"); const wxChar* LOGDIR_OPTION = wxT("logdir");
const wxChar* CONFDIR_OPTION = wxT("confdir"); const wxChar* CONFDIR_OPTION = wxT("confdir");
const wxChar* DAEMON_SWITCH = wxT("daemon"); const wxChar* DAEMON_SWITCH = wxT("daemon");
const wxChar* FGROUND_SWITCH = wxT("foreground");
const wxString LOG_BASE_NAME = wxT("ircddbgatewayd"); const wxString LOG_BASE_NAME = wxT("ircDDBGateway");
static CIRCDDBGatewayAppD* m_gateway = NULL; static CIRCDDBGatewayAppD* m_gateway = NULL;
@ -67,7 +70,9 @@ int main(int argc, char** argv)
wxCmdLineParser parser(argc, argv); wxCmdLineParser parser(argc, argv);
parser.AddSwitch(NOLOGGING_SWITCH, wxEmptyString, wxEmptyString, wxCMD_LINE_PARAM_OPTIONAL); parser.AddSwitch(NOLOGGING_SWITCH, wxEmptyString, wxEmptyString, wxCMD_LINE_PARAM_OPTIONAL);
parser.AddSwitch(DEBUG_SWITCH, wxEmptyString, wxEmptyString, wxCMD_LINE_PARAM_OPTIONAL);
parser.AddSwitch(DAEMON_SWITCH, wxEmptyString, wxEmptyString, wxCMD_LINE_PARAM_OPTIONAL); parser.AddSwitch(DAEMON_SWITCH, wxEmptyString, wxEmptyString, wxCMD_LINE_PARAM_OPTIONAL);
parser.AddSwitch(FGROUND_SWITCH, wxEmptyString, wxEmptyString, wxCMD_LINE_PARAM_OPTIONAL);
parser.AddOption(LOGDIR_OPTION, wxEmptyString, wxEmptyString, wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL); parser.AddOption(LOGDIR_OPTION, wxEmptyString, wxEmptyString, wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL);
parser.AddOption(CONFDIR_OPTION, wxEmptyString, wxEmptyString, wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL); parser.AddOption(CONFDIR_OPTION, wxEmptyString, wxEmptyString, wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL);
parser.AddParam(NAME_PARAM, wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL); parser.AddParam(NAME_PARAM, wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL);
@ -79,7 +84,9 @@ int main(int argc, char** argv)
} }
bool nolog = parser.Found(NOLOGGING_SWITCH); bool nolog = parser.Found(NOLOGGING_SWITCH);
bool debug = parser.Found(DEBUG_SWITCH);
bool daemon = parser.Found(DAEMON_SWITCH); bool daemon = parser.Found(DAEMON_SWITCH);
bool foreground = parser.Found(FGROUND_SWITCH);
wxString logDir; wxString logDir;
bool found = parser.Found(LOGDIR_OPTION, &logDir); bool found = parser.Found(LOGDIR_OPTION, &logDir);
@ -95,6 +102,12 @@ int main(int argc, char** argv)
if (parser.GetParamCount() > 0U) if (parser.GetParamCount() > 0U)
name = parser.GetParam(0U); name = parser.GetParam(0U);
if (daemon && foreground) {
::fprintf(stderr, "ircddbgatewayd: -daemon and -foreground are mutually exclusive, exiting\n");
::wxUninitialize();
return 1;
}
if (daemon) { if (daemon) {
pid_t pid = ::fork(); pid_t pid = ::fork();
@ -135,7 +148,7 @@ int main(int argc, char** argv)
::fclose(fp); ::fclose(fp);
} }
m_gateway = new CIRCDDBGatewayAppD(nolog, logDir, confDir, name); m_gateway = new CIRCDDBGatewayAppD(nolog, debug, foreground, logDir, confDir, name);
if (!m_gateway->init()) { if (!m_gateway->init()) {
::wxUninitialize(); ::wxUninitialize();
return 1; return 1;
@ -154,9 +167,11 @@ int main(int argc, char** argv)
return 0; return 0;
} }
CIRCDDBGatewayAppD::CIRCDDBGatewayAppD(bool nolog, const wxString& logDir, const wxString& confDir, const wxString& name) : CIRCDDBGatewayAppD::CIRCDDBGatewayAppD(bool nolog, bool debug, bool foreground, const wxString& logDir, const wxString& confDir, const wxString& name) :
m_name(name), m_name(name),
m_nolog(nolog), m_nolog(nolog),
m_debug(debug),
m_foreground(foreground),
m_logDir(logDir), m_logDir(logDir),
m_confDir(confDir), m_confDir(confDir),
m_thread(NULL), m_thread(NULL),
@ -170,7 +185,9 @@ CIRCDDBGatewayAppD::~CIRCDDBGatewayAppD()
bool CIRCDDBGatewayAppD::init() bool CIRCDDBGatewayAppD::init()
{ {
if (!m_nolog) { if (m_foreground) {
initLogging(new CConsoleLogger());
} else if (!m_nolog) {
wxString logBaseName = LOG_BASE_NAME; wxString logBaseName = LOG_BASE_NAME;
if (!m_name.IsEmpty()) { if (!m_name.IsEmpty()) {
logBaseName.Append(wxT("_")); logBaseName.Append(wxT("_"));
@ -180,8 +197,7 @@ bool CIRCDDBGatewayAppD::init()
if (m_logDir.IsEmpty()) if (m_logDir.IsEmpty())
m_logDir = wxT(LOG_DIR); m_logDir = wxT(LOG_DIR);
wxLog* log = new CLogger(m_logDir, logBaseName); initLogging(new CLogger(m_logDir, logBaseName));
wxLog::SetActiveTarget(log);
} else { } else {
new wxLogNull; new wxLogNull;
} }
@ -200,14 +216,31 @@ bool CIRCDDBGatewayAppD::init()
return false; return false;
} }
wxLogInfo(wxT("Starting ") + APPLICATION_NAME + wxT(" daemon - ") + VERSION); wxLogMessage(wxT("Starting ") + APPLICATION_NAME + wxT(" daemon - ") + VERSION);
// Log the version of wxWidgets and the Operating System // Log the version of wxWidgets and the Operating System
wxLogInfo(wxT("Using wxWidgets %d.%d.%d on %s"), wxMAJOR_VERSION, wxMINOR_VERSION, wxRELEASE_NUMBER, ::wxGetOsDescription().c_str()); wxLogInfo(wxT("Using wxWidgets %d.%d.%d on %s"), wxMAJOR_VERSION, wxMINOR_VERSION, wxRELEASE_NUMBER, ::wxGetOsDescription().c_str());
if (!m_nolog && m_foreground) {
wxLogWarning(wxT("Running in foreground, logging to file disabled. Use -nolog when running this application in foreground to suppress this "));
}
return createThread(); return createThread();
} }
void CIRCDDBGatewayAppD::initLogging(wxLog *logger)
{
wxLog::SetActiveTarget(logger);
if (m_debug) {
wxLog::SetVerbose(true);
wxLog::SetLogLevel(wxLOG_Debug);
} else {
wxLog::SetVerbose(false);
wxLog::SetLogLevel(wxLOG_Message);
}
}
void CIRCDDBGatewayAppD::run() void CIRCDDBGatewayAppD::run()
{ {
m_thread->run(); m_thread->run();
@ -242,15 +275,15 @@ bool CIRCDDBGatewayAppD::createThread()
m_thread->setGateway(gatewayType, gatewayCallsign, gatewayAddress); m_thread->setGateway(gatewayType, gatewayCallsign, gatewayAddress);
wxString aprsHostname; wxString aprsAddress;
unsigned int aprsPort; unsigned int aprsPort;
bool aprsEnabled; bool aprsEnabled;
config.getDPRS(aprsEnabled, aprsHostname, aprsPort); config.getDPRS(aprsEnabled, aprsAddress, aprsPort);
wxLogInfo(wxT("APRS enabled: %d, host: %s:%u"), int(aprsEnabled), aprsHostname.c_str(), aprsPort); wxLogInfo(wxT("APRS enabled: %d, host: %s:%u"), int(aprsEnabled), aprsAddress.c_str(), aprsPort);
CAPRSWriter* aprs = NULL; CAPRSWriter* aprs = NULL;
if (aprsEnabled && !gatewayCallsign.IsEmpty() && !aprsHostname.IsEmpty() && aprsPort != 0U) { if (aprsEnabled && !aprsAddress.IsEmpty() && aprsPort != 0U) {
aprs = new CAPRSWriter(aprsHostname, aprsPort, gatewayCallsign, gatewayAddress); aprs = new CAPRSWriter(aprsAddress, aprsPort, gatewayCallsign);
bool res = aprs->open(); bool res = aprs->open();
if (!res) if (!res)
@ -264,6 +297,11 @@ bool CIRCDDBGatewayAppD::createThread()
config.getMiscellaneous(language, infoEnabled, echoEnabled, logEnabled, dratsEnabled, dtmfEnabled); 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)); 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 gpsdEnabled;
wxString gpsdAddress, gpsdPort;
config.getGPSD(gpsdEnabled, gpsdAddress, gpsdPort);
wxLogInfo(wxT("GPSD: %d, address: %s, port: %s"), int(gpsdEnabled), gpsdAddress.c_str(), gpsdPort.c_str());
CIcomRepeaterProtocolHandler* icomRepeaterHandler = NULL; CIcomRepeaterProtocolHandler* icomRepeaterHandler = NULL;
CHBRepeaterProtocolHandler* hbRepeaterHandler = NULL; CHBRepeaterProtocolHandler* hbRepeaterHandler = NULL;
CDummyRepeaterProtocolHandler* dummyRepeaterHandler = NULL; CDummyRepeaterProtocolHandler* dummyRepeaterHandler = NULL;
@ -339,15 +377,23 @@ bool CIRCDDBGatewayAppD::createThread()
wxLogInfo(wxT("Repeater 1 bands: %u %u %u"), band11, band12, band13); 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); 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) if (aprs != NULL) {
aprs->setPort(callsign1, repeaterBand1, frequency1, offset1, range1, latitude1, longitude1, agl1); if (gpsdEnabled)
aprs->setPortGPSD(callsign1, repeaterBand1, frequency1, offset1, range1, gpsdAddress, gpsdPort);
else
aprs->setPortFixed(callsign1, repeaterBand1, frequency1, offset1, range1, latitude1, longitude1, agl1);
}
icomCount++; icomCount++;
} else if (repeaterType1 == HW_HOMEBREW && hbRepeaterHandler != NULL) { } 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); 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) if (aprs != NULL) {
aprs->setPort(callsign1, repeaterBand1, frequency1, offset1, range1, latitude1, longitude1, agl1); if (gpsdEnabled)
aprs->setPortGPSD(callsign1, repeaterBand1, frequency1, offset1, range1, gpsdAddress, gpsdPort);
else
aprs->setPortFixed(callsign1, repeaterBand1, frequency1, offset1, range1, latitude1, longitude1, agl1);
}
} else if (repeaterType1 == HW_DUMMY && dummyRepeaterHandler != NULL) { } 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); m_thread->addRepeater(callsign1, repeaterBand1, repeaterAddress1, repeaterPort1, repeaterType1, reflector1, atStartup1, reconnect1, dratsEnabled, frequency1, offset1, range1, latitude1, longitude1, agl1, description11, description12, url1, dummyRepeaterHandler);
} }
@ -427,15 +473,23 @@ bool CIRCDDBGatewayAppD::createThread()
wxLogInfo(wxT("Repeater 2 bands: %u %u %u"), band21, band22, band23); 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); 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) if (aprs != NULL) {
aprs->setPort(callsign2, repeaterBand2, frequency2, offset2, range2, latitude2, longitude2, agl2); if (gpsdEnabled)
aprs->setPortGPSD(callsign2, repeaterBand2, frequency2, offset2, range2, gpsdAddress, gpsdPort);
else
aprs->setPortFixed(callsign2, repeaterBand2, frequency2, offset2, range2, latitude2, longitude2, agl2);
}
icomCount++; icomCount++;
} else if (repeaterType2 == HW_HOMEBREW && hbRepeaterHandler != NULL) { } 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); 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) if (aprs != NULL) {
aprs->setPort(callsign2, repeaterBand2, frequency2, offset2, range2, latitude2, longitude2, agl2); if (gpsdEnabled)
aprs->setPortGPSD(callsign2, repeaterBand2, frequency2, offset2, range2, gpsdAddress, gpsdPort);
else
aprs->setPortFixed(callsign2, repeaterBand2, frequency2, offset2, range2, latitude2, longitude2, agl1);
}
} else if (repeaterType2 == HW_DUMMY && dummyRepeaterHandler != NULL) { } 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); m_thread->addRepeater(callsign2, repeaterBand2, repeaterAddress2, repeaterPort2, repeaterType2, reflector2, atStartup2, reconnect2, dratsEnabled, frequency2, offset2, range2, latitude2, longitude2, agl2, description21, description22, url2, dummyRepeaterHandler);
} }
@ -519,15 +573,23 @@ bool CIRCDDBGatewayAppD::createThread()
wxLogInfo(wxT("Repeater 3 bands: %u %u %u"), band31, band32, band33); 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); 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) if (aprs != NULL) {
aprs->setPort(callsign3, repeaterBand3, frequency3, offset3, range3, latitude3, longitude3, agl3); if (gpsdEnabled)
aprs->setPortGPSD(callsign3, repeaterBand3, frequency3, offset3, range3, gpsdAddress, gpsdPort);
else
aprs->setPortFixed(callsign3, repeaterBand3, frequency3, offset3, range3, latitude3, longitude3, agl3);
}
icomCount++; icomCount++;
} else if (repeaterType3 == HW_HOMEBREW && hbRepeaterHandler != NULL) { } 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); 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) if (aprs != NULL) {
aprs->setPort(callsign3, repeaterBand3, frequency3, offset3, range3, latitude3, longitude3, agl3); if (gpsdEnabled)
aprs->setPortGPSD(callsign3, repeaterBand3, frequency3, offset3, range3, gpsdAddress, gpsdPort);
else
aprs->setPortFixed(callsign3, repeaterBand3, frequency3, offset3, range3, latitude3, longitude3, agl3);
}
} else if (repeaterType3 == HW_DUMMY && dummyRepeaterHandler != NULL) { } 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); m_thread->addRepeater(callsign3, repeaterBand3, repeaterAddress3, repeaterPort3, repeaterType3, reflector3, atStartup3, reconnect3, dratsEnabled, frequency3, offset3, range3, latitude3, longitude3, agl3, description31, description32, url3, dummyRepeaterHandler);
} }
@ -615,15 +677,23 @@ bool CIRCDDBGatewayAppD::createThread()
wxLogInfo(wxT("Repeater 4 bands: %u %u %u"), band41, band42, band43); 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); 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) if (aprs != NULL) {
aprs->setPort(callsign4, repeaterBand4, frequency4, offset4, range4, latitude4, longitude4, agl4); if (gpsdEnabled)
aprs->setPortGPSD(callsign4, repeaterBand4, frequency4, offset4, range4, gpsdAddress, gpsdPort);
else
aprs->setPortFixed(callsign4, repeaterBand4, frequency4, offset4, range4, latitude4, longitude4, agl4);
}
icomCount++; icomCount++;
} else if (repeaterType4 == HW_HOMEBREW && hbRepeaterHandler != NULL) { } 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); 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) if (aprs != NULL) {
aprs->setPort(callsign4, repeaterBand4, frequency4, offset4, range4, latitude4, longitude4, agl4); if (gpsdEnabled)
aprs->setPortGPSD(callsign4, repeaterBand4, frequency4, offset4, range4, gpsdAddress, gpsdPort);
else
aprs->setPortFixed(callsign4, repeaterBand4, frequency4, offset4, range4, latitude4, longitude4, agl4);
}
} else if (repeaterType4 == HW_DUMMY && dummyRepeaterHandler != NULL) { } 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); m_thread->addRepeater(callsign4, repeaterBand4, repeaterAddress4, repeaterPort4, repeaterType4, reflector4, atStartup4, reconnect4, dratsEnabled, frequency4, offset4, range4, latitude4, longitude4, agl4, description41, description42, url4, dummyRepeaterHandler);
} }
@ -638,7 +708,7 @@ bool CIRCDDBGatewayAppD::createThread()
wxString ircDDBHostname3, ircDDBUsername3, ircDDBPassword3; wxString ircDDBHostname3, ircDDBUsername3, ircDDBPassword3;
wxString ircDDBHostname4, ircDDBUsername4, ircDDBPassword4; wxString ircDDBHostname4, ircDDBUsername4, ircDDBPassword4;
config.getIrcDDB(ircDDBEnabled1, ircDDBHostname1, ircDDBUsername1, ircDDBPassword1); config.getIrcDDB1(ircDDBEnabled1, ircDDBHostname1, ircDDBUsername1, ircDDBPassword1);
wxLogInfo(wxT("ircDDB 1 enabled: %d, host: %s, username: %s"), int(ircDDBEnabled1), ircDDBHostname1.c_str(), ircDDBUsername1.c_str()); wxLogInfo(wxT("ircDDB 1 enabled: %d, host: %s, username: %s"), int(ircDDBEnabled1), ircDDBHostname1.c_str(), ircDDBUsername1.c_str());
config.getIrcDDB2(ircDDBEnabled2, ircDDBHostname2, ircDDBUsername2, ircDDBPassword2); config.getIrcDDB2(ircDDBEnabled2, ircDDBHostname2, ircDDBUsername2, ircDDBPassword2);
@ -826,10 +896,9 @@ bool CIRCDDBGatewayAppD::createThread()
wxLogInfo(wxT("DCS enabled: %d, CCS enabled: %d, server: %s"), int(dcsEnabled), int(ccsEnabled), ccsHost.c_str()); wxLogInfo(wxT("DCS enabled: %d, CCS enabled: %d, server: %s"), int(dcsEnabled), int(ccsEnabled), ccsHost.c_str());
bool xlxEnabled; bool xlxEnabled;
bool xlxOverrideLocal;
wxString xlxHostsFileUrl; wxString xlxHostsFileUrl;
config.getXLX(xlxEnabled, xlxOverrideLocal, xlxHostsFileUrl); config.getXLX(xlxEnabled, xlxHostsFileUrl);
wxLogInfo(wxT("XLX enabled: %d, Override Local %d, Hosts file url: %s"), int(xlxEnabled), int(xlxOverrideLocal), xlxHostsFileUrl.c_str()); wxLogInfo(wxT("XLX enabled: %d, Hosts file url: %s"), int(xlxEnabled), xlxHostsFileUrl.c_str());
if (repeaterBand1.Len() > 1U || repeaterBand2.Len() > 1U || if (repeaterBand1.Len() > 1U || repeaterBand2.Len() > 1U ||
repeaterBand3.Len() > 1U || repeaterBand4.Len() > 1U) { repeaterBand3.Len() > 1U || repeaterBand4.Len() > 1U) {
@ -898,7 +967,7 @@ bool CIRCDDBGatewayAppD::createThread()
m_thread->setDExtra(dextraEnabled, dextraMaxDongles); m_thread->setDExtra(dextraEnabled, dextraMaxDongles);
m_thread->setDCS(dcsEnabled); m_thread->setDCS(dcsEnabled);
m_thread->setCCS(ccsEnabled, ccsHost); m_thread->setCCS(ccsEnabled, ccsHost);
m_thread->setXLX(xlxEnabled, xlxOverrideLocal, xlxEnabled ? CXLXHostsFileDownloader::Download(xlxHostsFileUrl): wxString(wxEmptyString)); m_thread->setXLX(xlxEnabled, xlxEnabled ? CXLXHostsFileDownloader::Download(xlxHostsFileUrl): wxString(wxEmptyString));
m_thread->setInfoEnabled(infoEnabled); m_thread->setInfoEnabled(infoEnabled);
m_thread->setEchoEnabled(echoEnabled); m_thread->setEchoEnabled(echoEnabled);
m_thread->setDTMFEnabled(dtmfEnabled); m_thread->setDTMFEnabled(dtmfEnabled);

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2010-2013 by Jonathan Naylor G4KLX * Copyright (C) 2010-2013,2018 by Jonathan Naylor G4KLX
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -28,7 +28,7 @@
class CIRCDDBGatewayAppD { class CIRCDDBGatewayAppD {
public: public:
CIRCDDBGatewayAppD(bool nolog, const wxString& logDir, const wxString& confDir, const wxString& name); CIRCDDBGatewayAppD(bool nolog, bool debug, bool foreground, const wxString& logDir, const wxString& confDir, const wxString& name);
~CIRCDDBGatewayAppD(); ~CIRCDDBGatewayAppD();
bool init(); bool init();
@ -40,12 +40,15 @@ public:
private: private:
wxString m_name; wxString m_name;
bool m_nolog; bool m_nolog;
bool m_debug;
bool m_foreground;
wxString m_logDir; wxString m_logDir;
wxString m_confDir; wxString m_confDir;
CIRCDDBGatewayThread* m_thread; CIRCDDBGatewayThread* m_thread;
wxSingleInstanceChecker* m_checker; wxSingleInstanceChecker* m_checker;
bool createThread(); bool createThread();
void initLogging(wxLog *logger);
}; };
#endif #endif

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2010-2015,2018 by Jonathan Naylor G4KLX * Copyright (C) 2010-2015,2018,2020 by Jonathan Naylor G4KLX
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -199,7 +199,7 @@ void CIRCDDBGatewayFrame::onAbout(wxCommandEvent&)
wxAboutDialogInfo info; wxAboutDialogInfo info;
info.AddDeveloper(wxT("Jonathan Naylor, G4KLX")); info.AddDeveloper(wxT("Jonathan Naylor, G4KLX"));
info.AddDeveloper(wxT("Michael Dirska, DL1BFF")); info.AddDeveloper(wxT("Michael Dirska, DL1BFF"));
info.SetCopyright(wxT("(C) 2010-2018 using GPL v2 or later")); info.SetCopyright(wxT("(C) 2010-2020 using GPL v2 or later"));
info.SetName(APPLICATION_NAME); info.SetName(APPLICATION_NAME);
info.SetVersion(VERSION); info.SetVersion(VERSION);
info.SetDescription(_("This program allows a computer running homebrew repeaters\nto access the ircDDB network for G2 callsign and repeater routing,\nas well as D-Plus and DExtra reflectors. It includes a StarNet\nDigital server.")); info.SetDescription(_("This program allows a computer running homebrew repeaters\nto access the ircDDB network for G2 callsign and repeater routing,\nas well as D-Plus and DExtra reflectors. It includes a StarNet\nDigital server."));
@ -271,14 +271,10 @@ void CIRCDDBGatewayFrame::onTimer(wxTimerEvent&)
} }
bool dprsStatus = status->getDPRSStatus(); bool dprsStatus = status->getDPRSStatus();
if (dprsStatus) { if (dprsStatus)
if (ircDDBStatus == IS_CONNECTED || ircDDBStatus == IS_DISABLED)
m_dprsStatus->SetLabel(_("Active")); m_dprsStatus->SetLabel(_("Active"));
else else
m_dprsStatus->SetLabel(_("Waiting"));
} else {
m_dprsStatus->SetLabel(_("Inactive")); m_dprsStatus->SetLabel(_("Inactive"));
}
for (unsigned int i = 0U; i < 4U; i++) { for (unsigned int i = 0U; i < 4U; i++) {
wxString callsign = status->getCallsign(i); wxString callsign = status->getCallsign(i);

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2010-2015 by Jonathan Naylor G4KLX * Copyright (C) 2010-2015,2018,2020 by Jonathan Naylor G4KLX
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -72,6 +72,9 @@ m_dextraPool(NULL),
m_dplusPool(NULL), m_dplusPool(NULL),
m_dcsPool(NULL), m_dcsPool(NULL),
m_g2Handler(NULL), m_g2Handler(NULL),
#if defined(ENABLE_NAT_TRAVERSAL)
m_natTraversal(NULL),
#endif
m_aprsWriter(NULL), m_aprsWriter(NULL),
m_irc(NULL), m_irc(NULL),
m_cache(), m_cache(),
@ -217,6 +220,13 @@ void CIRCDDBGatewayThread::run()
m_g2Handler = NULL; m_g2Handler = NULL;
} }
#if defined(ENABLE_NAT_TRAVERSAL)
if(m_g2Handler != NULL) {
m_natTraversal = new CNatTraversalHandler();
m_natTraversal->setG2Handler(m_g2Handler);
}
#endif
// Wait here until we have the essentials to run // Wait here until we have the essentials to run
while (!m_killed && (m_dextraPool == NULL || m_dplusPool == NULL || m_dcsPool == NULL || m_g2Handler == NULL || (m_icomRepeaterHandler == NULL && m_hbRepeaterHandler == NULL && m_dummyRepeaterHandler == NULL) || m_gatewayCallsign.IsEmpty())) while (!m_killed && (m_dextraPool == NULL || m_dplusPool == NULL || m_dcsPool == NULL || m_g2Handler == NULL || (m_icomRepeaterHandler == NULL && m_hbRepeaterHandler == NULL && m_dummyRepeaterHandler == NULL) || m_gatewayCallsign.IsEmpty()))
::wxMilliSleep(500UL); // 1/2 sec ::wxMilliSleep(500UL); // 1/2 sec
@ -318,10 +328,6 @@ void CIRCDDBGatewayThread::run()
CCCSHandler::setHeaderLogger(headerLogger); CCCSHandler::setHeaderLogger(headerLogger);
CCCSHandler::setHost(m_ccsHost); CCCSHandler::setHost(m_ccsHost);
// If no ircDDB then APRS is started immediately
if (m_aprsWriter != NULL && m_irc == NULL)
m_aprsWriter->setEnabled(true);
if (m_remoteEnabled && !m_remotePassword.IsEmpty() && m_remotePort > 0U) { if (m_remoteEnabled && !m_remotePassword.IsEmpty() && m_remotePort > 0U) {
m_remote = new CRemoteHandler(m_remotePassword, m_remotePort, m_gatewayAddress); m_remote = new CRemoteHandler(m_remotePassword, m_remotePort, m_gatewayAddress);
bool res = m_remote->open(); bool res = m_remote->open();
@ -409,6 +415,7 @@ void CIRCDDBGatewayThread::run()
} }
} }
wxLog::FlushActive();
::wxMilliSleep(TIME_PER_TIC_MS); ::wxMilliSleep(TIME_PER_TIC_MS);
} }
} }
@ -576,11 +583,10 @@ void CIRCDDBGatewayThread::setDCS(bool enabled)
m_dcsEnabled = enabled; m_dcsEnabled = enabled;
} }
void CIRCDDBGatewayThread::setXLX(bool enabled, bool overrideLocal, const wxString& xlxHostsFileName) void CIRCDDBGatewayThread::setXLX(bool enabled, const wxString& xlxHostsFileName)
{ {
m_xlxEnabled = enabled; m_xlxEnabled = enabled;
m_xlxHostsFileName = xlxHostsFileName; m_xlxHostsFileName = xlxHostsFileName;
m_xlxOverrideLocal = overrideLocal;
} }
void CIRCDDBGatewayThread::setCCS(bool enabled, const wxString& host) void CIRCDDBGatewayThread::setCCS(bool enabled, const wxString& host)
@ -689,24 +695,18 @@ void CIRCDDBGatewayThread::processIrcDDB()
if (m_lastStatus != IS_DISCONNECTED) { if (m_lastStatus != IS_DISCONNECTED) {
wxLogInfo(wxT("Disconnected from ircDDB")); wxLogInfo(wxT("Disconnected from ircDDB"));
m_lastStatus = IS_DISCONNECTED; m_lastStatus = IS_DISCONNECTED;
if (m_aprsWriter != NULL)
m_aprsWriter->setEnabled(false);
} }
break; break;
case 7: case 7:
if (m_lastStatus != IS_CONNECTED) { if (m_lastStatus != IS_CONNECTED) {
wxLogInfo(wxT("Connected to ircDDB")); wxLogInfo(wxT("Connected to ircDDB"));
m_lastStatus = IS_CONNECTED; m_lastStatus = IS_CONNECTED;
if (m_aprsWriter != NULL)
m_aprsWriter->setEnabled(true);
} }
break; break;
default: default:
if (m_lastStatus != IS_CONNECTING) { if (m_lastStatus != IS_CONNECTING) {
wxLogInfo(wxT("Connecting to ircDDB")); wxLogInfo(wxT("Connecting to ircDDB"));
m_lastStatus = IS_CONNECTING; m_lastStatus = IS_CONNECTING;
if (m_aprsWriter != NULL)
m_aprsWriter->setEnabled(false);
} }
break; break;
} }
@ -728,6 +728,9 @@ void CIRCDDBGatewayThread::processIrcDDB()
if (!address.IsEmpty()) { if (!address.IsEmpty()) {
wxLogMessage(wxT("USER: %s %s %s %s"), user.c_str(), repeater.c_str(), gateway.c_str(), address.c_str()); wxLogMessage(wxT("USER: %s %s %s %s"), user.c_str(), repeater.c_str(), gateway.c_str(), address.c_str());
m_cache.updateUser(user, repeater, gateway, address, timestamp, DP_DEXTRA, false, false); m_cache.updateUser(user, repeater, gateway, address, timestamp, DP_DEXTRA, false, false);
#if defined(ENABLE_NAT_TRAVERSAL)
m_natTraversal->traverseNatG2(address);
#endif
} else { } else {
wxLogMessage(wxT("USER: %s NOT FOUND"), user.c_str()); wxLogMessage(wxT("USER: %s NOT FOUND"), user.c_str());
} }
@ -744,6 +747,9 @@ void CIRCDDBGatewayThread::processIrcDDB()
if (!address.IsEmpty()) { if (!address.IsEmpty()) {
wxLogMessage(wxT("REPEATER: %s %s %s"), repeater.c_str(), gateway.c_str(), address.c_str()); wxLogMessage(wxT("REPEATER: %s %s %s"), repeater.c_str(), gateway.c_str(), address.c_str());
m_cache.updateRepeater(repeater, gateway, address, DP_DEXTRA, false, false); m_cache.updateRepeater(repeater, gateway, address, DP_DEXTRA, false, false);
#if defined(ENABLE_NAT_TRAVERSAL)
m_natTraversal->traverseNatG2(address);
#endif
} else { } else {
wxLogMessage(wxT("REPEATER: %s NOT FOUND"), repeater.c_str()); wxLogMessage(wxT("REPEATER: %s NOT FOUND"), repeater.c_str());
} }
@ -761,6 +767,9 @@ void CIRCDDBGatewayThread::processIrcDDB()
if (!address.IsEmpty()) { if (!address.IsEmpty()) {
wxLogMessage(wxT("GATEWAY: %s %s"), gateway.c_str(), address.c_str()); wxLogMessage(wxT("GATEWAY: %s %s"), gateway.c_str(), address.c_str());
m_cache.updateGateway(gateway, address, DP_DEXTRA, false, false); m_cache.updateGateway(gateway, address, DP_DEXTRA, false, false);
#if defined(ENABLE_NAT_TRAVERSAL)
m_natTraversal->traverseNatG2(address);
#endif
} else { } else {
wxLogMessage(wxT("GATEWAY: %s NOT FOUND"), gateway.c_str()); wxLogMessage(wxT("GATEWAY: %s NOT FOUND"), gateway.c_str());
} }
@ -1108,9 +1117,8 @@ void CIRCDDBGatewayThread::loadGateways()
void CIRCDDBGatewayThread::loadReflectors() void CIRCDDBGatewayThread::loadReflectors()
{ {
if(m_xlxEnabled && !m_xlxOverrideLocal) { if (m_xlxEnabled)
loadXLXReflectors(); loadXLXReflectors();
}
if (m_dplusEnabled) { if (m_dplusEnabled) {
wxFileName fileName(wxFileName::GetHomeDir(), DPLUS_HOSTS_FILE_NAME); wxFileName fileName(wxFileName::GetHomeDir(), DPLUS_HOSTS_FILE_NAME);
@ -1153,10 +1161,6 @@ void CIRCDDBGatewayThread::loadReflectors()
if (fileName.IsFileReadable()) if (fileName.IsFileReadable())
loadDCSReflectors(fileName.GetFullPath()); loadDCSReflectors(fileName.GetFullPath());
} }
if(m_xlxEnabled && m_xlxOverrideLocal) {
loadXLXReflectors();
}
} }
void CIRCDDBGatewayThread::loadDExtraReflectors(const wxString& fileName) void CIRCDDBGatewayThread::loadDExtraReflectors(const wxString& fileName)
@ -1258,6 +1262,10 @@ void CIRCDDBGatewayThread::loadXLXReflectors()
CHostFile hostFile = CHostFile(m_xlxHostsFileName, true); CHostFile hostFile = CHostFile(m_xlxHostsFileName, true);
for (unsigned int i = 0U; i < hostFile.getCount(); i++) { for (unsigned int i = 0U; i < hostFile.getCount(); i++) {
wxString reflector = hostFile.getName(i); wxString reflector = hostFile.getName(i);
if (!reflector.StartsWith(wxT("XLX")))
continue;
in_addr address = CUDPReaderWriter::lookup(hostFile.getAddress(i)); in_addr address = CUDPReaderWriter::lookup(hostFile.getAddress(i));
bool lock = hostFile.getLock(i); bool lock = hostFile.getLock(i);
@ -1274,10 +1282,10 @@ void CIRCDDBGatewayThread::loadXLXReflectors()
reflector.Truncate(LONG_CALLSIGN_LENGTH - 1U); reflector.Truncate(LONG_CALLSIGN_LENGTH - 1U);
reflector.Append(wxT("G")); reflector.Append(wxT("G"));
if(m_dcsEnabled && reflector.StartsWith(wxT("DCS"))) //if (m_dcsEnabled && reflector.StartsWith(wxT("DCS")))
m_cache.updateGateway(reflector, addrText, DP_DCS, lock, true); m_cache.updateGateway(reflector, addrText, DP_DCS, lock, true);
else if(m_dextraEnabled && reflector.StartsWith(wxT("XRF"))) //else if (m_dextraEnabled && reflector.StartsWith(wxT("XRF")))
m_cache.updateGateway(reflector, addrText, DP_DEXTRA, lock, true); // m_cache.updateGateway(reflector, addrText, DP_DEXTRA, lock, true);
count++; count++;
} }
@ -1316,7 +1324,7 @@ CIRCDDBGatewayStatusData* CIRCDDBGatewayThread::getStatus() const
{ {
bool aprsStatus = false; bool aprsStatus = false;
if (m_aprsWriter != NULL) if (m_aprsWriter != NULL)
aprsStatus = m_aprsWriter->isConnected(); aprsStatus = true;
CIRCDDBGatewayStatusData* status = new CIRCDDBGatewayStatusData(m_lastStatus, aprsStatus); CIRCDDBGatewayStatusData* status = new CIRCDDBGatewayStatusData(m_lastStatus, aprsStatus);

View file

@ -35,6 +35,9 @@
#include "IRCDDB.h" #include "IRCDDB.h"
#include "Timer.h" #include "Timer.h"
#include "Defs.h" #include "Defs.h"
#if defined(ENABLE_NAT_TRAVERSAL)
#include "NatTraversalHandler.h"
#endif
#include <wx/wx.h> #include <wx/wx.h>
@ -58,7 +61,7 @@ public:
virtual void setDExtra(bool enabled, unsigned int maxDongles); virtual void setDExtra(bool enabled, unsigned int maxDongles);
virtual void setDPlus(bool enabled, unsigned int maxDongles, const wxString& login); virtual void setDPlus(bool enabled, unsigned int maxDongles, const wxString& login);
virtual void setDCS(bool enabled); virtual void setDCS(bool enabled);
virtual void setXLX(bool enabled, bool overrideLocal, const wxString& fileName); virtual void setXLX(bool enabled, const wxString& fileName);
virtual void setCCS(bool enabled, const wxString& host); virtual void setCCS(bool enabled, const wxString& host);
virtual void setLog(bool enabled); virtual void setLog(bool enabled);
virtual void setAPRSWriter(CAPRSWriter* writer); virtual void setAPRSWriter(CAPRSWriter* writer);
@ -92,6 +95,9 @@ private:
CDPlusProtocolHandlerPool* m_dplusPool; CDPlusProtocolHandlerPool* m_dplusPool;
CDCSProtocolHandlerPool* m_dcsPool; CDCSProtocolHandlerPool* m_dcsPool;
CG2ProtocolHandler* m_g2Handler; CG2ProtocolHandler* m_g2Handler;
#if defined(ENABLE_NAT_TRAVERSAL)
CNatTraversalHandler* m_natTraversal;
#endif
CAPRSWriter* m_aprsWriter; CAPRSWriter* m_aprsWriter;
CIRCDDB* m_irc; CIRCDDB* m_irc;
CCacheManager m_cache; CCacheManager m_cache;
@ -103,7 +109,6 @@ private:
wxString m_dplusLogin; wxString m_dplusLogin;
bool m_dcsEnabled; bool m_dcsEnabled;
bool m_xlxEnabled; bool m_xlxEnabled;
bool m_xlxOverrideLocal;
wxString m_xlxHostsFileName; wxString m_xlxHostsFileName;
bool m_ccsEnabled; bool m_ccsEnabled;
wxString m_ccsHost; wxString m_ccsHost;

View file

@ -1,16 +1,29 @@
OBJECTS = IRCDDBGatewayAppD.o IRCDDBGatewayStatusData.o IRCDDBGatewayThread.o IRCDDBGatewayThreadHelper.o OBJECTS = IRCDDBGatewayAppD.o IRCDDBGatewayStatusData.o IRCDDBGatewayThread.o IRCDDBGatewayThreadHelper.o
.PHONY: all
all: ircddbgatewayd all: ircddbgatewayd
ircddbgatewayd: $(OBJECTS) ircddbgatewayd: $(OBJECTS) ../ircDDB/IRCDDB.a ../Common/Common.a
$(CXX) $(OBJECTS) ../Common/Common.a ../ircDDB/IRCDDB.a $(LDFLAGS) $(LIBS) -o ircddbgatewayd $(CXX) $(OBJECTS) ../Common/Common.a ../ircDDB/IRCDDB.a $(LDFLAGS) $(LIBS) -o ircddbgatewayd
-include $(OBJECTS:.o=.d)
%.o: %.cpp %.o: %.cpp
$(CXX) -DwxUSE_GUI=0 $(CFLAGS) -I../Common -I../ircDDB -c -o $@ $< $(CXX) -DwxUSE_GUI=0 $(CFLAGS) -I../Common -I../ircDDB -c -o $@ $<
$(CXX) -MM -DwxUSE_GUI=0 $(CFLAGS) -I../Common -I../ircDDB $< > $*.d
.PHONY: install
install: install:
install -g bin -o root -m 0775 ircddbgatewayd $(BINDIR) install -g root -o root -m 0755 ircddbgatewayd $(DESTDIR)$(BINDIR)
cp ircddbgateway-emptyconfig $(DESTDIR)$(CONFDIR)/ircddbgateway
ifeq ($(TARGET), opendv)
cp ../debian/ircddbgatewayd.ircddbgatewayd.service $(DESTDIR)/etc/systemd/system/ircddbgatewayd.service
endif
.PHONY: clean
clean: clean:
$(RM) ircddbgatewayd *.o *.d *.bak *~ $(RM) ircddbgatewayd *.o *.d *.bak *~
../Common/Common.a:
../ircDDB/IRCDDB.a:

26
ircDDBGateway/MakefileGUI Normal file
View file

@ -0,0 +1,26 @@
OBJECTS = IRCDDBGatewayApp.o IRCDDBGatewayFrame.o IRCDDBGatewayLogRedirect.o IRCDDBGatewayStatusData.o IRCDDBGatewayThread.o \
IRCDDBGatewayThreadHelper.o
.PHONY: all
all: ircddbgateway
ircddbgateway: $(OBJECTS) ../GUICommon/GUICommon.a ../Common/Common.a
$(CXX) $(OBJECTS) ../GUICommon/GUICommon.a ../Common/Common.a ../ircDDB/IRCDDB.a $(LDFLAGS) $(GUILIBS) -o ircddbgateway
-include $(OBJECTS:.o=.d)
%.o: %.cpp
$(CXX) $(CFLAGS) -I../Common -I../GUICommon -I../ircDDB -c -o $@ $<
$(CXX) -MM $(CFLAGS) -I../Common -I../GUICommon -I../ircDDB $< > $*.d
.PHONY: install
install:
install -g bin -o root -m 0775 ircddbgateway $(BINDIR)
.PHONY: clean
clean:
$(RM) ircddbgateway *.o *.d *.bak *~
../GUICommon/GUICommon.a:
../Common/Common.a:

View file

@ -22,29 +22,29 @@
<ProjectGuid>{6DDA3497-66A3-4856-BAD4-1DDCDBDFF959}</ProjectGuid> <ProjectGuid>{6DDA3497-66A3-4856-BAD4-1DDCDBDFF959}</ProjectGuid>
<RootNamespace>ircDDBGateway</RootNamespace> <RootNamespace>ircDDBGateway</RootNamespace>
<Keyword>Win32Proj</Keyword> <Keyword>Win32Proj</Keyword>
<WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion> <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
@ -80,9 +80,11 @@
<OutDir>$(SolutionDir)$(Configuration)\</OutDir> <OutDir>$(SolutionDir)$(Configuration)\</OutDir>
<IntDir>$(Configuration)\</IntDir> <IntDir>$(Configuration)\</IntDir>
<LinkIncremental>false</LinkIncremental> <LinkIncremental>false</LinkIncremental>
<IncludePath>$(WXWIN)\include;$(WXWIN)\lib\vc_dll\mswu;$(IncludePath)</IncludePath>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental> <LinkIncremental>false</LinkIncremental>
<IncludePath>$(WXWIN)\include;$(WXWIN)\lib\vc_x64_dll\mswu;$(IncludePath)</IncludePath>
</PropertyGroup> </PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile> <ClCompile>

View file

@ -0,0 +1,183 @@
gatewayType=0
gatewayCallsign=
gatewayAddress=0.0.0.0
icomAddress=172.16.0.20
icomPort=20000
hbAddress=127.0.0.1
hbPort=20010
latitude=
longitude=
description1=
description2=
url=
repeaterCall1=
repeaterBand1=B
repeaterType1=0
repeaterAddress1=127.0.0.1
repeaterPort1=20011
reflector1=
atStartup1=0
reconnect1=0
frequency1=434.00000
offset1=0.0000
rangeKms1=0.000
latitude1=0.000000
longitude1=0.000000
agl1=0.000
description1_1=
description1_2=
url1=
band1_1=0
band1_2=0
band1_3=0
repeaterCall2=
repeaterBand2=
repeaterType2=0
repeaterAddress2=127.0.0.1
repeaterPort2=20012
reflector2=
atStartup2=0
reconnect2=0
frequency2=0.00000
offset2=0.0000
rangeKms2=0.000
latitude2=0.000000
longitude2=0.000000
agl2=0.000
description2_1=
description2_2=
url2=
band2_1=0
band2_2=0
band2_3=0
repeaterCall3=
repeaterBand3=
repeaterType3=0
repeaterAddress3=127.0.0.1
repeaterPort3=20013
reflector3=
atStartup3=0
reconnect3=0
frequency3=0.00000
offset3=0.0000
rangeKms3=0.000
latitude3=0.000000
longitude3=0.000000
agl3=0.000
description3_1=
description3_2=
url3=
band3_1=0
band3_2=0
band3_3=0
repeaterCall4=
repeaterBand4=
repeaterType4=0
repeaterAddress4=127.0.0.1
repeaterPort4=20014
reflector4=
atStartup4=0
reconnect4=0
frequency4=0.00000
offset4=0.0000
rangeKms4=0.000
latitude4=0.000000
longitude4=0.000000
agl4=0.000
description4_1=
description4_2=
url4=
band4_1=0
band4_2=0
band4_3=0
ircddbEnabled=1
ircddbHostname=rr.openquad.net
ircddbUsername=
ircddbPassword=
ircddbEnabled2=0
ircddbHostname2=rr.openquad.net
ircddbUsername2=
ircddbPassword2=
ircddbEnabled3=0
ircddbHostname3=
ircddbUsername3=
ircddbPassword3=
ircddbEnabled4=0
ircddbHostname4=
ircddbUsername4=
ircddbPassword4=
aprsEnabled=1
aprsHostname=rotate.aprs2.net
aprsPassword=
aprsPort=14580
dextraEnabled=1
dextraMaxDongles=5
dplusEnabled=0
dplusMaxDongles=5
dplusLogin=
dcsEnabled=1
ccsEnabled=1
ccsHost=CCS704
xlxEnabled=1
xlxHostsFileUrl=http://xlxapi.rlx.lu/api.php?do=GetReflectorHostname
starNetBand1=A
starNetCallsign1=
starNetLogoff1=
starNetInfo1=
starNetPermanent1=
starNetUserTimeout1=300
starNetGroupTimeout1=300
starNetCallsignSwitch1=0
starNetTXMsgSwitch1=1
starNetReflector1=
starNetBand2=A
starNetCallsign2=
starNetLogoff2=
starNetInfo2=
starNetPermanent2=
starNetUserTimeout2=300
starNetGroupTimeout2=300
starNetCallsignSwitch2=0
starNetTXMsgSwitch2=1
starNetReflector2=
starNetBand3=A
starNetCallsign3=
starNetLogoff3=
starNetInfo3=
starNetPermanent3=
starNetUserTimeout3=300
starNetGroupTimeout3=300
starNetCallsignSwitch3=0
starNetTXMsgSwitch3=1
starNetReflector3=
starNetBand4=A
starNetCallsign4=
starNetLogoff4=
starNetInfo4=
starNetPermanent4=
starNetUserTimeout4=300
starNetGroupTimeout4=300
starNetCallsignSwitch4=0
starNetTXMsgSwitch4=1
starNetReflector4=
starNetBand5=A
starNetCallsign5=
starNetLogoff5=
starNetInfo5=
starNetPermanent5=
starNetUserTimeout5=300
starNetGroupTimeout5=300
starNetCallsignSwitch5=0
starNetTXMsgSwitch5=1
starNetReflector5=
remoteEnabled=1
remotePassword=
remotePort=54321
language=0
infoEnabled=1
echoEnabled=1
logEnabled=0
dratsEnabled=0
dtmfEnabled=1
windowX=-1
windowY=-1

131
ircDDBGateway32.nsi Normal file
View file

@ -0,0 +1,131 @@
;NSIS Modern User Interface
;Repeater install script
;Written by Jonathan Naylor
;--------------------------------
;Include Modern UI
!include "MUI2.nsh"
;--------------------------------
;Configuration
;General
Name "ircDDB Gateway 20180719"
OutFile "ircDDBGateway32-20180719.exe"
;Folder selection page
InstallDir "$PROGRAMFILES\ircDDBGateway"
;Request application privileges for Windows Vista
RequestExecutionLevel admin
;--------------------------------
;Interface Settings
!define MUI_ABORTWARNING
;--------------------------------
;Pages
!insertmacro MUI_PAGE_LICENSE "COPYING.txt"
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
;--------------------------------
;Languages
!insertmacro MUI_LANGUAGE "English"
;--------------------------------
;Installer Sections
Section "Repeater Program Files" SecProgram
SetOutPath "$INSTDIR"
File "Release\ircDDBGateway.exe"
File "Release\ircDDBGatewayConfig.exe"
File "Release\RemoteControl.exe"
File "Release\StarNetServer.exe"
File "Release\TextTransmit.exe"
File "Release\TimerControl.exe"
File "Release\TimeServer.exe"
File "Release\VoiceTransmit.exe"
File "C:\wxWidgets-3.0.4\lib\vc_dll\wxbase30u_vc_custom.dll"
File "C:\wxWidgets-3.0.4\lib\vc_dll\wxmsw30u_adv_vc_custom.dll"
File "C:\wxWidgets-3.0.4\lib\vc_dll\wxmsw30u_core_vc_custom.dll"
File "CHANGES.txt"
File "COPYING.txt"
File "Data\CCS_Hosts.txt"
File "Data\DCS_Hosts.txt"
File "Data\DExtra_Hosts.txt"
File "Data\DPlus_Hosts.txt"
File "Data\TIME_de_DE.ambe"
File "Data\TIME_de_DE.indx"
File "Data\TIME_en_GB.ambe"
File "Data\TIME_en_GB.indx"
File "Data\TIME_en_US.ambe"
File "Data\TIME_en_US.indx"
File "Data\TIME_fr_FR.ambe"
File "Data\TIME_fr_FR.indx"
File "Data\TIME_se_SE.ambe"
File "Data\TIME_se_SE.indx"
File "Data\de_DE.ambe"
File "Data\de_DE.indx"
File "Data\dk_DK.ambe"
File "Data\dk_DK.indx"
File "Data\en_GB.ambe"
File "Data\en_GB.indx"
File "Data\en_US.ambe"
File "Data\en_US.indx"
File "Data\es_ES.ambe"
File "Data\es_ES.indx"
File "Data\fr_FR.ambe"
File "Data\fr_FR.indx"
File "Data\it_IT.ambe"
File "Data\it_IT.indx"
File "Data\no_NO.ambe"
File "Data\no_NO.indx"
File "Data\pl_PL.ambe"
File "Data\pl_PL.indx"
File "Data\se_SE.ambe"
File "Data\se_SE.indx"
;Create start menu entry
CreateDirectory "$SMPROGRAMS\ircDDBGateway"
CreateShortCut "$SMPROGRAMS\ircDDBGateway\ircDDB Gateway.lnk" "$INSTDIR\ircDDBGateway.exe"
CreateShortCut "$SMPROGRAMS\ircDDBGateway\ircDDB Gateway Config.lnk" "$INSTDIR\ircDDBGatewayConfig.exe"
CreateShortCut "$SMPROGRAMS\ircDDBGateway\Remote Control.lnk" "$INSTDIR\RemoteControl.exe"
CreateShortCut "$SMPROGRAMS\ircDDBGateway\StarNet Server.lnk" "$INSTDIR\StarNetServer.exe"
CreateShortCut "$SMPROGRAMS\ircDDBGateway\Timer Control.lnk" "$INSTDIR\TimerControl.exe"
CreateShortCut "$SMPROGRAMS\ircDDBGateway\Time Server.lnk" "$INSTDIR\TimeServer.exe"
CreateShortCut "$SMPROGRAMS\ircDDBGateway\Changes.lnk" "$INSTDIR\CHANGES.txt"
CreateShortCut "$SMPROGRAMS\ircDDBGateway\Licence.lnk" "$INSTDIR\COPYING.txt"
CreateShortCut "$SMPROGRAMS\ircDDBGateway\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
;Create uninstaller
WriteUninstaller "$INSTDIR\Uninstall.exe"
SectionEnd
;--------------------------------
;Uninstaller Section
Section "Uninstall"
Delete "$INSTDIR\*.*"
RMDir "$INSTDIR"
Delete "$SMPROGRAMS\ircDDBGateway\*.*"
RMDir "$SMPROGRAMS\ircDDBGateway"
DeleteRegKey /ifempty HKCU "Software\G4KLX\IRCDDB Gateway"
DeleteRegKey /ifempty HKCU "Software\G4KLX\Remote Control"
DeleteRegKey /ifempty HKCU "Software\G4KLX\StarNet Server"
DeleteRegKey /ifempty HKCU "Software\G4KLX\Timer Control"
DeleteRegKey /ifempty HKCU "Software\G4KLX\Time Server"
SectionEnd

131
ircDDBGateway64.nsi Normal file
View file

@ -0,0 +1,131 @@
;NSIS Modern User Interface
;Repeater install script
;Written by Jonathan Naylor
;--------------------------------
;Include Modern UI
!include "MUI2.nsh"
;--------------------------------
;Configuration
;General
Name "ircDDB Gateway 20180719"
OutFile "ircDDBGateway64-20180719.exe"
;Folder selection page
InstallDir "$PROGRAMFILES64\ircDDBGateway"
;Request application privileges for Windows Vista
RequestExecutionLevel admin
;--------------------------------
;Interface Settings
!define MUI_ABORTWARNING
;--------------------------------
;Pages
!insertmacro MUI_PAGE_LICENSE "COPYING.txt"
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
;--------------------------------
;Languages
!insertmacro MUI_LANGUAGE "English"
;--------------------------------
;Installer Sections
Section "Repeater Program Files" SecProgram
SetOutPath "$INSTDIR"
File "x64\Release\ircDDBGateway.exe"
File "x64\Release\ircDDBGatewayConfig.exe"
File "x64\Release\RemoteControl.exe"
File "x64\Release\StarNetServer.exe"
File "x64\Release\TextTransmit.exe"
File "x64\Release\TimerControl.exe"
File "x64\Release\TimeServer.exe"
File "x64\Release\VoiceTransmit.exe"
File "C:\wxWidgets-3.0.4\lib\vc_x64_dll\wxbase30u_vc_x64_custom.dll"
File "C:\wxWidgets-3.0.4\lib\vc_x64_dll\wxmsw30u_adv_vc_x64_custom.dll"
File "C:\wxWidgets-3.0.4\lib\vc_x64_dll\wxmsw30u_core_vc_x64_custom.dll"
File "CHANGES.txt"
File "COPYING.txt"
File "Data\CCS_Hosts.txt"
File "Data\DCS_Hosts.txt"
File "Data\DExtra_Hosts.txt"
File "Data\DPlus_Hosts.txt"
File "Data\TIME_de_DE.ambe"
File "Data\TIME_de_DE.indx"
File "Data\TIME_en_GB.ambe"
File "Data\TIME_en_GB.indx"
File "Data\TIME_en_US.ambe"
File "Data\TIME_en_US.indx"
File "Data\TIME_fr_FR.ambe"
File "Data\TIME_fr_FR.indx"
File "Data\TIME_se_SE.ambe"
File "Data\TIME_se_SE.indx"
File "Data\de_DE.ambe"
File "Data\de_DE.indx"
File "Data\dk_DK.ambe"
File "Data\dk_DK.indx"
File "Data\en_GB.ambe"
File "Data\en_GB.indx"
File "Data\en_US.ambe"
File "Data\en_US.indx"
File "Data\es_ES.ambe"
File "Data\es_ES.indx"
File "Data\fr_FR.ambe"
File "Data\fr_FR.indx"
File "Data\it_IT.ambe"
File "Data\it_IT.indx"
File "Data\no_NO.ambe"
File "Data\no_NO.indx"
File "Data\pl_PL.ambe"
File "Data\pl_PL.indx"
File "Data\se_SE.ambe"
File "Data\se_SE.indx"
;Create start menu entry
CreateDirectory "$SMPROGRAMS\ircDDBGateway"
CreateShortCut "$SMPROGRAMS\ircDDBGateway\ircDDB Gateway.lnk" "$INSTDIR\ircDDBGateway.exe"
CreateShortCut "$SMPROGRAMS\ircDDBGateway\ircDDB Gateway Config.lnk" "$INSTDIR\ircDDBGatewayConfig.exe"
CreateShortCut "$SMPROGRAMS\ircDDBGateway\Remote Control.lnk" "$INSTDIR\RemoteControl.exe"
CreateShortCut "$SMPROGRAMS\ircDDBGateway\StarNet Server.lnk" "$INSTDIR\StarNetServer.exe"
CreateShortCut "$SMPROGRAMS\ircDDBGateway\Timer Control.lnk" "$INSTDIR\TimerControl.exe"
CreateShortCut "$SMPROGRAMS\ircDDBGateway\Time Server.lnk" "$INSTDIR\TimeServer.exe"
CreateShortCut "$SMPROGRAMS\ircDDBGateway\Changes.lnk" "$INSTDIR\CHANGES.txt"
CreateShortCut "$SMPROGRAMS\ircDDBGateway\Licence.lnk" "$INSTDIR\COPYING.txt"
CreateShortCut "$SMPROGRAMS\ircDDBGateway\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
;Create uninstaller
WriteUninstaller "$INSTDIR\Uninstall.exe"
SectionEnd
;--------------------------------
;Uninstaller Section
Section "Uninstall"
Delete "$INSTDIR\*.*"
RMDir "$INSTDIR"
Delete "$SMPROGRAMS\ircDDBGateway\*.*"
RMDir "$SMPROGRAMS\ircDDBGateway"
DeleteRegKey /ifempty HKCU "Software\G4KLX\IRCDDB Gateway"
DeleteRegKey /ifempty HKCU "Software\G4KLX\Remote Control"
DeleteRegKey /ifempty HKCU "Software\G4KLX\StarNet Server"
DeleteRegKey /ifempty HKCU "Software\G4KLX\Timer Control"
DeleteRegKey /ifempty HKCU "Software\G4KLX\Time Server"
SectionEnd

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2010-2015,2018 by Jonathan Naylor G4KLX * Copyright (C) 2010-2015,2018,2020 by Jonathan Naylor G4KLX
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -65,6 +65,7 @@ m_starNet3(NULL),
m_starNet4(NULL), m_starNet4(NULL),
m_starNet5(NULL), m_starNet5(NULL),
m_remote(NULL), m_remote(NULL),
m_gpsd(NULL),
m_miscellaneous(NULL) m_miscellaneous(NULL)
{ {
SetMenuBar(createMenuBar()); SetMenuBar(createMenuBar());
@ -103,9 +104,8 @@ m_miscellaneous(NULL)
m_config->getDCS(dcsEnabled, ccsEnabled, ccsHost); m_config->getDCS(dcsEnabled, ccsEnabled, ccsHost);
bool xlxEnabled; bool xlxEnabled;
bool xlxOverrideLocal;
wxString xlxHostsFileUrl; wxString xlxHostsFileUrl;
m_config->getXLX(xlxEnabled, xlxOverrideLocal, xlxHostsFileUrl); m_config->getXLX(xlxEnabled, xlxHostsFileUrl);
GATEWAY_TYPE gatewayType; GATEWAY_TYPE gatewayType;
wxString gatewayCallsign, gatewayAddress, icomAddress, hbAddress, description1, description2, url; wxString gatewayCallsign, gatewayAddress, icomAddress, hbAddress, description1, description2, url;
@ -178,7 +178,7 @@ m_miscellaneous(NULL)
bool ircDDBEnabled; bool ircDDBEnabled;
wxString ircDDBHostname, ircDDBUsername, ircDDBPassword; wxString ircDDBHostname, ircDDBUsername, ircDDBPassword;
m_config->getIrcDDB(ircDDBEnabled, ircDDBHostname, ircDDBUsername, ircDDBPassword); m_config->getIrcDDB1(ircDDBEnabled, ircDDBHostname, ircDDBUsername, ircDDBPassword);
m_ircDDB = new CIRCDDBGatewayConfigIrcDDBSet(noteBook, -1, APPLICATION_NAME, ircDDBEnabled, ircDDBHostname, ircDDBUsername, ircDDBPassword); m_ircDDB = new CIRCDDBGatewayConfigIrcDDBSet(noteBook, -1, APPLICATION_NAME, ircDDBEnabled, ircDDBHostname, ircDDBUsername, ircDDBPassword);
noteBook->AddPage(m_ircDDB, wxT("ircDDB 1st Network"), false); noteBook->AddPage(m_ircDDB, wxT("ircDDB 1st Network"), false);
@ -194,12 +194,12 @@ m_miscellaneous(NULL)
m_ircDDB4 = new CIRCDDBGatewayConfigIrcDDBSet(noteBook, -1, APPLICATION_NAME, ircDDBEnabled, ircDDBHostname, ircDDBUsername, ircDDBPassword); m_ircDDB4 = new CIRCDDBGatewayConfigIrcDDBSet(noteBook, -1, APPLICATION_NAME, ircDDBEnabled, ircDDBHostname, ircDDBUsername, ircDDBPassword);
noteBook->AddPage(m_ircDDB4, wxT("ircDDB 4th Network"), false); noteBook->AddPage(m_ircDDB4, wxT("ircDDB 4th Network"), false);
wxString aprsHostname; wxString aprsAddress;
unsigned int aprsPort; unsigned int aprsPort;
bool aprsEnabled; bool aprsEnabled;
m_config->getDPRS(aprsEnabled, aprsHostname, aprsPort); m_config->getDPRS(aprsEnabled, aprsAddress, aprsPort);
m_dprs = new CDPRSSet(noteBook, -1, APPLICATION_NAME, aprsEnabled, aprsHostname, aprsPort); m_dprs = new CDPRSSet(noteBook, -1, APPLICATION_NAME, aprsEnabled, aprsAddress, aprsPort);
noteBook->AddPage(m_dprs, wxT("D-PRS"), false); noteBook->AddPage(m_dprs, wxT("D-PRS"), false);
m_dextra = new CDExtraSet(noteBook, -1, APPLICATION_NAME, dextraEnabled, maxDExtraDongles, MAX_DEXTRA_LINKS); m_dextra = new CDExtraSet(noteBook, -1, APPLICATION_NAME, dextraEnabled, maxDExtraDongles, MAX_DEXTRA_LINKS);
@ -211,7 +211,7 @@ m_miscellaneous(NULL)
m_dcs = new CDCSSet(noteBook, -1, APPLICATION_NAME, dcsEnabled, ccsEnabled, ccsHost); m_dcs = new CDCSSet(noteBook, -1, APPLICATION_NAME, dcsEnabled, ccsEnabled, ccsHost);
noteBook->AddPage(m_dcs, _("DCS and CCS"), false); noteBook->AddPage(m_dcs, _("DCS and CCS"), false);
m_xlx = new CXLXSet(noteBook, -1, APPLICATION_NAME, xlxEnabled, xlxOverrideLocal, xlxHostsFileUrl); m_xlx = new CXLXSet(noteBook, -1, APPLICATION_NAME, xlxEnabled, xlxHostsFileUrl);
noteBook->AddPage(m_xlx, _("XLX Hosts File"), false); noteBook->AddPage(m_xlx, _("XLX Hosts File"), false);
#if defined(DEXTRA_LINK) || defined(DCS_LINK) #if defined(DEXTRA_LINK) || defined(DCS_LINK)
@ -314,6 +314,13 @@ m_miscellaneous(NULL)
m_remote = new CRemoteSet(noteBook, -1, APPLICATION_NAME, remoteEnabled, remotePassword, remotePort); m_remote = new CRemoteSet(noteBook, -1, APPLICATION_NAME, remoteEnabled, remotePassword, remotePort);
noteBook->AddPage(m_remote, wxT("Remote"), false); noteBook->AddPage(m_remote, wxT("Remote"), false);
bool gpsdEnabled;
wxString gpsdAddress, gpsdPort;
m_config->getGPSD(gpsdEnabled, gpsdAddress, gpsdPort);
m_gpsd = new CGPSDSet(noteBook, -1, APPLICATION_NAME, gpsdEnabled, gpsdAddress, gpsdPort);
noteBook->AddPage(m_gpsd, wxT("GPSD"), false);
TEXT_LANG language; TEXT_LANG language;
bool infoEnabled, echoEnabled, logEnabled, dratsEnabled, dtmfEnabled; bool infoEnabled, echoEnabled, logEnabled, dratsEnabled, dtmfEnabled;
m_config->getMiscellaneous(language, infoEnabled, echoEnabled, logEnabled, dratsEnabled, dtmfEnabled); m_config->getMiscellaneous(language, infoEnabled, echoEnabled, logEnabled, dratsEnabled, dtmfEnabled);
@ -371,7 +378,7 @@ void CIRCDDBGatewayConfigFrame::onSave(wxCommandEvent&)
!m_repeaterInfo4->Validate() || !m_repeaterInfo4->Validate() ||
!m_ircDDB->Validate() || !m_ircDDB2->Validate() || !m_ircDDB3->Validate() || !m_ircDDB4->Validate() || !m_dprs->Validate() || !m_dplus->Validate() || !m_dcs->Validate() || !m_xlx->Validate() || !m_ircDDB->Validate() || !m_ircDDB2->Validate() || !m_ircDDB3->Validate() || !m_ircDDB4->Validate() || !m_dprs->Validate() || !m_dplus->Validate() || !m_dcs->Validate() || !m_xlx->Validate() ||
!m_starNet1->Validate() || !m_starNet2->Validate() || !m_starNet3->Validate() || !m_starNet4->Validate() || !m_starNet1->Validate() || !m_starNet2->Validate() || !m_starNet3->Validate() || !m_starNet4->Validate() ||
!m_starNet5->Validate() || !m_remote->Validate() || !m_miscellaneous->Validate()) !m_starNet5->Validate() || !m_remote->Validate() || !m_gpsd->Validate() || !m_miscellaneous->Validate())
return; return;
GATEWAY_TYPE gatewayType = m_gateway->getType(); GATEWAY_TYPE gatewayType = m_gateway->getType();
@ -476,7 +483,7 @@ void CIRCDDBGatewayConfigFrame::onSave(wxCommandEvent&)
wxString ircDDBHostname = m_ircDDB->getHostname(); wxString ircDDBHostname = m_ircDDB->getHostname();
wxString ircDDBUsername = m_ircDDB->getUsername(); wxString ircDDBUsername = m_ircDDB->getUsername();
wxString ircDDBPassword = m_ircDDB->getPassword(); wxString ircDDBPassword = m_ircDDB->getPassword();
m_config->setIrcDDB(ircDDBEnabled, ircDDBHostname, ircDDBUsername, ircDDBPassword); m_config->setIrcDDB1(ircDDBEnabled, ircDDBHostname, ircDDBUsername, ircDDBPassword);
ircDDBEnabled = m_ircDDB2->getEnabled(); ircDDBEnabled = m_ircDDB2->getEnabled();
ircDDBHostname = m_ircDDB2->getHostname(); ircDDBHostname = m_ircDDB2->getHostname();
@ -497,9 +504,9 @@ void CIRCDDBGatewayConfigFrame::onSave(wxCommandEvent&)
m_config->setIrcDDB4(ircDDBEnabled, ircDDBHostname, ircDDBUsername, ircDDBPassword); m_config->setIrcDDB4(ircDDBEnabled, ircDDBHostname, ircDDBUsername, ircDDBPassword);
bool aprsEnabled = m_dprs->getEnabled(); bool aprsEnabled = m_dprs->getEnabled();
wxString aprsHostname = m_dprs->getHostname(); wxString aprsAddress = m_dprs->getAddress();
unsigned int aprsPort = m_dprs->getPort(); unsigned int aprsPort = m_dprs->getPort();
m_config->setDPRS(aprsEnabled, aprsHostname, aprsPort); m_config->setDPRS(aprsEnabled, aprsAddress, aprsPort);
bool dextraEnabled = m_dextra->getEnabled(); bool dextraEnabled = m_dextra->getEnabled();
unsigned int maxDExtraDongles = m_dextra->getMaxDongles(); unsigned int maxDExtraDongles = m_dextra->getMaxDongles();
@ -516,9 +523,8 @@ void CIRCDDBGatewayConfigFrame::onSave(wxCommandEvent&)
m_config->setDCS(dcsEnabled, ccsEnabled, ccsHost); m_config->setDCS(dcsEnabled, ccsEnabled, ccsHost);
bool xlxEnabled = m_xlx->getXLXEnabled(); bool xlxEnabled = m_xlx->getXLXEnabled();
bool xlxOverrideLocal = m_xlx->getXLXOverrideLocal();
wxString xlxHostsFileUrl = m_xlx->getXLXHostsFileUrl(); wxString xlxHostsFileUrl = m_xlx->getXLXHostsFileUrl();
m_config->setXLX(xlxEnabled, xlxOverrideLocal, xlxHostsFileUrl); m_config->setXLX(xlxEnabled, xlxHostsFileUrl);
wxString starNetBand1 = m_starNet1->getBand(); wxString starNetBand1 = m_starNet1->getBand();
wxString starNetCallsign1 = m_starNet1->getCallsign(); wxString starNetCallsign1 = m_starNet1->getCallsign();
@ -605,6 +611,11 @@ void CIRCDDBGatewayConfigFrame::onSave(wxCommandEvent&)
unsigned int remotePort = m_remote->getPort(); unsigned int remotePort = m_remote->getPort();
m_config->setRemote(remoteEnabled, remotePassword, remotePort); m_config->setRemote(remoteEnabled, remotePassword, remotePort);
bool gpsdEnabled = m_gpsd->getEnabled();
wxString gpsdAddress = m_gpsd->getAddress();
wxString gpsdPort = m_gpsd->getPort();
m_config->setGPSD(gpsdEnabled, gpsdAddress, gpsdPort);
TEXT_LANG language = m_miscellaneous->getLanguage(); TEXT_LANG language = m_miscellaneous->getLanguage();
bool infoEnabled = m_miscellaneous->getInfoEnabled(); bool infoEnabled = m_miscellaneous->getInfoEnabled();
bool echoEnabled = m_miscellaneous->getEchoEnabled(); bool echoEnabled = m_miscellaneous->getEchoEnabled();
@ -627,7 +638,7 @@ void CIRCDDBGatewayConfigFrame::onAbout(wxCommandEvent&)
{ {
wxAboutDialogInfo info; wxAboutDialogInfo info;
info.AddDeveloper(wxT("Jonathan Naylor, G4KLX")); info.AddDeveloper(wxT("Jonathan Naylor, G4KLX"));
info.SetCopyright(wxT("(C) 2010-2018 using GPL v2 or later")); info.SetCopyright(wxT("(C) 2010-2020 using GPL v2 or later"));
info.SetName(APPLICATION_NAME); info.SetName(APPLICATION_NAME);
info.SetVersion(VERSION); info.SetVersion(VERSION);
info.SetDescription(_("This program configures the ircDDB Gateway.")); info.SetDescription(_("This program configures the ircDDB Gateway."));

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2010-2014 by Jonathan Naylor G4KLX * Copyright (C) 2010-2014,2018,2020 by Jonathan Naylor G4KLX
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -30,6 +30,7 @@
#include "DExtraSet.h" #include "DExtraSet.h"
#include "DPlusSet.h" #include "DPlusSet.h"
#include "DPRSSet.h" #include "DPRSSet.h"
#include "GPSDSet.h"
#include "DCSSet.h" #include "DCSSet.h"
#include "XLXSet.h" #include "XLXSet.h"
#include "Defs.h" #include "Defs.h"
@ -72,6 +73,7 @@ private:
CStarNetSet* m_starNet4; CStarNetSet* m_starNet4;
CStarNetSet* m_starNet5; CStarNetSet* m_starNet5;
CRemoteSet* m_remote; CRemoteSet* m_remote;
CGPSDSet* m_gpsd;
CIRCDDBGatewayConfigMiscellaneousSet* m_miscellaneous; CIRCDDBGatewayConfigMiscellaneousSet* m_miscellaneous;
DECLARE_EVENT_TABLE() DECLARE_EVENT_TABLE()

View file

@ -1,17 +1,25 @@
OBJECTS = IRCDDBGatewayConfigApp.o IRCDDBGatewayConfigFrame.o IRCDDBGatewayConfigGatewaySet.o IRCDDBGatewayConfigIrcDDBSet.o \ OBJECTS = IRCDDBGatewayConfigApp.o IRCDDBGatewayConfigFrame.o IRCDDBGatewayConfigGatewaySet.o IRCDDBGatewayConfigIrcDDBSet.o \
IRCDDBGatewayConfigMiscellaneousSet.o IRCDDBGatewayConfigMiscellaneousSet.o
.PHONY: all
all: ircddbgatewayconfig all: ircddbgatewayconfig
ircddbgatewayconfig: $(OBJECTS) ircddbgatewayconfig: $(OBJECTS) ../GUICommon/GUICommon.a ../Common/Common.a
$(CXX) $(OBJECTS) ../GUICommon/GUICommon.a ../Common/Common.a $(LDFLAGS) $(GUILIBS) -o ircddbgatewayconfig $(CXX) $(OBJECTS) ../GUICommon/GUICommon.a ../Common/Common.a $(LDFLAGS) $(GUILIBS) -o ircddbgatewayconfig
-include $(OBJECTS:.o=.d)
%.o: %.cpp %.o: %.cpp
$(CXX) $(CFLAGS) -I../Common -I../GUICommon -c -o $@ $< $(CXX) $(CFLAGS) -I../Common -I../GUICommon -c -o $@ $<
$(CXX) -MM -DwxUSE_GUI=0 $(CFLAGS) -I../Common -I../GUICommon $< > $*.d
.PHONY: install
install: install:
install -g bin -o root -m 0775 ircddbgatewayconfig $(BINDIR) install -g root -o root -m 0755 ircddbgatewayconfig $(DESTDIR)$(BINDIR)
.PHONY: clean
clean: clean:
$(RM) ircddbgatewayconfig *.o *.d *.bak *~ $(RM) ircddbgatewayconfig *.o *.d *.bak *~
../Common/Common.a:
../GUICommon/GUICommon.a:

View file

@ -22,29 +22,29 @@
<ProjectGuid>{D0A32505-822B-4936-A61B-A5151966AEAA}</ProjectGuid> <ProjectGuid>{D0A32505-822B-4936-A61B-A5151966AEAA}</ProjectGuid>
<RootNamespace>ircDDBGatewayConfig</RootNamespace> <RootNamespace>ircDDBGatewayConfig</RootNamespace>
<Keyword>Win32Proj</Keyword> <Keyword>Win32Proj</Keyword>
<WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion> <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
@ -80,9 +80,11 @@
<OutDir>$(SolutionDir)$(Configuration)\</OutDir> <OutDir>$(SolutionDir)$(Configuration)\</OutDir>
<IntDir>$(Configuration)\</IntDir> <IntDir>$(Configuration)\</IntDir>
<LinkIncremental>false</LinkIncremental> <LinkIncremental>false</LinkIncremental>
<IncludePath>$(WXWIN)\include;$(WXWIN)\lib\vc_dll\mswu;$(IncludePath)</IncludePath>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental> <LinkIncremental>false</LinkIncremental>
<IncludePath>$(WXWIN)\include;$(WXWIN)\lib\vc_x64_dll\mswu;$(IncludePath)</IncludePath>
</PropertyGroup> </PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile> <ClCompile>