Loading system/service/adapter.cpp +40 −13 Original line number Diff line number Diff line Loading @@ -20,6 +20,9 @@ #include "service/logging_helpers.h" using std::lock_guard; using std::mutex; namespace bluetooth { // static Loading @@ -27,14 +30,20 @@ const char Adapter::kDefaultAddress[] = "00:00:00:00:00:00"; // static const char Adapter::kDefaultName[] = "not-initialized"; // TODO(armansito): The following constants come straight from // packages/apps/Bluetooth/src/c/a/b/btservice/AdapterService.java. It would be // nice to know if there were a way to obtain these values from the stack // instead of hardcoding them here. // The minimum number of advertising instances required for multi-advertisement // support. // // TODO(armansito): This number comes straight from // packages/apps/Bluetooth/src/c/a/b/btservice/AdapterService.java. It would be // nice to know if there were a way to obtain this number from the stack instead // of hardcoding it here. const char kMinAdvInstancesForMultiAdv = 5; const int kMinAdvInstancesForMultiAdv = 5; // Used when determining if offloaded scan filtering is supported. const int kMinOffloadedFilters = 10; // Used when determining if offloaded scan batching is supported. const int kMinOffloadedScanStorageBytes = 1024; void Adapter::Observer::OnAdapterStateChanged(Adapter* adapter, AdapterState prev_state, Loading Loading @@ -64,12 +73,12 @@ Adapter::~Adapter() { } void Adapter::AddObserver(Observer* observer) { std::lock_guard<std::mutex> lock(observers_lock_); lock_guard<mutex> lock(observers_lock_); observers_.AddObserver(observer); } void Adapter::RemoveObserver(Observer* observer) { std::lock_guard<std::mutex> lock(observers_lock_); lock_guard<mutex> lock(observers_lock_); observers_.RemoveObserver(observer); } Loading Loading @@ -163,15 +172,32 @@ std::string Adapter::GetAddress() const { return address_.Get(); } bool Adapter::IsMultiAdvertisementSupported() const { bool Adapter::IsMultiAdvertisementSupported() { lock_guard<mutex> lock(local_le_features_lock_); return local_le_features_.max_adv_instance >= kMinAdvInstancesForMultiAdv; } bool Adapter::IsDeviceConnected(const std::string& device_address) { std::lock_guard<std::mutex> lock(connected_devices_lock_); lock_guard<mutex> lock(connected_devices_lock_); return connected_devices_.find(device_address) != connected_devices_.end(); } int Adapter::GetTotalNumberOfTrackableAdvertisements() { lock_guard<mutex> lock(local_le_features_lock_); return local_le_features_.total_trackable_advertisers; } bool Adapter::IsOffloadedFilteringSupported() { lock_guard<mutex> lock(local_le_features_lock_); return local_le_features_.max_adv_filter_supported >= kMinOffloadedFilters; } bool Adapter::IsOffloadedScanBatchingSupported() { lock_guard<mutex> lock(local_le_features_lock_); return local_le_features_.scan_result_storage_size >= kMinOffloadedScanStorageBytes; } LowEnergyClientFactory* Adapter::GetLowEnergyClientFactory() const { return ble_client_factory_.get(); } Loading Loading @@ -233,6 +259,7 @@ void Adapter::AdapterPropertiesCallback(bt_status_t status, break; } case BT_PROPERTY_LOCAL_LE_FEATURES: { lock_guard<mutex> lock(local_le_features_lock_); if (property->len != sizeof(bt_local_le_features_t)) { LOG(WARNING) << "Malformed value received for property: " << "BT_PROPERTY_LOCAL_LE_FEATURES"; Loading Loading @@ -272,14 +299,14 @@ void Adapter::AclStateChangedCallback(bt_status_t status, // Introduce a scope to manage |connected_devices_lock_| with RAII. { std::lock_guard<std::mutex> lock(connected_devices_lock_); lock_guard<mutex> lock(connected_devices_lock_); if (connected) connected_devices_.insert(device_address); else connected_devices_.erase(device_address); } std::lock_guard<std::mutex> lock(observers_lock_); lock_guard<mutex> lock(observers_lock_); FOR_EACH_OBSERVER( Observer, observers_, OnDeviceConnectionStateChanged(this, device_address, connected)); Loading Loading @@ -310,7 +337,7 @@ void Adapter::NotifyAdapterStateChanged(AdapterState prev_state, if (prev_state == new_state) return; std::lock_guard<std::mutex> lock(observers_lock_); lock_guard<mutex> lock(observers_lock_); FOR_EACH_OBSERVER(Observer, observers_, OnAdapterStateChanged(this, prev_state, new_state)); } Loading system/service/adapter.h +12 −1 Original line number Diff line number Diff line Loading @@ -102,13 +102,23 @@ class Adapter : public hal::BluetoothInterface::Observer { // Returns true if the local adapter supports the Low-Energy // multi-advertisement feature. bool IsMultiAdvertisementSupported() const; bool IsMultiAdvertisementSupported(); // Returns true if the remote device with address |device_address| is // currently connected. This is not a const method as it modifies the state of // the associated internal mutex. bool IsDeviceConnected(const std::string& device_address); // Returns the total number of trackable advertisements as supported by the // underlying hardware. int GetTotalNumberOfTrackableAdvertisements(); // Returns true if hardware-backed scan filtering is supported. bool IsOffloadedFilteringSupported(); // Returns true if hardware-backed batch scanning is supported. bool IsOffloadedScanBatchingSupported(); // Returns a pointer to the LowEnergyClientFactory. This can be used to // register per-application LowEnergyClient instances to perform BLE GAP // operations. Loading Loading @@ -152,6 +162,7 @@ class Adapter : public hal::BluetoothInterface::Observer { // The current set of supported LE features as obtained from the stack. The // values here are all initially set to 0 and updated when the corresponding // adapter property has been received from the stack. std::mutex local_le_features_lock_; bt_local_le_features_t local_le_features_; // List of observers that are interested in notifications from us. Loading Loading
system/service/adapter.cpp +40 −13 Original line number Diff line number Diff line Loading @@ -20,6 +20,9 @@ #include "service/logging_helpers.h" using std::lock_guard; using std::mutex; namespace bluetooth { // static Loading @@ -27,14 +30,20 @@ const char Adapter::kDefaultAddress[] = "00:00:00:00:00:00"; // static const char Adapter::kDefaultName[] = "not-initialized"; // TODO(armansito): The following constants come straight from // packages/apps/Bluetooth/src/c/a/b/btservice/AdapterService.java. It would be // nice to know if there were a way to obtain these values from the stack // instead of hardcoding them here. // The minimum number of advertising instances required for multi-advertisement // support. // // TODO(armansito): This number comes straight from // packages/apps/Bluetooth/src/c/a/b/btservice/AdapterService.java. It would be // nice to know if there were a way to obtain this number from the stack instead // of hardcoding it here. const char kMinAdvInstancesForMultiAdv = 5; const int kMinAdvInstancesForMultiAdv = 5; // Used when determining if offloaded scan filtering is supported. const int kMinOffloadedFilters = 10; // Used when determining if offloaded scan batching is supported. const int kMinOffloadedScanStorageBytes = 1024; void Adapter::Observer::OnAdapterStateChanged(Adapter* adapter, AdapterState prev_state, Loading Loading @@ -64,12 +73,12 @@ Adapter::~Adapter() { } void Adapter::AddObserver(Observer* observer) { std::lock_guard<std::mutex> lock(observers_lock_); lock_guard<mutex> lock(observers_lock_); observers_.AddObserver(observer); } void Adapter::RemoveObserver(Observer* observer) { std::lock_guard<std::mutex> lock(observers_lock_); lock_guard<mutex> lock(observers_lock_); observers_.RemoveObserver(observer); } Loading Loading @@ -163,15 +172,32 @@ std::string Adapter::GetAddress() const { return address_.Get(); } bool Adapter::IsMultiAdvertisementSupported() const { bool Adapter::IsMultiAdvertisementSupported() { lock_guard<mutex> lock(local_le_features_lock_); return local_le_features_.max_adv_instance >= kMinAdvInstancesForMultiAdv; } bool Adapter::IsDeviceConnected(const std::string& device_address) { std::lock_guard<std::mutex> lock(connected_devices_lock_); lock_guard<mutex> lock(connected_devices_lock_); return connected_devices_.find(device_address) != connected_devices_.end(); } int Adapter::GetTotalNumberOfTrackableAdvertisements() { lock_guard<mutex> lock(local_le_features_lock_); return local_le_features_.total_trackable_advertisers; } bool Adapter::IsOffloadedFilteringSupported() { lock_guard<mutex> lock(local_le_features_lock_); return local_le_features_.max_adv_filter_supported >= kMinOffloadedFilters; } bool Adapter::IsOffloadedScanBatchingSupported() { lock_guard<mutex> lock(local_le_features_lock_); return local_le_features_.scan_result_storage_size >= kMinOffloadedScanStorageBytes; } LowEnergyClientFactory* Adapter::GetLowEnergyClientFactory() const { return ble_client_factory_.get(); } Loading Loading @@ -233,6 +259,7 @@ void Adapter::AdapterPropertiesCallback(bt_status_t status, break; } case BT_PROPERTY_LOCAL_LE_FEATURES: { lock_guard<mutex> lock(local_le_features_lock_); if (property->len != sizeof(bt_local_le_features_t)) { LOG(WARNING) << "Malformed value received for property: " << "BT_PROPERTY_LOCAL_LE_FEATURES"; Loading Loading @@ -272,14 +299,14 @@ void Adapter::AclStateChangedCallback(bt_status_t status, // Introduce a scope to manage |connected_devices_lock_| with RAII. { std::lock_guard<std::mutex> lock(connected_devices_lock_); lock_guard<mutex> lock(connected_devices_lock_); if (connected) connected_devices_.insert(device_address); else connected_devices_.erase(device_address); } std::lock_guard<std::mutex> lock(observers_lock_); lock_guard<mutex> lock(observers_lock_); FOR_EACH_OBSERVER( Observer, observers_, OnDeviceConnectionStateChanged(this, device_address, connected)); Loading Loading @@ -310,7 +337,7 @@ void Adapter::NotifyAdapterStateChanged(AdapterState prev_state, if (prev_state == new_state) return; std::lock_guard<std::mutex> lock(observers_lock_); lock_guard<mutex> lock(observers_lock_); FOR_EACH_OBSERVER(Observer, observers_, OnAdapterStateChanged(this, prev_state, new_state)); } Loading
system/service/adapter.h +12 −1 Original line number Diff line number Diff line Loading @@ -102,13 +102,23 @@ class Adapter : public hal::BluetoothInterface::Observer { // Returns true if the local adapter supports the Low-Energy // multi-advertisement feature. bool IsMultiAdvertisementSupported() const; bool IsMultiAdvertisementSupported(); // Returns true if the remote device with address |device_address| is // currently connected. This is not a const method as it modifies the state of // the associated internal mutex. bool IsDeviceConnected(const std::string& device_address); // Returns the total number of trackable advertisements as supported by the // underlying hardware. int GetTotalNumberOfTrackableAdvertisements(); // Returns true if hardware-backed scan filtering is supported. bool IsOffloadedFilteringSupported(); // Returns true if hardware-backed batch scanning is supported. bool IsOffloadedScanBatchingSupported(); // Returns a pointer to the LowEnergyClientFactory. This can be used to // register per-application LowEnergyClient instances to perform BLE GAP // operations. Loading Loading @@ -152,6 +162,7 @@ class Adapter : public hal::BluetoothInterface::Observer { // The current set of supported LE features as obtained from the stack. The // values here are all initially set to 0 and updated when the corresponding // adapter property has been received from the stack. std::mutex local_le_features_lock_; bt_local_le_features_t local_le_features_; // List of observers that are interested in notifications from us. Loading