1
0
Fork 0

Merge remote-tracking branch 'g4klx/master'

ycs232-kbc
Andy CA6JAU 7 years ago
commit a56716d0c5

4
.gitignore vendored

@ -1,7 +1,6 @@
Debug Debug
Release Release
x64 x64
MMDVMHost
*.o *.o
*.opendb *.opendb
*.bak *.bak
@ -14,3 +13,6 @@ MMDVMHost
*.user *.user
*.VC.db *.VC.db
.vs .vs
YSFGateway/YSFGateway
YSFParrot/YSFParrot
YSFReflector/YSFReflector

@ -10,6 +10,6 @@ The Gateway and Reflector have ini files that contain the parameters for running
The MMDVM .ini file should have the IP address and port number of the client in the [System Fusion Network] settings. The MMDVM .ini file should have the IP address and port number of the client in the [System Fusion Network] settings.
They build on 32-bit and 64-bit Linux as well as on Windows using VS2015 on x86 and x64. They 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 and is intended for amateur and educational use only. Use of this software for commercial purposes is strictly forbidden. This software is licenced under the GPL v2 and is intended for amateur and educational use only. Use of this software for commercial purposes is strictly forbidden.

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2010-2014,2016 by Jonathan Naylor G4KLX * Copyright (C) 2010-2014,2016,2017 by Jonathan Naylor G4KLX
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -34,7 +34,8 @@ m_txFrequency(0U),
m_rxFrequency(0U), m_rxFrequency(0U),
m_latitude(0.0F), m_latitude(0.0F),
m_longitude(0.0F), m_longitude(0.0F),
m_height(0) m_height(0),
m_desc()
{ {
assert(!callsign.empty()); assert(!callsign.empty());
assert(!password.empty()); assert(!password.empty());
@ -53,17 +54,19 @@ CAPRSWriter::~CAPRSWriter()
{ {
} }
void CAPRSWriter::setInfo(unsigned int txFrequency, unsigned int rxFrequency, float latitude, float longitude, int height) void CAPRSWriter::setInfo(unsigned int txFrequency, unsigned int rxFrequency, float latitude, float longitude, int height, const std::string& desc)
{ {
m_txFrequency = txFrequency; m_txFrequency = txFrequency;
m_rxFrequency = rxFrequency; m_rxFrequency = rxFrequency;
m_latitude = latitude; m_latitude = latitude;
m_longitude = longitude; m_longitude = longitude;
m_height = height; m_height = height;
m_desc = desc;
} }
bool CAPRSWriter::open() bool CAPRSWriter::open()
{ {
m_idTimer.start();
return m_thread->start(); return m_thread->start();
} }
@ -146,15 +149,15 @@ void CAPRSWriter::sendIdFrames()
if (m_latitude == 0.0F && m_longitude == 0.0F) if (m_latitude == 0.0F && m_longitude == 0.0F)
return; return;
char desc[100U]; char desc[200U];
if (m_txFrequency != 0U) { if (m_txFrequency != 0U) {
float offset = float(int(m_rxFrequency) - int(m_txFrequency)) / 1000000.0F; float offset = float(int(m_rxFrequency) - int(m_txFrequency)) / 1000000.0F;
::sprintf(desc, "MMDVM Voice %.5lfMHz %c%.4lfMHz", ::sprintf(desc, "MMDVM Voice %.5LfMHz %c%.4lfMHz%s%s",
float(m_txFrequency) / 1000000.0F, (long double)(m_txFrequency) / 1000000.0F,
offset < 0.0F ? '-' : '+', offset < 0.0F ? '-' : '+',
::fabs(offset)); ::fabs(offset), m_desc.empty() ? "" : ", ", m_desc.c_str());
} else { } else {
::strcpy(desc, "MMDVM Voice"); ::sprintf(desc, "MMDVM Voice%s%s", m_desc.empty() ? "" : ", ", m_desc.c_str());
} }
const char* band = "4m"; const char* band = "4m";
@ -179,10 +182,10 @@ void CAPRSWriter::sendIdFrames()
longitude = (tempLong - longitude) * 60.0 + longitude * 100.0; longitude = (tempLong - longitude) * 60.0 + longitude * 100.0;
char lat[20U]; char lat[20U];
::sprintf(lat, "%04.2lf", latitude); ::sprintf(lat, "%07.2lf", latitude);
char lon[20U]; char lon[20U];
::sprintf(lon, "%05.2lf", longitude); ::sprintf(lon, "%08.2lf", longitude);
std::string server = m_callsign; std::string server = m_callsign;
size_t pos = server.find_first_of('-'); size_t pos = server.find_first_of('-');

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2010,2011,2012,2016 by Jonathan Naylor G4KLX * Copyright (C) 2010,2011,2012,2016,2017 by Jonathan Naylor G4KLX
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -31,7 +31,7 @@ public:
bool open(); bool open();
void setInfo(unsigned int txFrequency, unsigned int rxFrequency, float latitude, float longitude, int height); void setInfo(unsigned int txFrequency, unsigned int rxFrequency, float latitude, float longitude, int height, const std::string& desc);
void write(const unsigned char* source, const char* type, unsigned char radio, float latitude, float longitude); void write(const unsigned char* source, const char* type, unsigned char radio, float latitude, float longitude);
@ -49,6 +49,7 @@ private:
float m_latitude; float m_latitude;
float m_longitude; float m_longitude;
int m_height; int m_height;
std::string m_desc;
void sendIdFrames(); void sendIdFrames();
}; };

@ -60,6 +60,7 @@ m_aprsEnabled(false),
m_aprsServer(), m_aprsServer(),
m_aprsPort(0U), m_aprsPort(0U),
m_aprsPassword(), m_aprsPassword(),
m_aprsDescription(),
m_networkEnabled(false), m_networkEnabled(false),
m_networkPort(0U), m_networkPort(0U),
m_networkHosts(), m_networkHosts(),
@ -68,6 +69,7 @@ m_networkParrotAddress("127.0.0.1"),
m_networkParrotPort(0U), m_networkParrotPort(0U),
m_networkStartup(), m_networkStartup(),
m_networkInactivityTimeout(0U), m_networkInactivityTimeout(0U),
m_networkRevert(false),
m_networkDebug(false) m_networkDebug(false)
{ {
} }
@ -169,6 +171,8 @@ bool CConf::read()
m_aprsPort = (unsigned int)::atoi(value); m_aprsPort = (unsigned int)::atoi(value);
else if (::strcmp(key, "Password") == 0) else if (::strcmp(key, "Password") == 0)
m_aprsPassword = value; m_aprsPassword = value;
else if (::strcmp(key, "Description") == 0)
m_aprsDescription = value;
} else if (section == SECTION_NETWORK) { } else if (section == SECTION_NETWORK) {
if (::strcmp(key, "Enable") == 0) if (::strcmp(key, "Enable") == 0)
m_networkEnabled = ::atoi(value) == 1; m_networkEnabled = ::atoi(value) == 1;
@ -186,6 +190,8 @@ bool CConf::read()
m_networkStartup = value; m_networkStartup = value;
else if (::strcmp(key, "InactivityTimeout") == 0) else if (::strcmp(key, "InactivityTimeout") == 0)
m_networkInactivityTimeout = (unsigned int)::atoi(value); m_networkInactivityTimeout = (unsigned int)::atoi(value);
else if (::strcmp(key, "Revert") == 0)
m_networkRevert = ::atoi(value) == 1;
else if (::strcmp(key, "Debug") == 0) else if (::strcmp(key, "Debug") == 0)
m_networkDebug = ::atoi(value) == 1; m_networkDebug = ::atoi(value) == 1;
} }
@ -311,6 +317,11 @@ std::string CConf::getAPRSPassword() const
return m_aprsPassword; return m_aprsPassword;
} }
std::string CConf::getAPRSDescription() const
{
return m_aprsDescription;
}
bool CConf::getNetworkEnabled() const bool CConf::getNetworkEnabled() const
{ {
return m_networkEnabled; return m_networkEnabled;
@ -351,6 +362,11 @@ unsigned int CConf::getNetworkInactivityTimeout() const
return m_networkInactivityTimeout; return m_networkInactivityTimeout;
} }
bool CConf::getNetworkRevert() const
{
return m_networkRevert;
}
bool CConf::getNetworkDebug() const bool CConf::getNetworkDebug() const
{ {
return m_networkDebug; return m_networkDebug;

@ -60,6 +60,7 @@ public:
std::string getAPRSServer() const; std::string getAPRSServer() const;
unsigned int getAPRSPort() const; unsigned int getAPRSPort() const;
std::string getAPRSPassword() const; std::string getAPRSPassword() const;
std::string getAPRSDescription() const;
// The Network section // The Network section
bool getNetworkEnabled() const; bool getNetworkEnabled() const;
@ -70,6 +71,7 @@ public:
unsigned int getNetworkParrotPort() const; unsigned int getNetworkParrotPort() const;
std::string getNetworkStartup() const; std::string getNetworkStartup() const;
unsigned int getNetworkInactivityTimeout() const; unsigned int getNetworkInactivityTimeout() const;
bool getNetworkRevert() const;
bool getNetworkDebug() const; bool getNetworkDebug() const;
private: private:
@ -100,6 +102,7 @@ private:
std::string m_aprsServer; std::string m_aprsServer;
unsigned int m_aprsPort; unsigned int m_aprsPort;
std::string m_aprsPassword; std::string m_aprsPassword;
std::string m_aprsDescription;
bool m_networkEnabled; bool m_networkEnabled;
unsigned int m_networkPort; unsigned int m_networkPort;
@ -109,6 +112,7 @@ private:
unsigned int m_networkParrotPort; unsigned int m_networkParrotPort;
std::string m_networkStartup; std::string m_networkStartup;
unsigned int m_networkInactivityTimeout; unsigned int m_networkInactivityTimeout;
bool m_networkRevert;
bool m_networkDebug; bool m_networkDebug;
}; };

