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