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