xref: /btstack/port/arduino/BTstack.h (revision 1fbe4564be530ba975f4cd70443a76f0afda5276)
1 /**
2  * Arduino Wrapper for BTstack
3  */
4 #ifndef __ARDUINO_BTSTACK_H
5 #define __ARDUINO_BTSTACK_H
6 
7 #if defined __cplusplus
8 extern "C" {
9 #endif
10 
11 #include "ble/att_db.h"
12 #include "btstack_util.h"
13 #include "ble/gatt_client.h"
14 #include "hci.h"
15 #include <stdint.h>
16 
17 typedef enum BLEStatus {
18 	BLE_STATUS_OK,
19 	BLE_STATUS_DONE,	// e.g. for service or characteristic discovery done
20 	BLE_STATUS_CONNECTION_TIMEOUT,
21 	BLE_STATUS_CONNECTION_ERROR,
22 	BLE_STATUS_OTHER_ERROR
23 } BLEStatus;
24 
25 typedef void (*btstack_packet_handler_t) (uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size);
26 
27 class UUID {
28 private:
29 	uint8_t uuid[16];
30 public:
31 	UUID();
32 	UUID(const uint8_t uuid[16]);
33 	UUID(const char * uuidStr);
34 	const char * getUuidString()    const;
35 	const char * getUuid128String() const;
36 	const uint8_t * getUuid(void)   const;
37 	bool matches(UUID *uuid)        const;
38 };
39 
40 typedef enum BD_ADDR_TYPE {
41 	PUBLIC_ADDRESS = 0,
42 	PRIVAT_ADDRESS
43 } BD_ADDR_TYPE;
44 
45 class BD_ADDR {
46 private:
47 	uint8_t address[6];
48 	BD_ADDR_TYPE address_type;
49 public:
50 	BD_ADDR();
51 	BD_ADDR(const char * address_string, BD_ADDR_TYPE address_type = PUBLIC_ADDRESS);
52 	BD_ADDR(const uint8_t address[6], BD_ADDR_TYPE address_type = PUBLIC_ADDRESS);
53 	const uint8_t * getAddress();
54 	const char * getAddressString();
55 	BD_ADDR_TYPE getAddressType();
56 };
57 
58 class BLEAdvertisement {
59 private:
60 	uint8_t advertising_event_type;
61 	uint8_t rssi;
62 	uint8_t data_length;
63 	uint8_t data[10 + LE_ADVERTISING_DATA_SIZE];
64 	BD_ADDR  bd_addr;
65 	UUID * iBeacon_UUID;
66 public:
67 	BLEAdvertisement(uint8_t * event_packet);
68 	~BLEAdvertisement();
69 	BD_ADDR * getBdAddr();
70 	BD_ADDR_TYPE getBdAddrType();
71 	int getRssi();
72 	bool containsService(UUID * service);
73 	bool nameHasPrefix(const char * namePrefix);
74 	const uint8_t * getAdvData();
75 	bool isIBeacon();
76 	const UUID * getIBeaconUUID();
77 	uint16_t     getIBeaconMajorID();
78 	uint16_t     getIBecaonMinorID();
79 	uint8_t      getiBeaconMeasuredPower();
80 };
81 
82 class BLECharacteristic {
83 private:
84 	gatt_client_characteristic_t characteristic;
85 	UUID uuid;
86 public:
87 	BLECharacteristic();
88 	BLECharacteristic(gatt_client_characteristic_t characteristic);
89 	const UUID * getUUID();
90 	bool matches(UUID * uuid);
91 	bool isValueHandle(uint16_t value_handle);
92 	const gatt_client_characteristic_t * getCharacteristic();
93 };
94 
95 class BLEService {
96 private:
97 	gatt_client_service_t service;
98 	UUID uuid;
99 public:
100 	BLEService();
101 	BLEService(gatt_client_service_t service);
102 	const UUID * getUUID();
103 	bool matches(UUID * uuid);
104 	const gatt_client_service_t * getService();
105 };
106 
107 class BLEDevice {
108 private:
109 	hci_con_handle_t handle;
110 public:
111 	BLEDevice();
112 	BLEDevice(hci_con_handle_t handle);
113 	hci_con_handle_t getHandle();
114 
115 	// discovery of services and characteristics
116 	int discoverGATTServices();
117 	int discoverCharacteristicsForService(BLEService * service);
118 
119 	// read/write
120 	int  readCharacteristic(BLECharacteristic * characteristic);
121 	int  writeCharacteristic(BLECharacteristic * characteristic, uint8_t * data, uint16_t size);
122 	int  writeCharacteristicWithoutResponse(BLECharacteristic * characteristic, uint8_t * data, uint16_t size);
123 
124 	// subscribe/unsubscribe
125 	int subscribeForNotifications(BLECharacteristic * characteristic);
126 	int unsubscribeFromNotifications(BLECharacteristic * characteristic);
127 	int subscribeForIndications(BLECharacteristic * characteristic);
128 	int unsubscribeFromIndications(BLECharacteristic * characteristic);
129 };
130 
131 class BTstackManager {
132 public:
133 	BTstackManager(void);
134 	void setup(void);
135 	void loop(void);
136 
137 	void setPublicBdAddr(bd_addr_t addr);
138 	void enablePacketLogger();
139 	void enableDebugLogger();
140 
141 	void setAdvData(uint16_t size, const uint8_t * data);
142 	void iBeaconConfigure(UUID * uuid, uint16_t major_id, uint16_t minor_id, uint8_t measured_power = 0xc6);
143 	void startAdvertising();
144 	void stopAdvertising();
145 
146 	void bleStartScanning();
147 	void bleStopScanning();
148 
149 	// connection management
150 	void bleConnect(BD_ADDR_TYPE address_type, const uint8_t address[6], int timeout_ms);
151 	void bleConnect(BD_ADDR_TYPE address_type, const char * address, int timeout_ms);
152 	void bleConnect(BD_ADDR * address, int timeout_ms);
153 	void bleConnect(BLEAdvertisement * advertisement, int timeout_ms);
154 	void bleDisconnect(BLEDevice * device);
155 
156 	// discovery of services and characteristics
157 	int discoverGATTServices(BLEDevice * device);
158 	int discoverCharacteristicsForService(BLEDevice * peripheral, BLEService * service);
159 
160 	// read/write
161 	int  readCharacteristic(BLEDevice * device, BLECharacteristic * characteristic);
162 	int  writeCharacteristic(BLEDevice * device, BLECharacteristic * characteristic, uint8_t * data, uint16_t size);
163 	int  writeCharacteristicWithoutResponse(BLEDevice * device, BLECharacteristic * characteristic, uint8_t * data, uint16_t size);
164 
165 	// subscribe/unsubscribe notification and indications
166 	int subscribeForNotifications(BLEDevice * device, BLECharacteristic * characteristic);
167 	int unsubscribeFromNotifications(BLEDevice * device, BLECharacteristic * characteristic);
168 	int subscribeForIndications(BLEDevice * device, BLECharacteristic * characteristic);
169 	int unsubscribeFromIndications(BLEDevice * device, BLECharacteristic * characteristic);
170 
171 	// Callbacks
172 	void setBLEAdvertisementCallback(void (*)(BLEAdvertisement * bleAdvertisement));
173 	void setBLEDeviceConnectedCallback(void (*)(BLEStatus status, BLEDevice * device));
174 	void setBLEDeviceDisconnectedCallback(void (*)(BLEDevice * device));
175 	void setGATTServiceDiscoveredCallback(void (*)(BLEStatus status, BLEDevice * device, BLEService * bleService));
176 	void setGATTCharacteristicDiscoveredCallback(void (*)(BLEStatus status, BLEDevice * device, BLECharacteristic * characteristic));
177 	void setGATTCharacteristicReadCallback(void (*)(BLEStatus status, BLEDevice * device, uint8_t * value, uint16_t length));
178 	void setGATTCharacteristicNotificationCallback(void (*)(BLEDevice * device, uint16_t value_handle, uint8_t* value, uint16_t length));
179 	void setGATTCharacteristicIndicationCallback(void (*)(BLEDevice * device, uint16_t value_handle, uint8_t* value, uint16_t length));
180 	void setGATTDoneCallback(void (*)(BLEStatus status, BLEDevice * device));
181 
182 	void setGATTCharacteristicWrittenCallback(void (*)(BLEStatus status, BLEDevice * device));
183 	void setGATTCharacteristicSubscribedCallback(void (*)(BLEStatus status, BLEDevice * device));
184 	void setGATTCharacteristicUnsubscribedCallback(void (*)(BLEStatus status, BLEDevice * device));
185 
186 	void setGATTCharacteristicRead(uint16_t (*)(uint16_t characteristic_id, uint8_t * buffer, uint16_t buffer_size));
187 	void setGATTCharacteristicWrite(int (*)(uint16_t characteristic_id, uint8_t *buffer, uint16_t buffer_size));
188 
189 	void addGATTService(UUID * uuid);
190  	uint16_t addGATTCharacteristic(UUID * uuid, uint16_t flags, const char * text);
191  	uint16_t addGATTCharacteristic(UUID * uuid, uint16_t flags, uint8_t * data, uint16_t data_len);
192  	uint16_t addGATTCharacteristicDynamic(UUID * uuid, uint16_t flags, uint16_t characteristic_id);
193 };
194 
195 extern BTstackManager BTstack;
196 
197 #if defined __cplusplus
198 }
199 #endif
200 
201 #endif // __ARDUINO_BTSTACK_H