mirror of
https://github.com/g4klx/MMDVMHost
synced 2025-12-22 16:25:45 +08:00
nitial commit of POCSAG files.
This commit is contained in:
134
MMDVMHost.cpp
134
MMDVMHost.cpp
@@ -30,6 +30,7 @@
|
||||
#include "YSFControl.h"
|
||||
#include "P25Control.h"
|
||||
#include "NXDNControl.h"
|
||||
#include "POCSAGControl.h"
|
||||
#include "Nextion.h"
|
||||
#include "LCDproc.h"
|
||||
#include "Thread.h"
|
||||
@@ -134,6 +135,7 @@ m_dmrNetwork(NULL),
|
||||
m_ysfNetwork(NULL),
|
||||
m_p25Network(NULL),
|
||||
m_nxdnNetwork(NULL),
|
||||
m_pocsagNetwork(NULL),
|
||||
m_display(NULL),
|
||||
m_ump(NULL),
|
||||
m_mode(MODE_IDLE),
|
||||
@@ -147,6 +149,7 @@ m_dmrNetModeHang(3U),
|
||||
m_ysfNetModeHang(3U),
|
||||
m_p25NetModeHang(3U),
|
||||
m_nxdnNetModeHang(3U),
|
||||
m_pocsagNetModeHang(3U),
|
||||
m_modeTimer(1000U),
|
||||
m_dmrTXTimer(1000U),
|
||||
m_cwIdTimer(1000U),
|
||||
@@ -157,6 +160,7 @@ m_dmrEnabled(false),
|
||||
m_ysfEnabled(false),
|
||||
m_p25Enabled(false),
|
||||
m_nxdnEnabled(false),
|
||||
m_pocsagEnabled(false),
|
||||
m_cwIdTime(0U),
|
||||
m_dmrLookup(NULL),
|
||||
m_nxdnLookup(NULL),
|
||||
@@ -308,6 +312,12 @@ int CMMDVMHost::run()
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (m_pocsagEnabled && m_conf.getPOCSAGNetworkEnabled()) {
|
||||
ret = createPOCSAGNetwork();
|
||||
if (!ret)
|
||||
return 1;
|
||||
}
|
||||
|
||||
in_addr transparentAddress;
|
||||
unsigned int transparentPort = 0U;
|
||||
CUDPSocket* transparentSocket = NULL;
|
||||
@@ -545,6 +555,10 @@ int CMMDVMHost::run()
|
||||
nxdn = new CNXDNControl(ran, id, selfOnly, m_nxdnNetwork, m_display, m_timeout, m_duplex, remoteGateway, m_nxdnLookup, rssi);
|
||||
}
|
||||
|
||||
CPOCSAGControl* pocsag = NULL;
|
||||
if (m_pocsagEnabled)
|
||||
pocsag = new CPOCSAGControl(m_pocsagNetwork, m_display);
|
||||
|
||||
setMode(MODE_IDLE);
|
||||
|
||||
LogMessage("MMDVMHost-%s is running", VERSION);
|
||||
@@ -843,6 +857,25 @@ int CMMDVMHost::run()
|
||||
}
|
||||
}
|
||||
|
||||
if (pocsag != NULL) {
|
||||
ret = m_modem->hasPOCSAGSpace();
|
||||
if (ret) {
|
||||
len = pocsag->readModem(data);
|
||||
if (len > 0U) {
|
||||
if (m_mode == MODE_IDLE) {
|
||||
m_modeTimer.setTimeout(m_pocsagNetModeHang);
|
||||
setMode(MODE_POCSAG);
|
||||
}
|
||||
if (m_mode == MODE_POCSAG) {
|
||||
m_modem->writePOCSAGData(data, len);
|
||||
m_modeTimer.start();
|
||||
} else if (m_mode != MODE_LOCKOUT) {
|
||||
LogWarning("POCSAG data received when in mode %u", m_mode);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (transparentSocket != NULL) {
|
||||
in_addr address;
|
||||
unsigned int port = 0U;
|
||||
@@ -869,6 +902,8 @@ int CMMDVMHost::run()
|
||||
p25->clock(ms);
|
||||
if (nxdn != NULL)
|
||||
nxdn->clock(ms);
|
||||
if (pocsag != NULL)
|
||||
pocsag->clock(ms);
|
||||
|
||||
if (m_dstarNetwork != NULL)
|
||||
m_dstarNetwork->clock(ms);
|
||||
@@ -880,6 +915,8 @@ int CMMDVMHost::run()
|
||||
m_p25Network->clock(ms);
|
||||
if (m_nxdnNetwork != NULL)
|
||||
m_nxdnNetwork->clock(ms);
|
||||
if (m_pocsagNetwork != NULL)
|
||||
m_pocsagNetwork->clock(ms);
|
||||
|
||||
m_cwIdTimer.clock(ms);
|
||||
if (m_cwIdTimer.isRunning() && m_cwIdTimer.hasExpired()) {
|
||||
@@ -965,6 +1002,11 @@ int CMMDVMHost::run()
|
||||
delete m_nxdnNetwork;
|
||||
}
|
||||
|
||||
if (m_pocsagNetwork != NULL) {
|
||||
m_pocsagNetwork->close();
|
||||
delete m_pocsagNetwork;
|
||||
}
|
||||
|
||||
if (transparentSocket != NULL) {
|
||||
transparentSocket->close();
|
||||
delete transparentSocket;
|
||||
@@ -975,6 +1017,7 @@ int CMMDVMHost::run()
|
||||
delete ysf;
|
||||
delete p25;
|
||||
delete nxdn;
|
||||
delete pocsag;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -994,6 +1037,7 @@ bool CMMDVMHost::createModem()
|
||||
float ysfTXLevel = m_conf.getModemYSFTXLevel();
|
||||
float p25TXLevel = m_conf.getModemP25TXLevel();
|
||||
float nxdnTXLevel = m_conf.getModemNXDNTXLevel();
|
||||
float pocsagTXLevel = m_conf.getModemPOCSAGTXLevel();
|
||||
bool trace = m_conf.getModemTrace();
|
||||
bool debug = m_conf.getModemDebug();
|
||||
unsigned int colorCode = m_conf.getDMRColorCode();
|
||||
@@ -1026,12 +1070,13 @@ bool CMMDVMHost::createModem()
|
||||
LogInfo(" YSF TX Level: %.1f%%", ysfTXLevel);
|
||||
LogInfo(" P25 TX Level: %.1f%%", p25TXLevel);
|
||||
LogInfo(" NXDN TX Level: %.1f%%", nxdnTXLevel);
|
||||
LogInfo(" POCSAG TX Level: %.1f%%", pocsagTXLevel);
|
||||
LogInfo(" RX Frequency: %uHz (%uHz)", rxFrequency, rxFrequency + rxOffset);
|
||||
LogInfo(" TX Frequency: %uHz (%uHz)", txFrequency, txFrequency + txOffset);
|
||||
|
||||
m_modem = new CModem(port, m_duplex, rxInvert, txInvert, pttInvert, txDelay, dmrDelay, trace, debug);
|
||||
m_modem->setModeParams(m_dstarEnabled, m_dmrEnabled, m_ysfEnabled, m_p25Enabled, m_nxdnEnabled);
|
||||
m_modem->setLevels(rxLevel, cwIdTXLevel, dstarTXLevel, dmrTXLevel, ysfTXLevel, p25TXLevel, nxdnTXLevel);
|
||||
m_modem->setModeParams(m_dstarEnabled, m_dmrEnabled, m_ysfEnabled, m_p25Enabled, m_nxdnEnabled, m_pocsagEnabled);
|
||||
m_modem->setLevels(rxLevel, cwIdTXLevel, dstarTXLevel, dmrTXLevel, ysfTXLevel, p25TXLevel, nxdnTXLevel, pocsagTXLevel);
|
||||
m_modem->setRFParams(rxFrequency, rxOffset, txFrequency, txOffset, txDCOffset, rxDCOffset, rfLevel);
|
||||
m_modem->setDMRParams(colorCode);
|
||||
m_modem->setYSFParams(lowDeviation, txHang);
|
||||
@@ -1233,17 +1278,48 @@ bool CMMDVMHost::createNXDNNetwork()
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CMMDVMHost::createPOCSAGNetwork()
|
||||
{
|
||||
std::string gatewayAddress = m_conf.getPOCSAGGatewayAddress();
|
||||
unsigned int gatewayPort = m_conf.getPOCSAGGatewayPort();
|
||||
std::string localAddress = m_conf.getPOCSAGLocalAddress();
|
||||
unsigned int localPort = m_conf.getPOCSAGLocalPort();
|
||||
m_pocsagNetModeHang = m_conf.getPOCSAGNetworkModeHang();
|
||||
bool debug = m_conf.getPOCSAGNetworkDebug();
|
||||
|
||||
LogInfo("POCSAG Network Parameters");
|
||||
LogInfo(" Gateway Address: %s", gatewayAddress.c_str());
|
||||
LogInfo(" Gateway Port: %u", gatewayPort);
|
||||
LogInfo(" Local Address: %s", localAddress.c_str());
|
||||
LogInfo(" Local Port: %u", localPort);
|
||||
LogInfo(" Mode Hang: %us", m_pocsagNetModeHang);
|
||||
|
||||
m_pocsagNetwork = new CPOCSAGNetwork(localAddress, localPort, gatewayAddress, gatewayPort, debug);
|
||||
|
||||
bool ret = m_pocsagNetwork->open();
|
||||
if (!ret) {
|
||||
delete m_pocsagNetwork;
|
||||
m_pocsagNetwork = NULL;
|
||||
return false;
|
||||
}
|
||||
|
||||
m_pocsagNetwork->enable(true);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void CMMDVMHost::readParams()
|
||||
{
|
||||
m_dstarEnabled = m_conf.getDStarEnabled();
|
||||
m_dmrEnabled = m_conf.getDMREnabled();
|
||||
m_ysfEnabled = m_conf.getFusionEnabled();
|
||||
m_p25Enabled = m_conf.getP25Enabled();
|
||||
m_nxdnEnabled = m_conf.getNXDNEnabled();
|
||||
m_duplex = m_conf.getDuplex();
|
||||
m_callsign = m_conf.getCallsign();
|
||||
m_id = m_conf.getId();
|
||||
m_timeout = m_conf.getTimeout();
|
||||
m_dstarEnabled = m_conf.getDStarEnabled();
|
||||
m_dmrEnabled = m_conf.getDMREnabled();
|
||||
m_ysfEnabled = m_conf.getFusionEnabled();
|
||||
m_p25Enabled = m_conf.getP25Enabled();
|
||||
m_nxdnEnabled = m_conf.getNXDNEnabled();
|
||||
m_pocsagEnabled = m_conf.getPOCSAGEnabled();
|
||||
m_duplex = m_conf.getDuplex();
|
||||
m_callsign = m_conf.getCallsign();
|
||||
m_id = m_conf.getId();
|
||||
m_timeout = m_conf.getTimeout();
|
||||
|
||||
LogInfo("General Parameters");
|
||||
LogInfo(" Callsign: %s", m_callsign.c_str());
|
||||
@@ -1255,6 +1331,7 @@ void CMMDVMHost::readParams()
|
||||
LogInfo(" YSF: %s", m_ysfEnabled ? "enabled" : "disabled");
|
||||
LogInfo(" P25: %s", m_p25Enabled ? "enabled" : "disabled");
|
||||
LogInfo(" NXDN: %s", m_nxdnEnabled ? "enabled" : "disabled");
|
||||
LogInfo(" POCSAG: %s", m_pocsagEnabled ? "enabled" : "disabled");
|
||||
}
|
||||
|
||||
void CMMDVMHost::createDisplay()
|
||||
@@ -1426,6 +1503,8 @@ void CMMDVMHost::setMode(unsigned char mode)
|
||||
m_p25Network->enable(false);
|
||||
if (m_nxdnNetwork != NULL)
|
||||
m_nxdnNetwork->enable(false);
|
||||
if (m_pocsagNetwork != NULL)
|
||||
m_pocsagNetwork->enable(false);
|
||||
m_modem->setMode(MODE_DSTAR);
|
||||
if (m_ump != NULL)
|
||||
m_ump->setMode(MODE_DSTAR);
|
||||
@@ -1443,6 +1522,8 @@ void CMMDVMHost::setMode(unsigned char mode)
|
||||
m_p25Network->enable(false);
|
||||
if (m_nxdnNetwork != NULL)
|
||||
m_nxdnNetwork->enable(false);
|
||||
if (m_pocsagNetwork != NULL)
|
||||
m_pocsagNetwork->enable(false);
|
||||
m_modem->setMode(MODE_DMR);
|
||||
if (m_ump != NULL)
|
||||
m_ump->setMode(MODE_DMR);
|
||||
@@ -1464,6 +1545,8 @@ void CMMDVMHost::setMode(unsigned char mode)
|
||||
m_p25Network->enable(false);
|
||||
if (m_nxdnNetwork != NULL)
|
||||
m_nxdnNetwork->enable(false);
|
||||
if (m_pocsagNetwork != NULL)
|
||||
m_pocsagNetwork->enable(false);
|
||||
m_modem->setMode(MODE_YSF);
|
||||
if (m_ump != NULL)
|
||||
m_ump->setMode(MODE_YSF);
|
||||
@@ -1481,6 +1564,8 @@ void CMMDVMHost::setMode(unsigned char mode)
|
||||
m_ysfNetwork->enable(false);
|
||||
if (m_nxdnNetwork != NULL)
|
||||
m_nxdnNetwork->enable(false);
|
||||
if (m_pocsagNetwork != NULL)
|
||||
m_pocsagNetwork->enable(false);
|
||||
m_modem->setMode(MODE_P25);
|
||||
if (m_ump != NULL)
|
||||
m_ump->setMode(MODE_P25);
|
||||
@@ -1498,6 +1583,8 @@ void CMMDVMHost::setMode(unsigned char mode)
|
||||
m_ysfNetwork->enable(false);
|
||||
if (m_p25Network != NULL)
|
||||
m_p25Network->enable(false);
|
||||
if (m_pocsagNetwork != NULL)
|
||||
m_pocsagNetwork->enable(false);
|
||||
m_modem->setMode(MODE_NXDN);
|
||||
if (m_ump != NULL)
|
||||
m_ump->setMode(MODE_NXDN);
|
||||
@@ -1506,6 +1593,25 @@ void CMMDVMHost::setMode(unsigned char mode)
|
||||
m_cwIdTimer.stop();
|
||||
break;
|
||||
|
||||
case MODE_POCSAG:
|
||||
if (m_dstarNetwork != NULL)
|
||||
m_dstarNetwork->enable(false);
|
||||
if (m_dmrNetwork != NULL)
|
||||
m_dmrNetwork->enable(false);
|
||||
if (m_ysfNetwork != NULL)
|
||||
m_ysfNetwork->enable(false);
|
||||
if (m_p25Network != NULL)
|
||||
m_p25Network->enable(false);
|
||||
if (m_nxdnNetwork != NULL)
|
||||
m_nxdnNetwork->enable(false);
|
||||
m_modem->setMode(MODE_POCSAG);
|
||||
if (m_ump != NULL)
|
||||
m_ump->setMode(MODE_POCSAG);
|
||||
m_mode = MODE_POCSAG;
|
||||
m_modeTimer.start();
|
||||
m_cwIdTimer.stop();
|
||||
break;
|
||||
|
||||
case MODE_LOCKOUT:
|
||||
LogMessage("Mode set to Lockout");
|
||||
if (m_dstarNetwork != NULL)
|
||||
@@ -1518,6 +1624,8 @@ void CMMDVMHost::setMode(unsigned char mode)
|
||||
m_p25Network->enable(false);
|
||||
if (m_nxdnNetwork != NULL)
|
||||
m_nxdnNetwork->enable(false);
|
||||
if (m_pocsagNetwork != NULL)
|
||||
m_pocsagNetwork->enable(false);
|
||||
if (m_mode == MODE_DMR && m_duplex && m_modem->hasTX()) {
|
||||
m_modem->writeDMRStart(false);
|
||||
m_dmrTXTimer.stop();
|
||||
@@ -1543,6 +1651,8 @@ void CMMDVMHost::setMode(unsigned char mode)
|
||||
m_p25Network->enable(false);
|
||||
if (m_nxdnNetwork != NULL)
|
||||
m_nxdnNetwork->enable(false);
|
||||
if (m_pocsagNetwork != NULL)
|
||||
m_pocsagNetwork->enable(false);
|
||||
if (m_mode == MODE_DMR && m_duplex && m_modem->hasTX()) {
|
||||
m_modem->writeDMRStart(false);
|
||||
m_dmrTXTimer.stop();
|
||||
@@ -1566,6 +1676,8 @@ void CMMDVMHost::setMode(unsigned char mode)
|
||||
m_p25Network->enable(true);
|
||||
if (m_nxdnNetwork != NULL)
|
||||
m_nxdnNetwork->enable(true);
|
||||
if (m_pocsagNetwork != NULL)
|
||||
m_pocsagNetwork->enable(true);
|
||||
if (m_mode == MODE_DMR && m_duplex && m_modem->hasTX()) {
|
||||
m_modem->writeDMRStart(false);
|
||||
m_dmrTXTimer.stop();
|
||||
|
||||
Reference in New Issue
Block a user