mirror of
https://github.com/g4klx/ircDDBGateway.git
synced 2025-12-06 05:32:02 +01:00
Merge branch 'master' into master
This commit is contained in:
commit
56fb73ee67
2
.gitignore
vendored
2
.gitignore
vendored
|
|
@ -8,4 +8,4 @@ Release
|
|||
*.bak
|
||||
.vs
|
||||
*.a
|
||||
|
||||
*.d
|
||||
|
|
|
|||
|
|
@ -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
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
|
@ -24,7 +24,7 @@
|
|||
|
||||
|
||||
CAPRSTransmit::CAPRSTransmit(const wxString& callsign, const wxString& text) :
|
||||
m_socket(wxEmptyString, 0U),
|
||||
m_socket(),
|
||||
m_repeaterCallsign(callsign),
|
||||
m_APRSCallsign(callsign),
|
||||
m_text(text)
|
||||
|
|
|
|||
|
|
@ -22,29 +22,29 @@
|
|||
<ProjectGuid>{F26EA1DB-74CF-4C52-A425-00235C8ABED2}</ProjectGuid>
|
||||
<RootNamespace>APRSTransmit</RootNamespace>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
|
|
@ -80,9 +80,11 @@
|
|||
<OutDir>$(SolutionDir)$(Configuration)\</OutDir>
|
||||
<IntDir>$(Configuration)\$(ProjectName)</IntDir>
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<IncludePath>$(WXWIN)\include;$(WXWIN)\lib\vc_dll\mswu;$(IncludePath)</IncludePath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<IncludePath>$(WXWIN)\include;$(WXWIN)\lib\vc_x64_dll\mswu;$(IncludePath)</IncludePath>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
|
|
|
|||
|
|
@ -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
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
|
@ -20,7 +20,6 @@
|
|||
#include "DStarDefines.h"
|
||||
#include "APRSTransmit.h"
|
||||
#include "APRSTransmitAppD.h"
|
||||
#include "APRSWriterThread.h"
|
||||
|
||||
#include <wx/textfile.h>
|
||||
#include <wx/cmdline.h>
|
||||
|
|
@ -35,7 +34,6 @@
|
|||
const wxChar* REPEATER_PARAM = wxT("Repeater");
|
||||
const wxChar* APRS_HOST = wxT("host");
|
||||
const wxChar* APRS_PORT = wxT("port");
|
||||
const wxChar* APRS_FILTER = wxT("filter");
|
||||
const wxChar* DAEMON_SWITCH = wxT("daemon");
|
||||
|
||||
static CAPRSTransmitAppD* m_aprsTransmit = NULL;
|
||||
|
|
@ -45,12 +43,6 @@ static void handler(int signum)
|
|||
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)
|
||||
{
|
||||
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.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_FILTER, wxEmptyString, wxEmptyString, wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL);
|
||||
parser.AddSwitch(DAEMON_SWITCH, wxEmptyString, wxEmptyString, wxCMD_LINE_PARAM_OPTIONAL);
|
||||
|
||||
int cmd = parser.Parse();
|
||||
|
|
@ -73,7 +64,7 @@ int main(int argc, char** argv)
|
|||
}
|
||||
|
||||
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();
|
||||
return 1;
|
||||
}
|
||||
|
|
@ -91,26 +82,17 @@ int main(int argc, char** argv)
|
|||
repeater.MakeUpper();
|
||||
|
||||
long aprsPort;
|
||||
if(!parser.Found(APRS_PORT, &aprsPort))
|
||||
aprsPort = 14580;
|
||||
if (!parser.Found(APRS_PORT, &aprsPort))
|
||||
aprsPort = 14580L;
|
||||
|
||||
wxString aprsHost;
|
||||
if(!parser.Found(APRS_HOST, &aprsHost)){
|
||||
if (!parser.Found(APRS_HOST, &aprsHost))
|
||||
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);
|
||||
|
||||
#if defined(__WINDOWS__)
|
||||
m_aprsTransmit = new CAPRSTransmitAppD(repeater, aprsHost, aprsPort, aprsFilter, daemon);
|
||||
m_aprsTransmit = new CAPRSTransmitAppD(repeater, aprsHost, aprsPort, daemon);
|
||||
if (!m_aprsTransmit->init()) {
|
||||
::wxUninitialize();
|
||||
return 1;
|
||||
|
|
@ -143,7 +125,7 @@ int main(int argc, char** argv)
|
|||
::fclose(fp);
|
||||
}
|
||||
|
||||
m_aprsTransmit = new CAPRSTransmitAppD(repeater, aprsHost, aprsPort, aprsFilter, daemon);
|
||||
m_aprsTransmit = new CAPRSTransmitAppD(repeater, aprsHost, aprsPort, daemon);
|
||||
if (!m_aprsTransmit->init()) {
|
||||
::wxUninitialize();
|
||||
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_repeater(repeater),
|
||||
m_aprsHost(aprsHost),
|
||||
m_aprsFilter(aprsFilter),
|
||||
m_aprsPort(aprsPort),
|
||||
m_aprsThread(NULL),
|
||||
m_aprsSocket(NULL),
|
||||
m_run(false),
|
||||
m_checker(NULL),
|
||||
m_daemon(daemon)
|
||||
|
|
@ -220,9 +201,8 @@ void CAPRSTransmitAppD::run()
|
|||
if(m_run) return;
|
||||
|
||||
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_aprsThread->setReadAPRSCallback(aprsFrameCallback);
|
||||
m_aprsThread->start();
|
||||
m_aprsSocket = new CUDPReaderWriter;
|
||||
m_aprsSocket->open();
|
||||
|
||||
wxString * aprsFrame;
|
||||
|
||||
|
|
@ -230,38 +210,36 @@ void CAPRSTransmitAppD::run()
|
|||
while(m_run){
|
||||
wxMilliSleep(10U);
|
||||
aprsFrame = m_aprsFramesQueue->getData();
|
||||
if(aprsFrame){
|
||||
if (aprsFrame != NULL) {
|
||||
CAPRSTransmit aprsTransmit(m_repeater, wxString(*aprsFrame));
|
||||
aprsTransmit.run();
|
||||
delete aprsFrame;
|
||||
}
|
||||
}
|
||||
|
||||
m_aprsThread->stop();
|
||||
|
||||
cleanup();
|
||||
}
|
||||
|
||||
|
||||
void CAPRSTransmitAppD::cleanup()
|
||||
{
|
||||
m_aprsThread->setReadAPRSCallback(NULL);
|
||||
|
||||
if(m_aprsFramesQueue)
|
||||
if (m_aprsFramesQueue != NULL)
|
||||
{
|
||||
while(m_aprsFramesQueue->peek()) delete m_aprsFramesQueue->getData();
|
||||
while (m_aprsFramesQueue->peek()) delete m_aprsFramesQueue->getData();
|
||||
delete m_aprsFramesQueue;
|
||||
m_aprsFramesQueue = NULL;
|
||||
}
|
||||
if(m_checker) {
|
||||
|
||||
if (m_checker != NULL) {
|
||||
delete m_checker;
|
||||
m_checker = NULL;
|
||||
}
|
||||
|
||||
if(m_aprsThread)
|
||||
if (m_aprsSocket != NULL)
|
||||
{
|
||||
delete m_aprsThread;
|
||||
m_aprsThread = NULL;
|
||||
m_aprsSocket->close();
|
||||
delete m_aprsSocket;
|
||||
m_aprsSocket = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
|
@ -20,8 +20,8 @@
|
|||
#ifndef APRSTransmitAppD_H
|
||||
#define APRSTransmitAppD_H
|
||||
|
||||
#include "UDPReaderWriter.h"
|
||||
#include "RingBuffer.h"
|
||||
#include "APRSWriterThread.h"
|
||||
|
||||
#include <wx/wx.h>
|
||||
#include <wx/config.h>
|
||||
|
|
@ -31,7 +31,7 @@
|
|||
class CAPRSTransmitAppD {
|
||||
|
||||
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();
|
||||
|
||||
CRingBuffer<wxString*> * m_aprsFramesQueue;
|
||||
|
|
@ -41,9 +41,9 @@ public:
|
|||
void kill();
|
||||
|
||||
private:
|
||||
wxString m_repeater, m_aprsHost, m_aprsFilter;
|
||||
wxString m_repeater, m_aprsHost;
|
||||
unsigned int m_aprsPort;
|
||||
CAPRSWriterThread * m_aprsThread;
|
||||
CUDPReaderWriter * m_aprsSocket;
|
||||
bool m_run;
|
||||
wxSingleInstanceChecker * m_checker;
|
||||
bool m_daemon;
|
||||
|
|
|
|||
|
|
@ -22,29 +22,29 @@
|
|||
<ProjectGuid>{C706EF5D-3917-4796-8BEB-823498A1B13C}</ProjectGuid>
|
||||
<RootNamespace>APRSTransmit</RootNamespace>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
|
|
@ -80,9 +80,11 @@
|
|||
<OutDir>$(SolutionDir)$(Configuration)\</OutDir>
|
||||
<IntDir>$(Configuration)\$(ProjectName)\</IntDir>
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<IncludePath>$(WXWIN)\include;$(WXWIN)\lib\vc_dll\mswu;$(IncludePath)</IncludePath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<IncludePath>$(WXWIN)\include;$(WXWIN)\lib\vc_x64_dll\mswu;$(IncludePath)</IncludePath>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
|
|
|
|||
|
|
@ -1,16 +1,24 @@
|
|||
OBJECTS = APRSParser.o APRSTransmitAppD.o APRSTransmit.o
|
||||
|
||||
.PHONY: all
|
||||
all: aprstransmitd
|
||||
|
||||
aprstransmitd: $(OBJECTS)
|
||||
aprstransmitd: $(OBJECTS) ../Common/Common.a
|
||||
$(CXX) $(OBJECTS) ../Common/Common.a $(LDFLAGS) $(LIBS) -o aprstransmitd
|
||||
|
||||
-include $(OBJECTS:.o=.d)
|
||||
|
||||
%.o: %.cpp
|
||||
$(CXX) -DwxUSE_GUI=0 $(CFLAGS) -I../Common -c -o $@ $<
|
||||
$(CXX) -MM -DwxUSE_GUI=0 $(CFLAGS) -I../Common $< > $*.d
|
||||
|
||||
.PHONY: install
|
||||
install:
|
||||
install -g bin -o root -m 0775 aprstransmitd $(BINDIR)
|
||||
install -g root -o root -m 0755 aprstransmitd $(DESTDIR)$(BINDIR)
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
$(RM) aprstransmitd *.o *.d *.bak *~
|
||||
|
||||
../Common/Common.a:
|
||||
|
||||
|
|
|
|||
85
BUILD.md
Normal file
85
BUILD.md
Normal 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.
|
||||
|
||||
14
CHANGES.txt
14
CHANGES.txt
|
|
@ -1,4 +1,4 @@
|
|||
ircDDB Gateway - 20180509
|
||||
ircDDB Gateway - 20180627
|
||||
=========================
|
||||
|
||||
20101010
|
||||
|
|
@ -1476,3 +1476,15 @@ Added APRSTransmit program from F4FXL.
|
|||
Move to wxWidgets-3.0.x.
|
||||
UPdate to VS2017 on Windows for 32 and 64 bit compilation.
|
||||
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.
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
* 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 SLOW_DATA_BLOCK_LENGTH = 6U;
|
||||
|
||||
const char APRS_OVERLAY = '\\';
|
||||
const char APRS_SYMBOL = 'K';
|
||||
|
||||
CAPRSCollector::CAPRSCollector() :
|
||||
m_state(AS_NONE),
|
||||
m_ggaData(NULL),
|
||||
|
|
@ -35,16 +38,14 @@ m_rmcValid(false),
|
|||
m_crcData(NULL),
|
||||
m_crcLength(0U),
|
||||
m_crcValid(false),
|
||||
m_txtData(NULL),
|
||||
m_txtLength(0U),
|
||||
m_txtValid(false),
|
||||
m_buffer(NULL),
|
||||
m_slowData(SS_FIRST)
|
||||
m_slowData(SS_FIRST),
|
||||
m_collector(),
|
||||
m_callsign()
|
||||
{
|
||||
m_ggaData = new unsigned char[APRS_DATA_LENGTH];
|
||||
m_rmcData = 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];
|
||||
}
|
||||
|
||||
|
|
@ -53,10 +54,14 @@ CAPRSCollector::~CAPRSCollector()
|
|||
delete[] m_ggaData;
|
||||
delete[] m_rmcData;
|
||||
delete[] m_crcData;
|
||||
delete[] m_txtData;
|
||||
delete[] m_buffer;
|
||||
}
|
||||
|
||||
void CAPRSCollector::writeHeader(const wxString& callsign)
|
||||
{
|
||||
m_callsign = callsign;
|
||||
}
|
||||
|
||||
bool CAPRSCollector::writeData(const unsigned char* data)
|
||||
{
|
||||
wxASSERT(data != NULL);
|
||||
|
|
@ -77,11 +82,11 @@ bool CAPRSCollector::writeData(const unsigned char* data)
|
|||
break;
|
||||
}
|
||||
|
||||
// Is it GPS data, or are we collecting data already?
|
||||
if ((m_buffer[0U] & SLOW_DATA_TYPE_MASK) != SLOW_DATA_TYPE_GPS)
|
||||
return false;
|
||||
// Is it GPS data?
|
||||
if ((m_buffer[0U] & SLOW_DATA_TYPE_MASK) == SLOW_DATA_TYPE_GPS)
|
||||
return addGPSData(m_buffer + 1U);
|
||||
|
||||
return addData(m_buffer + 1U);
|
||||
return false;
|
||||
}
|
||||
|
||||
void CAPRSCollector::reset()
|
||||
|
|
@ -93,9 +98,9 @@ void CAPRSCollector::reset()
|
|||
m_rmcValid = false;
|
||||
m_crcLength = 0U;
|
||||
m_crcValid = false;
|
||||
m_txtLength = 0U;
|
||||
m_txtValid = false;
|
||||
m_slowData = SS_FIRST;
|
||||
m_collector.Clear();
|
||||
m_callsign.Clear();
|
||||
}
|
||||
|
||||
void CAPRSCollector::sync()
|
||||
|
|
@ -103,193 +108,175 @@ void CAPRSCollector::sync()
|
|||
m_slowData = SS_FIRST;
|
||||
}
|
||||
|
||||
bool CAPRSCollector::addData(const unsigned char* data)
|
||||
bool CAPRSCollector::addGPSData(const unsigned char* data)
|
||||
{
|
||||
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_ggaLength = 0U;
|
||||
m_ggaValid = false;
|
||||
m_rmcLength = 0U;
|
||||
m_rmcValid = false;
|
||||
m_txtLength = 0U;
|
||||
m_txtValid = false;
|
||||
addGGAData(data);
|
||||
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_rmcLength = 0U;
|
||||
m_rmcValid = false;
|
||||
m_txtLength = 0U;
|
||||
m_txtValid = false;
|
||||
addRMCData(data);
|
||||
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_crcLength = 0U;
|
||||
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;
|
||||
}
|
||||
|
||||
void CAPRSCollector::addGGAData(const unsigned char* data)
|
||||
void CAPRSCollector::addGGAData()
|
||||
{
|
||||
for (unsigned int i = 0U; i < 5U; i++) {
|
||||
unsigned char c = data[i];
|
||||
int n2 = m_collector.Find(wxT('\x0A'), true);
|
||||
if (n2 == wxNOT_FOUND)
|
||||
return;
|
||||
|
||||
m_ggaData[m_ggaLength] = c & 0x7FU;
|
||||
int n1 = m_collector.Find(wxT("$GPGGA"));
|
||||
if (n1 == wxNOT_FOUND)
|
||||
return;
|
||||
|
||||
if (n2 < n1)
|
||||
return;
|
||||
|
||||
unsigned int len = n2 - n1;
|
||||
|
||||
if (len >= APRS_DATA_LENGTH) {
|
||||
m_ggaLength = 0U;
|
||||
m_ggaValid = false;
|
||||
m_state = AS_NONE;
|
||||
return;
|
||||
}
|
||||
|
||||
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++;
|
||||
|
||||
if (m_ggaLength >= APRS_DATA_LENGTH) {
|
||||
// CUtils::dump(wxT("Missed end of $GPGGA data"), m_ggaData, m_ggaLength);
|
||||
m_ggaLength = 0U;
|
||||
m_ggaValid = false;
|
||||
m_state = AS_NONE;
|
||||
return;
|
||||
}
|
||||
|
||||
if (c == 0x0AU) {
|
||||
bool ret = checkXOR(m_ggaData + 1U, m_ggaLength - 1U);
|
||||
if (ret) {
|
||||
// CUtils::dump(wxT("$GPGGA Valid"), m_ggaData, m_ggaLength);
|
||||
m_ggaValid = true;
|
||||
m_state = AS_RMC;
|
||||
return;
|
||||
} else {
|
||||
// CUtils::dump(wxT("$GPGGA Bad checksum"), m_ggaData, m_ggaLength);
|
||||
m_ggaLength = 0U;
|
||||
m_ggaValid = false;
|
||||
m_state = AS_RMC;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool ret = checkXOR(m_ggaData + 1U, m_ggaLength - 1U);
|
||||
if (ret) {
|
||||
// CUtils::dump(wxT("$GPGGA Valid"), m_ggaData, m_ggaLength);
|
||||
m_ggaValid = true;
|
||||
m_state = AS_RMC;
|
||||
} else {
|
||||
// CUtils::dump(wxT("$GPGGA Bad checksum"), m_ggaData, m_ggaLength);
|
||||
m_ggaLength = 0U;
|
||||
m_ggaValid = false;
|
||||
m_state = AS_RMC;
|
||||
}
|
||||
|
||||
m_collector = m_collector.Mid(n2);
|
||||
}
|
||||
|
||||
void CAPRSCollector::addRMCData(const unsigned char* data)
|
||||
bool CAPRSCollector::addRMCData()
|
||||
{
|
||||
for (unsigned int i = 0U; i < 5U; i++) {
|
||||
unsigned char c = data[i];
|
||||
int n2 = m_collector.Find(wxT('\x0A'), true);
|
||||
if (n2 == wxNOT_FOUND)
|
||||
return false;
|
||||
|
||||
m_rmcData[m_rmcLength] = c & 0x7FU;
|
||||
int n1 = m_collector.Find(wxT("$GPRMC"));
|
||||
if (n1 == wxNOT_FOUND)
|
||||
return false;
|
||||
|
||||
if (n2 < n1)
|
||||
return false;
|
||||
|
||||
unsigned int len = n2 - n1;
|
||||
|
||||
if (len >= APRS_DATA_LENGTH) {
|
||||
m_rmcLength = 0U;
|
||||
m_rmcValid = false;
|
||||
m_state = AS_NONE;
|
||||
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 (m_rmcLength >= APRS_DATA_LENGTH) {
|
||||
// CUtils::dump(wxT("Missed end of $GPRMC data"), m_rmcData, m_rmcLength);
|
||||
m_rmcLength = 0U;
|
||||
m_rmcValid = false;
|
||||
m_state = AS_NONE;
|
||||
return;
|
||||
}
|
||||
|
||||
if (c == 0x0AU) {
|
||||
bool ret = checkXOR(m_rmcData + 1U, m_rmcLength - 1U);
|
||||
if (ret) {
|
||||
// CUtils::dump(wxT("$GPRMC Valid"), m_rmcData, m_rmcLength);
|
||||
m_rmcValid = true;
|
||||
m_state = AS_TXT;
|
||||
return;
|
||||
} else {
|
||||
// CUtils::dump(wxT("$GPRMC Bad checksum"), m_rmcData, m_rmcLength);
|
||||
m_rmcLength = 0U;
|
||||
m_rmcValid = false;
|
||||
m_state = AS_TXT;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool ret = checkXOR(m_rmcData + 1U, m_rmcLength - 1U);
|
||||
if (ret) {
|
||||
// CUtils::dump(wxT("$GPRMC Valid"), m_rmcData, m_rmcLength);
|
||||
m_rmcValid = true;
|
||||
} else {
|
||||
// CUtils::dump(wxT("$GPRMC Bad checksum"), m_rmcData, m_rmcLength);
|
||||
m_rmcLength = 0U;
|
||||
m_rmcValid = false;
|
||||
}
|
||||
|
||||
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++) {
|
||||
unsigned char c = data[i];
|
||||
int n2 = m_collector.Find(wxT('\x0D'), true);
|
||||
if (n2 == wxNOT_FOUND)
|
||||
return false;
|
||||
|
||||
// m_crcData[m_crcLength] = c & 0x7FU; // XXX
|
||||
m_crcData[m_crcLength] = c;
|
||||
int n1 = m_collector.Find(wxT("$$CRC"));
|
||||
if (n1 == wxNOT_FOUND)
|
||||
return false;
|
||||
|
||||
if (n2 < n1)
|
||||
return false;
|
||||
|
||||
unsigned int len = n2 - n1;
|
||||
|
||||
if (len >= APRS_DATA_LENGTH) {
|
||||
m_crcLength = 0U;
|
||||
m_crcValid = false;
|
||||
m_state = AS_NONE;
|
||||
return false;
|
||||
}
|
||||
|
||||
m_crcLength = 0U;
|
||||
for (int i = n1; i <= n2; i++) {
|
||||
m_crcData[m_crcLength] = m_collector.GetChar(i);
|
||||
m_crcLength++;
|
||||
|
||||
if (m_crcLength >= APRS_DATA_LENGTH) {
|
||||
// CUtils::dump(wxT("Missed end of $$CRC data"), m_crcData, m_crcLength);
|
||||
m_state = AS_NONE;
|
||||
m_crcLength = 0U;
|
||||
m_crcValid = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (c == 0x0DU) {
|
||||
bool ret = checkCRC(m_crcData, m_crcLength);
|
||||
if (ret) {
|
||||
// CUtils::dump(wxT("$$CRC Valid"), m_crcData, m_crcLength);
|
||||
m_state = AS_NONE;
|
||||
m_crcValid = true;
|
||||
return true;
|
||||
} else {
|
||||
// CUtils::dump(wxT("$$CRC Bad checksum"), m_crcData, m_crcLength);
|
||||
m_state = AS_NONE;
|
||||
m_crcLength = 0U;
|
||||
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_txtLength = 0U;
|
||||
m_txtValid = 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;
|
||||
}
|
||||
}
|
||||
bool ret = checkCRC(m_crcData, m_crcLength);
|
||||
if (ret) {
|
||||
// CUtils::dump(wxT("$$CRC Valid"), m_crcData, m_crcLength);
|
||||
m_crcValid = true;
|
||||
m_state = AS_NONE;
|
||||
m_collector = m_collector.Mid(n2);
|
||||
return true;
|
||||
} else {
|
||||
// CUtils::dump(wxT("$$CRC Bad checksum"), m_crcData, m_crcLength);
|
||||
m_crcLength = 0U;
|
||||
m_crcValid = false;
|
||||
m_state = AS_NONE;
|
||||
m_collector = m_collector.Mid(n2);
|
||||
return false;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
// Have we got GGA and text data?
|
||||
if (m_ggaValid && m_txtValid) {
|
||||
// Have we got GGA data?
|
||||
if (m_ggaValid) {
|
||||
unsigned int len = convertNMEA1(data, length);
|
||||
|
||||
m_ggaLength = 0U;
|
||||
m_rmcLength = 0U;
|
||||
m_txtLength = 0U;
|
||||
m_ggaValid = false;
|
||||
m_rmcValid = false;
|
||||
m_txtValid = false;
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
// Have we got RMC and text data?
|
||||
if (m_rmcValid && m_txtValid) {
|
||||
// Have we got RMC data?
|
||||
if (m_rmcValid) {
|
||||
unsigned int len = convertNMEA2(data, length);
|
||||
|
||||
m_ggaLength = 0U;
|
||||
m_rmcLength = 0U;
|
||||
m_txtLength = 0U;
|
||||
m_ggaValid = false;
|
||||
m_rmcValid = false;
|
||||
m_txtValid = false;
|
||||
|
||||
return len;
|
||||
}
|
||||
|
|
@ -418,7 +401,7 @@ unsigned int CAPRSCollector::convertNMEA1(unsigned char* data, unsigned int)
|
|||
unsigned int nGGA = 0U;
|
||||
|
||||
char* str = (char*)m_ggaData;
|
||||
for (;;) {
|
||||
while (nGGA < 20U) {
|
||||
char* p = mystrsep(&str, ",\r\n");
|
||||
|
||||
pGGA[nGGA++] = p;
|
||||
|
|
@ -435,25 +418,9 @@ unsigned int CAPRSCollector::convertNMEA1(unsigned char* data, unsigned int)
|
|||
return 0U;
|
||||
|
||||
char callsign[10U];
|
||||
::memset(callsign, ' ', 10U);
|
||||
::strncpy(callsign, (char*)m_txtData, 7U);
|
||||
dstarCallsignToAPRS(m_callsign, callsign);
|
||||
|
||||
// This can't fail!
|
||||
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);
|
||||
::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);
|
||||
|
||||
// Get the bearing and speed from the RMC data
|
||||
if (m_rmcValid) {
|
||||
|
|
@ -464,7 +431,7 @@ unsigned int CAPRSCollector::convertNMEA1(unsigned char* data, unsigned int)
|
|||
|
||||
str = (char*)m_rmcData;
|
||||
for (;;) {
|
||||
p = mystrsep(&str, ",\r\n");
|
||||
char* p = mystrsep(&str, ",\r\n");
|
||||
|
||||
pRMC[nRMC++] = p;
|
||||
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) {
|
||||
// Convert altitude from metres to feet
|
||||
int altitude = ::atoi(pGGA[9U]);
|
||||
|
|
@ -512,7 +464,7 @@ unsigned int CAPRSCollector::convertNMEA2(unsigned char* data, unsigned int)
|
|||
unsigned int nRMC = 0U;
|
||||
|
||||
char* str = (char*)m_rmcData;
|
||||
for (;;) {
|
||||
while (nRMC < 20U) {
|
||||
char* p = mystrsep(&str, ",\r\n");
|
||||
|
||||
pRMC[nRMC++] = p;
|
||||
|
|
@ -529,25 +481,9 @@ unsigned int CAPRSCollector::convertNMEA2(unsigned char* data, unsigned int)
|
|||
return 0U;
|
||||
|
||||
char callsign[10U];
|
||||
::memset(callsign, ' ', 10U);
|
||||
::strncpy(callsign, (char*)m_txtData, 7U);
|
||||
dstarCallsignToAPRS(m_callsign, callsign);
|
||||
|
||||
// This can't fail!
|
||||
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);
|
||||
::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);
|
||||
|
||||
if (pRMC[7U] != NULL && pRMC[8U] != NULL && ::strlen(pRMC[7U]) > 0U && ::strlen(pRMC[8U]) > 0U) {
|
||||
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);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
// Function taken from DPRSIntf.java from Pete Loveall AE5PL
|
||||
void CAPRSCollector::getSymbol(const unsigned char* data, char& symbol, char& overlay)
|
||||
void CAPRSCollector::dstarCallsignToAPRS(const wxString& dstarCallsign, char* aprsCallsign) const
|
||||
{
|
||||
symbol = '.';
|
||||
wxASSERT(aprsCallsign != NULL);
|
||||
|
||||
if (data[3U] == ' ') {
|
||||
int offset = -1;
|
||||
wxString first = dstarCallsign.BeforeFirst(wxT(' '));
|
||||
wxString last = dstarCallsign.AfterLast(wxT(' '));
|
||||
|
||||
switch (data[0U]) {
|
||||
case 'B':
|
||||
case 'O':
|
||||
offset = -33;
|
||||
break;
|
||||
case 'P':
|
||||
case 'A':
|
||||
offset = 0;
|
||||
break;
|
||||
case 'M':
|
||||
case 'N':
|
||||
offset = -24;
|
||||
break;
|
||||
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;
|
||||
}
|
||||
}
|
||||
if (last.IsEmpty() || first.IsSameAs(last)) {
|
||||
unsigned int n = 0U;
|
||||
for (unsigned int i = 0U; i < first.Len(); i++)
|
||||
aprsCallsign[n++] = first.GetChar(i);
|
||||
aprsCallsign[n++] = '\0';
|
||||
} else {
|
||||
unsigned int n = 0U;
|
||||
for (unsigned int i = 0U; i < first.Len(); i++)
|
||||
aprsCallsign[n++] = first.GetChar(i);
|
||||
aprsCallsign[n++] = '-';
|
||||
for (unsigned int i = 0U; i < last.Len(); i++)
|
||||
aprsCallsign[n++] = last.GetChar(i);
|
||||
aprsCallsign[n++] = '\0';
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -27,8 +27,7 @@ enum APRS_STATE {
|
|||
AS_NONE,
|
||||
AS_GGA,
|
||||
AS_RMC,
|
||||
AS_CRC,
|
||||
AS_TXT
|
||||
AS_CRC
|
||||
};
|
||||
|
||||
class CAPRSCollector {
|
||||
|
|
@ -36,12 +35,14 @@ public:
|
|||
CAPRSCollector();
|
||||
~CAPRSCollector();
|
||||
|
||||
void writeHeader(const wxString& callsign);
|
||||
|
||||
bool writeData(const unsigned char* data);
|
||||
|
||||
void sync();
|
||||
|
||||
void reset();
|
||||
|
||||
void sync();
|
||||
|
||||
unsigned int getData(unsigned char* data, unsigned int length);
|
||||
|
||||
private:
|
||||
|
|
@ -55,17 +56,16 @@ private:
|
|||
unsigned char* m_crcData;
|
||||
unsigned int m_crcLength;
|
||||
bool m_crcValid;
|
||||
unsigned char* m_txtData;
|
||||
unsigned int m_txtLength;
|
||||
bool m_txtValid;
|
||||
unsigned char* m_buffer;
|
||||
SLOWDATA_STATE m_slowData;
|
||||
wxString m_collector;
|
||||
wxString m_callsign;
|
||||
|
||||
bool addData(const unsigned char* data);
|
||||
void addGGAData(const unsigned char* data);
|
||||
void addRMCData(const unsigned char* data);
|
||||
bool addCRCData(const unsigned char* data);
|
||||
bool addTXTData(const unsigned char* data);
|
||||
bool addGPSData(const unsigned char* data);
|
||||
|
||||
void addGGAData();
|
||||
bool addRMCData();
|
||||
bool addCRCData();
|
||||
|
||||
bool checkXOR(const unsigned char* data, 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 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;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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
|
||||
* 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) :
|
||||
m_thread(NULL),
|
||||
m_enabled(false),
|
||||
m_idTimer(1000U, 20U * 60U), // 20 minutes
|
||||
CAPRSWriter::CAPRSWriter(const wxString& address, unsigned int port, const wxString& gateway) :
|
||||
m_idTimer(1000U),
|
||||
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(!gateway.IsEmpty());
|
||||
|
||||
m_thread = new CAPRSWriterThread(gateway, address, hostname, port);
|
||||
|
||||
m_gateway = gateway;
|
||||
m_gateway.Truncate(LONG_CALLSIGN_LENGTH - 1U);
|
||||
m_gateway.Trim();
|
||||
|
||||
m_aprsAddress = CUDPReaderWriter::lookup(address);
|
||||
}
|
||||
|
||||
CAPRSWriter::~CAPRSWriter()
|
||||
|
|
@ -144,7 +151,7 @@ CAPRSWriter::~CAPRSWriter()
|
|||
m_array.clear();
|
||||
}
|
||||
|
||||
void CAPRSWriter::setPort(const wxString& callsign, const wxString& band, double frequency, double offset, double range, double latitude, double longitude, double agl)
|
||||
void CAPRSWriter::setPortFixed(const wxString& callsign, const wxString& band, double frequency, double offset, double range, double latitude, double longitude, double agl)
|
||||
{
|
||||
wxString temp = callsign;
|
||||
temp.resize(LONG_CALLSIGN_LENGTH - 1U, wxT(' '));
|
||||
|
|
@ -153,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);
|
||||
}
|
||||
|
||||
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()
|
||||
{
|
||||
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)
|
||||
|
|
@ -183,16 +245,6 @@ void CAPRSWriter::writeData(const wxString& callsign, const CAMBEData& data)
|
|||
if (!complete)
|
||||
return;
|
||||
|
||||
if (!m_enabled) {
|
||||
collector->reset();
|
||||
return;
|
||||
}
|
||||
|
||||
if (!m_thread->isConnected()) {
|
||||
collector->reset();
|
||||
return;
|
||||
}
|
||||
|
||||
// Check the transmission timer
|
||||
bool ok = entry->isOK();
|
||||
if (!ok) {
|
||||
|
|
@ -223,67 +275,59 @@ void CAPRSWriter::writeData(const wxString& callsign, const CAMBEData& data)
|
|||
body = body.Left(n);
|
||||
|
||||
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];
|
||||
::memset(ascii, 0x00, 500U);
|
||||
for (unsigned int i = 0U; i < output.Len(); 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();
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
m_idTimer.clock(ms);
|
||||
|
||||
if (m_idTimer.hasExpired()) {
|
||||
sendIdFrames();
|
||||
m_idTimer.start();
|
||||
}
|
||||
#if defined(USE_GPSD)
|
||||
if (m_gpsdEnabled) {
|
||||
if (m_idTimer.hasExpired()) {
|
||||
sendIdFramesMobile();
|
||||
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)
|
||||
it->second->clock(ms);
|
||||
}
|
||||
|
||||
bool CAPRSWriter::isConnected() const
|
||||
{
|
||||
return m_thread->isConnected();
|
||||
}
|
||||
|
||||
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(&now);
|
||||
struct tm* tm = ::gmtime(&now);
|
||||
|
|
@ -361,34 +405,196 @@ void CAPRSWriter::sendIdFrames()
|
|||
lon.Replace(wxT(","), wxT("."));
|
||||
|
||||
wxString output;
|
||||
output.Printf(wxT("%s-S>APDG01,TCPIP*,qAC,%s-GS:;%-7s%-2s*%02d%02d%02dz%s%cD%s%caRNG%04.0lf %s %s"),
|
||||
output.Printf(wxT("%s-S>APDG01,TCPIP*,qAC,%s-GS:;%-7s%-2s*%02d%02d%02dz%s%cD%s%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(),
|
||||
tm->tm_mday, tm->tm_hour, tm->tm_min,
|
||||
lat.c_str(), (entry->getLatitude() < 0.0F) ? wxT('S') : wxT('N'),
|
||||
lon.c_str(), (entry->getLongitude() < 0.0F) ? wxT('W') : wxT('E'),
|
||||
entry->getRange() * 0.6214, band.c_str(), desc.c_str());
|
||||
entry->getRange() * 0.6214, entry->getAGL() * 3.28, band.c_str(), desc.c_str());
|
||||
|
||||
char ascii[300U];
|
||||
::memset(ascii, 0x00, 300U);
|
||||
for (unsigned int i = 0U; i < output.Len(); 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) {
|
||||
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(),
|
||||
lat.c_str(), (entry->getLatitude() < 0.0F) ? wxT('S') : wxT('N'),
|
||||
lon.c_str(), (entry->getLongitude() < 0.0F) ? wxT('W') : wxT('E'),
|
||||
entry->getRange() * 0.6214, band.c_str(), desc.c_str());
|
||||
entry->getRange() * 0.6214, entry->getAGL() * 3.28, band.c_str(), desc.c_str());
|
||||
|
||||
::memset(ascii, 0x00, 300U);
|
||||
for (unsigned int i = 0U; i < output.Len(); 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);
|
||||
}
|
||||
}
|
||||
|
||||
m_idTimer.start();
|
||||
}
|
||||
|
||||
#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");
|
||||
}
|
||||
|
||||
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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -19,13 +19,18 @@
|
|||
#ifndef APRSWriter_H
|
||||
#define APRSWriter_H
|
||||
|
||||
#include "APRSWriterThread.h"
|
||||
#include "UDPReaderWriter.h"
|
||||
#include "APRSCollector.h"
|
||||
#include "DStarDefines.h"
|
||||
#include "HeaderData.h"
|
||||
#include "AMBEData.h"
|
||||
#include "Timer.h"
|
||||
#include "Defs.h"
|
||||
|
||||
#if defined(USE_GPSD)
|
||||
#include <gps.h>
|
||||
#endif
|
||||
|
||||
#include <wx/wx.h>
|
||||
|
||||
class CAPRSEntry {
|
||||
|
|
@ -66,33 +71,40 @@ WX_DECLARE_STRING_HASH_MAP(CAPRSEntry*, CEntry_t);
|
|||
|
||||
class CAPRSWriter {
|
||||
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();
|
||||
|
||||
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 reset(const wxString& callsign);
|
||||
|
||||
void setEnabled(bool enable);
|
||||
|
||||
bool isConnected() const;
|
||||
|
||||
void clock(unsigned int ms);
|
||||
|
||||
void close();
|
||||
|
||||
private:
|
||||
CAPRSWriterThread* m_thread;
|
||||
bool m_enabled;
|
||||
CTimer m_idTimer;
|
||||
wxString m_gateway;
|
||||
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
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
@ -22,29 +22,29 @@
|
|||
<ProjectGuid>{E793CB8E-2AC9-431A-BBFC-3F52537BB3CF}</ProjectGuid>
|
||||
<RootNamespace>Common</RootNamespace>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
|
|
@ -77,6 +77,10 @@
|
|||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<OutDir>$(SolutionDir)$(Configuration)\</OutDir>
|
||||
<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>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<PreBuildEvent>
|
||||
|
|
@ -150,7 +154,6 @@
|
|||
<ClCompile Include="AnnouncementUnit.cpp" />
|
||||
<ClCompile Include="APRSCollector.cpp" />
|
||||
<ClCompile Include="APRSWriter.cpp" />
|
||||
<ClCompile Include="APRSWriterThread.cpp" />
|
||||
<ClCompile Include="AudioUnit.cpp" />
|
||||
<ClCompile Include="CacheManager.cpp" />
|
||||
<ClCompile Include="CallsignList.cpp" />
|
||||
|
|
@ -189,6 +192,7 @@
|
|||
<ClCompile Include="IRCDDBGatewayConfig.cpp" />
|
||||
<ClCompile Include="LogEvent.cpp" />
|
||||
<ClCompile Include="Logger.cpp" />
|
||||
<ClCompile Include="NatTraversalHandler.cpp" />
|
||||
<ClCompile Include="PollData.cpp" />
|
||||
<ClCompile Include="RemoteHandler.cpp" />
|
||||
<ClCompile Include="RemoteLinkData.cpp" />
|
||||
|
|
@ -218,7 +222,6 @@
|
|||
<ClInclude Include="AnnouncementUnit.h" />
|
||||
<ClInclude Include="APRSCollector.h" />
|
||||
<ClInclude Include="APRSWriter.h" />
|
||||
<ClInclude Include="APRSWriterThread.h" />
|
||||
<ClInclude Include="AudioUnit.h" />
|
||||
<ClInclude Include="CacheManager.h" />
|
||||
<ClInclude Include="CallsignList.h" />
|
||||
|
|
@ -260,6 +263,7 @@
|
|||
<ClInclude Include="IRCDDBGatewayConfig.h" />
|
||||
<ClInclude Include="LogEvent.h" />
|
||||
<ClInclude Include="Logger.h" />
|
||||
<ClInclude Include="NatTraversalHandler.h" />
|
||||
<ClInclude Include="PollData.h" />
|
||||
<ClInclude Include="ReflectorCallback.h" />
|
||||
<ClInclude Include="RemoteHandler.h" />
|
||||
|
|
|
|||
|
|
@ -23,9 +23,6 @@
|
|||
<ClCompile Include="APRSWriter.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="APRSWriterThread.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="AudioUnit.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
|
|
@ -53,6 +50,9 @@
|
|||
<ClCompile Include="ConnectData.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="ConsoleLogger.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="DCSHandler.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
|
|
@ -209,6 +209,9 @@
|
|||
<ClCompile Include="XLXHostsFileDownloader.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="NatTraversalHandler.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="AMBEData.h">
|
||||
|
|
@ -223,9 +226,6 @@
|
|||
<ClInclude Include="APRSWriter.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="APRSWriterThread.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="AudioUnit.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
|
|
@ -256,6 +256,9 @@
|
|||
<ClInclude Include="ConnectData.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="ConsoleLogger.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="DCSHandler.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
|
|
@ -433,5 +436,8 @@
|
|||
<ClInclude Include="XLXHostsFileDownloader.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="NatTraversalHandler.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
48
Common/ConsoleLogger.cpp
Normal file
48
Common/ConsoleLogger.cpp
Normal 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
41
Common/ConsoleLogger.h
Normal 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
|
||||
|
||||
|
|
@ -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) :
|
||||
m_reflector(reflector.Clone()),
|
||||
m_xlxReflector(),
|
||||
m_isXlx(false),
|
||||
m_repeater(repeater.Clone()),
|
||||
m_handler(protoHandler),
|
||||
m_yourAddress(address),
|
||||
|
|
@ -78,6 +80,11 @@ m_rptCall2()
|
|||
m_linkState = DCS_LINKED;
|
||||
} else {
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
|
@ -162,10 +169,10 @@ void CDCSHandler::getInfo(IReflectorCallback* handler, CRemoteRepeaterData& data
|
|||
if (reflector->m_destination == handler) {
|
||||
if (reflector->m_direction == DIR_INCOMING && reflector->m_repeater.IsEmpty()) {
|
||||
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 {
|
||||
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;
|
||||
|
||||
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)
|
||||
m_destination->linkUp(DP_DCS, m_reflector);
|
||||
m_destination->linkUp(DP_DCS, GET_DISP_REFLECTOR(this));
|
||||
|
||||
m_tryTimer.stop();
|
||||
m_stateChange = true;
|
||||
|
|
@ -651,16 +658,16 @@ bool CDCSHandler::processInt(CConnectData& connect, CD_TYPE type)
|
|||
return false;
|
||||
|
||||
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)
|
||||
m_destination->linkRefused(DP_DCS, m_reflector);
|
||||
m_destination->linkRefused(DP_DCS, GET_DISP_REFLECTOR(this));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
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)
|
||||
m_destination->linkFailed(DP_DCS, m_reflector, false);
|
||||
|
|
@ -675,10 +682,10 @@ bool CDCSHandler::processInt(CConnectData& connect, CD_TYPE type)
|
|||
return false;
|
||||
|
||||
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)
|
||||
m_destination->linkFailed(DP_DCS, m_reflector, false);
|
||||
m_destination->linkFailed(DP_DCS, GET_DISP_REFLECTOR(this), false);
|
||||
|
||||
m_stateChange = true;
|
||||
}
|
||||
|
|
@ -706,20 +713,20 @@ bool CDCSHandler::clockInt(unsigned int ms)
|
|||
|
||||
switch (m_linkState) {
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
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) {
|
||||
CConnectData reply(m_gatewayType, m_repeater, m_reflector, CT_LINK1, m_yourAddress, m_yourPort);
|
||||
m_handler->writeConnect(reply);
|
||||
|
|
@ -844,7 +851,7 @@ void CDCSHandler::writeStatus(wxFFile& file)
|
|||
wxString text;
|
||||
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,
|
||||
reflector->m_repeater.c_str(), reflector->m_reflector.c_str());
|
||||
reflector->m_repeater.c_str(), GET_DISP_REFLECTOR(reflector).c_str());
|
||||
file.Write(text);
|
||||
}
|
||||
break;
|
||||
|
|
@ -854,7 +861,7 @@ void CDCSHandler::writeStatus(wxFFile& file)
|
|||
wxString text;
|
||||
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,
|
||||
reflector->m_repeater.c_str(), reflector->m_reflector.c_str());
|
||||
reflector->m_repeater.c_str(), GET_DISP_REFLECTOR(reflector).c_str());
|
||||
file.Write(text);
|
||||
}
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -39,6 +39,8 @@
|
|||
#include <wx/wx.h>
|
||||
#include <wx/ffile.h>
|
||||
|
||||
#define GET_DISP_REFLECTOR(refl) (refl->m_isXlx ? refl->m_xlxReflector : refl->m_reflector)
|
||||
|
||||
enum DCS_STATE {
|
||||
DCS_LINKING,
|
||||
DCS_LINKED,
|
||||
|
|
@ -109,6 +111,8 @@ private:
|
|||
static CCallsignList* m_blackList;
|
||||
|
||||
wxString m_reflector;
|
||||
wxString m_xlxReflector;
|
||||
bool m_isXlx;
|
||||
wxString m_repeater;
|
||||
CDCSProtocolHandler* m_handler;
|
||||
in_addr m_yourAddress;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -22,8 +22,7 @@
|
|||
|
||||
#include <wx/filename.h>
|
||||
|
||||
#if !defined(WIN32)
|
||||
// XXX Check these
|
||||
#if defined(__linux__)
|
||||
#include <net/if.h>
|
||||
#include <arpa/inet.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
|
||||
m_list[2] = new CEthernet(DX_MULTICAST_ADDRESS, wxT("CQCQCQ "));
|
||||
|
||||
#if !defined(WIN32)
|
||||
#if defined(__linux__)
|
||||
m_fd = ::open("/dev/net/tun", O_RDWR);
|
||||
if (m_fd < 0) {
|
||||
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);
|
||||
|
||||
ssize_t len = ::write(m_fd, (char*)m_buffer, length);
|
||||
|
|
@ -253,7 +252,7 @@ CDDData* CDDHandler::read()
|
|||
if (m_maxRoutes == 0U)
|
||||
return NULL;
|
||||
|
||||
#if defined(WIN32)
|
||||
#if defined(__WINDOWS__)
|
||||
return NULL;
|
||||
#else
|
||||
// Check that the read() won't block
|
||||
|
|
|
|||
|
|
@ -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
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -22,12 +22,9 @@
|
|||
#include "Utils.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 wxString DUTCHSTAR_HOSTNAME = wxT("dpns.dutch-star.eu");
|
||||
const unsigned int DUTCHSTAR_PORT = 20001U;
|
||||
|
||||
const unsigned int TCP_TIMEOUT = 10U;
|
||||
|
||||
CDPlusAuthenticator::CDPlusAuthenticator(const wxString& loginCallsign, const wxString& gatewayCallsign, const wxString& address, CCacheManager* cache) :
|
||||
|
|
@ -37,7 +34,6 @@ m_gatewayCallsign(gatewayCallsign),
|
|||
m_address(address),
|
||||
m_cache(cache),
|
||||
m_timer(1U, 6U * 3600U), // 6 hours
|
||||
m_pollTimer(1U, 60U), // 1 minute
|
||||
m_killed(false)
|
||||
{
|
||||
wxASSERT(!loginCallsign.IsEmpty());
|
||||
|
|
@ -68,28 +64,19 @@ void* CDPlusAuthenticator::Entry()
|
|||
wxLogMessage(wxT("Starting the D-Plus Authenticator thread"));
|
||||
|
||||
authenticate(m_loginCallsign, OPENDSTAR_HOSTNAME, OPENDSTAR_PORT, '2', true);
|
||||
authenticate(m_gatewayCallsign, DUTCHSTAR_HOSTNAME, DUTCHSTAR_PORT, 'K', false);
|
||||
|
||||
m_timer.start();
|
||||
m_pollTimer.start();
|
||||
|
||||
try {
|
||||
while (!m_killed) {
|
||||
if (m_pollTimer.hasExpired()) {
|
||||
poll(m_gatewayCallsign, DUTCHSTAR_HOSTNAME, DUTCHSTAR_PORT, 'K');
|
||||
m_pollTimer.start();
|
||||
}
|
||||
|
||||
if (m_timer.hasExpired()) {
|
||||
authenticate(m_loginCallsign, OPENDSTAR_HOSTNAME, OPENDSTAR_PORT, '2', true);
|
||||
authenticate(m_gatewayCallsign, DUTCHSTAR_HOSTNAME, DUTCHSTAR_PORT, 'K', false);
|
||||
m_timer.start();
|
||||
}
|
||||
|
||||
Sleep(1000UL);
|
||||
|
||||
m_timer.clock();
|
||||
m_pollTimer.clock();
|
||||
}
|
||||
}
|
||||
catch (std::exception& e) {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -48,7 +48,6 @@ private:
|
|||
wxString m_address;
|
||||
CCacheManager* m_cache;
|
||||
CTimer m_timer;
|
||||
CTimer m_pollTimer;
|
||||
bool m_killed;
|
||||
|
||||
bool poll(const wxString& callsign, const wxString& hostname, unsigned int port, unsigned char id);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
* 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,
|
||||
false, true, true, false, true, false, false, false};
|
||||
|
||||
const unsigned char END_PATTERN_BYTES[] = {0x55, 0x55, 0x55, 0x55, 0xC8, 0x7A,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||
const unsigned char END_PATTERN_BYTES[] = {0x55, 0x55, 0x55, 0x55, 0xC8, 0x7A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||
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,
|
||||
|
|
@ -83,10 +82,14 @@ const unsigned int DATA_BLOCK_SIZE_BYTES = 21U * DV_FRAME_LENGTH_BYTES;
|
|||
const unsigned int LONG_CALLSIGN_LENGTH = 8U;
|
||||
const unsigned int SHORT_CALLSIGN_LENGTH = 4U;
|
||||
|
||||
const unsigned char SLOW_DATA_TYPE_MASK = 0xF0U;
|
||||
const unsigned char SLOW_DATA_TYPE_GPS = 0x30U;
|
||||
const unsigned char SLOW_DATA_TYPE_TEXT = 0x40U;
|
||||
const unsigned char SLOW_DATA_TYPE_HEADER = 0x50U;
|
||||
const unsigned char SLOW_DATA_TYPE_MASK = 0xF0U;
|
||||
const unsigned char SLOW_DATA_TYPE_GPS = 0x30U;
|
||||
const unsigned char SLOW_DATA_TYPE_TEXT = 0x40U;
|
||||
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 REPEATER_MASK = 0x40U;
|
||||
|
|
|
|||
|
|
@ -167,6 +167,8 @@ wxString CDTMF::translate()
|
|||
return processReflector(wxT("XRF"), command.Mid(1U));
|
||||
else if (command.GetChar(0U) == wxT('D'))
|
||||
return processReflector(wxT("DCS"), command.Mid(1U));
|
||||
else if (command.GetChar(0U) == wxT('A'))
|
||||
return processReflector(wxT("XLX"), command.Mid(1U));
|
||||
else
|
||||
return processCCS(command);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -144,6 +144,20 @@ CAMBEData* CG2ProtocolHandler::readAMBE()
|
|||
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()
|
||||
{
|
||||
m_socket.close();
|
||||
|
|
|
|||
|
|
@ -52,6 +52,10 @@ public:
|
|||
CHeaderData* readHeader();
|
||||
CAMBEData* readAMBE();
|
||||
|
||||
#if defined(ENABLE_NAT_TRAVERSAL)
|
||||
void traverseNat(const wxString& addr);
|
||||
#endif
|
||||
|
||||
void close();
|
||||
|
||||
private:
|
||||
|
|
|
|||
|
|
@ -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
|
||||
* 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_BAND42 = wxT("band4_2");
|
||||
const wxString KEY_BAND43 = wxT("band4_3");
|
||||
const wxString KEY_IRCDDB_ENABLED = wxT("ircddbEnabled");
|
||||
const wxString KEY_IRCDDB_HOSTNAME = wxT("ircddbHostname");
|
||||
const wxString KEY_IRCDDB_USERNAME = wxT("ircddbUsername");
|
||||
const wxString KEY_IRCDDB_PASSWORD = wxT("ircddbPassword");
|
||||
const wxString KEY_IRCDDB_ENABLED1 = wxT("ircddbEnabled");
|
||||
const wxString KEY_IRCDDB_HOSTNAME1 = wxT("ircddbHostname");
|
||||
const wxString KEY_IRCDDB_USERNAME1 = wxT("ircddbUsername");
|
||||
const wxString KEY_IRCDDB_PASSWORD1 = wxT("ircddbPassword");
|
||||
const wxString KEY_IRCDDB_ENABLED2 = wxT("ircddbEnabled2");
|
||||
const wxString KEY_IRCDDB_HOSTNAME2 = wxT("ircddbHostname2");
|
||||
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_PASSWORD4 = wxT("ircddbPassword4");
|
||||
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_DEXTRA_ENABLED = wxT("dextraEnabled");
|
||||
const wxString KEY_DEXTRA_MAXDONGLES = wxT("dextraMaxDongles");
|
||||
|
|
@ -139,8 +139,7 @@ const wxString KEY_DPLUS_LOGIN = wxT("dplusLogin");
|
|||
const wxString KEY_DCS_ENABLED = wxT("dcsEnabled");
|
||||
const wxString KEY_CCS_ENABLED = wxT("ccsEnabled");
|
||||
const wxString KEY_CCS_HOST = wxT("ccsHost");
|
||||
const wxString KEY_XLX_ENABLED = wxT("xlxEnabled");
|
||||
const wxString KEY_XLX_OVERRIDE_LOCAL = wxT("xlxOverrideLocal");
|
||||
const wxString KEY_XLX_ENABLED = wxT("xlxEnabled");
|
||||
const wxString KEY_XLX_HOSTS_FILE_URL = wxT("xlxHostsFileUrl");
|
||||
const wxString KEY_STARNET_BAND1 = wxT("starNetBand1");
|
||||
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_DRATS_ENABLED = wxT("dratsEnabled");
|
||||
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_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_PORT3 = 20013U;
|
||||
const unsigned int DEFAULT_REPEATER_PORT4 = 20014U;
|
||||
const bool DEFAULT_IRCDDB_ENABLED = true;
|
||||
const wxString DEFAULT_IRCDDB_HOSTNAME = wxT("group1-irc.ircddb.net");
|
||||
const wxString DEFAULT_IRCDDB_USERNAME = wxEmptyString;
|
||||
const wxString DEFAULT_IRCDDB_PASSWORD = wxEmptyString;
|
||||
const bool DEFAULT_IRCDDB_ENABLED1 = true;
|
||||
const wxString DEFAULT_IRCDDB_HOSTNAME1 = wxT("group1-irc.ircddb.net");
|
||||
const wxString DEFAULT_IRCDDB_USERNAME1 = wxEmptyString;
|
||||
const wxString DEFAULT_IRCDDB_PASSWORD1 = wxEmptyString;
|
||||
const bool DEFAULT_IRCDDB_ENABLED2 = true;
|
||||
const wxString DEFAULT_IRCDDB_HOSTNAME2 = wxT("rr.openquad.net");
|
||||
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_USERNAME4 = wxEmptyString;
|
||||
const wxString DEFAULT_IRCDDB_PASSWORD4 = wxEmptyString;
|
||||
const bool DEFAULT_APRS_ENABLED = true;
|
||||
const wxString DEFAULT_APRS_HOSTNAME = wxT("rotate.aprs2.net");
|
||||
const unsigned int DEFAULT_APRS_PORT = 14580U;
|
||||
const bool DEFAULT_APRS_ENABLED = false;
|
||||
const wxString DEFAULT_APRS_ADDRESS = wxT("127.0.0.1");
|
||||
const unsigned int DEFAULT_APRS_PORT = 8673U;
|
||||
const bool DEFAULT_DEXTRA_ENABLED = true;
|
||||
const unsigned int DEFAULT_DEXTRA_MAXDONGLES = 5U;
|
||||
const bool DEFAULT_DPLUS_ENABLED = false;
|
||||
|
|
@ -261,9 +263,8 @@ const wxString DEFAULT_DPLUS_LOGIN = wxEmptyString;
|
|||
const bool DEFAULT_DCS_ENABLED = true;
|
||||
const bool DEFAULT_CCS_ENABLED = true;
|
||||
const wxString DEFAULT_CCS_HOST = wxT("CCS704 ");
|
||||
const bool DEFAULT_XLX_ENABLED = true;
|
||||
const bool DEFAULT_XLX_OVERRIDE_LOCAL = true;
|
||||
const wxString DEFAULT_XLX_HOSTS_FILE_URL = _T("http://xlxapi.rlx.lu/api.php?do=GetReflectorHostname");
|
||||
const bool DEFAULT_XLX_ENABLED = 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_STARNET_BAND = wxEmptyString;
|
||||
const wxString DEFAULT_STARNET_CALLSIGN = 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_DRATS_ENABLED = false;
|
||||
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_Y = -1;
|
||||
|
||||
|
|
@ -385,10 +389,10 @@ m_repeater4URL(DEFAULT_URL),
|
|||
m_repeater4Band1(DEFAULT_BAND1),
|
||||
m_repeater4Band2(DEFAULT_BAND2),
|
||||
m_repeater4Band3(DEFAULT_BAND3),
|
||||
m_ircddbEnabled(DEFAULT_IRCDDB_ENABLED),
|
||||
m_ircddbHostname(DEFAULT_IRCDDB_HOSTNAME),
|
||||
m_ircddbUsername(DEFAULT_IRCDDB_USERNAME),
|
||||
m_ircddbPassword(DEFAULT_IRCDDB_PASSWORD),
|
||||
m_ircddbEnabled1(DEFAULT_IRCDDB_ENABLED1),
|
||||
m_ircddbHostname1(DEFAULT_IRCDDB_HOSTNAME1),
|
||||
m_ircddbUsername1(DEFAULT_IRCDDB_USERNAME1),
|
||||
m_ircddbPassword1(DEFAULT_IRCDDB_PASSWORD1),
|
||||
m_ircddbEnabled2(DEFAULT_IRCDDB_ENABLED2),
|
||||
m_ircddbHostname2(DEFAULT_IRCDDB_HOSTNAME2),
|
||||
m_ircddbUsername2(DEFAULT_IRCDDB_USERNAME2),
|
||||
|
|
@ -402,7 +406,7 @@ m_ircddbHostname4(DEFAULT_IRCDDB_HOSTNAME4),
|
|||
m_ircddbUsername4(DEFAULT_IRCDDB_USERNAME4),
|
||||
m_ircddbPassword4(DEFAULT_IRCDDB_PASSWORD4),
|
||||
m_aprsEnabled(DEFAULT_APRS_ENABLED),
|
||||
m_aprsHostname(DEFAULT_APRS_HOSTNAME),
|
||||
m_aprsAddress(DEFAULT_APRS_ADDRESS),
|
||||
m_aprsPort(DEFAULT_APRS_PORT),
|
||||
m_dextraEnabled(DEFAULT_DEXTRA_ENABLED),
|
||||
m_dextraMaxDongles(DEFAULT_DEXTRA_MAXDONGLES),
|
||||
|
|
@ -413,7 +417,6 @@ m_dcsEnabled(DEFAULT_DCS_ENABLED),
|
|||
m_ccsEnabled(DEFAULT_CCS_ENABLED),
|
||||
m_ccsHost(DEFAULT_CCS_HOST),
|
||||
m_xlxEnabled(DEFAULT_XLX_ENABLED),
|
||||
m_xlxOverrideLocal(DEFAULT_XLX_OVERRIDE_LOCAL),
|
||||
m_xlxHostsFileUrl(DEFAULT_XLX_HOSTS_FILE_URL),
|
||||
m_starNet1Band(DEFAULT_STARNET_BAND),
|
||||
m_starNet1Callsign(DEFAULT_STARNET_CALLSIGN),
|
||||
|
|
@ -474,6 +477,9 @@ m_echoEnabled(DEFAULT_ECHO_ENABLED),
|
|||
m_logEnabled(DEFAULT_LOG_ENABLED),
|
||||
m_dratsEnabled(DEFAULT_DRATS_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_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_repeater4Band3 = (unsigned char)temp;
|
||||
|
||||
m_config->Read(m_name + KEY_IRCDDB_ENABLED, &m_ircddbEnabled, DEFAULT_IRCDDB_ENABLED);
|
||||
m_config->Read(m_name + KEY_IRCDDB_HOSTNAME, &m_ircddbHostname, DEFAULT_IRCDDB_HOSTNAME);
|
||||
m_config->Read(m_name + KEY_IRCDDB_USERNAME, &m_ircddbUsername, DEFAULT_IRCDDB_USERNAME);
|
||||
m_config->Read(m_name + KEY_IRCDDB_PASSWORD, &m_ircddbPassword, DEFAULT_IRCDDB_PASSWORD);
|
||||
m_config->Read(m_name + KEY_IRCDDB_ENABLED1, &m_ircddbEnabled1, DEFAULT_IRCDDB_ENABLED1);
|
||||
m_config->Read(m_name + KEY_IRCDDB_HOSTNAME1, &m_ircddbHostname1, DEFAULT_IRCDDB_HOSTNAME1);
|
||||
m_config->Read(m_name + KEY_IRCDDB_USERNAME1, &m_ircddbUsername1, DEFAULT_IRCDDB_USERNAME1);
|
||||
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_HOSTNAME2, &m_ircddbHostname, DEFAULT_IRCDDB_HOSTNAME2);
|
||||
m_config->Read(m_name + KEY_IRCDDB_USERNAME2, &m_ircddbUsername, DEFAULT_IRCDDB_USERNAME2);
|
||||
m_config->Read(m_name + KEY_IRCDDB_PASSWORD2, &m_ircddbPassword, DEFAULT_IRCDDB_PASSWORD2);
|
||||
m_config->Read(m_name + KEY_IRCDDB_ENABLED2, &m_ircddbEnabled2, DEFAULT_IRCDDB_ENABLED2);
|
||||
m_config->Read(m_name + KEY_IRCDDB_HOSTNAME2, &m_ircddbHostname2, DEFAULT_IRCDDB_HOSTNAME2);
|
||||
m_config->Read(m_name + KEY_IRCDDB_USERNAME2, &m_ircddbUsername2, DEFAULT_IRCDDB_USERNAME2);
|
||||
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_HOSTNAME3, &m_ircddbHostname, DEFAULT_IRCDDB_HOSTNAME3);
|
||||
m_config->Read(m_name + KEY_IRCDDB_USERNAME3, &m_ircddbUsername, DEFAULT_IRCDDB_USERNAME3);
|
||||
m_config->Read(m_name + KEY_IRCDDB_PASSWORD3, &m_ircddbPassword, DEFAULT_IRCDDB_PASSWORD3);
|
||||
m_config->Read(m_name + KEY_IRCDDB_ENABLED3, &m_ircddbEnabled3, DEFAULT_IRCDDB_ENABLED3);
|
||||
m_config->Read(m_name + KEY_IRCDDB_HOSTNAME3, &m_ircddbHostname3, DEFAULT_IRCDDB_HOSTNAME3);
|
||||
m_config->Read(m_name + KEY_IRCDDB_USERNAME3, &m_ircddbUsername3, DEFAULT_IRCDDB_USERNAME3);
|
||||
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_HOSTNAME4, &m_ircddbHostname, DEFAULT_IRCDDB_HOSTNAME4);
|
||||
m_config->Read(m_name + KEY_IRCDDB_USERNAME4, &m_ircddbUsername, DEFAULT_IRCDDB_USERNAME4);
|
||||
m_config->Read(m_name + KEY_IRCDDB_PASSWORD4, &m_ircddbPassword, DEFAULT_IRCDDB_PASSWORD4);
|
||||
m_config->Read(m_name + KEY_IRCDDB_ENABLED4, &m_ircddbEnabled4, DEFAULT_IRCDDB_ENABLED4);
|
||||
m_config->Read(m_name + KEY_IRCDDB_HOSTNAME4, &m_ircddbHostname4, DEFAULT_IRCDDB_HOSTNAME4);
|
||||
m_config->Read(m_name + KEY_IRCDDB_USERNAME4, &m_ircddbUsername4, DEFAULT_IRCDDB_USERNAME4);
|
||||
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_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_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_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);
|
||||
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);
|
||||
|
||||
|
|
@ -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_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_x = int(temp);
|
||||
|
||||
|
|
@ -995,10 +1008,10 @@ m_repeater4URL(DEFAULT_URL),
|
|||
m_repeater4Band1(DEFAULT_BAND1),
|
||||
m_repeater4Band2(DEFAULT_BAND2),
|
||||
m_repeater4Band3(DEFAULT_BAND3),
|
||||
m_ircddbEnabled(DEFAULT_IRCDDB_ENABLED),
|
||||
m_ircddbHostname(DEFAULT_IRCDDB_HOSTNAME),
|
||||
m_ircddbUsername(DEFAULT_IRCDDB_USERNAME),
|
||||
m_ircddbPassword(DEFAULT_IRCDDB_PASSWORD),
|
||||
m_ircddbEnabled1(DEFAULT_IRCDDB_ENABLED1),
|
||||
m_ircddbHostname1(DEFAULT_IRCDDB_HOSTNAME1),
|
||||
m_ircddbUsername1(DEFAULT_IRCDDB_USERNAME1),
|
||||
m_ircddbPassword1(DEFAULT_IRCDDB_PASSWORD1),
|
||||
m_ircddbEnabled2(DEFAULT_IRCDDB_ENABLED2),
|
||||
m_ircddbHostname2(DEFAULT_IRCDDB_HOSTNAME2),
|
||||
m_ircddbUsername2(DEFAULT_IRCDDB_USERNAME2),
|
||||
|
|
@ -1012,7 +1025,7 @@ m_ircddbHostname4(DEFAULT_IRCDDB_HOSTNAME4),
|
|||
m_ircddbUsername4(DEFAULT_IRCDDB_USERNAME4),
|
||||
m_ircddbPassword4(DEFAULT_IRCDDB_PASSWORD4),
|
||||
m_aprsEnabled(DEFAULT_APRS_ENABLED),
|
||||
m_aprsHostname(DEFAULT_APRS_HOSTNAME),
|
||||
m_aprsAddress(DEFAULT_APRS_ADDRESS),
|
||||
m_aprsPort(DEFAULT_APRS_PORT),
|
||||
m_dextraEnabled(DEFAULT_DEXTRA_ENABLED),
|
||||
m_dextraMaxDongles(DEFAULT_DEXTRA_MAXDONGLES),
|
||||
|
|
@ -1023,7 +1036,6 @@ m_dcsEnabled(DEFAULT_DCS_ENABLED),
|
|||
m_ccsEnabled(DEFAULT_CCS_ENABLED),
|
||||
m_ccsHost(DEFAULT_CCS_HOST),
|
||||
m_xlxEnabled(DEFAULT_XLX_ENABLED),
|
||||
m_xlxOverrideLocal(DEFAULT_XLX_OVERRIDE_LOCAL),
|
||||
m_xlxHostsFileUrl(DEFAULT_XLX_HOSTS_FILE_URL),
|
||||
m_starNet1Band(DEFAULT_STARNET_BAND),
|
||||
m_starNet1Callsign(DEFAULT_STARNET_CALLSIGN),
|
||||
|
|
@ -1084,6 +1096,9 @@ m_echoEnabled(DEFAULT_ECHO_ENABLED),
|
|||
m_logEnabled(DEFAULT_LOG_ENABLED),
|
||||
m_dratsEnabled(DEFAULT_DRATS_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_y(DEFAULT_WINDOW_Y)
|
||||
{
|
||||
|
|
@ -1342,15 +1357,15 @@ m_y(DEFAULT_WINDOW_Y)
|
|||
} else if (key.IsSameAs(KEY_BAND43)) {
|
||||
val.ToULong(&temp2);
|
||||
m_repeater4Band3 = (unsigned char)temp2;
|
||||
} else if (key.IsSameAs(KEY_IRCDDB_ENABLED)) {
|
||||
} else if (key.IsSameAs(KEY_IRCDDB_ENABLED1)) {
|
||||
val.ToLong(&temp1);
|
||||
m_ircddbEnabled = temp1 == 1L;
|
||||
} else if (key.IsSameAs(KEY_IRCDDB_HOSTNAME)) {
|
||||
m_ircddbHostname = val;
|
||||
} else if (key.IsSameAs(KEY_IRCDDB_USERNAME)) {
|
||||
m_ircddbUsername = val;
|
||||
} else if (key.IsSameAs(KEY_IRCDDB_PASSWORD)) {
|
||||
m_ircddbPassword = val;
|
||||
m_ircddbEnabled1 = temp1 == 1L;
|
||||
} else if (key.IsSameAs(KEY_IRCDDB_HOSTNAME1)) {
|
||||
m_ircddbHostname1 = val;
|
||||
} else if (key.IsSameAs(KEY_IRCDDB_USERNAME1)) {
|
||||
m_ircddbUsername1 = val;
|
||||
} else if (key.IsSameAs(KEY_IRCDDB_PASSWORD1)) {
|
||||
m_ircddbPassword1 = val;
|
||||
} else if (key.IsSameAs(KEY_IRCDDB_ENABLED2)) {
|
||||
val.ToLong(&temp1);
|
||||
m_ircddbEnabled2 = temp1 == 1L;
|
||||
|
|
@ -1381,8 +1396,8 @@ m_y(DEFAULT_WINDOW_Y)
|
|||
} else if (key.IsSameAs(KEY_APRS_ENABLED)) {
|
||||
val.ToLong(&temp1);
|
||||
m_aprsEnabled = temp1 == 1L;
|
||||
} else if (key.IsSameAs(KEY_APRS_HOSTNAME)) {
|
||||
m_aprsHostname = val;
|
||||
} else if (key.IsSameAs(KEY_APRS_ADDRESS)) {
|
||||
m_aprsAddress = val;
|
||||
} else if (key.IsSameAs(KEY_APRS_PORT)) {
|
||||
val.ToULong(&temp2);
|
||||
m_aprsPort = (unsigned int)temp2;
|
||||
|
|
@ -1411,10 +1426,7 @@ m_y(DEFAULT_WINDOW_Y)
|
|||
} else if (key.IsSameAs(KEY_XLX_ENABLED)) {
|
||||
val.ToLong(&temp1);
|
||||
m_xlxEnabled = temp1 == 1L;
|
||||
} else if (key.IsSameAs(KEY_XLX_OVERRIDE_LOCAL)) {
|
||||
val.ToLong(&temp1);
|
||||
m_xlxOverrideLocal = temp1 == 1L;
|
||||
} else if (key.IsSameAs(KEY_XLX_HOSTS_FILE_URL)) {
|
||||
} 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
|
||||
m_xlxHostsFileUrl = val;
|
||||
} else if (key.IsSameAs(KEY_STARNET_BAND1)) {
|
||||
m_starNet1Band = val;
|
||||
|
|
@ -1562,6 +1574,13 @@ m_y(DEFAULT_WINDOW_Y)
|
|||
} else if (key.IsSameAs(KEY_DTMF_ENABLED)) {
|
||||
val.ToLong(&temp1);
|
||||
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)) {
|
||||
val.ToLong(&temp1);
|
||||
m_x = int(temp1);
|
||||
|
|
@ -1805,20 +1824,20 @@ void CIRCDDBGatewayConfig::setRepeater4(const wxString& band, HW_TYPE type, cons
|
|||
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;
|
||||
hostname = m_ircddbHostname;
|
||||
username = m_ircddbUsername;
|
||||
password = m_ircddbPassword;
|
||||
enabled = m_ircddbEnabled1;
|
||||
hostname = m_ircddbHostname1;
|
||||
username = m_ircddbUsername1;
|
||||
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_ircddbHostname = hostname;
|
||||
m_ircddbUsername = username;
|
||||
m_ircddbPassword = password;
|
||||
m_ircddbEnabled1 = enabled;
|
||||
m_ircddbHostname1 = hostname;
|
||||
m_ircddbUsername1 = username;
|
||||
m_ircddbPassword1 = password;
|
||||
}
|
||||
|
||||
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;
|
||||
hostname = m_ircddbHostname2;
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
@ -1877,17 +1888,17 @@ void CIRCDDBGatewayConfig::setIrcDDB4(bool enabled, const wxString& hostname, co
|
|||
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;
|
||||
hostname = m_aprsHostname;
|
||||
port = m_aprsPort;
|
||||
enabled = m_aprsEnabled;
|
||||
address = m_aprsAddress;
|
||||
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_aprsHostname = hostname;
|
||||
m_aprsAddress = address;
|
||||
m_aprsPort = port;
|
||||
}
|
||||
|
||||
|
|
@ -1931,17 +1942,15 @@ void CIRCDDBGatewayConfig::setDCS(bool dcsEnabled, bool ccsEnabled, const wxStri
|
|||
m_ccsHost = ccsHost;
|
||||
}
|
||||
|
||||
void CIRCDDBGatewayConfig::getXLX(bool& xlxEnabled, bool& xlxOverrideLocal, wxString& xlxHostsFileUrl)
|
||||
void CIRCDDBGatewayConfig::getXLX(bool& xlxEnabled, wxString& xlxHostsFileUrl)
|
||||
{
|
||||
xlxEnabled = m_xlxEnabled;
|
||||
xlxOverrideLocal = m_xlxOverrideLocal;
|
||||
xlxHostsFileUrl = m_xlxHostsFileUrl;
|
||||
}
|
||||
|
||||
void CIRCDDBGatewayConfig::setXLX(bool xlxEnabled, bool xlxOverrideLocal, wxString xlxHostsFileUrl)
|
||||
void CIRCDDBGatewayConfig::setXLX(bool xlxEnabled, wxString xlxHostsFileUrl)
|
||||
{
|
||||
m_xlxEnabled = xlxEnabled;
|
||||
m_xlxOverrideLocal = xlxOverrideLocal;
|
||||
m_xlxHostsFileUrl = xlxHostsFileUrl;
|
||||
}
|
||||
|
||||
|
|
@ -2189,6 +2198,20 @@ void CIRCDDBGatewayConfig::setMiscellaneous(TEXT_LANG language, bool infoEnabled
|
|||
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
|
||||
{
|
||||
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_BAND42, long(m_repeater4Band2));
|
||||
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_HOSTNAME, m_ircddbHostname);
|
||||
m_config->Write(m_name + KEY_IRCDDB_USERNAME, m_ircddbUsername);
|
||||
m_config->Write(m_name + KEY_IRCDDB_PASSWORD, m_ircddbPassword);
|
||||
m_config->Write(m_name + KEY_IRCDDB_ENABLED1, m_ircddbEnabled1);
|
||||
m_config->Write(m_name + KEY_IRCDDB_HOSTNAME1, m_ircddbHostname1);
|
||||
m_config->Write(m_name + KEY_IRCDDB_USERNAME1, m_ircddbUsername1);
|
||||
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_HOSTNAME2, m_ircddbHostname2);
|
||||
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_PASSWORD4, m_ircddbPassword4);
|
||||
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_DEXTRA_ENABLED, m_dextraEnabled);
|
||||
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_HOST, m_ccsHost);
|
||||
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_STARNET_BAND1, m_starNet1Band);
|
||||
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_DRATS_ENABLED, m_dratsEnabled);
|
||||
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_Y, long(m_y));
|
||||
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_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=%d"), KEY_IRCDDB_ENABLED.c_str(), m_ircddbEnabled ? 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_USERNAME.c_str(), m_ircddbUsername.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=%d"), KEY_IRCDDB_ENABLED1.c_str(), m_ircddbEnabled1 ? 1 : 0); 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_USERNAME1.c_str(), m_ircddbUsername1.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=%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);
|
||||
|
|
@ -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_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=%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=%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);
|
||||
|
|
@ -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=%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_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_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);
|
||||
|
|
@ -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_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_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_Y.c_str(), m_y); file.AddLine(buffer);
|
||||
|
||||
|
|
@ -2649,3 +2676,4 @@ bool CIRCDDBGatewayConfig::write()
|
|||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
* 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 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 getIrcDDB3(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 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 getDPRS(bool& enabled, wxString& hostname, unsigned int& port) const;
|
||||
void setDPRS(bool enabled, const wxString& hostname, unsigned int port);
|
||||
void getDPRS(bool& enabled, wxString& address, unsigned int& port) const;
|
||||
void setDPRS(bool enabled, const wxString& address, unsigned int port);
|
||||
|
||||
void getDExtra(bool& enabled, unsigned int& maxDongles) const;
|
||||
void setDExtra(bool enabled, unsigned int maxDongles);
|
||||
|
|
@ -71,8 +71,8 @@ public:
|
|||
void getDCS(bool& dcsEnabled, bool& ccsEnabled, wxString& ccsHost) const;
|
||||
void setDCS(bool dcsEnabled, bool ccsEnabled, const wxString& ccsHost);
|
||||
|
||||
void getXLX(bool& xlxEnabled, bool& xlxOverrideLocal, wxString& xlxHostsFileUrl);
|
||||
void setXLX(bool xlxEnabled, bool xlxOverrideLocal, wxString xlxHostsFileUrl);
|
||||
void getXLX(bool& xlxEnabled, wxString& xlxHostsFileUrl);
|
||||
void setXLX(bool xlxEnabled, wxString xlxHostsFileUrl);
|
||||
|
||||
#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;
|
||||
|
|
@ -112,6 +112,9 @@ public:
|
|||
void getMiscellaneous(TEXT_LANG& language, bool& infoEnabled, bool& echoEnabled, bool& logEnabled, bool& dratsEnabled, bool& dtmfEnabled) const;
|
||||
void setMiscellaneous(TEXT_LANG language, bool infoEnabled, bool echoEnabled, bool logEnabled, bool dratsEnabled, bool dtmfEnabled);
|
||||
|
||||
void 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 setPosition(int x, int y);
|
||||
|
||||
|
|
@ -215,10 +218,10 @@ private:
|
|||
unsigned char m_repeater4Band1;
|
||||
unsigned char m_repeater4Band2;
|
||||
unsigned char m_repeater4Band3;
|
||||
bool m_ircddbEnabled;
|
||||
wxString m_ircddbHostname;
|
||||
wxString m_ircddbUsername;
|
||||
wxString m_ircddbPassword;
|
||||
bool m_ircddbEnabled1;
|
||||
wxString m_ircddbHostname1;
|
||||
wxString m_ircddbUsername1;
|
||||
wxString m_ircddbPassword1;
|
||||
bool m_ircddbEnabled2;
|
||||
wxString m_ircddbHostname2;
|
||||
wxString m_ircddbUsername2;
|
||||
|
|
@ -232,7 +235,7 @@ private:
|
|||
wxString m_ircddbUsername4;
|
||||
wxString m_ircddbPassword4;
|
||||
bool m_aprsEnabled;
|
||||
wxString m_aprsHostname;
|
||||
wxString m_aprsAddress;
|
||||
unsigned int m_aprsPort;
|
||||
bool m_dextraEnabled;
|
||||
unsigned int m_dextraMaxDongles;
|
||||
|
|
@ -304,6 +307,9 @@ private:
|
|||
bool m_logEnabled;
|
||||
bool m_dratsEnabled;
|
||||
bool m_dtmfEnabled;
|
||||
bool m_gpsdEnabled;
|
||||
wxString m_gpsdAddress;
|
||||
wxString m_gpsdPort;
|
||||
int m_x;
|
||||
int m_y;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -19,20 +19,17 @@
|
|||
#include "Logger.h"
|
||||
|
||||
CLogger::CLogger(const wxString& directory, const wxString& name) :
|
||||
#if(defined(__WINDOWS__))
|
||||
m_day(0),
|
||||
#endif
|
||||
wxLog(),
|
||||
m_name(name),
|
||||
m_file(NULL),
|
||||
m_fileName()
|
||||
m_fileName(),
|
||||
m_day(0)
|
||||
{
|
||||
m_file = new wxFFile;
|
||||
|
||||
m_fileName.SetPath(directory);
|
||||
m_fileName.SetExt(wxT("log"));
|
||||
|
||||
#if(defined(__WINDOWS__))
|
||||
time_t timestamp;
|
||||
::time(×tamp);
|
||||
struct tm* tm = ::gmtime(×tamp);
|
||||
|
|
@ -42,9 +39,6 @@ m_fileName()
|
|||
|
||||
m_day = tm->tm_yday;
|
||||
m_fileName.SetName(text);
|
||||
#else
|
||||
m_fileName.SetName(m_name);
|
||||
#endif
|
||||
|
||||
bool ret = m_file->Open(m_fileName.GetFullPath(), wxT("a+t"));
|
||||
if (!ret) {
|
||||
|
|
@ -85,18 +79,18 @@ void CLogger::DoLogRecord(wxLogLevel level, const wxString& msg, const wxLogReco
|
|||
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());
|
||||
|
||||
logString(message, info.timestamp);
|
||||
writeLog(message.c_str(), info.timestamp);
|
||||
|
||||
if (level == wxLOG_FatalError)
|
||||
::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->IsOpened());
|
||||
wxASSERT(msg != NULL);
|
||||
|
||||
#if(defined(__WINDOWS__))
|
||||
struct tm* tm = ::gmtime(×tamp);
|
||||
|
||||
int day = tm->tm_yday;
|
||||
|
|
@ -115,8 +109,8 @@ void CLogger::logString(const wxString& msg, time_t timestamp)
|
|||
return;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
m_file->Write(msg);
|
||||
m_file->Write(wxString(msg));
|
||||
m_file->Flush();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -22,7 +22,6 @@
|
|||
#include <wx/wx.h>
|
||||
#include <wx/ffile.h>
|
||||
#include <wx/filename.h>
|
||||
#include <wx/log.h>
|
||||
|
||||
class CLogger : public wxLog {
|
||||
public:
|
||||
|
|
@ -35,11 +34,10 @@ private:
|
|||
wxString m_name;
|
||||
wxFFile* m_file;
|
||||
wxFileName m_fileName;
|
||||
#if(defined(__WINDOWS__))
|
||||
int m_day;
|
||||
#endif
|
||||
|
||||
void logString(const wxString& msg, time_t timestamp);
|
||||
void writeLog(const wxChar* msg, time_t timestamp);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -1,22 +1,28 @@
|
|||
OBJECTS = AMBEData.o AnnouncementUnit.o APRSCollector.o APRSWriter.o APRSWriterThread.o AudioUnit.o CacheManager.o CallsignList.o \
|
||||
CallsignServer.o CCITTChecksum.o CCSData.o CCSHandler.o CCSProtocolHandler.o ConnectData.o DCSHandler.o DCSProtocolHandler.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 ConsoleLogger.o DCSHandler.o DCSProtocolHandler.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 \
|
||||
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 \
|
||||
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 \
|
||||
TCPReaderWriterClient.o TCPReaderWriterServer.o TextCollector.o TextData.o Timer.o UDPReaderWriter.o UserCache.o Utils.o \
|
||||
VersionUnit.o XLXHostsFileDownloader.o
|
||||
|
||||
.PHONY: all
|
||||
all: Common.a
|
||||
|
||||
Common.a: $(OBJECTS)
|
||||
Common.a: $(OBJECTS) ../ircDDB/IRCDDB.a
|
||||
$(AR) rcs Common.a $(OBJECTS)
|
||||
|
||||
-include $(OBJECTS:.o=.d)
|
||||
|
||||
%.o: %.cpp
|
||||
$(CXX) -DwxUSE_GUI=0 $(CFLAGS) -I../ircDDB -c -o $@ $<
|
||||
$(CXX) -MM -DwxUSE_GUI=0 $(CFLAGS) -I../ircDDB $< > $*.d
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
$(RM) Common.a *.o *.d *.bak *~
|
||||
|
||||
../ircDDB/IRCDDB.a:
|
||||
|
|
|
|||
61
Common/NatTraversalHandler.cpp
Normal file
61
Common/NatTraversalHandler.cpp
Normal 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
|
||||
80
Common/NatTraversalHandler.h
Normal file
80
Common/NatTraversalHandler.h
Normal 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
|
||||
|
|
@ -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
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -95,6 +95,7 @@ m_flag1(0x00U),
|
|||
m_flag2(0x00U),
|
||||
m_flag3(0x00U),
|
||||
m_restricted(false),
|
||||
m_fastData(false),
|
||||
m_frames(0U),
|
||||
m_silence(0U),
|
||||
m_errors(0U),
|
||||
|
|
@ -582,6 +583,9 @@ void CRepeaterHandler::processRepeater(CHeaderData& header)
|
|||
m_silence = 0U;
|
||||
m_errors = 0U;
|
||||
|
||||
// Assume voice mode
|
||||
m_fastData = false;
|
||||
|
||||
// An RF header resets the reconnect timer
|
||||
m_linkReconnectTimer.start();
|
||||
|
||||
|
|
@ -594,7 +598,7 @@ void CRepeaterHandler::processRepeater(CHeaderData& header)
|
|||
|
||||
// Reset the APRS Writer if it's enabled
|
||||
if (m_aprsWriter != NULL)
|
||||
m_aprsWriter->reset(m_rptCallsign);
|
||||
m_aprsWriter->writeHeader(m_rptCallsign, header);
|
||||
|
||||
// Write to Header.log if it's enabled
|
||||
if (m_headerLogger != NULL)
|
||||
|
|
@ -736,32 +740,42 @@ void CRepeaterHandler::processRepeater(CAMBEData& data)
|
|||
unsigned char buffer[DV_FRAME_MAX_LENGTH_BYTES];
|
||||
data.getData(buffer, DV_FRAME_MAX_LENGTH_BYTES);
|
||||
|
||||
if (::memcmp(buffer, NULL_AMBE_DATA_BYTES, VOICE_FRAME_LENGTH_BYTES) == 0)
|
||||
m_silence++;
|
||||
// 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 DTMF decoding or blanking if off and not on crossband either
|
||||
if (m_dtmfEnabled && m_g2Status != G2_XBAND) {
|
||||
bool pressed = m_dtmf.decode(buffer, data.isEnd());
|
||||
if (pressed) {
|
||||
// Replace the DTMF with silence
|
||||
::memcpy(buffer, NULL_AMBE_DATA_BYTES, VOICE_FRAME_LENGTH_BYTES);
|
||||
data.setData(buffer, DV_FRAME_LENGTH_BYTES);
|
||||
}
|
||||
// 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)
|
||||
m_silence++;
|
||||
|
||||
bool dtmfDone = m_dtmf.hasCommand();
|
||||
if (dtmfDone) {
|
||||
wxString command = m_dtmf.translate();
|
||||
// Don't do DTMF decoding or blanking if off and not on crossband either
|
||||
if (m_dtmfEnabled && m_g2Status != G2_XBAND) {
|
||||
bool pressed = m_dtmf.decode(buffer, data.isEnd());
|
||||
if (pressed) {
|
||||
// Replace the DTMF with silence
|
||||
::memcpy(buffer, NULL_AMBE_DATA_BYTES, VOICE_FRAME_LENGTH_BYTES);
|
||||
data.setData(buffer, DV_FRAME_LENGTH_BYTES);
|
||||
}
|
||||
|
||||
// Only process the DTMF command if the your call is CQCQCQ and not a restricted user
|
||||
if (!m_restricted && m_yourCall.Left(4U).IsSameAs(wxT("CQCQ"))) {
|
||||
if (command.IsEmpty()) {
|
||||
// Do nothing
|
||||
} else if (isCCSCommand(command)) {
|
||||
ccsCommandHandler(command, m_myCall1, wxT("DTMF"));
|
||||
} else if (command.IsSameAs(wxT(" I"))) {
|
||||
m_infoNeeded = true;
|
||||
} else {
|
||||
reflectorCommandHandler(command, m_myCall1, wxT("DTMF"));
|
||||
bool dtmfDone = m_dtmf.hasCommand();
|
||||
if (dtmfDone) {
|
||||
wxString command = m_dtmf.translate();
|
||||
|
||||
// Only process the DTMF command if the your call is CQCQCQ and not a restricted user
|
||||
if (!m_restricted && m_yourCall.Left(4U).IsSameAs(wxT("CQCQ"))) {
|
||||
if (command.IsEmpty()) {
|
||||
// Do nothing
|
||||
} else if (isCCSCommand(command)) {
|
||||
ccsCommandHandler(command, m_myCall1, wxT("DTMF"));
|
||||
} else if (command.IsSameAs(wxT(" I"))) {
|
||||
m_infoNeeded = true;
|
||||
} else {
|
||||
reflectorCommandHandler(command, m_myCall1, wxT("DTMF"));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
* 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_flag3;
|
||||
bool m_restricted;
|
||||
bool m_fastData;
|
||||
|
||||
// Statistics
|
||||
unsigned int m_frames;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -37,6 +37,34 @@ m_fd(-1)
|
|||
#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()
|
||||
{
|
||||
#if defined(__WINDOWS__)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -35,6 +35,8 @@
|
|||
class CUDPReaderWriter {
|
||||
public:
|
||||
CUDPReaderWriter(const wxString& address, unsigned int port);
|
||||
CUDPReaderWriter(unsigned int port);
|
||||
CUDPReaderWriter();
|
||||
~CUDPReaderWriter();
|
||||
|
||||
static in_addr lookup(const wxString& hostName);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -24,9 +24,9 @@
|
|||
const wxString VENDOR_NAME = wxT("G4KLX");
|
||||
|
||||
#if defined(__WXDEBUG__)
|
||||
const wxString VERSION = wxT("20180509 - DEBUG");
|
||||
const wxString VERSION = wxT("20200621 - DEBUG");
|
||||
#else
|
||||
const wxString VERSION = wxT("20180509");
|
||||
const wxString VERSION = wxT("20190621");
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -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
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -28,6 +28,8 @@
|
|||
wxString CXLXHostsFileDownloader::Download(const wxString & xlxHostsFileURL)
|
||||
{
|
||||
#ifdef XLX_USE_WGET
|
||||
wxLogMessage(_T("Downloading XLX reflector list from %s"), xlxHostsFileURL.c_str());
|
||||
|
||||
wxString xlxHostsFileName = wxFileName::CreateTempFileName(_T("XLX_Hosts_"));
|
||||
wxString commandLine = _T("wget -q -O ") + xlxHostsFileName + _T(" ") + xlxHostsFileURL;
|
||||
bool execResult = wxShell(commandLine);
|
||||
|
|
@ -64,8 +66,8 @@ wxString CXLXHostsFileDownloader::Download(const wxString & xlxHostsFileURL)
|
|||
return wxEmptyString;
|
||||
}
|
||||
|
||||
wxInputStream* in = NULL;
|
||||
if((in = http.GetInputStream(path)) && in->IsOk()) {
|
||||
wxInputStream* in = http.GetInputStream(path);
|
||||
if(in != NULL && in->IsOk()) {
|
||||
wxFile file;
|
||||
wxString xlxHostsFileName = wxFileName::CreateTempFileName(_T("XLX_Hosts_"), &file);
|
||||
wxLogMessage(_T("Created temporary file %s"), xlxHostsFileName);
|
||||
|
|
|
|||
|
|
@ -19,9 +19,13 @@
|
|||
|
||||
#ifndef XLXHostsFileDownloader_H
|
||||
#define XLXHostsFileDownloader_H
|
||||
#define XLX_USE_WGET
|
||||
|
||||
#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 {
|
||||
public:
|
||||
static wxString Download(const wxString & xlxHostsFileURL);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
DCS002 dcs002.xreflector.net
|
||||
DCS003 dcs003.xreflector.net
|
||||
DCS004 dcs004.xreflector.net
|
||||
DCS005 www.bm-dmr.uk
|
||||
DCS005 dcs.bm-dmr.uk
|
||||
DCS006 dcs006.xreflector.net
|
||||
DCS006 146.168.196.187
|
||||
DCS007 dcs007.xreflector.net
|
||||
DCS008 dcs008.xreflector.net
|
||||
DCS009 dcs009.xreflector.net
|
||||
DCS010 85.197.129.86
|
||||
DCS010 dcs010.xreflector.net
|
||||
DCS011 dcs011.xreflector.net
|
||||
DCS012 194.38.140.205
|
||||
DCS012 dcs012.xreflector.net
|
||||
DCS013 dcs013.xreflector.net
|
||||
DCS014 dcs014.xreflector.net
|
||||
|
|
@ -18,6 +22,7 @@ DCS016 dcs016.xreflector.net
|
|||
DCS017 dcs017.xreflector.net
|
||||
DCS018 dcs018.xreflector.net
|
||||
DCS019 dcs019.xreflector.net
|
||||
DCS020 3.208.40.45
|
||||
DCS021 dcs021.xreflector.net
|
||||
DCS022 dcs022.xreflector.net
|
||||
DCS023 dcs023.xreflector.net
|
||||
|
|
@ -25,220 +30,438 @@ DCS024 dcs024.xreflector.net
|
|||
DCS025 dcs025.xreflector.net
|
||||
DCS026 dcs026.xreflector.net
|
||||
DCS027 dcs027.xreflector.net
|
||||
DCS028 xlx028.org L
|
||||
DCS028 xlx028.org
|
||||
DCS029 dcs029.xreflector.net
|
||||
DCS030 194.59.177.44
|
||||
DCS032 dcs032.xreflector.net
|
||||
DCS033 dcs033.xreflector.net
|
||||
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
|
||||
DCS041 45.62.226.137
|
||||
DCS044 dcs044.xreflector.net
|
||||
DCS045 64.137.172.60
|
||||
DCS046 176.10.140.161
|
||||
DCS047 121.94.218.243
|
||||
DCS050 212.237.17.133
|
||||
DCS047 202.171.147.58
|
||||
DCS049 212.71.234.224
|
||||
DCS050 80.211.155.206
|
||||
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
|
||||
DCS055 52.80.4.154
|
||||
DCS057 74.193.209.20
|
||||
DCS058 118.236.151.192
|
||||
DCS057 74.193.217.15
|
||||
DCS058 150.66.16.176
|
||||
DCS059 18.219.32.21
|
||||
DCS060 212.237.36.181
|
||||
DCS061 68.115.205.110
|
||||
DCS062 70.88.145.163
|
||||
DCS064 202.241.175.133
|
||||
DCS066 79.16.44.125
|
||||
DCS061 208.71.169.83
|
||||
DCS062 72.17.20.173
|
||||
DCS064 122.222.1.50
|
||||
DCS066 79.55.195.190
|
||||
DCS067 95.60.130.176
|
||||
DCS068 92.222.145.202
|
||||
DCS069 89.36.214.120
|
||||
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
|
||||
DCS076 203.137.116.117
|
||||
DCS077 5.249.151.111
|
||||
DCS078 109.10.128.221
|
||||
DCS079 121.162.91.94
|
||||
DCS080 121.85.180.61
|
||||
DCS081 121.84.13.151
|
||||
DCS082 108.21.232.21
|
||||
DCS083 108.21.232.22
|
||||
DCS085 27.92.11.123
|
||||
DCS086 220.133.89.28
|
||||
DCS077 216.21.9.156
|
||||
DCS078 109.15.57.11
|
||||
DCS079 121.162.91.31
|
||||
DCS080 121.81.128.207
|
||||
DCS081 121.82.151.243
|
||||
DCS082 110.232.113.108
|
||||
DCS083 185.205.210.217
|
||||
DCS084 45.79.93.167
|
||||
DCS085 113.150.26.8
|
||||
DCS086 52.80.139.252
|
||||
DCS087 44.137.36.209
|
||||
DCS088 194.109.192.235
|
||||
DCS089 194.109.192.236
|
||||
DCS090 91.92.136.252
|
||||
DCS092 94.177.190.50
|
||||
DCS093 98.29.99.252
|
||||
DCS095 58.1.93.223
|
||||
DCS098 111.168.216.126
|
||||
DCS099 212.237.59.103
|
||||
DCS100 96.94.7.196
|
||||
DCS101 104.233.105.86
|
||||
DCS102 206.208.56.13
|
||||
DCS103 64.137.248.42
|
||||
DCS104 206.208.56.93
|
||||
DCS111 81.95.126.168
|
||||
DCS112 216.45.55.151
|
||||
DCS114 91.121.136.94
|
||||
DCS092 104.200.25.53
|
||||
DCS093 185.177.59.221
|
||||
DCS095 203.137.76.53
|
||||
DCS097 80.211.154.173
|
||||
DCS098 203.136.233.165
|
||||
DCS099 80.211.27.75
|
||||
DCS100 45.62.234.223
|
||||
DCS101 64.137.236.164
|
||||
DCS102 23.111.174.196
|
||||
DCS103 64.137.224.126
|
||||
DCS104 23.111.174.197
|
||||
DCS105 51.254.99.78
|
||||
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
|
||||
DCS116 31.185.101.211
|
||||
DCS118 5.249.148.252
|
||||
DCS119 125.129.207.86
|
||||
DCS120 24.43.83.140
|
||||
DCS120 81.150.10.63
|
||||
DCS121 174.37.249.156
|
||||
DCS122 83.137.45.126
|
||||
DCS124 211.14.169.234
|
||||
DCS125 213.181.208.52
|
||||
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
|
||||
DCS146 87.228.241.43
|
||||
DCS146 213.7.197.202
|
||||
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
|
||||
DCS171 121.162.91.45
|
||||
DCS185 118.152.21.76
|
||||
DCS204 185.85.18.162
|
||||
DCS171 210.178.113.123
|
||||
DCS175 162.248.92.25
|
||||
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
|
||||
DCS208 151.80.155.39
|
||||
DCS210 45.62.210.243
|
||||
DCS210 64.137.224.107
|
||||
DCS212 52.38.90.188
|
||||
DCS214 185.47.129.230
|
||||
DCS215 185.87.96.172
|
||||
DCS216 74.214.25.135
|
||||
DCS222 93.189.136.50
|
||||
DCS227 86.122.173.9
|
||||
DCS228 212.237.33.114
|
||||
DCS220 124.41.83.11
|
||||
DCS222 212.43.96.84
|
||||
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
|
||||
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
|
||||
DCS242 73.14.84.43
|
||||
DCS246 172.93.48.159
|
||||
DCS248 158.69.206.45
|
||||
DCS252 118.21.66.186
|
||||
DCS255 245.115.35.52
|
||||
DCS255 142.91.158.199
|
||||
DCS257 47.157.82.87
|
||||
DCS258 75.60.237.19
|
||||
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
|
||||
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
|
||||
DCS291 60.112.168.104
|
||||
DCS295 45.62.238.78
|
||||
DCS298 133.208.206.141
|
||||
DCS299 125.236.227.43
|
||||
DCS300 64.137.172.56
|
||||
DCS272 177.194.25.234
|
||||
DCS274 75.115.207.48
|
||||
DCS280 87.19.134.242
|
||||
DCS282 210.188.25.17
|
||||
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
|
||||
DCS307 104.36.40.243
|
||||
DCS310 64.137.165.141
|
||||
DCS311 78.47.206.12
|
||||
DCS313 xlx313.openstd.net
|
||||
DCS303 75.70.52.143
|
||||
DCS305 145.239.116.57
|
||||
DCS307 72.21.76.154
|
||||
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
|
||||
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
|
||||
DCS334 199.119.98.174
|
||||
DCS334 96.47.95.121
|
||||
DCS335 185.206.145.2
|
||||
DCS336 23.226.233.133
|
||||
DCS338 122.116.216.47
|
||||
DCS339 198.98.53.247
|
||||
DCS357 52.39.82.54
|
||||
DCS359 79.232.250.96
|
||||
DCS345 45.62.237.34
|
||||
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
|
||||
DCS367 xrf367.ad6dm.net
|
||||
DCS367 18.216.66.72
|
||||
DCS370 188.213.168.24
|
||||
DCS373 101.143.24.88
|
||||
DCS382 61.116.7.187
|
||||
DCS389 106.71.106.79
|
||||
DCS390 31.14.140.230
|
||||
DCS371 212.237.8.77
|
||||
DCS373 119.229.134.1
|
||||
DCS374 61.195.108.146
|
||||
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
|
||||
DCS399 185.227.110.247
|
||||
DCS400 13.58.192.185
|
||||
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
|
||||
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
|
||||
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
|
||||
DCS499 59.157.4.151
|
||||
DCS500 172.104.32.192
|
||||
DCS502 74.208.88.137
|
||||
DCS515 163.44.167.125
|
||||
DCS487 93.66.214.109
|
||||
DCS499 203.137.76.22
|
||||
DCS500 58.96.21.253
|
||||
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
|
||||
DCS519 24.55.202.247
|
||||
DCS520 202.6.18.14
|
||||
DCS538 133.137.49.171
|
||||
DCS550 151.80.141.175
|
||||
DCS555 64.137.186.11
|
||||
DCS569 219.122.146.110
|
||||
DCS570 104.128.230.153
|
||||
DCS519 149.56.165.76
|
||||
DCS520 xlx.dtdxa.com
|
||||
DCS521 150.129.184.54
|
||||
DCS522 14.102.146.160
|
||||
DCS523 175.142.199.32
|
||||
DCS525 80.211.68.38
|
||||
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
|
||||
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
|
||||
DCS601 51.141.52.193
|
||||
DCS602 212.56.100.200
|
||||
DCS603 24.233.107.8
|
||||
DCS610 103.1.213.21
|
||||
DCS616 44.103.39.7
|
||||
DCS626 202.137.244.157
|
||||
DCS666 54.144.216.63
|
||||
DCS603 216.246.155.99
|
||||
DCS604 139.162.241.24
|
||||
DCS605 183.76.179.238
|
||||
DCS608 219.122.253.83
|
||||
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
|
||||
DCS695 155.254.33.145
|
||||
DCS698 203.137.123.89
|
||||
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
|
||||
DCS707 90.145.156.196
|
||||
DCS708 202.218.37.62
|
||||
DCS708 150.66.20.222
|
||||
DCS709 212.237.34.32
|
||||
DCS711 212.237.18.27
|
||||
DCS712 153.227.250.188
|
||||
DCS714 85.214.119.76
|
||||
DCS724 191.232.36.180
|
||||
DCS712 153.215.181.34
|
||||
DCS713 218.251.63.99
|
||||
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
|
||||
DCS738 210.171.151.238
|
||||
DCS740 104.167.114.230
|
||||
DCS741 203.137.78.41
|
||||
DCS746 178.254.34.44
|
||||
DCS747 93.209.43.173
|
||||
DCS747 93.209.44.227
|
||||
DCS748 64.137.197.36
|
||||
DCS749 45.77.102.203
|
||||
DCS750 203.86.206.49
|
||||
DCS751 210.55.201.126
|
||||
DCS755 193.248.45.246
|
||||
DCS751 203.118.145.79
|
||||
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
|
||||
DCS773 94.177.175.230
|
||||
DCS777 45.62.251.163
|
||||
DCS781 175.179.238.153
|
||||
DCS787 87.154.55.113
|
||||
DCS789 75.144.65.122
|
||||
DCS800 52.26.26.195
|
||||
DCS801 77.117.160.175
|
||||
DCS807 118.8.17.123
|
||||
DCS812 126.25.168.252
|
||||
DCS768 80.211.199.231
|
||||
DCS770 153.126.173.9
|
||||
DCS773 89.46.75.166
|
||||
DCS775 149.202.61.17
|
||||
DCS776 182.168.37.205
|
||||
DCS777 194.182.66.76
|
||||
DCS781 101.143.242.199
|
||||
DCS782 153.221.123.92
|
||||
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
|
||||
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
|
||||
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
|
||||
DCS871 182.245.190.200
|
||||
DCS878 203.137.123.113
|
||||
DCS880 176.10.105.211
|
||||
DCS883 153.179.224.224
|
||||
DCS886 118.163.103.178
|
||||
DCS887 118.163.103.177
|
||||
DCS888 31.14.135.7
|
||||
DCS897 92.222.23.124
|
||||
DCS900 85.214.114.27
|
||||
DCS901 77.117.160.175
|
||||
DCS888 46.18.142.169
|
||||
DCS889 130.149.36.93
|
||||
DCS893 104.223.59.212
|
||||
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
|
||||
DCS908 212.237.2.183
|
||||
DCS907 176.84.63.187
|
||||
DCS908 92.222.23.124
|
||||
DCS909 216.86.147.198
|
||||
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
|
||||
DCS922 81.150.10.62
|
||||
DCS925 90.255.232.101
|
||||
DCS929 158.69.166.132
|
||||
DCS930 94.177.160.5
|
||||
DCS931 173.50.88.34
|
||||
DCS933 37.59.119.115
|
||||
DCS931 68.131.30.206
|
||||
DCS933 164.132.104.167
|
||||
DCS935 188.213.166.199
|
||||
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
|
||||
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
|
||||
DCS965 47.23.66.19
|
||||
DCS966 203.150.19.24
|
||||
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
|
||||
DCS975 176.31.161.9
|
||||
DCS976 212.237.36.71
|
||||
DCS978 193.70.0.229
|
||||
DCS986 81.89.102.160
|
||||
DCS979 217.162.36.91
|
||||
DCS980 80.211.84.249
|
||||
DCS986 194.59.205.218
|
||||
DCS987 185.32.183.148
|
||||
DCS989 xrf989.bbhill.net
|
||||
DCS988 80.211.236.189
|
||||
DCS989 50.27.131.75
|
||||
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
|
||||
DCS998 44.140.236.20
|
||||
DCS999 94.177.173.53
|
||||
DSC034 dcs034.xreflector.net
|
||||
# EOF - Sun, 19 May 2019 12:38:05 GMT
|
||||
|
|
|
|||
|
|
@ -1,200 +1,746 @@
|
|||
#>>Downloaded from W6KD host file server
|
||||
#>>Last updated 17 NOV 2016 by W6KD
|
||||
|
||||
# Prepared at ar-dns.net - Sun, 19 May 2019 12:35:55 GMT
|
||||
XRF000 23.111.174.198
|
||||
XRF000 000.xreflector.org
|
||||
XRF001 77.57.24.143
|
||||
XRF001 xlx001.homepc.it
|
||||
XRF002 140.82.62.162
|
||||
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
|
||||
XRF005 216.16.240.236
|
||||
XRF005 50.116.62.225
|
||||
XRF005 ve3tnk.homelinux.net
|
||||
XRF006 34.213.176.201
|
||||
XRF006 xrf006.xrefl.net
|
||||
XRF007 xrf007.ea5gf.es
|
||||
XRF008 95.110.231.219
|
||||
XRF007 82.223.18.138
|
||||
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
|
||||
XRF011 xlx011.n8qq.com
|
||||
XRF011 81.95.126.168
|
||||
XRF011 xlx011.warn.org
|
||||
XRF012 52.26.161.5
|
||||
XRF012 xrf012.papasys.com
|
||||
XRF013 34.213.176.201
|
||||
XRF013 xrf013.perform2themax.com
|
||||
XRF014 xrf014.iz0rin.it
|
||||
XRF015 194.59.205.228
|
||||
XRF015 xrf015.theapplecore.me
|
||||
XRF016 xrf016.ampr.at
|
||||
XRF018 99.167.129.166
|
||||
XRF019 66.30.81.236
|
||||
XRF020 67.210.212.144
|
||||
XRF021 44.103.32.250
|
||||
XRF017 92.177.212.64
|
||||
XRF018 flatcap.badweather.net
|
||||
XRF019 46.28.108.233
|
||||
XRF019 xlx019.ok2it.com
|
||||
XRF020 xrf020.k2dls.net
|
||||
XRF021 44.103.34.4
|
||||
XRF022 83.137.45.98
|
||||
XRF022 xrf022.tms-it.net
|
||||
XRF023 185.177.59.166
|
||||
XRF023 xlx023.dtdns.net
|
||||
XRF024 94.199.173.123
|
||||
XRF024 xrf024.dstar.at
|
||||
XRF025 89.38.150.252
|
||||
XRF025 025.ham-digital.es
|
||||
XRF026 65.175.188.230
|
||||
XRF027 194.116.29.78
|
||||
XRF028 172.104.63.79
|
||||
XRF028 stn028.dstar.be
|
||||
XRF029 80.123.238.76
|
||||
XRF029 xrf029.tms-it.net
|
||||
XRF030 194.59.177.44
|
||||
XRF030 xrf030.oe3xht.at
|
||||
XRF031 83.241.141.245
|
||||
XRF031 xlx031.ddns.net
|
||||
XRF032 158.64.26.140
|
||||
XRF032 xlx032.epf.lu
|
||||
XRF033 46.226.178.81
|
||||
XRF034 xrf034.dynu.net
|
||||
XRF035 45.79.94.184
|
||||
XRF035 xrf035.wa7dre.org
|
||||
XRF036 xrf036.ddns.net
|
||||
XRF036 151.12.36.112
|
||||
XRF036 xlx036.macasoft.it
|
||||
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
|
||||
XRF041 167.88.37.80
|
||||
XRF042 xrf042.luthienstar.fr
|
||||
XRF043 xrf043.aotnet.it
|
||||
XRF044 82.1.185.173
|
||||
XRF045 45.62.233.223
|
||||
XRF046 176.10.140.161
|
||||
XRF046 xlx.c4fm.se
|
||||
XRF047 202.171.147.58
|
||||
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
|
||||
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
|
||||
XRF062 72.17.20.173
|
||||
XRF062 xlx.maryland-dstar.net
|
||||
XRF063 162.248.141.148
|
||||
XRF064 122.222.1.50
|
||||
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
|
||||
XRF068 92.222.145.202
|
||||
XRF068 xrf068.ircddb.it
|
||||
XRF069 069.xreflector.es
|
||||
XRF069 xrf069.sustrai.org
|
||||
XRF070 xrf070.iptime.org
|
||||
XRF071 211.60.41.185
|
||||
XRF071 xrf.elechomebrew.com
|
||||
XRF072 75.60.237.17
|
||||
XRF072 xrf072.dv.or.kr
|
||||
XRF073 147.102.7.34
|
||||
XRF074 212.237.211.82
|
||||
XRF074 xrf074.dyndns.org
|
||||
XRF075 5.135.162.136
|
||||
XRF075 xrf075.ir9bs.it
|
||||
XRF076 203.137.116.117
|
||||
XRF076 xrf076.xreflector-jp.org
|
||||
XRF077 216.21.9.156
|
||||
XRF077 xrf077.duckdns.org
|
||||
XRF078 xrf078.duckdns.org
|
||||
XRF080 jr3vh.jpn.ph.jp
|
||||
XRF081 ja3gqj.dip.jp
|
||||
XRF084 xrf084.fabbroni.eu
|
||||
XRF078 109.15.57.11
|
||||
XRF078 xlx.grvdc.eu
|
||||
XRF079 184.23.183.98
|
||||
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
|
||||
XRF086 52.80.139.252
|
||||
XRF087 44.137.36.209
|
||||
XRF088 194.109.192.235
|
||||
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
|
||||
XRF099 80.211.27.75
|
||||
XRF099 xlx099.iz7auh.net
|
||||
XRF100 45.62.233.223
|
||||
XRF100 xlx100.xlxreflector.org
|
||||
XRF101 45.62.213.101
|
||||
XRF101 xlx101.xlxreflector.org
|
||||
XRF102 23.111.174.196
|
||||
XRF102 xlx102.xlxreflector.org
|
||||
XRF103 64.137.224.126
|
||||
XRF103 xlx103.xlxreflector.org
|
||||
XRF104 23.111.174.197
|
||||
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
|
||||
XRF113 212.227.202.198
|
||||
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
|
||||
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
|
||||
XRF124 211.14.169.234
|
||||
XRF124 xrf124.xreflector-jp.org
|
||||
XRF125 213.181.208.52
|
||||
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
|
||||
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
|
||||
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
|
||||
XRF171 210.178.113.123
|
||||
XRF171 xrf171.dvham.com
|
||||
XRF175 162.248.92.25
|
||||
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
|
||||
XRF206 193.190.240.227
|
||||
XRF208 151.80.155.39
|
||||
XRF208 xlx208.f5kav.org
|
||||
XRF210 64.137.224.107
|
||||
XRF210 210.xreflector.org
|
||||
XRF212 52.38.90.188
|
||||
XRF212 xlx212.dstar.club
|
||||
XRF214 185.47.129.230
|
||||
XRF214 xlx214.sustrai.org
|
||||
XRF215 185.87.96.172
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
XRF272 200.231.36.188
|
||||
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
|
||||
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
|
||||
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
|
||||
XRF308 xlx308.w6kd.com
|
||||
XRF310 52.11.207.121
|
||||
XRF310 xrf310.xrefl.net
|
||||
XRF311 46.41.0.214
|
||||
XRF311 xrf311.ernix.de
|
||||
XRF312 192.241.160.183
|
||||
XRF312 xrf312.xrefl.net
|
||||
XRF313 xlx313.xrefl.net
|
||||
XRF314 xlx314.xrefl.net
|
||||
XRF313 34.213.108.164
|
||||
XRF313 xlx313.openstd.net
|
||||
XRF314 162.248.10.154
|
||||
XRF315 65.101.7.50
|
||||
XRF317 44.48.8.15
|
||||
XRF317 xrf317.crossroadsdmr.org
|
||||
XRF318 xrf318.xrefl.net
|
||||
XRF321 31.207.110.45
|
||||
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
|
||||
XRF334 96.47.95.121
|
||||
XRF335 185.206.145.2
|
||||
XRF336 23.226.233.133
|
||||
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
|
||||
XRF356 93.152.167.4
|
||||
XRF357 93.152.167.4
|
||||
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
|
||||
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
|
||||
XRF388 138.197.67.52
|
||||
XRF389 106.70.187.224
|
||||
XRF389 xlxdmr.duckdns.org
|
||||
XRF390 149.7.214.253
|
||||
XRF390 xrf390.aotnet.it
|
||||
XRF393 139.91.200.186
|
||||
XRF395 5.249.151.111
|
||||
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
|
||||
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
|
||||
XRF421 118.189.181.236
|
||||
XRF423 4ix.hacktic.de
|
||||
XRF431 61.195.98.225
|
||||
XRF431 xrf431.xreflector-jp.org
|
||||
XRF433 217.160.22.17
|
||||
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
|
||||
XRF444 188.68.37.51
|
||||
XRF444 xlx444.pa3dfn.nl
|
||||
XRF446 78.226.112.146
|
||||
XRF449 159.89.183.117
|
||||
XRF450 64.137.224.233
|
||||
XRF450 450.xreflector.org
|
||||
XRF454 218.250.250.21
|
||||
XRF455 208.71.169.83
|
||||
XRF456 54.37.204.187
|
||||
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
|
||||
XRF499 203.137.76.22
|
||||
XRF499 xrf499.xreflector-jp.org
|
||||
XRF500 125.63.57.138
|
||||
XRF500 xrf500.org
|
||||
XRF501 104.130.72.187
|
||||
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
|
||||
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
|
||||
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
|
||||
XRF559 98.239.113.175
|
||||
XRF567 212.91.156.69
|
||||
XRF569 203.137.111.98
|
||||
XRF569 xlxreflector.jpn.ph
|
||||
XRF570 xrf.no-ip.org
|
||||
XRF570 104.128.230.153
|
||||
XRF573 216.189.148.204
|
||||
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
|
||||
XRF601 51.141.52.193
|
||||
XRF602 212.56.100.200
|
||||
XRF603 216.246.155.99
|
||||
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
|
||||
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
|
||||
XRF669 xrf669.no-ip.org
|
||||
XRF673 180.147.243.178
|
||||
XRF673 xrf673.xreflector-jp.org
|
||||
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
|
||||
XRF700 78.47.222.93
|
||||
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
|
||||
XRF707 90.145.156.196
|
||||
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
|
||||
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 xrf714.ea3hkb.com
|
||||
XRF715 xlx715.ea3hkb.net
|
||||
XRF716 xlx716.duckdns.org
|
||||
XRF717 44.137.70.100
|
||||
XRF719 199.227.117.121
|
||||
XRF720 23.237.16.149
|
||||
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
|
||||
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
|
||||
XRF738 210.171.151.238
|
||||
XRF740 104.167.114.230
|
||||
XRF740 imagewell.duckdns.org
|
||||
XRF741 203.137.78.41
|
||||
XRF746 178.254.34.44
|
||||
XRF747 87.147.142.9
|
||||
XRF747 xrf747.de
|
||||
XRF748 64.137.197.36
|
||||
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
|
||||
XRF762 129.21.36.65
|
||||
XRF766 201.62.48.61
|
||||
XRF766 xlx.amrase.org.br
|
||||
XRF767 xrf767.de
|
||||
XRF768 80.211.199.231
|
||||
XRF770 153.126.173.9
|
||||
XRF773 94.177.175.230
|
||||
XRF773 xrf773.iz0rin.it
|
||||
XRF775 149.202.61.17
|
||||
XRF776 218.221.181.241
|
||||
XRF776 xlx776.tokyo
|
||||
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
|
||||
XRF788 192.168.0.96
|
||||
XRF789 45.33.119.142
|
||||
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
|
||||
XRF808 18.220.252.27
|
||||
XRF808 xrf808.n5wls.net
|
||||
XRF809 78.46.11.69
|
||||
XRF810 64.137.238.189
|
||||
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
|
||||
XRF833 78.226.112.146
|
||||
XRF844 137.226.79.122
|
||||
XRF847 162.243.4.29
|
||||
XRF850 88.198.94.77
|
||||
XRF850 xrf850.xrfmaster.net
|
||||
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
|
||||
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
|
||||
XRF887 118.163.103.177
|
||||
XRF888 46.18.142.169
|
||||
XRF888 xlx888.ns0.it
|
||||
XRF889 130.149.36.93
|
||||
XRF893 104.223.59.212
|
||||
XRF897 92.222.23.124
|
||||
XRF900 94.177.237.192
|
||||
XRF901 xrf901.dyndns.org
|
||||
XRF902 xrf902.dyndns.org
|
||||
XRF903 80.211.29.226
|
||||
XRF904 211.14.169.215
|
||||
XRF905 199.212.121.20
|
||||
XRF906 212.237.11.53
|
||||
XRF906 xrf906.radioclubveleta.es
|
||||
XRF909 xrf909.ealink.org
|
||||
XRF911 5.196.73.89
|
||||
XRF907 88.3.75.162
|
||||
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
|
||||
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
|
||||
XRF930 94.177.160.5
|
||||
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
|
||||
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
|
||||
XRF987 185.32.183.148
|
||||
XRF987 xrf987.metro-uhf.org
|
||||
XRF988 80.211.236.189
|
||||
XRF988 988.xreflector.es
|
||||
XRF989 50.27.131.75
|
||||
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
|
||||
XRF999 94.177.173.53
|
||||
XRF999 xrf999.no-ip.org
|
||||
XRFWDX 47.149.178.211
|
||||
XRFWDX worldwidedx.com
|
||||
# EOF - Sun, 19 May 2019 12:35:55 GMT
|
||||
|
|
|
|||
|
|
@ -1,7 +1,4 @@
|
|||
#>>Downloaded from W6KD host file server
|
||||
#>>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
|
||||
# Prepared at ar-dns.net - Sun, 19 May 2019 12:38:29 GMT
|
||||
REF001 ref001.dstargateway.org
|
||||
REF002 ref002.dstargateway.org
|
||||
REF003 ref003.dstargateway.org
|
||||
|
|
@ -74,37 +71,26 @@ REF069 ref069.dstargateway.org
|
|||
REF070 ref070.dstargateway.org
|
||||
REF071 ref071.dstargateway.org
|
||||
REF072 ref072.dstargateway.org
|
||||
#REF073 ref073.dstargateway.org
|
||||
#REF074 ref074.dstargateway.org
|
||||
REF073 ref073.dstargateway.org
|
||||
REF074 ref074.dstargateway.org
|
||||
REF075 ref075.dstargateway.org
|
||||
REF076 ref076.dstargateway.org
|
||||
REF077 ref077.dstargateway.org
|
||||
REF078 ref078.dstargateway.org
|
||||
#REF079 ref079.dstargateway.org
|
||||
#REF080 ref080.dstargateway.org
|
||||
#REF081 ref081.dstargateway.org
|
||||
#REF082 ref082.dstargateway.org
|
||||
#REF083 ref083.dstargateway.org
|
||||
#REF084 ref084.dstargateway.org
|
||||
#REF085 ref085.dstargateway.org
|
||||
#REF086 ref086.dstargateway.org
|
||||
#REF087 ref087.dstargateway.org
|
||||
#REF088 ref088.dstargateway.org
|
||||
#REF089 ref089.dstargateway.org
|
||||
#REF090 ref090.dstargateway.org
|
||||
#REF091 ref091.dstargateway.org
|
||||
#REF092 ref092.dstargateway.org
|
||||
#REF093 ref093.dstargateway.org
|
||||
#REF094 ref094.dstargateway.org
|
||||
#REF095 ref095.dstargateway.org
|
||||
#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
|
||||
REF079 ref079.dstargateway.org
|
||||
REF080 ref080.dstargateway.org
|
||||
REF081 ref081.dstargateway.org
|
||||
REF082 ref082.dstargateway.org
|
||||
REF083 ref083.dstargateway.org
|
||||
REF084 ref084.dstargateway.org
|
||||
REF085 ref085.dstargateway.org
|
||||
REF086 ref086.dstargateway.org
|
||||
REF087 ref087.dstargateway.org
|
||||
REF088 ref088.dstargateway.org
|
||||
REF089 ref089.dstargateway.org
|
||||
REF367 xrf367.ad6dm.net
|
||||
REF425 xlx425.xlx.ar-dns.net
|
||||
REF520 xlx.dtdxa.com
|
||||
REF555 xlx555.dtdxa.com
|
||||
REF911 xlx911.patrweb.com
|
||||
# EOF - Sun, 19 May 2019 12:38:29 GMT
|
||||
|
|
|
|||
|
|
@ -1,36 +1,37 @@
|
|||
.PHONY: install
|
||||
install:
|
||||
install -d -g bin -o root -m 0775 $(DATADIR)
|
||||
install -g bin -o root -m 0664 CCS_Hosts.txt $(DATADIR)
|
||||
install -g bin -o root -m 0664 DCS_Hosts.txt $(DATADIR)
|
||||
install -g bin -o root -m 0664 DExtra_Hosts.txt $(DATADIR)
|
||||
install -g bin -o root -m 0664 DPlus_Hosts.txt $(DATADIR)
|
||||
install -g bin -o root -m 0664 TIME_de_DE.ambe $(DATADIR)
|
||||
install -g bin -o root -m 0664 TIME_de_DE.indx $(DATADIR)
|
||||
install -g bin -o root -m 0664 TIME_en_GB.ambe $(DATADIR)
|
||||
install -g bin -o root -m 0664 TIME_en_GB.indx $(DATADIR)
|
||||
install -g bin -o root -m 0664 TIME_en_US.ambe $(DATADIR)
|
||||
install -g bin -o root -m 0664 TIME_en_US.indx $(DATADIR)
|
||||
install -g bin -o root -m 0664 TIME_fr_FR.ambe $(DATADIR)
|
||||
install -g bin -o root -m 0664 TIME_fr_FR.indx $(DATADIR)
|
||||
install -g bin -o root -m 0664 TIME_se_SE.ambe $(DATADIR)
|
||||
install -g bin -o root -m 0664 TIME_se_SE.indx $(DATADIR)
|
||||
install -g bin -o root -m 0664 de_DE.ambe $(DATADIR)
|
||||
install -g bin -o root -m 0664 de_DE.indx $(DATADIR)
|
||||
install -g bin -o root -m 0664 dk_DK.ambe $(DATADIR)
|
||||
install -g bin -o root -m 0664 dk_DK.indx $(DATADIR)
|
||||
install -g bin -o root -m 0664 en_GB.ambe $(DATADIR)
|
||||
install -g bin -o root -m 0664 en_GB.indx $(DATADIR)
|
||||
install -g bin -o root -m 0664 en_US.ambe $(DATADIR)
|
||||
install -g bin -o root -m 0664 en_US.indx $(DATADIR)
|
||||
install -g bin -o root -m 0664 es_ES.ambe $(DATADIR)
|
||||
install -g bin -o root -m 0664 es_ES.indx $(DATADIR)
|
||||
install -g bin -o root -m 0664 fr_FR.ambe $(DATADIR)
|
||||
install -g bin -o root -m 0664 fr_FR.indx $(DATADIR)
|
||||
install -g bin -o root -m 0664 it_IT.ambe $(DATADIR)
|
||||
install -g bin -o root -m 0664 it_IT.indx $(DATADIR)
|
||||
install -g bin -o root -m 0664 no_NO.ambe $(DATADIR)
|
||||
install -g bin -o root -m 0664 no_NO.indx $(DATADIR)
|
||||
install -g bin -o root -m 0664 pl_PL.ambe $(DATADIR)
|
||||
install -g bin -o root -m 0664 pl_PL.indx $(DATADIR)
|
||||
install -g bin -o root -m 0664 se_SE.ambe $(DATADIR)
|
||||
install -g bin -o root -m 0664 se_SE.indx $(DATADIR)
|
||||
install -d -g root -o root -m 0755 $(DESTDIR)$(DATADIR)
|
||||
install -g root -o root -m 0644 CCS_Hosts.txt $(DESTDIR)$(DATADIR)
|
||||
install -g root -o root -m 0644 DCS_Hosts.txt $(DESTDIR)$(DATADIR)
|
||||
install -g root -o root -m 0644 DExtra_Hosts.txt $(DESTDIR)$(DATADIR)
|
||||
install -g root -o root -m 0644 DPlus_Hosts.txt $(DESTDIR)$(DATADIR)
|
||||
install -g root -o root -m 0644 TIME_de_DE.ambe $(DESTDIR)$(DATADIR)
|
||||
install -g root -o root -m 0644 TIME_de_DE.indx $(DESTDIR)$(DATADIR)
|
||||
install -g root -o root -m 0644 TIME_en_GB.ambe $(DESTDIR)$(DATADIR)
|
||||
install -g root -o root -m 0644 TIME_en_GB.indx $(DESTDIR)$(DATADIR)
|
||||
install -g root -o root -m 0644 TIME_en_US.ambe $(DESTDIR)$(DATADIR)
|
||||
install -g root -o root -m 0644 TIME_en_US.indx $(DESTDIR)$(DATADIR)
|
||||
install -g root -o root -m 0644 TIME_fr_FR.ambe $(DESTDIR)$(DATADIR)
|
||||
install -g root -o root -m 0644 TIME_fr_FR.indx $(DESTDIR)$(DATADIR)
|
||||
install -g root -o root -m 0644 TIME_se_SE.ambe $(DESTDIR)$(DATADIR)
|
||||
install -g root -o root -m 0644 TIME_se_SE.indx $(DESTDIR)$(DATADIR)
|
||||
install -g root -o root -m 0644 de_DE.ambe $(DESTDIR)$(DATADIR)
|
||||
install -g root -o root -m 0644 de_DE.indx $(DESTDIR)$(DATADIR)
|
||||
install -g root -o root -m 0644 dk_DK.ambe $(DESTDIR)$(DATADIR)
|
||||
install -g root -o root -m 0644 dk_DK.indx $(DESTDIR)$(DATADIR)
|
||||
install -g root -o root -m 0644 en_GB.ambe $(DESTDIR)$(DATADIR)
|
||||
install -g root -o root -m 0644 en_GB.indx $(DESTDIR)$(DATADIR)
|
||||
install -g root -o root -m 0644 en_US.ambe $(DESTDIR)$(DATADIR)
|
||||
install -g root -o root -m 0644 en_US.indx $(DESTDIR)$(DATADIR)
|
||||
install -g root -o root -m 0644 es_ES.ambe $(DESTDIR)$(DATADIR)
|
||||
install -g root -o root -m 0644 es_ES.indx $(DESTDIR)$(DATADIR)
|
||||
install -g root -o root -m 0644 fr_FR.ambe $(DESTDIR)$(DATADIR)
|
||||
install -g root -o root -m 0644 fr_FR.indx $(DESTDIR)$(DATADIR)
|
||||
install -g root -o root -m 0644 it_IT.ambe $(DESTDIR)$(DATADIR)
|
||||
install -g root -o root -m 0644 it_IT.indx $(DESTDIR)$(DATADIR)
|
||||
install -g root -o root -m 0644 no_NO.ambe $(DESTDIR)$(DATADIR)
|
||||
install -g root -o root -m 0644 no_NO.indx $(DESTDIR)$(DATADIR)
|
||||
install -g root -o root -m 0644 pl_PL.ambe $(DESTDIR)$(DATADIR)
|
||||
install -g root -o root -m 0644 pl_PL.indx $(DESTDIR)$(DATADIR)
|
||||
install -g root -o root -m 0644 se_SE.ambe $(DESTDIR)$(DATADIR)
|
||||
install -g root -o root -m 0644 se_SE.indx $(DESTDIR)$(DATADIR)
|
||||
|
|
|
|||
|
|
@ -109,12 +109,13 @@ bool CDCSSet::Validate()
|
|||
if (n == wxNOT_FOUND)
|
||||
return false;
|
||||
|
||||
n = m_ccsEnabled->GetCurrentSelection();
|
||||
if (n == wxNOT_FOUND)
|
||||
return false;
|
||||
bool ccsEnabled = m_ccsEnabled->GetCurrentSelection() == 1;
|
||||
bool ccsHostSelected = m_ccsHosts->GetCurrentSelection() != wxNOT_FOUND;
|
||||
|
||||
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 true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
* 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 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),
|
||||
m_title(title),
|
||||
m_enabled(NULL),
|
||||
m_hostname(NULL),
|
||||
m_address(NULL),
|
||||
m_port(NULL)
|
||||
{
|
||||
wxFlexGridSizer* sizer = new wxFlexGridSizer(2);
|
||||
|
|
@ -43,11 +43,11 @@ m_port(NULL)
|
|||
sizer->Add(m_enabled, 0, wxALL | wxALIGN_LEFT, BORDER_SIZE);
|
||||
m_enabled->SetSelection(enabled ? 1 : 0);
|
||||
|
||||
wxStaticText* hostnameLabel = new wxStaticText(this, -1, _("Hostname"));
|
||||
sizer->Add(hostnameLabel, 0, wxALL | wxALIGN_LEFT, BORDER_SIZE);
|
||||
wxStaticText* addressLabel = new wxStaticText(this, -1, _("Address"));
|
||||
sizer->Add(addressLabel, 0, wxALL | wxALIGN_LEFT, BORDER_SIZE);
|
||||
|
||||
m_hostname = new wxTextCtrl(this, -1, hostname, wxDefaultPosition, wxSize(CONTROL_WIDTH1, -1));
|
||||
sizer->Add(m_hostname, 0, wxALL | wxALIGN_LEFT, BORDER_SIZE);
|
||||
m_address = new wxTextCtrl(this, -1, address, wxDefaultPosition, wxSize(CONTROL_WIDTH1, -1));
|
||||
sizer->Add(m_address, 0, wxALL | wxALIGN_LEFT, BORDER_SIZE);
|
||||
|
||||
wxStaticText* portLabel = new wxStaticText(this, -1, _("Port"));
|
||||
sizer->Add(portLabel, 0, wxALL | wxALIGN_LEFT, BORDER_SIZE);
|
||||
|
|
@ -75,8 +75,8 @@ bool CDPRSSet::Validate()
|
|||
if (n == wxNOT_FOUND)
|
||||
return false;
|
||||
|
||||
wxString hostname = m_hostname->GetValue();
|
||||
if (hostname.IsEmpty())
|
||||
wxString address = m_address->GetValue();
|
||||
if (address.IsEmpty())
|
||||
return true;
|
||||
|
||||
unsigned int port = getPort();
|
||||
|
|
@ -99,9 +99,9 @@ bool CDPRSSet::getEnabled() const
|
|||
return c == 1;
|
||||
}
|
||||
|
||||
wxString CDPRSSet::getHostname() const
|
||||
wxString CDPRSSet::getAddress() const
|
||||
{
|
||||
return m_hostname->GetValue();
|
||||
return m_address->GetValue();
|
||||
}
|
||||
|
||||
unsigned int CDPRSSet::getPort() const
|
||||
|
|
|
|||
|
|
@ -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
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -25,19 +25,19 @@
|
|||
|
||||
class CDPRSSet : public wxPanel {
|
||||
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 bool Validate();
|
||||
|
||||
virtual bool getEnabled() const;
|
||||
virtual wxString getHostname() const;
|
||||
virtual wxString getAddress() const;
|
||||
virtual unsigned int getPort() const;
|
||||
|
||||
private:
|
||||
wxString m_title;
|
||||
wxChoice* m_enabled;
|
||||
wxTextCtrl* m_hostname;
|
||||
wxTextCtrl* m_address;
|
||||
CPortTextCtrl* m_port;
|
||||
};
|
||||
|
||||
|
|
|
|||
114
GUICommon/GPSDSet.cpp
Normal file
114
GUICommon/GPSDSet.cpp
Normal 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
46
GUICommon/GPSDSet.h
Normal 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
|
||||
|
|
@ -22,29 +22,29 @@
|
|||
<ProjectGuid>{02D03515-0BBE-4553-8C40-566A597478F8}</ProjectGuid>
|
||||
<RootNamespace>GUICommon</RootNamespace>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
|
|
@ -77,6 +77,10 @@
|
|||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<OutDir>$(SolutionDir)$(Configuration)\</OutDir>
|
||||
<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>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
|
|
@ -139,6 +143,7 @@
|
|||
<ClCompile Include="DExtraSet.cpp" />
|
||||
<ClCompile Include="DPlusSet.cpp" />
|
||||
<ClCompile Include="DPRSSet.cpp" />
|
||||
<ClCompile Include="GPSDSet.cpp" />
|
||||
<ClCompile Include="PortTextCtrl.cpp" />
|
||||
<ClCompile Include="RemoteSet.cpp" />
|
||||
<ClCompile Include="RepeaterDataSet.cpp" />
|
||||
|
|
@ -155,6 +160,7 @@
|
|||
<ClInclude Include="DExtraSet.h" />
|
||||
<ClInclude Include="DPlusSet.h" />
|
||||
<ClInclude Include="DPRSSet.h" />
|
||||
<ClInclude Include="GPSDSet.h" />
|
||||
<ClInclude Include="PortTextCtrl.h" />
|
||||
<ClInclude Include="RemoteSet.h" />
|
||||
<ClInclude Include="RepeaterDataSet.h" />
|
||||
|
|
|
|||
|
|
@ -32,6 +32,9 @@
|
|||
<ClCompile Include="DPRSSet.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="GPSDSet.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="PortTextCtrl.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
|
|
@ -76,6 +79,9 @@
|
|||
<ClInclude Include="DPRSSet.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="GPSDSet.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="PortTextCtrl.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
.PHONY: all
|
||||
all: GUICommon.a
|
||||
|
||||
GUICommon.a: $(OBJECTS)
|
||||
GUICommon.a: $(OBJECTS) ../Common/Common.a
|
||||
$(AR) rcs GUICommon.a $(OBJECTS)
|
||||
|
||||
-include $(OBJECTS:.o=.d)
|
||||
|
||||
%.o: %.cpp
|
||||
$(CXX) $(CFLAGS) -I../Common -c -o $@ $<
|
||||
$(CXX) -MM $(CFLAGS) -I../Common $< > $*.d
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
$(RM) GUICommon.a *.o *.d *.bak *~
|
||||
|
||||
../Common/Common.a:
|
||||
|
|
|
|||
|
|
@ -20,6 +20,8 @@
|
|||
#include "XLXSet.h"
|
||||
#include "Defs.h"
|
||||
|
||||
#include <wx/url.h>
|
||||
|
||||
// TODO F4FXL try to figure out why below symbols are not found under ubuntu
|
||||
//#include <wx/url.h>
|
||||
|
||||
|
|
@ -34,11 +36,10 @@ BEGIN_EVENT_TABLE(CXLXSet, wxPanel)
|
|||
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),
|
||||
m_title(title),
|
||||
m_xlxEnabled(NULL),
|
||||
m_xlxOverrideLocal(NULL),
|
||||
m_xlxHostsFileUrl(NULL)
|
||||
{
|
||||
wxFlexGridSizer* sizer = new wxFlexGridSizer(2);
|
||||
|
|
@ -52,15 +53,6 @@ m_xlxHostsFileUrl(NULL)
|
|||
sizer->Add(m_xlxEnabled, 0, wxALL | wxALIGN_LEFT, BORDER_SIZE);
|
||||
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"));
|
||||
sizer->Add(xlxHostsFileUrlLabel, 0, wxALL | wxALIGN_RIGHT, BORDER_SIZE);
|
||||
|
||||
|
|
@ -89,27 +81,21 @@ bool CXLXSet::Validate()
|
|||
if (n == wxNOT_FOUND)
|
||||
return false;
|
||||
|
||||
n = m_xlxOverrideLocal->GetCurrentSelection();
|
||||
if (n == wxNOT_FOUND)
|
||||
return false;
|
||||
|
||||
#if defined(__WINDOWS__)
|
||||
// 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);
|
||||
if (url.GetError() != wxURL_NOERR)
|
||||
return false;*/
|
||||
if (url.GetError() == wxURL_NOERR)
|
||||
return true;
|
||||
|
||||
wxMessageDialog dialog(this, _("The XLX host file URL is not valid"), m_title + _(" Error"), wxICON_ERROR);
|
||||
dialog.ShowModal();
|
||||
return false;
|
||||
#else
|
||||
return true;
|
||||
#endif
|
||||
}
|
||||
|
||||
bool CXLXSet::getXLXOverrideLocal() const
|
||||
{
|
||||
int c = m_xlxEnabled->GetCurrentSelection();
|
||||
if (c == wxNOT_FOUND)
|
||||
return false;
|
||||
|
||||
return c == 1;
|
||||
}
|
||||
|
||||
bool CXLXSet::getXLXEnabled() const
|
||||
{
|
||||
|
|
@ -124,13 +110,16 @@ wxString CXLXSet::getXLXHostsFileUrl() const
|
|||
{
|
||||
wxString value = m_xlxHostsFileUrl->GetValue();
|
||||
|
||||
|
||||
#if defined(__WINDOWS__)
|
||||
// TODO F4FXL try to figure out why below symbols are not found under ubuntu
|
||||
//wxURL url(value);
|
||||
//if (url.GetError() == wxURL_NOERR)
|
||||
// return value;
|
||||
wxURL url(value);
|
||||
if (url.GetError() == wxURL_NOERR)
|
||||
return value;
|
||||
|
||||
return wxEmptyString;
|
||||
#else
|
||||
return value;
|
||||
#endif
|
||||
}
|
||||
|
||||
void CXLXSet::onEnabled(wxCommandEvent &event)
|
||||
|
|
|
|||
|
|
@ -23,13 +23,12 @@
|
|||
|
||||
class CXLXSet : public wxPanel {
|
||||
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 bool Validate();
|
||||
|
||||
virtual bool getXLXEnabled() const;
|
||||
virtual bool getXLXOverrideLocal() const;
|
||||
virtual wxString getXLXHostsFileUrl() const;
|
||||
|
||||
virtual void onEnabled(wxCommandEvent& event);
|
||||
|
|
@ -37,7 +36,6 @@ public:
|
|||
private:
|
||||
wxString m_title;
|
||||
wxChoice* m_xlxEnabled;
|
||||
wxChoice* m_xlxOverrideLocal;
|
||||
wxTextCtrl* m_xlxHostsFileUrl;
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
|
|
|
|||
145
Makefile
145
Makefile
|
|
@ -1,76 +1,111 @@
|
|||
export DATADIR := "/usr/share/ircddbgateway"
|
||||
export LOGDIR := "/var/log"
|
||||
export CONFDIR := "/etc"
|
||||
export BINDIR := "/usr/bin"
|
||||
export BUILD ?= debug
|
||||
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 line.
|
||||
|
||||
DEBUGFLAGS := -g -D_DEBUG
|
||||
RELEASEFLAGS := -DNDEBUG -DwxDEBUG_LEVEL=0
|
||||
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)
|
||||
export CFLAGS := -O2 -Wall $(shell wx-config --cxxflags) -DLOG_DIR='"$(LOGDIR)"' -DCONF_DIR='"$(CONFDIR)"' -DDATA_DIR='"$(DATADIR)"'
|
||||
ifeq ($(BUILD), debug)
|
||||
export CFLAGS := $(CFLAGS) $(DEBUGFLAGS)
|
||||
else ifeq ($(BUILD), release)
|
||||
export CFLAGS := $(CFLAGS) $(RELEASEFLAGS)
|
||||
endif
|
||||
export LIBS := $(shell wx-config --libs base,net)
|
||||
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
|
||||
|
||||
ircDDBGateway/ircddbgatewayd: Common/Common.a ircDDB/IRCDDB.a
|
||||
make -C ircDDBGateway
|
||||
ircDDBGateway/ircddbgatewayd: Common/Common.a ircDDB/IRCDDB.a force
|
||||
$(MAKE) -C ircDDBGateway
|
||||
|
||||
ircDDBGatewayConfig/ircddbgatewayconfig: GUICommon/GUICommon.a Common/Common.a
|
||||
make -C ircDDBGatewayConfig
|
||||
APRSTransmit/aprstransmitd: Common/Common.a force
|
||||
$(MAKE) -C APRSTransmit
|
||||
|
||||
APRSTransmit/aprstransmitd: Common/Common.a
|
||||
make -C APRSTransmit
|
||||
RemoteControl/remotecontrold: Common/Common.a force
|
||||
$(MAKE) -C RemoteControl
|
||||
|
||||
RemoteControl/remotecontrold: Common/Common.a
|
||||
make -C RemoteControl
|
||||
StarNetServer/starnetserverd: Common/Common.a ircDDB/IRCDDB.a force
|
||||
$(MAKE) -C StarNetServer
|
||||
|
||||
StarNetServer/starnetserverd: Common/Common.a ircDDB/IRCDDB.a
|
||||
make -C StarNetServer
|
||||
TextTransmit/texttransmitd: Common/Common.a force
|
||||
$(MAKE) -C TextTransmit
|
||||
|
||||
TextTransmit/texttransmitd: Common/Common.a
|
||||
make -C TextTransmit
|
||||
TimerControl/timercontrold: Common/Common.a force
|
||||
$(MAKE) -C TimerControl
|
||||
|
||||
TimerControl/timercontrold: Common/Common.a GUICommon/GUICommon.a
|
||||
make -C TimerControl
|
||||
TimeServer/timeserverd: Common/Common.a force
|
||||
$(MAKE) -C TimeServer
|
||||
|
||||
TimeServer/timeserverd: Common/Common.a GUICommon/GUICommon.a
|
||||
make -C TimeServer
|
||||
VoiceTransmit/voicetransmitd: Common/Common.a force
|
||||
$(MAKE) -C VoiceTransmit
|
||||
|
||||
VoiceTransmit/voicetransmitd: Common/Common.a
|
||||
make -C VoiceTransmit
|
||||
Common/Common.a: force
|
||||
$(MAKE) -C Common
|
||||
|
||||
GUICommon/GUICommon.a:
|
||||
make -C GUICommon
|
||||
ircDDB/IRCDDB.a: force
|
||||
$(MAKE) -C ircDDB
|
||||
|
||||
Common/Common.a:
|
||||
make -C Common
|
||||
.PHONY: installdirs
|
||||
installdirs: force
|
||||
/bin/mkdir -p $(DESTDIR)$(DATADIR) $(DESTDIR)$(LOGDIR) $(DESTDIR)$(CONFDIR) $(DESTDIR)$(BINDIR)
|
||||
|
||||
ircDDB/IRCDDB.a:
|
||||
make -C ircDDB
|
||||
.PHONY: install
|
||||
install: all installdirs
|
||||
ifeq ($(TARGET), opendv)
|
||||
useradd --user-group -M --system opendv --shell /bin/false || true
|
||||
|
||||
install: all
|
||||
make -C Data 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
|
||||
make -C ircDDBGatewayConfig install
|
||||
# Add the opendv user to the audio group so that it can open audio
|
||||
# devices when using the audio based drivers such as the Sound Card
|
||||
# one. Maybe this should be moved to DStarRepeater instead ...
|
||||
usermod --groups audio --append opendv || true
|
||||
usermod --groups dialout --append opendv || true
|
||||
usermod --groups gpio --append opendv || true
|
||||
mkdir /var/log/opendv || true
|
||||
chown opendv:opendv /var/log/opendv
|
||||
endif
|
||||
$(MAKE) -C Data 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:
|
||||
make -C Common clean
|
||||
make -C ircDDB clean
|
||||
make -C GUICommon clean
|
||||
make -C APRSTransmit clean
|
||||
make -C ircDDBGateway clean
|
||||
make -C RemoteControl clean
|
||||
make -C StarNetServer clean
|
||||
make -C TextTransmit clean
|
||||
make -C TimerControl clean
|
||||
make -C TimeServer clean
|
||||
make -C VoiceTransmit clean
|
||||
make -C ircDDBGatewayConfig clean
|
||||
$(MAKE) -C Common clean
|
||||
$(MAKE) -C ircDDB clean
|
||||
$(MAKE) -C APRSTransmit clean
|
||||
$(MAKE) -C ircDDBGateway clean
|
||||
$(MAKE) -C RemoteControl clean
|
||||
$(MAKE) -C StarNetServer clean
|
||||
$(MAKE) -C TextTransmit clean
|
||||
$(MAKE) -C TimerControl clean
|
||||
$(MAKE) -C TimeServer clean
|
||||
$(MAKE) -C VoiceTransmit clean
|
||||
$(MAKE) -C ircDDBGatewayConfig clean
|
||||
|
||||
.PHONY: force
|
||||
force :
|
||||
@true
|
||||
|
||||
|
|
|
|||
95
MakefileGUI
Normal file
95
MakefileGUI
Normal 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;
|
||||
23
README.md
23
README.md
|
|
@ -10,7 +10,7 @@ This is the ircDDB Gateway. It allows a D-Star Repeater to interface into callsi
|
|||
* XLX reflectors.
|
||||
* CCS7 routing.
|
||||
* D-RATS data transfers.
|
||||
* Gateway DPRS data to aprs.fi.
|
||||
* Gateway DPRS data to APRS-IS.
|
||||
* Full multi lingual text and voice announcements.
|
||||
* DTMF or UR call control.
|
||||
* 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.
|
||||
|
||||
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
|
||||
```
|
||||
|
|
|
|||
|
|
@ -1,17 +1,24 @@
|
|||
OBJECTS = RemoteControlAppD.o RemoteControlCallsignData.o RemoteControlConfig.o RemoteControlLinkData.o RemoteControlRemoteControlHandler.o \
|
||||
RemoteControlRepeaterData.o RemoteControlStarNetGroup.o RemoteControlStarNetUser.o
|
||||
|
||||
.PHONY: all
|
||||
all: remotecontrold
|
||||
|
||||
remotecontrold: $(OBJECTS)
|
||||
remotecontrold: $(OBJECTS) ../Common/Common.a
|
||||
$(CXX) $(OBJECTS) ../Common/Common.a $(LDFLAGS) $(LIBS) -o remotecontrold
|
||||
|
||||
-include $(OBJECTS:.o=.d)
|
||||
|
||||
%.o: %.cpp
|
||||
$(CXX) -DwxUSE_GUI=0 $(CFLAGS) -I../Common -c -o $@ $<
|
||||
$(CXX) -MM -DwxUSE_GUI=0 $(CFLAGS) -I../Common $< > $*.d
|
||||
|
||||
.PHONY: install
|
||||
install:
|
||||
install -g bin -o root -m 0775 remotecontrold $(BINDIR)
|
||||
install -g root -o root -m 0755 remotecontrold $(DESTDIR)$(BINDIR)
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
$(RM) remotecontrold *.o *.d *.bak *~
|
||||
|
||||
../Common/Common.a:
|
||||
|
|
|
|||
26
RemoteControl/MakefileGUI
Normal file
26
RemoteControl/MakefileGUI
Normal 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:
|
||||
|
|
@ -22,29 +22,29 @@
|
|||
<ProjectGuid>{F7756875-1F58-4006-AD55-5C963AB682C0}</ProjectGuid>
|
||||
<RootNamespace>RemoteControl</RootNamespace>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
|
|
@ -80,9 +80,11 @@
|
|||
<OutDir>$(SolutionDir)$(Configuration)\</OutDir>
|
||||
<IntDir>$(Configuration)\</IntDir>
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<IncludePath>$(WXWIN)\include;$(WXWIN)\lib\vc_dll\mswu;$(IncludePath)</IncludePath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<IncludePath>$(WXWIN)\include;$(WXWIN)\lib\vc_x64_dll\mswu;$(IncludePath)</IncludePath>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
|
|
|
|||
|
|
@ -1,16 +1,24 @@
|
|||
OBJECTS = StarNetServerAppD.o StarNetServerConfig.o StarNetServerThread.o StarNetServerThreadHelper.o
|
||||
|
||||
.PHONY: all
|
||||
all: starnetserverd
|
||||
|
||||
starnetserverd: $(OBJECTS)
|
||||
starnetserverd: $(OBJECTS) ../Common/Common.a ../ircDDB/IRCDDB.a
|
||||
$(CXX) $(OBJECTS) ../Common/Common.a ../ircDDB/IRCDDB.a $(LDFLAGS) $(LIBS) -o starnetserverd
|
||||
|
||||
-include $(OBJECTS:.o=.d)
|
||||
|
||||
%.o: %.cpp
|
||||
$(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 -g bin -o root -m 0775 starnetserverd $(BINDIR)
|
||||
install -g root -o root -m 0755 starnetserverd $(DESTDIR)$(BINDIR)
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
$(RM) starnetserverd *.o *.d *.bak *~
|
||||
|
||||
../Common/Common.a:
|
||||
../ircDDB/IRCDDB.a:
|
||||
|
|
|
|||
26
StarNetServer/MakefileGUI
Normal file
26
StarNetServer/MakefileGUI
Normal 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:
|
||||
|
|
@ -22,29 +22,29 @@
|
|||
<ProjectGuid>{4E9989C8-80D4-4F6E-BCA1-754DCED3AF5F}</ProjectGuid>
|
||||
<RootNamespace>StarNetServer</RootNamespace>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
|
|
@ -80,9 +80,11 @@
|
|||
<OutDir>$(SolutionDir)$(Configuration)\</OutDir>
|
||||
<IntDir>$(Configuration)\</IntDir>
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<IncludePath>$(WXWIN)\include;$(WXWIN)\lib\vc_dll\mswu;$(IncludePath)</IncludePath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<IncludePath>$(WXWIN)\include;$(WXWIN)\lib\vc_x64_dll\mswu;$(IncludePath)</IncludePath>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
|
|
|
|||
|
|
@ -1,16 +1,23 @@
|
|||
OBJECTS = TextTransmit.o
|
||||
|
||||
.PHONY: all
|
||||
all: texttransmitd
|
||||
|
||||
texttransmitd: $(OBJECTS)
|
||||
texttransmitd: $(OBJECTS) ../Common/Common.a
|
||||
$(CXX) $(OBJECTS) ../Common/Common.a $(LDFLAGS) $(LIBS) -o texttransmitd
|
||||
|
||||
-include $(OBJECTS:.o=.d)
|
||||
|
||||
%.o: %.cpp
|
||||
$(CXX) -DwxUSE_GUI=0 $(CFLAGS) -I../Common -c -o $@ $<
|
||||
$(CXX) -MM -DwxUSE_GUI=0 $(CFLAGS) -I../Common $< > $*.d
|
||||
|
||||
.PHONY: install
|
||||
install:
|
||||
install -g bin -o root -m 0775 texttransmitd $(BINDIR)
|
||||
install -g root -o root -m 0755 texttransmitd $(DESTDIR)$(BINDIR)
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
$(RM) texttransmitd *.o *.d *.bak *~
|
||||
|
||||
../Common/Common.a:
|
||||
|
|
|
|||
|
|
@ -22,29 +22,29 @@
|
|||
<ProjectGuid>{AFB9BCE5-0D37-4707-93A1-DA14E39F2773}</ProjectGuid>
|
||||
<RootNamespace>TextTransmit</RootNamespace>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
|
|
@ -80,9 +80,11 @@
|
|||
<OutDir>$(SolutionDir)$(Configuration)\</OutDir>
|
||||
<IntDir>$(Configuration)\</IntDir>
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<IncludePath>$(WXWIN)\include;$(WXWIN)\lib\vc_dll\mswu;$(IncludePath)</IncludePath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<IncludePath>$(WXWIN)\include;$(WXWIN)\lib\vc_x64_dll\mswu;$(IncludePath)</IncludePath>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
|
|
|
|||
|
|
@ -1,16 +1,23 @@
|
|||
OBJECTS = TimeServerD.o TimeServerConfig.o TimeServerThread.o TimeServerThreadHelper.o
|
||||
|
||||
.PHONY: all
|
||||
all: timeserverd
|
||||
|
||||
timeserverd: $(OBJECTS)
|
||||
timeserverd: $(OBJECTS) ../Common/Common.a
|
||||
$(CXX) $(OBJECTS) ../Common/Common.a $(LDFLAGS) $(LIBS) -o timeserverd
|
||||
|
||||
-include $(OBJECTS:.o=.d)
|
||||
|
||||
%.o: %.cpp
|
||||
$(CXX) -DwxUSE_GUI=0 $(CFLAGS) -I../Common -c -o $@ $<
|
||||
$(CXX) -MM -DwxUSE_GUI=0 $(CFLAGS) -I../Common $< > $*.d
|
||||
|
||||
.PHONY: install
|
||||
install:
|
||||
install -g bin -o root -m 0775 timeserverd $(BINDIR)
|
||||
install -g root -o root -m 0755 timeserverd $(DESTDIR)$(BINDIR)
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
$(RM) timeserverd *.o *.d *.bak *~
|
||||
|
||||
../Common/Common.a:
|
||||
|
|
|
|||
25
TimeServer/MakefileGUI
Normal file
25
TimeServer/MakefileGUI
Normal 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:
|
||||
|
|
@ -22,29 +22,29 @@
|
|||
<ProjectGuid>{99F336A5-6E33-4919-BF75-D6D8BA26345E}</ProjectGuid>
|
||||
<RootNamespace>TimeServer</RootNamespace>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
|
|
@ -80,9 +80,11 @@
|
|||
<OutDir>$(SolutionDir)$(Configuration)\</OutDir>
|
||||
<IntDir>$(Configuration)\</IntDir>
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<IncludePath>$(WXWIN)\include;$(WXWIN)\lib\vc_dll\mswu;$(IncludePath)</IncludePath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<IncludePath>$(WXWIN)\include;$(WXWIN)\lib\vc_x64_dll\mswu;$(IncludePath)</IncludePath>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
|
|
|
|||
|
|
@ -1,17 +1,25 @@
|
|||
OBJECTS = TimerControlAppD.o TimerControlConfig.o TimerControlItemFile.o TimerControlRemoteControlHandler.o TimerControlThread.o \
|
||||
TimerControlThreadHelper.o
|
||||
|
||||
.PHONY: all
|
||||
all: timercontrold
|
||||
|
||||
timercontrold: $(OBJECTS)
|
||||
timercontrold: $(OBJECTS) ../Common/Common.a
|
||||
$(CXX) $(OBJECTS) ../Common/Common.a $(LDFLAGS) $(LIBS) -o timercontrold
|
||||
|
||||
-include $(OBJECTS:.o=.d)
|
||||
|
||||
%.o: %.cpp
|
||||
$(CXX) -DwxUSE_GUI=0 $(CFLAGS) -I../Common -c -o $@ $<
|
||||
$(CXX) -MM -DwxUSE_GUI=0 $(CFLAGS) -I../Common $< > $*.d
|
||||
|
||||
.PHONY: install
|
||||
install:
|
||||
install -g bin -o root -m 0775 timercontrold $(BINDIR)
|
||||
install -g root -o root -m 0755 timercontrold $(DESTDIR)$(BINDIR)
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
$(RM) timercontrold *.o *.d *.bak *~
|
||||
|
||||
../Common/Common.a:
|
||||
|
||||
|
|
|
|||
26
TimerControl/MakefileGUI
Normal file
26
TimerControl/MakefileGUI
Normal 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:
|
||||
|
|
@ -22,29 +22,29 @@
|
|||
<ProjectGuid>{68CFAB6D-AED3-4B8A-BCB3-EE4136CA00A3}</ProjectGuid>
|
||||
<RootNamespace>TimerControl</RootNamespace>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
|
|
@ -80,9 +80,11 @@
|
|||
<OutDir>$(SolutionDir)$(Configuration)\</OutDir>
|
||||
<IntDir>$(Configuration)\</IntDir>
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<IncludePath>$(WXWIN)\include;$(WXWIN)\lib\vc_dll\mswu;$(IncludePath)</IncludePath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<IncludePath>$(WXWIN)\include;$(WXWIN)\lib\vc_x64_dll\mswu;$(IncludePath)</IncludePath>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
|
|
|
|||
|
|
@ -1,16 +1,23 @@
|
|||
OBJECTS = VoiceStore.o VoiceTransmit.o
|
||||
|
||||
.PHONY: all
|
||||
all: voicetransmitd
|
||||
|
||||
voicetransmitd: $(OBJECTS)
|
||||
voicetransmitd: $(OBJECTS) ../Common/Common.a
|
||||
$(CXX) $(OBJECTS) ../Common/Common.a $(LDFLAGS) $(LIBS) -o voicetransmitd
|
||||
|
||||
-include $(OBJECTS:.o=.d)
|
||||
|
||||
%.o: %.cpp
|
||||
$(CXX) -DwxUSE_GUI=0 $(CFLAGS) -I../Common -c -o $@ $<
|
||||
$(CXX) -MM -DwxUSE_GUI=0 $(CFLAGS) -I../Common $< > $*.d
|
||||
|
||||
.PHONY: install
|
||||
install:
|
||||
install -g bin -o root -m 0775 voicetransmitd $(BINDIR)
|
||||
install -g root -o root -m 0755 voicetransmitd $(DESTDIR)$(BINDIR)
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
$(RM) voicetransmitd *.o *.d *.bak *~
|
||||
|
||||
../Common/Common.a:
|
||||
|
|
|
|||
|
|
@ -22,29 +22,29 @@
|
|||
<ProjectGuid>{27D44C4F-6849-4E15-A5BB-0B54BA296D98}</ProjectGuid>
|
||||
<RootNamespace>VoiceTransmit</RootNamespace>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
|
|
@ -80,9 +80,11 @@
|
|||
<OutDir>$(SolutionDir)$(Configuration)\</OutDir>
|
||||
<IntDir>$(Configuration)\</IntDir>
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<IncludePath>$(WXWIN)\include;$(WXWIN)\lib\vc_dll\mswu;$(IncludePath)</IncludePath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<IncludePath>$(WXWIN)\include;$(WXWIN)\lib\vc_x64_dll\mswu;$(IncludePath)</IncludePath>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
|
|
|
|||
|
|
@ -1,14 +1,19 @@
|
|||
OBJECTS = IRCClient.o IRCDDBApp.o IRCDDBClient.o IRCDDB.o IRCDDBMultiClient.o IRCMessage.o IRCMessageQueue.o IRCProtocol.o IRCReceiver.o \
|
||||
IRCutils.o
|
||||
|
||||
.PHONY: all
|
||||
all: IRCDDB.a
|
||||
|
||||
IRCDDB.a: $(OBJECTS)
|
||||
$(AR) rcs IRCDDB.a $(OBJECTS)
|
||||
|
||||
-include $(OBJECTS:.o=.d)
|
||||
|
||||
%.o: %.cpp
|
||||
$(CXX) -DwxUSE_GUI=0 $(CFLAGS) -c -o $@ $<
|
||||
$(CXX) -MM -DwxUSE_GUI=0 $(CFLAGS) $< > $*.d
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
$(RM) IRCDDB.a *.o *.d *.bak *~
|
||||
|
||||
|
|
|
|||
|
|
@ -22,29 +22,29 @@
|
|||
<ProjectGuid>{276BC54D-5581-4A0C-AFD5-A5BDC947F0AD}</ProjectGuid>
|
||||
<RootNamespace>ircDDB</RootNamespace>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
|
|
@ -77,6 +77,10 @@
|
|||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<OutDir>$(SolutionDir)$(Configuration)\</OutDir>
|
||||
<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>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
|
|
|
|||
|
|
@ -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
|
||||
* 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* NOLOGGING_SWITCH = wxT("nolog");
|
||||
const wxChar* DEBUG_SWITCH = wxT("debug");
|
||||
const wxChar* GUI_SWITCH = wxT("gui");
|
||||
const wxChar* LOGDIR_OPTION = wxT("logdir");
|
||||
const wxChar* CONFDIR_OPTION = wxT("confdir");
|
||||
|
|
@ -50,6 +51,7 @@ CIRCDDBGatewayApp::CIRCDDBGatewayApp() :
|
|||
wxApp(),
|
||||
m_name(),
|
||||
m_nolog(false),
|
||||
m_debug(false),
|
||||
m_gui(false),
|
||||
m_logDir(),
|
||||
m_confDir(),
|
||||
|
|
@ -89,6 +91,14 @@ bool CIRCDDBGatewayApp::OnInit()
|
|||
|
||||
wxLog* log = new CLogger(m_logDir, logBaseName);
|
||||
wxLog::SetActiveTarget(log);
|
||||
|
||||
if (m_debug) {
|
||||
wxLog::SetVerbose(true);
|
||||
wxLog::SetLogLevel(wxLOG_Debug);
|
||||
} else {
|
||||
wxLog::SetVerbose(false);
|
||||
wxLog::SetLogLevel(wxLOG_Message);
|
||||
}
|
||||
} else {
|
||||
new wxLogNull;
|
||||
}
|
||||
|
|
@ -161,8 +171,10 @@ int CIRCDDBGatewayApp::OnExit()
|
|||
|
||||
wxLogInfo(APPLICATION_NAME + wxT(" is exiting"));
|
||||
|
||||
//m_thread->kill();
|
||||
wxGetApp().GetTopWindow()->Close();
|
||||
m_thread->kill();
|
||||
wxWindow * topWin = wxGetApp().GetTopWindow();
|
||||
if (topWin != NULL)
|
||||
topWin->Close();
|
||||
|
||||
delete m_config;
|
||||
|
||||
|
|
@ -174,6 +186,7 @@ int CIRCDDBGatewayApp::OnExit()
|
|||
void CIRCDDBGatewayApp::OnInitCmdLine(wxCmdLineParser& parser)
|
||||
{
|
||||
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.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);
|
||||
|
|
@ -188,6 +201,7 @@ bool CIRCDDBGatewayApp::OnCmdLineParsed(wxCmdLineParser& parser)
|
|||
return false;
|
||||
|
||||
m_nolog = parser.Found(NOLOGGING_SWITCH);
|
||||
m_debug = parser.Found(DEBUG_SWITCH);
|
||||
m_gui = parser.Found(GUI_SWITCH);
|
||||
|
||||
wxString logDir;
|
||||
|
|
@ -254,15 +268,15 @@ void CIRCDDBGatewayApp::createThread()
|
|||
|
||||
thread->setGateway(gatewayType, gatewayCallsign, gatewayAddress);
|
||||
|
||||
wxString aprsHostname;
|
||||
wxString aprsAddress;
|
||||
unsigned int aprsPort;
|
||||
bool aprsEnabled;
|
||||
m_config->getDPRS(aprsEnabled, aprsHostname, aprsPort);
|
||||
wxLogInfo(wxT("APRS enabled: %d, host: %s:%u"), int(aprsEnabled), aprsHostname.c_str(), aprsPort);
|
||||
m_config->getDPRS(aprsEnabled, aprsAddress, aprsPort);
|
||||
wxLogInfo(wxT("APRS enabled: %d, host: %s:%u"), int(aprsEnabled), aprsAddress.c_str(), aprsPort);
|
||||
|
||||
CAPRSWriter* aprs = NULL;
|
||||
if (aprsEnabled && !gatewayCallsign.IsEmpty() && !aprsHostname.IsEmpty() && aprsPort != 0U) {
|
||||
aprs = new CAPRSWriter(aprsHostname, aprsPort, gatewayCallsign, gatewayAddress);
|
||||
if (aprsEnabled && !aprsAddress.IsEmpty() && aprsPort != 0U) {
|
||||
aprs = new CAPRSWriter(aprsAddress, aprsPort, gatewayCallsign);
|
||||
|
||||
bool res = aprs->open();
|
||||
if (!res)
|
||||
|
|
@ -276,6 +290,11 @@ void CIRCDDBGatewayApp::createThread()
|
|||
m_config->getMiscellaneous(language, infoEnabled, echoEnabled, logEnabled, dratsEnabled, dtmfEnabled);
|
||||
wxLogInfo(wxT("Language: %d, info enabled: %d, echo enabled: %d, log enabled : %d, D-RATS enabled: %d, DTMF control enabled: %d"), int(language), int(infoEnabled), int(echoEnabled), int(logEnabled), int(dratsEnabled), int(dtmfEnabled));
|
||||
|
||||
bool 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;
|
||||
CHBRepeaterProtocolHandler* hbRepeaterHandler = NULL;
|
||||
CDummyRepeaterProtocolHandler* dummyRepeaterHandler = NULL;
|
||||
|
|
@ -351,15 +370,23 @@ void CIRCDDBGatewayApp::createThread()
|
|||
wxLogInfo(wxT("Repeater 1 bands: %u %u %u"), band11, band12, band13);
|
||||
thread->addRepeater(callsign1, repeaterBand1, repeaterAddress1, repeaterPort1, repeaterType1, reflector1, atStartup1, reconnect1, dratsEnabled, frequency1, offset1, range1, latitude1, longitude1, agl1, description11, description12, url1, icomRepeaterHandler, band11, band12, band13);
|
||||
|
||||
if (aprs != NULL)
|
||||
aprs->setPort(callsign1, repeaterBand1, frequency1, offset1, range1, latitude1, longitude1, agl1);
|
||||
if (aprs != NULL) {
|
||||
if (gpsdEnabled)
|
||||
aprs->setPortGPSD(callsign1, repeaterBand1, frequency1, offset1, range1, gpsdAddress, gpsdPort);
|
||||
else
|
||||
aprs->setPortFixed(callsign1, repeaterBand1, frequency1, offset1, range1, latitude1, longitude1, agl1);
|
||||
}
|
||||
|
||||
icomCount++;
|
||||
} else if (repeaterType1 == HW_HOMEBREW && hbRepeaterHandler != NULL) {
|
||||
thread->addRepeater(callsign1, repeaterBand1, repeaterAddress1, repeaterPort1, repeaterType1, reflector1, atStartup1, reconnect1, dratsEnabled, frequency1, offset1, range1, latitude1, longitude1, agl1, description11, description12, url1, hbRepeaterHandler);
|
||||
|
||||
if (aprs != NULL)
|
||||
aprs->setPort(callsign1, repeaterBand1, frequency1, offset1, range1, latitude1, longitude1, agl1);
|
||||
if (aprs != NULL) {
|
||||
if (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) {
|
||||
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);
|
||||
thread->addRepeater(callsign2, repeaterBand2, repeaterAddress2, repeaterPort2, repeaterType2, reflector2, atStartup2, reconnect2, dratsEnabled, frequency2, offset2, range2, latitude2, longitude2, agl2, description21, description22, url2, icomRepeaterHandler, band21, band22, band23);
|
||||
|
||||
if (aprs != NULL)
|
||||
aprs->setPort(callsign2, repeaterBand2, frequency2, offset2, range2, latitude2, longitude2, agl2);
|
||||
if (aprs != NULL) {
|
||||
if (gpsdEnabled)
|
||||
aprs->setPortGPSD(callsign2, repeaterBand2, frequency2, offset2, range2, gpsdAddress, gpsdPort);
|
||||
else
|
||||
aprs->setPortFixed(callsign2, repeaterBand2, frequency2, offset2, range2, latitude2, longitude2, agl2);
|
||||
}
|
||||
|
||||
icomCount++;
|
||||
} else if (repeaterType2 == HW_HOMEBREW && hbRepeaterHandler != NULL) {
|
||||
thread->addRepeater(callsign2, repeaterBand2, repeaterAddress2, repeaterPort2, repeaterType2, reflector2, atStartup2, reconnect2, dratsEnabled, frequency2, offset2, range2, latitude2, longitude2, agl2, description21, description22, url2, hbRepeaterHandler);
|
||||
|
||||
if (aprs != NULL)
|
||||
aprs->setPort(callsign2, repeaterBand2, frequency2, offset2, range2, latitude2, longitude2, agl2);
|
||||
if (aprs != NULL) {
|
||||
if (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) {
|
||||
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);
|
||||
thread->addRepeater(callsign3, repeaterBand3, repeaterAddress3, repeaterPort3, repeaterType3, reflector3, atStartup3, reconnect3, dratsEnabled, frequency3, offset3, range3, latitude3, longitude3, agl3, description31, description32, url3, icomRepeaterHandler, band31, band32, band33);
|
||||
|
||||
if (aprs != NULL)
|
||||
aprs->setPort(callsign3, repeaterBand3, frequency3, offset3, range3, latitude3, longitude3, agl3);
|
||||
if (aprs != NULL) {
|
||||
if (gpsdEnabled)
|
||||
aprs->setPortGPSD(callsign3, repeaterBand3, frequency3, offset3, range3, gpsdAddress, gpsdPort);
|
||||
else
|
||||
aprs->setPortFixed(callsign3, repeaterBand3, frequency3, offset3, range3, latitude3, longitude3, agl3);
|
||||
}
|
||||
|
||||
icomCount++;
|
||||
} else if (repeaterType3 == HW_HOMEBREW && hbRepeaterHandler != NULL) {
|
||||
thread->addRepeater(callsign3, repeaterBand3, repeaterAddress3, repeaterPort3, repeaterType3, reflector3, atStartup3, reconnect3, dratsEnabled, frequency3, offset3, range3, latitude3, longitude3, agl3, description31, description32, url3, hbRepeaterHandler);
|
||||
|
||||
if (aprs != NULL)
|
||||
aprs->setPort(callsign3, repeaterBand3, frequency3, offset3, range3, latitude3, longitude3, agl3);
|
||||
if (aprs != NULL) {
|
||||
if (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) {
|
||||
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);
|
||||
thread->addRepeater(callsign4, repeaterBand4, repeaterAddress4, repeaterPort4, repeaterType4, reflector4, atStartup4, reconnect4, dratsEnabled, frequency4, offset4, range4, latitude4, longitude4, agl4, description41, description42, url4, icomRepeaterHandler, band41, band42, band43);
|
||||
|
||||
if (aprs != NULL)
|
||||
aprs->setPort(callsign4, repeaterBand4, frequency4, offset4, range4, latitude4, longitude4, agl4);
|
||||
if (aprs != NULL) {
|
||||
if (gpsdEnabled)
|
||||
aprs->setPortGPSD(callsign4, repeaterBand4, frequency4, offset4, range4, gpsdAddress, gpsdPort);
|
||||
else
|
||||
aprs->setPortFixed(callsign4, repeaterBand4, frequency4, offset4, range4, latitude4, longitude4, agl4);
|
||||
}
|
||||
|
||||
icomCount++;
|
||||
} else if (repeaterType4 == HW_HOMEBREW && hbRepeaterHandler != NULL) {
|
||||
thread->addRepeater(callsign4, repeaterBand4, repeaterAddress4, repeaterPort4, repeaterType4, reflector4, atStartup4, reconnect4, dratsEnabled, frequency4, offset4, range4, latitude4, longitude4, agl4, description41, description42, url4, hbRepeaterHandler);
|
||||
|
||||
if (aprs != NULL)
|
||||
aprs->setPort(callsign4, repeaterBand4, frequency4, offset4, range4, latitude4, longitude4, agl4);
|
||||
if (aprs != NULL) {
|
||||
if (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) {
|
||||
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 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());
|
||||
|
||||
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());
|
||||
|
||||
bool xlxEnabled;
|
||||
bool xlxOverrideLocal;
|
||||
wxString xlxHostsFileUrl;
|
||||
m_config->getXLX(xlxEnabled, xlxOverrideLocal, xlxHostsFileUrl);
|
||||
wxLogInfo(wxT("XLX enabled: %d, Override Local %d, Hosts file url: %s"), int(xlxEnabled), int(xlxOverrideLocal), xlxHostsFileUrl.c_str());
|
||||
m_config->getXLX(xlxEnabled, xlxHostsFileUrl);
|
||||
wxLogInfo(wxT("XLX enabled: %d, Hosts file url: %s"), int(xlxEnabled), xlxHostsFileUrl.c_str());
|
||||
|
||||
if (repeaterBand1.Len() > 1U || repeaterBand2.Len() > 1U ||
|
||||
repeaterBand3.Len() > 1U || repeaterBand4.Len() > 1U) {
|
||||
|
|
@ -910,7 +960,7 @@ void CIRCDDBGatewayApp::createThread()
|
|||
thread->setDExtra(dextraEnabled, dextraMaxDongles);
|
||||
thread->setDCS(dcsEnabled);
|
||||
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->setEchoEnabled(echoEnabled);
|
||||
thread->setDTMFEnabled(dtmfEnabled);
|
||||
|
|
|
|||
|
|
@ -54,6 +54,7 @@ public:
|
|||
private:
|
||||
wxString m_name;
|
||||
bool m_nolog;
|
||||
bool m_debug;
|
||||
bool m_gui;
|
||||
wxString m_logDir;
|
||||
wxString m_confDir;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -26,6 +26,7 @@
|
|||
#include "APRSWriter.h"
|
||||
#include "Version.h"
|
||||
#include "Logger.h"
|
||||
#include "ConsoleLogger.h"
|
||||
#include "IRCDDB.h"
|
||||
#include "IRCDDBClient.h"
|
||||
#include "IRCDDBMultiClient.h"
|
||||
|
|
@ -44,11 +45,13 @@
|
|||
|
||||
const wxChar* NAME_PARAM = wxT("Gateway Name");
|
||||
const wxChar* NOLOGGING_SWITCH = wxT("nolog");
|
||||
const wxChar* DEBUG_SWITCH = wxT("debug");
|
||||
const wxChar* LOGDIR_OPTION = wxT("logdir");
|
||||
const wxChar* CONFDIR_OPTION = wxT("confdir");
|
||||
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;
|
||||
|
||||
|
|
@ -67,7 +70,9 @@ int main(int argc, char** argv)
|
|||
|
||||
wxCmdLineParser parser(argc, argv);
|
||||
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(FGROUND_SWITCH, wxEmptyString, wxEmptyString, 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.AddParam(NAME_PARAM, wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL);
|
||||
|
|
@ -78,8 +83,10 @@ int main(int argc, char** argv)
|
|||
return 0;
|
||||
}
|
||||
|
||||
bool nolog = parser.Found(NOLOGGING_SWITCH);
|
||||
bool daemon = parser.Found(DAEMON_SWITCH);
|
||||
bool nolog = parser.Found(NOLOGGING_SWITCH);
|
||||
bool debug = parser.Found(DEBUG_SWITCH);
|
||||
bool daemon = parser.Found(DAEMON_SWITCH);
|
||||
bool foreground = parser.Found(FGROUND_SWITCH);
|
||||
|
||||
wxString logDir;
|
||||
bool found = parser.Found(LOGDIR_OPTION, &logDir);
|
||||
|
|
@ -95,6 +102,12 @@ int main(int argc, char** argv)
|
|||
if (parser.GetParamCount() > 0U)
|
||||
name = parser.GetParam(0U);
|
||||
|
||||
if (daemon && foreground) {
|
||||
::fprintf(stderr, "ircddbgatewayd: -daemon and -foreground are mutually exclusive, exiting\n");
|
||||
::wxUninitialize();
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (daemon) {
|
||||
pid_t pid = ::fork();
|
||||
|
||||
|
|
@ -135,7 +148,7 @@ int main(int argc, char** argv)
|
|||
::fclose(fp);
|
||||
}
|
||||
|
||||
m_gateway = new CIRCDDBGatewayAppD(nolog, logDir, confDir, name);
|
||||
m_gateway = new CIRCDDBGatewayAppD(nolog, debug, foreground, logDir, confDir, name);
|
||||
if (!m_gateway->init()) {
|
||||
::wxUninitialize();
|
||||
return 1;
|
||||
|
|
@ -154,9 +167,11 @@ int main(int argc, char** argv)
|
|||
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_nolog(nolog),
|
||||
m_debug(debug),
|
||||
m_foreground(foreground),
|
||||
m_logDir(logDir),
|
||||
m_confDir(confDir),
|
||||
m_thread(NULL),
|
||||
|
|
@ -170,7 +185,9 @@ CIRCDDBGatewayAppD::~CIRCDDBGatewayAppD()
|
|||
|
||||
bool CIRCDDBGatewayAppD::init()
|
||||
{
|
||||
if (!m_nolog) {
|
||||
if (m_foreground) {
|
||||
initLogging(new CConsoleLogger());
|
||||
} else if (!m_nolog) {
|
||||
wxString logBaseName = LOG_BASE_NAME;
|
||||
if (!m_name.IsEmpty()) {
|
||||
logBaseName.Append(wxT("_"));
|
||||
|
|
@ -180,8 +197,7 @@ bool CIRCDDBGatewayAppD::init()
|
|||
if (m_logDir.IsEmpty())
|
||||
m_logDir = wxT(LOG_DIR);
|
||||
|
||||
wxLog* log = new CLogger(m_logDir, logBaseName);
|
||||
wxLog::SetActiveTarget(log);
|
||||
initLogging(new CLogger(m_logDir, logBaseName));
|
||||
} else {
|
||||
new wxLogNull;
|
||||
}
|
||||
|
|
@ -200,14 +216,31 @@ bool CIRCDDBGatewayAppD::init()
|
|||
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
|
||||
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();
|
||||
}
|
||||
|
||||
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()
|
||||
{
|
||||
m_thread->run();
|
||||
|
|
@ -242,15 +275,15 @@ bool CIRCDDBGatewayAppD::createThread()
|
|||
|
||||
m_thread->setGateway(gatewayType, gatewayCallsign, gatewayAddress);
|
||||
|
||||
wxString aprsHostname;
|
||||
wxString aprsAddress;
|
||||
unsigned int aprsPort;
|
||||
bool aprsEnabled;
|
||||
config.getDPRS(aprsEnabled, aprsHostname, aprsPort);
|
||||
wxLogInfo(wxT("APRS enabled: %d, host: %s:%u"), int(aprsEnabled), aprsHostname.c_str(), aprsPort);
|
||||
config.getDPRS(aprsEnabled, aprsAddress, aprsPort);
|
||||
wxLogInfo(wxT("APRS enabled: %d, host: %s:%u"), int(aprsEnabled), aprsAddress.c_str(), aprsPort);
|
||||
|
||||
CAPRSWriter* aprs = NULL;
|
||||
if (aprsEnabled && !gatewayCallsign.IsEmpty() && !aprsHostname.IsEmpty() && aprsPort != 0U) {
|
||||
aprs = new CAPRSWriter(aprsHostname, aprsPort, gatewayCallsign, gatewayAddress);
|
||||
if (aprsEnabled && !aprsAddress.IsEmpty() && aprsPort != 0U) {
|
||||
aprs = new CAPRSWriter(aprsAddress, aprsPort, gatewayCallsign);
|
||||
|
||||
bool res = aprs->open();
|
||||
if (!res)
|
||||
|
|
@ -264,6 +297,11 @@ bool CIRCDDBGatewayAppD::createThread()
|
|||
config.getMiscellaneous(language, infoEnabled, echoEnabled, logEnabled, dratsEnabled, dtmfEnabled);
|
||||
wxLogInfo(wxT("Language: %d, info enabled: %d, echo enabled: %d, log enabled : %d, D-RATS enabled: %d, DTMF control enabled: %d"), int(language), int(infoEnabled), int(echoEnabled), int(logEnabled), int(dratsEnabled), int(dtmfEnabled));
|
||||
|
||||
bool 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;
|
||||
CHBRepeaterProtocolHandler* hbRepeaterHandler = NULL;
|
||||
CDummyRepeaterProtocolHandler* dummyRepeaterHandler = NULL;
|
||||
|
|
@ -339,15 +377,23 @@ bool CIRCDDBGatewayAppD::createThread()
|
|||
wxLogInfo(wxT("Repeater 1 bands: %u %u %u"), band11, band12, band13);
|
||||
m_thread->addRepeater(callsign1, repeaterBand1, repeaterAddress1, repeaterPort1, repeaterType1, reflector1, atStartup1, reconnect1, dratsEnabled, frequency1, offset1, range1, latitude1, longitude1, agl1, description11, description12, url1, icomRepeaterHandler, band11, band12, band13);
|
||||
|
||||
if (aprs != NULL)
|
||||
aprs->setPort(callsign1, repeaterBand1, frequency1, offset1, range1, latitude1, longitude1, agl1);
|
||||
if (aprs != NULL) {
|
||||
if (gpsdEnabled)
|
||||
aprs->setPortGPSD(callsign1, repeaterBand1, frequency1, offset1, range1, gpsdAddress, gpsdPort);
|
||||
else
|
||||
aprs->setPortFixed(callsign1, repeaterBand1, frequency1, offset1, range1, latitude1, longitude1, agl1);
|
||||
}
|
||||
|
||||
icomCount++;
|
||||
} else if (repeaterType1 == HW_HOMEBREW && hbRepeaterHandler != NULL) {
|
||||
m_thread->addRepeater(callsign1, repeaterBand1, repeaterAddress1, repeaterPort1, repeaterType1, reflector1, atStartup1, reconnect1, dratsEnabled, frequency1, offset1, range1, latitude1, longitude1, agl1, description11, description12, url1, hbRepeaterHandler);
|
||||
|
||||
if (aprs != NULL)
|
||||
aprs->setPort(callsign1, repeaterBand1, frequency1, offset1, range1, latitude1, longitude1, agl1);
|
||||
if (aprs != NULL) {
|
||||
if (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) {
|
||||
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);
|
||||
m_thread->addRepeater(callsign2, repeaterBand2, repeaterAddress2, repeaterPort2, repeaterType2, reflector2, atStartup2, reconnect2, dratsEnabled, frequency2, offset2, range2, latitude2, longitude2, agl2, description21, description22, url2, icomRepeaterHandler, band21, band22, band23);
|
||||
|
||||
if (aprs != NULL)
|
||||
aprs->setPort(callsign2, repeaterBand2, frequency2, offset2, range2, latitude2, longitude2, agl2);
|
||||
if (aprs != NULL) {
|
||||
if (gpsdEnabled)
|
||||
aprs->setPortGPSD(callsign2, repeaterBand2, frequency2, offset2, range2, gpsdAddress, gpsdPort);
|
||||
else
|
||||
aprs->setPortFixed(callsign2, repeaterBand2, frequency2, offset2, range2, latitude2, longitude2, agl2);
|
||||
}
|
||||
|
||||
icomCount++;
|
||||
} else if (repeaterType2 == HW_HOMEBREW && hbRepeaterHandler != NULL) {
|
||||
m_thread->addRepeater(callsign2, repeaterBand2, repeaterAddress2, repeaterPort2, repeaterType2, reflector2, atStartup2, reconnect2, dratsEnabled, frequency2, offset2, range2, latitude2, longitude2, agl2, description21, description22, url2, hbRepeaterHandler);
|
||||
|
||||
if (aprs != NULL)
|
||||
aprs->setPort(callsign2, repeaterBand2, frequency2, offset2, range2, latitude2, longitude2, agl2);
|
||||
if (aprs != NULL) {
|
||||
if (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) {
|
||||
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);
|
||||
m_thread->addRepeater(callsign3, repeaterBand3, repeaterAddress3, repeaterPort3, repeaterType3, reflector3, atStartup3, reconnect3, dratsEnabled, frequency3, offset3, range3, latitude3, longitude3, agl3, description31, description32, url3, icomRepeaterHandler, band31, band32, band33);
|
||||
|
||||
if (aprs != NULL)
|
||||
aprs->setPort(callsign3, repeaterBand3, frequency3, offset3, range3, latitude3, longitude3, agl3);
|
||||
if (aprs != NULL) {
|
||||
if (gpsdEnabled)
|
||||
aprs->setPortGPSD(callsign3, repeaterBand3, frequency3, offset3, range3, gpsdAddress, gpsdPort);
|
||||
else
|
||||
aprs->setPortFixed(callsign3, repeaterBand3, frequency3, offset3, range3, latitude3, longitude3, agl3);
|
||||
}
|
||||
|
||||
icomCount++;
|
||||
} else if (repeaterType3 == HW_HOMEBREW && hbRepeaterHandler != NULL) {
|
||||
m_thread->addRepeater(callsign3, repeaterBand3, repeaterAddress3, repeaterPort3, repeaterType3, reflector3, atStartup3, reconnect3, dratsEnabled, frequency3, offset3, range3, latitude3, longitude3, agl3, description31, description32, url3, hbRepeaterHandler);
|
||||
|
||||
if (aprs != NULL)
|
||||
aprs->setPort(callsign3, repeaterBand3, frequency3, offset3, range3, latitude3, longitude3, agl3);
|
||||
if (aprs != NULL) {
|
||||
if (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) {
|
||||
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);
|
||||
m_thread->addRepeater(callsign4, repeaterBand4, repeaterAddress4, repeaterPort4, repeaterType4, reflector4, atStartup4, reconnect4, dratsEnabled, frequency4, offset4, range4, latitude4, longitude4, agl4, description41, description42, url4, icomRepeaterHandler, band41, band42, band43);
|
||||
|
||||
if (aprs != NULL)
|
||||
aprs->setPort(callsign4, repeaterBand4, frequency4, offset4, range4, latitude4, longitude4, agl4);
|
||||
if (aprs != NULL) {
|
||||
if (gpsdEnabled)
|
||||
aprs->setPortGPSD(callsign4, repeaterBand4, frequency4, offset4, range4, gpsdAddress, gpsdPort);
|
||||
else
|
||||
aprs->setPortFixed(callsign4, repeaterBand4, frequency4, offset4, range4, latitude4, longitude4, agl4);
|
||||
}
|
||||
|
||||
icomCount++;
|
||||
} else if (repeaterType4 == HW_HOMEBREW && hbRepeaterHandler != NULL) {
|
||||
m_thread->addRepeater(callsign4, repeaterBand4, repeaterAddress4, repeaterPort4, repeaterType4, reflector4, atStartup4, reconnect4, dratsEnabled, frequency4, offset4, range4, latitude4, longitude4, agl4, description41, description42, url4, hbRepeaterHandler);
|
||||
|
||||
if (aprs != NULL)
|
||||
aprs->setPort(callsign4, repeaterBand4, frequency4, offset4, range4, latitude4, longitude4, agl4);
|
||||
if (aprs != NULL) {
|
||||
if (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) {
|
||||
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 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());
|
||||
|
||||
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());
|
||||
|
||||
bool xlxEnabled;
|
||||
bool xlxOverrideLocal;
|
||||
wxString xlxHostsFileUrl;
|
||||
config.getXLX(xlxEnabled, xlxOverrideLocal, xlxHostsFileUrl);
|
||||
wxLogInfo(wxT("XLX enabled: %d, Override Local %d, Hosts file url: %s"), int(xlxEnabled), int(xlxOverrideLocal), xlxHostsFileUrl.c_str());
|
||||
config.getXLX(xlxEnabled, xlxHostsFileUrl);
|
||||
wxLogInfo(wxT("XLX enabled: %d, Hosts file url: %s"), int(xlxEnabled), xlxHostsFileUrl.c_str());
|
||||
|
||||
if (repeaterBand1.Len() > 1U || repeaterBand2.Len() > 1U ||
|
||||
repeaterBand3.Len() > 1U || repeaterBand4.Len() > 1U) {
|
||||
|
|
@ -898,7 +967,7 @@ bool CIRCDDBGatewayAppD::createThread()
|
|||
m_thread->setDExtra(dextraEnabled, dextraMaxDongles);
|
||||
m_thread->setDCS(dcsEnabled);
|
||||
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->setEchoEnabled(echoEnabled);
|
||||
m_thread->setDTMFEnabled(dtmfEnabled);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -28,7 +28,7 @@
|
|||
class CIRCDDBGatewayAppD {
|
||||
|
||||
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();
|
||||
|
||||
bool init();
|
||||
|
|
@ -40,12 +40,15 @@ public:
|
|||
private:
|
||||
wxString m_name;
|
||||
bool m_nolog;
|
||||
bool m_debug;
|
||||
bool m_foreground;
|
||||
wxString m_logDir;
|
||||
wxString m_confDir;
|
||||
CIRCDDBGatewayThread* m_thread;
|
||||
wxSingleInstanceChecker* m_checker;
|
||||
|
||||
bool createThread();
|
||||
void initLogging(wxLog *logger);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -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
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -199,7 +199,7 @@ void CIRCDDBGatewayFrame::onAbout(wxCommandEvent&)
|
|||
wxAboutDialogInfo info;
|
||||
info.AddDeveloper(wxT("Jonathan Naylor, G4KLX"));
|
||||
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.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."));
|
||||
|
|
@ -271,14 +271,10 @@ void CIRCDDBGatewayFrame::onTimer(wxTimerEvent&)
|
|||
}
|
||||
|
||||
bool dprsStatus = status->getDPRSStatus();
|
||||
if (dprsStatus) {
|
||||
if (ircDDBStatus == IS_CONNECTED || ircDDBStatus == IS_DISABLED)
|
||||
m_dprsStatus->SetLabel(_("Active"));
|
||||
else
|
||||
m_dprsStatus->SetLabel(_("Waiting"));
|
||||
} else {
|
||||
if (dprsStatus)
|
||||
m_dprsStatus->SetLabel(_("Active"));
|
||||
else
|
||||
m_dprsStatus->SetLabel(_("Inactive"));
|
||||
}
|
||||
|
||||
for (unsigned int i = 0U; i < 4U; i++) {
|
||||
wxString callsign = status->getCallsign(i);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -72,6 +72,9 @@ m_dextraPool(NULL),
|
|||
m_dplusPool(NULL),
|
||||
m_dcsPool(NULL),
|
||||
m_g2Handler(NULL),
|
||||
#if defined(ENABLE_NAT_TRAVERSAL)
|
||||
m_natTraversal(NULL),
|
||||
#endif
|
||||
m_aprsWriter(NULL),
|
||||
m_irc(NULL),
|
||||
m_cache(),
|
||||
|
|
@ -217,6 +220,13 @@ void CIRCDDBGatewayThread::run()
|
|||
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
|
||||
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
|
||||
|
|
@ -318,10 +328,6 @@ void CIRCDDBGatewayThread::run()
|
|||
CCCSHandler::setHeaderLogger(headerLogger);
|
||||
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) {
|
||||
m_remote = new CRemoteHandler(m_remotePassword, m_remotePort, m_gatewayAddress);
|
||||
bool res = m_remote->open();
|
||||
|
|
@ -409,6 +415,7 @@ void CIRCDDBGatewayThread::run()
|
|||
}
|
||||
}
|
||||
|
||||
wxLog::FlushActive();
|
||||
::wxMilliSleep(TIME_PER_TIC_MS);
|
||||
}
|
||||
}
|
||||
|
|
@ -576,11 +583,10 @@ void CIRCDDBGatewayThread::setDCS(bool 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_xlxHostsFileName = xlxHostsFileName;
|
||||
m_xlxOverrideLocal = overrideLocal;
|
||||
}
|
||||
|
||||
void CIRCDDBGatewayThread::setCCS(bool enabled, const wxString& host)
|
||||
|
|
@ -689,24 +695,18 @@ void CIRCDDBGatewayThread::processIrcDDB()
|
|||
if (m_lastStatus != IS_DISCONNECTED) {
|
||||
wxLogInfo(wxT("Disconnected from ircDDB"));
|
||||
m_lastStatus = IS_DISCONNECTED;
|
||||
if (m_aprsWriter != NULL)
|
||||
m_aprsWriter->setEnabled(false);
|
||||
}
|
||||
break;
|
||||
case 7:
|
||||
if (m_lastStatus != IS_CONNECTED) {
|
||||
wxLogInfo(wxT("Connected to ircDDB"));
|
||||
m_lastStatus = IS_CONNECTED;
|
||||
if (m_aprsWriter != NULL)
|
||||
m_aprsWriter->setEnabled(true);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if (m_lastStatus != IS_CONNECTING) {
|
||||
wxLogInfo(wxT("Connecting to ircDDB"));
|
||||
m_lastStatus = IS_CONNECTING;
|
||||
if (m_aprsWriter != NULL)
|
||||
m_aprsWriter->setEnabled(false);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
@ -728,6 +728,9 @@ void CIRCDDBGatewayThread::processIrcDDB()
|
|||
if (!address.IsEmpty()) {
|
||||
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);
|
||||
#if defined(ENABLE_NAT_TRAVERSAL)
|
||||
m_natTraversal->traverseNatG2(address);
|
||||
#endif
|
||||
} else {
|
||||
wxLogMessage(wxT("USER: %s NOT FOUND"), user.c_str());
|
||||
}
|
||||
|
|
@ -744,6 +747,9 @@ void CIRCDDBGatewayThread::processIrcDDB()
|
|||
if (!address.IsEmpty()) {
|
||||
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);
|
||||
#if defined(ENABLE_NAT_TRAVERSAL)
|
||||
m_natTraversal->traverseNatG2(address);
|
||||
#endif
|
||||
} else {
|
||||
wxLogMessage(wxT("REPEATER: %s NOT FOUND"), repeater.c_str());
|
||||
}
|
||||
|
|
@ -761,6 +767,9 @@ void CIRCDDBGatewayThread::processIrcDDB()
|
|||
if (!address.IsEmpty()) {
|
||||
wxLogMessage(wxT("GATEWAY: %s %s"), gateway.c_str(), address.c_str());
|
||||
m_cache.updateGateway(gateway, address, DP_DEXTRA, false, false);
|
||||
#if defined(ENABLE_NAT_TRAVERSAL)
|
||||
m_natTraversal->traverseNatG2(address);
|
||||
#endif
|
||||
} else {
|
||||
wxLogMessage(wxT("GATEWAY: %s NOT FOUND"), gateway.c_str());
|
||||
}
|
||||
|
|
@ -1108,9 +1117,8 @@ void CIRCDDBGatewayThread::loadGateways()
|
|||
|
||||
void CIRCDDBGatewayThread::loadReflectors()
|
||||
{
|
||||
if(m_xlxEnabled && !m_xlxOverrideLocal) {
|
||||
if (m_xlxEnabled)
|
||||
loadXLXReflectors();
|
||||
}
|
||||
|
||||
if (m_dplusEnabled) {
|
||||
wxFileName fileName(wxFileName::GetHomeDir(), DPLUS_HOSTS_FILE_NAME);
|
||||
|
|
@ -1153,10 +1161,6 @@ void CIRCDDBGatewayThread::loadReflectors()
|
|||
if (fileName.IsFileReadable())
|
||||
loadDCSReflectors(fileName.GetFullPath());
|
||||
}
|
||||
|
||||
if(m_xlxEnabled && m_xlxOverrideLocal) {
|
||||
loadXLXReflectors();
|
||||
}
|
||||
}
|
||||
|
||||
void CIRCDDBGatewayThread::loadDExtraReflectors(const wxString& fileName)
|
||||
|
|
@ -1258,6 +1262,10 @@ void CIRCDDBGatewayThread::loadXLXReflectors()
|
|||
CHostFile hostFile = CHostFile(m_xlxHostsFileName, true);
|
||||
for (unsigned int i = 0U; i < hostFile.getCount(); i++) {
|
||||
wxString reflector = hostFile.getName(i);
|
||||
|
||||
if (!reflector.StartsWith(wxT("XLX")))
|
||||
continue;
|
||||
|
||||
in_addr address = CUDPReaderWriter::lookup(hostFile.getAddress(i));
|
||||
bool lock = hostFile.getLock(i);
|
||||
|
||||
|
|
@ -1274,10 +1282,10 @@ void CIRCDDBGatewayThread::loadXLXReflectors()
|
|||
reflector.Truncate(LONG_CALLSIGN_LENGTH - 1U);
|
||||
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);
|
||||
else if(m_dextraEnabled && reflector.StartsWith(wxT("XRF")))
|
||||
m_cache.updateGateway(reflector, addrText, DP_DEXTRA, lock, true);
|
||||
//else if (m_dextraEnabled && reflector.StartsWith(wxT("XRF")))
|
||||
// m_cache.updateGateway(reflector, addrText, DP_DEXTRA, lock, true);
|
||||
|
||||
count++;
|
||||
}
|
||||
|
|
@ -1316,7 +1324,7 @@ CIRCDDBGatewayStatusData* CIRCDDBGatewayThread::getStatus() const
|
|||
{
|
||||
bool aprsStatus = false;
|
||||
if (m_aprsWriter != NULL)
|
||||
aprsStatus = m_aprsWriter->isConnected();
|
||||
aprsStatus = true;
|
||||
|
||||
CIRCDDBGatewayStatusData* status = new CIRCDDBGatewayStatusData(m_lastStatus, aprsStatus);
|
||||
|
||||
|
|
|
|||
|
|
@ -35,6 +35,9 @@
|
|||
#include "IRCDDB.h"
|
||||
#include "Timer.h"
|
||||
#include "Defs.h"
|
||||
#if defined(ENABLE_NAT_TRAVERSAL)
|
||||
#include "NatTraversalHandler.h"
|
||||
#endif
|
||||
|
||||
#include <wx/wx.h>
|
||||
|
||||
|
|
@ -58,7 +61,7 @@ public:
|
|||
virtual void setDExtra(bool enabled, unsigned int maxDongles);
|
||||
virtual void setDPlus(bool enabled, unsigned int maxDongles, const wxString& login);
|
||||
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 setLog(bool enabled);
|
||||
virtual void setAPRSWriter(CAPRSWriter* writer);
|
||||
|
|
@ -92,6 +95,9 @@ private:
|
|||
CDPlusProtocolHandlerPool* m_dplusPool;
|
||||
CDCSProtocolHandlerPool* m_dcsPool;
|
||||
CG2ProtocolHandler* m_g2Handler;
|
||||
#if defined(ENABLE_NAT_TRAVERSAL)
|
||||
CNatTraversalHandler* m_natTraversal;
|
||||
#endif
|
||||
CAPRSWriter* m_aprsWriter;
|
||||
CIRCDDB* m_irc;
|
||||
CCacheManager m_cache;
|
||||
|
|
@ -103,7 +109,6 @@ private:
|
|||
wxString m_dplusLogin;
|
||||
bool m_dcsEnabled;
|
||||
bool m_xlxEnabled;
|
||||
bool m_xlxOverrideLocal;
|
||||
wxString m_xlxHostsFileName;
|
||||
bool m_ccsEnabled;
|
||||
wxString m_ccsHost;
|
||||
|
|
|
|||
|
|
@ -1,16 +1,29 @@
|
|||
OBJECTS = IRCDDBGatewayAppD.o IRCDDBGatewayStatusData.o IRCDDBGatewayThread.o IRCDDBGatewayThreadHelper.o
|
||||
|
||||
.PHONY: all
|
||||
all: ircddbgatewayd
|
||||
|
||||
ircddbgatewayd: $(OBJECTS)
|
||||
ircddbgatewayd: $(OBJECTS) ../ircDDB/IRCDDB.a ../Common/Common.a
|
||||
$(CXX) $(OBJECTS) ../Common/Common.a ../ircDDB/IRCDDB.a $(LDFLAGS) $(LIBS) -o ircddbgatewayd
|
||||
|
||||
-include $(OBJECTS:.o=.d)
|
||||
|
||||
%.o: %.cpp
|
||||
$(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 -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:
|
||||
$(RM) ircddbgatewayd *.o *.d *.bak *~
|
||||
|
||||
../Common/Common.a:
|
||||
../ircDDB/IRCDDB.a:
|
||||
|
||||
|
|
|
|||
26
ircDDBGateway/MakefileGUI
Normal file
26
ircDDBGateway/MakefileGUI
Normal 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:
|
||||
|
||||
|
|
@ -22,29 +22,29 @@
|
|||
<ProjectGuid>{6DDA3497-66A3-4856-BAD4-1DDCDBDFF959}</ProjectGuid>
|
||||
<RootNamespace>ircDDBGateway</RootNamespace>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
|
|
@ -80,9 +80,11 @@
|
|||
<OutDir>$(SolutionDir)$(Configuration)\</OutDir>
|
||||
<IntDir>$(Configuration)\</IntDir>
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<IncludePath>$(WXWIN)\include;$(WXWIN)\lib\vc_dll\mswu;$(IncludePath)</IncludePath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<IncludePath>$(WXWIN)\include;$(WXWIN)\lib\vc_x64_dll\mswu;$(IncludePath)</IncludePath>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
|
|
|
|||
183
ircDDBGateway/ircddbgateway-emptyconfig
Normal file
183
ircDDBGateway/ircddbgateway-emptyconfig
Normal 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
131
ircDDBGateway32.nsi
Normal 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
131
ircDDBGateway64.nsi
Normal 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
|
||||
|
|
@ -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
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -65,6 +65,7 @@ m_starNet3(NULL),
|
|||
m_starNet4(NULL),
|
||||
m_starNet5(NULL),
|
||||
m_remote(NULL),
|
||||
m_gpsd(NULL),
|
||||
m_miscellaneous(NULL)
|
||||
{
|
||||
SetMenuBar(createMenuBar());
|
||||
|
|
@ -103,9 +104,8 @@ m_miscellaneous(NULL)
|
|||
m_config->getDCS(dcsEnabled, ccsEnabled, ccsHost);
|
||||
|
||||
bool xlxEnabled;
|
||||
bool xlxOverrideLocal;
|
||||
wxString xlxHostsFileUrl;
|
||||
m_config->getXLX(xlxEnabled, xlxOverrideLocal, xlxHostsFileUrl);
|
||||
m_config->getXLX(xlxEnabled, xlxHostsFileUrl);
|
||||
|
||||
GATEWAY_TYPE gatewayType;
|
||||
wxString gatewayCallsign, gatewayAddress, icomAddress, hbAddress, description1, description2, url;
|
||||
|
|
@ -178,7 +178,7 @@ m_miscellaneous(NULL)
|
|||
|
||||
bool ircDDBEnabled;
|
||||
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);
|
||||
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);
|
||||
noteBook->AddPage(m_ircDDB4, wxT("ircDDB 4th Network"), false);
|
||||
|
||||
wxString aprsHostname;
|
||||
wxString aprsAddress;
|
||||
unsigned int aprsPort;
|
||||
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);
|
||||
|
||||
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);
|
||||
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);
|
||||
|
||||
#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);
|
||||
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;
|
||||
bool infoEnabled, echoEnabled, logEnabled, dratsEnabled, dtmfEnabled;
|
||||
m_config->getMiscellaneous(language, infoEnabled, echoEnabled, logEnabled, dratsEnabled, dtmfEnabled);
|
||||
|
|
@ -321,15 +328,15 @@ m_miscellaneous(NULL)
|
|||
m_miscellaneous = new CIRCDDBGatewayConfigMiscellaneousSet(noteBook, -1, APPLICATION_NAME, language, infoEnabled, echoEnabled, logEnabled, dratsEnabled, dtmfEnabled);
|
||||
noteBook->AddPage(m_miscellaneous, wxT("Misc"), false);
|
||||
|
||||
sizer->Add(noteBook, 0, wxEXPAND | wxALL, BORDER_SIZE);
|
||||
sizer->Add(noteBook, 0, wxEXPAND | wxALL, BORDER_SIZE);
|
||||
|
||||
panel->SetSizer(sizer);
|
||||
panel->SetSizer(sizer);
|
||||
|
||||
mainSizer->Add(panel, 0, wxEXPAND | wxALL, BORDER_SIZE);
|
||||
mainSizer->Add(panel, 0, wxEXPAND | wxALL, BORDER_SIZE);
|
||||
|
||||
mainSizer->SetSizeHints(this);
|
||||
mainSizer->SetSizeHints(this);
|
||||
|
||||
SetSizer(mainSizer);
|
||||
SetSizer(mainSizer);
|
||||
}
|
||||
|
||||
CIRCDDBGatewayConfigFrame::~CIRCDDBGatewayConfigFrame()
|
||||
|
|
@ -371,7 +378,7 @@ void CIRCDDBGatewayConfigFrame::onSave(wxCommandEvent&)
|
|||
!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_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;
|
||||
|
||||
GATEWAY_TYPE gatewayType = m_gateway->getType();
|
||||
|
|
@ -476,7 +483,7 @@ void CIRCDDBGatewayConfigFrame::onSave(wxCommandEvent&)
|
|||
wxString ircDDBHostname = m_ircDDB->getHostname();
|
||||
wxString ircDDBUsername = m_ircDDB->getUsername();
|
||||
wxString ircDDBPassword = m_ircDDB->getPassword();
|
||||
m_config->setIrcDDB(ircDDBEnabled, ircDDBHostname, ircDDBUsername, ircDDBPassword);
|
||||
m_config->setIrcDDB1(ircDDBEnabled, ircDDBHostname, ircDDBUsername, ircDDBPassword);
|
||||
|
||||
ircDDBEnabled = m_ircDDB2->getEnabled();
|
||||
ircDDBHostname = m_ircDDB2->getHostname();
|
||||
|
|
@ -497,9 +504,9 @@ void CIRCDDBGatewayConfigFrame::onSave(wxCommandEvent&)
|
|||
m_config->setIrcDDB4(ircDDBEnabled, ircDDBHostname, ircDDBUsername, ircDDBPassword);
|
||||
|
||||
bool aprsEnabled = m_dprs->getEnabled();
|
||||
wxString aprsHostname = m_dprs->getHostname();
|
||||
wxString aprsAddress = m_dprs->getAddress();
|
||||
unsigned int aprsPort = m_dprs->getPort();
|
||||
m_config->setDPRS(aprsEnabled, aprsHostname, aprsPort);
|
||||
m_config->setDPRS(aprsEnabled, aprsAddress, aprsPort);
|
||||
|
||||
bool dextraEnabled = m_dextra->getEnabled();
|
||||
unsigned int maxDExtraDongles = m_dextra->getMaxDongles();
|
||||
|
|
@ -516,9 +523,8 @@ void CIRCDDBGatewayConfigFrame::onSave(wxCommandEvent&)
|
|||
m_config->setDCS(dcsEnabled, ccsEnabled, ccsHost);
|
||||
|
||||
bool xlxEnabled = m_xlx->getXLXEnabled();
|
||||
bool xlxOverrideLocal = m_xlx->getXLXOverrideLocal();
|
||||
wxString xlxHostsFileUrl = m_xlx->getXLXHostsFileUrl();
|
||||
m_config->setXLX(xlxEnabled, xlxOverrideLocal, xlxHostsFileUrl);
|
||||
m_config->setXLX(xlxEnabled, xlxHostsFileUrl);
|
||||
|
||||
wxString starNetBand1 = m_starNet1->getBand();
|
||||
wxString starNetCallsign1 = m_starNet1->getCallsign();
|
||||
|
|
@ -605,6 +611,11 @@ void CIRCDDBGatewayConfigFrame::onSave(wxCommandEvent&)
|
|||
unsigned int remotePort = m_remote->getPort();
|
||||
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();
|
||||
bool infoEnabled = m_miscellaneous->getInfoEnabled();
|
||||
bool echoEnabled = m_miscellaneous->getEchoEnabled();
|
||||
|
|
@ -627,7 +638,7 @@ void CIRCDDBGatewayConfigFrame::onAbout(wxCommandEvent&)
|
|||
{
|
||||
wxAboutDialogInfo info;
|
||||
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.SetVersion(VERSION);
|
||||
info.SetDescription(_("This program configures the ircDDB Gateway."));
|
||||
|
|
|
|||
|
|
@ -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
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -30,6 +30,7 @@
|
|||
#include "DExtraSet.h"
|
||||
#include "DPlusSet.h"
|
||||
#include "DPRSSet.h"
|
||||
#include "GPSDSet.h"
|
||||
#include "DCSSet.h"
|
||||
#include "XLXSet.h"
|
||||
#include "Defs.h"
|
||||
|
|
@ -65,13 +66,14 @@ private:
|
|||
CDExtraSet* m_dextra;
|
||||
CDPlusSet* m_dplus;
|
||||
CDCSSet* m_dcs;
|
||||
CXLXSet* m_xlx;
|
||||
CXLXSet* m_xlx;
|
||||
CStarNetSet* m_starNet1;
|
||||
CStarNetSet* m_starNet2;
|
||||
CStarNetSet* m_starNet3;
|
||||
CStarNetSet* m_starNet4;
|
||||
CStarNetSet* m_starNet5;
|
||||
CRemoteSet* m_remote;
|
||||
CGPSDSet* m_gpsd;
|
||||
CIRCDDBGatewayConfigMiscellaneousSet* m_miscellaneous;
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
|
|
|
|||
|
|
@ -1,17 +1,25 @@
|
|||
OBJECTS = IRCDDBGatewayConfigApp.o IRCDDBGatewayConfigFrame.o IRCDDBGatewayConfigGatewaySet.o IRCDDBGatewayConfigIrcDDBSet.o \
|
||||
IRCDDBGatewayConfigMiscellaneousSet.o
|
||||
|
||||
.PHONY: all
|
||||
all: ircddbgatewayconfig
|
||||
|
||||
ircddbgatewayconfig: $(OBJECTS)
|
||||
ircddbgatewayconfig: $(OBJECTS) ../GUICommon/GUICommon.a ../Common/Common.a
|
||||
$(CXX) $(OBJECTS) ../GUICommon/GUICommon.a ../Common/Common.a $(LDFLAGS) $(GUILIBS) -o ircddbgatewayconfig
|
||||
|
||||
-include $(OBJECTS:.o=.d)
|
||||
|
||||
%.o: %.cpp
|
||||
$(CXX) $(CFLAGS) -I../Common -I../GUICommon -c -o $@ $<
|
||||
$(CXX) -MM -DwxUSE_GUI=0 $(CFLAGS) -I../Common -I../GUICommon $< > $*.d
|
||||
|
||||
.PHONY: install
|
||||
install:
|
||||
install -g bin -o root -m 0775 ircddbgatewayconfig $(BINDIR)
|
||||
install -g root -o root -m 0755 ircddbgatewayconfig $(DESTDIR)$(BINDIR)
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
$(RM) ircddbgatewayconfig *.o *.d *.bak *~
|
||||
|
||||
../Common/Common.a:
|
||||
../GUICommon/GUICommon.a:
|
||||
|
|
|
|||
|
|
@ -22,29 +22,29 @@
|
|||
<ProjectGuid>{D0A32505-822B-4936-A61B-A5151966AEAA}</ProjectGuid>
|
||||
<RootNamespace>ircDDBGatewayConfig</RootNamespace>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
|
|
@ -80,9 +80,11 @@
|
|||
<OutDir>$(SolutionDir)$(Configuration)\</OutDir>
|
||||
<IntDir>$(Configuration)\</IntDir>
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<IncludePath>$(WXWIN)\include;$(WXWIN)\lib\vc_dll\mswu;$(IncludePath)</IncludePath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<IncludePath>$(WXWIN)\include;$(WXWIN)\lib\vc_x64_dll\mswu;$(IncludePath)</IncludePath>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
|
|
|
|||
Loading…
Reference in a new issue