From b3f9fcecdcf5f73ac902d76b95739b76e6bfcba1 Mon Sep 17 00:00:00 2001 From: Andrew Branson Date: Wed, 10 Feb 2016 00:15:20 +0100 Subject: V3 firmware support improvements Proper timeline notifications for the v3 firmware. Added telegram, whatapp and hangouts notification types. Removed mitakuuluu. --- daemon/watchconnector.h | 610 +++++++++++++++++++++++++----------------------- 1 file changed, 316 insertions(+), 294 deletions(-) (limited to 'daemon/watchconnector.h') diff --git a/daemon/watchconnector.h b/daemon/watchconnector.h index 83e065c..de2ce1a 100644 --- a/daemon/watchconnector.h +++ b/daemon/watchconnector.h @@ -1,294 +1,316 @@ -#ifndef WATCHCONNECTOR_H -#define WATCHCONNECTOR_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -class WatchConnector : public QObject -{ - Q_OBJECT - QLoggingCategory l; - - Q_ENUMS(Endpoint) - - Q_PROPERTY(QString name READ name NOTIFY pebbleChanged) - Q_PROPERTY(QString connected READ isConnected NOTIFY connectedChanged) - -public: - enum Endpoint { - watchTIME = 11, - watchVERSION = 16, - watchPHONE_VERSION = 17, - watchSYSTEM_MESSAGE = 18, - watchMUSIC_CONTROL = 32, - watchPHONE_CONTROL = 33, - watchAPPLICATION_MESSAGE = 48, - watchLAUNCHER = 49, - watchLOGS = 2000, - watchPING = 2001, - watchLOG_DUMP = 2002, - watchRESET = 2003, - watchAPP = 2004, - watchAPP_LOGS = 2006, - watchNOTIFICATION = 3000, - watchEXTENSIBLE_NOTIFS = 3010, // Deprecated in 3.x - watchRESOURCE = 4000, - watchFACTORY_SETTINGS = 5001, - watchAPP_MANAGER = 6000, // Deprecated in 3.x - watchAPP_FETCH = 6001, // New in 3.x - watchDATA_LOGGING = 6778, - watchSCREENSHOT = 8000, - watchFILE_MANAGER = 8181, - watchCORE_DUMP = 9000, - watchAUDIO = 10000, // New in 3.x - watchBLOB_DB = 45531, // New in 3.x - watchPUTBYTES = 48879 - }; - enum { - callANSWER = 1, - callHANGUP = 2, - callGET_STATE = 3, - callINCOMING = 4, - callOUTGOING = 5, - callMISSED = 6, - callRING = 7, - callSTART = 8, - callEND = 9 - }; - enum MusicControl { - musicPLAY_PAUSE = 1, - musicPAUSE = 2, - musicPLAY = 3, - musicNEXT = 4, - musicPREVIOUS = 5, - musicVOLUME_UP = 6, - musicVOLUME_DOWN = 7, - musicGET_NOW_PLAYING = 8, - musicSEND_NOW_PLAYING = 9 - }; - enum SystemMessage { - systemFIRMWARE_AVAILABLE = 0, - systemFIRMWARE_START = 1, - systemFIRMWARE_COMPLETE = 2, - systemFIRMWARE_FAIL = 3, - systemFIRMWARE_UP_TO_DATE = 4, - systemFIRMWARE_OUT_OF_DATE = 5, - systemBLUETOOTH_START_DISCOVERABLE = 6, - systemBLUETOOTH_END_DISCOVERABLE = 7 - }; - enum AppManager { - appmgrGET_APPBANK_STATUS = 1, - appmgrREMOVE_APP = 2, - appmgrREFRESH_APP = 3, - appmgrGET_APPBANK_UUIDS = 5 - }; - enum AppMessage { - appmsgPUSH = 1, - appmsgREQUEST = 2, - appmsgACK = 0xFF, - appmsgNACK = 0x7F - }; - enum DataLogMessage { - datalogOPEN = 1, - datalogDATA = 2, - datalogCLOSE = 3, - datalogTIMEOUT = 7 - }; - enum { - launcherSTARTED = 1, - launcherSTOPPED = 0 - }; - enum { - leadEMAIL = 0, - leadSMS = 1, - leadFACEBOOK = 2, - leadTWITTER = 3, - leadNOW_PLAYING_DATA = 16 - }; - enum { - sessionCapGAMMA_RAY = 0x80000000 - }; - enum { - remoteCapTELEPHONY = 16, - remoteCapSMS = 32, - remoteCapGPS = 64, - remoteCapBTLE = 128, - remoteCapCAMERA_REAR = 256, - remoteCapACCEL = 512, - remoteCapGYRO = 1024, - remoteCapCOMPASS = 2048 - }; - enum { - osUNKNOWN = 0, - osIOS = 1, - osANDROID = 2, - osOSX = 3, - osLINUX = 4, - osWINDOWS = 5 - }; - enum UploadType { - uploadFIRMWARE = 1, - uploadRECOVERY = 2, - uploadSYS_RESOURCES = 3, - uploadRESOURCES = 4, - uploadBINARY = 5, - uploadFILE = 6, - uploadWORKER = 7 - }; - enum PutBytesCommand { - putbytesINIT = 1, - putbytesSEND = 2, - putbytesCOMMIT = 3, - putbytesABORT = 4, - putbytesCOMPLETE = 5 - }; - - enum HardwareRevision { - HR_UNKNOWN = 0, - TINTIN_EV1 = 1, - TINTIN_EV2 = 2, - TINTIN_EV2_3 = 3, - TINTIN_EV2_4 = 4, - TINTIN_V1_5 = 5, - BIANCA = 6, - SNOWY_EVT2 = 7, - SNOWY_DVT = 8, - SPALDING_EVT = 9, - BOBBY_SMILES = 10, - SPALDING = 11, - - TINTIN_BB = 0xFF, - TINTIN_BB2 = 0xFE, - SNOWY_BB = 0xFD, - SNOWY_BB2 = 0xFC, - SPALDING_BB2 = 0xFB - }; - enum HardwarePlatform { - HP_UNKNOWN = 0, - APLITE, - BASALT, - CHALK - }; - typedef QPair HWMap; - QMap hardwareMapping; - - struct SoftwareVersion { - QDateTime build; - QString version; - QString commit; - bool is_recovery; - HardwareRevision hw_revision; - QString hw_string; - quint8 metadata_version; - - QVariantMap toMap() const; - }; - - struct WatchVersions { - SoftwareVersion main; - SoftwareVersion safe; - QDateTime bootLoaderBuild; - QString hardwareRevision; - QString hardwarePlatform; - QString serialNumber; - QByteArray address; - - QVariantMap toMap() const; - void clear(); - bool isEmpty() const; - }; - - typedef QMap Dict; - enum DictItemType { - typeBYTES, - typeSTRING, - typeUINT, - typeINT - }; - - typedef std::function EndpointHandlerFunc; - - explicit WatchConnector(QObject *parent = 0); - virtual ~WatchConnector(); - - inline bool isConnected() const { return is_connected; } - inline QString name() const { return pebbles.keys(address()).at(0); } - inline QBluetoothAddress address() const { return socket != nullptr ? socket->peerAddress() : QBluetoothAddress(); } - inline WatchVersions versions() const { return _versions; } - - void setEndpointHandler(uint endpoint, const EndpointHandlerFunc &func); - void clearEndpointHandler(uint endpoint); - - static QString timeStamp(); - static QString decodeEndpoint(uint val); - -signals: - void pebbleChanged(); - void versionsChanged(); - void connectedChanged(); - -public slots: - bool findPebbles(); - void scheduleReconnect(); - void connect(); - void disconnect(); - - void sendMessage(uint endpoint, const QByteArray &data, const EndpointHandlerFunc &callback = EndpointHandlerFunc()); - void ping(uint cookie); - void systemMessage(SystemMessage msg, const EndpointHandlerFunc &callback = EndpointHandlerFunc()); - void time(); - - void sendNotification(uint lead, QString sender, QString data, QString subject); - void sendSMSNotification(QString sender, QString data); - void sendEmailNotification(QString sender, QString data, QString subject); - void sendFacebookNotification(QString sender, QString data); - void sendTwitterNotification(QString sender, QString data); - void sendMusicNowPlaying(QString artist, QString album, QString track); - void sendPhoneVersion(); - void sendFirmwareState(bool ok); - - void buildData(QByteArray &res, QStringList data); - QByteArray buildMessageData(uint lead, QStringList data); - - void phoneControl(char act, uint cookie, QStringList datas); - void ring(QString number, QString name, bool incoming=true, uint cookie=0); - void startPhoneCall(uint cookie=0); - void endPhoneCall(uint cookie=0); - -private slots: - void onReadSocket(); - void onBytesWritten(qint64); - void onConnected(); - void onDisconnected(); - void onError(QBluetoothSocket::SocketError error); - -private: - void sendData(const QByteArray &data); - bool dispatchMessage(uint endpoint, const QByteArray &data); - - QPointer socket; - QHash> tmpHandlers; - QHash handlers; - bool is_connected; - QByteArray writeData; - QTimer reconnectTimer; - QTimer timeSyncTimer; - QMap pebbles; - int currentPebble; - quint64 _last_address; - WatchVersions _versions; - HardwarePlatform platform; -}; - -QDebug operator<< (QDebug d, const WatchConnector::SoftwareVersion &ver); -QDebug operator<< (QDebug d, const WatchConnector::WatchVersions &ver); - -#endif // WATCHCONNECTOR_H +#ifndef WATCHCONNECTOR_H +#define WATCHCONNECTOR_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +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 WatchConnector : public QObject +{ + Q_OBJECT + QLoggingCategory l; + + Q_ENUMS(Endpoint) + + Q_PROPERTY(QString name READ name NOTIFY pebbleChanged) + Q_PROPERTY(QString connected READ isConnected NOTIFY connectedChanged) + +public: + enum Endpoint { + watchTIME = 11, + watchVERSION = 16, + watchPHONE_VERSION = 17, + watchSYSTEM_MESSAGE = 18, + watchMUSIC_CONTROL = 32, + watchPHONE_CONTROL = 33, + watchAPPLICATION_MESSAGE = 48, + watchLAUNCHER = 49, + watchLOGS = 2000, + watchPING = 2001, + watchLOG_DUMP = 2002, + watchRESET = 2003, + watchAPP = 2004, + watchAPP_LOGS = 2006, + watchNOTIFICATION = 3000, + watchEXTENSIBLE_NOTIFS = 3010, // Deprecated in 3.x + watchRESOURCE = 4000, + watchFACTORY_SETTINGS = 5001, + watchAPP_MANAGER = 6000, // Deprecated in 3.x + watchAPP_FETCH = 6001, // New in 3.x + watchDATA_LOGGING = 6778, + watchSCREENSHOT = 8000, + watchFILE_MANAGER = 8181, + watchCORE_DUMP = 9000, + watchAUDIO = 10000, // New in 3.x + watchBLOB_DB = 45531, // New in 3.x + watchPUTBYTES = 48879 + }; + enum { + callANSWER = 1, + callHANGUP = 2, + callGET_STATE = 3, + callINCOMING = 4, + callOUTGOING = 5, + callMISSED = 6, + callRING = 7, + callSTART = 8, + callEND = 9 + }; + enum MusicControl { + musicPLAY_PAUSE = 1, + musicPAUSE = 2, + musicPLAY = 3, + musicNEXT = 4, + musicPREVIOUS = 5, + musicVOLUME_UP = 6, + musicVOLUME_DOWN = 7, + musicGET_NOW_PLAYING = 8, + musicSEND_NOW_PLAYING = 9 + }; + enum SystemMessage { + systemFIRMWARE_AVAILABLE = 0, + systemFIRMWARE_START = 1, + systemFIRMWARE_COMPLETE = 2, + systemFIRMWARE_FAIL = 3, + systemFIRMWARE_UP_TO_DATE = 4, + systemFIRMWARE_OUT_OF_DATE = 5, + systemBLUETOOTH_START_DISCOVERABLE = 6, + systemBLUETOOTH_END_DISCOVERABLE = 7 + }; + enum AppManager { + appmgrGET_APPBANK_STATUS = 1, + appmgrREMOVE_APP = 2, + appmgrREFRESH_APP = 3, + appmgrGET_APPBANK_UUIDS = 5 + }; + enum AppMessage { + appmsgPUSH = 1, + appmsgREQUEST = 2, + appmsgACK = 0xFF, + appmsgNACK = 0x7F + }; + enum DataLogMessage { + datalogOPEN = 1, + datalogDATA = 2, + datalogCLOSE = 3, + datalogTIMEOUT = 7 + }; + enum { + launcherSTARTED = 1, + launcherSTOPPED = 0 + }; + enum { + leadEMAIL = 0, + leadSMS = 1, + leadFACEBOOK = 2, + leadTWITTER = 3, + leadTELEGRAM = 4, + leadHANGOUTS = 5, + leadWHATSAPP = 6, + leadMISSEDCALL = 7, + leadNOW_PLAYING_DATA = 16 + }; + enum { + sessionCapGAMMA_RAY = 0x80000000 + }; + enum { + remoteCapTELEPHONY = 16, + remoteCapSMS = 32, + remoteCapGPS = 64, + remoteCapBTLE = 128, + remoteCapCAMERA_REAR = 256, + remoteCapACCEL = 512, + remoteCapGYRO = 1024, + remoteCapCOMPASS = 2048 + }; + enum { + osUNKNOWN = 0, + osIOS = 1, + osANDROID = 2, + osOSX = 3, + osLINUX = 4, + osWINDOWS = 5 + }; + enum UploadType { + uploadFIRMWARE = 1, + uploadRECOVERY = 2, + uploadSYS_RESOURCES = 3, + uploadRESOURCES = 4, + uploadBINARY = 5, + uploadFILE = 6, + uploadWORKER = 7 + }; + enum PutBytesCommand { + putbytesINIT = 1, + putbytesSEND = 2, + putbytesCOMMIT = 3, + putbytesABORT = 4, + putbytesCOMPLETE = 5 + }; + + enum HardwareRevision { + HR_UNKNOWN = 0, + TINTIN_EV1 = 1, + TINTIN_EV2 = 2, + TINTIN_EV2_3 = 3, + TINTIN_EV2_4 = 4, + TINTIN_V1_5 = 5, + BIANCA = 6, + SNOWY_EVT2 = 7, + SNOWY_DVT = 8, + SPALDING_EVT = 9, + BOBBY_SMILES = 10, + SPALDING = 11, + + TINTIN_BB = 0xFF, + TINTIN_BB2 = 0xFE, + SNOWY_BB = 0xFD, + SNOWY_BB2 = 0xFC, + SPALDING_BB2 = 0xFB + }; + enum HardwarePlatform { + HP_UNKNOWN = 0, + APLITE, + BASALT, + CHALK + }; + typedef QPair HWMap; + QMap hardwareMapping; + + struct SoftwareVersion { + QDateTime build; + QString version; + QString commit; + bool is_recovery; + HardwareRevision hw_revision; + QString hw_string; + quint8 metadata_version; + + QVariantMap toMap() const; + }; + + struct WatchVersions { + SoftwareVersion main; + SoftwareVersion safe; + QDateTime bootLoaderBuild; + QString hardwareRevision; + QString hardwarePlatform; + QString serialNumber; + QByteArray address; + + QVariantMap toMap() const; + void clear(); + bool isEmpty() const; + }; + + typedef QMap Dict; + enum DictItemType { + typeBYTES, + typeSTRING, + typeUINT, + typeINT + }; + + typedef std::function EndpointHandlerFunc; + + explicit WatchConnector(QObject *parent = 0); + virtual ~WatchConnector(); + + inline bool isConnected() const { return is_connected; } + inline QString name() const { return pebbles.keys(address()).at(0); } + inline QBluetoothAddress address() const { return socket != nullptr ? socket->peerAddress() : QBluetoothAddress(); } + inline WatchVersions versions() const { return _versions; } + + void setEndpointHandler(uint endpoint, const EndpointHandlerFunc &func); + void clearEndpointHandler(uint endpoint); + + static QString timeStamp(); + static QString decodeEndpoint(uint val); + +signals: + void pebbleChanged(); + void versionsChanged(); + void connectedChanged(); + +public slots: + bool findPebbles(); + void scheduleReconnect(); + void connect(); + void disconnect(); + + void sendMessage(uint endpoint, const QByteArray &data, const EndpointHandlerFunc &callback = EndpointHandlerFunc()); + void ping(uint cookie); + void systemMessage(SystemMessage msg, const EndpointHandlerFunc &callback = EndpointHandlerFunc()); + void time(); + + void sendNotification(uint lead, QString sender, QString data, QString subject); + void sendSMSNotification(QString sender, QString data); + void sendEmailNotification(QString sender, QString data, QString subject); + void sendFacebookNotification(QString sender, QString data); + void sendTwitterNotification(QString sender, QString data); + void sendTelegramNotification(QString sender, QString data); + void sendHangoutsNotification(QString sender, QString data); + void sendWhatsappNotification(QString sender, QString data); + void sendMusicNowPlaying(QString artist, QString album, QString track); + void sendPhoneVersion(); + void sendFirmwareState(bool ok); + + void buildData(QByteArray &res, QStringList data); + QByteArray buildMessageData(uint lead, QStringList data); + + void phoneControl(char act, uint cookie, QStringList datas); + void ring(QString number, QString name, bool incoming=true, uint cookie=0); + void startPhoneCall(uint cookie=0); + void endPhoneCall(uint cookie=0); + +private slots: + void onReadSocket(); + void onBytesWritten(qint64); + void onConnected(); + void onDisconnected(); + void onError(QBluetoothSocket::SocketError error); + +private: + void sendData(const QByteArray &data); + bool dispatchMessage(uint endpoint, const QByteArray &data); + + QPointer socket; + QHash> tmpHandlers; + QHash handlers; + bool is_connected; + QByteArray writeData; + QTimer reconnectTimer; + QTimer timeSyncTimer; + QMap pebbles; + int currentPebble; + quint64 _last_address; + WatchVersions _versions; + HardwarePlatform platform; +}; + +QDebug operator<< (QDebug d, const WatchConnector::SoftwareVersion &ver); +QDebug operator<< (QDebug d, const WatchConnector::WatchVersions &ver); + +#endif // WATCHCONNECTOR_H -- cgit v1.2.3