summaryrefslogtreecommitdiff
path: root/libsowatch/metawatch.h
diff options
context:
space:
mode:
Diffstat (limited to 'libsowatch/metawatch.h')
-rw-r--r--libsowatch/metawatch.h122
1 files changed, 122 insertions, 0 deletions
diff --git a/libsowatch/metawatch.h b/libsowatch/metawatch.h
new file mode 100644
index 0000000..80a1894
--- /dev/null
+++ b/libsowatch/metawatch.h
@@ -0,0 +1,122 @@
+#ifndef METAWATCH_H
+#define METAWATCH_H
+
+#include <QtConnectivity/QBluetoothAddress>
+#include <QtConnectivity/QBluetoothSocket>
+#include <QtCore/QQueue>
+#include <QtCore/QTimer>
+#include "watch.h"
+
+using QTM_PREPEND_NAMESPACE(QBluetoothSocket);
+using QTM_PREPEND_NAMESPACE(QBluetoothAddress);
+
+namespace sowatch
+{
+
+class MetaWatch : public Watch
+{
+ Q_OBJECT
+ Q_ENUMS(MessageType Mode)
+
+public:
+ explicit MetaWatch(const QBluetoothAddress& address, QObject *parent = 0);
+
+ QPaintEngine* paintEngine() const;
+
+ QString model() const;
+ bool isConnected() const;
+ bool busy() const;
+ void update(const QList<QRect>& rects);
+ void clear(bool white = false);
+ void vibrate(bool on);
+
+ void setDateTime(const QDateTime& dateTime);
+
+ enum MessageType {
+ NoMessage = 0,
+ GetDeviceType = 0x01,
+ GetDeviceTypeResponse = 0x02,
+ GetInformationString = 0x03,
+ GetInformationStringResponse = 0x04,
+ AdvanceWatchHands = 0x20,
+ SetVibrateMode = 0x23,
+ SetRealTimeClock = 0x26,
+ GetRealTimeClock = 0x27,
+ GetRealTimeClockResponse = 0x28,
+ StatusChangeEvent = 0x33,
+ ButtonEvent = 0x34,
+ WriteBuffer = 0x40,
+ ConfigureMode = 0x41,
+ ConfigureIdleBufferSize = 0x42,
+ UpdateDisplay = 0x43,
+ LoadTemplate = 0x44,
+ EnableButton = 0x46,
+ DisableButton = 0x47,
+ ReadButtonConfiguration = 0x48,
+ ReadButtonConfigurationResponse = 0x49,
+ BatteryConfiguration = 0x53,
+ LowBatteryWarning = 0x54,
+ LowBatteryBluetoothOff = 0x55,
+ ReadBatteryVoltage = 0x56,
+ ReadBatteryVoltageResponse = 0x57,
+ Accelerometer = 0xea
+ };
+
+ enum Mode {
+ IdleMode = 0,
+ ApplicationMode = 1
+ };
+
+protected:
+ QBluetoothSocket* _socket;
+
+ struct Message {
+ MessageType type;
+ quint8 options;
+ QByteArray data;
+ Message(MessageType ntype = NoMessage, QByteArray ndata = QByteArray(), quint8 noptions = 0) :
+ type(ntype), options(noptions), data(ndata)
+ {
+
+ }
+ };
+
+ QQueue<Message> _toSend;
+ QTimer* _sendTimer;
+ Message _partialReceived;
+
+ quint8 _buttonState;
+
+ static const quint8 bitRevTable[16];
+ static const quint16 crcTable[256];
+ quint16 calcCrc(const QByteArray& data, int size);
+ quint16 calcCrc(const Message& msg);
+
+ void send(const Message& msg);
+ void handleMessage(const Message& msg);
+
+ void updateLine(Mode mode, const QImage& image, int line);
+ void updateLines(Mode mode, const QImage& image, int lineA, int lineB);
+ void updateLines(Mode mode, const QImage& image, const QVector<bool>& lines);
+ void configureWatchMode(Mode mode, int timeout = 10, bool invert = false);
+ void updateDisplay(Mode mode, bool copy = true);
+ void loadTemplate(Mode mode, int templ);
+
+ void handleStatusChange(const Message& msg);
+ void handleButtonEvent(const Message& msg);
+
+protected slots:
+ void socketConnected();
+ void socketDisconnected();
+ void socketData();
+ void socketError(QBluetoothSocket::SocketError error);
+ void socketState(QBluetoothSocket::SocketState error);
+ void timedSend();
+
+private:
+ void realSend(const Message& msg);
+};
+
+}
+
+#endif // METAWATCH_H