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

Commit 89e63229 authored by Sonny Sasaka's avatar Sonny Sasaka Committed by Gerrit Code Review
Browse files

Merge "Floss: Wire MSFT API in topshim"

parents d74dc32a ad08c67b
Loading
Loading
Loading
Loading
+67 −0
Original line number Original line Diff line number Diff line
@@ -75,6 +75,45 @@ std::vector<ApcfCommand> ConvertApcfVec(const ::rust::Vec<RustApcfCommand>& rust
  return converted;
  return converted;
}
}


std::vector<uint8_t> ConvertRustByteArray(const ::rust::Vec<uint8_t>& bytes) {
  std::vector<uint8_t> converted;

  std::copy(bytes.begin(), bytes.end(), std::back_inserter(converted));

  return converted;
}

MsftAdvMonitorPattern ConvertAdvMonitorPattern(const RustMsftAdvMonitorPattern& pattern) {
  MsftAdvMonitorPattern converted = {
      .ad_type = pattern.ad_type,
      .start_byte = pattern.start_byte,
      .pattern = ConvertRustByteArray(pattern.pattern),
  };

  return converted;
}

std::vector<MsftAdvMonitorPattern> ConvertAdvMonitorPatterns(const ::rust::Vec<RustMsftAdvMonitorPattern>& patterns) {
  std::vector<MsftAdvMonitorPattern> converted;

  for (const auto& pattern : patterns) {
    converted.push_back(ConvertAdvMonitorPattern(pattern));
  }

  return converted;
}

MsftAdvMonitor ConvertAdvMonitor(const RustMsftAdvMonitor& monitor) {
  MsftAdvMonitor converted = {
      .rssi_threshold_high = monitor.rssi_high_threshold,
      .rssi_threshold_low = monitor.rssi_low_threshold,
      .rssi_threshold_low_time_interval = monitor.rssi_low_timeout,
      .rssi_sampling_period = monitor.rssi_sampling_period,
      .patterns = ConvertAdvMonitorPatterns(monitor.patterns),
  };
  return converted;
}

