summaryrefslogtreecommitdiff
path: root/gatoatt.h
blob: 27cea3e5234d937dba8cbdeb3e8c4c2efbbce7eb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#ifndef GATOATTSOCKET_H
#define GATOATTSOCKET_H

#include <QtCore/QObject>
#include <QtCore/QQueue>
#include "gatosocket.h"
#include "gatouuid.h"

class GatoAtt : public QObject
{
	Q_OBJECT

public:
	explicit GatoAtt(QObject *parent = 0);
	~GatoAtt();

	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);

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 // GATOATTSOCKET_H