Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c9403a4c authored by Chienyuan Huang's avatar Chienyuan Huang Committed by Gerrit Code Review
Browse files

Merge "CS: Init vendor specific characteristics" into main

parents eb1246bf 75def5e4
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -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;
};
+44 −0
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@
using namespace bluetooth;
using namespace ::ras;
using namespace ::ras::uuid;
using bluetooth::ras::VendorSpecificCharacteristic;

namespace {

@@ -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,
@@ -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,
@@ -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
@@ -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_;
@@ -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
+6 −0
Original line number Diff line number Diff line
@@ -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
+22 −0
Original line number Diff line number Diff line
@@ -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 {}

+5 −0
Original line number Diff line number Diff line
@@ -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