2011-01-30 15:46:25 +01:00
|
|
|
/**
|
|
|
|
******************************************************************************
|
|
|
|
*
|
|
|
|
* @file connectionmanager.cpp
|
|
|
|
* @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010.
|
|
|
|
* Parts by Nokia Corporation (qt-info@nokia.com) Copyright (C) 2009.
|
|
|
|
* @addtogroup GCSPlugins GCS Plugins
|
|
|
|
* @{
|
|
|
|
* @addtogroup CorePlugin Core Plugin
|
|
|
|
* @{
|
|
|
|
* @brief The Core GCS plugin
|
|
|
|
*****************************************************************************/
|
|
|
|
/*
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; either version 3 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful, but
|
|
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
|
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
|
|
* for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License along
|
|
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
|
|
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "connectionmanager.h"
|
|
|
|
|
|
|
|
#include <aggregation/aggregate.h>
|
|
|
|
#include <coreplugin/iconnection.h>
|
|
|
|
#include <extensionsystem/pluginmanager.h>
|
|
|
|
#include "qextserialport/src/qextserialenumerator.h"
|
|
|
|
#include "qextserialport/src/qextserialport.h"
|
|
|
|
#include <QDebug>
|
|
|
|
#include <QLabel>
|
|
|
|
#include <QHBoxLayout>
|
|
|
|
#include <QComboBox>
|
2012-01-10 18:03:58 +01:00
|
|
|
#include <QEventLoop>
|
2011-08-03 12:58:39 +02:00
|
|
|
|
2011-01-30 15:46:25 +01:00
|
|
|
namespace Core {
|
|
|
|
|
|
|
|
|
2011-08-03 12:58:39 +02:00
|
|
|
ConnectionManager::ConnectionManager(Internal::MainWindow *mainWindow, QTabWidget *modeStack) :
|
2012-09-08 20:33:50 +02:00
|
|
|
QWidget(mainWindow),
|
2012-07-17 01:24:22 +02:00
|
|
|
m_availableDevList(0),
|
2011-01-30 15:46:25 +01:00
|
|
|
m_connectBtn(0),
|
2012-07-17 01:24:22 +02:00
|
|
|
m_ioDev(NULL),
|
2012-09-09 02:45:02 +02:00
|
|
|
polling(true),
|
2012-07-17 01:24:22 +02:00
|
|
|
m_mainWindow(mainWindow)
|
2011-01-30 15:46:25 +01:00
|
|
|
{
|
|
|
|
QHBoxLayout *layout = new QHBoxLayout;
|
2011-08-08 13:50:46 +02:00
|
|
|
layout->setSpacing(5);
|
2012-08-09 10:12:56 +02:00
|
|
|
layout->setContentsMargins(5,2,5,2);
|
2012-08-03 01:11:18 +02:00
|
|
|
|
2012-08-14 21:35:53 +02:00
|
|
|
m_monitorWidget = new TelemetryMonitorWidget(this);
|
|
|
|
layout->addWidget(m_monitorWidget, Qt::AlignHCenter);
|
2012-08-03 01:11:18 +02:00
|
|
|
|
2011-08-08 13:50:46 +02:00
|
|
|
layout->addWidget(new QLabel(tr("Connections:")));
|
2011-01-30 15:46:25 +01:00
|
|
|
|
|
|
|
m_availableDevList = new QComboBox;
|
|
|
|
m_availableDevList->setMinimumWidth(100);
|
|
|
|
m_availableDevList->setMaximumWidth(150);
|
|
|
|
m_availableDevList->setContextMenuPolicy(Qt::CustomContextMenu);
|
|
|
|
layout->addWidget(m_availableDevList);
|
|
|
|
|
2011-08-08 13:50:46 +02:00
|
|
|
m_connectBtn = new QPushButton(tr("Connect"));
|
2011-01-30 15:46:25 +01:00
|
|
|
m_connectBtn->setEnabled(false);
|
|
|
|
layout->addWidget(m_connectBtn);
|
|
|
|
|
2011-08-03 12:58:39 +02:00
|
|
|
setLayout(layout);
|
2011-01-30 15:46:25 +01:00
|
|
|
|
2011-08-08 13:50:46 +02:00
|
|
|
modeStack->setCornerWidget(this, Qt::TopRightCorner);
|
2011-01-30 15:46:25 +01:00
|
|
|
|
2012-07-30 13:58:36 +02:00
|
|
|
QObject::connect(m_connectBtn, SIGNAL(clicked()), this, SLOT(onConnectClicked()));
|
2012-08-14 21:35:53 +02:00
|
|
|
|
|
|
|
// setup our reconnect timers
|
|
|
|
reconnect = new QTimer(this);
|
|
|
|
reconnectCheck = new QTimer(this);
|
|
|
|
connect(reconnect,SIGNAL(timeout()),this,SLOT(reconnectSlot()));
|
|
|
|
connect(reconnectCheck,SIGNAL(timeout()),this,SLOT(reconnectCheckSlot()));
|
2011-01-30 15:46:25 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
ConnectionManager::~ConnectionManager()
|
|
|
|
{
|
2012-09-08 20:33:50 +02:00
|
|
|
disconnectDevice();
|
|
|
|
suspendPolling();
|
2012-08-14 21:35:53 +02:00
|
|
|
if (m_monitorWidget)
|
|
|
|
delete m_monitorWidget;
|
2011-01-30 15:46:25 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void ConnectionManager::init()
|
|
|
|
{
|
|
|
|
//register to the plugin manager so we can receive
|
|
|
|
//new connection object from plugins
|
2012-07-17 01:24:22 +02:00
|
|
|
QObject::connect(ExtensionSystem::PluginManager::instance(), SIGNAL(objectAdded(QObject*)), this, SLOT(objectAdded(QObject*)));
|
|
|
|
QObject::connect(ExtensionSystem::PluginManager::instance(), SIGNAL(aboutToRemoveObject(QObject*)), this, SLOT(aboutToRemoveObject(QObject*)));
|
2011-01-30 15:46:25 +01:00
|
|
|
}
|
|
|
|
|
2011-03-04 21:42:47 +01:00
|
|
|
/**
|
|
|
|
* Method called when the user clicks the "Connect" button
|
|
|
|
*/
|
2012-09-13 22:11:37 +02:00
|
|
|
bool ConnectionManager::connectDevice(DevListItem device)
|
2011-03-04 21:42:47 +01:00
|
|
|
{
|
2012-09-08 22:45:08 +02:00
|
|
|
DevListItem connection_device = findDevice(m_availableDevList->itemData(m_availableDevList->currentIndex(),Qt::ToolTipRole).toString());
|
2011-03-25 11:59:24 +01:00
|
|
|
if (!connection_device.connection)
|
|
|
|
return false;
|
|
|
|
|
2012-09-08 22:14:06 +02:00
|
|
|
QIODevice *io_dev = connection_device.connection->openDevice(connection_device.device.name);
|
2011-03-25 11:59:24 +01:00
|
|
|
if (!io_dev)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
io_dev->open(QIODevice::ReadWrite);
|
|
|
|
|
|
|
|
// check if opening the device worked
|
|
|
|
if (!io_dev->isOpen()) {
|
|
|
|
return false;
|
|
|
|
}
|
2011-03-04 21:42:47 +01:00
|
|
|
|
2011-03-25 11:59:24 +01:00
|
|
|
// we appear to have connected to the device OK
|
|
|
|
// remember the connection/device details
|
2012-07-24 23:10:17 +02:00
|
|
|
m_connectionDevice = connection_device;
|
2011-03-25 11:59:24 +01:00
|
|
|
m_ioDev = io_dev;
|
2011-03-04 21:42:47 +01:00
|
|
|
|
2011-03-25 11:59:24 +01:00
|
|
|
connect(m_connectionDevice.connection, SIGNAL(destroyed(QObject *)), this, SLOT(onConnectionDestroyed(QObject *)), Qt::QueuedConnection);
|
2011-03-04 21:42:47 +01:00
|
|
|
|
2011-03-25 11:59:24 +01:00
|
|
|
// signal interested plugins that we connected to the device
|
2012-09-13 22:11:37 +02:00
|
|
|
emit deviceConnected(io_dev);
|
2011-03-25 11:59:24 +01:00
|
|
|
m_connectBtn->setText("Disconnect");
|
|
|
|
m_availableDevList->setEnabled(false);
|
2012-08-03 01:11:18 +02:00
|
|
|
|
2012-08-14 21:35:53 +02:00
|
|
|
// tell the monitorwidget we're conneced
|
|
|
|
m_monitorWidget->connect();
|
2012-08-03 01:11:18 +02:00
|
|
|
|
2011-03-25 11:59:24 +01:00
|
|
|
return true;
|
2011-03-04 21:42:47 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Method called by plugins who want to force a disconnection.
|
|
|
|
* Used by Uploader gadget for instance.
|
|
|
|
*/
|
|
|
|
bool ConnectionManager::disconnectDevice()
|
|
|
|
{
|
2012-08-14 21:35:53 +02:00
|
|
|
// tell the monitor widget we're disconnected
|
|
|
|
m_monitorWidget->disconnect();
|
|
|
|
|
2011-03-25 11:59:24 +01:00
|
|
|
if (!m_ioDev) {
|
|
|
|
// apparently we are already disconnected: this can
|
|
|
|
// happen if a plugin tries to force a disconnect whereas
|
|
|
|
// we are not connected. Just return.
|
|
|
|
return false;
|
|
|
|
}
|
2011-03-04 21:42:47 +01:00
|
|
|
|
2011-03-25 11:59:24 +01:00
|
|
|
// We are connected - disconnect from the device
|
2011-03-04 21:42:47 +01:00
|
|
|
|
2012-08-14 21:35:53 +02:00
|
|
|
// stop our timers
|
|
|
|
if(reconnect->isActive())
|
|
|
|
reconnect->stop();
|
|
|
|
if(reconnectCheck->isActive())
|
|
|
|
reconnectCheck->stop();
|
|
|
|
|
2011-03-25 11:59:24 +01:00
|
|
|
// signal interested plugins that user is disconnecting his device
|
|
|
|
emit deviceAboutToDisconnect();
|
2011-03-04 21:42:47 +01:00
|
|
|
|
2011-03-25 11:59:24 +01:00
|
|
|
try {
|
2012-09-08 22:14:06 +02:00
|
|
|
if (m_connectionDevice.connection) {
|
|
|
|
m_connectionDevice.connection->closeDevice(m_connectionDevice.getConName());
|
|
|
|
}
|
2011-03-25 11:59:24 +01:00
|
|
|
} catch (...) { // handle exception
|
2012-09-08 22:29:38 +02:00
|
|
|
qDebug() << "Exception: m_connectionDevice.connection->closeDevice(" << m_connectionDevice.getConName() << ")";
|
2011-03-25 11:59:24 +01:00
|
|
|
}
|
2011-03-04 21:42:47 +01:00
|
|
|
|
2011-03-25 11:59:24 +01:00
|
|
|
m_connectionDevice.connection = NULL;
|
|
|
|
m_ioDev = NULL;
|
2011-03-04 21:42:47 +01:00
|
|
|
|
2012-07-17 01:24:22 +02:00
|
|
|
emit deviceDisconnected();
|
2011-03-25 11:59:24 +01:00
|
|
|
m_connectBtn->setText("Connect");
|
|
|
|
m_availableDevList->setEnabled(true);
|
2011-03-05 11:55:38 +01:00
|
|
|
|
2011-03-25 11:59:24 +01:00
|
|
|
return true;
|
2011-03-04 21:42:47 +01:00
|
|
|
}
|
|
|
|
|
2011-01-30 15:46:25 +01:00
|
|
|
/**
|
|
|
|
* Slot called when a plugin added an object to the core pool
|
|
|
|
*/
|
|
|
|
void ConnectionManager::objectAdded(QObject *obj)
|
|
|
|
{
|
|
|
|
//Check if a plugin added a connection object to the pool
|
|
|
|
IConnection *connection = Aggregation::query<IConnection>(obj);
|
2012-07-17 01:24:22 +02:00
|
|
|
if (!connection) return;
|
2011-01-30 15:46:25 +01:00
|
|
|
|
|
|
|
//register devices and populate CB
|
|
|
|
devChanged(connection);
|
|
|
|
|
|
|
|
// Keep track of the registration to be able to tell plugins
|
|
|
|
// to do things
|
|
|
|
m_connectionsList.append(connection);
|
|
|
|
|
2012-07-17 01:24:22 +02:00
|
|
|
QObject::connect(connection, SIGNAL(availableDevChanged(IConnection *)), this, SLOT(devChanged(IConnection *)));
|
2011-01-30 15:46:25 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void ConnectionManager::aboutToRemoveObject(QObject *obj)
|
|
|
|
{
|
|
|
|
//Check if a plugin added a connection object to the pool
|
|
|
|
IConnection *connection = Aggregation::query<IConnection>(obj);
|
2012-07-17 01:24:22 +02:00
|
|
|
if (!connection) return;
|
2011-02-26 04:19:24 +01:00
|
|
|
|
2012-09-08 21:31:16 +02:00
|
|
|
if (m_connectionDevice.connection && m_connectionDevice.connection == connection)
|
2012-07-17 01:24:22 +02:00
|
|
|
{ // we are currently using the one that is about to be removed
|
2012-09-08 21:31:16 +02:00
|
|
|
disconnectDevice();
|
2012-07-17 01:24:22 +02:00
|
|
|
m_connectionDevice.connection = NULL;
|
|
|
|
m_ioDev = NULL;
|
|
|
|
}
|
2011-01-30 15:46:25 +01:00
|
|
|
|
2012-07-17 01:24:22 +02:00
|
|
|
if (m_connectionsList.contains(connection))
|
|
|
|
m_connectionsList.removeAt(m_connectionsList.indexOf(connection));
|
2011-01-30 15:46:25 +01:00
|
|
|
}
|
|
|
|
|
2011-02-26 04:19:24 +01:00
|
|
|
|
2012-09-08 21:31:16 +02:00
|
|
|
void ConnectionManager::onConnectionDestroyed(QObject *obj)
|
2011-02-26 04:19:24 +01:00
|
|
|
{
|
2011-06-07 17:15:16 +02:00
|
|
|
Q_UNUSED(obj)
|
|
|
|
disconnectDevice();
|
2011-02-26 04:19:24 +01:00
|
|
|
}
|
2011-01-30 15:46:25 +01:00
|
|
|
|
|
|
|
/**
|
2012-07-30 13:58:36 +02:00
|
|
|
* Slot called when the user clicks the connect/disconnect button
|
2011-01-30 15:46:25 +01:00
|
|
|
*/
|
2012-07-30 13:58:36 +02:00
|
|
|
void ConnectionManager::onConnectClicked()
|
2011-01-30 15:46:25 +01:00
|
|
|
{
|
2011-03-25 11:59:24 +01:00
|
|
|
// Check if we have a ioDev already created:
|
|
|
|
if (!m_ioDev)
|
2012-07-17 01:24:22 +02:00
|
|
|
{
|
|
|
|
// connecting to currently selected device
|
2012-09-13 22:11:37 +02:00
|
|
|
DevListItem device = findDevice(m_availableDevList->itemData(m_availableDevList->currentIndex(), Qt::ToolTipRole).toString());
|
2012-07-17 01:24:22 +02:00
|
|
|
if (device.connection)
|
|
|
|
connectDevice(device);
|
2011-01-30 15:46:25 +01:00
|
|
|
}
|
|
|
|
else
|
2011-03-25 11:59:24 +01:00
|
|
|
{ // disconnecting
|
|
|
|
disconnectDevice();
|
2011-01-30 15:46:25 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-08-14 21:35:53 +02:00
|
|
|
/**
|
|
|
|
* Slot called when the telemetry is connected
|
|
|
|
*/
|
|
|
|
void ConnectionManager::telemetryConnected()
|
|
|
|
{
|
|
|
|
qDebug() << "TelemetryMonitor: connected";
|
|
|
|
|
2012-08-17 06:13:07 +02:00
|
|
|
if(reconnectCheck->isActive())
|
|
|
|
reconnectCheck->stop();
|
|
|
|
|
2012-08-14 21:35:53 +02:00
|
|
|
//tell the monitor we're connected
|
|
|
|
m_monitorWidget->connect();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Slot called when the telemetry is disconnected
|
|
|
|
*/
|
|
|
|
void ConnectionManager::telemetryDisconnected()
|
|
|
|
{
|
|
|
|
qDebug() << "TelemetryMonitor: disconnected";
|
|
|
|
|
2012-08-17 06:13:07 +02:00
|
|
|
if (m_ioDev){
|
|
|
|
if(m_connectionDevice.connection->shortName()=="Serial") {
|
|
|
|
if(!reconnect->isActive())
|
|
|
|
reconnect->start(1000);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-08-14 21:35:53 +02:00
|
|
|
//tell the monitor we're disconnected
|
|
|
|
m_monitorWidget->disconnect();
|
|
|
|
}
|
|
|
|
|
2012-08-03 01:11:18 +02:00
|
|
|
/**
|
|
|
|
* Slot called when the telemetry rates are updated
|
|
|
|
*/
|
|
|
|
void ConnectionManager::telemetryUpdated(double txRate, double rxRate)
|
|
|
|
{
|
2012-08-14 21:35:53 +02:00
|
|
|
m_monitorWidget->updateTelemetry(txRate, rxRate);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ConnectionManager::reconnectSlot()
|
|
|
|
{
|
|
|
|
qDebug()<<"reconnect";
|
|
|
|
if(m_ioDev->isOpen())
|
|
|
|
m_ioDev->close();
|
|
|
|
|
|
|
|
if(m_ioDev->open(QIODevice::ReadWrite)) {
|
|
|
|
qDebug()<<"reconnect successfull";
|
|
|
|
reconnect->stop();
|
|
|
|
reconnectCheck->start(20000);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
qDebug()<<"reconnect NOT successfull";
|
|
|
|
}
|
|
|
|
|
|
|
|
void ConnectionManager::reconnectCheckSlot()
|
|
|
|
{
|
|
|
|
reconnectCheck->stop();
|
|
|
|
reconnect->start(1000);
|
2012-08-03 01:11:18 +02:00
|
|
|
}
|
|
|
|
|
2011-01-30 15:46:25 +01:00
|
|
|
/**
|
|
|
|
* Find a device by its displayed (visible on screen) name
|
|
|
|
*/
|
2012-09-08 22:45:08 +02:00
|
|
|
DevListItem ConnectionManager::findDevice(const QString &devName)
|
2011-01-30 15:46:25 +01:00
|
|
|
{
|
2012-09-08 22:45:08 +02:00
|
|
|
foreach (DevListItem d, m_devList)
|
2011-01-30 15:46:25 +01:00
|
|
|
{
|
2012-09-08 22:14:06 +02:00
|
|
|
if (d.getConName() == devName)
|
2011-01-30 15:46:25 +01:00
|
|
|
return d;
|
|
|
|
}
|
2011-02-26 04:19:24 +01:00
|
|
|
|
2011-03-29 20:25:24 +02:00
|
|
|
qDebug() << "findDevice: cannot find " << devName << " in device list";
|
2011-02-26 04:19:24 +01:00
|
|
|
|
2012-09-08 22:45:08 +02:00
|
|
|
DevListItem d;
|
2011-01-30 15:46:25 +01:00
|
|
|
d.connection = NULL;
|
|
|
|
return d;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Tells every connection plugin to stop polling for devices if they
|
|
|
|
* are doing that.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
void ConnectionManager::suspendPolling()
|
|
|
|
{
|
2012-07-17 01:24:22 +02:00
|
|
|
foreach (IConnection *cnx, m_connectionsList)
|
|
|
|
{
|
2011-01-30 15:46:25 +01:00
|
|
|
cnx->suspendPolling();
|
|
|
|
}
|
|
|
|
|
2012-07-17 01:24:22 +02:00
|
|
|
m_connectBtn->setEnabled(false);
|
|
|
|
m_availableDevList->setEnabled(false);
|
2012-09-09 02:06:03 +02:00
|
|
|
polling = false;
|
2011-01-30 15:46:25 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Tells every connection plugin to resume polling for devices if they
|
|
|
|
* are doing that.
|
|
|
|
*/
|
|
|
|
void ConnectionManager::resumePolling()
|
|
|
|
{
|
2012-07-17 01:24:22 +02:00
|
|
|
foreach (IConnection *cnx, m_connectionsList)
|
|
|
|
{
|
2011-01-30 15:46:25 +01:00
|
|
|
cnx->resumePolling();
|
|
|
|
}
|
|
|
|
|
2012-07-17 01:24:22 +02:00
|
|
|
m_connectBtn->setEnabled(true);
|
|
|
|
m_availableDevList->setEnabled(true);
|
2012-09-09 02:06:03 +02:00
|
|
|
polling = true;
|
2011-01-30 15:46:25 +01:00
|
|
|
}
|
|
|
|
|
2011-03-04 21:42:47 +01:00
|
|
|
/**
|
2012-09-08 19:53:00 +02:00
|
|
|
* Synchronize the list of connections displayed with those physically
|
|
|
|
* present
|
|
|
|
* @param[in] connection Connection type that you want to forget about :)
|
|
|
|
*/
|
|
|
|
void ConnectionManager::updateConnectionList(IConnection *connection)
|
2011-03-04 21:42:47 +01:00
|
|
|
{
|
2012-09-08 22:59:54 +02:00
|
|
|
// Get the updated list of devices
|
2012-09-08 20:23:37 +02:00
|
|
|
QList <IConnection::device> availableDev = connection->availableDevices();
|
|
|
|
|
|
|
|
// Go through the list of connections of that type. If they are not in the
|
|
|
|
// available device list then remove them. If they are connected, then
|
|
|
|
// disconnect them.
|
2012-09-08 22:45:08 +02:00
|
|
|
for (QLinkedList<DevListItem>::iterator iter = m_devList.begin(); iter != m_devList.end(); )
|
2012-07-17 01:24:22 +02:00
|
|
|
{
|
2012-09-08 22:59:54 +02:00
|
|
|
if (iter->connection != connection) {
|
|
|
|
++iter;
|
|
|
|
continue;
|
2012-09-08 22:14:06 +02:00
|
|
|
}
|
2012-09-08 22:59:54 +02:00
|
|
|
|
|
|
|
// See if device exists in the updated availability list
|
|
|
|
bool found = availableDev.contains(iter->device);
|
|
|
|
if (!found) {
|
|
|
|
// we are currently using the one we are about to erase
|
2012-09-10 00:37:43 +02:00
|
|
|
if (m_connectionDevice.connection && m_connectionDevice.connection == connection && m_connectionDevice.device == iter->device) {
|
2012-07-17 01:24:22 +02:00
|
|
|
disconnectDevice();
|
|
|
|
}
|
|
|
|
|
|
|
|
iter = m_devList.erase(iter);
|
2012-09-08 22:59:54 +02:00
|
|
|
} else
|
2012-07-17 01:24:22 +02:00
|
|
|
++iter;
|
|
|
|
}
|
2012-09-08 19:53:00 +02:00
|
|
|
|
2012-09-08 22:59:54 +02:00
|
|
|
// Add any back to list that don't exist
|
2012-09-08 19:53:00 +02:00
|
|
|
foreach (IConnection::device dev, availableDev)
|
|
|
|
{
|
2012-09-08 22:59:54 +02:00
|
|
|
bool found = m_devList.contains(DevListItem(connection, dev));
|
2012-09-08 20:23:37 +02:00
|
|
|
if (!found) {
|
2012-09-08 21:04:59 +02:00
|
|
|
registerDevice(connection,dev);
|
2012-09-08 20:23:37 +02:00
|
|
|
}
|
2012-09-08 19:53:00 +02:00
|
|
|
}
|
2011-03-04 21:42:47 +01:00
|
|
|
}
|
2011-01-30 15:46:25 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Register a device from a specific connection plugin
|
2011-04-17 08:32:37 +02:00
|
|
|
* @param devN contains the connection shortname + device name which is diplayed in the tooltip
|
|
|
|
* @param disp is the name that is displayed in the dropdown menu
|
|
|
|
* @param name is the actual device name
|
2011-01-30 15:46:25 +01:00
|
|
|
*/
|
2012-09-08 21:04:59 +02:00
|
|
|
void ConnectionManager::registerDevice(IConnection *conn, IConnection::device device)
|
2011-01-30 15:46:25 +01:00
|
|
|
{
|
2012-09-08 22:59:54 +02:00
|
|
|
DevListItem d(conn,device);
|
2011-01-30 15:46:25 +01:00
|
|
|
m_devList.append(d);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* A device plugin notified us that its device list has changed
|
|
|
|
* (eg: user plug/unplug a usb device)
|
|
|
|
* \param[in] connection Connection type which signaled the update
|
|
|
|
*/
|
|
|
|
void ConnectionManager::devChanged(IConnection *connection)
|
|
|
|
{
|
2012-01-10 18:03:58 +01:00
|
|
|
if(!ExtensionSystem::PluginManager::instance()->allPluginsLoaded())
|
|
|
|
{
|
|
|
|
connectionBackup.append(connection);
|
|
|
|
connect(ExtensionSystem::PluginManager::instance(),SIGNAL(pluginsLoadEnded()),this,SLOT(connectionsCallBack()),Qt::UniqueConnection);
|
|
|
|
return;
|
|
|
|
}
|
2011-01-30 15:46:25 +01:00
|
|
|
//clear device list combobox
|
|
|
|
m_availableDevList->clear();
|
|
|
|
|
|
|
|
//remove registered devices of this IConnection from the list
|
2012-09-08 19:53:00 +02:00
|
|
|
updateConnectionList(connection);
|
2011-01-30 15:46:25 +01:00
|
|
|
|
2012-09-08 22:14:06 +02:00
|
|
|
updateConnectionDropdown();
|
2011-01-30 15:46:25 +01:00
|
|
|
|
2012-07-17 01:24:22 +02:00
|
|
|
qDebug() << "# devices " << m_devList.count();
|
|
|
|
emit availableDevicesChanged(m_devList);
|
|
|
|
|
2012-09-08 22:14:06 +02:00
|
|
|
|
|
|
|
//disable connection button if the liNameif (m_availableDevList->count() > 0)
|
|
|
|
if (m_availableDevList->count() > 0)
|
|
|
|
m_connectBtn->setEnabled(true);
|
|
|
|
else
|
|
|
|
m_connectBtn->setEnabled(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ConnectionManager::updateConnectionDropdown()
|
|
|
|
{
|
2011-01-30 15:46:25 +01:00
|
|
|
//add all the list again to the combobox
|
2012-09-08 22:45:08 +02:00
|
|
|
foreach (DevListItem d, m_devList)
|
2011-01-30 15:46:25 +01:00
|
|
|
{
|
2012-09-08 22:14:06 +02:00
|
|
|
m_availableDevList->addItem(d.getConName());
|
|
|
|
m_availableDevList->setItemData(m_availableDevList->count()-1, d.getConName(), Qt::ToolTipRole);
|
|
|
|
if(!m_ioDev && d.getConName().startsWith("USB"))
|
2011-05-31 16:29:53 +02:00
|
|
|
{
|
2011-06-01 19:40:04 +02:00
|
|
|
if(m_mainWindow->generalSettings()->autoConnect() || m_mainWindow->generalSettings()->autoSelect())
|
2012-07-17 01:24:22 +02:00
|
|
|
m_availableDevList->setCurrentIndex(m_availableDevList->count() - 1);
|
|
|
|
|
2012-09-09 02:06:03 +02:00
|
|
|
if(m_mainWindow->generalSettings()->autoConnect() && polling)
|
2011-11-26 01:04:36 +01:00
|
|
|
{
|
2012-09-09 02:06:03 +02:00
|
|
|
qDebug() << "Automatically opening device";
|
2012-09-13 22:11:37 +02:00
|
|
|
connectDevice(d);
|
2011-11-26 01:04:36 +01:00
|
|
|
qDebug()<<"ConnectionManager::devChanged autoconnected USB device";
|
|
|
|
}
|
2011-05-31 16:29:53 +02:00
|
|
|
}
|
2011-01-30 15:46:25 +01:00
|
|
|
}
|
2011-05-31 16:29:53 +02:00
|
|
|
if(m_ioDev)//if a device is connected make it the one selected on the dropbox
|
|
|
|
{
|
2012-07-24 23:10:17 +02:00
|
|
|
for(int x=0;x<m_availableDevList->count();++x)
|
2011-05-31 16:29:53 +02:00
|
|
|
{
|
2012-09-08 22:14:06 +02:00
|
|
|
if(m_connectionDevice.getConName()==m_availableDevList->itemData(x,Qt::ToolTipRole).toString())
|
2011-05-31 16:29:53 +02:00
|
|
|
m_availableDevList->setCurrentIndex(x);
|
|
|
|
}
|
|
|
|
}
|
2011-01-30 15:46:25 +01:00
|
|
|
}
|
|
|
|
|
2012-01-10 18:03:58 +01:00
|
|
|
void Core::ConnectionManager::connectionsCallBack()
|
|
|
|
{
|
|
|
|
foreach(IConnection * con,connectionBackup)
|
|
|
|
{
|
|
|
|
devChanged(con);
|
|
|
|
}
|
|
|
|
connectionBackup.clear();
|
|
|
|
disconnect(ExtensionSystem::PluginManager::instance(),SIGNAL(pluginsLoadEnded()),this,SLOT(connectionsCallBack()));
|
2012-07-17 01:24:22 +02:00
|
|
|
}
|
2012-09-08 22:14:06 +02:00
|
|
|
|
2011-01-30 15:46:25 +01:00
|
|
|
} //namespace Core
|