mirror of
https://github.com/g4klx/MMDVMHost
synced 2025-12-21 23:45:49 +08:00
Split the DMR TX hang time from the mode hang time.
This commit is contained in:
8
Conf.cpp
8
Conf.cpp
@@ -87,6 +87,7 @@ m_dmrSelfOnly(false),
|
|||||||
m_dmrPrefixes(),
|
m_dmrPrefixes(),
|
||||||
m_dmrBlackList(),
|
m_dmrBlackList(),
|
||||||
m_dmrLookupFile(),
|
m_dmrLookupFile(),
|
||||||
|
m_dmrTXHang(4U),
|
||||||
m_fusionEnabled(true),
|
m_fusionEnabled(true),
|
||||||
m_fusionParrotEnabled(false),
|
m_fusionParrotEnabled(false),
|
||||||
m_dstarNetworkEnabled(true),
|
m_dstarNetworkEnabled(true),
|
||||||
@@ -295,6 +296,8 @@ bool CConf::read()
|
|||||||
}
|
}
|
||||||
} else if (::strcmp(key, "LookupFile") == 0)
|
} else if (::strcmp(key, "LookupFile") == 0)
|
||||||
m_dmrLookupFile = value;
|
m_dmrLookupFile = value;
|
||||||
|
else if (::strcmp(key, "TXHang") == 0)
|
||||||
|
m_dmrTXHang = (unsigned int)::atoi(value);
|
||||||
} else if (section == SECTION_FUSION) {
|
} else if (section == SECTION_FUSION) {
|
||||||
if (::strcmp(key, "Enable") == 0)
|
if (::strcmp(key, "Enable") == 0)
|
||||||
m_fusionEnabled = ::atoi(value) == 1;
|
m_fusionEnabled = ::atoi(value) == 1;
|
||||||
@@ -583,6 +586,11 @@ std::string CConf::getDMRLookupFile() const
|
|||||||
return m_dmrLookupFile;
|
return m_dmrLookupFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned int CConf::getDMRTXHang() const
|
||||||
|
{
|
||||||
|
return m_dmrTXHang;
|
||||||
|
}
|
||||||
|
|
||||||
bool CConf::getFusionEnabled() const
|
bool CConf::getFusionEnabled() const
|
||||||
{
|
{
|
||||||
return m_fusionEnabled;
|
return m_fusionEnabled;
|
||||||
|
|||||||
2
Conf.h
2
Conf.h
@@ -82,6 +82,7 @@ public:
|
|||||||
std::vector<unsigned int> getDMRPrefixes() const;
|
std::vector<unsigned int> getDMRPrefixes() const;
|
||||||
std::vector<unsigned int> getDMRBlackList() const;
|
std::vector<unsigned int> getDMRBlackList() const;
|
||||||
std::string getDMRLookupFile() const;
|
std::string getDMRLookupFile() const;
|
||||||
|
unsigned int getDMRTXHang() const;
|
||||||
|
|
||||||
// The System Fusion section
|
// The System Fusion section
|
||||||
bool getFusionEnabled() const;
|
bool getFusionEnabled() const;
|
||||||
@@ -176,6 +177,7 @@ private:
|
|||||||
std::vector<unsigned int> m_dmrPrefixes;
|
std::vector<unsigned int> m_dmrPrefixes;
|
||||||
std::vector<unsigned int> m_dmrBlackList;
|
std::vector<unsigned int> m_dmrBlackList;
|
||||||
std::string m_dmrLookupFile;
|
std::string m_dmrLookupFile;
|
||||||
|
unsigned int m_dmrTXHang;
|
||||||
|
|
||||||
bool m_fusionEnabled;
|
bool m_fusionEnabled;
|
||||||
bool m_fusionParrotEnabled;
|
bool m_fusionParrotEnabled;
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ ColorCode=1
|
|||||||
SelfOnly=0
|
SelfOnly=0
|
||||||
# Prefixes=234,235
|
# Prefixes=234,235
|
||||||
LookupFile=DMRIds.dat
|
LookupFile=DMRIds.dat
|
||||||
|
TXHang=4
|
||||||
|
|
||||||
[System Fusion]
|
[System Fusion]
|
||||||
Enable=1
|
Enable=1
|
||||||
|
|||||||
@@ -43,7 +43,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(_WIN32) || defined(_WIN64)
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
const char* DEFAULT_INI_FILE = "mmdvm.ini";
|
const char* DEFAULT_INI_FILE = "MMDVM.ini";
|
||||||
#else
|
#else
|
||||||
const char* DEFAULT_INI_FILE = "/etc/MMDVM.ini";
|
const char* DEFAULT_INI_FILE = "/etc/MMDVM.ini";
|
||||||
#endif
|
#endif
|
||||||
@@ -105,6 +105,7 @@ m_dmrNetwork(NULL),
|
|||||||
m_display(NULL),
|
m_display(NULL),
|
||||||
m_mode(MODE_IDLE),
|
m_mode(MODE_IDLE),
|
||||||
m_modeTimer(1000U),
|
m_modeTimer(1000U),
|
||||||
|
m_dmrTXTimer(1000U),
|
||||||
m_duplex(false),
|
m_duplex(false),
|
||||||
m_dstarEnabled(false),
|
m_dstarEnabled(false),
|
||||||
m_dmrEnabled(false),
|
m_dmrEnabled(false),
|
||||||
@@ -258,6 +259,7 @@ int CMMDVMHost::run()
|
|||||||
std::vector<unsigned int> blackList = m_conf.getDMRBlackList();
|
std::vector<unsigned int> blackList = m_conf.getDMRBlackList();
|
||||||
unsigned int timeout = m_conf.getTimeout();
|
unsigned int timeout = m_conf.getTimeout();
|
||||||
std::string lookupFile = m_conf.getDMRLookupFile();
|
std::string lookupFile = m_conf.getDMRLookupFile();
|
||||||
|
unsigned int txHang = m_conf.getDMRTXHang();
|
||||||
|
|
||||||
LogInfo("DMR Parameters");
|
LogInfo("DMR Parameters");
|
||||||
LogInfo(" Id: %u", id);
|
LogInfo(" Id: %u", id);
|
||||||
@@ -268,8 +270,11 @@ int CMMDVMHost::run()
|
|||||||
LogInfo(" Black List: %u", blackList.size());
|
LogInfo(" Black List: %u", blackList.size());
|
||||||
LogInfo(" Timeout: %us", timeout);
|
LogInfo(" Timeout: %us", timeout);
|
||||||
LogInfo(" Lookup File: %s", lookupFile.length() > 0U ? lookupFile.c_str() : "None");
|
LogInfo(" Lookup File: %s", lookupFile.length() > 0U ? lookupFile.c_str() : "None");
|
||||||
|
LogInfo(" TX Hang: %us", txHang);
|
||||||
|
|
||||||
dmr = new CDMRControl(id, colorCode, selfOnly, prefixes, blackList, timeout, m_modem, m_dmrNetwork, m_display, m_duplex, lookupFile);
|
dmr = new CDMRControl(id, colorCode, selfOnly, prefixes, blackList, timeout, m_modem, m_dmrNetwork, m_display, m_duplex, lookupFile);
|
||||||
|
|
||||||
|
m_dmrTXTimer.setTimeout(txHang);
|
||||||
}
|
}
|
||||||
|
|
||||||
CYSFControl* ysf = NULL;
|
CYSFControl* ysf = NULL;
|
||||||
@@ -326,17 +331,29 @@ int CMMDVMHost::run()
|
|||||||
if (m_mode == MODE_IDLE) {
|
if (m_mode == MODE_IDLE) {
|
||||||
if (m_duplex) {
|
if (m_duplex) {
|
||||||
bool ret = dmr->processWakeup(data);
|
bool ret = dmr->processWakeup(data);
|
||||||
if (ret)
|
if (ret) {
|
||||||
setMode(MODE_DMR);
|
setMode(MODE_DMR);
|
||||||
|
dmrBeaconTimer.stop();
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
setMode(MODE_DMR);
|
setMode(MODE_DMR);
|
||||||
dmr->writeModemSlot1(data);
|
dmr->writeModemSlot1(data);
|
||||||
dmrBeaconTimer.stop();
|
dmrBeaconTimer.stop();
|
||||||
}
|
}
|
||||||
} else if (m_mode == MODE_DMR) {
|
} else if (m_mode == MODE_DMR) {
|
||||||
|
if (m_duplex && !m_modem->hasTX()) {
|
||||||
|
bool ret = dmr->processWakeup(data);
|
||||||
|
if (ret) {
|
||||||
|
m_modem->writeDMRStart(true);
|
||||||
|
m_dmrTXTimer.start();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
dmr->writeModemSlot1(data);
|
dmr->writeModemSlot1(data);
|
||||||
dmrBeaconTimer.stop();
|
dmrBeaconTimer.stop();
|
||||||
m_modeTimer.start();
|
m_modeTimer.start();
|
||||||
|
if (m_duplex)
|
||||||
|
m_dmrTXTimer.start();
|
||||||
|
}
|
||||||
} else if (m_mode != MODE_LOCKOUT) {
|
} else if (m_mode != MODE_LOCKOUT) {
|
||||||
LogWarning("DMR modem data received when in mode %u", m_mode);
|
LogWarning("DMR modem data received when in mode %u", m_mode);
|
||||||
}
|
}
|
||||||
@@ -347,17 +364,29 @@ int CMMDVMHost::run()
|
|||||||
if (m_mode == MODE_IDLE) {
|
if (m_mode == MODE_IDLE) {
|
||||||
if (m_duplex) {
|
if (m_duplex) {
|
||||||
bool ret = dmr->processWakeup(data);
|
bool ret = dmr->processWakeup(data);
|
||||||
if (ret)
|
if (ret) {
|
||||||
setMode(MODE_DMR);
|
setMode(MODE_DMR);
|
||||||
|
dmrBeaconTimer.stop();
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
setMode(MODE_DMR);
|
setMode(MODE_DMR);
|
||||||
dmr->writeModemSlot2(data);
|
dmr->writeModemSlot2(data);
|
||||||
dmrBeaconTimer.stop();
|
dmrBeaconTimer.stop();
|
||||||
}
|
}
|
||||||
} else if (m_mode == MODE_DMR) {
|
} else if (m_mode == MODE_DMR) {
|
||||||
|
if (m_duplex && !m_modem->hasTX()) {
|
||||||
|
bool ret = dmr->processWakeup(data);
|
||||||
|
if (ret) {
|
||||||
|
m_modem->writeDMRStart(true);
|
||||||
|
m_dmrTXTimer.start();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
dmr->writeModemSlot2(data);
|
dmr->writeModemSlot2(data);
|
||||||
dmrBeaconTimer.stop();
|
dmrBeaconTimer.stop();
|
||||||
m_modeTimer.start();
|
m_modeTimer.start();
|
||||||
|
if (m_duplex)
|
||||||
|
m_dmrTXTimer.start();
|
||||||
|
}
|
||||||
} else if (m_mode != MODE_LOCKOUT) {
|
} else if (m_mode != MODE_LOCKOUT) {
|
||||||
LogWarning("DMR modem data received when in mode %u", m_mode);
|
LogWarning("DMR modem data received when in mode %u", m_mode);
|
||||||
}
|
}
|
||||||
@@ -405,6 +434,10 @@ int CMMDVMHost::run()
|
|||||||
if (m_mode == MODE_IDLE)
|
if (m_mode == MODE_IDLE)
|
||||||
setMode(MODE_DMR);
|
setMode(MODE_DMR);
|
||||||
if (m_mode == MODE_DMR) {
|
if (m_mode == MODE_DMR) {
|
||||||
|
if (m_duplex) {
|
||||||
|
m_modem->writeDMRStart(true);
|
||||||
|
m_dmrTXTimer.start();
|
||||||
|
}
|
||||||
m_modem->writeDMRData1(data, len);
|
m_modem->writeDMRData1(data, len);
|
||||||
dmrBeaconTimer.stop();
|
dmrBeaconTimer.stop();
|
||||||
m_modeTimer.start();
|
m_modeTimer.start();
|
||||||
@@ -421,6 +454,10 @@ int CMMDVMHost::run()
|
|||||||
if (m_mode == MODE_IDLE)
|
if (m_mode == MODE_IDLE)
|
||||||
setMode(MODE_DMR);
|
setMode(MODE_DMR);
|
||||||
if (m_mode == MODE_DMR) {
|
if (m_mode == MODE_DMR) {
|
||||||
|
if (m_duplex) {
|
||||||
|
m_modem->writeDMRStart(true);
|
||||||
|
m_dmrTXTimer.start();
|
||||||
|
}
|
||||||
m_modem->writeDMRData2(data, len);
|
m_modem->writeDMRData2(data, len);
|
||||||
dmrBeaconTimer.stop();
|
dmrBeaconTimer.stop();
|
||||||
m_modeTimer.start();
|
m_modeTimer.start();
|
||||||
@@ -480,6 +517,12 @@ int CMMDVMHost::run()
|
|||||||
dmrBeaconTimer.stop();
|
dmrBeaconTimer.stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_dmrTXTimer.clock(ms);
|
||||||
|
if (m_dmrTXTimer.isRunning() && m_dmrTXTimer.hasExpired()) {
|
||||||
|
m_modem->writeDMRStart(false);
|
||||||
|
m_dmrTXTimer.stop();
|
||||||
|
}
|
||||||
|
|
||||||
if (ms < 5U) {
|
if (ms < 5U) {
|
||||||
#if defined(_WIN32) || defined(_WIN64)
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
::Sleep(5UL); // 5ms
|
::Sleep(5UL); // 5ms
|
||||||
@@ -740,8 +783,10 @@ void CMMDVMHost::setMode(unsigned char mode, bool logging)
|
|||||||
if (m_dstarNetwork != NULL)
|
if (m_dstarNetwork != NULL)
|
||||||
m_dstarNetwork->enable(false);
|
m_dstarNetwork->enable(false);
|
||||||
m_modem->setMode(MODE_DMR);
|
m_modem->setMode(MODE_DMR);
|
||||||
if (m_duplex)
|
if (m_duplex) {
|
||||||
m_modem->writeDMRStart(true);
|
m_modem->writeDMRStart(true);
|
||||||
|
m_dmrTXTimer.start();
|
||||||
|
}
|
||||||
m_mode = MODE_DMR;
|
m_mode = MODE_DMR;
|
||||||
m_modeTimer.start();
|
m_modeTimer.start();
|
||||||
break;
|
break;
|
||||||
@@ -765,8 +810,10 @@ void CMMDVMHost::setMode(unsigned char mode, bool logging)
|
|||||||
m_dstarNetwork->enable(false);
|
m_dstarNetwork->enable(false);
|
||||||
if (m_dmrNetwork != NULL)
|
if (m_dmrNetwork != NULL)
|
||||||
m_dmrNetwork->enable(false);
|
m_dmrNetwork->enable(false);
|
||||||
if (m_mode == MODE_DMR && m_duplex)
|
if (m_mode == MODE_DMR && m_duplex && m_modem->hasTX()) {
|
||||||
m_modem->writeDMRStart(false);
|
m_modem->writeDMRStart(false);
|
||||||
|
m_dmrTXTimer.stop();
|
||||||
|
}
|
||||||
m_modem->setMode(MODE_IDLE);
|
m_modem->setMode(MODE_IDLE);
|
||||||
m_display->setLockout();
|
m_display->setLockout();
|
||||||
m_mode = MODE_LOCKOUT;
|
m_mode = MODE_LOCKOUT;
|
||||||
@@ -780,6 +827,10 @@ void CMMDVMHost::setMode(unsigned char mode, bool logging)
|
|||||||
m_dstarNetwork->enable(false);
|
m_dstarNetwork->enable(false);
|
||||||
if (m_dmrNetwork != NULL)
|
if (m_dmrNetwork != NULL)
|
||||||
m_dmrNetwork->enable(false);
|
m_dmrNetwork->enable(false);
|
||||||
|
if (m_mode == MODE_DMR && m_duplex && m_modem->hasTX()) {
|
||||||
|
m_modem->writeDMRStart(false);
|
||||||
|
m_dmrTXTimer.stop();
|
||||||
|
}
|
||||||
m_display->setError("MODEM");
|
m_display->setError("MODEM");
|
||||||
m_mode = MODE_ERROR;
|
m_mode = MODE_ERROR;
|
||||||
m_modeTimer.stop();
|
m_modeTimer.stop();
|
||||||
@@ -792,8 +843,10 @@ void CMMDVMHost::setMode(unsigned char mode, bool logging)
|
|||||||
m_dstarNetwork->enable(true);
|
m_dstarNetwork->enable(true);
|
||||||
if (m_dmrNetwork != NULL)
|
if (m_dmrNetwork != NULL)
|
||||||
m_dmrNetwork->enable(true);
|
m_dmrNetwork->enable(true);
|
||||||
if (m_mode == MODE_DMR && m_duplex)
|
if (m_mode == MODE_DMR && m_duplex && m_modem->hasTX()) {
|
||||||
m_modem->writeDMRStart(false);
|
m_modem->writeDMRStart(false);
|
||||||
|
m_dmrTXTimer.stop();
|
||||||
|
}
|
||||||
m_modem->setMode(MODE_IDLE);
|
m_modem->setMode(MODE_IDLE);
|
||||||
m_display->setIdle();
|
m_display->setIdle();
|
||||||
m_mode = MODE_IDLE;
|
m_mode = MODE_IDLE;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2015 by Jonathan Naylor G4KLX
|
* Copyright (C) 2015,2016 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
|
||||||
@@ -44,6 +44,7 @@ private:
|
|||||||
IDisplay* m_display;
|
IDisplay* m_display;
|
||||||
unsigned char m_mode;
|
unsigned char m_mode;
|
||||||
CTimer m_modeTimer;
|
CTimer m_modeTimer;
|
||||||
|
CTimer m_dmrTXTimer;
|
||||||
bool m_duplex;
|
bool m_duplex;
|
||||||
bool m_dstarEnabled;
|
bool m_dstarEnabled;
|
||||||
bool m_dmrEnabled;
|
bool m_dmrEnabled;
|
||||||
|
|||||||
@@ -651,6 +651,11 @@ bool CModem::hasYSFSpace() const
|
|||||||
return space > 1U;
|
return space > 1U;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CModem::hasTX() const
|
||||||
|
{
|
||||||
|
return m_tx;
|
||||||
|
}
|
||||||
|
|
||||||
bool CModem::hasLockout() const
|
bool CModem::hasLockout() const
|
||||||
{
|
{
|
||||||
return m_lockout;
|
return m_lockout;
|
||||||
|
|||||||
Reference in New Issue
Block a user