Index: sources/view/VBluetooth.cpp =================================================================== diff -u -r3a238930f8d939800512c9a786e96f15b35a2001 -r2fde0cfeb28b3fab9437e9bd15c1ec775785f103 --- sources/view/VBluetooth.cpp (.../VBluetooth.cpp) (revision 3a238930f8d939800512c9a786e96f15b35a2001) +++ sources/view/VBluetooth.cpp (.../VBluetooth.cpp) (revision 2fde0cfeb28b3fab9437e9bd15c1ec775785f103) @@ -44,6 +44,9 @@ connect(this, SIGNAL(didRequestConcurrentSave(QString,QString,bool)), &_FileSaver, SLOT(onConcurrentSave(QString,QString,bool))); + connect(this, SIGNAL(didRequestReconnectToDevice(QBluetoothDeviceInfo)), + &_BLEScanner, SLOT(doReselectDevice(QBluetoothDeviceInfo))); + onLoadMyDevices(); } @@ -56,7 +59,7 @@ void VBluetooth::doScanForDevices() { onUpdateStatus(tr("Scanning...")); - bleDevices.clear(); + _unpairedDevices.clear(); emit didDevicesChanged(); emit didRequestScanForDevices(); } @@ -88,7 +91,7 @@ { VBluetoothDeviceInfo *info = new VBluetoothDeviceInfo(device); if (!isDeviceAlreadyPaired(device)) - bleDevices.insert(0, info); + _unpairedDevices.insert(0, info); qDebug() << "VBluetooth: Discovered " << device.name(); emit didDevicesChanged(); } @@ -110,7 +113,7 @@ */ QVariant VBluetooth::doGetDevices() { - return QVariant::fromValue(bleDevices); + return QVariant::fromValue(_unpairedDevices); } /*! @@ -120,7 +123,7 @@ */ QVariant VBluetooth::doGetPairedDevices() { - return QVariant::fromValue(pairedDevices); + return QVariant::fromValue(_pairedDevices); } /*! @@ -130,7 +133,15 @@ */ void VBluetooth::doSelectDevice(const QString &addr) { - emit didSelectDevice(addr); + for (QObject *device : _unpairedDevices) { + VBluetoothDeviceInfo *d = static_cast(device); + if (addr == d->getAddress()) + { + delete _lastSelectedDevice; + _lastSelectedDevice = new VBluetoothDeviceInfo(addr, d->getName()); + emit didSelectDevice(addr); + } + } } /*! @@ -140,7 +151,7 @@ */ void VBluetooth::onUpdateStatus(const QString &message) { - status = message; + _status = message; emit didStatusChanged(); } @@ -214,7 +225,7 @@ */ bool VBluetooth::isDeviceAlreadyPaired(const QBluetoothDeviceInfo &deviceInfo) { - for (QObject *device : pairedDevices) { + for (QObject *device : _pairedDevices) { VBluetoothDeviceInfo *pairedDevice = static_cast(device); if (pairedDevice->getAddress() == deviceInfo.address().toString()) return true; @@ -232,14 +243,14 @@ { QList idxs; int i = 0; - for (QObject *bleDevice : bleDevices) { + for (QObject *bleDevice : _unpairedDevices) { VBluetoothDeviceInfo *device = static_cast(bleDevice); if (device->getAddress() == info->getAddress()) idxs.append(i); ++i; } for (int i : idxs) - bleDevices.removeAt(i); + _unpairedDevices.removeAt(i); // update the QML emit didDevicesChanged(); @@ -259,7 +270,7 @@ if (alreadyPaired) { setDeviceConnected(deviceInfo, true); } else { - pairedDevices.append(info); + _pairedDevices.append(info); emit didPairedDevicesChanged(); removeFromDevices(info); @@ -276,14 +287,14 @@ void VBluetooth::setDeviceConnected(const QBluetoothDeviceInfo &deviceInfo, const bool &connected) { if (isDeviceAlreadyPaired(deviceInfo)) { - for (QList::iterator iter = pairedDevices.begin(); iter != pairedDevices.end(); ++iter) + for (QList::iterator iter = _pairedDevices.begin(); iter != _pairedDevices.end(); ++iter) { if (deviceInfo.address().toString() == ((VBluetoothDeviceInfo*)(*iter))->getAddress()) ((VBluetoothDeviceInfo*)(*iter))->setConnected(connected); } emit didPairedDevicesChanged(); } else { - for (QList::iterator iter = bleDevices.begin(); iter != bleDevices.end(); ++iter) + for (QList::iterator iter = _unpairedDevices.begin(); iter != _unpairedDevices.end(); ++iter) { if (deviceInfo.address().toString() == ((VBluetoothDeviceInfo*)(*iter))->getAddress()) ((VBluetoothDeviceInfo*)(*iter))->setConnected(connected); @@ -306,23 +317,49 @@ } /*! + * \brief VBluetooth::onLoadAndConnectToLastSelectedDevice + * + * \param obj + */ +void VBluetooth::onLoadAndConnectToLastSelectedDevice(const QJsonObject &obj) +{ + if (obj.keys().contains(_lastSelectedDeviceAddrKey)) { + QJsonObject lastSelectDeviceObj = obj.value(_lastSelectedDeviceAddrKey).toObject(); + if (!lastSelectDeviceObj.isEmpty()) { + if (_lastSelectedDevice == nullptr) + { + _lastSelectedDevice = new VBluetoothDeviceInfo(lastSelectDeviceObj.value("Address").toString(), + lastSelectDeviceObj.value("Name").toString()); + LOG_DEBUG(QString("Trying to connect to last selected BLE device %1").arg(_lastSelectedDevice->getAddress())); + onReconnectToDevice(_lastSelectedDevice); + } + } + } +} + +/*! * \brief VBluetooth::loadMyDevices * Loads previously selected devices from disk */ void VBluetooth::onLoadMyDevices(const QString &path) { - pairedDevices.clear(); + _pairedDevices.clear(); QJsonObject obj; if (!FileHandler::readJSON(path, obj)) { LOG_EVENT(tr("Could not load my bluetooth devices from %1").arg(path)); return; } + onLoadAndConnectToLastSelectedDevice(obj); + for (const QString& key : obj.keys()) { - VBluetoothDeviceInfo *info = new VBluetoothDeviceInfo(key, obj[key].toString()); - pairedDevices.append(info); + if (key != _lastSelectedDeviceAddrKey) + { + VBluetoothDeviceInfo *info = new VBluetoothDeviceInfo(key, obj[key].toString()); + _pairedDevices.append(info); + } } } @@ -334,9 +371,28 @@ { QJsonObject obj; - for (QList::iterator iter = pairedDevices.begin(); iter != pairedDevices.end(); ++iter) + if (_lastSelectedDevice->isValid()) + { + QJsonObject subObj; + subObj["Name"] = _lastSelectedDevice->getName(); + subObj["Address"] = _lastSelectedDevice->getAddress(); + obj[_lastSelectedDeviceAddrKey] = subObj; + } + + for (QList::iterator iter = _pairedDevices.begin(); iter != _pairedDevices.end(); ++iter) obj[((VBluetoothDeviceInfo*)(*iter))->getAddress()] = ((VBluetoothDeviceInfo*)(*iter))->getName(); QJsonDocument document(obj); emit didRequestConcurrentSave(path, document.toJson(), false); } + +/*! + * \brief VBluetooth::onReconnectToDevice + * Reconnects to the specified device + * \param deviceInfo - the device to reconnect to + */ +void VBluetooth::onReconnectToDevice(const VBluetoothDeviceInfo *deviceInfo) +{ + QBluetoothDeviceInfo device(QBluetoothAddress(deviceInfo->getAddress()), deviceInfo->getName(), 0); + emit didRequestReconnectToDevice(device); +}