summaryrefslogtreecommitdiff
path: root/rockworkd/libpebble/watchconnection.h
diff options
context:
space:
mode:
Diffstat (limited to 'rockworkd/libpebble/watchconnection.h')
-rw-r--r--rockworkd/libpebble/watchconnection.h154
1 files changed, 154 insertions, 0 deletions
diff --git a/rockworkd/libpebble/watchconnection.h b/rockworkd/libpebble/watchconnection.h
new file mode 100644
index 0000000..f2c3d5f
--- /dev/null
+++ b/rockworkd/libpebble/watchconnection.h
@@ -0,0 +1,154 @@
+#ifndef WATCHCONNECTION_H
+#define WATCHCONNECTION_H
+
+#include <QObject>
+#include <QBluetoothAddress>
+#include <QBluetoothSocket>
+#include <QBluetoothLocalDevice>
+#include <QtEndian>
+#include <QPointer>
+#include <QTimer>
+#include <QFile>
+
+class EndpointHandlerInterface;
+class UploadManager;
+
+class PebblePacket {
+public:
+ PebblePacket() {}
+ virtual ~PebblePacket() = default;
+ virtual QByteArray serialize() const = 0;
+ QByteArray packString(const QString &string) const {
+ QByteArray tmp = string.left(0xEF).toUtf8();
+ QByteArray ret;
+ ret.append((tmp.length() + 1) & 0xFF);
+ ret.append(tmp);
+ ret.append('\0');
+ return ret;
+ }
+};
+
+class Callback
+{
+public:
+ QPointer<QObject> obj;
+ QString method;
+};
+
+class WatchConnection : public QObject
+{
+ Q_OBJECT
+public:
+
+ enum Endpoint {
+ EndpointUnknownEndpoint = 0,
+ EndpointTime = 11,
+ EndpointVersion = 16,
+ EndpointPhoneVersion = 17,
+ EndpointSystemMessage = 18,
+ EndpointMusicControl = 32,
+ EndpointPhoneControl = 33,
+ EndpointApplicationMessage = 48,
+ EndpointLauncher = 49,
+ EndpointAppLaunch = 52,
+ EndpointWatchLogs = 2000,
+// EndpointWatchPing = 2001,
+ EndpointLogDump = 2002,
+// EndpointWatchReset = 2003,
+// EndpointWatchApp = 2004,
+// EndpointAppLogs = 2006,
+ EndpointNotification = 3000,
+// watchEXTENSIBLE_NOTIFS = 3010, // Deprecated in 3.x
+// watchRESOURCE = 4000,
+ EndpointFactorySettings = 5001,
+ EndpointAppManager = 6000, // Deprecated in 3.x
+ EndpointAppFetch = 6001, // New in 3.x
+ EndpointDataLogging = 6778,
+ EndpointScreenshot = 8000,
+// watchFILE_MANAGER = 8181,
+// watchCORE_DUMP = 9000,
+// watchAUDIO = 10000, // New in 3.x
+ EndpointActionHandler = 11440,
+ EndpointBlobDB = 45531, // New in 3.x
+ EndpointSorting = 0xabcd,
+ EndpointPutBytes = 0xbeef
+ };
+
+ enum SystemMessage {
+ SystemMessageFirmwareAvailable = 0,
+ SystemMessageFirmwareStart = 1,
+ SystemMessageFirmwareComplete = 2,
+ SystemMessageFirmwareFail = 3,
+ SystemMessageFirmwareUpToDate = 4,
+ SystemMessageFirmwareOutOfDate = 5,
+ SystemMessageBluetoothStartDiscoverable = 6,
+ SystemMessageBluetoothEndDiscoverable = 7
+ };
+
+ typedef QMap<int, QVariant> Dict;
+ enum DictItemType {
+ DictItemTypeBytes,
+ DictItemTypeString,
+ DictItemTypeUInt,
+ DictItemTypeInt
+ };
+
+ enum UploadType {
+ UploadTypeFirmware = 1,
+ UploadTypeRecovery = 2,
+ UploadTypeSystemResources = 3,
+ UploadTypeResources = 4,
+ UploadTypeBinary = 5,
+ UploadTypeFile = 6,
+ UploadTypeWorker = 7
+ };
+ enum UploadStatus {
+ UploadStatusProgress,
+ UploadStatusFailed,
+ UploadStatusSuccess
+ };
+
+ explicit WatchConnection(QObject *parent = 0);
+ UploadManager *uploadManager() const;
+
+ void connectPebble(const QBluetoothAddress &pebble);
+ bool isConnected();
+
+ QByteArray buildData(QStringList data);
+ QByteArray buildMessageData(uint lead, QStringList data);
+
+ void writeToPebble(Endpoint endpoint, const QByteArray &data);
+ void systemMessage(SystemMessage msg);
+
+ bool registerEndpointHandler(Endpoint endpoint, QObject *handler, const QString &method);
+
+signals:
+ void watchConnected();
+ void watchDisconnected();
+ void watchConnectionFailed();
+
+private:
+ void scheduleReconnect();
+ void reconnect();
+
+private slots:
+ void hostModeStateChanged(QBluetoothLocalDevice::HostMode state);
+ void pebbleConnected();
+ void pebbleDisconnected();
+ void socketError(QBluetoothSocket::SocketError error);
+ void readyRead();
+// void logData(const QByteArray &data);
+
+
+private:
+ QBluetoothAddress m_pebbleAddress;
+ QBluetoothLocalDevice *m_localDevice;
+ QBluetoothSocket *m_socket = nullptr;
+ int m_connectionAttempts = 0;
+ QTimer m_reconnectTimer;
+
+ UploadManager *m_uploadManager;
+ QHash<Endpoint, Callback> m_endpointHandlers;
+};
+
+#endif // WATCHCONNECTION_H