From 192346bcaab2ebe115d128cb128c3d3c3127fe35 Mon Sep 17 00:00:00 2001 From: Michael Carpenter Date: Mon, 12 May 2014 21:51:16 -0400 Subject: [PATCH] FreeEmsPlugin: Fix for Serial Comms not detecting USB unplug SerialRXThread will now poll the serial ports on a system every 1.5 seconds, and notify the user if the currently connected port has disappeared. This will allow the user to save off their tune and reconnect, then reload the tune to avoid any data loss --- plugins/freeems/freeemscomms.cpp | 7 +++++++ plugins/freeems/freeemscomms.h | 1 + plugins/freeems/serialport.cpp | 1 + plugins/freeems/serialport.h | 1 + plugins/freeems/serialrxthread.cpp | 21 +++++++++++++++++++++ plugins/freeems/serialrxthread.h | 1 + 6 files changed, 32 insertions(+) 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: };