::btgatt_filt_param_setup_t ConvertRustFilterParam(const RustGattFilterParam& param) {
::btgatt_filt_param_setup_t ConvertRustFilterParam(const RustGattFilterParam& param) {
  ::btgatt_filt_param_setup_t converted = {
  ::btgatt_filt_param_setup_t converted = {
      .feat_seln = param.feat_seln,
      .feat_seln = param.feat_seln,
@@ -206,6 +245,22 @@ void BleScannerIntf::ScanFilterEnable(bool enable) {
  scanner_intf_->ScanFilterEnable(enable, base::Bind(&BleScannerIntf::OnEnableCallback, base::Unretained(this)));
  scanner_intf_->ScanFilterEnable(enable, base::Bind(&BleScannerIntf::OnEnableCallback, base::Unretained(this)));
}
}


void BleScannerIntf::MsftAdvMonitorAdd(RustMsftAdvMonitor monitor) {
  scanner_intf_->MsftAdvMonitorAdd(
      internal::ConvertAdvMonitor(monitor),
      base::Bind(&BleScannerIntf::OnMsftAdvMonitorAddCallback, base::Unretained(this)));
}

void BleScannerIntf::MsftAdvMonitorRemove(uint8_t monitor_handle) {
  scanner_intf_->MsftAdvMonitorRemove(
      monitor_handle, base::Bind(&BleScannerIntf::OnMsftAdvMonitorRemoveCallback, base::Unretained(this)));
}

void BleScannerIntf::MsftAdvMonitorEnable(bool enable) {
  scanner_intf_->MsftAdvMonitorEnable(
      enable, base::Bind(&BleScannerIntf::OnMsftAdvMonitorEnableCallback, base::Unretained(this)));
}

void BleScannerIntf::SetScanParameters(uint8_t scanner_id, uint16_t scan_interval, uint16_t scan_window) {
void BleScannerIntf::SetScanParameters(uint8_t scanner_id, uint16_t scan_interval, uint16_t scan_window) {
  scanner_intf_->SetScanParameters(
  scanner_intf_->SetScanParameters(
      scanner_id,
      scanner_id,
@@ -292,6 +347,18 @@ void BleScannerIntf::OnFilterConfigCallback(
  rusty::gdscan_filter_config_callback(filter_index, filt_type, avbl_space, action, btm_status);
  rusty::gdscan_filter_config_callback(filter_index, filt_type, avbl_space, action, btm_status);
}
}


void BleScannerIntf::OnMsftAdvMonitorAddCallback(uint8_t monitor_handle, uint8_t status) {
  rusty::gdscan_msft_adv_monitor_add_callback(monitor_handle, status);
}

void BleScannerIntf::OnMsftAdvMonitorRemoveCallback(uint8_t status) {
  rusty::gdscan_msft_adv_monitor_remove_callback(status);
}

void BleScannerIntf::OnMsftAdvMonitorEnableCallback(uint8_t status) {
  rusty::gdscan_msft_adv_monitor_enable_callback(status);
}

void BleScannerIntf::OnPeriodicSyncStarted(
void BleScannerIntf::OnPeriodicSyncStarted(
    int,
    int,
    uint8_t status,
    uint8_t status,
+13 −0
Original line number Original line Diff line number Diff line
@@ -27,6 +27,7 @@ namespace topshim {
namespace rust {
namespace rust {


struct RustApcfCommand;
struct RustApcfCommand;
struct RustMsftAdvMonitor;
struct RustGattFilterParam;
struct RustGattFilterParam;
struct RustUuid;
struct RustUuid;


@@ -101,6 +102,15 @@ class BleScannerIntf : public ScanningCallbacks {
  // Enable/disable scan filter. Gets responses via |OnEnableCallback|.
  // Enable/disable scan filter. Gets responses via |OnEnableCallback|.
  void ScanFilterEnable(bool enable);
  void ScanFilterEnable(bool enable);


  // Adds an MSFT filter. Gets responses via |OnMsftAdvMonitorAddCallback|.
  void MsftAdvMonitorAdd(RustMsftAdvMonitor monitor);

  // Removes a previously added MSFT scan filter.
  void MsftAdvMonitorRemove(uint8_t monitor_handle);

  // Enables or disables MSFT advertisement monitor.
  void MsftAdvMonitorEnable(bool enable);

  // Sets the LE scan interval and window in units of N * 0.625 msec. The result
  // Sets the LE scan interval and window in units of N * 0.625 msec. The result
  // of this action is returned via |OnStatusCallback|.
  // of this action is returned via |OnStatusCallback|.
  void SetScanParameters(uint8_t scanner_id, uint16_t scan_interval, uint16_t scan_window);
  void SetScanParameters(uint8_t scanner_id, uint16_t scan_interval, uint16_t scan_window);
@@ -161,6 +171,9 @@ class BleScannerIntf : public ScanningCallbacks {
  void OnFilterParamSetupCallback(uint8_t scanner_id, uint8_t avbl_space, uint8_t action_type, uint8_t btm_status);
  void OnFilterParamSetupCallback(uint8_t scanner_id, uint8_t avbl_space, uint8_t action_type, uint8_t btm_status);
  void OnFilterConfigCallback(
  void OnFilterConfigCallback(
      uint8_t filt_index, uint8_t filt_type, uint8_t avbl_space, uint8_t action, uint8_t btm_status);
      uint8_t filt_index, uint8_t filt_type, uint8_t avbl_space, uint8_t action, uint8_t btm_status);
  void OnMsftAdvMonitorAddCallback(uint8_t monitor_handle, uint8_t status);
  void OnMsftAdvMonitorRemoveCallback(uint8_t status);
  void OnMsftAdvMonitorEnableCallback(uint8_t status);


  BleScannerInterface* scanner_intf_;
  BleScannerInterface* scanner_intf_;
};
};
+55 −0
Original line number Original line Diff line number Diff line
@@ -83,6 +83,24 @@ pub mod ffi {
        irk: [u8; 16],
        irk: [u8; 16],
    }
    }


    // Defined in C++ and needs a translation in shim.
    #[derive(Debug, Clone)]
    pub struct RustMsftAdvMonitorPattern {
        pub ad_type: u8,
        pub start_byte: u8,
        pub pattern: Vec<u8>,
    }

    // Defined in C++ and needs a translation in shim.
    #[derive(Debug, Clone)]
    pub struct RustMsftAdvMonitor {
        pub rssi_high_threshold: u8,
        pub rssi_low_threshold: u8,
        pub rssi_low_timeout: u8,
        pub rssi_sampling_period: u8,
        pub patterns: Vec<RustMsftAdvMonitorPattern>,
    }

    #[derive(Debug, Clone)]
    #[derive(Debug, Clone)]
    pub struct RustAdvertiseParameters {
    pub struct RustAdvertiseParameters {
        advertising_event_properties: u16,
        advertising_event_properties: u16,
@@ -144,6 +162,9 @@ pub mod ffi {
        );
        );
        fn ScanFilterClear(self: Pin<&mut BleScannerIntf>, filter_index: u8);
        fn ScanFilterClear(self: Pin<&mut BleScannerIntf>, filter_index: u8);
        fn ScanFilterEnable(self: Pin<&mut BleScannerIntf>, enable: bool);
        fn ScanFilterEnable(self: Pin<&mut BleScannerIntf>, enable: bool);
        fn MsftAdvMonitorAdd(self: Pin<&mut BleScannerIntf>, monitor: RustMsftAdvMonitor);
        fn MsftAdvMonitorRemove(self: Pin<&mut BleScannerIntf>, monitor_handle: u8);
        fn MsftAdvMonitorEnable(self: Pin<&mut BleScannerIntf>, enable: bool);
        fn SetScanParameters(
        fn SetScanParameters(
            self: Pin<&mut BleScannerIntf>,
            self: Pin<&mut BleScannerIntf>,
            scanner_id: u8,
            scanner_id: u8,
@@ -249,6 +270,9 @@ pub mod ffi {
            action: u8,
            action: u8,
            btm_status: u8,
            btm_status: u8,
        );
        );
        unsafe fn gdscan_msft_adv_monitor_add_callback(monitor_handle: u8, status: u8);
        unsafe fn gdscan_msft_adv_monitor_remove_callback(status: u8);
        unsafe fn gdscan_msft_adv_monitor_enable_callback(status: u8);
        unsafe fn gdscan_start_sync_callback(
        unsafe fn gdscan_start_sync_callback(
            status: u8,
            status: u8,
            sync_handle: u16,
            sync_handle: u16,
@@ -366,6 +390,7 @@ pub mod ffi {
pub type AdvertisingTrackInfo = ffi::RustAdvertisingTrackInfo;
pub type AdvertisingTrackInfo = ffi::RustAdvertisingTrackInfo;
pub type GattFilterParam = ffi::RustGattFilterParam;
pub type GattFilterParam = ffi::RustGattFilterParam;
pub type ApcfCommand = ffi::RustApcfCommand;
pub type ApcfCommand = ffi::RustApcfCommand;
pub type MsftAdvMonitor = ffi::RustMsftAdvMonitor;
pub type AdvertiseParameters = ffi::RustAdvertiseParameters;
pub type AdvertiseParameters = ffi::RustAdvertiseParameters;
pub type PeriodicAdvertisingParameters = ffi::RustPeriodicAdvertisingParameters;
pub type PeriodicAdvertisingParameters = ffi::RustPeriodicAdvertisingParameters;


@@ -900,6 +925,15 @@ pub enum GattScannerInbandCallbacks {
    /// Params: Filter Index, Filter Type, Available Space, Action, BTM Status
    /// Params: Filter Index, Filter Type, Available Space, Action, BTM Status
    FilterConfigCallback(u8, u8, u8, u8, u8),
    FilterConfigCallback(u8, u8, u8, u8, u8),


    /// Params: Monitor handle, status
    MsftAdvMonitorAddCallback(u8, u8),

    /// Params: status
    MsftAdvMonitorRemoveCallback(u8),

    /// Params: status
    MsftAdvMonitorEnableCallback(u8),

    /// Params: Status, Sync Handle, Advertising Sid, Address Type, Address, Phy, Interval
    /// Params: Status, Sync Handle, Advertising Sid, Address Type, Address, Phy, Interval
    StartSyncCallback(u8, u16, u8, u8, RawAddress, u8, u16),
    StartSyncCallback(u8, u16, u8, u8, RawAddress, u8, u16),


@@ -930,6 +964,15 @@ cb_variant!(GDScannerInbandCb,
cb_variant!(GDScannerInbandCb,
cb_variant!(GDScannerInbandCb,
    gdscan_filter_config_callback -> GattScannerInbandCallbacks::FilterConfigCallback,
    gdscan_filter_config_callback -> GattScannerInbandCallbacks::FilterConfigCallback,
    u8, u8, u8, u8, u8);
    u8, u8, u8, u8, u8);
cb_variant!(GDScannerInbandCb,
    gdscan_msft_adv_monitor_add_callback -> GattScannerInbandCallbacks::MsftAdvMonitorAddCallback,
    u8, u8);
cb_variant!(GDScannerInbandCb,
    gdscan_msft_adv_monitor_remove_callback -> GattScannerInbandCallbacks::MsftAdvMonitorRemoveCallback,
    u8);
cb_variant!(GDScannerInbandCb,
    gdscan_msft_adv_monitor_enable_callback -> GattScannerInbandCallbacks::MsftAdvMonitorEnableCallback,
    u8);
cb_variant!(GDScannerInbandCb,
cb_variant!(GDScannerInbandCb,
gdscan_start_sync_callback -> GattScannerInbandCallbacks::StartSyncCallback,
gdscan_start_sync_callback -> GattScannerInbandCallbacks::StartSyncCallback,
u8, u16, u8, u8, *const RawAddress, u8, u16, {
u8, u16, u8, u8, *const RawAddress, u8, u16, {
@@ -1421,6 +1464,18 @@ impl BleScanner {
        mutcxxcall!(self, ScanFilterEnable, false);
        mutcxxcall!(self, ScanFilterEnable, false);
    }
    }


    pub fn msft_adv_monitor_add(&mut self, monitor: MsftAdvMonitor) {
        mutcxxcall!(self, MsftAdvMonitorAdd, monitor);
    }

    pub fn msft_adv_monitor_remove(&mut self, monitor_handle: u8) {
        mutcxxcall!(self, MsftAdvMonitorRemove, monitor_handle);
    }

    pub fn msft_adv_monitor_enable(&mut self, enable: bool) {
        mutcxxcall!(self, MsftAdvMonitorEnable, enable);
    }

    pub fn set_scan_parameters(&mut self, scanner_id: u8, scan_interval: u16, scan_window: u16) {
    pub fn set_scan_parameters(&mut self, scanner_id: u8, scan_interval: u16, scan_window: u16) {
        mutcxxcall!(self, SetScanParameters, scanner_id, scan_interval, scan_window);
        mutcxxcall!(self, SetScanParameters, scanner_id, scan_interval, scan_window);
    }
    }