@ -0,0 +1,196 @@
/*
* Copyright (C) 2012,2013,2015,2017 by Jonathan Naylor G4KLX
* Copyright (C) 2011 by DV Developer Group. DJ0ABR
*
* 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 "DTMF.h"
#include "Utils.h"
const unsigned char DTMF_VD2_MASK[] = { 0xCCU, 0xCCU, 0xDDU, 0xDDU, 0xEEU, 0xEEU, 0xFFU, 0xFFU, 0xEEU, 0xEEU, 0xDDU, 0x99U, 0x98U };
const unsigned char DTMF_VD2_SIG[] = { 0x08U, 0x80U, 0xC9U, 0x10U, 0x26U, 0xA0U, 0xE3U, 0x31U, 0xE2U, 0xE6U, 0xD5U, 0x08U, 0x88U };
const unsigned char DTMF_VD2_SYM_MASK[] = { 0x33U, 0x33U, 0x22U, 0x22U, 0x11U, 0x11U, 0x11U, 0x11U, 0x22U, 0x66U, 0x66U };
const unsigned char DTMF_VD2_SYM0[] = { 0x33U, 0x11U, 0x22U, 0x02U, 0x00U, 0x00U, 0x01U, 0x11U, 0x00U, 0x04U, 0x62U };
const unsigned char DTMF_VD2_SYM1[] = { 0x33U, 0x10U, 0x20U, 0x20U, 0x00U, 0x01U, 0x01U, 0x10U, 0x00U, 0x04U, 0x62U };
const unsigned char DTMF_VD2_SYM2[] = { 0x22U, 0x23U, 0x02U, 0x02U, 0x00U, 0x10U, 0x01U, 0x01U, 0x00U, 0x04U, 0x62U };
const unsigned char DTMF_VD2_SYM3[] = { 0x22U, 0x22U, 0x00U, 0x20U, 0x00U, 0x11U, 0x01U, 0x00U, 0x00U, 0x04U, 0x62U };
const unsigned char DTMF_VD2_SYM4[] = { 0x11U, 0x11U, 0x22U, 0x02U, 0x01U, 0x00U, 0x00U, 0x11U, 0x00U, 0x06U, 0x44U };
const unsigned char DTMF_VD2_SYM5[] = { 0x11U, 0x10U, 0x20U, 0x20U, 0x01U, 0x01U, 0x00U, 0x10U, 0x00U, 0x06U, 0x44U };
const unsigned char DTMF_VD2_SYM6[] = { 0x00U, 0x23U, 0x02U, 0x02U, 0x01U, 0x10U, 0x00U, 0x01U, 0x00U, 0x06U, 0x44U };
const unsigned char DTMF_VD2_SYM7[] = { 0x00U, 0x22U, 0x00U, 0x20U, 0x01U, 0x11U, 0x00U, 0x00U, 0x00U, 0x06U, 0x44U };
const unsigned char DTMF_VD2_SYM8[] = { 0x33U, 0x11U, 0x22U, 0x02U, 0x10U, 0x00U, 0x11U, 0x11U, 0x22U, 0x60U, 0x22U };
const unsigned char DTMF_VD2_SYM9[] = { 0x33U, 0x10U, 0x20U, 0x20U, 0x10U, 0x01U, 0x11U, 0x10U, 0x22U, 0x60U, 0x22U };
const unsigned char DTMF_VD2_SYMA[] = { 0x22U, 0x23U, 0x02U, 0x02U, 0x10U, 0x10U, 0x11U, 0x01U, 0x22U, 0x60U, 0x22U };
const unsigned char DTMF_VD2_SYMB[] = { 0x22U, 0x22U, 0x00U, 0x20U, 0x10U, 0x11U, 0x11U, 0x00U, 0x22U, 0x60U, 0x22U };
const unsigned char DTMF_VD2_SYMC[] = { 0x11U, 0x11U, 0x22U, 0x02U, 0x11U, 0x00U, 0x10U, 0x11U, 0x22U, 0x62U, 0x04U };
const unsigned char DTMF_VD2_SYMD[] = { 0x11U, 0x10U, 0x20U, 0x20U, 0x11U, 0x01U, 0x10U, 0x10U, 0x22U, 0x62U, 0x04U };
const unsigned char DTMF_VD2_SYMS[] = { 0x00U, 0x23U, 0x02U, 0x02U, 0x11U, 0x10U, 0x10U, 0x01U, 0x22U, 0x62U, 0x04U };
const unsigned char DTMF_VD2_SYMH[] = { 0x00U, 0x22U, 0x00U, 0x20U, 0x11U, 0x11U, 0x10U, 0x00U, 0x22U, 0x62U, 0x04U };
CDTMF::CDTMF() :
m_data(),
m_command(),
m_pressed(false),
m_releaseCount(0U),
m_pressCount(0U),
m_lastChar(' ')
{
}
CDTMF::~CDTMF()
{
}
WX_STATUS CDTMF::decodeVDMode2(const unsigned char* payload, bool end)
{
assert(payload != NULL);
payload += YSF_SYNC_LENGTH_BYTES + YSF_FICH_LENGTH_BYTES;
for (unsigned int offset = 5U; offset < 90U; offset += 18U) {
WX_STATUS status = decodeVDMode2Slice(payload + offset, end);
if (status != WXS_NONE)
return status;
}
return WXS_NONE;
}
WX_STATUS CDTMF::decodeVDMode2Slice(const unsigned char* ambe, bool end)
{
// DTMF begins with these byte values
if (!end && (ambe[0] & DTMF_VD2_MASK[0]) == DTMF_VD2_SIG[0] && (ambe[1] & DTMF_VD2_MASK[1]) == DTMF_VD2_SIG[1] &&
(ambe[2] & DTMF_VD2_MASK[2]) == DTMF_VD2_SIG[2] && (ambe[3] & DTMF_VD2_MASK[3]) == DTMF_VD2_SIG[3] &&
(ambe[4] & DTMF_VD2_MASK[4]) == DTMF_VD2_SIG[4] && (ambe[5] & DTMF_VD2_MASK[5]) == DTMF_VD2_SIG[5] &&
(ambe[6] & DTMF_VD2_MASK[6]) == DTMF_VD2_SIG[6] && (ambe[7] & DTMF_VD2_MASK[7]) == DTMF_VD2_SIG[7] &&
(ambe[8] & DTMF_VD2_MASK[8]) == DTMF_VD2_SIG[8] && (ambe[9] & DTMF_VD2_MASK[9]) == DTMF_VD2_SIG[9] &&
(ambe[10] & DTMF_VD2_MASK[10]) == DTMF_VD2_SIG[10] && (ambe[11] & DTMF_VD2_MASK[11]) == DTMF_VD2_SIG[11] &&
(ambe[12] & DTMF_VD2_MASK[12]) == DTMF_VD2_SIG[12]) {
unsigned char sym0 = ambe[0] & DTMF_VD2_SYM_MASK[0];
unsigned char sym1 = ambe[1] & DTMF_VD2_SYM_MASK[1];
unsigned char sym2 = ambe[2] & DTMF_VD2_SYM_MASK[2];
unsigned char sym3 = ambe[3] & DTMF_VD2_SYM_MASK[3];
unsigned char sym4 = ambe[4] & DTMF_VD2_SYM_MASK[4];
unsigned char sym5 = ambe[5] & DTMF_VD2_SYM_MASK[5];
unsigned char sym6 = ambe[8] & DTMF_VD2_SYM_MASK[6];
unsigned char sym7 = ambe[9] & DTMF_VD2_SYM_MASK[7];
unsigned char sym8 = ambe[10] & DTMF_VD2_SYM_MASK[8];
unsigned char sym9 = ambe[11] & DTMF_VD2_SYM_MASK[9];
unsigned char sym10 = ambe[12] & DTMF_VD2_SYM_MASK[10];
char c = ' ';
if (sym0 == DTMF_VD2_SYM0[0] && sym1 == DTMF_VD2_SYM0[1] && sym2 == DTMF_VD2_SYM0[2] && sym3 == DTMF_VD2_SYM0[3] && sym4 == DTMF_VD2_SYM0[4] && sym5 == DTMF_VD2_SYM0[5] && sym6 == DTMF_VD2_SYM0[6] && sym7 == DTMF_VD2_SYM0[7] && sym8 == DTMF_VD2_SYM0[8] && sym9 == DTMF_VD2_SYM0[9] && sym10 == DTMF_VD2_SYM0[10])
c = '0';
else if (sym0 == DTMF_VD2_SYM1[0] && sym1 == DTMF_VD2_SYM1[1] && sym2 == DTMF_VD2_SYM1[2] && sym3 == DTMF_VD2_SYM1[3] && sym4 == DTMF_VD2_SYM1[4] && sym5 == DTMF_VD2_SYM1[5] && sym6 == DTMF_VD2_SYM1[6] && sym7 == DTMF_VD2_SYM1[7] && sym8 == DTMF_VD2_SYM1[8] && sym9 == DTMF_VD2_SYM1[9] && sym10 == DTMF_VD2_SYM1[10])
c = '1';
else if (sym0 == DTMF_VD2_SYM2[0] && sym1 == DTMF_VD2_SYM2[1] && sym2 == DTMF_VD2_SYM2[2] && sym3 == DTMF_VD2_SYM2[3] && sym4 == DTMF_VD2_SYM2[4] && sym5 == DTMF_VD2_SYM2[5] && sym6 == DTMF_VD2_SYM2[6] && sym7 == DTMF_VD2_SYM2[7] && sym8 == DTMF_VD2_SYM2[8] && sym9 == DTMF_VD2_SYM2[9] && sym10 == DTMF_VD2_SYM2[10])
c = '2';
else if (sym0 == DTMF_VD2_SYM3[0] && sym1 == DTMF_VD2_SYM3[1] && sym2 == DTMF_VD2_SYM3[2] && sym3 == DTMF_VD2_SYM3[3] && sym4 == DTMF_VD2_SYM3[4] && sym5 == DTMF_VD2_SYM3[5] && sym6 == DTMF_VD2_SYM3[6] && sym7 == DTMF_VD2_SYM3[7] && sym8 == DTMF_VD2_SYM3[8] && sym9 == DTMF_VD2_SYM3[9] && sym10 == DTMF_VD2_SYM3[10])
c = '3';
else if (sym0 == DTMF_VD2_SYM4[0] && sym1 == DTMF_VD2_SYM4[1] && sym2 == DTMF_VD2_SYM4[2] && sym3 == DTMF_VD2_SYM4[3] && sym4 == DTMF_VD2_SYM4[4] && sym5 == DTMF_VD2_SYM4[5] && sym6 == DTMF_VD2_SYM4[6] && sym7 == DTMF_VD2_SYM4[7] && sym8 == DTMF_VD2_SYM4[8] && sym9 == DTMF_VD2_SYM4[9] && sym10 == DTMF_VD2_SYM4[10])
c = '4';
else if (sym0 == DTMF_VD2_SYM5[0] && sym1 == DTMF_VD2_SYM5[1] && sym2 == DTMF_VD2_SYM5[2] && sym3 == DTMF_VD2_SYM5[3] && sym4 == DTMF_VD2_SYM5[4] && sym5 == DTMF_VD2_SYM5[5] && sym6 == DTMF_VD2_SYM5[6] && sym7 == DTMF_VD2_SYM5[7] && sym8 == DTMF_VD2_SYM5[8] && sym9 == DTMF_VD2_SYM5[9] && sym10 == DTMF_VD2_SYM5[10])
c = '5';
else if (sym0 == DTMF_VD2_SYM6[0] && sym1 == DTMF_VD2_SYM6[1] && sym2 == DTMF_VD2_SYM6[2] && sym3 == DTMF_VD2_SYM6[3] && sym4 == DTMF_VD2_SYM6[4] && sym5 == DTMF_VD2_SYM6[5] && sym6 == DTMF_VD2_SYM6[6] && sym7 == DTMF_VD2_SYM6[7] && sym8 == DTMF_VD2_SYM6[8] && sym9 == DTMF_VD2_SYM6[9] && sym10 == DTMF_VD2_SYM6[10])
c = '6';
else if (sym0 == DTMF_VD2_SYM7[0] && sym1 == DTMF_VD2_SYM7[1] && sym2 == DTMF_VD2_SYM7[2] && sym3 == DTMF_VD2_SYM7[3] && sym4 == DTMF_VD2_SYM7[4] && sym5 == DTMF_VD2_SYM7[5] && sym6 == DTMF_VD2_SYM7[6] && sym7 == DTMF_VD2_SYM7[7] && sym8 == DTMF_VD2_SYM7[8] && sym9 == DTMF_VD2_SYM7[9] && sym10 == DTMF_VD2_SYM7[10])
c = '7';
else if (sym0 == DTMF_VD2_SYM8[0] && sym1 == DTMF_VD2_SYM8[1] && sym2 == DTMF_VD2_SYM8[2] && sym3 == DTMF_VD2_SYM8[3] && sym4 == DTMF_VD2_SYM8[4] && sym5 == DTMF_VD2_SYM8[5] && sym6 == DTMF_VD2_SYM8[6] && sym7 == DTMF_VD2_SYM8[7] && sym8 == DTMF_VD2_SYM8[8] && sym9 == DTMF_VD2_SYM8[9] && sym10 == DTMF_VD2_SYM8[10])
c = '8';
else if (sym0 == DTMF_VD2_SYM9[0] && sym1 == DTMF_VD2_SYM9[1] && sym2 == DTMF_VD2_SYM9[2] && sym3 == DTMF_VD2_SYM9[3] && sym4 == DTMF_VD2_SYM9[4] && sym5 == DTMF_VD2_SYM9[5] && sym6 == DTMF_VD2_SYM9[6] && sym7 == DTMF_VD2_SYM9[7] && sym8 == DTMF_VD2_SYM9[8] && sym9 == DTMF_VD2_SYM9[9] && sym10 == DTMF_VD2_SYM9[10])
c = '9';
else if (sym0 == DTMF_VD2_SYMA[0] && sym1 == DTMF_VD2_SYMA[1] && sym2 == DTMF_VD2_SYMA[2] && sym3 == DTMF_VD2_SYMA[3] && sym4 == DTMF_VD2_SYMA[4] && sym5 == DTMF_VD2_SYMA[5] && sym6 == DTMF_VD2_SYMA[6] && sym7 == DTMF_VD2_SYMA[7] && sym8 == DTMF_VD2_SYMA[8] && sym9 == DTMF_VD2_SYMA[9] && sym10 == DTMF_VD2_SYMA[10])
c = 'A';
else if (sym0 == DTMF_VD2_SYMB[0] && sym1 == DTMF_VD2_SYMB[1] && sym2 == DTMF_VD2_SYMB[2] && sym3 == DTMF_VD2_SYMB[3] && sym4 == DTMF_VD2_SYMB[4] && sym5 == DTMF_VD2_SYMB[5] && sym6 == DTMF_VD2_SYMB[6] && sym7 == DTMF_VD2_SYMB[7] && sym8 == DTMF_VD2_SYMB[8] && sym9 == DTMF_VD2_SYMB[9] && sym10 == DTMF_VD2_SYMB[10])
c = 'B';
else if (sym0 == DTMF_VD2_SYMC[0] && sym1 == DTMF_VD2_SYMC[1] && sym2 == DTMF_VD2_SYMC[2] && sym3 == DTMF_VD2_SYMC[3] && sym4 == DTMF_VD2_SYMC[4] && sym5 == DTMF_VD2_SYMC[5] && sym6 == DTMF_VD2_SYMC[6] && sym7 == DTMF_VD2_SYMC[7] && sym8 == DTMF_VD2_SYMC[8] && sym9 == DTMF_VD2_SYMC[9] && sym10 == DTMF_VD2_SYMC[10])
c = 'C';
else if (sym0 == DTMF_VD2_SYMD[0] && sym1 == DTMF_VD2_SYMD[1] && sym2 == DTMF_VD2_SYMD[2] && sym3 == DTMF_VD2_SYMD[3] && sym4 == DTMF_VD2_SYMD[4] && sym5 == DTMF_VD2_SYMD[5] && sym6 == DTMF_VD2_SYMD[6] && sym7 == DTMF_VD2_SYMD[7] && sym8 == DTMF_VD2_SYMD[8] && sym9 == DTMF_VD2_SYMD[9] && sym10 == DTMF_VD2_SYMD[10])
c = 'D';
else if (sym0 == DTMF_VD2_SYMS[0] && sym1 == DTMF_VD2_SYMS[1] && sym2 == DTMF_VD2_SYMS[2] && sym3 == DTMF_VD2_SYMS[3] && sym4 == DTMF_VD2_SYMS[4] && sym5 == DTMF_VD2_SYMS[5] && sym6 == DTMF_VD2_SYMS[6] && sym7 == DTMF_VD2_SYMS[7] && sym8 == DTMF_VD2_SYMS[8] && sym9 == DTMF_VD2_SYMS[9] && sym10 == DTMF_VD2_SYMS[10])
c = '*';
else if (sym0 == DTMF_VD2_SYMH[0] && sym1 == DTMF_VD2_SYMH[1] && sym2 == DTMF_VD2_SYMH[2] && sym3 == DTMF_VD2_SYMH[3] && sym4 == DTMF_VD2_SYMH[4] && sym5 == DTMF_VD2_SYMH[5] && sym6 == DTMF_VD2_SYMH[6] && sym7 == DTMF_VD2_SYMH[7] && sym8 == DTMF_VD2_SYMH[8] && sym9 == DTMF_VD2_SYMH[9] && sym10 == DTMF_VD2_SYMH[10])
c = '#';
if (c == m_lastChar) {
m_pressCount++;
} else {
m_lastChar = c;
m_pressCount = 0U;
}
if (c != ' ' && !m_pressed && m_pressCount >= 3U) {
m_data += c;
m_releaseCount = 0U;
m_pressed = true;
}
return validate();
} else {
// If it is not a DTMF Code
if ((end || m_releaseCount >= 100U) && m_data.length() > 0U) {
m_command = m_data;
m_data.clear();
m_releaseCount = 0U;
}
m_pressed = false;
m_releaseCount++;
m_pressCount = 0U;
m_lastChar = ' ';
return validate();
}
}
WX_STATUS CDTMF::validate() const
{
if (m_command.length() != 6U)
return WXS_NONE;
if (m_command.at(0U) != '#')
return WXS_NONE;
for (unsigned int i = 1U; i <= 6U; i++) {
if (m_command.at(1U) < '0' || m_command.at(1U) > '9')
return WXS_NONE;
}
if (m_command == "#99999")
return WXS_DISCONNECT;
return WXS_CONNECT;
}
std::string CDTMF::getReflector()
{
std::string command = m_command;
reset();
return command.substr(1U);
}
void CDTMF::reset()
{
m_data.clear();
m_command.clear();
m_pressed = false;
m_pressCount = 0U;
m_releaseCount = 0U;
m_lastChar = ' ';
}

@ -0,0 +1,49 @@
/*
* Copyright (C) 2012,2013,2017 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 DTMF_H
#define DTMF_H
#include "WiresX.h"
#include <string>
class CDTMF {
public:
CDTMF();
~CDTMF();
WX_STATUS decodeVDMode2(const unsigned char* payload, bool end);
std::string getReflector();
void reset();
private:
std::string m_data;
std::string m_command;
bool m_pressed;
unsigned int m_releaseCount;
unsigned int m_pressCount;
char m_lastChar;
WX_STATUS decodeVDMode2Slice(const unsigned char* ambe, bool end);
WX_STATUS validate() const;
};
#endif

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2016 by Jonathan Naylor G4KLX * Copyright (C) 2016,2017 by Jonathan Naylor G4KLX
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -49,9 +49,9 @@ CGPS::~CGPS()
delete[] m_buffer; delete[] m_buffer;
} }
void CGPS::setInfo(unsigned int txFrequency, unsigned int rxFrequency, float latitude, float longitude, int height) void CGPS::setInfo(unsigned int txFrequency, unsigned int rxFrequency, float latitude, float longitude, int height, const std::string& desc)
{ {
m_writer.setInfo(rxFrequency, rxFrequency, latitude, longitude, height); m_writer.setInfo(txFrequency, rxFrequency, latitude, longitude, height, desc);
} }
bool CGPS::open() bool CGPS::open()
@ -196,8 +196,8 @@ void CGPS::transmitGPS(const unsigned char* source)
lon_deg = b - 0x76U; // 0 to 9 lon_deg = b - 0x76U; // 0 to 9
else if (b >= 0x6CU && b <= 0x75U) else if (b >= 0x6CU && b <= 0x75U)
lon_deg = 100U + (b - 0x6CU); // 100 to 109 lon_deg = 100U + (b - 0x6CU); // 100 to 109
else if (b >= 0x16U && b <= 0x6BU) else if (b >= 0x26U && b <= 0x6BU)
lon_deg = 110U + (b - 0x16U); // 110 to 179 lon_deg = 110U + (b - 0x26U); // 110 to 179
else else
return; // error/unknown return; // error/unknown
} else if (b == 0x30U) { } else if (b == 0x30U) {

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2016 by Jonathan Naylor G4KLX * Copyright (C) 2016,2017 by Jonathan Naylor G4KLX
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -28,7 +28,7 @@ public:
CGPS(const std::string& callsign, const std::string& suffix, const std::string& password, const std::string& address, unsigned int port); CGPS(const std::string& callsign, const std::string& suffix, const std::string& password, const std::string& address, unsigned int port);
~CGPS(); ~CGPS();
void setInfo(unsigned int txFrequency, unsigned int rxFrequency, float latitude, float longitude, int height); void setInfo(unsigned int txFrequency, unsigned int rxFrequency, float latitude, float longitude, int height, const std::string& desc);
bool open(); bool open();

@ -4,7 +4,7 @@ CFLAGS = -g -O3 -Wall -std=c++0x -pthread
LIBS = -lm -lpthread LIBS = -lm -lpthread
LDFLAGS = -g LDFLAGS = -g
OBJECTS = APRSWriterThread.o APRSWriter.o Conf.o CRC.o Golay24128.o GPS.o Log.o Network.o Reflectors.o StopWatch.o Sync.o TCPSocket.o Thread.o Timer.o \ OBJECTS = APRSWriterThread.o APRSWriter.o Conf.o CRC.o DTMF.o Golay24128.o GPS.o Log.o Network.o Reflectors.o StopWatch.o Sync.o TCPSocket.o Thread.o Timer.o \
UDPSocket.o Utils.o WiresX.o YSFConvolution.o YSFFICH.o YSFGateway.o YSFPayload.o UDPSocket.o Utils.o WiresX.o YSFConvolution.o YSFFICH.o YSFGateway.o YSFPayload.o
all: YSFGateway all: YSFGateway

@ -4,7 +4,7 @@ CFLAGS = -g -O3 -Wall -std=c++0x -pthread
LIBS = -lm -lpthread -lsocket LIBS = -lm -lpthread -lsocket
LDFLAGS = -g LDFLAGS = -g
OBJECTS = APRSWriterThread.o APRSWriter.o Conf.o CRC.o Golay24128.o GPS.o Log.o Network.o Reflectors.o StopWatch.o Sync.o TCPSocket.o Thread.o Timer.o \ OBJECTS = APRSWriterThread.o APRSWriter.o Conf.o CRC.o DTMF.o Golay24128.o GPS.o Log.o Network.o Reflectors.o StopWatch.o Sync.o TCPSocket.o Thread.o Timer.o \
UDPSocket.o Utils.o WiresX.o YSFConvolution.o YSFFICH.o YSFGateway.o YSFPayload.o UDPSocket.o Utils.o WiresX.o YSFConvolution.o YSFFICH.o YSFGateway.o YSFPayload.o
all: YSFGateway all: YSFGateway

@ -93,7 +93,7 @@ void CNetwork::setDestination(const in_addr& address, unsigned int port)
m_port = port; m_port = port;
} }
void CNetwork::setDestination() void CNetwork::clearDestination()
{ {
m_address.s_addr = INADDR_NONE; m_address.s_addr = INADDR_NONE;
m_port = 0U; m_port = 0U;

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2009-2014,2016 by Jonathan Naylor G4KLX * Copyright (C) 2009-2014,2016,2017 by Jonathan Naylor G4KLX
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -35,7 +35,7 @@ public:
bool open(); bool open();
void setDestination(const in_addr& address, unsigned int port); void setDestination(const in_addr& address, unsigned int port);
void setDestination(); void clearDestination();
bool write(const unsigned char* data); bool write(const unsigned char* data);

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2016 by Jonathan Naylor G4KLX * Copyright (C) 2016,2017 by Jonathan Naylor G4KLX
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -30,7 +30,8 @@ CReflectors::CReflectors(const std::string& hostsFile, unsigned int reloadTime)
m_hostsFile(hostsFile), m_hostsFile(hostsFile),
m_parrotAddress(), m_parrotAddress(),
m_parrotPort(0U), m_parrotPort(0U),
m_reflectors(), m_newReflectors(),
m_currReflectors(),
m_search(), m_search(),
m_timer(1000U, reloadTime * 60U) m_timer(1000U, reloadTime * 60U)
{ {
@ -40,10 +41,14 @@ m_timer(1000U, reloadTime * 60U)
CReflectors::~CReflectors() CReflectors::~CReflectors()
{ {
for (std::vector<CYSFReflector*>::iterator it = m_reflectors.begin(); it != m_reflectors.end(); ++it) for (std::vector<CYSFReflector*>::iterator it = m_newReflectors.begin(); it != m_newReflectors.end(); ++it)
delete *it; delete *it;
m_reflectors.clear(); for (std::vector<CYSFReflector*>::iterator it = m_currReflectors.begin(); it != m_currReflectors.end(); ++it)
delete *it;
m_newReflectors.clear();
m_currReflectors.clear();
} }
static bool refComparison(const CYSFReflector* r1, const CYSFReflector* r2) static bool refComparison(const CYSFReflector* r1, const CYSFReflector* r2)
@ -71,11 +76,10 @@ void CReflectors::setParrot(const std::string& address, unsigned int port)
bool CReflectors::load() bool CReflectors::load()
{ {
// Clear out the old reflector list for (std::vector<CYSFReflector*>::iterator it = m_newReflectors.begin(); it != m_newReflectors.end(); ++it)
for (std::vector<CYSFReflector*>::iterator it = m_reflectors.begin(); it != m_reflectors.end(); ++it)
delete *it; delete *it;
m_reflectors.clear(); m_newReflectors.clear();
FILE* fp = ::fopen(m_hostsFile.c_str(), "rt"); FILE* fp = ::fopen(m_hostsFile.c_str(), "rt");
if (fp != NULL) { if (fp != NULL) {
@ -107,7 +111,7 @@ bool CReflectors::load()
refl->m_name.resize(16U, ' '); refl->m_name.resize(16U, ' ');
refl->m_desc.resize(14U, ' '); refl->m_desc.resize(14U, ' ');
m_reflectors.push_back(refl); m_newReflectors.push_back(refl);
} }
} }
} }
@ -115,7 +119,7 @@ bool CReflectors::load()
::fclose(fp); ::fclose(fp);
} }
size_t size = m_reflectors.size(); size_t size = m_newReflectors.size();
LogInfo("Loaded %u YSF reflectors", size); LogInfo("Loaded %u YSF reflectors", size);
// Add the Parrot entry // Add the Parrot entry
@ -127,22 +131,22 @@ bool CReflectors::load()
refl->m_address = CUDPSocket::lookup(m_parrotAddress); refl->m_address = CUDPSocket::lookup(m_parrotAddress);
refl->m_port = m_parrotPort; refl->m_port = m_parrotPort;
refl->m_count = "000"; refl->m_count = "000";
m_reflectors.push_back(refl); m_newReflectors.push_back(refl);
LogInfo("Loaded YSF parrot"); LogInfo("Loaded YSF parrot");
} }
size = m_reflectors.size(); size = m_newReflectors.size();
if (size == 0U) if (size == 0U)
return false; return false;
std::sort(m_reflectors.begin(), m_reflectors.end(), refComparison); std::sort(m_newReflectors.begin(), m_newReflectors.end(), refComparison);
return true; return true;
} }
CYSFReflector* CReflectors::find(const std::string& id) CYSFReflector* CReflectors::find(const std::string& id)
{ {
for (std::vector<CYSFReflector*>::iterator it = m_reflectors.begin(); it != m_reflectors.end(); ++it) { for (std::vector<CYSFReflector*>::iterator it = m_currReflectors.begin(); it != m_currReflectors.end(); ++it) {
if (id == (*it)->m_id) if (id == (*it)->m_id)
return *it; return *it;
} }
@ -154,7 +158,7 @@ CYSFReflector* CReflectors::find(const std::string& id)
std::vector<CYSFReflector*>& CReflectors::current() std::vector<CYSFReflector*>& CReflectors::current()
{ {
return m_reflectors; return m_currReflectors;
} }
std::vector<CYSFReflector*>& CReflectors::search(const std::string& name) std::vector<CYSFReflector*>& CReflectors::search(const std::string& name)
@ -167,7 +171,7 @@ std::vector<CYSFReflector*>& CReflectors::search(const std::string& name)
unsigned int len = trimmed.size(); unsigned int len = trimmed.size();
for (std::vector<CYSFReflector*>::iterator it = m_reflectors.begin(); it != m_reflectors.end(); ++it) { for (std::vector<CYSFReflector*>::iterator it = m_currReflectors.begin(); it != m_currReflectors.end(); ++it) {
std::string reflector = (*it)->m_name; std::string reflector = (*it)->m_name;
reflector.erase(std::find_if(reflector.rbegin(), reflector.rend(), std::not1(std::ptr_fun<int, int>(std::isspace))).base(), reflector.end()); reflector.erase(std::find_if(reflector.rbegin(), reflector.rend(), std::not1(std::ptr_fun<int, int>(std::isspace))).base(), reflector.end());
std::transform(reflector.begin(), reflector.end(), reflector.begin(), ::toupper); std::transform(reflector.begin(), reflector.end(), reflector.begin(), ::toupper);
@ -181,6 +185,23 @@ std::vector<CYSFReflector*>& CReflectors::search(const std::string& name)
return m_search; return m_search;
} }
bool CReflectors::reload()
{
if (m_newReflectors.empty())
return false;
for (std::vector<CYSFReflector*>::iterator it = m_currReflectors.begin(); it != m_currReflectors.end(); ++it)
delete *it;
m_currReflectors.clear();
m_currReflectors = m_newReflectors;
m_newReflectors.clear();
return true;
}
void CReflectors::clock(unsigned int ms) void CReflectors::clock(unsigned int ms)
{ {
m_timer.clock(ms); m_timer.clock(ms);

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2016 by Jonathan Naylor G4KLX * Copyright (C) 2016,2017 by Jonathan Naylor G4KLX
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -60,13 +60,16 @@ public:
std::vector<CYSFReflector*>& search(const std::string& name); std::vector<CYSFReflector*>& search(const std::string& name);
bool reload();
void clock(unsigned int ms); void clock(unsigned int ms);
private: private:
std::string m_hostsFile; std::string m_hostsFile;
std::string m_parrotAddress; std::string m_parrotAddress;
unsigned int m_parrotPort; unsigned int m_parrotPort;
std::vector<CYSFReflector*> m_reflectors; std::vector<CYSFReflector*> m_newReflectors;
std::vector<CYSFReflector*> m_currReflectors;
std::vector<CYSFReflector*> m_search; std::vector<CYSFReflector*> m_search;
CTimer m_timer; CTimer m_timer;
}; };

@ -19,6 +19,6 @@
#if !defined(VERSION_H) #if !defined(VERSION_H)
#define VERSION_H #define VERSION_H
const char* VERSION = "20170318"; const char* VERSION = "20170719";
#endif #endif

@ -53,7 +53,7 @@ m_name(),
m_command(NULL), m_command(NULL),
m_txFrequency(0U), m_txFrequency(0U),
m_rxFrequency(0U), m_rxFrequency(0U),
m_timer(1000U, 2U), m_timer(1000U, 1U),
m_seqNo(0U), m_seqNo(0U),
m_header(NULL), m_header(NULL),
m_csd1(NULL), m_csd1(NULL),
@ -154,7 +154,13 @@ void CWiresX::setParrot(const std::string& address, unsigned int port)
bool CWiresX::start() bool CWiresX::start()
{ {
return m_reflectors.load(); bool ret = m_reflectors.load();
if (!ret)
return false;
m_reflectors.reload();
return true;
} }
WX_STATUS CWiresX::process(const unsigned char* data, const unsigned char* source, unsigned char fi, unsigned char dt, unsigned char fn, unsigned char ft) WX_STATUS CWiresX::process(const unsigned char* data, const unsigned char* source, unsigned char fi, unsigned char dt, unsigned char fn, unsigned char ft)
@ -286,9 +292,18 @@ WX_STATUS CWiresX::processConnect(const unsigned char* source, const unsigned ch
return WXS_CONNECT; return WXS_CONNECT;
} }
void CWiresX::processConnect(CYSFReflector* reflector)
{
m_reflector = reflector;
m_status = WXSI_CONNECT;
m_timer.start();
}
void CWiresX::processDisconnect(const unsigned char* source) void CWiresX::processDisconnect(const unsigned char* source)
{ {
::LogDebug("Received Disconect from %10.10s", source); if (source != NULL)
::LogDebug("Received Disconect from %10.10s", source);
m_reflector = NULL; m_reflector = NULL;
@ -496,13 +511,13 @@ void CWiresX::sendDXReply()
for (unsigned int i = 0U; i < 5U; i++) for (unsigned int i = 0U; i < 5U; i++)
data[i + 36U] = m_reflector->m_id.at(i); data[i + 36U] = m_reflector->m_id.at(i);
for (unsigned int i = 0U; i < 16U && i < m_reflector->m_name.size(); i++) for (unsigned int i = 0U; i < 16U; i++)
data[i + 41U] = m_reflector->m_name.at(i); data[i + 41U] = m_reflector->m_name.at(i);
for (unsigned int i = 0U; i < 3U; i++) for (unsigned int i = 0U; i < 3U; i++)
data[i + 57U] = m_reflector->m_count.at(i); data[i + 57U] = m_reflector->m_count.at(i);
for (unsigned int i = 0U; i < 14U && i < m_reflector->m_desc.size(); i++) for (unsigned int i = 0U; i < 14U; i++)
data[i + 70U] = m_reflector->m_desc.at(i); data[i + 70U] = m_reflector->m_desc.at(i);
} }
@ -563,13 +578,13 @@ void CWiresX::sendConnectReply()
for (unsigned int i = 0U; i < 5U; i++) for (unsigned int i = 0U; i < 5U; i++)
data[i + 36U] = m_reflector->m_id.at(i); data[i + 36U] = m_reflector->m_id.at(i);
for (unsigned int i = 0U; i < 16U && i < m_reflector->m_name.size(); i++) for (unsigned int i = 0U; i < 16U; i++)
data[i + 41U] = m_reflector->m_name.at(i); data[i + 41U] = m_reflector->m_name.at(i);
for (unsigned int i = 0U; i < 3U; i++) for (unsigned int i = 0U; i < 3U; i++)
data[i + 57U] = m_reflector->m_count.at(i); data[i + 57U] = m_reflector->m_count.at(i);
for (unsigned int i = 0U; i < 14U && i < m_reflector->m_desc.size(); i++) for (unsigned int i = 0U; i < 14U; i++)
data[i + 70U] = m_reflector->m_desc.at(i); data[i + 70U] = m_reflector->m_desc.at(i);
data[84U] = '0'; data[84U] = '0';
@ -627,6 +642,9 @@ void CWiresX::sendDisconnectReply()
void CWiresX::sendAllReply() void CWiresX::sendAllReply()
{ {
if (m_start == 0U)
m_reflectors.reload();
std::vector<CYSFReflector*>& curr = m_reflectors.current(); std::vector<CYSFReflector*>& curr = m_reflectors.current();
unsigned char data[1100U]; unsigned char data[1100U];
@ -667,7 +685,7 @@ void CWiresX::sendAllReply()
for (unsigned int i = 0U; i < 5U; i++) for (unsigned int i = 0U; i < 5U; i++)
data[i + offset + 1U] = refl->m_id.at(i); data[i + offset + 1U] = refl->m_id.at(i);
for (unsigned int i = 0U; i < 16U && i < refl->m_name.size(); i++) for (unsigned int i = 0U; i < 16U; i++)
data[i + offset + 6U] = refl->m_name.at(i); data[i + offset + 6U] = refl->m_name.at(i);
for (unsigned int i = 0U; i < 3U; i++) for (unsigned int i = 0U; i < 3U; i++)
@ -676,7 +694,7 @@ void CWiresX::sendAllReply()
for (unsigned int i = 0U; i < 10U; i++) for (unsigned int i = 0U; i < 10U; i++)
data[i + offset + 25U] = ' '; data[i + offset + 25U] = ' ';
for (unsigned int i = 0U; i < 14U && i < refl->m_desc.size(); i++) for (unsigned int i = 0U; i < 14U; i++)
data[i + offset + 35U] = refl->m_desc.at(i); data[i + offset + 35U] = refl->m_desc.at(i);
data[offset + 49U] = 0x0DU; data[offset + 49U] = 0x0DU;
@ -751,7 +769,7 @@ void CWiresX::sendSearchReply()
for (unsigned int i = 0U; i < 5U; i++) for (unsigned int i = 0U; i < 5U; i++)
data[i + offset + 1U] = refl->m_id.at(i); data[i + offset + 1U] = refl->m_id.at(i);
for (unsigned int i = 0U; i < 16U && i < refl->m_name.size(); i++) for (unsigned int i = 0U; i < 16U; i++)
data[i + offset + 6U] = refl->m_name.at(i); data[i + offset + 6U] = refl->m_name.at(i);
for (unsigned int i = 0U; i < 3U; i++) for (unsigned int i = 0U; i < 3U; i++)
@ -760,7 +778,7 @@ void CWiresX::sendSearchReply()
for (unsigned int i = 0U; i < 10U; i++) for (unsigned int i = 0U; i < 10U; i++)
data[i + offset + 25U] = ' '; data[i + offset + 25U] = ' ';
for (unsigned int i = 0U; i < 14U && i < refl->m_desc.size(); i++) for (unsigned int i = 0U; i < 14U; i++)
data[i + offset + 35U] = refl->m_desc.at(i); data[i + offset + 35U] = refl->m_desc.at(i);
data[offset + 49U] = 0x0DU; data[offset + 49U] = 0x0DU;

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2016 by Jonathan Naylor G4KLX * Copyright (C) 2016,2017 by Jonathan Naylor G4KLX
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -55,6 +55,9 @@ public:
CYSFReflector* getReflector() const; CYSFReflector* getReflector() const;
CYSFReflector* getReflector(const std::string& id); CYSFReflector* getReflector(const std::string& id);
void processConnect(CYSFReflector* reflector);
void processDisconnect(const unsigned char* source = NULL);
void clock(unsigned int ms); void clock(unsigned int ms);
private: private:
@ -79,7 +82,6 @@ private:
std::string m_search; std::string m_search;
WX_STATUS processConnect(const unsigned char* source, const unsigned char* data); WX_STATUS processConnect(const unsigned char* source, const unsigned char* data);
void processDisconnect(const unsigned char* source);
void processDX(const unsigned char* source); void processDX(const unsigned char* source);
void processAll(const unsigned char* source, const unsigned char* data); void processAll(const unsigned char* source, const unsigned char* data);

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2015,2016 by Jonathan Naylor G4KLX * Copyright (C) 2015,2016,2017 by Jonathan Naylor G4KLX
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -40,7 +40,8 @@ const unsigned char YSF_DT_DATA_FR_MODE = 0x01U;
const unsigned char YSF_DT_VD_MODE2 = 0x02U; const unsigned char YSF_DT_VD_MODE2 = 0x02U;
const unsigned char YSF_DT_VOICE_FR_MODE = 0x03U; const unsigned char YSF_DT_VOICE_FR_MODE = 0x03U;
const unsigned char YSF_CM_GROUP = 0x00U; const unsigned char YSF_CM_GROUP1 = 0x00U;
const unsigned char YSF_CM_GROUP2 = 0x01U;
const unsigned char YSF_CM_INDIVIDUAL = 0x03U; const unsigned char YSF_CM_INDIVIDUAL = 0x03U;
const unsigned char YSF_MR_NOT_BUSY = 0x01U; const unsigned char YSF_MR_NOT_BUSY = 0x01U;

@ -80,6 +80,7 @@ m_suffix(),
m_conf(configFile), m_conf(configFile),
m_gps(NULL), m_gps(NULL),
m_wiresX(NULL), m_wiresX(NULL),
m_dtmf(NULL),
m_netNetwork(NULL), m_netNetwork(NULL),
m_linked(false), m_linked(false),
m_exclude(false) m_exclude(false)
@ -197,12 +198,16 @@ int CYSFGateway::run()
CTimer lostTimer(1000U, 120U); CTimer lostTimer(1000U, 120U);
CTimer pollTimer(1000U, 5U); CTimer pollTimer(1000U, 5U);
bool revert = m_conf.getNetworkRevert();
std::string startup = m_conf.getNetworkStartup();
bool networkEnabled = m_conf.getNetworkEnabled(); bool networkEnabled = m_conf.getNetworkEnabled();
if (networkEnabled) { if (networkEnabled) {
std::string fileName = m_conf.getNetworkHosts(); std::string fileName = m_conf.getNetworkHosts();
unsigned int reloadTime = m_conf.getNetworkReloadTime(); unsigned int reloadTime = m_conf.getNetworkReloadTime();
m_wiresX = new CWiresX(m_callsign, m_suffix, &rptNetwork, fileName, reloadTime); m_wiresX = new CWiresX(m_callsign, m_suffix, &rptNetwork, fileName, reloadTime);
m_dtmf = new CDTMF;
std::string name = m_conf.getName(); std::string name = m_conf.getName();
unsigned int txFrequency = m_conf.getTxFrequency(); unsigned int txFrequency = m_conf.getTxFrequency();
@ -218,18 +223,19 @@ int CYSFGateway::run()
m_wiresX->start(); m_wiresX->start();
std::string startup = m_conf.getNetworkStartup();
if (!startup.empty()) { if (!startup.empty()) {
CYSFReflector* reflector = m_wiresX->getReflector(startup); CYSFReflector* reflector = m_wiresX->getReflector(startup);
if (reflector != NULL) { if (reflector != NULL) {
LogMessage("Automatic connection to %5.5s", reflector->m_id.c_str()); LogMessage("Automatic connection to %5.5s - \"%s\"", reflector->m_id.c_str(), reflector->m_name.c_str());
m_netNetwork->setDestination(reflector->m_address, reflector->m_port); m_netNetwork->setDestination(reflector->m_address, reflector->m_port);
m_netNetwork->writePoll(); m_netNetwork->writePoll();
m_netNetwork->writePoll(); m_netNetwork->writePoll();
m_netNetwork->writePoll(); m_netNetwork->writePoll();
inactivityTimer.start(); if (!revert)
inactivityTimer.start();
lostTimer.start(); lostTimer.start();
pollTimer.start(); pollTimer.start();
@ -269,7 +275,7 @@ int CYSFGateway::run()
m_netNetwork->writeUnlink(); m_netNetwork->writeUnlink();
CYSFReflector* reflector = m_wiresX->getReflector(); CYSFReflector* reflector = m_wiresX->getReflector();
LogMessage("Connect to %5.5s has been requested by %10.10s", reflector->m_id.c_str(), buffer + 14U); LogMessage("Connect to %5.5s - \"%s\" has been requested by %10.10s", reflector->m_id.c_str(), reflector->m_name.c_str(), buffer + 14U);
m_netNetwork->setDestination(reflector->m_address, reflector->m_port); m_netNetwork->setDestination(reflector->m_address, reflector->m_port);
m_netNetwork->writePoll(); m_netNetwork->writePoll();
@ -289,7 +295,7 @@ int CYSFGateway::run()
m_netNetwork->writeUnlink(); m_netNetwork->writeUnlink();
m_netNetwork->writeUnlink(); m_netNetwork->writeUnlink();
m_netNetwork->writeUnlink(); m_netNetwork->writeUnlink();
m_netNetwork->setDestination(); m_netNetwork->clearDestination();
inactivityTimer.stop(); inactivityTimer.stop();
lostTimer.stop(); lostTimer.stop();
@ -300,6 +306,65 @@ int CYSFGateway::run()
default: default:
break; break;
} }
status = WXS_NONE;
switch (dt) {
case YSF_DT_VD_MODE2:
status = m_dtmf->decodeVDMode2(buffer + 35U, (buffer[34U] & 0x01U) == 0x01U);
break;
default:
break;
}
switch (status) {
case WXS_CONNECT: {
std::string id = m_dtmf->getReflector();
CYSFReflector* reflector = m_wiresX->getReflector(id);
if (reflector != NULL) {
m_wiresX->processConnect(reflector);
if (m_linked) {
m_netNetwork->writeUnlink();
m_netNetwork->writeUnlink();
m_netNetwork->writeUnlink();
}
LogMessage("Connect via DTMF to %5.5s - \"%s\" has been requested by %10.10s", reflector->m_id.c_str(), reflector->m_name.c_str(), buffer + 14U);
m_netNetwork->setDestination(reflector->m_address, reflector->m_port);
m_netNetwork->writePoll();
m_netNetwork->writePoll();
m_netNetwork->writePoll();
inactivityTimer.start();
lostTimer.start();
pollTimer.start();
m_linked = true;
}
}
break;
case WXS_DISCONNECT:
if (m_linked) {
m_wiresX->processDisconnect();
LogMessage("Disconnect via DTMF has been requested by %10.10s", buffer + 14U);
m_netNetwork->writeUnlink();
m_netNetwork->writeUnlink();
m_netNetwork->writeUnlink();
m_netNetwork->clearDestination();
inactivityTimer.stop();
lostTimer.stop();
pollTimer.stop();
m_linked = false;
}
break;
default:
break;
}
} }
if (m_gps != NULL) if (m_gps != NULL)
@ -315,6 +380,8 @@ int CYSFGateway::run()
if ((buffer[34U] & 0x01U) == 0x01U) { if ((buffer[34U] & 0x01U) == 0x01U) {
if (m_gps != NULL) if (m_gps != NULL)
m_gps->reset(); m_gps->reset();
if (m_dtmf != NULL)
m_dtmf->reset();
m_exclude = false; m_exclude = false;
} }
} }
@ -342,17 +409,42 @@ int CYSFGateway::run()
inactivityTimer.clock(ms); inactivityTimer.clock(ms);
if (inactivityTimer.isRunning() && inactivityTimer.hasExpired()) { if (inactivityTimer.isRunning() && inactivityTimer.hasExpired()) {
if (m_linked) { if (m_linked) {
LogMessage("Disconnecting due to inactivity"); CYSFReflector* reflector = NULL;
if (revert && !startup.empty() && m_wiresX != NULL)
reflector = m_wiresX->getReflector(startup);
if (reflector != NULL) {
LogMessage("Reverting connection to %5.5s - \"%s\"", reflector->m_id.c_str(), reflector->m_name.c_str());
m_wiresX->processConnect(reflector);
m_netNetwork->writeUnlink();
m_netNetwork->writeUnlink();
m_netNetwork->writeUnlink();
m_netNetwork->setDestination(reflector->m_address, reflector->m_port);
m_netNetwork->writePoll();
m_netNetwork->writePoll();
m_netNetwork->writePoll();
lostTimer.start();
pollTimer.start();
} else {
LogMessage("Disconnecting due to inactivity");
m_netNetwork->writeUnlink(); if (m_wiresX != NULL)
m_netNetwork->writeUnlink(); m_wiresX->processDisconnect();
m_netNetwork->writeUnlink();
m_netNetwork->setDestination();
lostTimer.stop(); m_netNetwork->writeUnlink();
pollTimer.stop(); m_netNetwork->writeUnlink();
m_netNetwork->writeUnlink();
m_netNetwork->clearDestination();
m_linked = false; lostTimer.stop();
pollTimer.stop();
m_linked = false;
}
} }
inactivityTimer.stop(); inactivityTimer.stop();
@ -361,10 +453,16 @@ int CYSFGateway::run()
lostTimer.clock(ms); lostTimer.clock(ms);
if (lostTimer.isRunning() && lostTimer.hasExpired()) { if (lostTimer.isRunning() && lostTimer.hasExpired()) {
LogWarning("Link has failed, polls lost"); LogWarning("Link has failed, polls lost");
m_netNetwork->setDestination();
if (m_wiresX != NULL)
m_wiresX->processDisconnect();
m_netNetwork->clearDestination();
inactivityTimer.stop(); inactivityTimer.stop();
lostTimer.stop(); lostTimer.stop();
pollTimer.stop(); pollTimer.stop();
m_linked = false; m_linked = false;
} }
@ -388,6 +486,7 @@ int CYSFGateway::run()
delete m_netNetwork; delete m_netNetwork;
delete m_wiresX; delete m_wiresX;
delete m_dtmf;
::LogFinalise(); ::LogFinalise();
@ -402,6 +501,7 @@ void CYSFGateway::createGPS()
std::string hostname = m_conf.getAPRSServer(); std::string hostname = m_conf.getAPRSServer();
unsigned int port = m_conf.getAPRSPort(); unsigned int port = m_conf.getAPRSPort();
std::string password = m_conf.getAPRSPassword(); std::string password = m_conf.getAPRSPassword();
std::string desc = m_conf.getAPRSDescription();
m_gps = new CGPS(m_callsign, m_suffix, password, hostname, port); m_gps = new CGPS(m_callsign, m_suffix, password, hostname, port);
@ -411,7 +511,7 @@ void CYSFGateway::createGPS()
float longitude = m_conf.getLongitude(); float longitude = m_conf.getLongitude();
int height = m_conf.getHeight(); int height = m_conf.getHeight();
m_gps->setInfo(txFrequency, rxFrequency, latitude, longitude, height); m_gps->setInfo(txFrequency, rxFrequency, latitude, longitude, height, desc);
bool ret = m_gps->open(); bool ret = m_gps->open();
if (!ret) { if (!ret) {

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2016 by Jonathan Naylor G4KLX * Copyright (C) 2016,2017 by Jonathan Naylor G4KLX
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -22,6 +22,7 @@
#include "Network.h" #include "Network.h"
#include "WiresX.h" #include "WiresX.h"
#include "Conf.h" #include "Conf.h"
#include "DTMF.h"
#include "GPS.h" #include "GPS.h"
#include <string> #include <string>
@ -40,6 +41,7 @@ private:
CConf m_conf; CConf m_conf;
CGPS* m_gps; CGPS* m_gps;
CWiresX* m_wiresX; CWiresX* m_wiresX;
CDTMF* m_dtmf;
CNetwork* m_netNetwork; CNetwork* m_netNetwork;
bool m_linked; bool m_linked;
bool m_exclude; bool m_exclude;

@ -31,6 +31,7 @@ Enable=0
Server=euro.aprs2.net Server=euro.aprs2.net
Port=14580 Port=14580
Password=9999 Password=9999
Description=APRS Description
[Network] [Network]
Enable=1 Enable=1
@ -38,7 +39,8 @@ Port=42000
Hosts=./YSFHosts.txt Hosts=./YSFHosts.txt
ReloadTime=60 ReloadTime=60
ParrotAddress=127.0.0.1 ParrotAddress=127.0.0.1
ParrotPort=42000 ParrotPort=42012
# Startup= # Startup=
InactivityTimeout=10 InactivityTimeout=10
# Revert=0
Debug=0 Debug=0

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations"> <ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32"> <ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration> <Configuration>Debug</Configuration>
@ -22,32 +22,32 @@
<ProjectGuid>{4F82857B-D2CC-48DC-91A8-6275BDD3081B}</ProjectGuid> <ProjectGuid>{4F82857B-D2CC-48DC-91A8-6275BDD3081B}</ProjectGuid>
<Keyword>Win32Proj</Keyword> <Keyword>Win32Proj</Keyword>
<RootNamespace>YSFGateway</RootNamespace> <RootNamespace>YSFGateway</RootNamespace>
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion> <WindowsTargetPlatformVersion>10.0.15063.0</WindowsTargetPlatformVersion>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries> <UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v140</PlatformToolset> <PlatformToolset>v141</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries> <UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v140</PlatformToolset> <PlatformToolset>v141</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries> <UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v140</PlatformToolset> <PlatformToolset>v141</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries> <UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v140</PlatformToolset> <PlatformToolset>v141</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
@ -150,6 +150,7 @@
<ClInclude Include="APRSWriterThread.h" /> <ClInclude Include="APRSWriterThread.h" />
<ClInclude Include="Conf.h" /> <ClInclude Include="Conf.h" />
<ClInclude Include="CRC.h" /> <ClInclude Include="CRC.h" />
<ClInclude Include="DTMF.h" />
<ClInclude Include="Golay24128.h" /> <ClInclude Include="Golay24128.h" />
<ClInclude Include="GPS.h" /> <ClInclude Include="GPS.h" />
<ClInclude Include="Log.h" /> <ClInclude Include="Log.h" />
@ -176,6 +177,7 @@
<ClCompile Include="APRSWriterThread.cpp" /> <ClCompile Include="APRSWriterThread.cpp" />
<ClCompile Include="Conf.cpp" /> <ClCompile Include="Conf.cpp" />
<ClCompile Include="CRC.cpp" /> <ClCompile Include="CRC.cpp" />
<ClCompile Include="DTMF.cpp" />
<ClCompile Include="Golay24128.cpp" /> <ClCompile Include="Golay24128.cpp" />
<ClCompile Include="GPS.cpp" /> <ClCompile Include="GPS.cpp" />
<ClCompile Include="Log.cpp" /> <ClCompile Include="Log.cpp" />

@ -83,6 +83,9 @@
<ClInclude Include="APRSWriter.h"> <ClInclude Include="APRSWriter.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="DTMF.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="Network.cpp"> <ClCompile Include="Network.cpp">
@ -148,5 +151,8 @@
<ClCompile Include="APRSWriter.cpp"> <ClCompile Include="APRSWriter.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="DTMF.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
</Project> </Project>

@ -1,74 +1,165 @@
74652;119-YSF;119-C4FM;210.178.113.106;42000;002 65702;0 OE-Austria;Official;94.199.172.148;42000;001
77889;Alabama Link;Alabama Link;199.119.98.174;42000;008 88236;1004 DMR;DRM C4FM CROSS;210.178.113.173;42000;000
25223;AT Austria OE1;OE1PHS;77.117.76.174;42000;000 74652;119-YSF;TG45004 XLX170;125.129.207.86;42000;002
44853;AT OE-Austria;Digitalforce;194.208.150.205;42000;002 89803;A.O.T. Roma;OndaTelematica;31.14.140.230;42000;000
25575;BM TG-2148;BM TG-2148;85.214.119.76;42108;001 02034;Alabama-Link;Alabama-Link;199.119.98.174;42000;029
85044;C4FM-SEOUL;C4FM DMR;210.178.113.45;42000;004 64230;America-RC;YSF-TO-WIRES-X;71.209.204.22;42000;006
77353;CA Canada;C4FM Ontario;76.64.129.159;42100;003 38654;ARGENTINA;C4FM Team;212.237.3.87;42000;005
59330;ARRGUS Array;Florida USA;96.94.7.200;42000;000
42586;ARRGUS_ArrayN;Back up server;64.137.194.85;42000;000
25223;AT Austria OE1;OE1PHS;77.117.224.174;42000;002
00396;AT Austria OE3;OE3AAS;77.118.186.2;42100;001
55693;AT C4FM Austria;YSF;89.185.97.38;42000;008
04201;AU YSF001;1st WW YSF;104.167.114.230;42000;012
93760;BE YSF-Vlaandere;C4FM Vlaandere;81.95.126.168;42000;004
79520;BE YSF-Wallonie;C4FM Wallon;51.255.193.63;42000;004
67661;BG Bulgaria;Sysop: LZ1LCD;95.43.222.149;42000;000
47573;BM-EA-TG914;BM-EA-TG914;104.223.70.166;42000;003
14341;BM-TG-208;BrMstr TG208;51.254.126.212;42000;002
30745;BM-TG-2080;BrMstr TG2080;51.254.126.212;42080;001
00872;BM-TG-20820;BrMstr TG20820;51.254.126.212;42020;001
52846;BM-TG-20859;BrMstr TG20859;51.254.126.212;42059;002
39552;BM-TG-2087;BrMstr TG2087;51.254.126.212;42007;001
93206;BM-TG-2088;BrMstr TG2088;51.254.126.212;42008;001
35402;BM-TG-2089;BrMstr TG2089;51.254.126.212;42009;001
36096;BR YSF724;C4FM - DV Braz;66.55.64.14;42000;002
85044;C4FM-SEOUL;TG45004 XLX170;121.162.91.45;42000;004
77353;CA Canada;C4FM Ontario;144.217.241.23;42100;006
49473;CA QUEBEC;QC FR Fusion;64.34.60.44;42000;000 49473;CA QUEBEC;QC FR Fusion;64.34.60.44;42000;000
52796;CH JOTA;Jota CH;157.161.57.65;42001;000 52796;CH JOTA;Jota CH;157.161.57.65;42001;000
59050;CL CE3FCM;ysfreflector;190.161.179.247;42000;000 59050;CL CE3FCM;ysfreflector;190.161.179.169;42000;000
04523;CT CATALANA;C4FM Catalunya;85.214.119.76;42100;001 80337;CN China #1;C4FM YSF;120.234.41.144;42000;008
30549;CT WIRESCAT;C4FM Catalunya;85.214.119.76;42000;001 82442;CN China #2;C4FM Guangzhou;218.19.147.38;42000;000
26541;CZ Czech;TG2300 DCS019V;80.250.3.114;42000;003 86319;CN China #3;C4FM;123.58.6.137;42002;026
62829;DE Germany;TG26208;213.202.229.15;42000;010 30490;CO 4 KILO MIKE;Antioquia;190.159.68.105;43000;000
10322;DE Germany2;no bridge;213.202.229.15;42001;001 04523;CT CATALANA;C4FM Catalunya;85.214.119.76;42000;000
00561;DVSwitch NA;North America;45.62.252.188;42000;003 30549;CT WIRESCAT;C4FM Catalunya;85.214.119.76;42001;005
98529;ES ED2ZAE;YSF DE EA2RCF;85.214.114.27;42000;000 26541;CZ Czech;TG2300 DCS019V;80.250.3.114;42000;008
62723;ES Wires-X;27187 Wires X;89.40.117.67;42000;006 58770;CZ YSF Praha;YSF CZ;185.32.183.148;42000;000
62659;ES YSF214;C4FM Bizkaia;89.36.214.120;42000;002 80861;DE DL-NORD;AFu-Nord.de;5.45.96.68;42000;000
54919;DE DL-NORDWEST;Nordwest-DL;91.12.55.157;42000;007
62829;DE Germany;TG26208;213.202.229.15;42000;031
10322;DE Germany2;no bridge;213.202.229.15;42001;000
92469;DE Hessen;SysOP:DL5RFK;193.70.38.68;42000;001
74154;DE PEGASUS;dl0bza.de;78.46.11.65;42000;014
20548;DE PEGASUS2;dl0bza.de;78.46.11.65;42001;000
55966;DE Thueringen;Thueringen;37.26.200.222;42000;001
94179;Digiland;Italia;212.227.203.37;42000;000
68785;Digiland_2;Italia;185.206.147.131;42000;000
68899;Digiland_3;Italia;85.217.170.178;42000;000
00561;DVSwitch NA;North America;44.103.32.18;42000;000
94533;EA Distrito 1;Wires X Spain;104.223.72.8;42000;000
42493;EA Distrito 2;EDT;185.47.129.230;42000;002
42493;EA Distrito 2;EDT;185.47.129.230;42000;002
48495;EA Distrito 3;Wires X Spain;89.38.150.252;42000;000
62980;EA Distrito 4;REM SPAIN;212.237.0.67;42000;001
39908;EA Distrito 5;YSF EALINK;216.86.147.198;42000;000
58314;EA Distrito 7;RC Veleta;212.237.11.53;42000;001
31236;EA DMR+;DMR+ 4370;198.96.90.144;42000;000
37172;EA Sevilla;Prov Sevilla;204.44.93.190;42000;003
01439;EMCOM SPAIN;Emergency;212.237.17.133;42000;000
32027;ES ADER;ASSOCIACIO;80.211.226.198;42000;003
98529;ES ED2ZAE;Multiporpouse;94.177.237.192;42000;001
15642;ES REM SPAIN;REM YSF REF;95.39.166.7;42000;000
60318;ES Wires X;WIRES X SPAIN;80.211.236.189;42000;015
62659;ES YSF214;C4FM Net;89.36.214.120;42000;000
08054;FON-Gateway;AllModes-GW;185.109.201.81;42000;001 08054;FON-Gateway;AllModes-GW;185.109.201.81;42000;001
60284;FR YSF-Alsace;ALS(F) ROOM;91.121.136.94;42000;000 60786;FR F1ZLJ (95);Val dOise-ARAM;82.236.81.19;42000;002
91991;FR YSF-BM937;Brandmeister93;51.254.133.61;42000;001 86886;FR Room-ZIT;Room F1ZIT;151.80.143.185;42002;008
58617;FR YSF-France;Fusion France;87.98.132.205;42000;022 39510;FR wiresxfrance;Wires-X-France;151.80.143.185;42000;000
34264;FR YSF-Urgences;Fusion France;87.98.132.205;42020;002 83665;FR YSF-Alpes;Rhone-Alpes;217.182.66.229;42000;000
33751;FUSION-ITALY;Italy YSFR;91.134.133.255;42000;000 60284;FR YSF-Alsace;ALS(F) ROOM;91.121.136.94;42000;002
35483;FUSION-KOREA;YSF450 KOREA;210.178.113.238;42000;000 19531;FR YSF-Bretagne;Bretagne;78.206.208.208;42000;000
89164;FUSIONBE2;FusionBelgium;81.95.126.168;42000;001 13844;FR YSF-Cappelle;YSF Room F1ZKY;92.188.0.108;42000;002
91767;GB Fusion Kernow;Fusion SW UK;78.146.3.0;43000;004 58617;FR YSF-France;Fusion France;87.98.132.205;42000;023
62928;HBLINK EA5GVK;HBLINK EA5GVK;95.39.140.240;42000;000 91713;FR YSF-Limouzi;C4FM Limousin;88.174.140.210;42000;000
41120;HU Hungary;BM TG2167;213.181.208.141;42100;002 46353;FR YSF-Nord;Nord;79.137.74.24;42000;003
67939;IT C4FM LAZIO;773RadioGroup;93.186.255.126;42000;000 33751;FUSION-ITALY;Italy YSFR;188.213.173.69;42000;001
30483;IT C4FM Lodi;Lombardia;213.45.29.230;42000;001 91767;GB Fusion Kernow;Fusion SW UK;91.121.101.163;43000;002
19437;IT C4FM Piemonte;DSP Italy;94.177.173.53;42000;005 97576;GB N.Ireland;YSF N.Ireland;91.121.101.163;42500;004
67411;IT Zona 4;EmiliaRomagna;212.84.32.29;42000;001 76849;GR YSF202;Fusion Greece;144.76.101.219;42000;006
25383;JP JAPAN;Fusion Japan;202.241.175.133;42000;000 25419;Guatemala;CentOS7;74.208.88.137;42000;003
54889;K4MKH-YSF;K4MKH YSF FL;73.224.178.196;42000;000 47247;HB C4FM Basel;CISAR Basel;212.237.33.114;42000;002
96455;NL Central;Centraal NL;90.145.156.196;42000;001 62928;HBLINK EA5GVK;HBLINK EA5GVK;84.127.124.188;42000;000
85875;NL Fusion Almere;Flevoland;84.86.62.38;42000;020 98367;HK WTT YSF;No bridge;218.255.238.138;42006;004
38627;NL YSF444;Dutch Refl.;85.214.69.145;42000;004 41120;HU Hungary;BM TG2167;213.181.208.141;42100;001
56254;NO YSF006;Norway;80.89.46.242;42000;001 04251;IE YSF Ireland;Fusion <> DMR;87.44.19.111;42000;011
94264;IT C4FM ENNA;HAMRADIOENNA #;94.176.6.45;42000;000
67939;IT C4FM LAZIO;773RadioGroup;93.186.255.126;42000;002
30483;IT C4FM Lodi;Lombardia;79.54.231.198;42000;002
51231;IT C4FM NORD;ITALY-NORD;78.47.154.19;42000;006
19437;IT C4FM Piemonte;DSP Italy;94.177.173.53;42000;004
64159;IT ITALY-FREE;c4fm bridge;37.187.106.175;42000;003
82044;IT YSFROOM-ITALY;WIRES-X ITALY;94.177.187.40;42000;012
67411;IT Zona 4;EmiliaRomagna;212.84.32.29;42000;000
25383;JP JAPAN;Fusion Japan;202.241.175.133;42000;002
96455;NL Central;Centraal NL;90.145.156.196;42000;004
85875;NL Fusion Almere;Flevoland;84.86.62.38;42000;018
73238;NL Noord;test reflector;44.137.87.82;42000;001
63539;NL Oost;test reflector;44.137.87.83;42000;002
73443;NL PI1DAF;Multi Repeater;77.174.30.155;42000;003
66644;NL YSF amprnet;ampr reflector;44.137.33.52;42000;000
38627;NL YSF444;Dutch Refl.;188.68.37.51;42000;003
56254;NO YSF006;Norway;80.89.46.242;42000;009
88973;NZ NZ750;XLX750 NZ;210.55.201.126;42000;002
49480;NZ NZXLX;XLX626;202.137.244.157;42000;002
46031;NZ ZL2VH;ZL2VH YSF;123.255.47.67;42000;002
37761;OklahomaLink;OklahomaLink;70.189.115.214;42000;004
00001;Parrot;Parrot;213.202.229.15;42020;000 00001;Parrot;Parrot;213.202.229.15;42020;000
25393;PL 4280;YSF/DMR/DCS02G;5.226.117.25;42031;000 25393;PL 4280;YSF/DMR/DCS132;94.246.175.66;42031;002
98564;PL EmCom;EmCom TG260023;91.188.125.199;42023;001 98564;PL EmCom;EmCom TG260023;195.26.76.59;42023;001
29114;PL POLAND;POLAND-ROOM;91.188.125.199;42025;006 29114;PL POLAND;POLAND WiresX;94.246.175.66;42025;005
38274;PL Poland 21;DMR TG260021;91.188.125.199;42021;001 38274;PL Poland 21;DMR TG260021;195.26.76.59;42021;001
04463;PL Poland 22;DMR TG260022;91.188.125.199;42022;001 04463;PL Poland 22;DMR TG260022;195.26.76.59;42022;001
78099;PL SR8FWD;Wlodawa WiresX;5.226.117.25;42030;000 55546;PL Silesia;Poland Silesia;188.116.7.66;42001;000
00113;PL SR8LU;Lublin;91.188.125.199;42028;001 11533;PL SR8DMR;RTCN Chotycze;94.246.175.66;42029;001
61506;PL SR8UD;Ustrzyki;5.226.117.25;42032;000 78099;PL SR8FWD;Wlodawa WiresX;94.246.175.66;42030;001
54644;PL SR8UWD;Wlodawa;91.188.125.199;42027;001 91407;PL SR8LUF;Lublin;94.246.175.66;42028;001
80986;PL YSF260;DMR TG260;91.188.125.199;42026;001 61506;PL SR8UD;Ustrzyki;94.246.175.66;42032;000
09948;PT YSF009;C4FM-Portugal;109.71.44.237;42000;001 54644;PL SR8UWD;Wlodawa YSF;94.246.175.66;42027;001
80986;PL YSF260;BM TG260;94.246.175.66;42035;001
09948;PT YSF009;C4FM-Portugal;109.71.44.237;42000;005
89355;R.E.E.C.;R.E.E.C.;5.135.137.65;42000;000
13131;ref.c4fm.se;ref.c4fm.se;176.10.140.161;42000;004 13131;ref.c4fm.se;ref.c4fm.se;176.10.140.161;42000;004
51586;RO YSF DMR;#29065 <-> TG2;77.81.104.26;42005;001 23116;RO MULTIMODE;BM TG2260;94.176.6.37;42005;002
99447;RO YSF226;#99447;77.81.104.26;42000;003 99447;RO YSF226;BM TG226;94.176.6.37;42000;004
40208;SC Scotland;Scottish YSF;13.69.14.204;42000;004 00229;RO YSF<->Wires-X;C4FM Reflector;94.176.6.37;42001;002
73331;SE YSF699;Tekniksnack.se;37.123.186.251;42000;002 40208;SC Scotland;Scottish YSF;13.69.14.204;42000;008
07237;TechTalk24;Engineers talk;91.188.125.199;42024;001 43699;SE SK7ES;SK7ES Fusion;44.140.236.22;42000;000
77010;SE SW-Sweden;C4FM;46.236.122.101;52000;000
07237;TechTalk24;Engineers talk;195.26.76.59;42024;002
43513;TROJMIASTO;Poland Tricity;195.140.190.58;42000;001
30743;TW HAMTALK;C4FM @HAMTALK;118.150.164.96;42000;001 30743;TW HAMTALK;C4FM @HAMTALK;118.150.164.96;42000;001
00325;TW YSF886;C4FM Taiwan;118.163.103.178;42000;000 00325;TW YSF886;C4FM Taiwan;118.163.103.178;42000;000
13201;UK DVMEGA;DVMEGA CHAT;90.145.156.196;42001;009 13201;UK DVMEGA;DVMEGA CHAT;212.237.34.32;42000;013
83087;UK_YSF_BM_UK;UK_Ref_DN_ONLY;91.121.101.163;42000;002 93019;UK DVMEGA SH;DVMEGA CHAT SH;212.237.18.27;42000;002
84105;US East PA;MMDVM System;173.49.20.45;42005;001 83087;UK_YSF_BM_UK;UK_Ref_DN_ONLY;91.121.101.163;42000;018
02912;US Nationwide;United States;174.36.222.36;42000;002 21988;US AggielandLink;Aggieland Link;71.252.210.227;42000;003
53594;US Ohio;Ohio;162.243.74.151;42000;000 22647;US BM TG 31254;Carolina Link;52.3.47.55;42000;005
51512;US BM TG 3137;North Carolina;52.3.47.55;42001;001
74185;US BM-TG3139;DMR-313960-To-;52.54.69.145;42000;003
49235;US CKRG;Central Kansas;198.211.109.207;42000;002
39906;US COLORADO-LINK;Colorado Link;13.78.187.50;42000;006
84105;US East PA;MMDVM System;173.49.20.45;42005;000
04162;US GLOBAL DX;Global DX;206.72.198.26;42000;002
30725;US K7EVR YSF;EVAR Mesa,AZ;72.201.150.71;42000;001
02912;US Nationwide;United States;174.36.222.36;42000;016
53594;US Ohio;Ohio;162.243.74.151;42000;001
62554;US Texas-Nexus;Texas-Nexus;104.2.186.135;42000;022
80767;US TGIF-BM 31665;US TGIF-BM 316;162.248.92.62;42000;013
98899;US WolfDen;Massachusetts;100.0.26.120;42000;002
90943;US YSF 858;YSF SDCA-NZ6D;104.236.156.191;42000;001 90943;US YSF 858;YSF SDCA-NZ6D;104.236.156.191;42000;001
91768;US YSF082 NYC;KARG & NB2O;108.21.232.23;42000;001 08033;US YSF002;KingsOfDigital;52.10.253.1;42000;001
20584;US YSF616 WMTG;WMTG Fusion;44.103.39.6;42000;000 91768;US YSF082 NYC;KARG & NB2O;108.21.232.23;42000;002
12224;US-YSF-NE;NEW-ENGLAND;54.144.216.63;42000;003 23864;US YSF310;K6KD;64.137.191.209;42000;001
39117;US-YSF587MiFL;YSF-QNetBridge;96.47.239.135;42000;002 96429;US-KansasLink;Kansas C4FM Re;72.205.226.24;42000;006
24519;YSF-EA5 SPAIN;Zona EA5;95.39.140.240;42105;005 87531;US-QuadNetATL;QuadNet-BM;107.191.121.105;42000;001
74247;US-RepeaterBook;DMR TG 31419;69.71.127.9;42000;002
12224;US-YSF-NE;NEW-ENGLAND;54.144.216.63;42000;009
33386;US-YSF570;NEPA Fusion Sy;104.128.230.153;42000;000
88051;US-YSF587NYS;YSF-QNetBridge;216.155.157.11;42000;002
41577;YSF YO W;Fusion Romania;89.122.215.236;42000;003
91559;YSF-BRAZIL;C4FM-BRAZIL;200.231.36.174;42000;004
24519;YSF-EA5 SPAIN;Zona EA5;84.127.124.188;42105;006
93029;YSF004 MI5 SW2;Crossconnect t;44.103.34.3;42000;001 93029;YSF004 MI5 SW2;Crossconnect t;44.103.34.3;42000;001
55937;YSF017;YSFLatino 914;190.15.171.186;42000;003 65576;YSF937;Guri, South Ko;1.240.221.206;42000;000
90839;YSF071 South Kor;Fusion C4FM;211.60.41.185;42000;001

@ -32,16 +32,22 @@
int main(int argc, char** argv) int main(int argc, char** argv)
{ {
if (argc == 1) { if (argc == 1) {
::fprintf(stderr, "Usage: YSFParrot [-d|--debug] <port>\n"); ::fprintf(stderr, "Usage: YSFParrot [-d|--debug] [-n|--nolog] <port>\n");
return 1; return 1;
} }
unsigned int n = 1U; int n = 1U;
bool debug = false; bool debug = false;
if (::strcmp(argv[1], "-d") == 0 || ::strcmp(argv[1], "--debug") == 0) { bool log = true;
debug = true;
n = 2U; for (; n < argc-1; n++) {
if (::strcmp(argv[n], "-d") == 0 || ::strcmp(argv[n], "--debug") == 0) {
debug = true;
}
if (::strcmp(argv[n], "-n") == 0 || ::strcmp(argv[n], "--nolog") == 0) {
log = false;
}
} }
unsigned int port = ::atoi(argv[n]); unsigned int port = ::atoi(argv[n]);
@ -50,15 +56,16 @@ int main(int argc, char** argv)
return 1; return 1;
} }
CYSFParrot parrot(port, debug); CYSFParrot parrot(port, debug, log);
parrot.run(); parrot.run();
return 0; return 0;
} }
CYSFParrot::CYSFParrot(unsigned int port, bool debug) : CYSFParrot::CYSFParrot(unsigned int port, bool debug, bool log) :
m_port(port), m_port(port),
m_debug(debug) m_debug(debug),
m_log(log)
{ {
} }
@ -68,12 +75,19 @@ CYSFParrot::~CYSFParrot()
void CYSFParrot::run() void CYSFParrot::run()
{ {
bool ret = ::LogInitialise(".", "YSFParrot", m_debug ? 1U : 2U, m_debug ? 1U : 2U); int fileLevel = 0U;
if (m_log) {
fileLevel = m_debug ? 1U : 2U;
}
bool ret = ::LogInitialise(".", "YSFParrot", fileLevel, m_debug ? 1U : 2U);
if (!ret) { if (!ret) {
::fprintf(stderr, "YSFParrot: unable to open the log file\n"); ::fprintf(stderr, "YSFParrot: unable to open the log file\n");
return; return;
} }
LogInfo("Debug: %s", m_debug ? "enabled" : "disabled");
LogInfo("Logging to file: %s", m_log ? "enabled" : "disabled");
CParrot parrot(180U); CParrot parrot(180U);
CNetwork network(m_port); CNetwork network(m_port);

@ -22,7 +22,7 @@
class CYSFParrot class CYSFParrot
{ {
public: public:
CYSFParrot(unsigned int port, bool debug); CYSFParrot(unsigned int port, bool debug, bool log);
~CYSFParrot(); ~CYSFParrot();
void run(); void run();
@ -30,6 +30,7 @@ public:
private: private:
unsigned int m_port; unsigned int m_port;
bool m_debug; bool m_debug;
bool m_log;
}; };
#endif #endif

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations"> <ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32"> <ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration> <Configuration>Debug</Configuration>
@ -22,32 +22,32 @@
<ProjectGuid>{D3BBE5EC-91F7-457B-B782-B616B918708F}</ProjectGuid> <ProjectGuid>{D3BBE5EC-91F7-457B-B782-B616B918708F}</ProjectGuid>
<Keyword>Win32Proj</Keyword> <Keyword>Win32Proj</Keyword>
<RootNamespace>YSFParrot</RootNamespace> <RootNamespace>YSFParrot</RootNamespace>
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion> <WindowsTargetPlatformVersion>10.0.15063.0</WindowsTargetPlatformVersion>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries> <UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v140</PlatformToolset> <PlatformToolset>v141</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries> <UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v140</PlatformToolset> <PlatformToolset>v141</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries> <UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v140</PlatformToolset> <PlatformToolset>v141</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries> <UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v140</PlatformToolset> <PlatformToolset>v141</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
@ -87,7 +87,7 @@
</PrecompiledHeader> </PrecompiledHeader>
<WarningLevel>Level3</WarningLevel> <WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization> <Optimization>Disabled</Optimization>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS</PreprocessorDefinitions>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
@ -101,7 +101,7 @@
</PrecompiledHeader> </PrecompiledHeader>
<WarningLevel>Level3</WarningLevel> <WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization> <Optimization>Disabled</Optimization>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS</PreprocessorDefinitions>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
@ -117,7 +117,7 @@
<Optimization>MaxSpeed</Optimization> <Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking> <FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions> <IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS</PreprocessorDefinitions>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
@ -135,7 +135,7 @@
<Optimization>MaxSpeed</Optimization> <Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking> <FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions> <IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS</PreprocessorDefinitions>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations"> <ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32"> <ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration> <Configuration>Debug</Configuration>
@ -22,32 +22,32 @@
<ProjectGuid>{317D87F1-3485-4739-9F94-A07738B8E19D}</ProjectGuid> <ProjectGuid>{317D87F1-3485-4739-9F94-A07738B8E19D}</ProjectGuid>
<Keyword>Win32Proj</Keyword> <Keyword>Win32Proj</Keyword>
<RootNamespace>YSFReflector</RootNamespace> <RootNamespace>YSFReflector</RootNamespace>
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion> <WindowsTargetPlatformVersion>10.0.15063.0</WindowsTargetPlatformVersion>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries> <UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v140</PlatformToolset> <PlatformToolset>v141</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries> <UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v140</PlatformToolset> <PlatformToolset>v141</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries> <UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v140</PlatformToolset> <PlatformToolset>v141</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries> <UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v140</PlatformToolset> <PlatformToolset>v141</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>

Loading…
Cancel
Save