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_dstarLocalPort(0U),
m_dstarNetworkDebug(false), m_dstarNetworkDebug(false),
m_dmrNetworkEnabled(false), m_dmrNetworkEnabled(false),
m_dmrNetworkAddress(), m_dmrNetworkFailover(false),
m_dmrNetworkPort(0U), m_dmrNetworkPrimaryAddress(),
m_dmrNetworkLocal(0U), m_dmrNetworkPrimaryPort(0U),
m_dmrNetworkPassword(), m_dmrNetworkPrimaryLocal(0U),
m_dmrNetworkPrimaryPassword(),
m_dmrNetworkSecondaryAddress(),
m_dmrNetworkSecondaryPort(0U),
m_dmrNetworkSecondaryLocal(0U),
m_dmrNetworkSecondaryPassword(),
m_dmrNetworkOptions(), m_dmrNetworkOptions(),
m_dmrNetworkDebug(false), m_dmrNetworkDebug(false),
m_dmrNetworkJitter(300U), m_dmrNetworkJitter(300U),
@ -462,14 +467,24 @@ bool CConf::read()
} else if (section == SECTION_DMR_NETWORK) { } else if (section == SECTION_DMR_NETWORK) {
if (::strcmp(key, "Enable") == 0) if (::strcmp(key, "Enable") == 0)
m_dmrNetworkEnabled = ::atoi(value) == 1; m_dmrNetworkEnabled = ::atoi(value) == 1;
else if (::strcmp(key, "Address") == 0) else if (::strcmp(key, "Failover") == 0)
m_dmrNetworkAddress = value; m_dmrNetworkFailover = ::atoi(value) == 1;
else if (::strcmp(key, "Port") == 0) else if (::strcmp(key, "Address") == 0 || ::strcmp(key, "PrimaryAddress") == 0)
m_dmrNetworkPort = (unsigned int)::atoi(value); m_dmrNetworkPrimaryAddress = value;
else if (::strcmp(key, "Local") == 0) else if (::strcmp(key, "Port") == 0 || ::strcmp(key, "PrimaryPort") == 0)
m_dmrNetworkLocal = (unsigned int)::atoi(value); m_dmrNetworkPrimaryPort = (unsigned int)::atoi(value);
else if (::strcmp(key, "Password") == 0) else if (::strcmp(key, "Local") == 0 || ::strcmp(key, "PrimaryLocal") == 0)
m_dmrNetworkPassword = value; 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) else if (::strcmp(key, "Options") == 0)
m_dmrNetworkOptions = value; m_dmrNetworkOptions = value;
else if (::strcmp(key, "Debug") == 0) else if (::strcmp(key, "Debug") == 0)
@ -935,24 +950,49 @@ bool CConf::getDMRNetworkEnabled() const
return m_dmrNetworkEnabled; 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 std::string CConf::getDMRNetworkOptions() const

26
Conf.h
View file

@ -127,10 +127,15 @@ public:
// The DMR Network section // The DMR Network section
bool getDMRNetworkEnabled() const; bool getDMRNetworkEnabled() const;
std::string getDMRNetworkAddress() const; bool getDMRNetworkFailover() const;
unsigned int getDMRNetworkPort() const; std::string getDMRNetworkPrimaryAddress() const;
unsigned int getDMRNetworkLocal() const; unsigned int getDMRNetworkPrimaryPort() const;
std::string getDMRNetworkPassword() 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; std::string getDMRNetworkOptions() const;
bool getDMRNetworkDebug() const; bool getDMRNetworkDebug() const;
unsigned int getDMRNetworkJitter() const; unsigned int getDMRNetworkJitter() const;
@ -275,10 +280,15 @@ private:
bool m_dstarNetworkDebug; bool m_dstarNetworkDebug;
bool m_dmrNetworkEnabled; bool m_dmrNetworkEnabled;
std::string m_dmrNetworkAddress; bool m_dmrNetworkFailover;
unsigned int m_dmrNetworkPort; std::string m_dmrNetworkPrimaryAddress;
unsigned int m_dmrNetworkLocal; unsigned int m_dmrNetworkPrimaryPort;
std::string m_dmrNetworkPassword; 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; std::string m_dmrNetworkOptions;
bool m_dmrNetworkDebug; bool m_dmrNetworkDebug;
unsigned int m_dmrNetworkJitter; unsigned int m_dmrNetworkJitter;

View file

@ -21,7 +21,7 @@
#include <cassert> #include <cassert>
#include <algorithm> #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_id(id),
m_colorCode(colorCode), m_colorCode(colorCode),
m_modem(modem), m_modem(modem),

View file

