mirror of
https://bitbucket.org/librepilot/librepilot.git
synced 2024-12-01 09:24:10 +01:00
Updated the serial plugin to poll every 2 secs for new Serial ports on MacOS and Linux, where we don't get system events whenever a Serial/USB adapter is plugged in. No change
on windows where the OS already told our plugin about such events. Polling thread is lightweight, no worries... git-svn-id: svn://svn.openpilot.org/OpenPilot/trunk@2312 ebee16cc-31ac-478f-84a7-5cbb03baadba
This commit is contained in:
parent
3bad347386
commit
a552addbf7
@ -35,15 +35,60 @@
|
||||
|
||||
#include <QDebug>
|
||||
|
||||
|
||||
|
||||
SerialEnumerationThread::SerialEnumerationThread(SerialConnection *serial)
|
||||
: m_serial(serial),
|
||||
m_running(true)
|
||||
{
|
||||
}
|
||||
|
||||
SerialEnumerationThread::~SerialEnumerationThread()
|
||||
{
|
||||
m_running = false;
|
||||
//wait for the thread to terminate
|
||||
if(wait(1000) == false)
|
||||
qDebug() << "Cannot terminate SerialEnumerationThread";
|
||||
}
|
||||
|
||||
void SerialEnumerationThread::run()
|
||||
{
|
||||
QStringList devices = m_serial->availableDevices();
|
||||
|
||||
while(m_running)
|
||||
{
|
||||
if(!m_serial->deviceOpened())
|
||||
{
|
||||
QStringList newDev = m_serial->availableDevices();
|
||||
if(devices != newDev)
|
||||
{
|
||||
devices = newDev;
|
||||
emit enumerationChanged();
|
||||
}
|
||||
}
|
||||
|
||||
msleep(2000); //update available devices every two seconds (doesn't need more)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
SerialConnection::SerialConnection()
|
||||
: m_enumerateThread(this)
|
||||
{
|
||||
serialHandle = NULL;
|
||||
#ifdef Q_OS_WIN
|
||||
//I'm cheating a little bit here:
|
||||
//Knowing if the device enumeration really changed is a bit complicated
|
||||
//so I just signal it whenever we have a device event...
|
||||
QMainWindow *mw = Core::ICore::instance()->mainWindow();
|
||||
QObject::connect(mw, SIGNAL(deviceChange()),
|
||||
this, SLOT(onEnumerationChanged()));
|
||||
#else
|
||||
// Other OSes do not send such signals:
|
||||
QObject::connect(&m_enumerateThread, SIGNAL(enumerationChanged()),
|
||||
this, SLOT(onEnumerationChanged()));
|
||||
m_enumerateThread.start();
|
||||
#endif
|
||||
}
|
||||
|
||||
SerialConnection::~SerialConnection()
|
||||
@ -95,6 +140,7 @@ QIODevice *SerialConnection::openDevice(const QString &deviceName)
|
||||
#else
|
||||
serialHandle = new QextSerialPort(port.physName, set);
|
||||
#endif
|
||||
m_deviceOpened = true;
|
||||
return serialHandle;
|
||||
}
|
||||
}
|
||||
@ -109,6 +155,7 @@ void SerialConnection::closeDevice(const QString &deviceName)
|
||||
serialHandle->close ();
|
||||
delete(serialHandle);
|
||||
serialHandle = NULL;
|
||||
m_deviceOpened = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -33,9 +33,34 @@
|
||||
#include <qextserialenumerator.h>
|
||||
#include "coreplugin/iconnection.h"
|
||||
#include <extensionsystem/iplugin.h>
|
||||
#include <QThread>
|
||||
|
||||
class IConnection;
|
||||
class QextSerialEnumerator;
|
||||
class SerialConnection;
|
||||
|
||||
/**
|
||||
* Helper thread to check on new serial port connection/disconnection
|
||||
* Some operating systems do not send device insertion events so
|
||||
* for those we have to poll
|
||||
*/
|
||||
class SERIAL_EXPORT SerialEnumerationThread : public QThread
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
SerialEnumerationThread(SerialConnection *serial);
|
||||
virtual ~SerialEnumerationThread();
|
||||
|
||||
virtual void run();
|
||||
|
||||
signals:
|
||||
void enumerationChanged();
|
||||
|
||||
protected:
|
||||
SerialConnection *m_serial;
|
||||
bool m_running;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Define a connection via the IConnection interface
|
||||
@ -56,12 +81,18 @@ public:
|
||||
|
||||
virtual QString connectionName();
|
||||
virtual QString shortName();
|
||||
bool deviceOpened() {return m_deviceOpened;}
|
||||
|
||||
|
||||
private:
|
||||
QextSerialPort* serialHandle;
|
||||
|
||||
protected slots:
|
||||
void onEnumerationChanged();
|
||||
|
||||
protected:
|
||||
SerialEnumerationThread m_enumerateThread;
|
||||
bool m_deviceOpened;
|
||||
};
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user