Loading system/bta/include/bta_ras_api.h +9 −0 Original line number Diff line number Diff line Loading @@ -19,15 +19,24 @@ #include <cstdint> #include <vector> #include "types/bluetooth/uuid.h" #include "types/raw_address.h" namespace bluetooth { namespace ras { struct VendorSpecificCharacteristic { bluetooth::Uuid characteristicUuid_; std::vector<uint8_t> value_; }; class RasServer { public: virtual ~RasServer() = default; virtual void Initialize() = 0; virtual void SetVendorSpecificCharacteristic( const std::vector<VendorSpecificCharacteristic>& vendor_specific_characteristics) = 0; virtual void PushProcedureData(RawAddress address, uint16_t procedure_count, bool is_last, std::vector<uint8_t> data) = 0; }; Loading system/bta/ras/ras_server.cc +44 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ using namespace bluetooth; using namespace ::ras; using namespace ::ras::uuid; using bluetooth::ras::VendorSpecificCharacteristic; namespace { Loading Loading @@ -73,6 +74,12 @@ class RasServerImpl : public bluetooth::ras::RasServer { false); } void SetVendorSpecificCharacteristic( const std::vector<VendorSpecificCharacteristic>& vendor_specific_characteristics) { vendor_specific_characteristics_ = vendor_specific_characteristics; } void PushProcedureData(RawAddress address, uint16_t procedure_counter, bool is_last, std::vector<uint8_t> data) { log::debug("{}, counter:{}, is_last:{}, with size {}", address, Loading Loading @@ -277,6 +284,21 @@ class RasServerImpl : public bluetooth::ras::RasServer { service.push_back(ranging_data_overwritten_characteristic); service.push_back(ccc_descriptor); for (auto& vendor_specific_characteristics : vendor_specific_characteristics_) { btgatt_db_element_t characteristics; characteristics.uuid = vendor_specific_characteristics.characteristicUuid_; characteristics.type = BTGATT_DB_CHARACTERISTIC; characteristics.properties = GATT_CHAR_PROP_BIT_READ | GATT_CHAR_PROP_BIT_WRITE; characteristics.permissions = GATT_PERM_READ_ENCRYPTED | GATT_PERM_WRITE_ENCRYPTED | key_mask; service.push_back(characteristics); log::info("Push vendor_specific_characteristics uuid {}", characteristics.uuid); } BTA_GATTS_AddService( server_if_, service, base::BindRepeating([](tGATT_STATUS status, int server_if, Loading @@ -299,6 +321,17 @@ class RasServerImpl : public bluetooth::ras::RasServer { } auto uuid = characteristics_[read_req_handle].uuid_; auto vendor_specific_characteristic = GetVendorSpecificCharacteristic(uuid); if (vendor_specific_characteristic != nullptr) { log::debug("Read vendor_specific_characteristic uuid {}", uuid); p_msg.attr_value.len = vendor_specific_characteristic->value_.size(); std::copy(vendor_specific_characteristic->value_.begin(), vendor_specific_characteristic->value_.end(), p_msg.attr_value.value); BTA_GATTS_SendRsp(p_data->req_data.conn_id, p_data->req_data.trans_id, GATT_SUCCESS, &p_msg); return; } log::info("Read uuid, {}", getUuidName(uuid)); // Check Characteristic UUID Loading Loading @@ -598,6 +631,16 @@ class RasServerImpl : public bluetooth::ras::RasServer { return buffers.back(); } VendorSpecificCharacteristic* GetVendorSpecificCharacteristic( const bluetooth::Uuid& uuid) { for (auto& characteristic : vendor_specific_characteristics_) { if (characteristic.characteristicUuid_ == uuid) { return &characteristic; } } return nullptr; } private: bluetooth::Uuid app_uuid_; uint16_t server_if_; Loading @@ -606,6 +649,7 @@ class RasServerImpl : public bluetooth::ras::RasServer { // A map to client trackers with address std::unordered_map<RawAddress, ClientTracker> trackers_; std::mutex on_demand_ranging_mutex_; std::vector<VendorSpecificCharacteristic> vendor_specific_characteristics_; }; } // namespace Loading system/gd/hal/ranging_hal.h +6 −0 Original line number Diff line number Diff line Loading @@ -21,12 +21,18 @@ namespace bluetooth { namespace hal { struct VendorSpecificCharacteristic { std::array<uint8_t, 16> characteristicUuid_; std::vector<uint8_t> value_; }; class RangingHal : public ::bluetooth::Module { public: static const ModuleFactory Factory; virtual ~RangingHal() = default; virtual bool isBound() = 0; virtual std::vector<VendorSpecificCharacteristic> getVendorSpecificCharacteristics() = 0; }; } // namespace hal Loading system/gd/hal/ranging_hal_android.cc +22 −0 Original line number Diff line number Diff line Loading @@ -47,6 +47,28 @@ class RangingHalAndroid : public RangingHal { return bluetooth_channel_sounding_ != nullptr; } std::vector<VendorSpecificCharacteristic> getVendorSpecificCharacteristics() override { std::vector<VendorSpecificCharacteristic> vendor_specific_characteristics = {}; if (bluetooth_channel_sounding_ != nullptr) { std::optional<std::vector<std::optional<VendorSpecificData>>> vendorSpecificDataOptional; bluetooth_channel_sounding_->getVendorSpecificData(&vendorSpecificDataOptional); if (vendorSpecificDataOptional.has_value()) { for (auto vendor_specific_data : vendorSpecificDataOptional.value()) { VendorSpecificCharacteristic vendor_specific_characteristic; vendor_specific_characteristic.characteristicUuid_ = vendor_specific_data->characteristicUuid; vendor_specific_characteristic.value_ = vendor_specific_data->opaqueValue; vendor_specific_characteristics.emplace_back(vendor_specific_characteristic); } } log::info("size {}", vendor_specific_characteristics.size()); } else { log::warn("bluetooth_channel_sounding_ is nullptr"); } return vendor_specific_characteristics; }; protected: void ListDependencies(ModuleList* /*list*/) const {} Loading system/gd/hal/ranging_hal_host.cc +5 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,11 @@ class RangingHalHost : public RangingHal { return false; } std::vector<VendorSpecificCharacteristic> getVendorSpecificCharacteristics() override { std::vector<VendorSpecificCharacteristic> vendor_specific_characteristics = {}; return vendor_specific_characteristics; }; protected: void ListDependencies(ModuleList* /*list*/) const {} Loading Loading
system/bta/include/bta_ras_api.h +9 −0 Original line number Diff line number Diff line Loading @@ -19,15 +19,24 @@ #include <cstdint> #include <vector> #include "types/bluetooth/uuid.h" #include "types/raw_address.h" namespace bluetooth { namespace ras { struct VendorSpecificCharacteristic { bluetooth::Uuid characteristicUuid_; std::vector<uint8_t> value_; }; class RasServer { public: virtual ~RasServer() = default; virtual void Initialize() = 0; virtual void SetVendorSpecificCharacteristic( const std::vector<VendorSpecificCharacteristic>& vendor_specific_characteristics) = 0; virtual void PushProcedureData(RawAddress address, uint16_t procedure_count, bool is_last, std::vector<uint8_t> data) = 0; }; Loading
system/bta/ras/ras_server.cc +44 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ using namespace bluetooth; using namespace ::ras; using namespace ::ras::uuid; using bluetooth::ras::VendorSpecificCharacteristic; namespace { Loading Loading @@ -73,6 +74,12 @@ class RasServerImpl : public bluetooth::ras::RasServer { false); } void SetVendorSpecificCharacteristic( const std::vector<VendorSpecificCharacteristic>& vendor_specific_characteristics) { vendor_specific_characteristics_ = vendor_specific_characteristics; } void PushProcedureData(RawAddress address, uint16_t procedure_counter, bool is_last, std::vector<uint8_t> data) { log::debug("{}, counter:{}, is_last:{}, with size {}", address, Loading Loading @@ -277,6 +284,21 @@ class RasServerImpl : public bluetooth::ras::RasServer { service.push_back(ranging_data_overwritten_characteristic); service.push_back(ccc_descriptor); for (auto& vendor_specific_characteristics : vendor_specific_characteristics_) { btgatt_db_element_t characteristics; characteristics.uuid = vendor_specific_characteristics.characteristicUuid_; characteristics.type = BTGATT_DB_CHARACTERISTIC; characteristics.properties = GATT_CHAR_PROP_BIT_READ | GATT_CHAR_PROP_BIT_WRITE; characteristics.permissions = GATT_PERM_READ_ENCRYPTED | GATT_PERM_WRITE_ENCRYPTED | key_mask; service.push_back(characteristics); log::info("Push vendor_specific_characteristics uuid {}", characteristics.uuid); } BTA_GATTS_AddService( server_if_, service, base::BindRepeating([](tGATT_STATUS status, int server_if, Loading @@ -299,6 +321,17 @@ class RasServerImpl : public bluetooth::ras::RasServer { } auto uuid = characteristics_[read_req_handle].uuid_; auto vendor_specific_characteristic = GetVendorSpecificCharacteristic(uuid); if (vendor_specific_characteristic != nullptr) { log::debug("Read vendor_specific_characteristic uuid {}", uuid); p_msg.attr_value.len = vendor_specific_characteristic->value_.size(); std::copy(vendor_specific_characteristic->value_.begin(), vendor_specific_characteristic->value_.end(), p_msg.attr_value.value); BTA_GATTS_SendRsp(p_data->req_data.conn_id, p_data->req_data.trans_id, GATT_SUCCESS, &p_msg); return; } log::info("Read uuid, {}", getUuidName(uuid)); // Check Characteristic UUID Loading Loading @@ -598,6 +631,16 @@ class RasServerImpl : public bluetooth::ras::RasServer { return buffers.back(); } VendorSpecificCharacteristic* GetVendorSpecificCharacteristic( const bluetooth::Uuid& uuid) { for (auto& characteristic : vendor_specific_characteristics_) { if (characteristic.characteristicUuid_ == uuid) { return &characteristic; } } return nullptr; } private: bluetooth::Uuid app_uuid_; uint16_t server_if_; Loading @@ -606,6 +649,7 @@ class RasServerImpl : public bluetooth::ras::RasServer { // A map to client trackers with address std::unordered_map<RawAddress, ClientTracker> trackers_; std::mutex on_demand_ranging_mutex_; std::vector<VendorSpecificCharacteristic> vendor_specific_characteristics_; }; } // namespace Loading
system/gd/hal/ranging_hal.h +6 −0 Original line number Diff line number Diff line Loading @@ -21,12 +21,18 @@ namespace bluetooth { namespace hal { struct VendorSpecificCharacteristic { std::array<uint8_t, 16> characteristicUuid_; std::vector<uint8_t> value_; }; class RangingHal : public ::bluetooth::Module { public: static const ModuleFactory Factory; virtual ~RangingHal() = default; virtual bool isBound() = 0; virtual std::vector<VendorSpecificCharacteristic> getVendorSpecificCharacteristics() = 0; }; } // namespace hal Loading
system/gd/hal/ranging_hal_android.cc +22 −0 Original line number Diff line number Diff line Loading @@ -47,6 +47,28 @@ class RangingHalAndroid : public RangingHal { return bluetooth_channel_sounding_ != nullptr; } std::vector<VendorSpecificCharacteristic> getVendorSpecificCharacteristics() override { std::vector<VendorSpecificCharacteristic> vendor_specific_characteristics = {}; if (bluetooth_channel_sounding_ != nullptr) { std::optional<std::vector<std::optional<VendorSpecificData>>> vendorSpecificDataOptional; bluetooth_channel_sounding_->getVendorSpecificData(&vendorSpecificDataOptional); if (vendorSpecificDataOptional.has_value()) { for (auto vendor_specific_data : vendorSpecificDataOptional.value()) { VendorSpecificCharacteristic vendor_specific_characteristic; vendor_specific_characteristic.characteristicUuid_ = vendor_specific_data->characteristicUuid; vendor_specific_characteristic.value_ = vendor_specific_data->opaqueValue; vendor_specific_characteristics.emplace_back(vendor_specific_characteristic); } } log::info("size {}", vendor_specific_characteristics.size()); } else { log::warn("bluetooth_channel_sounding_ is nullptr"); } return vendor_specific_characteristics; }; protected: void ListDependencies(ModuleList* /*list*/) const {} Loading
system/gd/hal/ranging_hal_host.cc +5 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,11 @@ class RangingHalHost : public RangingHal { return false; } std::vector<VendorSpecificCharacteristic> getVendorSpecificCharacteristics() override { std::vector<VendorSpecificCharacteristic> vendor_specific_characteristics = {}; return vendor_specific_characteristics; }; protected: void ListDependencies(ModuleList* /*list*/) const {} Loading