From 0db3cf10e8c0ab79627f0534b2d4a8b719970b26 Mon Sep 17 00:00:00 2001 From: Tony Corbett G0WFV Date: Sat, 14 May 2016 11:39:56 +0100 Subject: [PATCH] Attempt to solve one cause of "No reply from modem" loop "err 101" (network unreachable - effectively cant get to the master because we've lost the network) This needs trapping and handling properly to smooth the way it currently tries to send from the socket as quickly as it can (effectively every millisecond) until the network is restored, then does the same for "Opening IPSC" every millisecond or less until the login either times out (in which case I've edited the code to tell it to retry!) or logs into the master successfully. This error also causes the "no reply from modem loop, however this is now trapped in all cases if the firmware is read successfully by stopping the inactivity timer, allowing the software to continue reading the modem. It works for this particular error, but others may need to test! --- DMRIPSC.cpp | 11 +++++++++++ Modem.cpp | 4 ++++ 2 files changed, 15 insertions(+) diff --git a/DMRIPSC.cpp b/DMRIPSC.cpp index 9688a2c..1eb0b99 100644 --- a/DMRIPSC.cpp +++ b/DMRIPSC.cpp @@ -317,10 +317,21 @@ void CDMRIPSC::clock(unsigned int ms) m_timeoutTimer.start(); m_retryTimer.start(); } else { + /* LogError("Login to the master has failed, stopping IPSC"); m_status = DISCONNECTED; m_timeoutTimer.stop(); m_retryTimer.stop(); + */ + + /* Once the modem death spiral has been prevented in Modem.cpp + the IPSC sometimes times out and reaches here. + We want it to reconnect so... */ + + LogError("Login to the master has failed, retrying ..."); + close(); + open(); + return; } } else if (::memcmp(m_buffer, "RPTACK", 6U) == 0) { switch (m_status) { diff --git a/Modem.cpp b/Modem.cpp index f34ac4a..a03e5f3 100644 --- a/Modem.cpp +++ b/Modem.cpp @@ -156,6 +156,10 @@ bool CModem::open() if (!ret) { m_serial.close(); return false; + } else { + /* Stopping the inactivity timer here when a firmware version has been + successfuly read prevents the death spiral of "no reply from modem..." */ + m_inactivityTimer.stop(); } ret = setFrequency();