mirror of
https://github.com/g4klx/MMDVMHost.git
synced 2025-12-06 05:32:00 +01:00
Initial commit of NXDN scaffolding.
This commit is contained in:
parent
526e2c436d
commit
b2586654a2
67
Conf.cpp
67
Conf.cpp
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2015,2016,2017 by Jonathan Naylor G4KLX
|
* Copyright (C) 2015,2016,2017,2018 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,10 +40,12 @@ enum SECTION {
|
||||||
SECTION_DMR,
|
SECTION_DMR,
|
||||||
SECTION_FUSION,
|
SECTION_FUSION,
|
||||||
SECTION_P25,
|
SECTION_P25,
|
||||||
|
SECTION_NXDN,
|
||||||
SECTION_DSTAR_NETWORK,
|
SECTION_DSTAR_NETWORK,
|
||||||
SECTION_DMR_NETWORK,
|
SECTION_DMR_NETWORK,
|
||||||
SECTION_FUSION_NETWORK,
|
SECTION_FUSION_NETWORK,
|
||||||
SECTION_P25_NETWORK,
|
SECTION_P25_NETWORK,
|
||||||
|
SECTION_NXDN_NETWORK,
|
||||||
SECTION_TFTSERIAL,
|
SECTION_TFTSERIAL,
|
||||||
SECTION_HD44780,
|
SECTION_HD44780,
|
||||||
SECTION_NEXTION,
|
SECTION_NEXTION,
|
||||||
|
|
@ -95,6 +97,7 @@ m_modemDStarTXLevel(50.0F),
|
||||||
m_modemDMRTXLevel(50.0F),
|
m_modemDMRTXLevel(50.0F),
|
||||||
m_modemYSFTXLevel(50.0F),
|
m_modemYSFTXLevel(50.0F),
|
||||||
m_modemP25TXLevel(50.0F),
|
m_modemP25TXLevel(50.0F),
|
||||||
|
m_modemNXDNTXLevel(50.0F),
|
||||||
m_modemRSSIMappingFile(),
|
m_modemRSSIMappingFile(),
|
||||||
m_modemTrace(false),
|
m_modemTrace(false),
|
||||||
m_modemDebug(false),
|
m_modemDebug(false),
|
||||||
|
|
@ -138,6 +141,12 @@ m_p25SelfOnly(false),
|
||||||
m_p25OverrideUID(false),
|
m_p25OverrideUID(false),
|
||||||
m_p25RemoteGateway(false),
|
m_p25RemoteGateway(false),
|
||||||
m_p25ModeHang(10U),
|
m_p25ModeHang(10U),
|
||||||
|
m_nxdnEnabled(false),
|
||||||
|
m_nxdnId(0U),
|
||||||
|
m_nxdnRAN(13U),
|
||||||
|
m_nxdnSelfOnly(false),
|
||||||
|
m_nxdnRemoteGateway(false),
|
||||||
|
m_nxdnModeHang(10U),
|
||||||
m_dstarNetworkEnabled(false),
|
m_dstarNetworkEnabled(false),
|
||||||
m_dstarGatewayAddress(),
|
m_dstarGatewayAddress(),
|
||||||
m_dstarGatewayPort(0U),
|
m_dstarGatewayPort(0U),
|
||||||
|
|
@ -240,6 +249,8 @@ bool CConf::read()
|
||||||
section = SECTION_FUSION;
|
section = SECTION_FUSION;
|
||||||
else if (::strncmp(buffer, "[P25]", 5U) == 0)
|
else if (::strncmp(buffer, "[P25]", 5U) == 0)
|
||||||
section = SECTION_P25;
|
section = SECTION_P25;
|
||||||
|
else if (::strncmp(buffer, "[NXDN]", 6U) == 0)
|
||||||
|
section = SECTION_NXDN;
|
||||||
else if (::strncmp(buffer, "[D-Star Network]", 16U) == 0)
|
else if (::strncmp(buffer, "[D-Star Network]", 16U) == 0)
|
||||||
section = SECTION_DSTAR_NETWORK;
|
section = SECTION_DSTAR_NETWORK;
|
||||||
else if (::strncmp(buffer, "[DMR Network]", 13U) == 0)
|
else if (::strncmp(buffer, "[DMR Network]", 13U) == 0)
|
||||||
|
|
@ -248,6 +259,8 @@ bool CConf::read()
|
||||||
section = SECTION_FUSION_NETWORK;
|
section = SECTION_FUSION_NETWORK;
|
||||||
else if (::strncmp(buffer, "[P25 Network]", 13U) == 0)
|
else if (::strncmp(buffer, "[P25 Network]", 13U) == 0)
|
||||||
section = SECTION_P25_NETWORK;
|
section = SECTION_P25_NETWORK;
|
||||||
|
else if (::strncmp(buffer, "[NXDN Network]", 14U) == 0)
|
||||||
|
section = SECTION_NXDN_NETWORK;
|
||||||
else if (::strncmp(buffer, "[TFT Serial]", 12U) == 0)
|
else if (::strncmp(buffer, "[TFT Serial]", 12U) == 0)
|
||||||
section = SECTION_TFTSERIAL;
|
section = SECTION_TFTSERIAL;
|
||||||
else if (::strncmp(buffer, "[HD44780]", 9U) == 0)
|
else if (::strncmp(buffer, "[HD44780]", 9U) == 0)
|
||||||
|
|
@ -365,7 +378,7 @@ bool CConf::read()
|
||||||
else if (::strcmp(key, "RXLevel") == 0)
|
else if (::strcmp(key, "RXLevel") == 0)
|
||||||
m_modemRXLevel = float(::atof(value));
|
m_modemRXLevel = float(::atof(value));
|
||||||
else if (::strcmp(key, "TXLevel") == 0)
|
else if (::strcmp(key, "TXLevel") == 0)
|
||||||
m_modemCWIdTXLevel = m_modemDStarTXLevel = m_modemDMRTXLevel = m_modemYSFTXLevel = m_modemP25TXLevel = float(::atof(value));
|
m_modemCWIdTXLevel = m_modemDStarTXLevel = m_modemDMRTXLevel = m_modemYSFTXLevel = m_modemP25TXLevel = m_modemNXDNTXLevel = float(::atof(value));
|
||||||
else if (::strcmp(key, "CWIdTXLevel") == 0)
|
else if (::strcmp(key, "CWIdTXLevel") == 0)
|
||||||
m_modemCWIdTXLevel = float(::atof(value));
|
m_modemCWIdTXLevel = float(::atof(value));
|
||||||
else if (::strcmp(key, "D-StarTXLevel") == 0)
|
else if (::strcmp(key, "D-StarTXLevel") == 0)
|
||||||
|
|
@ -376,6 +389,8 @@ bool CConf::read()
|
||||||
m_modemYSFTXLevel = float(::atof(value));
|
m_modemYSFTXLevel = float(::atof(value));
|
||||||
else if (::strcmp(key, "P25TXLevel") == 0)
|
else if (::strcmp(key, "P25TXLevel") == 0)
|
||||||
m_modemP25TXLevel = float(::atof(value));
|
m_modemP25TXLevel = float(::atof(value));
|
||||||
|
else if (::strcmp(key, "NXDNTXLevel") == 0)
|
||||||
|
m_modemNXDNTXLevel = float(::atof(value));
|
||||||
else if (::strcmp(key, "RSSIMappingFile") == 0)
|
else if (::strcmp(key, "RSSIMappingFile") == 0)
|
||||||
m_modemRSSIMappingFile = value;
|
m_modemRSSIMappingFile = value;
|
||||||
else if (::strcmp(key, "Trace") == 0)
|
else if (::strcmp(key, "Trace") == 0)
|
||||||
|
|
@ -509,6 +524,19 @@ bool CConf::read()
|
||||||
m_p25RemoteGateway = ::atoi(value) == 1;
|
m_p25RemoteGateway = ::atoi(value) == 1;
|
||||||
else if (::strcmp(key, "ModeHang") == 0)
|
else if (::strcmp(key, "ModeHang") == 0)
|
||||||
m_p25ModeHang = (unsigned int)::atoi(value);
|
m_p25ModeHang = (unsigned int)::atoi(value);
|
||||||
|
} else if (section == SECTION_NXDN) {
|
||||||
|
if (::strcmp(key, "Enable") == 0)
|
||||||
|
m_nxdnEnabled = ::atoi(value) == 1;
|
||||||
|
else if (::strcmp(key, "Id") == 0)
|
||||||
|
m_nxdnId = (unsigned int)::atoi(value);
|
||||||
|
else if (::strcmp(key, "RAN") == 0)
|
||||||
|
m_nxdnRAN = (unsigned int)::atoi(value);
|
||||||
|
else if (::strcmp(key, "SelfOnly") == 0)
|
||||||
|
m_nxdnSelfOnly = ::atoi(value) == 1;
|
||||||
|
else if (::strcmp(key, "RemoteGateway") == 0)
|
||||||
|
m_nxdnRemoteGateway = ::atoi(value) == 1;
|
||||||
|
else if (::strcmp(key, "ModeHang") == 0)
|
||||||
|
m_nxdnModeHang = (unsigned int)::atoi(value);
|
||||||
} else if (section == SECTION_DSTAR_NETWORK) {
|
} else if (section == SECTION_DSTAR_NETWORK) {
|
||||||
if (::strcmp(key, "Enable") == 0)
|
if (::strcmp(key, "Enable") == 0)
|
||||||
m_dstarNetworkEnabled = ::atoi(value) == 1;
|
m_dstarNetworkEnabled = ::atoi(value) == 1;
|
||||||
|
|
@ -853,6 +881,11 @@ float CConf::getModemP25TXLevel() const
|
||||||
return m_modemP25TXLevel;
|
return m_modemP25TXLevel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float CConf::getModemNXDNTXLevel() const
|
||||||
|
{
|
||||||
|
return m_modemNXDNTXLevel;
|
||||||
|
}
|
||||||
|
|
||||||
std::string CConf::getModemRSSIMappingFile () const
|
std::string CConf::getModemRSSIMappingFile () const
|
||||||
{
|
{
|
||||||
return m_modemRSSIMappingFile;
|
return m_modemRSSIMappingFile;
|
||||||
|
|
@ -1068,6 +1101,36 @@ unsigned int CConf::getP25ModeHang() const
|
||||||
return m_p25ModeHang;
|
return m_p25ModeHang;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CConf::getNXDNEnabled() const
|
||||||
|
{
|
||||||
|
return m_nxdnEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int CConf::getNXDNId() const
|
||||||
|
{
|
||||||
|
return m_nxdnId;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int CConf::getNXDNRAN() const
|
||||||
|
{
|
||||||
|
return m_nxdnRAN;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CConf::getNXDNSelfOnly() const
|
||||||
|
{
|
||||||
|
return m_nxdnSelfOnly;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CConf::getNXDNRemoteGateway() const
|
||||||
|
{
|
||||||
|
return m_nxdnRemoteGateway;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int CConf::getNXDNModeHang() const
|
||||||
|
{
|
||||||
|
return m_nxdnModeHang;
|
||||||
|
}
|
||||||
|
|
||||||
bool CConf::getDStarNetworkEnabled() const
|
bool CConf::getDStarNetworkEnabled() const
|
||||||
{
|
{
|
||||||
return m_dstarNetworkEnabled;
|
return m_dstarNetworkEnabled;
|
||||||
|
|
|
||||||
19
Conf.h
19
Conf.h
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2015,2016,2017 by Jonathan Naylor G4KLX
|
* Copyright (C) 2015,2016,2017,2018 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
|
||||||
|
|
@ -82,6 +82,7 @@ public:
|
||||||
float getModemDMRTXLevel() const;
|
float getModemDMRTXLevel() const;
|
||||||
float getModemYSFTXLevel() const;
|
float getModemYSFTXLevel() const;
|
||||||
float getModemP25TXLevel() const;
|
float getModemP25TXLevel() const;
|
||||||
|
float getModemNXDNTXLevel() const;
|
||||||
std::string getModemRSSIMappingFile() const;
|
std::string getModemRSSIMappingFile() const;
|
||||||
bool getModemTrace() const;
|
bool getModemTrace() const;
|
||||||
bool getModemDebug() const;
|
bool getModemDebug() const;
|
||||||
|
|
@ -136,6 +137,14 @@ public:
|
||||||
bool getP25RemoteGateway() const;
|
bool getP25RemoteGateway() const;
|
||||||
unsigned int getP25ModeHang() const;
|
unsigned int getP25ModeHang() const;
|
||||||
|
|
||||||
|
// The NXDN section
|
||||||
|
bool getNXDNEnabled() const;
|
||||||
|
unsigned int getNXDNId() const;
|
||||||
|
unsigned int getNXDNRAN() const;
|
||||||
|
bool getNXDNSelfOnly() const;
|
||||||
|
bool getNXDNRemoteGateway() const;
|
||||||
|
unsigned int getNXDNModeHang() const;
|
||||||
|
|
||||||
// The D-Star Network section
|
// The D-Star Network section
|
||||||
bool getDStarNetworkEnabled() const;
|
bool getDStarNetworkEnabled() const;
|
||||||
std::string getDStarGatewayAddress() const;
|
std::string getDStarGatewayAddress() const;
|
||||||
|
|
@ -260,6 +269,7 @@ private:
|
||||||
float m_modemDMRTXLevel;
|
float m_modemDMRTXLevel;
|
||||||
float m_modemYSFTXLevel;
|
float m_modemYSFTXLevel;
|
||||||
float m_modemP25TXLevel;
|
float m_modemP25TXLevel;
|
||||||
|
float m_modemNXDNTXLevel;
|
||||||
std::string m_modemRSSIMappingFile;
|
std::string m_modemRSSIMappingFile;
|
||||||
bool m_modemTrace;
|
bool m_modemTrace;
|
||||||
bool m_modemDebug;
|
bool m_modemDebug;
|
||||||
|
|
@ -309,6 +319,13 @@ private:
|
||||||
bool m_p25RemoteGateway;
|
bool m_p25RemoteGateway;
|
||||||
unsigned int m_p25ModeHang;
|
unsigned int m_p25ModeHang;
|
||||||
|
|
||||||
|
bool m_nxdnEnabled;
|
||||||
|
unsigned int m_nxdnId;
|
||||||
|
unsigned int m_nxdnRAN;
|
||||||
|
bool m_nxdnSelfOnly;
|
||||||
|
bool m_nxdnRemoteGateway;
|
||||||
|
unsigned int m_nxdnModeHang;
|
||||||
|
|
||||||
bool m_dstarNetworkEnabled;
|
bool m_dstarNetworkEnabled;
|
||||||
std::string m_dstarGatewayAddress;
|
std::string m_dstarGatewayAddress;
|
||||||
unsigned int m_dstarGatewayPort;
|
unsigned int m_dstarGatewayPort;
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2015,2016,2017 by Jonathan Naylor G4KLX
|
* Copyright (C) 2015,2016,2017,2018 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
|
||||||
|
|
@ -24,6 +24,7 @@ const unsigned char MODE_DSTAR = 1U;
|
||||||
const unsigned char MODE_DMR = 2U;
|
const unsigned char MODE_DMR = 2U;
|
||||||
const unsigned char MODE_YSF = 3U;
|
const unsigned char MODE_YSF = 3U;
|
||||||
const unsigned char MODE_P25 = 4U;
|
const unsigned char MODE_P25 = 4U;
|
||||||
|
const unsigned char MODE_NXDN = 5U;
|
||||||
const unsigned char MODE_CW = 98U;
|
const unsigned char MODE_CW = 98U;
|
||||||
const unsigned char MODE_LOCKOUT = 99U;
|
const unsigned char MODE_LOCKOUT = 99U;
|
||||||
const unsigned char MODE_ERROR = 100U;
|
const unsigned char MODE_ERROR = 100U;
|
||||||
|
|
|
||||||
|
|
@ -56,6 +56,7 @@ RFLevel=100
|
||||||
# DMRTXLevel=50
|
# DMRTXLevel=50
|
||||||
# YSFTXLevel=50
|
# YSFTXLevel=50
|
||||||
# P25TXLevel=50
|
# P25TXLevel=50
|
||||||
|
# NXDNTXLevel=50
|
||||||
RSSIMappingFile=RSSI.dat
|
RSSIMappingFile=RSSI.dat
|
||||||
Trace=0
|
Trace=0
|
||||||
Debug=0
|
Debug=0
|
||||||
|
|
@ -105,6 +106,13 @@ OverrideUIDCheck=0
|
||||||
RemoteGateway=0
|
RemoteGateway=0
|
||||||
# ModeHang=10
|
# ModeHang=10
|
||||||
|
|
||||||
|
[NXDN]
|
||||||
|
Enable=1
|
||||||
|
RAN=13
|
||||||
|
SelfOnly=0
|
||||||
|
RemoteGateway=0
|
||||||
|
# ModeHang=10
|
||||||
|
|
||||||
[D-Star Network]
|
[D-Star Network]
|
||||||
Enable=1
|
Enable=1
|
||||||
GatewayAddress=127.0.0.1
|
GatewayAddress=127.0.0.1
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,7 @@
|
||||||
#include "NullDisplay.h"
|
#include "NullDisplay.h"
|
||||||
#include "YSFControl.h"
|
#include "YSFControl.h"
|
||||||
#include "P25Control.h"
|
#include "P25Control.h"
|
||||||
|
#include "NXDNControl.h"
|
||||||
#include "Nextion.h"
|
#include "Nextion.h"
|
||||||
#include "LCDproc.h"
|
#include "LCDproc.h"
|
||||||
#include "Thread.h"
|
#include "Thread.h"
|
||||||
|
|
@ -74,7 +75,7 @@ static void sigHandler(int signum)
|
||||||
const char* HEADER1 = "This software is for use on amateur radio networks only,";
|
const char* HEADER1 = "This software is for use on amateur radio networks only,";
|
||||||
const char* HEADER2 = "it is to be used for educational purposes only. Its use on";
|
const char* HEADER2 = "it is to be used for educational purposes only. Its use on";
|
||||||
const char* HEADER3 = "commercial networks is strictly prohibited.";
|
const char* HEADER3 = "commercial networks is strictly prohibited.";
|
||||||
const char* HEADER4 = "Copyright(C) 2015-2017 by Jonathan Naylor, G4KLX and others";
|
const char* HEADER4 = "Copyright(C) 2015-2018 by Jonathan Naylor, G4KLX and others";
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
int main(int argc, char** argv)
|
||||||
{
|
{
|
||||||
|
|
@ -139,10 +140,12 @@ m_dstarRFModeHang(10U),
|
||||||
m_dmrRFModeHang(10U),
|
m_dmrRFModeHang(10U),
|
||||||
m_ysfRFModeHang(10U),
|
m_ysfRFModeHang(10U),
|
||||||
m_p25RFModeHang(10U),
|
m_p25RFModeHang(10U),
|
||||||
|
m_nxdnRFModeHang(10U),
|
||||||
m_dstarNetModeHang(3U),
|
m_dstarNetModeHang(3U),
|
||||||
m_dmrNetModeHang(3U),
|
m_dmrNetModeHang(3U),
|
||||||
m_ysfNetModeHang(3U),
|
m_ysfNetModeHang(3U),
|
||||||
m_p25NetModeHang(3U),
|
m_p25NetModeHang(3U),
|
||||||
|
m_nxdnNetModeHang(3U),
|
||||||
m_modeTimer(1000U),
|
m_modeTimer(1000U),
|
||||||
m_dmrTXTimer(1000U),
|
m_dmrTXTimer(1000U),
|
||||||
m_cwIdTimer(1000U),
|
m_cwIdTimer(1000U),
|
||||||
|
|
@ -152,6 +155,7 @@ m_dstarEnabled(false),
|
||||||
m_dmrEnabled(false),
|
m_dmrEnabled(false),
|
||||||
m_ysfEnabled(false),
|
m_ysfEnabled(false),
|
||||||
m_p25Enabled(false),
|
m_p25Enabled(false),
|
||||||
|
m_nxdnEnabled(false),
|
||||||
m_cwIdTime(0U),
|
m_cwIdTime(0U),
|
||||||
m_lookup(NULL),
|
m_lookup(NULL),
|
||||||
m_callsign(),
|
m_callsign(),
|
||||||
|
|
@ -461,6 +465,24 @@ int CMMDVMHost::run()
|
||||||
p25 = new CP25Control(nac, id, selfOnly, uidOverride, m_p25Network, m_display, m_timeout, m_duplex, m_lookup, remoteGateway, rssi);
|
p25 = new CP25Control(nac, id, selfOnly, uidOverride, m_p25Network, m_display, m_timeout, m_duplex, m_lookup, remoteGateway, rssi);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CNXDNControl* nxdn = NULL;
|
||||||
|
if (m_nxdnEnabled) {
|
||||||
|
unsigned int id = m_conf.getNXDNId();
|
||||||
|
unsigned int ran = m_conf.getNXDNRAN();
|
||||||
|
bool selfOnly = m_conf.getNXDNSelfOnly();
|
||||||
|
bool remoteGateway = m_conf.getNXDNRemoteGateway();
|
||||||
|
m_nxdnRFModeHang = m_conf.getNXDNModeHang();
|
||||||
|
|
||||||
|
LogInfo("NXDN RF Parameters");
|
||||||
|
LogInfo(" Id: %u", id);
|
||||||
|
LogInfo(" RAN: %u", ran);
|
||||||
|
LogInfo(" Self Only: %s", selfOnly ? "yes" : "no");
|
||||||
|
LogInfo(" Remote Gateway: %s", remoteGateway ? "yes" : "no");
|
||||||
|
LogInfo(" Mode Hang: %us", m_p25RFModeHang);
|
||||||
|
|
||||||
|
nxdn = new CNXDNControl(ran, id, selfOnly, NULL, m_display, m_timeout, m_duplex, m_lookup, remoteGateway, rssi);
|
||||||
|
}
|
||||||
|
|
||||||
setMode(MODE_IDLE);
|
setMode(MODE_IDLE);
|
||||||
|
|
||||||
LogMessage("MMDVMHost-%s is running", VERSION);
|
LogMessage("MMDVMHost-%s is running", VERSION);
|
||||||
|
|
@ -614,6 +636,22 @@ int CMMDVMHost::run()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
len = m_modem->readNXDNData(data);
|
||||||
|
if (nxdn != NULL && len > 0U) {
|
||||||
|
if (m_mode == MODE_IDLE) {
|
||||||
|
bool ret = nxdn->writeModem(data, len);
|
||||||
|
if (ret) {
|
||||||
|
m_modeTimer.setTimeout(m_nxdnRFModeHang);
|
||||||
|
setMode(MODE_NXDN);
|
||||||
|
}
|
||||||
|
} else if (m_mode == MODE_NXDN) {
|
||||||
|
nxdn->writeModem(data, len);
|
||||||
|
m_modeTimer.start();
|
||||||
|
} else if (m_mode != MODE_LOCKOUT) {
|
||||||
|
LogWarning("NXDN modem data received when in mode %u", m_mode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (m_modeTimer.isRunning() && m_modeTimer.hasExpired())
|
if (m_modeTimer.isRunning() && m_modeTimer.hasExpired())
|
||||||
setMode(MODE_IDLE);
|
setMode(MODE_IDLE);
|
||||||
|
|
||||||
|
|
@ -720,6 +758,26 @@ int CMMDVMHost::run()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (nxdn != NULL) {
|
||||||
|
ret = m_modem->hasNXDNSpace();
|
||||||
|
if (ret) {
|
||||||
|
len = nxdn->readModem(data);
|
||||||
|
if (len > 0U) {
|
||||||
|
if (m_mode == MODE_IDLE) {
|
||||||
|
m_modeTimer.setTimeout(m_nxdnNetModeHang);
|
||||||
|
setMode(MODE_NXDN);
|
||||||
|
}
|
||||||
|
if (m_mode == MODE_NXDN) {
|
||||||
|
m_modem->writeNXDNData(data, len);
|
||||||
|
m_modeTimer.start();
|
||||||
|
}
|
||||||
|
else if (m_mode != MODE_LOCKOUT) {
|
||||||
|
LogWarning("NXDN data received when in mode %u", m_mode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (m_dmrNetwork != NULL) {
|
if (m_dmrNetwork != NULL) {
|
||||||
bool run = m_dmrNetwork->wantsBeacon();
|
bool run = m_dmrNetwork->wantsBeacon();
|
||||||
if (dmrBeaconsEnabled && run && m_mode == MODE_IDLE && !m_modem->hasTX()) {
|
if (dmrBeaconsEnabled && run && m_mode == MODE_IDLE && !m_modem->hasTX()) {
|
||||||
|
|
@ -744,6 +802,8 @@ int CMMDVMHost::run()
|
||||||
ysf->clock(ms);
|
ysf->clock(ms);
|
||||||
if (p25 != NULL)
|
if (p25 != NULL)
|
||||||
p25->clock(ms);
|
p25->clock(ms);
|
||||||
|
if (nxdn != NULL)
|
||||||
|
nxdn->clock(ms);
|
||||||
|
|
||||||
if (m_dstarNetwork != NULL)
|
if (m_dstarNetwork != NULL)
|
||||||
m_dstarNetwork->clock(ms);
|
m_dstarNetwork->clock(ms);
|
||||||
|
|
@ -825,6 +885,7 @@ int CMMDVMHost::run()
|
||||||
delete dmr;
|
delete dmr;
|
||||||
delete ysf;
|
delete ysf;
|
||||||
delete p25;
|
delete p25;
|
||||||
|
delete nxdn;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -843,6 +904,7 @@ bool CMMDVMHost::createModem()
|
||||||
float dmrTXLevel = m_conf.getModemDMRTXLevel();
|
float dmrTXLevel = m_conf.getModemDMRTXLevel();
|
||||||
float ysfTXLevel = m_conf.getModemYSFTXLevel();
|
float ysfTXLevel = m_conf.getModemYSFTXLevel();
|
||||||
float p25TXLevel = m_conf.getModemP25TXLevel();
|
float p25TXLevel = m_conf.getModemP25TXLevel();
|
||||||
|
float nxdnTXLevel = m_conf.getModemNXDNTXLevel();
|
||||||
bool trace = m_conf.getModemTrace();
|
bool trace = m_conf.getModemTrace();
|
||||||
bool debug = m_conf.getModemDebug();
|
bool debug = m_conf.getModemDebug();
|
||||||
unsigned int colorCode = m_conf.getDMRColorCode();
|
unsigned int colorCode = m_conf.getDMRColorCode();
|
||||||
|
|
@ -873,12 +935,13 @@ bool CMMDVMHost::createModem()
|
||||||
LogInfo(" DMR TX Level: %.1f%%", dmrTXLevel);
|
LogInfo(" DMR TX Level: %.1f%%", dmrTXLevel);
|
||||||
LogInfo(" YSF TX Level: %.1f%%", ysfTXLevel);
|
LogInfo(" YSF TX Level: %.1f%%", ysfTXLevel);
|
||||||
LogInfo(" P25 TX Level: %.1f%%", p25TXLevel);
|
LogInfo(" P25 TX Level: %.1f%%", p25TXLevel);
|
||||||
|
LogInfo(" NXDN TX Level: %.1f%%", nxdnTXLevel);
|
||||||
LogInfo(" RX Frequency: %uHz (%uHz)", rxFrequency, rxFrequency + rxOffset);
|
LogInfo(" RX Frequency: %uHz (%uHz)", rxFrequency, rxFrequency + rxOffset);
|
||||||
LogInfo(" TX Frequency: %uHz (%uHz)", txFrequency, txFrequency + txOffset);
|
LogInfo(" TX Frequency: %uHz (%uHz)", txFrequency, txFrequency + txOffset);
|
||||||
|
|
||||||
m_modem = new CModem(port, m_duplex, rxInvert, txInvert, pttInvert, txDelay, dmrDelay, trace, debug);
|
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_modem->setModeParams(m_dstarEnabled, m_dmrEnabled, m_ysfEnabled, m_p25Enabled, m_nxdnEabled);
|
||||||
m_modem->setLevels(rxLevel, cwIdTXLevel, dstarTXLevel, dmrTXLevel, ysfTXLevel, p25TXLevel);
|
m_modem->setLevels(rxLevel, cwIdTXLevel, dstarTXLevel, dmrTXLevel, ysfTXLevel, p25TXLevel, nxdnTXLevel);
|
||||||
m_modem->setRFParams(rxFrequency, rxOffset, txFrequency, txOffset, txDCOffset, rxDCOffset, rfLevel);
|
m_modem->setRFParams(rxFrequency, rxOffset, txFrequency, txOffset, txDCOffset, rxDCOffset, rfLevel);
|
||||||
m_modem->setDMRParams(colorCode);
|
m_modem->setDMRParams(colorCode);
|
||||||
m_modem->setYSFParams(lowDeviation);
|
m_modem->setYSFParams(lowDeviation);
|
||||||
|
|
@ -1056,6 +1119,7 @@ void CMMDVMHost::readParams()
|
||||||
m_dmrEnabled = m_conf.getDMREnabled();
|
m_dmrEnabled = m_conf.getDMREnabled();
|
||||||
m_ysfEnabled = m_conf.getFusionEnabled();
|
m_ysfEnabled = m_conf.getFusionEnabled();
|
||||||
m_p25Enabled = m_conf.getP25Enabled();
|
m_p25Enabled = m_conf.getP25Enabled();
|
||||||
|
m_nxdnEnabled = m_conf.getNXDNEnabled();
|
||||||
m_duplex = m_conf.getDuplex();
|
m_duplex = m_conf.getDuplex();
|
||||||
m_callsign = m_conf.getCallsign();
|
m_callsign = m_conf.getCallsign();
|
||||||
m_id = m_conf.getId();
|
m_id = m_conf.getId();
|
||||||
|
|
@ -1070,6 +1134,7 @@ void CMMDVMHost::readParams()
|
||||||
LogInfo(" DMR: %s", m_dmrEnabled ? "enabled" : "disabled");
|
LogInfo(" DMR: %s", m_dmrEnabled ? "enabled" : "disabled");
|
||||||
LogInfo(" YSF: %s", m_ysfEnabled ? "enabled" : "disabled");
|
LogInfo(" YSF: %s", m_ysfEnabled ? "enabled" : "disabled");
|
||||||
LogInfo(" P25: %s", m_p25Enabled ? "enabled" : "disabled");
|
LogInfo(" P25: %s", m_p25Enabled ? "enabled" : "disabled");
|
||||||
|
LogInfo(" NXDN: %s", m_nxdnEnabled ? "enabled" : "disabled");
|
||||||
}
|
}
|
||||||
|
|
||||||
void CMMDVMHost::createDisplay()
|
void CMMDVMHost::createDisplay()
|
||||||
|
|
@ -1296,6 +1361,23 @@ void CMMDVMHost::setMode(unsigned char mode)
|
||||||
m_cwIdTimer.stop();
|
m_cwIdTimer.stop();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case MODE_NXDN:
|
||||||
|
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);
|
||||||
|
m_modem->setMode(MODE_NXDN);
|
||||||
|
if (m_ump != NULL)
|
||||||
|
m_ump->setMode(MODE_NXDN);
|
||||||
|
m_mode = MODE_NXDN;
|
||||||
|
m_modeTimer.start();
|
||||||
|
m_cwIdTimer.stop();
|
||||||
|
break;
|
||||||
|
|
||||||
case MODE_LOCKOUT:
|
case MODE_LOCKOUT:
|
||||||
LogMessage("Mode set to Lockout");
|
LogMessage("Mode set to Lockout");
|
||||||
if (m_dstarNetwork != NULL)
|
if (m_dstarNetwork != NULL)
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2015,2016,2017 by Jonathan Naylor G4KLX
|
* Copyright (C) 2015,2016,2017,2018 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
|
||||||
|
|
@ -54,10 +54,12 @@ private:
|
||||||
unsigned int m_dmrRFModeHang;
|
unsigned int m_dmrRFModeHang;
|
||||||
unsigned int m_ysfRFModeHang;
|
unsigned int m_ysfRFModeHang;
|
||||||
unsigned int m_p25RFModeHang;
|
unsigned int m_p25RFModeHang;
|
||||||
|
unsigned int m_nxdnRFModeHang;
|
||||||
unsigned int m_dstarNetModeHang;
|
unsigned int m_dstarNetModeHang;
|
||||||
unsigned int m_dmrNetModeHang;
|
unsigned int m_dmrNetModeHang;
|
||||||
unsigned int m_ysfNetModeHang;
|
unsigned int m_ysfNetModeHang;
|
||||||
unsigned int m_p25NetModeHang;
|
unsigned int m_p25NetModeHang;
|
||||||
|
unsigned int m_nxdnNetModeHang;
|
||||||
CTimer m_modeTimer;
|
CTimer m_modeTimer;
|
||||||
CTimer m_dmrTXTimer;
|
CTimer m_dmrTXTimer;
|
||||||
CTimer m_cwIdTimer;
|
CTimer m_cwIdTimer;
|
||||||
|
|
@ -67,6 +69,7 @@ private:
|
||||||
bool m_dmrEnabled;
|
bool m_dmrEnabled;
|
||||||
bool m_ysfEnabled;
|
bool m_ysfEnabled;
|
||||||
bool m_p25Enabled;
|
bool m_p25Enabled;
|
||||||
|
bool m_nxdnEnabled;
|
||||||
unsigned int m_cwIdTime;
|
unsigned int m_cwIdTime;
|
||||||
CDMRLookup* m_lookup;
|
CDMRLookup* m_lookup;
|
||||||
std::string m_callsign;
|
std::string m_callsign;
|
||||||
|
|
|
||||||
|
|
@ -193,6 +193,8 @@
|
||||||
<ClInclude Include="NetworkInfo.h" />
|
<ClInclude Include="NetworkInfo.h" />
|
||||||
<ClInclude Include="Nextion.h" />
|
<ClInclude Include="Nextion.h" />
|
||||||
<ClInclude Include="NullDisplay.h" />
|
<ClInclude Include="NullDisplay.h" />
|
||||||
|
<ClInclude Include="NXDNControl.h" />
|
||||||
|
<ClInclude Include="NXDNDefines.h" />
|
||||||
<ClInclude Include="P25Audio.h" />
|
<ClInclude Include="P25Audio.h" />
|
||||||
<ClInclude Include="P25Control.h" />
|
<ClInclude Include="P25Control.h" />
|
||||||
<ClInclude Include="P25Defines.h" />
|
<ClInclude Include="P25Defines.h" />
|
||||||
|
|
@ -265,6 +267,7 @@
|
||||||
<ClCompile Include="NetworkInfo.cpp" />
|
<ClCompile Include="NetworkInfo.cpp" />
|
||||||
<ClCompile Include="Nextion.cpp" />
|
<ClCompile Include="Nextion.cpp" />
|
||||||
<ClCompile Include="NullDisplay.cpp" />
|
<ClCompile Include="NullDisplay.cpp" />
|
||||||
|
<ClCompile Include="NXDNControl.cpp" />
|
||||||
<ClCompile Include="P25Audio.cpp" />
|
<ClCompile Include="P25Audio.cpp" />
|
||||||
<ClCompile Include="P25Control.cpp" />
|
<ClCompile Include="P25Control.cpp" />
|
||||||
<ClCompile Include="P25Data.cpp" />
|
<ClCompile Include="P25Data.cpp" />
|
||||||
|
|
|
||||||
|
|
@ -230,6 +230,12 @@
|
||||||
<ClInclude Include="P25Trellis.h">
|
<ClInclude Include="P25Trellis.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="NXDNDefines.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="NXDNControl.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="BPTC19696.cpp">
|
<ClCompile Include="BPTC19696.cpp">
|
||||||
|
|
@ -430,5 +436,8 @@
|
||||||
<ClCompile Include="P25Trellis.cpp">
|
<ClCompile Include="P25Trellis.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="NXDNControl.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
6
Makefile
6
Makefile
|
|
@ -9,9 +9,9 @@ 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 DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o Golay2087.o \
|
||||||
Golay24128.o Hamming.o JitterBuffer.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o P25Audio.o P25Control.o \
|
Golay24128.o Hamming.o JitterBuffer.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NXDNControl.o P25Audio.o \
|
||||||
P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o SHA256.o \
|
P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.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
|
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
|
all: MMDVMHost
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,9 +9,9 @@ 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 DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o Golay2087.o \
|
||||||
Golay24128.o Hamming.o JitterBuffer.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o P25Audio.o P25Control.o \
|
Golay24128.o Hamming.o JitterBuffer.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NXDNControl.o P25Audio.o \
|
||||||
P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o SHA256.o \
|
P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.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
|
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
|
all: MMDVMHost
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,8 +9,8 @@ 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 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 JitterBuffer.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o P25Audio.o \
|
Golay24128.o Hamming.o HD44780.o JitterBuffer.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NXDNControl.o \
|
||||||
P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o \
|
P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.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
|
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
|
all: MMDVMHost
|
||||||
|
|
|
||||||
|
|
@ -9,8 +9,8 @@ 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 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 JitterBuffer.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o P25Audio.o \
|
Golay24128.o Hamming.o HD44780.o JitterBuffer.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NXDNControl.o \
|
||||||
P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o \
|
P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.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
|
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
|
all: MMDVMHost
|
||||||
|
|
|
||||||
|
|
@ -9,8 +9,8 @@ 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 DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o Golay2087.o \
|
||||||
Golay24128.o Hamming.o JitterBuffer.o OLED.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o P25Audio.o \
|
Golay24128.o Hamming.o JitterBuffer.o OLED.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NXDNControl.o \
|
||||||
P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o \
|
P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.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
|
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
|
all: MMDVMHost
|
||||||
|
|
|
||||||
|
|
@ -9,8 +9,8 @@ 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 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 JitterBuffer.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o P25Audio.o \
|
Golay24128.o Hamming.o HD44780.o JitterBuffer.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NXDNControl.o \
|
||||||
P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o \
|
P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.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
|
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
|
all: MMDVMHost
|
||||||
|
|
|
||||||
|
|
@ -9,9 +9,9 @@ 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 DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o Golay2087.o \
|
||||||
Golay24128.o Hamming.o JitterBuffer.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o P25Audio.o P25Control.o \
|
Golay24128.o Hamming.o JitterBuffer.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NXDNControl.o P25Audio.o \
|
||||||
P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o SHA256.o \
|
P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.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
|
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
|
all: MMDVMHost
|
||||||
|
|
||||||
|
|
|
||||||
119
Modem.cpp
119
Modem.cpp
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2011-2017 by Jonathan Naylor G4KLX
|
* Copyright (C) 2011-2018 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
|
||||||
|
|
@ -20,6 +20,7 @@
|
||||||
#include "DMRDefines.h"
|
#include "DMRDefines.h"
|
||||||
#include "YSFDefines.h"
|
#include "YSFDefines.h"
|
||||||
#include "P25Defines.h"
|
#include "P25Defines.h"
|
||||||
|
#include "NXDNDefines.h"
|
||||||
#include "Thread.h"
|
#include "Thread.h"
|
||||||
#include "Modem.h"
|
#include "Modem.h"
|
||||||
#include "Utils.h"
|
#include "Utils.h"
|
||||||
|
|
@ -67,6 +68,9 @@ const unsigned char MMDVM_P25_HDR = 0x30U;
|
||||||
const unsigned char MMDVM_P25_LDU = 0x31U;
|
const unsigned char MMDVM_P25_LDU = 0x31U;
|
||||||
const unsigned char MMDVM_P25_LOST = 0x32U;
|
const unsigned char MMDVM_P25_LOST = 0x32U;
|
||||||
|
|
||||||
|
const unsigned char MMDVM_NXDN_DATA = 0x40U;
|
||||||
|
const unsigned char MMDVM_NXDN_LOST = 0x41U;
|
||||||
|
|
||||||
const unsigned char MMDVM_ACK = 0x70U;
|
const unsigned char MMDVM_ACK = 0x70U;
|
||||||
const unsigned char MMDVM_NAK = 0x7FU;
|
const unsigned char MMDVM_NAK = 0x7FU;
|
||||||
|
|
||||||
|
|
@ -99,6 +103,7 @@ m_dstarTXLevel(0U),
|
||||||
m_dmrTXLevel(0U),
|
m_dmrTXLevel(0U),
|
||||||
m_ysfTXLevel(0U),
|
m_ysfTXLevel(0U),
|
||||||
m_p25TXLevel(0U),
|
m_p25TXLevel(0U),
|
||||||
|
m_nxdnTXLevel(0U),
|
||||||
m_trace(trace),
|
m_trace(trace),
|
||||||
m_debug(debug),
|
m_debug(debug),
|
||||||
m_rxFrequency(0U),
|
m_rxFrequency(0U),
|
||||||
|
|
@ -107,6 +112,7 @@ m_dstarEnabled(false),
|
||||||
m_dmrEnabled(false),
|
m_dmrEnabled(false),
|
||||||
m_ysfEnabled(false),
|
m_ysfEnabled(false),
|
||||||
m_p25Enabled(false),
|
m_p25Enabled(false),
|
||||||
|
m_nxdnEnabled(false),
|
||||||
m_rxDCOffset(0),
|
m_rxDCOffset(0),
|
||||||
m_txDCOffset(0),
|
m_txDCOffset(0),
|
||||||
m_serial(port, SERIAL_115200, true),
|
m_serial(port, SERIAL_115200, true),
|
||||||
|
|
@ -123,6 +129,8 @@ m_rxYSFData(1000U, "Modem RX YSF"),
|
||||||
m_txYSFData(1000U, "Modem TX YSF"),
|
m_txYSFData(1000U, "Modem TX YSF"),
|
||||||
m_rxP25Data(1000U, "Modem RX P25"),
|
m_rxP25Data(1000U, "Modem RX P25"),
|
||||||
m_txP25Data(1000U, "Modem TX P25"),
|
m_txP25Data(1000U, "Modem TX P25"),
|
||||||
|
m_rxNXDNData(1000U, "Modem RX NXDN"),
|
||||||
|
m_txNXDNData(1000U, "Modem TX NXDN"),
|
||||||
m_statusTimer(1000U, 0U, 250U),
|
m_statusTimer(1000U, 0U, 250U),
|
||||||
m_inactivityTimer(1000U, 2U),
|
m_inactivityTimer(1000U, 2U),
|
||||||
m_playoutTimer(1000U, 0U, 10U),
|
m_playoutTimer(1000U, 0U, 10U),
|
||||||
|
|
@ -131,6 +139,7 @@ m_dmrSpace1(0U),
|
||||||
m_dmrSpace2(0U),
|
m_dmrSpace2(0U),
|
||||||
m_ysfSpace(0U),
|
m_ysfSpace(0U),
|
||||||
m_p25Space(0U),
|
m_p25Space(0U),
|
||||||
|
m_nxdnSpace(0U),
|
||||||
m_tx(false),
|
m_tx(false),
|
||||||
m_cd(false),
|
m_cd(false),
|
||||||
m_lockout(false),
|
m_lockout(false),
|
||||||
|
|
@ -153,18 +162,19 @@ void CModem::setRFParams(unsigned int rxFrequency, int rxOffset, unsigned int tx
|
||||||
m_txFrequency = txFrequency + txOffset;
|
m_txFrequency = txFrequency + txOffset;
|
||||||
m_txDCOffset = txDCOffset;
|
m_txDCOffset = txDCOffset;
|
||||||
m_rxDCOffset = rxDCOffset;
|
m_rxDCOffset = rxDCOffset;
|
||||||
m_rfLevel = rfLevel;
|
m_rfLevel = rfLevel;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CModem::setModeParams(bool dstarEnabled, bool dmrEnabled, bool ysfEnabled, bool p25Enabled)
|
void CModem::setModeParams(bool dstarEnabled, bool dmrEnabled, bool ysfEnabled, bool p25Enabled, bool nxdnEnabled)
|
||||||
{
|
{
|
||||||
m_dstarEnabled = dstarEnabled;
|
m_dstarEnabled = dstarEnabled;
|
||||||
m_dmrEnabled = dmrEnabled;
|
m_dmrEnabled = dmrEnabled;
|
||||||
m_ysfEnabled = ysfEnabled;
|
m_ysfEnabled = ysfEnabled;
|
||||||
m_p25Enabled = p25Enabled;
|
m_p25Enabled = p25Enabled;
|
||||||
|
m_nxdnEnabled = nxdnEnabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CModem::setLevels(float rxLevel, float cwIdTXLevel, float dstarTXLevel, float dmrTXLevel, float ysfTXLevel, float p25TXLevel)
|
void CModem::setLevels(float rxLevel, float cwIdTXLevel, float dstarTXLevel, float dmrTXLevel, float ysfTXLevel, float p25TXLevel, float nxdnTXLevel)
|
||||||
{
|
{
|
||||||
m_rxLevel = rxLevel;
|
m_rxLevel = rxLevel;
|
||||||
m_cwIdTXLevel = cwIdTXLevel;
|
m_cwIdTXLevel = cwIdTXLevel;
|
||||||
|
|
@ -172,6 +182,7 @@ void CModem::setLevels(float rxLevel, float cwIdTXLevel, float dstarTXLevel, flo
|
||||||
m_dmrTXLevel = dmrTXLevel;
|
m_dmrTXLevel = dmrTXLevel;
|
||||||
m_ysfTXLevel = ysfTXLevel;
|
m_ysfTXLevel = ysfTXLevel;
|
||||||
m_p25TXLevel = p25TXLevel;
|
m_p25TXLevel = p25TXLevel;
|
||||||
|
m_nxdnTXLevel = nxdnTXLevel;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CModem::setDMRParams(unsigned int colorCode)
|
void CModem::setDMRParams(unsigned int colorCode)
|
||||||
|
|
@ -429,6 +440,32 @@ void CModem::clock(unsigned int ms)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case MMDVM_NXDN_DATA: {
|
||||||
|
if (m_trace)
|
||||||
|
CUtils::dump(1U, "RX NXDN Data", m_buffer, m_length);
|
||||||
|
|
||||||
|
unsigned char data = m_length - 2U;
|
||||||
|
m_rxNXDNData.addData(&data, 1U);
|
||||||
|
|
||||||
|
data = TAG_DATA;
|
||||||
|
m_rxNXDNData.addData(&data, 1U);
|
||||||
|
|
||||||
|
m_rxNXDNData.addData(m_buffer + 3U, m_length - 3U);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MMDVM_NXDN_LOST: {
|
||||||
|
if (m_trace)
|
||||||
|
CUtils::dump(1U, "RX NXDN Lost", m_buffer, m_length);
|
||||||
|
|
||||||
|
unsigned char data = 1U;
|
||||||
|
m_rxNXDNData.addData(&data, 1U);
|
||||||
|
|
||||||
|
data = TAG_LOST;
|
||||||
|
m_rxNXDNData.addData(&data, 1U);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case MMDVM_GET_STATUS: {
|
case MMDVM_GET_STATUS: {
|
||||||
// if (m_trace)
|
// if (m_trace)
|
||||||
// CUtils::dump(1U, "GET_STATUS", m_buffer, m_length);
|
// CUtils::dump(1U, "GET_STATUS", m_buffer, m_length);
|
||||||
|
|
@ -460,6 +497,7 @@ void CModem::clock(unsigned int ms)
|
||||||
m_dmrSpace2 = m_buffer[8U];
|
m_dmrSpace2 = m_buffer[8U];
|
||||||
m_ysfSpace = m_buffer[9U];
|
m_ysfSpace = m_buffer[9U];
|
||||||
m_p25Space = m_buffer[10U];
|
m_p25Space = m_buffer[10U];
|
||||||
|
m_nxdnSpace = m_buffer[11U];
|
||||||
|
|
||||||
m_inactivityTimer.start();
|
m_inactivityTimer.start();
|
||||||
// LogMessage("status=%02X, tx=%d, space=%u,%u,%u,%u,%u lockout=%d, cd=%d", m_buffer[5U], int(m_tx), m_dstarSpace, m_dmrSpace1, m_dmrSpace2, m_ysfSpace, m_p25Space, int(m_lockout), int(m_cd));
|
// LogMessage("status=%02X, tx=%d, space=%u,%u,%u,%u,%u lockout=%d, cd=%d", m_buffer[5U], int(m_tx), m_dstarSpace, m_dmrSpace1, m_dmrSpace2, m_ysfSpace, m_p25Space, int(m_lockout), int(m_cd));
|
||||||
|
|
@ -603,6 +641,23 @@ void CModem::clock(unsigned int ms)
|
||||||
|
|
||||||
m_p25Space--;
|
m_p25Space--;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_nxdnSpace > 1U && !m_txNXDNData.isEmpty()) {
|
||||||
|
unsigned char len = 0U;
|
||||||
|
m_txNXDNData.getData(&len, 1U);
|
||||||
|
m_txNXDNData.getData(m_buffer, len);
|
||||||
|
|
||||||
|
if (m_trace)
|
||||||
|
CUtils::dump(1U, "TX NXDN Data", m_buffer, len);
|
||||||
|
|
||||||
|
int ret = m_serial.write(m_buffer, len);
|
||||||
|
if (ret != int(len))
|
||||||
|
LogWarning("Error when writing NXDN data to the MMDVM");
|
||||||
|
|
||||||
|
m_playoutTimer.start();
|
||||||
|
|
||||||
|
m_nxdnSpace--;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CModem::close()
|
void CModem::close()
|
||||||
|
|
@ -682,6 +737,20 @@ unsigned int CModem::readP25Data(unsigned char* data)
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned int CModem::readNXDNData(unsigned char* data)
|
||||||
|
{
|
||||||
|
assert(data != NULL);
|
||||||
|
|
||||||
|
if (m_rxNXDNData.isEmpty())
|
||||||
|
return 0U;
|
||||||
|
|
||||||
|
unsigned char len = 0U;
|
||||||
|
m_rxNXDNData.getData(&len, 1U);
|
||||||
|
m_rxNXDNData.getData(data, len);
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
// To be implemented later if needed
|
// To be implemented later if needed
|
||||||
unsigned int CModem::readSerial(unsigned char* data, unsigned int length)
|
unsigned int CModem::readSerial(unsigned char* data, unsigned int length)
|
||||||
{
|
{
|
||||||
|
|
@ -852,6 +921,36 @@ bool CModem::writeP25Data(const unsigned char* data, unsigned int length)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CModem::hasNXDNSpace() const
|
||||||
|
{
|
||||||
|
unsigned int space = m_txNXDNData.freeSpace() / (NXDN_FRAME_LENGTH_BYTES + 4U);
|
||||||
|
|
||||||
|
return space > 1U;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CModem::writeNXDNData(const unsigned char* data, unsigned int length)
|
||||||
|
{
|
||||||
|
assert(data != NULL);
|
||||||
|
assert(length > 0U);
|
||||||
|
|
||||||
|
if (data[0U] != TAG_DATA && data[0U] != TAG_EOT)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
unsigned char buffer[130U];
|
||||||
|
|
||||||
|
buffer[0U] = MMDVM_FRAME_START;
|
||||||
|
buffer[1U] = length + 2U;
|
||||||
|
buffer[2U] = MMDVM_NXDN_DATA;
|
||||||
|
|
||||||
|
::memcpy(buffer + 3U, data + 1U, length - 1U);
|
||||||
|
|
||||||
|
unsigned char len = length + 2U;
|
||||||
|
m_txNXDNData.addData(&len, 1U);
|
||||||
|
m_txNXDNData.addData(buffer, len);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool CModem::writeSerial(const unsigned char* data, unsigned int length)
|
bool CModem::writeSerial(const unsigned char* data, unsigned int length)
|
||||||
{
|
{
|
||||||
assert(data != NULL);
|
assert(data != NULL);
|
||||||
|
|
@ -958,7 +1057,7 @@ bool CModem::setConfig()
|
||||||
|
|
||||||
buffer[0U] = MMDVM_FRAME_START;
|
buffer[0U] = MMDVM_FRAME_START;
|
||||||
|
|
||||||
buffer[1U] = 18U;
|
buffer[1U] = 19U;
|
||||||
|
|
||||||
buffer[2U] = MMDVM_SET_CONFIG;
|
buffer[2U] = MMDVM_SET_CONFIG;
|
||||||
|
|
||||||
|
|
@ -985,6 +1084,8 @@ bool CModem::setConfig()
|
||||||
buffer[4U] |= 0x04U;
|
buffer[4U] |= 0x04U;
|
||||||
if (m_p25Enabled)
|
if (m_p25Enabled)
|
||||||
buffer[4U] |= 0x08U;
|
buffer[4U] |= 0x08U;
|
||||||
|
if (m_nxdnEnabled)
|
||||||
|
buffer[4U] |= 0x10U;
|
||||||
|
|
||||||
buffer[5U] = m_txDelay / 10U; // In 10ms units
|
buffer[5U] = m_txDelay / 10U; // In 10ms units
|
||||||
|
|
||||||
|
|
@ -1008,10 +1109,12 @@ bool CModem::setConfig()
|
||||||
buffer[16U] = (unsigned char)(m_txDCOffset + 128);
|
buffer[16U] = (unsigned char)(m_txDCOffset + 128);
|
||||||
buffer[17U] = (unsigned char)(m_rxDCOffset + 128);
|
buffer[17U] = (unsigned char)(m_rxDCOffset + 128);
|
||||||
|
|
||||||
// CUtils::dump(1U, "Written", buffer, 18U);
|
buffer[18U] = (unsigned char)(m_nxdnTXLevel * 2.55F + 0.5F);
|
||||||
|
|
||||||
int ret = m_serial.write(buffer, 18U);
|
// CUtils::dump(1U, "Written", buffer, 19U);
|
||||||
if (ret != 18)
|
|
||||||
|
int ret = m_serial.write(buffer, 19U);
|
||||||
|
if (ret != 19)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
unsigned int count = 0U;
|
unsigned int count = 0U;
|
||||||
|
|
|
||||||
14
Modem.h
14
Modem.h
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2011-2017 by Jonathan Naylor G4KLX
|
* Copyright (C) 2011-2018 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
|
||||||
|
|
@ -38,8 +38,8 @@ public:
|
||||||
~CModem();
|
~CModem();
|
||||||
|
|
||||||
void setRFParams(unsigned int rxFrequency, int rxOffset, unsigned int txFrequency, int txOffset, int txDCOffset, int rxDCOffset, float rfLevel);
|
void setRFParams(unsigned int rxFrequency, int rxOffset, unsigned int txFrequency, int txOffset, int txDCOffset, int rxDCOffset, float rfLevel);
|
||||||
void setModeParams(bool dstarEnabled, bool dmrEnabled, bool ysfEnabled, bool p25Enabled);
|
void setModeParams(bool dstarEnabled, bool dmrEnabled, bool ysfEnabled, bool p25Enabled, bool nxdnEnabled);
|
||||||
void setLevels(float rxLevel, float cwIdTXLevel, float dstarTXLevel, float dmrTXLevel, float ysfTXLevel, float p25Enabled);
|
void setLevels(float rxLevel, float cwIdTXLevel, float dstarTXLevel, float dmrTXLevel, float ysfTXLevel, float p25TXLevel, float nxdnTXLevel);
|
||||||
void setDMRParams(unsigned int colorCode);
|
void setDMRParams(unsigned int colorCode);
|
||||||
void setYSFParams(bool loDev);
|
void setYSFParams(bool loDev);
|
||||||
|
|
||||||
|
|
@ -50,6 +50,7 @@ public:
|
||||||
unsigned int readDMRData2(unsigned char* data);
|
unsigned int readDMRData2(unsigned char* data);
|
||||||
unsigned int readYSFData(unsigned char* data);
|
unsigned int readYSFData(unsigned char* data);
|
||||||
unsigned int readP25Data(unsigned char* data);
|
unsigned int readP25Data(unsigned char* data);
|
||||||
|
unsigned int readNXDNData(unsigned char* data);
|
||||||
|
|
||||||
unsigned int readSerial(unsigned char* data, unsigned int length);
|
unsigned int readSerial(unsigned char* data, unsigned int length);
|
||||||
|
|
||||||
|
|
@ -58,6 +59,7 @@ public:
|
||||||
bool hasDMRSpace2() const;
|
bool hasDMRSpace2() const;
|
||||||
bool hasYSFSpace() const;
|
bool hasYSFSpace() const;
|
||||||
bool hasP25Space() const;
|
bool hasP25Space() const;
|
||||||
|
bool hasNXDNSpace() const;
|
||||||
|
|
||||||
bool hasTX() const;
|
bool hasTX() const;
|
||||||
bool hasCD() const;
|
bool hasCD() const;
|
||||||
|
|
@ -70,6 +72,7 @@ public:
|
||||||
bool writeDMRData2(const unsigned char* data, unsigned int length);
|
bool writeDMRData2(const unsigned char* data, unsigned int length);
|
||||||
bool writeYSFData(const unsigned char* data, unsigned int length);
|
bool writeYSFData(const unsigned char* data, unsigned int length);
|
||||||
bool writeP25Data(const unsigned char* data, unsigned int length);
|
bool writeP25Data(const unsigned char* data, unsigned int length);
|
||||||
|
bool writeNXDNData(const unsigned char* data, unsigned int length);
|
||||||
|
|
||||||
bool writeDMRStart(bool tx);
|
bool writeDMRStart(bool tx);
|
||||||
bool writeDMRShortLC(const unsigned char* lc);
|
bool writeDMRShortLC(const unsigned char* lc);
|
||||||
|
|
@ -103,6 +106,7 @@ private:
|
||||||
float m_dmrTXLevel;
|
float m_dmrTXLevel;
|
||||||
float m_ysfTXLevel;
|
float m_ysfTXLevel;
|
||||||
float m_p25TXLevel;
|
float m_p25TXLevel;
|
||||||
|
float m_nxdnTXLevel;
|
||||||
float m_rfLevel;
|
float m_rfLevel;
|
||||||
bool m_trace;
|
bool m_trace;
|
||||||
bool m_debug;
|
bool m_debug;
|
||||||
|
|
@ -112,6 +116,7 @@ private:
|
||||||
bool m_dmrEnabled;
|
bool m_dmrEnabled;
|
||||||
bool m_ysfEnabled;
|
bool m_ysfEnabled;
|
||||||
bool m_p25Enabled;
|
bool m_p25Enabled;
|
||||||
|
bool m_nxdnEnabled;
|
||||||
int m_rxDCOffset;
|
int m_rxDCOffset;
|
||||||
int m_txDCOffset;
|
int m_txDCOffset;
|
||||||
CSerialController m_serial;
|
CSerialController m_serial;
|
||||||
|
|
@ -128,6 +133,8 @@ private:
|
||||||
CRingBuffer<unsigned char> m_txYSFData;
|
CRingBuffer<unsigned char> m_txYSFData;
|
||||||
CRingBuffer<unsigned char> m_rxP25Data;
|
CRingBuffer<unsigned char> m_rxP25Data;
|
||||||
CRingBuffer<unsigned char> m_txP25Data;
|
CRingBuffer<unsigned char> m_txP25Data;
|
||||||
|
CRingBuffer<unsigned char> m_rxNXDNData;
|
||||||
|
CRingBuffer<unsigned char> m_txNXDNData;
|
||||||
CTimer m_statusTimer;
|
CTimer m_statusTimer;
|
||||||
CTimer m_inactivityTimer;
|
CTimer m_inactivityTimer;
|
||||||
CTimer m_playoutTimer;
|
CTimer m_playoutTimer;
|
||||||
|
|
@ -136,6 +143,7 @@ private:
|
||||||
unsigned int m_dmrSpace2;
|
unsigned int m_dmrSpace2;
|
||||||
unsigned int m_ysfSpace;
|
unsigned int m_ysfSpace;
|
||||||
unsigned int m_p25Space;
|
unsigned int m_p25Space;
|
||||||
|
unsigned int m_nxdnSpace;
|
||||||
bool m_tx;
|
bool m_tx;
|
||||||
bool m_cd;
|
bool m_cd;
|
||||||
bool m_lockout;
|
bool m_lockout;
|
||||||
|
|
|
||||||
1244
NXDNControl.cpp
Normal file
1244
NXDNControl.cpp
Normal file
File diff suppressed because it is too large
Load diff
110
NXDNControl.h
Normal file
110
NXDNControl.h
Normal file
|
|
@ -0,0 +1,110 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2015,2016,2017,2018 by Jonathan Naylor G4KLX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !defined(NXDNControl_H)
|
||||||
|
#define NXDNControl_H
|
||||||
|
|
||||||
|
#include "RSSIInterpolator.h"
|
||||||
|
// #include "YSFNetwork.h"
|
||||||
|
#include "NXDNDefines.h"
|
||||||
|
// #include "YSFPayload.h"
|
||||||
|
#include "RingBuffer.h"
|
||||||
|
#include "StopWatch.h"
|
||||||
|
// #include "YSFFICH.h"
|
||||||
|
#include "Display.h"
|
||||||
|
#include "Defines.h"
|
||||||
|
#include "Timer.h"
|
||||||
|
#include "Modem.h"
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
class CNXDNControl {
|
||||||
|
public:
|
||||||
|
CNXDNControl(const std::string& callsign, bool selfOnly, CYSFNetwork* network, CDisplay* display, unsigned int timeout, bool duplex, bool lowDeviation, bool remoteGateway, CRSSIInterpolator* rssiMapper);
|
||||||
|
~CNXDNControl();
|
||||||
|
|
||||||
|
void setSQL(bool on, unsigned char value);
|
||||||
|
|
||||||
|
bool writeModem(unsigned char* data, unsigned int len);
|
||||||
|
|
||||||
|
unsigned int readModem(unsigned char* data);
|
||||||
|
|
||||||
|
void clock(unsigned int ms);
|
||||||
|
|
||||||
|
private:
|
||||||
|
unsigned char* m_callsign;
|
||||||
|
unsigned char* m_selfCallsign;
|
||||||
|
bool m_selfOnly;
|
||||||
|
CYSFNetwork* m_network;
|
||||||
|
CDisplay* m_display;
|
||||||
|
bool m_duplex;
|
||||||
|
bool m_lowDeviation;
|
||||||
|
bool m_remoteGateway;
|
||||||
|
bool m_sqlEnabled;
|
||||||
|
unsigned char m_sqlValue;
|
||||||
|
CRingBuffer<unsigned char> m_queue;
|
||||||
|
RPT_RF_STATE m_rfState;
|
||||||
|
RPT_NET_STATE m_netState;
|
||||||
|
CTimer m_rfTimeoutTimer;
|
||||||
|
CTimer m_netTimeoutTimer;
|
||||||
|
CTimer m_packetTimer;
|
||||||
|
CTimer m_networkWatchdog;
|
||||||
|
CStopWatch m_elapsed;
|
||||||
|
unsigned int m_rfFrames;
|
||||||
|
unsigned int m_netFrames;
|
||||||
|
unsigned int m_netLost;
|
||||||
|
unsigned int m_rfErrs;
|
||||||
|
unsigned int m_rfBits;
|
||||||
|
unsigned int m_netErrs;
|
||||||
|
unsigned int m_netBits;
|
||||||
|
unsigned char* m_rfSource;
|
||||||
|
unsigned char* m_rfDest;
|
||||||
|
unsigned char* m_netSource;
|
||||||
|
unsigned char* m_netDest;
|
||||||
|
CYSFFICH m_lastFICH;
|
||||||
|
unsigned char m_netN;
|
||||||
|
CYSFPayload m_rfPayload;
|
||||||
|
CYSFPayload m_netPayload;
|
||||||
|
CRSSIInterpolator* m_rssiMapper;
|
||||||
|
unsigned char m_rssi;
|
||||||
|
unsigned char m_maxRSSI;
|
||||||
|
unsigned char m_minRSSI;
|
||||||
|
unsigned int m_aveRSSI;
|
||||||
|
unsigned int m_rssiCount;
|
||||||
|
FILE* m_fp;
|
||||||
|
|
||||||
|
bool processVWData(bool valid, unsigned char *data);
|
||||||
|
bool processDNData(bool valid, unsigned char *data);
|
||||||
|
bool processFRData(bool valid, unsigned char *data);
|
||||||
|
|
||||||
|
void writeQueueRF(const unsigned char* data);
|
||||||
|
void writeQueueNet(const unsigned char* data);
|
||||||
|
void writeNetwork(const unsigned char* data, unsigned int count);
|
||||||
|
void writeNetwork();
|
||||||
|
|
||||||
|
void writeEndRF();
|
||||||
|
void writeEndNet();
|
||||||
|
|
||||||
|
bool openFile();
|
||||||
|
bool writeFile(const unsigned char* data);
|
||||||
|
void closeFile();
|
||||||
|
|
||||||
|
bool checkCallsign(const unsigned char* callsign) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
35
NXDNDefines.h
Normal file
35
NXDNDefines.h
Normal file
|
|
@ -0,0 +1,35 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2016,2017,2018 by Jonathan Naylor G4KLX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !defined(NXDNDEFINES_H)
|
||||||
|
#define NXDNDEFINES_H
|
||||||
|
|
||||||
|
const unsigned int NXDN_RADIO_SYMBOL_LENGTH = 5U; // At 24 kHz sample rate
|
||||||
|
|
||||||
|
const unsigned int NXDN_FRAME_LENGTH_BYTES = 48U;
|
||||||
|
|
||||||
|
const unsigned int NXDN_FSW_LENGTH_BITS = 20U;
|
||||||
|
const unsigned int NXDN_FSW_LENGTH_SYMBOLS = NXDN_FSW_LENGTH_BITS / 2U;
|
||||||
|
const unsigned int NXDN_FSW_LENGTH_SAMPLES = NXDN_FSW_LENGTH_SYMBOLS * NXDN_RADIO_SYMBOL_LENGTH;
|
||||||
|
|
||||||
|
const unsigned char NXDN_FSW_BYTES[] = {0x0CU, 0xDFU, 0x59U};
|
||||||
|
const unsigned char NXDN_FSW_BYTES_MASK[] = {0x0FU, 0xFFU, 0xFFU};
|
||||||
|
const unsigned int NXDN_FSW_BYTES_LENGTH = 3U;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
Loading…
Reference in a new issue