Add timeouts to the FM simplex state machine.

This commit is contained in:
Jonathan Naylor 2020-07-06 10:56:35 +01:00
parent f1d6a8b36e
commit aab8f5469f
3 changed files with 150 additions and 7 deletions

149
FM.cpp
View File

@ -307,9 +307,27 @@ void CFM::simplexStateMachine(bool validRFSignal, bool validExtSignal)
case FS_RELAYING_RF: case FS_RELAYING_RF:
relayingRFStateSimplex(validRFSignal); relayingRFStateSimplex(validRFSignal);
break; break;
case FS_RELAYING_WAIT_RF:
relayingRFWaitStateSimplex(validRFSignal);
break;
case FS_TIMEOUT_RF:
timeoutRFStateSimplex(validRFSignal);
break;
case FS_TIMEOUT_WAIT_RF:
timeoutRFStateSimplex(validRFSignal);
break;
case FS_RELAYING_EXT: case FS_RELAYING_EXT:
relayingExtStateSimplex(validExtSignal); relayingExtStateSimplex(validExtSignal);
break; break;
case FS_RELAYING_WAIT_EXT:
relayingExtWaitStateSimplex(validExtSignal);
break;
case FS_TIMEOUT_EXT:
timeoutExtStateSimplex(validExtSignal);
break;
case FS_TIMEOUT_WAIT_EXT:
timeoutExtWaitStateSimplex(validExtSignal);
break;
default: default:
break; break;
} }
@ -451,12 +469,18 @@ void CFM::listeningStateSimplex(bool validRFSignal, bool validExtSignal)
io.setDecode(true); io.setDecode(true);
io.setADCDetection(true); io.setADCDetection(true);
m_timeoutTimer.start();
m_statusTimer.start(); m_statusTimer.start();
serial.writeFMStatus(m_state); serial.writeFMStatus(m_state);
} else if (validExtSignal) { } else if (validExtSignal) {
DEBUG1("State to RELAYING_EXT"); DEBUG1("State to RELAYING_EXT");
m_state = FS_RELAYING_EXT; m_state = FS_RELAYING_EXT;
insertSilence(50U);
m_timeoutTimer.start();
m_statusTimer.start(); m_statusTimer.start();
serial.writeFMStatus(m_state); serial.writeFMStatus(m_state);
} }
@ -537,12 +561,22 @@ void CFM::relayingRFStateDuplex(bool validSignal)
void CFM::relayingRFStateSimplex(bool validSignal) void CFM::relayingRFStateSimplex(bool validSignal)
{ {
if (!validSignal) { if (validSignal) {
if (m_timeoutTimer.isRunning() && m_timeoutTimer.hasExpired()) {
DEBUG1("State to TIMEOUT_RF");
m_state = FS_TIMEOUT_RF;
m_timeoutTimer.stop();
if (m_extEnabled)
serial.writeFMEOT();
}
} else {
io.setDecode(false); io.setDecode(false);
io.setADCDetection(false); io.setADCDetection(false);
DEBUG1("State to LISTENING"); DEBUG1("State to RELAYING_WAIT_RF");
m_state = FS_LISTENING; m_state = FS_RELAYING_WAIT_RF;
m_ackDelayTimer.start(); m_ackDelayTimer.start();
if (m_extEnabled) if (m_extEnabled)
@ -588,6 +622,26 @@ void CFM::relayingRFWaitStateDuplex(bool validSignal)
} }
} }
void CFM::relayingRFWaitStateSimplex(bool validSignal)
{
if (validSignal) {
io.setDecode(true);
io.setADCDetection(true);
DEBUG1("State to RELAYING_RF");
m_state = FS_RELAYING_RF;
m_ackDelayTimer.stop();
} else {
if (m_ackDelayTimer.isRunning() && m_ackDelayTimer.hasExpired()) {
DEBUG1("State to LISTENING");
m_state = FS_LISTENING;
m_ackDelayTimer.stop();
m_timeoutTimer.stop();
}
}
}
void CFM::kerchunkExtStateDuplex(bool validSignal) void CFM::kerchunkExtStateDuplex(bool validSignal)
{ {
if (validSignal) { if (validSignal) {
@ -645,9 +699,17 @@ void CFM::relayingExtStateDuplex(bool validSignal)
void CFM::relayingExtStateSimplex(bool validSignal) void CFM::relayingExtStateSimplex(bool validSignal)
{ {
if (!validSignal) { if (validSignal) {
DEBUG1("State to LISTENING"); if (m_timeoutTimer.isRunning() && m_timeoutTimer.hasExpired()) {
m_state = FS_LISTENING; DEBUG1("State to TIMEOUT_EXT");
m_state = FS_TIMEOUT_EXT;
m_timeoutTimer.stop();
}
} else {
DEBUG1("State to RELAYING_WAIT_EXT");
m_state = FS_RELAYING_WAIT_EXT;
m_ackDelayTimer.start();
} }
} }
@ -686,6 +748,23 @@ void CFM::relayingExtWaitStateDuplex(bool validSignal)
} }
} }
void CFM::relayingExtWaitStateSimplex(bool validSignal)
{
if (validSignal) {
DEBUG1("State to RELAYING_EXT");
m_state = FS_RELAYING_EXT;
m_ackDelayTimer.stop();
} else {
if (m_ackDelayTimer.isRunning() && m_ackDelayTimer.hasExpired()) {
DEBUG1("State to LISTENING");
m_state = FS_LISTENING;
m_ackDelayTimer.stop();
m_timeoutTimer.stop();
}
}
}
void CFM::hangStateDuplex(bool validRFSignal, bool validExtSignal) void CFM::hangStateDuplex(bool validRFSignal, bool validExtSignal)
{ {
if (validRFSignal) { if (validRFSignal) {
@ -747,6 +826,19 @@ void CFM::timeoutRFStateDuplex(bool validSignal)
} }
} }
void CFM::timeoutRFStateSimplex(bool validSignal)
{
if (!validSignal) {
io.setDecode(false);
io.setADCDetection(false);
DEBUG1("State to TIMEOUT_WAIT_RF");
m_state = FS_TIMEOUT_WAIT_RF;
m_ackDelayTimer.start();
}
}
void CFM::timeoutRFWaitStateDuplex(bool validSignal) void CFM::timeoutRFWaitStateDuplex(bool validSignal)
{ {
if (validSignal) { if (validSignal) {
@ -776,6 +868,25 @@ void CFM::timeoutRFWaitStateDuplex(bool validSignal)
} }
} }
void CFM::timeoutRFWaitStateSimplex(bool validSignal)
{
if (validSignal) {
io.setDecode(true);
io.setADCDetection(true);
DEBUG1("State to TIMEOUT_RF");
m_state = FS_TIMEOUT_RF;
m_ackDelayTimer.stop();
} else {
if (m_ackDelayTimer.isRunning() && m_ackDelayTimer.hasExpired()) {
DEBUG1("State to LISTENING");
m_state = FS_LISTENING;
m_ackDelayTimer.stop();
m_timeoutTimer.stop();
}
}
}
void CFM::timeoutExtStateDuplex(bool validSignal) void CFM::timeoutExtStateDuplex(bool validSignal)
{ {
if (!validSignal) { if (!validSignal) {
@ -790,6 +901,15 @@ void CFM::timeoutExtStateDuplex(bool validSignal)
} }
} }
void CFM::timeoutExtStateSimplex(bool validSignal)
{
if (!validSignal) {
DEBUG1("State to TIMEOUT_WAIT_EXT");
m_state = FS_TIMEOUT_WAIT_EXT;
m_ackDelayTimer.start();
}
}
void CFM::timeoutExtWaitStateDuplex(bool validSignal) void CFM::timeoutExtWaitStateDuplex(bool validSignal)
{ {
if (validSignal) { if (validSignal) {
@ -815,6 +935,23 @@ void CFM::timeoutExtWaitStateDuplex(bool validSignal)
m_callsignTimer.start(); m_callsignTimer.start();
} }
} }
void CFM::timeoutExtWaitStateSimplex(bool validSignal)
{
if (validSignal) {
DEBUG1("State to TIMEOUT_EXT");
m_state = FS_TIMEOUT_EXT;
m_ackDelayTimer.stop();
} else {
if (m_ackDelayTimer.isRunning() && m_ackDelayTimer.hasExpired()) {
DEBUG1("State to LISTENING");
m_state = FS_LISTENING;
m_ackDelayTimer.stop();
m_timeoutTimer.stop();
}
}
}
void CFM::sendCallsign() void CFM::sendCallsign()
{ {
if (m_holdoffTimer.isRunning()) { if (m_holdoffTimer.isRunning()) {

6
FM.h
View File

@ -121,7 +121,13 @@ private:
void simplexStateMachine(bool validRFSignal, bool validExtSignal); void simplexStateMachine(bool validRFSignal, bool validExtSignal);
void listeningStateSimplex(bool validRFSignal, bool validExtSignal); void listeningStateSimplex(bool validRFSignal, bool validExtSignal);
void relayingRFStateSimplex(bool validSignal); void relayingRFStateSimplex(bool validSignal);
void relayingRFWaitStateSimplex(bool validSignal);
void timeoutRFStateSimplex(bool validSignal);
void timeoutRFWaitStateSimplex(bool validSignal);
void relayingExtStateSimplex(bool validSignal); void relayingExtStateSimplex(bool validSignal);
void relayingExtWaitStateSimplex(bool validSignal);
void timeoutExtStateSimplex(bool validSignal);
void timeoutExtWaitStateSimplex(bool validSignal);
void clock(uint8_t length); void clock(uint8_t length);

View File

@ -109,7 +109,7 @@ const uint8_t MMDVM_DEBUG5 = 0xF5U;
#define HW_TYPE "MMDVM" #define HW_TYPE "MMDVM"
#endif #endif
#define DESCRIPTION "20200701 (D-Star/DMR/System Fusion/P25/NXDN/POCSAG/FM/AX.25)" #define DESCRIPTION "20200706 (D-Star/DMR/System Fusion/P25/NXDN/POCSAG/FM/AX.25)"
#if defined(GITVERSION) #if defined(GITVERSION)
#define concat(h, a, b, c) h " " a " " b " GitID #" c "" #define concat(h, a, b, c) h " " a " " b " GitID #" c ""