Compare commits

...

5 Commits

Author SHA1 Message Date
Jonathan Naylor 954d8d29ff Merge branch 'master' into dmr_failover 2017-05-01 09:25:25 +01:00
Jonathan Naylor c03902c04b Merge branch 'master' into dmr_failover 2017-04-15 11:54:13 +01:00
Jonathan Naylor e1b5194ac4 Merge branch 'master' into dmr_failover 2017-04-11 19:33:34 +01:00
Jonathan Naylor d80653f293 Add basic DMR network failover. 2017-04-10 18:07:42 +01:00
Jonathan Naylor 72bae08c87 Add DMR network virtualisation. 2017-04-10 17:57:55 +01:00
22 changed files with 468 additions and 97 deletions

View File

@ -126,10 +126,15 @@ m_dstarGatewayPort(0U),
m_dstarLocalPort(0U),
m_dstarNetworkDebug(false),
m_dmrNetworkEnabled(false),
m_dmrNetworkAddress(),
m_dmrNetworkPort(0U),
m_dmrNetworkLocal(0U),
m_dmrNetworkPassword(),
m_dmrNetworkFailover(false),
m_dmrNetworkPrimaryAddress(),
m_dmrNetworkPrimaryPort(0U),
m_dmrNetworkPrimaryLocal(0U),
m_dmrNetworkPrimaryPassword(),
m_dmrNetworkSecondaryAddress(),
m_dmrNetworkSecondaryPort(0U),
m_dmrNetworkSecondaryLocal(0U),
m_dmrNetworkSecondaryPassword(),
m_dmrNetworkOptions(),
m_dmrNetworkDebug(false),
m_dmrNetworkJitter(300U),
@ -462,14 +467,24 @@ bool CConf::read()
} else if (section == SECTION_DMR_NETWORK) {
if (::strcmp(key, "Enable") == 0)
m_dmrNetworkEnabled = ::atoi(value) == 1;
else if (::strcmp(key, "Address") == 0)
m_dmrNetworkAddress = value;
else if (::strcmp(key, "Port") == 0)
m_dmrNetworkPort = (unsigned int)::atoi(value);
else if (::strcmp(key, "Local") == 0)
m_dmrNetworkLocal = (unsigned int)::atoi(value);
else if (::strcmp(key, "Password") == 0)
m_dmrNetworkPassword = value;
else if (::strcmp(key, "Failover") == 0)
m_dmrNetworkFailover = ::atoi(value) == 1;
else if (::strcmp(key, "Address") == 0 || ::strcmp(key, "PrimaryAddress") == 0)
m_dmrNetworkPrimaryAddress = value;
else if (::strcmp(key, "Port") == 0 || ::strcmp(key, "PrimaryPort") == 0)
m_dmrNetworkPrimaryPort = (unsigned int)::atoi(value);
else if (::strcmp(key, "Local") == 0 || ::strcmp(key, "PrimaryLocal") == 0)
m_dmrNetworkPrimaryLocal = (unsigned int)::atoi(value);
else if (::strcmp(key, "Password") == 0 || ::strcmp(key, "PrimaryPassword") == 0)
m_dmrNetworkPrimaryPassword = value;
else if (::strcmp(key, "SecondaryAddress") == 0)
m_dmrNetworkSecondaryAddress = value;
else if (::strcmp(key, "SecondaryPort") == 0)
m_dmrNetworkSecondaryPort = (unsigned int)::atoi(value);
else if (::strcmp(key, "SecondaryLocal") == 0)
m_dmrNetworkSecondaryLocal = (unsigned int)::atoi(value);
else if (::strcmp(key, "SecondaryPassword") == 0)
m_dmrNetworkSecondaryPassword = value;
else if (::strcmp(key, "Options") == 0)
m_dmrNetworkOptions = value;
else if (::strcmp(key, "Debug") == 0)
@ -935,24 +950,49 @@ bool CConf::getDMRNetworkEnabled() const
return m_dmrNetworkEnabled;
}
std::string CConf::getDMRNetworkAddress() const
bool CConf::getDMRNetworkFailover() const
{
return m_dmrNetworkAddress;
return m_dmrNetworkFailover;
}
unsigned int CConf::getDMRNetworkPort() const
std::string CConf::getDMRNetworkPrimaryAddress() const
{
return m_dmrNetworkPort;
return m_dmrNetworkPrimaryAddress;
}
unsigned int CConf::getDMRNetworkLocal() const
unsigned int CConf::getDMRNetworkPrimaryPort() const
{
return m_dmrNetworkLocal;
return m_dmrNetworkPrimaryPort;
}
std::string CConf::getDMRNetworkPassword() const
unsigned int CConf::getDMRNetworkPrimaryLocal() const
{
return m_dmrNetworkPassword;
return m_dmrNetworkPrimaryLocal;
}
std::string CConf::getDMRNetworkPrimaryPassword() const
{
return m_dmrNetworkPrimaryPassword;
}
std::string CConf::getDMRNetworkSecondaryAddress() const
{
return m_dmrNetworkSecondaryAddress;
}
unsigned int CConf::getDMRNetworkSecondaryPort() const
{
return m_dmrNetworkSecondaryPort;
}
unsigned int CConf::getDMRNetworkSecondaryLocal() const
{
return m_dmrNetworkSecondaryLocal;
}
std::string CConf::getDMRNetworkSecondaryPassword() const
{
return m_dmrNetworkSecondaryPassword;
}
std::string CConf::getDMRNetworkOptions() const

