diff --git a/README.md b/README.md index ef3f33a..265493d 100644 --- a/README.md +++ b/README.md @@ -134,6 +134,6 @@ XLX Server requires the following ports to be open and forwarded properly for in Pay attention, the XLX Server acts as an YSF Master, which provides 26 wires-x rooms. It has nothing to do with the regular YSFReflector network, hence you don’t need to register your XLX at ysfreflector.de ! - +Nevertheless it is possible. © 2016 Jean-Luc Deltombe (LX3JL) and Luc Engelmann (LX1IQ) diff --git a/scripts/scripts.readme.txt b/scripts/scripts.readme.txt index 4008da3..86bb307 100644 --- a/scripts/scripts.readme.txt +++ b/scripts/scripts.readme.txt @@ -1,11 +1,10 @@ ************************************************* -*copy xlxd into /etc.init.d/ -*copy ambed.service into /etc/systemd/system/ -* +*copy xlxd to /etc.init.d/ +*copy ambed.service to /etc/systemd/system/ +*copy watchdog to /ambed/ ************************************************* * xlxd executable must be in /xlxd/ folder * ambed executable must be in /ambed/ folder -* ************************************************* * possible options: * @@ -18,3 +17,10 @@ * #systemctl enable ambed * ************************************************* +* If your usb port gets unresponsive and you get some persistent timeouts, +* the watchdog script restarts the ambed service. +* You can run it every 5 minutes by a cronjob. +* +* */5 * * * * /ambed/./watchdog >> /ambed/watchdog.log +* +*************************************************** diff --git a/scripts/watchdog b/scripts/watchdog new file mode 100644 index 0000000..4582bf0 --- /dev/null +++ b/scripts/watchdog @@ -0,0 +1,14 @@ +#!/bin/bash +sleep 5 +PATTERN=timed +FILE=/var/log/syslog +if grep -q $PATTERN $FILE; + then + echo "ambed timeout error" + > /var/log/syslog + service ambed restart + else + echo "all ok" + echo "Exiting..." + exit 0 +fi diff --git a/src/cprotocol.cpp b/src/cprotocol.cpp index 7fd4967..12661eb 100644 --- a/src/cprotocol.cpp +++ b/src/cprotocol.cpp @@ -19,7 +19,7 @@ // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License -// along with Foobar. If not, see . +// along with Foobar. If not, see . // ---------------------------------------------------------------------------- #include "main.h" @@ -52,7 +52,7 @@ CProtocol::~CProtocol() m_pThread->join(); delete m_pThread; } - + // empty queue m_Queue.Lock(); while ( !m_Queue.empty() ) @@ -69,13 +69,13 @@ bool CProtocol::Init(void) { // init reflector apparent callsign m_ReflectorCallsign = g_Reflector.GetCallsign(); - + // reset stop flag m_bStopThread = false; // start thread; m_pThread = new std::thread(CProtocol::Thread, this); - + // done return true; } @@ -138,7 +138,12 @@ void CProtocol::OnDvFramePacketIn(CDvFramePacket *Frame, const CIp *Ip) { // find the stream CPacketStream *stream = GetStream(Frame->GetStreamId(), Ip); - if ( stream != NULL ) + if ( stream == NULL ) + { + std::cout << "Deleting oprhaned Frame Packet with StreamId " << Frame->GetStreamId() << " from " << *Ip << std::endl; + delete Frame; + } + else { //std::cout << "DV frame" << "from " << *Ip << std::endl; // and push @@ -152,13 +157,18 @@ void CProtocol::OnDvLastFramePacketIn(CDvLastFramePacket *Frame, const CIp *Ip) { // find the stream CPacketStream *stream = GetStream(Frame->GetStreamId(), Ip); - if ( stream != NULL ) + if ( stream == NULL ) + { + std::cout << "Deleting oprhaned Last Frame Packet with StreamId " << Frame->GetStreamId() << " from " << *Ip << std::endl; + delete Frame; + } + else { // push stream->Lock(); stream->Push(Frame); stream->Unlock(); - + // and close the stream g_Reflector.CloseStream(stream); } @@ -170,7 +180,7 @@ void CProtocol::OnDvLastFramePacketIn(CDvLastFramePacket *Frame, const CIp *Ip) CPacketStream *CProtocol::GetStream(uint16 uiStreamId, const CIp *Ip) { CPacketStream *stream = NULL; - + // find if we have a stream with same streamid in our cache for ( int i = 0; (i < m_Streams.size()) && (stream == NULL); i++ ) { @@ -256,5 +266,3 @@ uint32 CProtocol::ModuleToDmrDestId(char m) const { return (uint32)(m - 'A')+1; } - -