1 // 2 // Copyright 2015 Google, Inc. 3 // 4 // Licensed under the Apache License, Version 2.0 (the "License"); 5 // you may not use this file except in compliance with the License. 6 // You may obtain a copy of the License at: 7 // 8 // http://www.apache.org/licenses/LICENSE-2.0 9 // 10 // Unless required by applicable law or agreed to in writing, software 11 // distributed under the License is distributed on an "AS IS" BASIS, 12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 // See the License for the specific language governing permissions and 14 // limitations under the License. 15 // 16 17 #pragma once 18 19 #include <mutex> 20 #include <unordered_set> 21 #include <vector> 22 23 #include <base/macros.h> 24 #include <hardware/bluetooth.h> 25 #include <hardware/bt_gatt.h> 26 27 namespace bluetooth { 28 namespace hal { 29 30 // This class represents the standard BT-GATT interface. This class combines 31 // GATT profile server and client role operations with general GAP profile 32 // operations of various roles (central, scanner, peripheral, advertiser), 33 // wrapping around the underlying bt_gatt_interface_t structure. A single 34 // instance of this class exists per application and it allows multiple classes 35 // to interface with the global HAL interface by multiplexing callbacks among 36 // registered clients. 37 // 38 // This is declared as an abstract interface so that a fake implementation can 39 // be injected for testing the upper layer. 40 class BluetoothGattInterface { 41 public: 42 // The HAL interface doesn't allow registering "user data" that carries 43 // context beyond the callback parameters, forcing implementations to deal 44 // with global variables. The *Observer interface is to redirect these events 45 // to interested parties in an object-oriented manner. 46 47 // The standard LE scanner callback interface. 48 class ScannerObserver { 49 public: 50 virtual ~ScannerObserver() = default; 51 52 // All of the events below correspond to callbacks defined in 53 // "btgatt_scanner_callbacks_t" in the HAL API definitions. 54 55 virtual void ScanResultCallback( 56 BluetoothGattInterface* gatt_iface, const RawAddress& bda, int rssi, 57 std::vector<uint8_t> adv_data); // NOLINT(pass-by-value) 58 }; 59 60 // The standard BT-GATT client callback interface. 61 class ClientObserver { 62 public: 63 virtual ~ClientObserver() = default; 64 65 // All of the events below correspond to callbacks defined in 66 // "bt_gatt_client_callbacks_t" in the HAL API definitions. 67 68 virtual void RegisterClientCallback(BluetoothGattInterface* gatt_iface, 69 int status, int client_if, 70 const bluetooth::Uuid& app_uuid); 71 72 virtual void ConnectCallback(BluetoothGattInterface* gatt_iface, 73 int conn_id, int status, int client_if, 74 const RawAddress& bda); 75 76 virtual void DisconnectCallback(BluetoothGattInterface* gatt_iface, 77 int conn_id, int status, int client_if, 78 const RawAddress& bda); 79 80 virtual void SearchCompleteCallback(BluetoothGattInterface* gatt_iface, 81 int conn_id, int status); 82 83 virtual void RegisterForNotificationCallback( 84 BluetoothGattInterface* gatt_iface, int conn_id, int registered, 85 int status, uint16_t handle); 86 87 virtual void NotifyCallback(BluetoothGattInterface* gatt_iface, int conn_id, 88 const btgatt_notify_params_t& p_data); 89 90 virtual void WriteCharacteristicCallback(BluetoothGattInterface* gatt_iface, 91 int conn_id, int status, 92 uint16_t handle); 93 94 virtual void WriteDescriptorCallback(BluetoothGattInterface* gatt_iface, 95 int conn_id, int status, 96 uint16_t handle); 97 98 virtual void MtuChangedCallback(BluetoothGattInterface* gatt_iface, 99 int conn_id, int status, int mtu); 100 101 virtual void GetGattDbCallback(BluetoothGattInterface* gatt_iface, 102 int conn_id, 103 const btgatt_db_element_t* gatt_db, 104 int size); 105 106 virtual void ServicesRemovedCallback(BluetoothGattInterface* gatt_iface, 107 int conn_id, uint16_t start_handle, 108 uint16_t end_handle); 109 110 virtual void ServicesAddedCallback(BluetoothGattInterface* gatt_iface, 111 int conn_id, 112 const btgatt_db_element_t& added, 113 int added_count); 114 }; 115 116 // The standard BT-GATT server callback interface. 117 class ServerObserver { 118 public: 119 virtual ~ServerObserver() = default; 120 121 virtual void RegisterServerCallback(BluetoothGattInterface* gatt_iface, 122 int status, int server_if, 123 const bluetooth::Uuid& app_uuid); 124 125 virtual void ConnectionCallback(BluetoothGattInterface* gatt_iface, 126 int conn_id, int server_if, int connected, 127 const RawAddress& bda); 128 129 virtual void ServiceAddedCallback( 130 BluetoothGattInterface* gatt_iface, int status, int server_if, 131 std::vector<btgatt_db_element_t> service); // NOLINT(pass-by-value) 132 133 virtual void ServiceStoppedCallback(BluetoothGattInterface* gatt_iface, 134 int status, int server_if, 135 int srvc_handle); 136 137 virtual void ServiceDeletedCallback(BluetoothGattInterface* gatt_iface, 138 int status, int server_if, 139 int srvc_handle); 140 141 virtual void RequestReadCharacteristicCallback( 142 BluetoothGattInterface* gatt_iface, int conn_id, int trans_id, 143 const RawAddress& bda, int attr_handle, int offset, bool is_long); 144 145 virtual void RequestReadDescriptorCallback( 146 BluetoothGattInterface* gatt_iface, int conn_id, int trans_id, 147 const RawAddress& bda, int attr_handle, int offset, bool is_long); 148 149 virtual void RequestWriteCharacteristicCallback( 150 BluetoothGattInterface* gatt_iface, int conn_id, int trans_id, 151 const RawAddress& bda, int attr_handle, int offset, bool need_rsp, 152 bool is_prep, 153 std::vector<uint8_t> value); // NOLINT(pass-by-value) 154 155 virtual void RequestWriteDescriptorCallback( 156 BluetoothGattInterface* gatt_iface, int conn_id, int trans_id, 157 const RawAddress& bda, int attr_handle, int offset, bool need_rsp, 158 bool is_prep, 159 std::vector<uint8_t> value); // NOLINT(pass-by-alue) 160 161 virtual void RequestExecWriteCallback(BluetoothGattInterface* gatt_iface, 162 int conn_id, int trans_id, 163 const RawAddress& bda, 164 int exec_write); 165 166 virtual void ResponseConfirmationCallback( 167 BluetoothGattInterface* gatt_iface, int status, int handle); 168 169 virtual void IndicationSentCallback(BluetoothGattInterface* gatt_iface, 170 int conn_id, int status); 171 172 virtual void MtuChangedCallback(BluetoothGattInterface* gatt_iface, 173 int conn_id, int mtu); 174 }; 175 176 // Initialize and clean up the BluetoothInterface singleton. Returns false if 177 // the underlying HAL interface failed to initialize, and true on success. 178 static bool Initialize(); 179 180 // Shuts down and cleans up the interface. CleanUp must be called on the same 181 // thread that called Initialize. 182 static void CleanUp(); 183 184 // Returns true if the interface was initialized and a global singleton has 185 // been created. 186 static bool IsInitialized(); 187 188 // Initialize for testing. Use this to inject a test version of 189 // BluetoothGattInterface. To be used from unit tests only. 190 static void InitializeForTesting(BluetoothGattInterface* test_instance); 191 192 // Returns the BluetoothGattInterface singleton. If the interface has 193 // not been initialized, returns nullptr. This method is thread-safe, in that 194 // it will block if the internal lock is being held by another thread. Don't 195 // call this re-entrantly from an observer event as this may cause a deadlock. 196 static BluetoothGattInterface* Get(); 197 198 // Add or remove an observer that is interested in LE scanner interface 199 // notifications from us. Thread-safety is guaranteed by ObserverList. 200 virtual void AddScannerObserver(ScannerObserver* observer) = 0; 201 virtual void RemoveScannerObserver(ScannerObserver* observer) = 0; 202 203 // Add or remove an observer that is interested in GATT client interface 204 // notifications from us. Thread-safety is guaranteed by ObserverList. 205 virtual void AddClientObserver(ClientObserver* observer) = 0; 206 virtual void RemoveClientObserver(ClientObserver* observer) = 0; 207 208 // Add or remove an observer that is interested in GATT server interface 209 // notifications from us. Thread-safety is guaranteed by ObserverList. 210 virtual void AddServerObserver(ServerObserver* observer) = 0; 211 virtual void RemoveServerObserver(ServerObserver* observer) = 0; 212 213 // The HAL module pointer that represents the standard BT LE advertiser 214 // interface. This is implemented in and provided by the shared Bluetooth 215 // library, so this isn't owned by us. 216 // 217 // Upper layers can make ble_advertiser_interface_t API calls through this 218 // structure. 219 virtual BleAdvertiserInterface* GetAdvertiserHALInterface() const = 0; 220 221 // The HAL module pointer that represents the standard BT LE scanner 222 // interface. This is implemented in and provided by the shared Bluetooth 223 // library, so this isn't owned by us. 224 // 225 // Upper layers can make ble_scanner_interface_t API calls through this 226 // structure. 227 virtual BleScannerInterface* GetScannerHALInterface() const = 0; 228 229 // The HAL module pointer that represents the standard BT-GATT client 230 // interface. This is implemented in and provided by the shared Bluetooth 231 // library, so this isn't owned by us. 232 // 233 // Upper layers can make btgatt_client_interface_t API calls through this 234 // structure. 235 virtual const btgatt_client_interface_t* GetClientHALInterface() const = 0; 236 237 // The HAL module pointer that represents the standard BT-GATT server 238 // interface. This is implemented in and provided by the shared Bluetooth 239 // library, so this isn't owned by us. 240 // 241 // Upper layers can make btgatt_server_interface_t API calls through this 242 // structure. 243 virtual const btgatt_server_interface_t* GetServerHALInterface() const = 0; 244 245 // Initiates a regular BLE device scan. This is called internally from each 246 // LowEnergyClient. This function synchronizes the scan requests and maintains 247 // an internal reference count for each scan client that is interested. 248 bt_status_t StartScan(int client_id); 249 bt_status_t StopScan(int client_id); 250 251 protected: 252 BluetoothGattInterface() = default; 253 virtual ~BluetoothGattInterface() = default; 254 255 private: 256 // Used to keep a reference count for the different BLE scan clients. 257 std::mutex scan_clients_lock_; 258 std::unordered_set<int> scan_client_set_; 259 260 DISALLOW_COPY_AND_ASSIGN(BluetoothGattInterface); 261 }; 262 263 } // namespace hal 264 } // namespace bluetooth 265