diff options
| author | Tomasz Sterna <tomek@xiaoka.com> | 2014-06-30 01:59:14 +0200 |
|---|---|---|
| committer | Tomasz Sterna <tomek@xiaoka.com> | 2014-06-30 01:59:14 +0200 |
| commit | 3c52767b24f27ac166f9c68e2fc73811527bafe1 (patch) | |
| tree | d4a4050de526967ac4c3407f643b51d616cc31fe /lib | |
| parent | 1d5e1b8dbb04d1ba916ff90445d22e0a145fd041 (diff) | |
Reworked WatchConnector connection/disconnection handling
Fixed crash after Pebble disconnecting
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/watchconnector.cpp | 61 | ||||
| -rw-r--r-- | lib/watchconnector.h | 16 |
2 files changed, 39 insertions, 38 deletions
diff --git a/lib/watchconnector.cpp b/lib/watchconnector.cpp index e987cce..15fd97f 100644 --- a/lib/watchconnector.cpp +++ b/lib/watchconnector.cpp @@ -4,13 +4,11 @@ using namespace watch; -static int __reconnect_timeout = 1000; +static int __reconnect_timeout = 5000; //ms WatchConnector::WatchConnector(QObject *parent) : - QObject(parent) -{ - socket = nullptr; -} + QObject(parent), socket(nullptr), is_connected(false) +{} WatchConnector::~WatchConnector() { @@ -21,47 +19,47 @@ void WatchConnector::deviceDiscovered(const QBluetoothDeviceInfo &device) //FIXME TODO: Configurable if (device.name().startsWith("Pebble")) { qDebug() << "Found Pebble:" << device.name() << '(' << device.address().toString() << ')'; - handleWatch(device); + handleWatch(device.name(), device.address().toString()); } else { qDebug() << "Found other device:" << device.name() << '(' << device.address().toString() << ')'; } } -void WatchConnector::deviceConnect(const QString name, const QString address) +void WatchConnector::deviceConnect(const QString &name, const QString &address) { - if (name.startsWith("Pebble")) { - _last_name = name; - _last_address = address; - QBluetoothDeviceInfo device(QBluetoothAddress(address), name, 0); - deviceDiscovered(device); - } + if (name.startsWith("Pebble")) handleWatch(name, address); } void WatchConnector::reconnect() { - if (_last_name != "" && _last_address != "") { + qDebug() << "reconnect" << _last_name; + if (!_last_name.isEmpty() && !_last_address.isEmpty()) { deviceConnect(_last_name, _last_address); } } -void WatchConnector::handleWatch(const QBluetoothDeviceInfo &device) +void WatchConnector::handleWatch(const QString &name, const QString &address) { - qDebug() << "handleWatch" << device.name(); - if (socket != nullptr) { + qDebug() << "handleWatch" << name << (socket != nullptr); + if (socket != nullptr && socket->isOpen()) { socket->close(); socket->deleteLater(); - socket = nullptr; } - socket = new QBluetoothSocket(QBluetoothSocket::RfcommSocket); + bool emit_name = (_last_name != name); + _last_name = name; + _last_address = address; + if (emit_name) emit nameChanged(); + qDebug() << "Creating socket"; + socket = new QBluetoothSocket(QBluetoothSocket::RfcommSocket); // FIXME: Assuming port 1 (with Pebble) - socket->connectToService(device.address(), 1); + socket->connectToService(QBluetoothAddress(address), 1); - connect(socket, SIGNAL(readyRead()), this, SLOT(readSocket())); - connect(socket, SIGNAL(connected()), this, SLOT(connected())); - connect(socket, SIGNAL(disconnected()), this, SLOT(disconnected())); + connect(socket, SIGNAL(readyRead()), SLOT(onReadSocket())); + connect(socket, SIGNAL(connected()), SLOT(onConnected())); + connect(socket, SIGNAL(disconnected()), SLOT(onDisconnected())); } QString WatchConnector::decodeEndpoint(unsigned int val) @@ -133,7 +131,7 @@ void WatchConnector::decodeMsg(QByteArray data) } } -void WatchConnector::readSocket() +void WatchConnector::onReadSocket() { qDebug() << "read"; @@ -147,26 +145,27 @@ void WatchConnector::readSocket() } } -void WatchConnector::connected() +void WatchConnector::onConnected() { qDebug() << "Connected!"; + bool was_connected = is_connected; is_connected = true; - emit nameChanged(); - emit connectedChanged(); + if (not was_connected) emit connectedChanged(); } -void WatchConnector::disconnected() +void WatchConnector::onDisconnected() { qDebug() << "Disconnected!"; + + bool was_connected = is_connected; is_connected = false; QBluetoothSocket *socket = qobject_cast<QBluetoothSocket *>(sender()); if (!socket) return; + if (was_connected) emit connectedChanged(); + socket->deleteLater(); - socket = nullptr; - emit connectedChanged(); - emit nameChanged(); // Try to connect again after a timeout QTimer::singleShot(__reconnect_timeout, this, SLOT(reconnect())); diff --git a/lib/watchconnector.h b/lib/watchconnector.h index 616b9f5..bf404e6 100644 --- a/lib/watchconnector.h +++ b/lib/watchconnector.h @@ -31,6 +31,7 @@ #define WATCHCONNECTOR_H #include <QObject> +#include <QPointer> #include <QStringList> #include <QBluetoothDeviceInfo> #include <QBluetoothSocket> @@ -45,7 +46,7 @@ class WatchConnector : public QObject { Q_OBJECT Q_PROPERTY(QString name READ name NOTIFY nameChanged) - Q_PROPERTY(QString isConnected READ isConnected NOTIFY connectedChanged) + Q_PROPERTY(QString connected READ isConnected NOTIFY connectedChanged) public: enum { watchTIME = 11, @@ -109,17 +110,18 @@ public slots: void startPhoneCall(unsigned int cookie=0); void endPhoneCall(unsigned int cookie=0); - void deviceConnect(const QString name, const QString address); + void deviceConnect(const QString &name, const QString &address); void deviceDiscovered(const QBluetoothDeviceInfo&); - void handleWatch(const QBluetoothDeviceInfo&); - void readSocket(); - void connected(); - void disconnected(); + void handleWatch(const QString &name, const QString &address); + void onReadSocket(); + void onConnected(); + void onDisconnected(); void reconnect(); private: void decodeMsg(QByteArray data); - QBluetoothSocket *socket; + + QPointer<QBluetoothSocket> socket; bool is_connected; QString _last_name; QString _last_address; |
