-
Notifications
You must be signed in to change notification settings - Fork 216
/
Copy pathATT.h
147 lines (116 loc) · 6.38 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
141
142
143
144
145
146
147
/*
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
#if defined(ARDUINO_PORTENTA_H7_M4) || defined(ARDUINO_PORTENTA_H7_M7)
#define ATT_MAX_PEERS 7
#elif 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();
virtual void setMaxMtu(uint16_t maxMtu);
virtual void setTimeout(unsigned long timeout);
virtual bool connect(uint8_t peerBdaddrType, uint8_t peerBdaddr[6]);
virtual bool disconnect(uint8_t peerBdaddrType, uint8_t peerBdaddr[6]);
virtual bool discoverAttributes(uint8_t peerBdaddrType, uint8_t peerBdaddr[6], const char* serviceUuidFilter);
virtual 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);
virtual void handleData(uint16_t connectionHandle, uint8_t dlen, uint8_t data[]);
virtual void removeConnection(uint16_t handle, uint8_t reason);
virtual uint16_t connectionHandle(uint8_t addressType, const uint8_t address[6]) const;
virtual BLERemoteDevice* device(uint8_t addressType, const uint8_t address[6]) const;
virtual bool connected() const;
virtual bool connected(uint8_t addressType, const uint8_t address[6]) const;
virtual bool connected(uint16_t handle) const;
virtual uint16_t mtu(uint16_t handle) const;
virtual bool disconnect();
virtual BLEDevice central();
virtual BLEDevice central(int index);
virtual int centralCount();
virtual BLEDevice peripheral();
virtual BLEDevice peripheral(int index);
virtual int peripheralCount();
virtual bool handleNotify(uint16_t handle, const uint8_t* value, int length);
virtual bool handleInd(uint16_t handle, const uint8_t* value, int length);
virtual void setEventHandler(BLEDeviceEvent event, BLEDeviceEventHandler eventHandler);
virtual int readReq(uint16_t connectionHandle, uint16_t handle, uint8_t responseBuffer[]);
virtual int writeReq(uint16_t connectionHandle, uint16_t handle, const uint8_t* data, uint8_t dataLen, uint8_t responseBuffer[]);
virtual void writeCmd(uint16_t connectionHandle, uint16_t handle, const uint8_t* data, uint8_t dataLen);
private:
virtual void error(uint16_t connectionHandle, uint8_t dlen, uint8_t data[]);
virtual void mtuReq(uint16_t connectionHandle, uint8_t dlen, uint8_t data[]);
virtual int mtuReq(uint16_t connectionHandle, uint16_t mtu, uint8_t responseBuffer[]);
virtual void mtuResp(uint16_t connectionHandle, uint8_t dlen, uint8_t data[]);
virtual void findInfoReq(uint16_t connectionHandle, uint16_t mtu, uint8_t dlen, uint8_t data[]);
virtual int findInfoReq(uint16_t connectionHandle, uint16_t startHandle, uint16_t endHandle, uint8_t responseBuffer[]);
virtual void findInfoResp(uint16_t connectionHandle, uint8_t dlen, uint8_t data[]);
virtual void findByTypeReq(uint16_t connectionHandle, uint16_t mtu, uint8_t dlen, uint8_t data[]);
virtual void readByTypeReq(uint16_t connectionHandle, uint16_t mtu, uint8_t dlen, uint8_t data[]);
virtual int readByTypeReq(uint16_t connectionHandle, uint16_t startHandle, uint16_t endHandle, uint16_t type, uint8_t responseBuffer[]);
virtual void readByTypeResp(uint16_t connectionHandle, uint8_t dlen, uint8_t data[]);
virtual void readOrReadBlobReq(uint16_t connectionHandle, uint16_t mtu, uint8_t opcode, uint8_t dlen, uint8_t data[]);
virtual void readResp(uint16_t connectionHandle, uint8_t dlen, uint8_t data[]);
virtual void readByGroupReq(uint16_t connectionHandle, uint16_t mtu, uint8_t dlen, uint8_t data[]);
virtual int readByGroupReq(uint16_t connectionHandle, uint16_t startHandle, uint16_t endHandle, uint16_t uuid, uint8_t responseBuffer[]);
virtual void readByGroupResp(uint16_t connectionHandle, uint8_t dlen, uint8_t data[]);
virtual void writeReqOrCmd(uint16_t connectionHandle, uint16_t mtu, uint8_t op, uint8_t dlen, uint8_t data[]);
virtual void writeResp(uint16_t connectionHandle, uint8_t dlen, uint8_t data[]);
virtual void prepWriteReq(uint16_t connectionHandle, uint16_t mtu, uint8_t dlen, uint8_t data[]);
virtual void execWriteReq(uint16_t connectionHandle, uint16_t mtu, uint8_t dlen, uint8_t data[]);
virtual void handleNotifyOrInd(uint16_t connectionHandle, uint8_t opcode, uint8_t dlen, uint8_t data[]);
virtual void handleCnf(uint16_t connectionHandle, uint8_t dlen, uint8_t data[]);
virtual void sendError(uint16_t connectionHandle, uint8_t opcode, uint16_t handle, uint8_t code);
virtual bool exchangeMtu(uint16_t connectionHandle);
virtual bool discoverServices(uint16_t connectionHandle, BLERemoteDevice* device, const char* serviceUuidFilter);
virtual bool discoverCharacteristics(uint16_t connectionHandle, BLERemoteDevice* device);
virtual bool discoverDescriptors(uint16_t connectionHandle, BLERemoteDevice* device);
virtual 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