forked from arduino-libraries/ArduinoBLE
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathATT.h
140 lines (109 loc) · 5.71 KB
/
ATT.h
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/*
This file is part of the ArduinoBLE library.
Copyright (c) 2018 Arduino SA. All rights reserved.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef _ATT_H_
#define _ATT_H_
#include <Arduino.h>
#include "BLEDevice.h"
#define ATT_CID 0x0004
#ifdef DM_CONN_MAX
#define ATT_MAX_PEERS DM_CONN_MAX // Mbed + Cordio
#else
#define ATT_MAX_PEERS 3
#endif
class BLERemoteDevice;
class ATTClass {
public:
ATTClass();
virtual ~ATTClass();
void setMaxMtu(uint16_t maxMtu);
void setTimeout(unsigned long timeout);
bool connect(uint8_t peerBdaddrType, uint8_t peerBdaddr[6]);
bool disconnect(uint8_t peerBdaddrType, uint8_t peerBdaddr[6]);
bool discoverAttributes(uint8_t peerBdaddrType, uint8_t peerBdaddr[6], const char* serviceUuidFilter);
void addConnection(uint16_t handle, uint8_t role, uint8_t peerBdaddrType,
uint8_t peerBdaddr[6], uint16_t interval,
uint16_t latency, uint16_t supervisionTimeout,
uint8_t masterClockAccuracy);
void handleData(uint16_t connectionHandle, uint8_t dlen, uint8_t data[]);
void removeConnection(uint16_t handle, uint8_t reason);
uint16_t connectionHandle(uint8_t addressType, const uint8_t address[6]) const;
BLERemoteDevice* device(uint8_t addressType, const uint8_t address[6]) const;
bool connected() const;
bool connected(uint8_t addressType, const uint8_t address[6]) const;
bool connected(uint16_t handle) const;
uint16_t mtu(uint16_t handle) const;
bool disconnect();
BLEDevice central();
bool handleNotify(uint16_t handle, const uint8_t* value, int length);
bool handleInd(uint16_t handle, const uint8_t* value, int length);
void setEventHandler(BLEDeviceEvent event, BLEDeviceEventHandler eventHandler);
int readReq(uint16_t connectionHandle, uint16_t handle, uint8_t responseBuffer[]);
int writeReq(uint16_t connectionHandle, uint16_t handle, const uint8_t* data, uint8_t dataLen, uint8_t responseBuffer[]);
void writeCmd(uint16_t connectionHandle, uint16_t handle, const uint8_t* data, uint8_t dataLen);
private:
void error(uint16_t connectionHandle, uint8_t dlen, uint8_t data[]);
void mtuReq(uint16_t connectionHandle, uint8_t dlen, uint8_t data[]);
int mtuReq(uint16_t connectionHandle, uint16_t mtu, uint8_t responseBuffer[]);
void mtuResp(uint16_t connectionHandle, uint8_t dlen, uint8_t data[]);
void findInfoReq(uint16_t connectionHandle, uint16_t mtu, uint8_t dlen, uint8_t data[]);
int findInfoReq(uint16_t connectionHandle, uint16_t startHandle, uint16_t endHandle, uint8_t responseBuffer[]);
void findInfoResp(uint16_t connectionHandle, uint8_t dlen, uint8_t data[]);
void findByTypeReq(uint16_t connectionHandle, uint16_t mtu, uint8_t dlen, uint8_t data[]);
void readByTypeReq(uint16_t connectionHandle, uint16_t mtu, uint8_t dlen, uint8_t data[]);
int readByTypeReq(uint16_t connectionHandle, uint16_t startHandle, uint16_t endHandle, uint16_t type, uint8_t responseBuffer[]);
void readByTypeResp(uint16_t connectionHandle, uint8_t dlen, uint8_t data[]);
void readOrReadBlobReq(uint16_t connectionHandle, uint16_t mtu, uint8_t opcode, uint8_t dlen, uint8_t data[]);
void readResp(uint16_t connectionHandle, uint8_t dlen, uint8_t data[]);
void readByGroupReq(uint16_t connectionHandle, uint16_t mtu, uint8_t dlen, uint8_t data[]);
int readByGroupReq(uint16_t connectionHandle, uint16_t startHandle, uint16_t endHandle, uint16_t uuid, uint8_t responseBuffer[]);
void readByGroupResp(uint16_t connectionHandle, uint8_t dlen, uint8_t data[]);
void writeReqOrCmd(uint16_t connectionHandle, uint16_t mtu, uint8_t op, uint8_t dlen, uint8_t data[]);
void writeResp(uint16_t connectionHandle, uint8_t dlen, uint8_t data[]);
void prepWriteReq(uint16_t connectionHandle, uint16_t mtu, uint8_t dlen, uint8_t data[]);
void execWriteReq(uint16_t connectionHandle, uint16_t mtu, uint8_t dlen, uint8_t data[]);
void handleNotifyOrInd(uint16_t connectionHandle, uint8_t opcode, uint8_t dlen, uint8_t data[]);
void handleCnf(uint16_t connectionHandle, uint8_t dlen, uint8_t data[]);
void sendError(uint16_t connectionHandle, uint8_t opcode, uint16_t handle, uint8_t code);
bool exchangeMtu(uint16_t connectionHandle);
bool discoverServices(uint16_t connectionHandle, BLERemoteDevice* device, const char* serviceUuidFilter);
bool discoverCharacteristics(uint16_t connectionHandle, BLERemoteDevice* device);
bool discoverDescriptors(uint16_t connectionHandle, BLERemoteDevice* device);
int sendReq(uint16_t connectionHandle, void* requestBuffer, int requestLength, uint8_t responseBuffer[]);
private:
uint16_t _maxMtu;
unsigned long _timeout;
struct {
uint16_t connectionHandle;
uint8_t role;
uint8_t addressType;
uint8_t address[6];
uint16_t mtu;
BLERemoteDevice* device;
} _peers[ATT_MAX_PEERS];
volatile bool _cnf;
uint16_t _longWriteHandle;
uint8_t* _longWriteValue;
uint16_t _longWriteValueLength;
struct {
uint16_t connectionHandle;
uint8_t op;
uint8_t* buffer;
uint8_t length;
} _pendingResp;
BLEDeviceEventHandler _eventHandlers[2];
};
extern ATTClass ATT;
#endif