mirror of
https://github.com/g4klx/MMDVMHost.git
synced 2025-12-06 05:32:00 +01:00
Merge branch 'master' into nxdn
This commit is contained in:
commit
10b0d3c14c
6
Conf.cpp
6
Conf.cpp
|
|
@ -113,7 +113,7 @@ m_dstarErrorReply(true),
|
||||||
m_dstarRemoteGateway(false),
|
m_dstarRemoteGateway(false),
|
||||||
m_dstarModeHang(10U),
|
m_dstarModeHang(10U),
|
||||||
m_dmrEnabled(false),
|
m_dmrEnabled(false),
|
||||||
m_dmrBeacons(false),
|
m_dmrBeacons(0U),
|
||||||
m_dmrId(0U),
|
m_dmrId(0U),
|
||||||
m_dmrColorCode(2U),
|
m_dmrColorCode(2U),
|
||||||
m_dmrSelfOnly(false),
|
m_dmrSelfOnly(false),
|
||||||
|
|
@ -445,7 +445,7 @@ bool CConf::read()
|
||||||
if (::strcmp(key, "Enable") == 0)
|
if (::strcmp(key, "Enable") == 0)
|
||||||
m_dmrEnabled = ::atoi(value) == 1;
|
m_dmrEnabled = ::atoi(value) == 1;
|
||||||
else if (::strcmp(key, "Beacons") == 0)
|
else if (::strcmp(key, "Beacons") == 0)
|
||||||
m_dmrBeacons = ::atoi(value) == 1;
|
m_dmrBeacons = (unsigned int)::atoi(value);
|
||||||
else if (::strcmp(key, "Id") == 0)
|
else if (::strcmp(key, "Id") == 0)
|
||||||
m_dmrId = (unsigned int)::atoi(value);
|
m_dmrId = (unsigned int)::atoi(value);
|
||||||
else if (::strcmp(key, "ColorCode") == 0)
|
else if (::strcmp(key, "ColorCode") == 0)
|
||||||
|
|
@ -983,7 +983,7 @@ bool CConf::getDMREnabled() const
|
||||||
return m_dmrEnabled;
|
return m_dmrEnabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CConf::getDMRBeacons() const
|
unsigned int CConf::getDMRBeacons() const
|
||||||
{
|
{
|
||||||
return m_dmrBeacons;
|
return m_dmrBeacons;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
4
Conf.h
4
Conf.h
|
|
@ -104,7 +104,7 @@ public:
|
||||||
|
|
||||||
// The DMR section
|
// The DMR section
|
||||||
bool getDMREnabled() const;
|
bool getDMREnabled() const;
|
||||||
bool getDMRBeacons() const;
|
unsigned int getDMRBeacons() const;
|
||||||
unsigned int getDMRId() const;
|
unsigned int getDMRId() const;
|
||||||
unsigned int getDMRColorCode() const;
|
unsigned int getDMRColorCode() const;
|
||||||
bool getDMREmbeddedLCOnly() const;
|
bool getDMREmbeddedLCOnly() const;
|
||||||
|
|
@ -297,7 +297,7 @@ private:
|
||||||
unsigned int m_dstarModeHang;
|
unsigned int m_dstarModeHang;
|
||||||
|
|
||||||
bool m_dmrEnabled;
|
bool m_dmrEnabled;
|
||||||
bool m_dmrBeacons;
|
unsigned int m_dmrBeacons;
|
||||||
unsigned int m_dmrId;
|
unsigned int m_dmrId;
|
||||||
unsigned int m_dmrColorCode;
|
unsigned int m_dmrColorCode;
|
||||||
bool m_dmrSelfOnly;
|
bool m_dmrSelfOnly;
|
||||||
|
|
|
||||||
|
|
@ -498,8 +498,19 @@ void CDMRNetwork::receiveData(const unsigned char* data, unsigned int length)
|
||||||
if (slotNo == 2U && !m_slot2)
|
if (slotNo == 2U && !m_slot2)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
unsigned char seqNo = data[4U];
|
unsigned char dataType = data[15U] & 0x3FU;
|
||||||
m_jitterBuffers[slotNo]->addData(data, length, seqNo);
|
if (dataType == (0x20U | DT_CSBK) ||
|
||||||
|
dataType == (0x20U | DT_DATA_HEADER) ||
|
||||||
|
dataType == (0x20U | DT_RATE_1_DATA) ||
|
||||||
|
dataType == (0x20U | DT_RATE_34_DATA) ||
|
||||||
|
dataType == (0x20U | DT_RATE_12_DATA)) {
|
||||||
|
// Data & CSBK frames
|
||||||
|
m_jitterBuffers[slotNo]->appendData(data, length);
|
||||||
|
} else {
|
||||||
|
// Voice frames
|
||||||
|
unsigned char seqNo = data[4U];
|
||||||
|
m_jitterBuffers[slotNo]->addData(data, length, seqNo);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CDMRNetwork::writeLogin()
|
bool CDMRNetwork::writeLogin()
|
||||||
|
|
|
||||||
|
|
@ -36,6 +36,7 @@ m_stopWatch(),
|
||||||
m_running(false),
|
m_running(false),
|
||||||
m_buffer(NULL),
|
m_buffer(NULL),
|
||||||
m_headSequenceNumber(0U),
|
m_headSequenceNumber(0U),
|
||||||
|
m_appendSequenceNumber(0U),
|
||||||
m_lastData(NULL),
|
m_lastData(NULL),
|
||||||
m_lastDataLength(0U)
|
m_lastDataLength(0U)
|
||||||
{
|
{
|
||||||
|
|
@ -115,6 +116,52 @@ bool CJitterBuffer::addData(const unsigned char* data, unsigned int length, unsi
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CJitterBuffer::appendData(const unsigned char* data, unsigned int length)
|
||||||
|
{
|
||||||
|
assert(data != NULL);
|
||||||
|
assert(length > 0U);
|
||||||
|
assert(length <= m_blockSize);
|
||||||
|
|
||||||
|
unsigned int headSequenceNumber = m_headSequenceNumber % m_topSequenceNumber;
|
||||||
|
unsigned int tailSequenceNumber = (m_headSequenceNumber + m_blockCount) % m_topSequenceNumber;
|
||||||
|
|
||||||
|
// Is the data out of sequence?
|
||||||
|
if (headSequenceNumber < tailSequenceNumber) {
|
||||||
|
if (m_appendSequenceNumber < headSequenceNumber || m_appendSequenceNumber >= tailSequenceNumber) {
|
||||||
|
LogDebug("%s, JitterBuffer: rejecting append frame with seqNo=%u, raw=%u, head=%u, tail=%u", m_name.c_str(), m_appendSequenceNumber, m_headSequenceNumber, headSequenceNumber, tailSequenceNumber);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (m_appendSequenceNumber >= tailSequenceNumber && m_appendSequenceNumber < headSequenceNumber) {
|
||||||
|
LogDebug("%s, JitterBuffer: rejecting append frame with seqNo=%u, raw=%u, head=%u, tail=%u", m_name.c_str(), m_appendSequenceNumber, m_headSequenceNumber, headSequenceNumber, tailSequenceNumber);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int number;
|
||||||
|
if (m_appendSequenceNumber >= headSequenceNumber)
|
||||||
|
number = m_appendSequenceNumber - headSequenceNumber;
|
||||||
|
else
|
||||||
|
number = (m_appendSequenceNumber + m_blockCount) - headSequenceNumber;;
|
||||||
|
|
||||||
|
unsigned int index = (m_headSequenceNumber + number) % m_blockCount;
|
||||||
|
|
||||||
|
if (m_debug)
|
||||||
|
LogDebug("%s, JitterBuffer: appending frame with seqNo=%u, pos=%u, raw=%u, head=%u, tail=%u", m_name.c_str(), m_appendSequenceNumber, index, m_headSequenceNumber, headSequenceNumber, tailSequenceNumber);
|
||||||
|
|
||||||
|
::memcpy(m_buffer[index].m_data, data, length);
|
||||||
|
m_buffer[index].m_length = length;
|
||||||
|
|
||||||
|
if (!m_timer.isRunning()) {
|
||||||
|
LogDebug("%s, JitterBuffer: starting the timer from append", m_name.c_str());
|
||||||
|
m_timer.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
m_appendSequenceNumber++;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
JB_STATUS CJitterBuffer::getData(unsigned char* data, unsigned int& length)
|
JB_STATUS CJitterBuffer::getData(unsigned char* data, unsigned int& length)
|
||||||
{
|
{
|
||||||
assert(data != NULL);
|
assert(data != NULL);
|
||||||
|
|
@ -168,6 +215,7 @@ void CJitterBuffer::reset()
|
||||||
m_buffer[i].m_length = 0U;
|
m_buffer[i].m_length = 0U;
|
||||||
|
|
||||||
m_headSequenceNumber = 0U;
|
m_headSequenceNumber = 0U;
|
||||||
|
m_appendSequenceNumber = 0U;
|
||||||
|
|
||||||
m_lastDataLength = 0U;
|
m_lastDataLength = 0U;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -36,6 +36,7 @@ public:
|
||||||
~CJitterBuffer();
|
~CJitterBuffer();
|
||||||
|
|
||||||
bool addData(const unsigned char* data, unsigned int length, unsigned int sequenceNumber);
|
bool addData(const unsigned char* data, unsigned int length, unsigned int sequenceNumber);
|
||||||
|
bool appendData(const unsigned char* data, unsigned int length);
|
||||||
|
|
||||||
JB_STATUS getData(unsigned char* data, unsigned int& length);
|
JB_STATUS getData(unsigned char* data, unsigned int& length);
|
||||||
|
|
||||||
|
|
@ -63,6 +64,8 @@ private:
|
||||||
JitterEntry* m_buffer;
|
JitterEntry* m_buffer;
|
||||||
unsigned int m_headSequenceNumber;
|
unsigned int m_headSequenceNumber;
|
||||||
|
|
||||||
|
unsigned int m_appendSequenceNumber;
|
||||||
|
|
||||||
unsigned char* m_lastData;
|
unsigned char* m_lastData;
|
||||||
unsigned int m_lastDataLength;
|
unsigned int m_lastDataLength;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -78,7 +78,7 @@ RemoteGateway=0
|
||||||
|
|
||||||
[DMR]
|
[DMR]
|
||||||
Enable=1
|
Enable=1
|
||||||
Beacons=1
|
Beacons=0
|
||||||
ColorCode=1
|
ColorCode=1
|
||||||
SelfOnly=0
|
SelfOnly=0
|
||||||
EmbeddedLCOnly=0
|
EmbeddedLCOnly=0
|
||||||
|
|
|
||||||
|
|
@ -148,6 +148,7 @@ m_ysfNetModeHang(3U),
|
||||||
m_p25NetModeHang(3U),
|
m_p25NetModeHang(3U),
|
||||||
m_nxdnNetModeHang(3U),
|
m_nxdnNetModeHang(3U),
|
||||||
m_modeTimer(1000U),
|
m_modeTimer(1000U),
|
||||||
|
m_dmrBeaconTimer(1000U),
|
||||||
m_dmrTXTimer(1000U),
|
m_dmrTXTimer(1000U),
|
||||||
m_cwIdTimer(1000U),
|
m_cwIdTimer(1000U),
|
||||||
m_duplex(false),
|
m_duplex(false),
|
||||||
|
|
@ -321,9 +322,6 @@ int CMMDVMHost::run()
|
||||||
m_cwIdTimer.start();
|
m_cwIdTimer.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
CTimer dmrBeaconTimer(1000U, 4U);
|
|
||||||
bool dmrBeaconsEnabled = m_dmrEnabled && m_conf.getDMRBeacons();
|
|
||||||
|
|
||||||
// For all modes we handle RSSI
|
// For all modes we handle RSSI
|
||||||
std::string rssiMappingFile = m_conf.getModemRSSIMappingFile();
|
std::string rssiMappingFile = m_conf.getModemRSSIMappingFile();
|
||||||
|
|
||||||
|
|
@ -392,6 +390,7 @@ int CMMDVMHost::run()
|
||||||
unsigned int callHang = m_conf.getDMRCallHang();
|
unsigned int callHang = m_conf.getDMRCallHang();
|
||||||
unsigned int txHang = m_conf.getDMRTXHang();
|
unsigned int txHang = m_conf.getDMRTXHang();
|
||||||
m_dmrRFModeHang = m_conf.getDMRModeHang();
|
m_dmrRFModeHang = m_conf.getDMRModeHang();
|
||||||
|
unsigned int dmrBeacons = m_conf.getDMRBeacons();
|
||||||
|
|
||||||
if (txHang > m_dmrRFModeHang)
|
if (txHang > m_dmrRFModeHang)
|
||||||
txHang = m_dmrRFModeHang;
|
txHang = m_dmrRFModeHang;
|
||||||
|
|
@ -425,6 +424,12 @@ int CMMDVMHost::run()
|
||||||
LogInfo(" TX Hang: %us", txHang);
|
LogInfo(" TX Hang: %us", txHang);
|
||||||
LogInfo(" Mode Hang: %us", m_dmrRFModeHang);
|
LogInfo(" Mode Hang: %us", m_dmrRFModeHang);
|
||||||
|
|
||||||
|
if (dmrBeacons > 0U) {
|
||||||
|
LogInfo(" DMR Roaming Beacons: %u mins", dmrBeacons);
|
||||||
|
m_dmrBeaconTimer.setTimeout(dmrBeacons * 60U);
|
||||||
|
m_dmrBeaconTimer.start();
|
||||||
|
}
|
||||||
|
|
||||||
dmr = new CDMRControl(id, colorCode, callHang, selfOnly, embeddedLCOnly, dumpTAData, prefixes, blackList, whiteList, slot1TGWhiteList, slot2TGWhiteList, m_timeout, m_modem, m_dmrNetwork, m_display, m_duplex, m_lookup, rssi);
|
dmr = new CDMRControl(id, colorCode, callHang, selfOnly, embeddedLCOnly, dumpTAData, prefixes, blackList, whiteList, slot1TGWhiteList, slot2TGWhiteList, m_timeout, m_modem, m_dmrNetwork, m_display, m_duplex, m_lookup, rssi);
|
||||||
|
|
||||||
m_dmrTXTimer.setTimeout(txHang);
|
m_dmrTXTimer.setTimeout(txHang);
|
||||||
|
|
@ -490,6 +495,8 @@ int CMMDVMHost::run()
|
||||||
nxdn = new CNXDNControl(ran, id, selfOnly, m_nxdnNetwork, m_display, m_timeout, m_duplex, remoteGateway, rssi);
|
nxdn = new CNXDNControl(ran, id, selfOnly, m_nxdnNetwork, m_display, m_timeout, m_duplex, remoteGateway, rssi);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CTimer dmrBeaconTimer(1000U, 4U);
|
||||||
|
|
||||||
setMode(MODE_IDLE);
|
setMode(MODE_IDLE);
|
||||||
|
|
||||||
LogMessage("MMDVMHost-%s is running", VERSION);
|
LogMessage("MMDVMHost-%s is running", VERSION);
|
||||||
|
|
@ -785,14 +792,6 @@ int CMMDVMHost::run()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_dmrNetwork != NULL) {
|
|
||||||
bool run = m_dmrNetwork->wantsBeacon();
|
|
||||||
if (dmrBeaconsEnabled && run && m_mode == MODE_IDLE && !m_modem->hasTX()) {
|
|
||||||
setMode(MODE_DMR);
|
|
||||||
dmrBeaconTimer.start();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int ms = stopWatch.elapsed();
|
unsigned int ms = stopWatch.elapsed();
|
||||||
stopWatch.start();
|
stopWatch.start();
|
||||||
|
|
||||||
|
|
@ -835,6 +834,15 @@ int CMMDVMHost::run()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_dmrBeaconTimer.clock(ms);
|
||||||
|
if (m_dmrBeaconTimer.isRunning() && m_dmrBeaconTimer.hasExpired()) {
|
||||||
|
if (m_mode == MODE_IDLE && !m_modem->hasTX()) {
|
||||||
|
setMode(MODE_DMR);
|
||||||
|
m_dmrBeaconTimer.start();
|
||||||
|
dmrBeaconTimer.start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
dmrBeaconTimer.clock(ms);
|
dmrBeaconTimer.clock(ms);
|
||||||
if (dmrBeaconTimer.isRunning() && dmrBeaconTimer.hasExpired()) {
|
if (dmrBeaconTimer.isRunning() && dmrBeaconTimer.hasExpired()) {
|
||||||
setMode(MODE_IDLE);
|
setMode(MODE_IDLE);
|
||||||
|
|
|
||||||
|
|
@ -63,6 +63,7 @@ private:
|
||||||
unsigned int m_p25NetModeHang;
|
unsigned int m_p25NetModeHang;
|
||||||
unsigned int m_nxdnNetModeHang;
|
unsigned int m_nxdnNetModeHang;
|
||||||
CTimer m_modeTimer;
|
CTimer m_modeTimer;
|
||||||
|
CTimer m_dmrBeaconTimer;
|
||||||
CTimer m_dmrTXTimer;
|
CTimer m_dmrTXTimer;
|
||||||
CTimer m_cwIdTimer;
|
CTimer m_cwIdTimer;
|
||||||
bool m_duplex;
|
bool m_duplex;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue