Merge remote-tracking branch 'upstream/master' into DimOnIdle
This commit is contained in:
commit
6628a613e8
10 changed files with 99 additions and 46 deletions
23
Conf.cpp
23
Conf.cpp
|
@ -51,7 +51,8 @@ m_file(file),
|
|||
m_callsign(),
|
||||
m_timeout(120U),
|
||||
m_duplex(true),
|
||||
m_modeHang(10U),
|
||||
m_rfModeHang(10U),
|
||||
m_netModeHang(3U),
|
||||
m_display(),
|
||||
m_daemon(false),
|
||||
m_rxFrequency(0U),
|
||||
|
@ -135,13 +136,14 @@ m_hd44780PWMBright(),
|
|||
m_hd44780PWMDim(),
|
||||
m_hd44780DisplayClock(false),
|
||||
m_hd44780UTC(false),
|
||||
m_hd44780DateFormat("English"),
|
||||
m_hd44780DateFormat("British"),
|
||||
m_nextionPort("/dev/ttyAMA0"),
|
||||
m_nextionBrightness(50U),
|
||||
m_nextionDisplayClock(false),
|
||||
m_nextionUTC(false),
|
||||
m_nextionDateFormat("English"),
|
||||
m_nextionDateFormat("British"),
|
||||
m_nextionDimOnIdle(false),
|
||||
|
||||
m_oledType(3),
|
||||
m_oledBrightness(0),
|
||||
m_oledInvert(0)
|
||||
|
@ -220,7 +222,11 @@ bool CConf::read()
|
|||
else if (::strcmp(key, "Duplex") == 0)
|
||||
m_duplex = ::atoi(value) == 1;
|
||||
else if (::strcmp(key, "ModeHang") == 0)
|
||||
m_modeHang = (unsigned int)::atoi(value);
|
||||
m_rfModeHang = m_netModeHang = (unsigned int)::atoi(value);
|
||||
else if (::strcmp(key, "RFModeHang") == 0)
|
||||
m_rfModeHang = (unsigned int)::atoi(value);
|
||||
else if (::strcmp(key, "NetModeHang") == 0)
|
||||
m_netModeHang = (unsigned int)::atoi(value);
|
||||
else if (::strcmp(key, "Display") == 0)
|
||||
m_display = value;
|
||||
else if (::strcmp(key, "Daemon") == 0)
|
||||
|
@ -501,9 +507,14 @@ bool CConf::getDuplex() const
|
|||
return m_duplex;
|
||||
}
|
||||
|
||||
unsigned int CConf::getModeHang() const
|
||||
unsigned int CConf::getRFModeHang() const
|
||||
{
|
||||
return m_modeHang;
|
||||
return m_rfModeHang;
|
||||
}
|
||||
|
||||
unsigned int CConf::getNetModeHang() const
|
||||
{
|
||||
return m_netModeHang;
|
||||
}
|
||||
|
||||
std::string CConf::getDisplay() const
|
||||
|
|
6
Conf.h
6
Conf.h
|
@ -34,7 +34,8 @@ public:
|
|||
std::string getCallsign() const;
|
||||
unsigned int getTimeout() const;
|
||||
bool getDuplex() const;
|
||||
unsigned int getModeHang() const;
|
||||
unsigned int getRFModeHang() const;
|
||||
unsigned int getNetModeHang() const;
|
||||
std::string getDisplay() const;
|
||||
bool getDaemon() const;
|
||||
|
||||
|
@ -162,7 +163,8 @@ private:
|
|||
std::string m_callsign;
|
||||
unsigned int m_timeout;
|
||||
bool m_duplex;
|
||||
unsigned int m_modeHang;
|
||||
unsigned int m_rfModeHang;
|
||||
unsigned int m_netModeHang;
|
||||
std::string m_display;
|
||||
bool m_daemon;
|
||||
|
||||
|
|
|
@ -735,10 +735,12 @@ void CHD44780::clockInt(unsigned int ms)
|
|||
|
||||
if (m_cols != 16U && m_rows != 2U) {
|
||||
::lcdPosition(m_fd, (m_cols - 8) / 2, m_rows == 2 ? 0 : 1);
|
||||
if (strcmp(m_dateformat.c_str(), "English") == 0) {
|
||||
if (strcmp(m_dateformat.c_str(), "British") == 0) {
|
||||
::lcdPrintf(m_fd, "%02d/%02d/%2d", Day, Month, Year%100);
|
||||
} else if (strcmp(m_dateformat.c_str(), "German") == 0) {
|
||||
::lcdPrintf(m_fd, "%02d.%02d.%2d", Day, Month, Year%100);
|
||||
} else if (strcmp(m_dateformat.c_str(), "American") == 0) {
|
||||
::lcdPrintf(m_fd, "%02d/%02d/%2d", Month, Day, Year%100);
|
||||
}
|
||||
}
|
||||
m_clockDisplayTimer.start();
|
||||
|
|
|
@ -2,7 +2,9 @@
|
|||
Callsign=G9BF
|
||||
Timeout=180
|
||||
Duplex=1
|
||||
ModeHang=10
|
||||
# ModeHang=10
|
||||
RFModeHang=10
|
||||
NetModeHang=3
|
||||
Display=None
|
||||
Daemon=0
|
||||
|
||||
|
@ -118,13 +120,14 @@ PWMBright=100
|
|||
PWMDim=16
|
||||
DisplayClock=1
|
||||
UTC=0
|
||||
DateFormat=British
|
||||
|
||||
[Nextion]
|
||||
Port=/dev/ttyAMA0
|
||||
Brightness=50
|
||||
DisplayClock=1
|
||||
UTC=0
|
||||
DateFormat=English
|
||||
DateFormat=British
|
||||
DimOnIdle=1
|
||||
|
||||
[OLED]
|
||||
|
|
|
@ -123,10 +123,13 @@ m_dmrNetwork(NULL),
|
|||
m_ysfNetwork(NULL),
|
||||
m_display(NULL),
|
||||
m_mode(MODE_IDLE),
|
||||
m_rfModeHang(10U),
|
||||
m_netModeHang(3U),
|
||||
m_modeTimer(1000U),
|
||||
m_dmrTXTimer(1000U),
|
||||
m_cwIdTimer(1000U),
|
||||
m_duplex(false),
|
||||
m_timeout(180U),
|
||||
m_dstarEnabled(false),
|
||||
m_dmrEnabled(false),
|
||||
m_ysfEnabled(false),
|
||||
|
@ -269,18 +272,15 @@ int CMMDVMHost::run()
|
|||
if (m_dstarEnabled) {
|
||||
std::string module = m_conf.getDStarModule();
|
||||
bool selfOnly = m_conf.getDStarSelfOnly();
|
||||
unsigned int timeout = m_conf.getTimeout();
|
||||
std::vector<std::string> blackList = m_conf.getDStarBlackList();
|
||||
|
||||
LogInfo("D-Star Parameters");
|
||||
LogInfo(" Callsign: %s", m_callsign.c_str());
|
||||
LogInfo(" Module: %s", module.c_str());
|
||||
LogInfo(" Self Only: %s", selfOnly ? "yes" : "no");
|
||||
if (blackList.size() > 0U)
|
||||
LogInfo(" Black List: %u", blackList.size());
|
||||
LogInfo(" Timeout: %us", timeout);
|
||||
|
||||
dstar = new CDStarControl(m_callsign, module, selfOnly, blackList, m_dstarNetwork, m_display, timeout, m_duplex);
|
||||
dstar = new CDStarControl(m_callsign, module, selfOnly, blackList, m_dstarNetwork, m_display, m_timeout, m_duplex);
|
||||
}
|
||||
|
||||
CDMRControl* dmr = NULL;
|
||||
|
@ -294,11 +294,18 @@ int CMMDVMHost::run()
|
|||
std::vector<unsigned int> dstIDBlackListSlot2 = m_conf.getDMRDstIdBlacklistSlot2();
|
||||
std::vector<unsigned int> dstIDWhiteListSlot1 = m_conf.getDMRDstIdWhitelistSlot1();
|
||||
std::vector<unsigned int> dstIDWhiteListSlot2 = m_conf.getDMRDstIdWhitelistSlot2();
|
||||
unsigned int timeout = m_conf.getTimeout();
|
||||
std::string lookupFile = m_conf.getDMRLookupFile();
|
||||
unsigned int callHang = m_conf.getDMRCallHang();
|
||||
unsigned int txHang = m_conf.getDMRTXHang();
|
||||
|
||||
if (txHang > m_rfModeHang)
|
||||
txHang = m_rfModeHang;
|
||||
if (txHang > m_netModeHang)
|
||||
txHang = m_netModeHang;
|
||||
|
||||
if (callHang > txHang)
|
||||
callHang = txHang;
|
||||
|
||||
LogInfo("DMR Parameters");
|
||||
LogInfo(" Id: %u", id);
|
||||
LogInfo(" Color Code: %u", colorCode);
|
||||
|
@ -316,28 +323,18 @@ int CMMDVMHost::run()
|
|||
if (dstIDWhiteListSlot2.size() > 0U)
|
||||
LogInfo(" Slot 2 Destination ID White List: %u entries", dstIDWhiteListSlot2.size());
|
||||
|
||||
LogInfo(" Timeout: %us", timeout);
|
||||
LogInfo(" Lookup File: %s", lookupFile.length() > 0U ? lookupFile.c_str() : "None");
|
||||
LogInfo(" Call Hang: %us", callHang);
|
||||
LogInfo(" TX Hang: %us", txHang);
|
||||
|
||||
dmr = new CDMRControl(id, colorCode, callHang, selfOnly, prefixes, blackList,dstIDBlackListSlot1,dstIDWhiteListSlot1, dstIDBlackListSlot2, dstIDWhiteListSlot2, timeout, m_modem, m_dmrNetwork, m_display, m_duplex, lookupFile);
|
||||
dmr = new CDMRControl(id, colorCode, callHang, selfOnly, prefixes, blackList,dstIDBlackListSlot1,dstIDWhiteListSlot1, dstIDBlackListSlot2, dstIDWhiteListSlot2, m_timeout, m_modem, m_dmrNetwork, m_display, m_duplex, lookupFile);
|
||||
|
||||
m_dmrTXTimer.setTimeout(txHang);
|
||||
}
|
||||
|
||||
CYSFControl* ysf = NULL;
|
||||
if (m_ysfEnabled) {
|
||||
unsigned int timeout = m_conf.getTimeout();
|
||||
|
||||
LogInfo("System Fusion Parameters");
|
||||
LogInfo(" Callsign: %s", m_callsign.c_str());
|
||||
LogInfo(" Timeout: %us", timeout);
|
||||
|
||||
ysf = new CYSFControl(m_callsign, m_ysfNetwork, m_display, timeout, m_duplex);
|
||||
}
|
||||
|
||||
m_modeTimer.setTimeout(m_conf.getModeHang());
|
||||
if (m_ysfEnabled)
|
||||
ysf = new CYSFControl(m_callsign, m_ysfNetwork, m_display, m_timeout, m_duplex);
|
||||
|
||||
setMode(MODE_IDLE);
|
||||
|
||||
|
@ -364,8 +361,10 @@ int CMMDVMHost::run()
|
|||
if (dstar != NULL && len > 0U) {
|
||||
if (m_mode == MODE_IDLE) {
|
||||
bool ret = dstar->writeModem(data);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
m_modeTimer.setTimeout(m_rfModeHang);
|
||||
setMode(MODE_DSTAR);
|
||||
}
|
||||
} else if (m_mode == MODE_DSTAR) {
|
||||
dstar->writeModem(data);
|
||||
m_modeTimer.start();
|
||||
|
@ -380,10 +379,12 @@ int CMMDVMHost::run()
|
|||
if (m_duplex) {
|
||||
bool ret = dmr->processWakeup(data);
|
||||
if (ret) {
|
||||
m_modeTimer.setTimeout(m_rfModeHang);
|
||||
setMode(MODE_DMR);
|
||||
dmrBeaconTimer.stop();
|
||||
}
|
||||
} else {
|
||||
m_modeTimer.setTimeout(m_rfModeHang);
|
||||
setMode(MODE_DMR);
|
||||
dmr->writeModemSlot1(data);
|
||||
dmrBeaconTimer.stop();
|
||||
|
@ -413,10 +414,12 @@ int CMMDVMHost::run()
|
|||
if (m_duplex) {
|
||||
bool ret = dmr->processWakeup(data);
|
||||
if (ret) {
|
||||
m_modeTimer.setTimeout(m_rfModeHang);
|
||||
setMode(MODE_DMR);
|
||||
dmrBeaconTimer.stop();
|
||||
}
|
||||
} else {
|
||||
m_modeTimer.setTimeout(m_rfModeHang);
|
||||
setMode(MODE_DMR);
|
||||
dmr->writeModemSlot2(data);
|
||||
dmrBeaconTimer.stop();
|
||||
|
@ -444,8 +447,10 @@ int CMMDVMHost::run()
|
|||
if (ysf != NULL && len > 0U) {
|
||||
if (m_mode == MODE_IDLE) {
|
||||
bool ret = ysf->writeModem(data);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
m_modeTimer.setTimeout(m_rfModeHang);
|
||||
setMode(MODE_YSF);
|
||||
}
|
||||
} else if (m_mode == MODE_YSF) {
|
||||
ysf->writeModem(data);
|
||||
m_modeTimer.start();
|
||||
|
@ -462,8 +467,10 @@ int CMMDVMHost::run()
|
|||
if (ret) {
|
||||
len = dstar->readModem(data);
|
||||
if (len > 0U) {
|
||||
if (m_mode == MODE_IDLE)
|
||||
if (m_mode == MODE_IDLE) {
|
||||
m_modeTimer.setTimeout(m_netModeHang);
|
||||
setMode(MODE_DSTAR);
|
||||
}
|
||||
if (m_mode == MODE_DSTAR) {
|
||||
m_modem->writeDStarData(data, len);
|
||||
m_modeTimer.start();
|
||||
|
@ -479,8 +486,10 @@ int CMMDVMHost::run()
|
|||
if (ret) {
|
||||
len = dmr->readModemSlot1(data);
|
||||
if (len > 0U) {
|
||||
if (m_mode == MODE_IDLE)
|
||||
if (m_mode == MODE_IDLE) {
|
||||
m_modeTimer.setTimeout(m_netModeHang);
|
||||
setMode(MODE_DMR);
|
||||
}
|
||||
if (m_mode == MODE_DMR) {
|
||||
if (m_duplex) {
|
||||
m_modem->writeDMRStart(true);
|
||||
|
@ -499,8 +508,10 @@ int CMMDVMHost::run()
|
|||
if (ret) {
|
||||
len = dmr->readModemSlot2(data);
|
||||
if (len > 0U) {
|
||||
if (m_mode == MODE_IDLE)
|
||||
if (m_mode == MODE_IDLE) {
|
||||
m_modeTimer.setTimeout(m_netModeHang);
|
||||
setMode(MODE_DMR);
|
||||
}
|
||||
if (m_mode == MODE_DMR) {
|
||||
if (m_duplex) {
|
||||
m_modem->writeDMRStart(true);
|
||||
|
@ -521,8 +532,10 @@ int CMMDVMHost::run()
|
|||
if (ret) {
|
||||
len = ysf->readModem(data);
|
||||
if (len > 0U) {
|
||||
if (m_mode == MODE_IDLE)
|
||||
if (m_mode == MODE_IDLE) {
|
||||
m_modeTimer.setTimeout(m_netModeHang);
|
||||
setMode(MODE_YSF);
|
||||
}
|
||||
if (m_mode == MODE_YSF) {
|
||||
m_modem->writeYSFData(data, len);
|
||||
m_modeTimer.start();
|
||||
|
@ -673,7 +686,7 @@ bool CMMDVMHost::createModem()
|
|||
|
||||
LogInfo(" Osc. Offset: %dppm", oscOffset);
|
||||
|
||||
m_modem = new CModem(port, rxInvert, txInvert, pttInvert, txDelay, rxLevel, txLevel, dmrDelay, oscOffset, debug);
|
||||
m_modem = new CModem(port, m_duplex, rxInvert, txInvert, pttInvert, txDelay, rxLevel, txLevel, dmrDelay, oscOffset, debug);
|
||||
m_modem->setModeParams(m_dstarEnabled, m_dmrEnabled, m_ysfEnabled);
|
||||
m_modem->setModeLevels(dstarLevel, dmrLevel1, dmrLevel3, ysfLevel1, ysfLevel3, dmrThreshold, ysfThreshold);
|
||||
m_modem->setRFParams(rxFrequency, txFrequency);
|
||||
|
@ -810,6 +823,20 @@ void CMMDVMHost::readParams()
|
|||
m_ysfEnabled = m_conf.getFusionEnabled();
|
||||
m_duplex = m_conf.getDuplex();
|
||||
m_callsign = m_conf.getCallsign();
|
||||
m_timeout = m_conf.getTimeout();
|
||||
|
||||
m_rfModeHang = m_conf.getRFModeHang();
|
||||
m_netModeHang = m_conf.getNetModeHang();
|
||||
|
||||
LogInfo("General Parameters");
|
||||
LogInfo(" Callsign: %s", m_callsign.c_str());
|
||||
LogInfo(" Duplex: %s", m_duplex ? "yes" : "no");
|
||||
LogInfo(" Timeout: %us", m_timeout);
|
||||
LogInfo(" RF Mode Hang: %us", m_rfModeHang);
|
||||
LogInfo(" Net Mode Hang: %us", m_netModeHang);
|
||||
LogInfo(" D-Star: %s", m_dstarEnabled ? "enabled" : "disabled");
|
||||
LogInfo(" DMR: %s", m_dmrEnabled ? "enabled" : "disabled");
|
||||
LogInfo(" YSF: %s", m_ysfEnabled ? "enabled" : "disabled");
|
||||
}
|
||||
|
||||
void CMMDVMHost::createDisplay()
|
||||
|
|
|
@ -45,10 +45,13 @@ private:
|
|||
CYSFNetwork* m_ysfNetwork;
|
||||
CDisplay* m_display;
|
||||
unsigned char m_mode;
|
||||
unsigned int m_rfModeHang;
|
||||
unsigned int m_netModeHang;
|
||||
CTimer m_modeTimer;
|
||||
CTimer m_dmrTXTimer;
|
||||
CTimer m_cwIdTimer;
|
||||
bool m_duplex;
|
||||
unsigned int m_timeout;
|
||||
bool m_dstarEnabled;
|
||||
bool m_dmrEnabled;
|
||||
bool m_ysfEnabled;
|
||||
|
|
13
Modem.cpp
13
Modem.cpp
|
@ -76,9 +76,10 @@ const unsigned int MAX_RESPONSES = 30U;
|
|||
const unsigned int BUFFER_LENGTH = 500U;
|
||||
|
||||
|
||||
CModem::CModem(const std::string& port, bool rxInvert, bool txInvert, bool pttInvert, unsigned int txDelay, unsigned int rxLevel, unsigned int txLevel, unsigned int dmrDelay, int oscOffset, bool debug) :
|
||||
CModem::CModem(const std::string& port, bool duplex, bool rxInvert, bool txInvert, bool pttInvert, unsigned int txDelay, unsigned int rxLevel, unsigned int txLevel, unsigned int dmrDelay, int oscOffset, bool debug) :
|
||||
m_port(port),
|
||||
m_colorCode(0U),
|
||||
m_duplex(duplex),
|
||||
m_rxInvert(rxInvert),
|
||||
m_txInvert(txInvert),
|
||||
m_pttInvert(pttInvert),
|
||||
|
@ -760,11 +761,13 @@ bool CModem::readStatus()
|
|||
|
||||
bool CModem::setConfig()
|
||||
{
|
||||
unsigned int length = m_duplex ? 19U : 12U;
|
||||
|
||||
unsigned char buffer[20U];
|
||||
|
||||
buffer[0U] = MMDVM_FRAME_START;
|
||||
|
||||
buffer[1U] = 19U;
|
||||
buffer[1U] = length;
|
||||
|
||||
buffer[2U] = MMDVM_SET_CONFIG;
|
||||
|
||||
|
@ -805,10 +808,10 @@ bool CModem::setConfig()
|
|||
buffer[17U] = (unsigned char)(m_dmrThreshold + 128);
|
||||
buffer[18U] = (unsigned char)(m_ysfThreshold + 128);
|
||||
|
||||
// CUtils::dump(1U, "Written", buffer, 19U);
|
||||
// CUtils::dump(1U, "Written", buffer, length);
|
||||
|
||||
int ret = m_serial.write(buffer, 19U);
|
||||
if (ret != 19)
|
||||
int ret = m_serial.write(buffer, length);
|
||||
if (ret != int(length))
|
||||
return false;
|
||||
|
||||
unsigned int count = 0U;
|
||||
|
|
3
Modem.h
3
Modem.h
|
@ -33,7 +33,7 @@ enum RESP_TYPE_MMDVM {
|
|||
|
||||
class CModem {
|
||||
public:
|
||||
CModem(const std::string& port, bool rxInvert, bool txInvert, bool pttInvert, unsigned int txDelay, unsigned int rxLevel, unsigned int txLevel, unsigned int dmrDelay, int oscOffset, bool debug = false);
|
||||
CModem(const std::string& port, bool duplex, bool rxInvert, bool txInvert, bool pttInvert, unsigned int txDelay, unsigned int rxLevel, unsigned int txLevel, unsigned int dmrDelay, int oscOffset, bool debug = false);
|
||||
~CModem();
|
||||
|
||||
void setRFParams(unsigned int rxFrequency, unsigned int txFrequency);
|
||||
|
@ -78,6 +78,7 @@ public:
|
|||
private:
|
||||
std::string m_port;
|
||||
unsigned int m_colorCode;
|
||||
bool m_duplex;
|
||||
bool m_rxInvert;
|
||||
bool m_txInvert;
|
||||
bool m_pttInvert;
|
||||
|
|
|
@ -260,10 +260,12 @@ void CNextion::clockInt(unsigned int ms)
|
|||
int Sec = Time->tm_sec;
|
||||
|
||||
char text[50U];
|
||||
if (strcmp(m_dateformat.c_str(), "English") == 0) {
|
||||
if (strcmp(m_dateformat.c_str(), "British") == 0) {
|
||||
::sprintf(text, "t2.txt=\"%02d:%02d:%02d %02d/%02d/%2d\"", Hour, Min, Sec, Day, Month, Year % 100);
|
||||
} else if (strcmp(m_dateformat.c_str(), "German") == 0) {
|
||||
::sprintf(text, "t2.txt=\"%02d:%02d:%02d %02d.%02d.%2d\"", Hour, Min, Sec, Day, Month, Year % 100);
|
||||
} else if (strcmp(m_dateformat.c_str(), "American") == 0) {
|
||||
::sprintf(text, "t2.txt=\"%02d:%02d:%02d %02d/%02d/%2d\"", Hour, Min, Sec, Month, Day, Year % 100);
|
||||
}
|
||||
sendCommand(text);
|
||||
|
||||
|
|
|
@ -395,8 +395,7 @@ void CYSFControl::writeNetwork()
|
|||
m_netSeqNo = 0U;
|
||||
} else {
|
||||
// Check for duplicate frames, if we can
|
||||
// XXX this needs changing in the future
|
||||
if (m_netSeqNo == data[34U] && m_netSeqNo != 0U) {
|
||||
if (m_netSeqNo == data[34U]) {
|
||||
LogDebug("YSF, removing network duplicate, seq %u", data[34U] >> 1);
|
||||
return;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue