xref: /btstack/port/arduino/BTstack.h (revision 591e55515a007c95deb6181153935ed9e9027647)
18caefee3SMatthias Ringwald /**
28caefee3SMatthias Ringwald  * Arduino Wrapper for BTstack
38caefee3SMatthias Ringwald  */
478707112SMatthias Ringwald #ifndef __ARDUINO_BTSTACK_H
578707112SMatthias Ringwald #define __ARDUINO_BTSTACK_H
678707112SMatthias Ringwald 
778707112SMatthias Ringwald #if defined __cplusplus
878707112SMatthias Ringwald extern "C" {
978707112SMatthias Ringwald #endif
108caefee3SMatthias Ringwald 
11591423b2SMatthias Ringwald #include "ble/att_db.h"
12eb886013SMatthias Ringwald #include "btstack_util.h"
133edc84c5SMatthias Ringwald #include "ble/gatt_client.h"
148caefee3SMatthias Ringwald #include "hci.h"
158caefee3SMatthias Ringwald #include <stdint.h>
168caefee3SMatthias Ringwald 
178caefee3SMatthias Ringwald typedef enum BLEStatus {
188caefee3SMatthias Ringwald 	BLE_STATUS_OK,
198caefee3SMatthias Ringwald 	BLE_STATUS_DONE,	// e.g. for service or characteristic discovery done
208caefee3SMatthias Ringwald 	BLE_STATUS_CONNECTION_TIMEOUT,
218caefee3SMatthias Ringwald 	BLE_STATUS_CONNECTION_ERROR,
228caefee3SMatthias Ringwald 	BLE_STATUS_OTHER_ERROR
238caefee3SMatthias Ringwald } BLEStatus;
248caefee3SMatthias Ringwald 
258caefee3SMatthias Ringwald typedef void (*btstack_packet_handler_t) (uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size);
268caefee3SMatthias Ringwald 
278caefee3SMatthias Ringwald class UUID {
288caefee3SMatthias Ringwald private:
298caefee3SMatthias Ringwald 	uint8_t uuid[16];
308caefee3SMatthias Ringwald public:
318caefee3SMatthias Ringwald 	UUID();
328caefee3SMatthias Ringwald 	UUID(const uint8_t uuid[16]);
338caefee3SMatthias Ringwald 	UUID(const char * uuidStr);
348caefee3SMatthias Ringwald 	const char * getUuidString()    const;
358caefee3SMatthias Ringwald 	const char * getUuid128String() const;
368caefee3SMatthias Ringwald 	const uint8_t * getUuid(void)   const;
378caefee3SMatthias Ringwald 	bool matches(UUID *uuid)        const;
388caefee3SMatthias Ringwald };
398caefee3SMatthias Ringwald 
408caefee3SMatthias Ringwald typedef enum BD_ADDR_TYPE {
418caefee3SMatthias Ringwald 	PUBLIC_ADDRESS = 0,
428caefee3SMatthias Ringwald 	PRIVAT_ADDRESS
438caefee3SMatthias Ringwald } BD_ADDR_TYPE;
448caefee3SMatthias Ringwald 
458caefee3SMatthias Ringwald class BD_ADDR {
468caefee3SMatthias Ringwald private:
478caefee3SMatthias Ringwald 	uint8_t address[6];
488caefee3SMatthias Ringwald 	BD_ADDR_TYPE address_type;
498caefee3SMatthias Ringwald public:
508caefee3SMatthias Ringwald 	BD_ADDR();
518caefee3SMatthias Ringwald 	BD_ADDR(const char * address_string, BD_ADDR_TYPE address_type = PUBLIC_ADDRESS);
528caefee3SMatthias Ringwald 	BD_ADDR(const uint8_t address[6], BD_ADDR_TYPE address_type = PUBLIC_ADDRESS);
538caefee3SMatthias Ringwald 	const uint8_t * getAddress();
548caefee3SMatthias Ringwald 	const char * getAddressString();
558caefee3SMatthias Ringwald 	BD_ADDR_TYPE getAddressType();
568caefee3SMatthias Ringwald };
578caefee3SMatthias Ringwald 
588caefee3SMatthias Ringwald class BLEAdvertisement {
598caefee3SMatthias Ringwald private:
608caefee3SMatthias Ringwald 	uint8_t advertising_event_type;
618caefee3SMatthias Ringwald 	uint8_t rssi;
628caefee3SMatthias Ringwald 	uint8_t data_length;
638caefee3SMatthias Ringwald 	uint8_t data[10 + LE_ADVERTISING_DATA_SIZE];
648caefee3SMatthias Ringwald 	BD_ADDR  bd_addr;
65f5054c00SMatthias Ringwald 	UUID * iBeacon_UUID;
668caefee3SMatthias Ringwald public:
678caefee3SMatthias Ringwald 	BLEAdvertisement(uint8_t * event_packet);
68f5054c00SMatthias Ringwald 	~BLEAdvertisement();
698caefee3SMatthias Ringwald 	BD_ADDR * getBdAddr();
708caefee3SMatthias Ringwald 	BD_ADDR_TYPE getBdAddrType();
718caefee3SMatthias Ringwald 	int getRssi();
728caefee3SMatthias Ringwald 	bool containsService(UUID * service);
738caefee3SMatthias Ringwald 	bool nameHasPrefix(const char * namePrefix);
748caefee3SMatthias Ringwald 	const uint8_t * getAdvData();
758caefee3SMatthias Ringwald 	bool isIBeacon();
768caefee3SMatthias Ringwald 	const UUID * getIBeaconUUID();
778caefee3SMatthias Ringwald 	uint16_t     getIBeaconMajorID();
788caefee3SMatthias Ringwald 	uint16_t     getIBecaonMinorID();
798caefee3SMatthias Ringwald 	uint8_t      getiBeaconMeasuredPower();
808caefee3SMatthias Ringwald };
818caefee3SMatthias Ringwald 
828caefee3SMatthias Ringwald class BLECharacteristic {
838caefee3SMatthias Ringwald private:
84d25c33e5SMatthias Ringwald 	gatt_client_characteristic_t characteristic;
858caefee3SMatthias Ringwald 	UUID uuid;
868caefee3SMatthias Ringwald public:
878caefee3SMatthias Ringwald 	BLECharacteristic();
88d25c33e5SMatthias Ringwald 	BLECharacteristic(gatt_client_characteristic_t characteristic);
898caefee3SMatthias Ringwald 	const UUID * getUUID();
908caefee3SMatthias Ringwald 	bool matches(UUID * uuid);
918caefee3SMatthias Ringwald 	bool isValueHandle(uint16_t value_handle);
92d25c33e5SMatthias Ringwald 	const gatt_client_characteristic_t * getCharacteristic();
938caefee3SMatthias Ringwald };
948caefee3SMatthias Ringwald 
958caefee3SMatthias Ringwald class BLEService {
968caefee3SMatthias Ringwald private:
97d25c33e5SMatthias Ringwald 	gatt_client_service_t service;
988caefee3SMatthias Ringwald 	UUID uuid;
998caefee3SMatthias Ringwald public:
1008caefee3SMatthias Ringwald 	BLEService();
101d25c33e5SMatthias Ringwald 	BLEService(gatt_client_service_t service);
1028caefee3SMatthias Ringwald 	const UUID * getUUID();
1038caefee3SMatthias Ringwald 	bool matches(UUID * uuid);
104d25c33e5SMatthias Ringwald 	const gatt_client_service_t * getService();
1058caefee3SMatthias Ringwald };
1068caefee3SMatthias Ringwald 
1078caefee3SMatthias Ringwald class BLEDevice {
1088caefee3SMatthias Ringwald private:
109*591e5551SMatthias Ringwald 	hci_con_handle_t handle;
1108caefee3SMatthias Ringwald public:
1118caefee3SMatthias Ringwald 	BLEDevice();
112*591e5551SMatthias Ringwald 	BLEDevice(hci_con_handle_t handle);
113*591e5551SMatthias Ringwald 	hci_con_handle_t getHandle();
1148caefee3SMatthias Ringwald 
1158caefee3SMatthias Ringwald 	// discovery of services and characteristics
1168caefee3SMatthias Ringwald 	int discoverGATTServices();
1178caefee3SMatthias Ringwald 	int discoverCharacteristicsForService(BLEService * service);
1188caefee3SMatthias Ringwald 
1198caefee3SMatthias Ringwald 	// read/write
1208caefee3SMatthias Ringwald 	int  readCharacteristic(BLECharacteristic * characteristic);
1218caefee3SMatthias Ringwald 	int  writeCharacteristic(BLECharacteristic * characteristic, uint8_t * data, uint16_t size);
1228caefee3SMatthias Ringwald 	int  writeCharacteristicWithoutResponse(BLECharacteristic * characteristic, uint8_t * data, uint16_t size);
1238caefee3SMatthias Ringwald 
1248caefee3SMatthias Ringwald 	// subscribe/unsubscribe
1258caefee3SMatthias Ringwald 	int subscribeForNotifications(BLECharacteristic * characteristic);
1268caefee3SMatthias Ringwald 	int unsubscribeFromNotifications(BLECharacteristic * characteristic);
1278caefee3SMatthias Ringwald 	int subscribeForIndications(BLECharacteristic * characteristic);
1288caefee3SMatthias Ringwald 	int unsubscribeFromIndications(BLECharacteristic * characteristic);
1298caefee3SMatthias Ringwald };
1308caefee3SMatthias Ringwald 
1318caefee3SMatthias Ringwald class BTstackManager {
1328caefee3SMatthias Ringwald public:
1338caefee3SMatthias Ringwald 	BTstackManager(void);
1348caefee3SMatthias Ringwald 	void setup(void);
1358caefee3SMatthias Ringwald 	void loop(void);
1368caefee3SMatthias Ringwald 
1378caefee3SMatthias Ringwald 	void setPublicBdAddr(bd_addr_t addr);
1388caefee3SMatthias Ringwald 	void enablePacketLogger();
1398caefee3SMatthias Ringwald 	void enableDebugLogger();
1408caefee3SMatthias Ringwald 
1418caefee3SMatthias Ringwald 	void setAdvData(uint16_t size, const uint8_t * data);
1428caefee3SMatthias Ringwald 	void iBeaconConfigure(UUID * uuid, uint16_t major_id, uint16_t minor_id, uint8_t measured_power = 0xc6);
1438caefee3SMatthias Ringwald 	void startAdvertising();
1448caefee3SMatthias Ringwald 	void stopAdvertising();
1458caefee3SMatthias Ringwald 
1468caefee3SMatthias Ringwald 	void bleStartScanning();
1478caefee3SMatthias Ringwald 	void bleStopScanning();
1488caefee3SMatthias Ringwald 
1498caefee3SMatthias Ringwald 	// connection management
1508caefee3SMatthias Ringwald 	void bleConnect(BD_ADDR_TYPE address_type, const uint8_t address[6], int timeout_ms);
1518caefee3SMatthias Ringwald 	void bleConnect(BD_ADDR_TYPE address_type, const char * address, int timeout_ms);
1528caefee3SMatthias Ringwald 	void bleConnect(BD_ADDR * address, int timeout_ms);
1538caefee3SMatthias Ringwald 	void bleConnect(BLEAdvertisement * advertisement, int timeout_ms);
1548caefee3SMatthias Ringwald 	void bleDisconnect(BLEDevice * device);
1558caefee3SMatthias Ringwald 
1568caefee3SMatthias Ringwald 	// discovery of services and characteristics
1578caefee3SMatthias Ringwald 	int discoverGATTServices(BLEDevice * device);
1588caefee3SMatthias Ringwald 	int discoverCharacteristicsForService(BLEDevice * peripheral, BLEService * service);
1598caefee3SMatthias Ringwald 
1608caefee3SMatthias Ringwald 	// read/write
1618caefee3SMatthias Ringwald 	int  readCharacteristic(BLEDevice * device, BLECharacteristic * characteristic);
1628caefee3SMatthias Ringwald 	int  writeCharacteristic(BLEDevice * device, BLECharacteristic * characteristic, uint8_t * data, uint16_t size);
1638caefee3SMatthias Ringwald 	int  writeCharacteristicWithoutResponse(BLEDevice * device, BLECharacteristic * characteristic, uint8_t * data, uint16_t size);
1648caefee3SMatthias Ringwald 
1658caefee3SMatthias Ringwald 	// subscribe/unsubscribe notification and indications
1668caefee3SMatthias Ringwald 	int subscribeForNotifications(BLEDevice * device, BLECharacteristic * characteristic);
1678caefee3SMatthias Ringwald 	int unsubscribeFromNotifications(BLEDevice * device, BLECharacteristic * characteristic);
1688caefee3SMatthias Ringwald 	int subscribeForIndications(BLEDevice * device, BLECharacteristic * characteristic);
1698caefee3SMatthias Ringwald 	int unsubscribeFromIndications(BLEDevice * device, BLECharacteristic * characteristic);
1708caefee3SMatthias Ringwald 
1718caefee3SMatthias Ringwald 	// Callbacks
1728caefee3SMatthias Ringwald 	void setBLEAdvertisementCallback(void (*)(BLEAdvertisement * bleAdvertisement));
1738caefee3SMatthias Ringwald 	void setBLEDeviceConnectedCallback(void (*)(BLEStatus status, BLEDevice * device));
1748caefee3SMatthias Ringwald 	void setBLEDeviceDisconnectedCallback(void (*)(BLEDevice * device));
1758caefee3SMatthias Ringwald 	void setGATTServiceDiscoveredCallback(void (*)(BLEStatus status, BLEDevice * device, BLEService * bleService));
1768caefee3SMatthias Ringwald 	void setGATTCharacteristicDiscoveredCallback(void (*)(BLEStatus status, BLEDevice * device, BLECharacteristic * characteristic));
1778caefee3SMatthias Ringwald 	void setGATTCharacteristicReadCallback(void (*)(BLEStatus status, BLEDevice * device, uint8_t * value, uint16_t length));
1788caefee3SMatthias Ringwald 	void setGATTCharacteristicNotificationCallback(void (*)(BLEDevice * device, uint16_t value_handle, uint8_t* value, uint16_t length));
1798caefee3SMatthias Ringwald 	void setGATTCharacteristicIndicationCallback(void (*)(BLEDevice * device, uint16_t value_handle, uint8_t* value, uint16_t length));
1808caefee3SMatthias Ringwald 	void setGATTDoneCallback(void (*)(BLEStatus status, BLEDevice * device));
1818caefee3SMatthias Ringwald 
1828caefee3SMatthias Ringwald 	void setGATTCharacteristicWrittenCallback(void (*)(BLEStatus status, BLEDevice * device));
1838caefee3SMatthias Ringwald 	void setGATTCharacteristicSubscribedCallback(void (*)(BLEStatus status, BLEDevice * device));
1848caefee3SMatthias Ringwald 	void setGATTCharacteristicUnsubscribedCallback(void (*)(BLEStatus status, BLEDevice * device));
1858caefee3SMatthias Ringwald 
1868caefee3SMatthias Ringwald 	void setGATTCharacteristicRead(uint16_t (*)(uint16_t characteristic_id, uint8_t * buffer, uint16_t buffer_size));
1878caefee3SMatthias Ringwald 	void setGATTCharacteristicWrite(int (*)(uint16_t characteristic_id, uint8_t *buffer, uint16_t buffer_size));
1888caefee3SMatthias Ringwald 
1898caefee3SMatthias Ringwald 	void addGATTService(UUID * uuid);
1908caefee3SMatthias Ringwald  	uint16_t addGATTCharacteristic(UUID * uuid, uint16_t flags, const char * text);
1918caefee3SMatthias Ringwald  	uint16_t addGATTCharacteristic(UUID * uuid, uint16_t flags, uint8_t * data, uint16_t data_len);
1928caefee3SMatthias Ringwald  	uint16_t addGATTCharacteristicDynamic(UUID * uuid, uint16_t flags, uint16_t characteristic_id);
1938caefee3SMatthias Ringwald };
1948caefee3SMatthias Ringwald 
1958caefee3SMatthias Ringwald extern BTstackManager BTstack;
19678707112SMatthias Ringwald 
19778707112SMatthias Ringwald #if defined __cplusplus
19878707112SMatthias Ringwald }
19978707112SMatthias Ringwald #endif
20078707112SMatthias Ringwald 
20178707112SMatthias Ringwald #endif // __ARDUINO_BTSTACK_H