mirror of
https://github.com/g4klx/MMDVMHost
synced 2025-12-21 23:45:49 +08:00
Allow for optional fixed modes. Inspired by Adrian VK4TUX.
This commit is contained in:
@@ -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);
|
||||||
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user