26
Conf.h
View File

@ -127,10 +127,15 @@ public:
// The DMR Network section
bool getDMRNetworkEnabled() const;
std::string getDMRNetworkAddress() const;
unsigned int getDMRNetworkPort() const;
unsigned int getDMRNetworkLocal() const;
std::string getDMRNetworkPassword() const;
bool getDMRNetworkFailover() const;
std::string getDMRNetworkPrimaryAddress() const;
unsigned int getDMRNetworkPrimaryPort() const;
unsigned int getDMRNetworkPrimaryLocal() const;
std::string getDMRNetworkPrimaryPassword() const;
std::string getDMRNetworkSecondaryAddress() const;
unsigned int getDMRNetworkSecondaryPort() const;
unsigned int getDMRNetworkSecondaryLocal() const;
std::string getDMRNetworkSecondaryPassword() const;
std::string getDMRNetworkOptions() const;
bool getDMRNetworkDebug() const;
unsigned int getDMRNetworkJitter() const;
@ -275,10 +280,15 @@ private:
bool m_dstarNetworkDebug;
bool m_dmrNetworkEnabled;
std::string m_dmrNetworkAddress;
unsigned int m_dmrNetworkPort;
unsigned int m_dmrNetworkLocal;
std::string m_dmrNetworkPassword;
bool m_dmrNetworkFailover;
std::string m_dmrNetworkPrimaryAddress;
unsigned int m_dmrNetworkPrimaryPort;
unsigned int m_dmrNetworkPrimaryLocal;
std::string m_dmrNetworkPrimaryPassword;
std::string m_dmrNetworkSecondaryAddress;
unsigned int m_dmrNetworkSecondaryPort;
unsigned int m_dmrNetworkSecondaryLocal;
std::string m_dmrNetworkSecondaryPassword;
std::string m_dmrNetworkOptions;
bool m_dmrNetworkDebug;
unsigned int m_dmrNetworkJitter;

View File

@ -21,7 +21,7 @@
#include <cassert>
#include <algorithm>
CDMRControl::CDMRControl(unsigned int id, unsigned int colorCode, unsigned int callHang, bool selfOnly, bool embeddedLCOnly, bool dumpTAData, const std::vector<unsigned int>& prefixes, const std::vector<unsigned int>& blacklist, const std::vector<unsigned int>& whitelist, const std::vector<unsigned int>& slot1TGWhitelist, const std::vector<unsigned int>& slot2TGWhitelist, unsigned int timeout, CModem* modem, CDMRNetwork* network, CDisplay* display, bool duplex, CDMRLookup* lookup, CRSSIInterpolator* rssi, unsigned int jitter) :
CDMRControl::CDMRControl(unsigned int id, unsigned int colorCode, unsigned int callHang, bool selfOnly, bool embeddedLCOnly, bool dumpTAData, const std::vector<unsigned int>& prefixes, const std::vector<unsigned int>& blacklist, const std::vector<unsigned int>& whitelist, const std::vector<unsigned int>& slot1TGWhitelist, const std::vector<unsigned int>& slot2TGWhitelist, unsigned int timeout, CModem* modem, IDMRNetwork* network, CDisplay* display, bool duplex, CDMRLookup* lookup, CRSSIInterpolator* rssi, unsigned int jitter) :
m_id(id),
m_colorCode(colorCode),
m_modem(modem),

View File

@ -31,7 +31,7 @@
class CDMRControl {
public:
CDMRControl(unsigned int id, unsigned int colorCode, unsigned int callHang, bool selfOnly, bool embeddedLCOnly, bool dumpTAData, const std::vector<unsigned int>& prefixes, const std::vector<unsigned int>& blacklist, const std::vector<unsigned int>& whitelist, const std::vector<unsigned int>& slot1TGWhitelist, const std::vector<unsigned int>& slot2TGWhitelist, unsigned int timeout, CModem* modem, CDMRNetwork* network, CDisplay* display, bool duplex, CDMRLookup* lookup, CRSSIInterpolator* rssi, unsigned int jitter);
CDMRControl(unsigned int id, unsigned int colorCode, unsigned int callHang, bool selfOnly, bool embeddedLCOnly, bool dumpTAData, const std::vector<unsigned int>& prefixes, const std::vector<unsigned int>& blacklist, const std::vector<unsigned int>& whitelist, const std::vector<unsigned int>& slot1TGWhitelist, const std::vector<unsigned int>& slot2TGWhitelist, unsigned int timeout, CModem* modem, IDMRNetwork* network, CDisplay* display, bool duplex, CDMRLookup* lookup, CRSSIInterpolator* rssi, unsigned int jitter);
~CDMRControl();
bool processWakeup(const unsigned char* data);
@ -48,7 +48,7 @@ private:
unsigned int m_id;
unsigned int m_colorCode;
CModem* m_modem;
CDMRNetwork* m_network;
IDMRNetwork* m_network;
CDMRSlot m_slot1;
CDMRSlot m_slot2;
CDMRLookup* m_lookup;

View File

@ -30,6 +30,9 @@ const unsigned int BUFFER_LENGTH = 500U;
const unsigned int HOMEBREW_DATA_PACKET_LENGTH = 55U;
IDMRNetwork::~IDMRNetwork()
{
}
CDMRNetwork::CDMRNetwork(const std::string& address, unsigned int port, unsigned int local, unsigned int id, const std::string& password, bool duplex, const char* version, bool debug, bool slot1, bool slot2, HW_TYPE hwType) :
m_address(),
@ -570,3 +573,8 @@ bool CDMRNetwork::write(const unsigned char* data, unsigned int length)
return true;
}
bool CDMRNetwork::isRunning() const
{
return m_status == RUNNING;
}

View File

