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