Allow for optional fixed modes. Inspired by Adrian VK4TUX.

This commit is contained in:
Jonathan Naylor
2019-01-22 14:38:38 +00:00
parent d02122b922
commit b2050e673b
2 changed files with 48 additions and 54 deletions

View File

@@ -159,7 +159,8 @@ m_cwCallsign(),
m_lockFileEnabled(false), m_lockFileEnabled(false),
m_lockFileName(), m_lockFileName(),
m_mobileGPS(NULL), m_mobileGPS(NULL),
m_remoteControl(NULL) m_remoteControl(NULL),
m_fixedMode(false)
{ {
} }
@@ -767,8 +768,10 @@ int CMMDVMHost::run()
if (transparentSocket != NULL && len > 0U) if (transparentSocket != NULL && len > 0U)
transparentSocket->write(data, len, transparentAddress, transparentPort); transparentSocket->write(data, len, transparentAddress, transparentPort);
if (!m_fixedMode) {
if (m_modeTimer.isRunning() && m_modeTimer.hasExpired()) if (m_modeTimer.isRunning() && m_modeTimer.hasExpired())
setMode(MODE_IDLE); setMode(MODE_IDLE);
}
if (m_dstar != NULL) { if (m_dstar != NULL) {
ret = m_modem->hasDStarSpace(); ret = m_modem->hasDStarSpace();
@@ -928,6 +931,7 @@ int CMMDVMHost::run()
m_modem->clock(ms); m_modem->clock(ms);
if (!m_fixedMode)
m_modeTimer.clock(ms); m_modeTimer.clock(ms);
if (m_dstar != NULL) if (m_dstar != NULL)
@@ -961,7 +965,7 @@ int CMMDVMHost::run()
m_cwIdTimer.clock(ms); m_cwIdTimer.clock(ms);
if (m_cwIdTimer.isRunning() && m_cwIdTimer.hasExpired()) { if (m_cwIdTimer.isRunning() && m_cwIdTimer.hasExpired()) {
if (m_mode == MODE_IDLE && !m_modem->hasTX()){ if (!m_modem->hasTX()){
LogDebug("sending CW ID"); LogDebug("sending CW ID");
m_display->writeCW(); m_display->writeCW();
m_modem->sendCWId(m_cwCallsign); m_modem->sendCWId(m_cwCallsign);
@@ -973,7 +977,8 @@ int CMMDVMHost::run()
dmrBeaconIntervalTimer.clock(ms); dmrBeaconIntervalTimer.clock(ms);
if (dmrBeaconIntervalTimer.isRunning() && dmrBeaconIntervalTimer.hasExpired()) { if (dmrBeaconIntervalTimer.isRunning() && dmrBeaconIntervalTimer.hasExpired()) {
if (m_mode == MODE_IDLE && !m_modem->hasTX()) { if ((m_mode == MODE_IDLE || m_mode == MODE_DMR) && !m_modem->hasTX()) {
if (!m_fixedMode)
setMode(MODE_DMR); setMode(MODE_DMR);
dmrBeaconIntervalTimer.start(); dmrBeaconIntervalTimer.start();
dmrBeaconDurationTimer.start(); dmrBeaconDurationTimer.start();
@@ -982,6 +987,7 @@ int CMMDVMHost::run()
dmrBeaconDurationTimer.clock(ms); dmrBeaconDurationTimer.clock(ms);
if (dmrBeaconDurationTimer.isRunning() && dmrBeaconDurationTimer.hasExpired()) { if (dmrBeaconDurationTimer.isRunning() && dmrBeaconDurationTimer.hasExpired()) {
if (!m_fixedMode)
setMode(MODE_IDLE); setMode(MODE_IDLE);
dmrBeaconDurationTimer.stop(); dmrBeaconDurationTimer.stop();
} }
@@ -1785,66 +1791,52 @@ void CMMDVMHost::remoteControl()
REMOTE_COMMAND command = m_remoteControl->getCommand(); REMOTE_COMMAND command = m_remoteControl->getCommand();
switch(command) { switch(command) {
case RCD_MODE_IDLE: case RCD_MODE_IDLE:
if (m_mode != MODE_IDLE) m_fixedMode = false;
setMode(MODE_IDLE); setMode(MODE_IDLE);
break; break;
case RCD_MODE_LOCKOUT: case RCD_MODE_LOCKOUT:
if (m_mode != MODE_LOCKOUT) m_fixedMode = false;
setMode(MODE_LOCKOUT); setMode(MODE_LOCKOUT);
break; break;
case RCD_MODE_DSTAR: case RCD_MODE_DSTAR:
if (m_dstar != NULL && m_mode != MODE_DSTAR) { if (m_dstar != NULL)
if (m_remoteControl->getArgCount() > 0U) processModeCommand(MODE_DSTAR, m_dstarRFModeHang);
m_modeTimer.setTimeout(m_remoteControl->getArgUInt(0U));
else
m_modeTimer.setTimeout(m_dstarRFModeHang);
setMode(MODE_DSTAR);
}
break; break;
case RCD_MODE_DMR: case RCD_MODE_DMR:
if (m_dmr != NULL && m_mode != MODE_DMR) { if (m_dmr != NULL) {
if (m_remoteControl->getArgCount() > 0U) processModeCommand(MODE_DMR, m_dmrRFModeHang);
m_modeTimer.setTimeout(m_remoteControl->getArgUInt(0U));
else
m_modeTimer.setTimeout(m_dmrRFModeHang);
setMode(MODE_DMR);
}
break; break;
case RCD_MODE_YSF: case RCD_MODE_YSF:
if (m_ysf != NULL && m_mode != MODE_YSF) { if (m_ysf != NULL)
if (m_remoteControl->getArgCount() > 0U) processModeCommand(MODE_YSF, m_ysfRFModeHang);
m_modeTimer.setTimeout(m_remoteControl->getArgUInt(0U));
else
m_modeTimer.setTimeout(m_ysfRFModeHang);
setMode(MODE_YSF);
}
break; break;
case RCD_MODE_P25: case RCD_MODE_P25:
if (m_p25 != NULL && m_mode != MODE_P25) { if (m_p25 != NULL)
if (m_remoteControl->getArgCount() > 0U) processModeCommand(MODE_P25, m_p25RFModeHang);
m_modeTimer.setTimeout(m_remoteControl->getArgUInt(0U));
else
m_modeTimer.setTimeout(m_p25RFModeHang);
setMode(MODE_P25);
}
break; break;
case RCD_MODE_NXDN: case RCD_MODE_NXDN:
if (m_nxdn != NULL && m_mode != MODE_NXDN) { if (m_nxdn != NULL)
if (m_remoteControl->getArgCount() > 0U) processModeCommand(MODE_NXDN, m_nxdnRFModeHang);
m_modeTimer.setTimeout(m_remoteControl->getArgUInt(0U));
else
m_modeTimer.setTimeout(m_nxdnRFModeHang);
setMode(MODE_NXDN);
}
break; break;
default: default:
break; break;
} }
} }
void CMMDVMHost::processModeCommand(unsigned char mode, unsigned int timeout)
{
m_fixedMode = false;
m_modeTimer.setTimeout(timeout);
if (m_remoteControl->getArgCount() > 0U) {
if (m_remoteControl->getArgString(0U) == "fixed") {
m_fixedMode = true;
} else {
unsigned int t = m_remoteControl->getArgUInt(0U);
if (t > 0U)
m_modeTimer.setTimeout(t);
}
}
setMode(mode);
}

View File

@@ -103,6 +103,7 @@ private:
std::string m_lockFileName; std::string m_lockFileName;
CMobileGPS* m_mobileGPS; CMobileGPS* m_mobileGPS;
CRemoteControl* m_remoteControl; CRemoteControl* m_remoteControl;
bool m_fixedMode;
void readParams(); void readParams();
bool createModem(); bool createModem();
@@ -114,6 +115,7 @@ private:
bool createPOCSAGNetwork(); bool createPOCSAGNetwork();
void remoteControl(); void remoteControl();
void processModeCommand(unsigned char mode, unsigned int timeout);
void setMode(unsigned char mode); void setMode(unsigned char mode);