@ -31,7 +31,7 @@
class CDMRControl { class CDMRControl {
public: 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(); ~CDMRControl();
bool processWakeup(const unsigned char* data); bool processWakeup(const unsigned char* data);
@ -48,7 +48,7 @@ private:
unsigned int m_id; unsigned int m_id;
unsigned int m_colorCode; unsigned int m_colorCode;
CModem* m_modem; CModem* m_modem;
CDMRNetwork* m_network; IDMRNetwork* m_network;
CDMRSlot m_slot1; CDMRSlot m_slot1;
CDMRSlot m_slot2; CDMRSlot m_slot2;
CDMRLookup* m_lookup; CDMRLookup* m_lookup;

View file

@ -30,6 +30,9 @@ const unsigned int BUFFER_LENGTH = 500U;
const unsigned int HOMEBREW_DATA_PACKET_LENGTH = 55U; 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) : 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(), m_address(),
@ -570,3 +573,8 @@ bool CDMRNetwork::write(const unsigned char* data, unsigned int length)
return true; return true;
} }
bool CDMRNetwork::isRunning() const
{
return m_status == RUNNING;
}

View file

@ -28,29 +28,55 @@
#include <string> #include <string>
#include <cstdint> #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: 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(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: private:
in_addr m_address; 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; bool CDMRSlot::m_dumpTAData = true;
CModem* CDMRSlot::m_modem = NULL; CModem* CDMRSlot::m_modem = NULL;
CDMRNetwork* CDMRSlot::m_network = NULL; IDMRNetwork* CDMRSlot::m_network = NULL;
CDisplay* CDMRSlot::m_display = NULL; CDisplay* CDMRSlot::m_display = NULL;
bool CDMRSlot::m_duplex = true; bool CDMRSlot::m_duplex = true;
CDMRLookup* CDMRSlot::m_lookup = NULL; CDMRLookup* CDMRSlot::m_lookup = NULL;
@ -1683,7 +1683,7 @@ void CDMRSlot::writeQueueNet(const unsigned char *data)
m_queue.addData(data, len); 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(modem != NULL);
assert(display != NULL); assert(display != NULL);

View file

@ -50,7 +50,7 @@ public:
void clock(); 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: private:
unsigned int m_slotNo; unsigned int m_slotNo;
@ -106,7 +106,7 @@ private:
static bool m_dumpTAData; static bool m_dumpTAData;
static CModem* m_modem; static CModem* m_modem;
static CDMRNetwork* m_network; static IDMRNetwork* m_network;
static CDisplay* m_display; static CDisplay* m_display;
static bool m_duplex; static bool m_duplex;
static CDMRLookup* m_lookup; static CDMRLookup* m_lookup;

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -8,10 +8,10 @@ LDFLAGS = -g
OBJECTS = \ 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 \ 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 \ DMRNetwork.o DMRNetworkManager.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.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 \ 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 \
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 \ 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 \
Timer.o UDPSocket.o UMP.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.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 all: MMDVMHost

View file

@ -8,10 +8,10 @@ LDFLAGS = -g -L/usr/local/lib
OBJECTS = \ 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 \ 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 \ DMRNetwork.o DMRNetworkManager.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.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 \ 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 \
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 \ 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 \
Timer.o UDPSocket.o UMP.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.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 all: MMDVMHost

View file

@ -8,10 +8,10 @@ LDFLAGS = -g -L/usr/local/lib
OBJECTS = \ 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 \ 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 \ DMRNetwork.o DMRNetworkManager.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.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 \ 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 \
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 \ 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 \
TFTSerial.o Thread.o Timer.o UDPSocket.o UMP.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.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 all: MMDVMHost

View file

@ -8,10 +8,10 @@ LDFLAGS = -g -L/usr/local/lib
OBJECTS = \ 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 \ 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 \ DMRNetwork.o DMRNetworkManager.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.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 \ 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 \
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 \ 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 \
Timer.o UDPSocket.o UMP.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.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 all: MMDVMHost

View file

@ -8,10 +8,10 @@ LDFLAGS = -g -L/usr/local/lib
OBJECTS = \ 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 \ 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 \ DMRNetwork.o DMRNetworkManager.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.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 \ 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 \
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 \ 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 \
Timer.o UDPSocket.o UMP.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.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 all: MMDVMHost

View file

@ -8,10 +8,10 @@ LDFLAGS = -g -L/usr/local/lib
OBJECTS = \ 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 \ 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 \ DMRNetwork.o DMRNetworkManager.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.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 \ 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 \
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 \ 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 \
Timer.o UDPSocket.o UMP.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.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 all: MMDVMHost

View file

@ -8,10 +8,10 @@ LDFLAGS = -g
OBJECTS = \ 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 \ 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 \ DMRNetwork.o DMRNetworkManager.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.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 \ 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 \
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 \ 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 \
Timer.o UDPSocket.o UMP.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.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 all: MMDVMHost