@ -28,29 +28,55 @@
#include <string>
#include <cstdint>
class CDMRNetwork
{
class IDMRNetwork {
public:
virtual ~IDMRNetwork() = 0;
virtual void setOptions(const std::string& options) = 0;
virtual void setConfig(const std::string& callsign, unsigned int rxFrequency, unsigned int txFrequency, unsigned int power, unsigned int colorCode, float latitude, float longitude, int height, const std::string& location, const std::string& description, const std::string& url) = 0;
virtual bool open() = 0;
virtual void enable(bool enabled) = 0;
virtual bool read(CDMRData& data) = 0;
virtual bool write(const CDMRData& data) = 0;
virtual bool wantsBeacon() = 0;
virtual void clock(unsigned int ms) = 0;
virtual void close() = 0;
private:
};
class CDMRNetwork : public IDMRNetwork {
public:
CDMRNetwork(const std::string& address, unsigned int port, unsigned int local, unsigned int id, const std::string& password, bool duplex, const char* version, bool debug, bool slot1, bool slot2, HW_TYPE hwType);
~CDMRNetwork();
virtual ~CDMRNetwork();
void setOptions(const std::string& options);
virtual void setOptions(const std::string& options);
void setConfig(const std::string& callsign, unsigned int rxFrequency, unsigned int txFrequency, unsigned int power, unsigned int colorCode, float latitude, float longitude, int height, const std::string& location, const std::string& description, const std::string& url);
virtual void setConfig(const std::string& callsign, unsigned int rxFrequency, unsigned int txFrequency, unsigned int power, unsigned int colorCode, float latitude, float longitude, int height, const std::string& location, const std::string& description, const std::string& url);
bool open();
virtual bool open();
void enable(bool enabled);
virtual void enable(bool enabled);
bool read(CDMRData& data);
virtual bool read(CDMRData& data);
bool write(const CDMRData& data);
virtual bool write(const CDMRData& data);
bool wantsBeacon();
virtual bool wantsBeacon();
void clock(unsigned int ms);
virtual bool isRunning() const;
void close();
virtual void clock(unsigned int ms);
virtual void close();
private:
in_addr m_address;

174
DMRNetworkManager.cpp Normal file
View File

@ -0,0 +1,174 @@
/*
* Copyright (C) 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.
*/
#include "DMRNetworkManager.h"
#include "Log.h"
#include <cstdio>
#include <cassert>
CDMRNetworkManager::CDMRNetworkManager(CDMRNetwork* primary, CDMRNetwork* secondary) :
m_primary(primary),
m_secondary(secondary),
m_state(DMRNS_NONE),
m_poll(1000U, 300U)
{
assert(primary != NULL);
assert(secondary != NULL);
}
CDMRNetworkManager::~CDMRNetworkManager()
{
delete m_primary;
delete m_secondary;
}
void CDMRNetworkManager::setOptions(const std::string& options)
{
m_primary->setOptions(options);
m_secondary->setOptions(options);
}
void CDMRNetworkManager::setConfig(const std::string& callsign, unsigned int rxFrequency, unsigned int txFrequency, unsigned int power, unsigned int colorCode, float latitude, float longitude, int height, const std::string& location, const std::string& description, const std::string& url)
{
m_primary->setConfig(callsign, rxFrequency, txFrequency, power, colorCode, latitude, longitude, height, location, description, url);
m_secondary->setConfig(callsign, rxFrequency, txFrequency, power, colorCode, latitude, longitude, height, location, description, url);
}
bool CDMRNetworkManager::open()
{
LogMessage("DMR, Using Primary DMR Network");
bool ret = m_primary->open();
if (!ret)
return false;
m_state = DMRNS_PRIMARY_RUNNING;
m_poll.start();
return true;
}
void CDMRNetworkManager::enable(bool enabled)
{
m_primary->enable(enabled);
m_secondary->enable(enabled);
}
bool CDMRNetworkManager::read(CDMRData& data)
{
switch (m_state) {
case DMRNS_PRIMARY_RUNNING: {
m_secondary->read(data);
bool ret = m_primary->read(data);
if (ret)
m_poll.start();
return ret;
}
case DMRNS_SECONDARY_RUNNING: {
m_primary->read(data);
bool ret = m_secondary->read(data);
if (ret)
m_poll.start();
return ret;
}
default:
return false;
}
}
bool CDMRNetworkManager::write(const CDMRData& data)
{
switch (m_state) {
case DMRNS_PRIMARY_RUNNING:
return m_primary->write(data);
case DMRNS_SECONDARY_RUNNING:
return m_secondary->write(data);
default:
return false;
}
}
void CDMRNetworkManager::close()
{
switch (m_state) {
case DMRNS_PRIMARY_RUNNING:
m_primary->close();
break;
case DMRNS_SECONDARY_RUNNING:
m_secondary->close();
break;
default:
break;
}
}
void CDMRNetworkManager::clock(unsigned int ms)
{
m_poll.clock(ms);
if (m_poll.isRunning() && m_poll.hasExpired()) {
switch (m_state) {
case DMRNS_PRIMARY_RUNNING: {
bool ret = m_primary->isRunning();
if (!ret) {
LogMessage("DMR, Using Secondary DMR Network");
m_secondary->open();
m_state = DMRNS_SECONDARY_RUNNING;
}
}
break;
case DMRNS_SECONDARY_RUNNING: {
bool ret = m_primary->isRunning();
if (ret) {
LogMessage("DMR, Using Primary DMR Network");
m_secondary->close();
m_state = DMRNS_PRIMARY_RUNNING;
}
}
break;
default:
break;
}
m_poll.start();
}
}
bool CDMRNetworkManager::wantsBeacon()
{
switch (m_state) {
case DMRNS_PRIMARY_RUNNING:
return m_primary->wantsBeacon();
case DMRNS_SECONDARY_RUNNING:
return m_secondary->wantsBeacon();
default:
return false;
}
}

66
DMRNetworkManager.h Normal file
View File

@ -0,0 +1,66 @@
/*
* Copyright (C) 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.
*/
#if !defined(DMRNetworkManager_H)
#define DMRNetworkManager_H
#include "DMRNetwork.h"
#include "Timer.h"
#include "DMRData.h"
#include "Defines.h"
#include <string>
#include <cstdint>
enum DMR_NETWORK_STATE {
DMRNS_NONE,
DMRNS_PRIMARY_RUNNING,
DMRNS_SECONDARY_RUNNING
};
class CDMRNetworkManager : public IDMRNetwork {
public:
CDMRNetworkManager(CDMRNetwork* primary, CDMRNetwork* secondary);
virtual ~CDMRNetworkManager();
virtual void setOptions(const std::string& options);
virtual void setConfig(const std::string& callsign, unsigned int rxFrequency, unsigned int txFrequency, unsigned int power, unsigned int colorCode, float latitude, float longitude, int height, const std::string& location, const std::string& description, const std::string& url);
virtual bool open();
virtual void enable(bool enabled);
virtual bool read(CDMRData& data);
virtual bool write(const CDMRData& data);
virtual bool wantsBeacon();
virtual void clock(unsigned int ms);
virtual void close();
private:
CDMRNetwork* m_primary;
CDMRNetwork* m_secondary;
DMR_NETWORK_STATE m_state;
CTimer m_poll;
};
#endif

View File

@ -35,7 +35,7 @@ bool CDMRSlot::m_embeddedLCOnly = false;
bool CDMRSlot::m_dumpTAData = true;
CModem* CDMRSlot::m_modem = NULL;
CDMRNetwork* CDMRSlot::m_network = NULL;
IDMRNetwork* CDMRSlot::m_network = NULL;
CDisplay* CDMRSlot::m_display = NULL;
bool CDMRSlot::m_duplex = true;
CDMRLookup* CDMRSlot::m_lookup = NULL;
@ -1683,7 +1683,7 @@ void CDMRSlot::writeQueueNet(const unsigned char *data)
m_queue.addData(data, len);
}
void CDMRSlot::init(unsigned int colorCode, bool embeddedLCOnly, bool dumpTAData, unsigned int callHang, CModem* modem, CDMRNetwork* network, CDisplay* display, bool duplex, CDMRLookup* lookup, CRSSIInterpolator* rssiMapper, unsigned int jitter)
void CDMRSlot::init(unsigned int colorCode, bool embeddedLCOnly, bool dumpTAData, unsigned int callHang, CModem* modem, IDMRNetwork* network, CDisplay* display, bool duplex, CDMRLookup* lookup, CRSSIInterpolator* rssiMapper, unsigned int jitter)
{
assert(modem != NULL);
assert(display != NULL);

View File

@ -50,7 +50,7 @@ public:
void clock();
static void init(unsigned int colorCode, bool embeddedLCOnly, bool dumpTAData, unsigned int callHang, CModem* modem, CDMRNetwork* network, CDisplay* display, bool duplex, CDMRLookup* lookup, CRSSIInterpolator* rssiMapper, unsigned int jitter);
static void init(unsigned int colorCode, bool embeddedLCOnly, bool dumpTAData, unsigned int callHang, CModem* modem, IDMRNetwork* network, CDisplay* display, bool duplex, CDMRLookup* lookup, CRSSIInterpolator* rssiMapper, unsigned int jitter);
private:
unsigned int m_slotNo;
@ -106,7 +106,7 @@ private:
static bool m_dumpTAData;
static CModem* m_modem;
static CDMRNetwork* m_network;
static IDMRNetwork* m_network;
static CDisplay* m_display;
static bool m_duplex;
static CDMRLookup* m_lookup;

View File

@ -98,11 +98,16 @@ Debug=0
[DMR Network]
Enable=1
Address=44.131.4.1
Port=62031
Failover=0
PrimaryAddress=44.131.4.1
PrimaryPort=62031
# PrimaryLocal=3350
PrimaryPassword=PASSWORD
# SecondaryAddress=44.131.4.1
# SecondaryPort=62031
# SecondaryLocal=3350
# SecondaryPassword=PASSWORD
Jitter=300
# Local=3350
Password=PASSWORD
# Options=
Slot1=1
Slot2=1

View File

@ -20,6 +20,8 @@
#include "RSSIInterpolator.h"
#include "SerialController.h"
#include "ModemSerialPort.h"
#include "DMRNetworkManager.h"
#include "DMRNetwork.h"
#include "Version.h"
#include "StopWatch.h"
#include "Defines.h"
@ -873,29 +875,61 @@ bool CMMDVMHost::createDStarNetwork()
bool CMMDVMHost::createDMRNetwork()
{
std::string address = m_conf.getDMRNetworkAddress();
unsigned int port = m_conf.getDMRNetworkPort();
unsigned int local = m_conf.getDMRNetworkLocal();
unsigned int id = m_conf.getDMRId();
std::string password = m_conf.getDMRNetworkPassword();
bool debug = m_conf.getDMRNetworkDebug();
unsigned int jitter = m_conf.getDMRNetworkJitter();
bool slot1 = m_conf.getDMRNetworkSlot1();
bool slot2 = m_conf.getDMRNetworkSlot2();
HW_TYPE hwType = m_modem->getHWType();
std::string primaryAddress = m_conf.getDMRNetworkPrimaryAddress();
bool failover = m_conf.getDMRNetworkFailover();
unsigned int primaryPort = m_conf.getDMRNetworkPrimaryPort();
unsigned int primaryLocal = m_conf.getDMRNetworkPrimaryLocal();
std::string primaryPassword = m_conf.getDMRNetworkPrimaryPassword();
std::string secondaryAddress = m_conf.getDMRNetworkSecondaryAddress();
unsigned int secondaryPort = m_conf.getDMRNetworkSecondaryPort();
unsigned int secondaryLocal = m_conf.getDMRNetworkSecondaryLocal();
std::string secondaryPassword = m_conf.getDMRNetworkSecondaryPassword();
unsigned int id = m_conf.getDMRId();
bool debug = m_conf.getDMRNetworkDebug();
unsigned int jitter = m_conf.getDMRNetworkJitter();
bool slot1 = m_conf.getDMRNetworkSlot1();
bool slot2 = m_conf.getDMRNetworkSlot2();
HW_TYPE hwType = m_modem->getHWType();
LogInfo("DMR Network Parameters");
LogInfo(" Address: %s", address.c_str());
LogInfo(" Port: %u", port);
if (local > 0U)
LogInfo(" Local: %u", local);
else
LogInfo(" Local: random");
if (failover) {
LogInfo(" Failover: yes");
LogInfo(" Primary Address: %s", primaryAddress.c_str());
LogInfo(" Primary Port: %u", primaryPort);
if (primaryLocal > 0U)
LogInfo(" Primary Local: %u", primaryLocal);
else
LogInfo(" Primary Local: random");
LogInfo(" Secondary Address: %s", secondaryAddress.c_str());
LogInfo(" Secondary Port: %u", secondaryPort);
if (secondaryLocal > 0U)
LogInfo(" Secondary Local: %u", secondaryLocal);
else
LogInfo(" Secondary Local: random");
} else {
LogInfo(" Failover: no");
LogInfo(" Address: %s", primaryAddress.c_str());
LogInfo(" Port: %u", primaryPort);
if (primaryLocal > 0U)
LogInfo(" Local: %u", primaryLocal);
else
LogInfo(" Local: random");
}
LogInfo(" Jitter: %ums", jitter);
LogInfo(" Slot 1: %s", slot1 ? "enabled" : "disabled");
LogInfo(" Slot 2: %s", slot2 ? "enabled" : "disabled");
m_dmrNetwork = new CDMRNetwork(address, port, local, id, password, m_duplex, VERSION, debug, slot1, slot2, hwType);
if (failover) {
CDMRNetwork* primary = new CDMRNetwork(primaryAddress, primaryPort, primaryLocal, id, primaryPassword, m_duplex, VERSION, debug, slot1, slot2, hwType);
CDMRNetwork* secondary = new CDMRNetwork(secondaryAddress, secondaryPort, secondaryLocal, id, secondaryPassword, m_duplex, VERSION, debug, slot1, slot2, hwType);
m_dmrNetwork = new CDMRNetworkManager(primary, secondary);
} else {
m_dmrNetwork = new CDMRNetwork(primaryAddress, primaryPort, primaryLocal, id, primaryPassword, m_duplex, VERSION, debug, slot1, slot2, hwType);
}
std::string options = m_conf.getDMRNetworkOptions();
if (!options.empty()) {

View File

@ -44,7 +44,7 @@ private:
CConf m_conf;
CModem* m_modem;
CDStarNetwork* m_dstarNetwork;
CDMRNetwork* m_dmrNetwork;
IDMRNetwork* m_dmrNetwork;
CYSFNetwork* m_ysfNetwork;
CP25Network* m_p25Network;
CDisplay* m_display;

View File

@ -170,6 +170,7 @@
<ClInclude Include="DMRFullLC.h" />
<ClInclude Include="DMRLC.h" />
<ClInclude Include="DMRNetwork.h" />
<ClInclude Include="DMRNetworkManager.h" />
<ClInclude Include="DMRShortLC.h" />
<ClInclude Include="DMRSlot.h" />
<ClInclude Include="DMRSlotType.h" />
@ -241,6 +242,7 @@
<ClCompile Include="DMRLC.cpp" />
<ClCompile Include="DMRLookup.cpp" />
<ClCompile Include="DMRNetwork.cpp" />
<ClCompile Include="DMRNetworkManager.cpp" />
<ClCompile Include="DMRShortLC.cpp" />
<ClCompile Include="DMRSlot.cpp" />
<ClCompile Include="DMRSlotType.cpp" />

View File

@ -221,6 +221,9 @@
<ClInclude Include="RSSIInterpolator.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="DMRNetworkManager.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="BPTC19696.cpp">
@ -412,5 +415,8 @@
<ClCompile Include="RSSIInterpolator.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="DMRNetworkManager.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
</Project>

View File

@ -8,10 +8,10 @@ LDFLAGS = -g
OBJECTS = \
AMBEFEC.o BCH.o BPTC19696.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRLookup.o DMRLC.o \
DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o Golay2087.o \
Golay24128.o Hamming.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o Nextion.o NullDisplay.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o \
P25Network.o P25NID.o P25Utils.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o SHA256.o StopWatch.o Sync.o TFTSerial.o Thread.o \
Timer.o UDPSocket.o UMP.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
DMRNetwork.o DMRNetworkManager.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o \
Golay2087.o Golay24128.o Hamming.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o Nextion.o NullDisplay.o P25Audio.o P25Control.o P25Data.o \
P25LowSpeedData.o P25Network.o P25NID.o P25Utils.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o SHA256.o StopWatch.o Sync.o \
TFTSerial.o Thread.o Timer.o UDPSocket.o UMP.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
all: MMDVMHost

View File

@ -8,10 +8,10 @@ LDFLAGS = -g -L/usr/local/lib
OBJECTS = \
AMBEFEC.o BCH.o BPTC19696.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRLookup.o DMRLC.o \
DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o Golay2087.o \
Golay24128.o Hamming.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o Nextion.o NullDisplay.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o \
P25Network.o P25NID.o P25Utils.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o SHA256.o StopWatch.o Sync.o TFTSerial.o Thread.o \
Timer.o UDPSocket.o UMP.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
DMRNetwork.o DMRNetworkManager.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o \
Golay2087.o Golay24128.o Hamming.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o Nextion.o NullDisplay.o P25Audio.o P25Control.o P25Data.o \
P25LowSpeedData.o P25Network.o P25NID.o P25Utils.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o SHA256.o StopWatch.o Sync.o \
TFTSerial.o Thread.o Timer.o UDPSocket.o UMP.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
all: MMDVMHost

View File

@ -8,10 +8,10 @@ LDFLAGS = -g -L/usr/local/lib
OBJECTS = \
AMBEFEC.o BCH.o BPTC19696.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRLookup.o DMRLC.o \
DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o Golay2087.o \
Golay24128.o Hamming.o HD44780.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o Nextion.o NullDisplay.o P25Audio.o P25Control.o P25Data.o \
P25LowSpeedData.o P25Network.o P25NID.o P25Utils.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o SHA256.o StopWatch.o Sync.o \
TFTSerial.o Thread.o Timer.o UDPSocket.o UMP.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
DMRNetwork.o DMRNetworkManager.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o \
Golay2087.o Golay24128.o Hamming.o HD44780.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o Nextion.o NullDisplay.o P25Audio.o P25Control.o \
P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Utils.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o SHA256.o StopWatch.o \
Sync.o TFTSerial.o Thread.o Timer.o UDPSocket.o UMP.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
all: MMDVMHost

View File

@ -8,10 +8,10 @@ LDFLAGS = -g -L/usr/local/lib
OBJECTS = \
AMBEFEC.o BCH.o BPTC19696.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRLookup.o DMRLC.o \
DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o Golay2087.o \
Golay24128.o Hamming.o HD44780.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o Nextion.o NullDisplay.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o \
P25Network.o P25NID.o P25Utils.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o SHA256.o StopWatch.o Sync.o TFTSerial.o Thread.o \
Timer.o UDPSocket.o UMP.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
DMRNetwork.o DMRNetworkManager.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o \
Golay2087.o Golay24128.o Hamming.o HD44780.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o Nextion.o NullDisplay.o P25Audio.o P25Control.o \
P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Utils.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o SHA256.o StopWatch.o \
Sync.o TFTSerial.o Thread.o Timer.o UDPSocket.o UMP.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
all: MMDVMHost

View File

@ -8,10 +8,10 @@ LDFLAGS = -g -L/usr/local/lib
OBJECTS = \
AMBEFEC.o BCH.o BPTC19696.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRLookup.o DMRLC.o \
DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o Golay2087.o \
Golay24128.o Hamming.o OLED.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o Nextion.o NullDisplay.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o \
P25Network.o P25NID.o P25Utils.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o SHA256.o StopWatch.o Sync.o TFTSerial.o Thread.o \
Timer.o UDPSocket.o UMP.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
DMRNetwork.o DMRNetworkManager.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o \
Golay2087.o Golay24128.o Hamming.o OLED.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o Nextion.o NullDisplay.o P25Audio.o P25Control.o P25Data.o \
P25LowSpeedData.o P25Network.o P25NID.o P25Utils.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o SHA256.o StopWatch.o Sync.o \
TFTSerial.o Thread.o Timer.o UDPSocket.o UMP.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
all: MMDVMHost

View File

@ -8,10 +8,10 @@ LDFLAGS = -g -L/usr/local/lib
OBJECTS = \
AMBEFEC.o BCH.o BPTC19696.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRLookup.o DMRLC.o \
DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o Golay2087.o \
Golay24128.o Hamming.o HD44780.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o Nextion.o NullDisplay.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o \
P25Network.o P25NID.o P25Utils.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o SHA256.o StopWatch.o Sync.o TFTSerial.o Thread.o \
Timer.o UDPSocket.o UMP.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
DMRNetwork.o DMRNetworkManager.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o \
Golay2087.o Golay24128.o Hamming.o HD44780.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o Nextion.o NullDisplay.o P25Audio.o P25Control.o \
P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Utils.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o SHA256.o StopWatch.o \
Sync.o TFTSerial.o Thread.o Timer.o UDPSocket.o UMP.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
all: MMDVMHost

View File

@ -8,10 +8,10 @@ LDFLAGS = -g
OBJECTS = \
AMBEFEC.o BCH.o BPTC19696.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRLookup.o DMRLC.o \
DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o Golay2087.o \
Golay24128.o Hamming.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o Nextion.o NullDisplay.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o \
P25Network.o P25NID.o P25Utils.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o SHA256.o StopWatch.o Sync.o TFTSerial.o Thread.o \
Timer.o UDPSocket.o UMP.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
DMRNetwork.o DMRNetworkManager.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o \
Golay2087.o Golay24128.o Hamming.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o Nextion.o NullDisplay.o P25Audio.o P25Control.o P25Data.o \
P25LowSpeedData.o P25Network.o P25NID.o P25Utils.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o SHA256.o StopWatch.o Sync.o \
TFTSerial.o Thread.o Timer.o UDPSocket.o UMP.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
all: MMDVMHost