diff --git a/plugins/freeems/freeemscomms.cpp b/plugins/freeems/freeemscomms.cpp index 084bd95..34ef95d 100644 --- a/plugins/freeems/freeemscomms.cpp +++ b/plugins/freeems/freeemscomms.cpp @@ -1108,6 +1108,7 @@ void FreeEmsComms::run() rxThread = new SerialRXThread(); connect(rxThread,SIGNAL(incomingPacket(QByteArray)),this,SLOT(parseEverything(QByteArray)),Qt::DirectConnection); connect(rxThread,SIGNAL(dataRead(QByteArray)),this,SLOT(dataLogRead(QByteArray)),Qt::DirectConnection); + connect(rxThread,SIGNAL(portGone()),this,SLOT(rxThreadPortGone()),Qt::DirectConnection); //Before we finish emitting the fact that we are connected, let's verify this is a freeems system we are talking to. if (!sendPacket(GET_FIRMWARE_VERSION)) @@ -1301,6 +1302,12 @@ void FreeEmsComms::run() rxThread = 0; } } +void FreeEmsComms::rxThreadPortGone() +{ + disconnectSerial(); + emit error("Serial port has disappeared. Save your tune (File->Save tune) then ensure the device is still connected and powered, then reconnect"); +} + void FreeEmsComms::sendNextInterrogationPacket() { if (m_interrogatePacketList.size() == 0) diff --git a/plugins/freeems/freeemscomms.h b/plugins/freeems/freeemscomms.h index 68618e5..84a6da0 100644 --- a/plugins/freeems/freeemscomms.h +++ b/plugins/freeems/freeemscomms.h @@ -218,6 +218,7 @@ public slots: int burnBlockFromRamToFlash(unsigned short location,unsigned short offset, unsigned short size); private slots: void ramBlockUpdateRec(QByteArray header,QByteArray payload); + void rxThreadPortGone(); void flashBlockUpdateRec(QByteArray header,QByteArray payload); void packetNakedRec(unsigned short payloadid,QByteArray header,QByteArray payload,unsigned short errornum); void packetAckedRec(unsigned short payloadid,QByteArray header,QByteArray payload); diff --git a/plugins/freeems/serialport.cpp b/plugins/freeems/serialport.cpp index 049cd26..3aa8826 100644 --- a/plugins/freeems/serialport.cpp +++ b/plugins/freeems/serialport.cpp @@ -162,6 +162,7 @@ int SerialPort::openPort(QString portName,int baudrate,bool oddparity) { //QLOG_DEBUG() << "SerialPort::openPort thread:" << QThread::currentThread(); //m_serialPort = new QSerialPort(); + m_portName = portName; m_serialPort->setPortName(portName); if (!m_serialPort->open(QIODevice::ReadWrite)) { diff --git a/plugins/freeems/serialport.h b/plugins/freeems/serialport.h index e53e2e3..51402c4 100644 --- a/plugins/freeems/serialport.h +++ b/plugins/freeems/serialport.h @@ -57,6 +57,7 @@ class SerialPort : public QObject int readBytes(QByteArray *array, int maxlen,int timeout=0); int bufferSize() { return m_queuedMessages.size(); } void setInterByteSendDelay(int milliseconds); + QString portName() { return m_portName; } private: QSerialPort *m_serialPort; QByteArray m_privBuffer; diff --git a/plugins/freeems/serialrxthread.cpp b/plugins/freeems/serialrxthread.cpp index 51e6352..1558e1e 100644 --- a/plugins/freeems/serialrxthread.cpp +++ b/plugins/freeems/serialrxthread.cpp @@ -21,6 +21,7 @@ #include "serialrxthread.h" #include +#include #include "QsLog.h" SerialRXThread::SerialRXThread(QObject *parent) : QThread(parent) @@ -143,6 +144,7 @@ QByteArray SerialRXThread::readSinglePacket(SerialPort *port) void SerialRXThread::run() { + qint64 msecs = QDateTime::currentMSecsSinceEpoch(); QString byteoutofpacket; QByteArray qbuffer; //unsigned char buffer[10240]; @@ -153,6 +155,25 @@ void SerialRXThread::run() int readlen=0; while (!m_terminate) { + if (QDateTime::currentMSecsSinceEpoch() - msecs > 1500) + { + //Every second, check that the port still exists. + msecs = QDateTime::currentMSecsSinceEpoch(); + bool found = false; + foreach(QSerialPortInfo info,QSerialPortInfo::availablePorts()) + { + if (m_serialPort->portName().contains(info.portName())) + { + found = true; + } + } + if (!found) + { + emit portGone(); + return; + } + + } readlen = m_serialPort->readBytes(&buffer,100); if (readlen < 0) { diff --git a/plugins/freeems/serialrxthread.h b/plugins/freeems/serialrxthread.h index ad1c369..4d09f0f 100644 --- a/plugins/freeems/serialrxthread.h +++ b/plugins/freeems/serialrxthread.h @@ -48,6 +48,7 @@ class SerialRXThread : public QThread signals: void incomingPacket(QByteArray packet); void dataRead(QByteArray data); + void portGone(); public slots: };