summaryrefslogtreecommitdiff
path: root/gatoattclient.h
diff options
context:
space:
mode:
Diffstat (limited to 'gatoattclient.h')
-rw-r--r--gatoattclient.h98
1 files changed, 98 insertions, 0 deletions
diff --git a/gatoattclient.h b/gatoattclient.h
new file mode 100644
index 0000000..e373a27
--- /dev/null
+++ b/gatoattclient.h
@@ -0,0 +1,98 @@
+#ifndef GATOATTCLIENT_H
+#define GATOATTCLIENT_H
+
+#include <QtCore/QObject>
+#include <QtCore/QQueue>
+#include "gatosocket.h"
+#include "gatouuid.h"
+
+class GatoAttClient : public QObject
+{
+ Q_OBJECT
+
+public:
+ explicit GatoAttClient(QObject *parent = 0);
+ ~GatoAttClient();
+
+ GatoSocket::State state() const;
+
+ bool connectTo(const GatoAddress& addr);
+ void close();
+
+ struct InformationData
+ {
+ GatoHandle handle;
+ GatoUUID uuid;
+ };
+ struct HandleInformation
+ {
+ GatoHandle start;
+ GatoHandle end;
+ };
+ struct AttributeData
+ {
+ GatoHandle handle;
+ QByteArray value;
+ };
+ struct AttributeGroupData
+ {
+ GatoHandle start;
+ GatoHandle end;
+ QByteArray value;
+ };
+
+ uint request(int opcode, const QByteArray &data, QObject *receiver, const char *member);
+ uint requestExchangeMTU(quint8 client_mtu, QObject *receiver, const char *member);
+ uint requestFindInformation(GatoHandle start, GatoHandle end, QObject *receiver, const char *member);
+ uint requestFindByTypeValue(GatoHandle start, GatoHandle end, const GatoUUID &uuid, const QByteArray& value, QObject *receiver, const char *member);
+ uint requestReadByType(GatoHandle start, GatoHandle end, const GatoUUID &uuid, QObject *receiver, const char *member);
+ uint requestRead(GatoHandle handle, QObject *receiver, const char *member);
+ uint requestReadByGroupType(GatoHandle start, GatoHandle end, const GatoUUID &uuid, QObject *receiver, const char *member);
+ uint requestWrite(GatoHandle handle, const QByteArray &value, QObject *receiver, const char *member);
+ void cancelRequest(uint id);
+
+ void command(int opcode, const QByteArray &data);
+ void commandWrite(GatoHandle handle, const QByteArray &value);
+
+signals:
+ void connected();
+ void disconnected();
+
+ void attributeUpdated(GatoHandle handle, const QByteArray &value, bool confirmed);
+
+private:
+ struct Request
+ {
+ uint id;
+ quint8 opcode;
+ QByteArray pkt;
+ QObject *receiver;
+ QByteArray member;
+ };
+
+ void sendARequest();
+ bool handleEvent(const QByteArray &event);
+ bool handleResponse(const Request& req, const QByteArray &response);
+
+ void writeUuid16or128(QDataStream& s, const GatoUUID& uuid);
+
+ QList<InformationData> parseInformationData(const QByteArray &data);
+ QList<HandleInformation> parseHandleInformation(const QByteArray &data);
+ QList<AttributeData> parseAttributeData(const QByteArray &data);
+ QList<AttributeGroupData> parseAttributeGroupData(const QByteArray &data);
+
+private slots:
+ void handleSocketConnected();
+ void handleSocketDisconnected();
+ void handleSocketReadyRead();
+
+ void handleServerMTU(uint req, quint8 server_mtu);
+
+private:
+ GatoSocket *socket;
+ quint8 mtu;
+ uint next_id;
+ QQueue<Request> pending_requests;
+};
+
+#endif // GATOATTCLIENT_H