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

Commit 10fcdba4 authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "floss: Extend IBluetoothGatt for BLE advertising"

parents befb02d9 43943a21
Loading
Loading
Loading
Loading
+130 −4
Original line number Original line Diff line number Diff line
use crate::dbus_iface::{
use crate::dbus_iface::{
    export_bluetooth_callback_dbus_intf, export_bluetooth_connection_callback_dbus_intf,
    export_advertising_set_callback_dbus_intf, export_bluetooth_callback_dbus_intf,
    export_bluetooth_gatt_callback_dbus_intf, export_bluetooth_manager_callback_dbus_intf,
    export_bluetooth_connection_callback_dbus_intf, export_bluetooth_gatt_callback_dbus_intf,
    export_scanner_callback_dbus_intf, export_suspend_callback_dbus_intf,
    export_bluetooth_manager_callback_dbus_intf, export_scanner_callback_dbus_intf,
    export_suspend_callback_dbus_intf,
};
};
use crate::ClientContext;
use crate::ClientContext;
use crate::{console_red, console_yellow, print_error, print_info};
use crate::{console_red, console_yellow, print_error, print_info};
@@ -11,7 +12,7 @@ use btstack::bluetooth::{
    BluetoothDevice, IBluetooth, IBluetoothCallback, IBluetoothConnectionCallback,
    BluetoothDevice, IBluetooth, IBluetoothCallback, IBluetoothConnectionCallback,
};
};
use btstack::bluetooth_gatt::{
use btstack::bluetooth_gatt::{
    BluetoothGattService, IBluetoothGattCallback, IScannerCallback, LePhy,
    BluetoothGattService, IAdvertisingSetCallback, IBluetoothGattCallback, IScannerCallback, LePhy,
};
};
use btstack::suspend::ISuspendCallback;
use btstack::suspend::ISuspendCallback;
use btstack::uuid::UuidWrapper;
use btstack::uuid::UuidWrapper;
@@ -329,6 +330,131 @@ impl RPCProxy for ScannerCallback {
    }
    }
}
}


pub(crate) struct AdvertisingSetCallback {
    objpath: String,
    _context: Arc<Mutex<ClientContext>>,

    dbus_connection: Arc<SyncConnection>,
    dbus_crossroads: Arc<Mutex<Crossroads>>,
}

impl AdvertisingSetCallback {
    pub(crate) fn new(
        objpath: String,
        _context: Arc<Mutex<ClientContext>>,
        dbus_connection: Arc<SyncConnection>,
        dbus_crossroads: Arc<Mutex<Crossroads>>,
    ) -> Self {
        Self { objpath, _context, dbus_connection, dbus_crossroads }
    }
}

impl IAdvertisingSetCallback for AdvertisingSetCallback {
    fn on_advertising_set_started(
        &self,
        reg_id: i32,
        advertiser_id: i32,
        tx_power: i32,
        status: i32,
    ) {
        print_info!(
            "on_advertising_set_started: reg_id = {}, advertiser_id = {}, tx_power = {}, status = {}",
            reg_id,
            advertiser_id,
            tx_power,
            status
        );
    }

    fn on_own_address_read(&self, advertiser_id: i32, address_type: i32, address: String) {
        print_info!(
            "on_own_address_read: advertiser_id = {}, address_type = {}, address = {}",
            advertiser_id,
            address_type,
            address
        );
    }

    fn on_advertising_set_stopped(&self, advertiser_id: i32) {
        print_info!("on_advertising_set_stopped: advertiser_id = {}", advertiser_id);
    }

    fn on_advertising_enabled(&self, advertiser_id: i32, enable: bool, status: i32) {
        print_info!(
            "on_advertising_enabled: advertiser_id = {}, enable = {}, status = {}",
            advertiser_id,
            enable,
            status
        );
    }

    fn on_advertising_data_set(&self, advertiser_id: i32, status: i32) {
        print_info!(
            "on_advertising_data_set: advertiser_id = {}, status = {}",
            advertiser_id,
            status
        );
    }

    fn on_scan_response_data_set(&self, advertiser_id: i32, status: i32) {
        print_info!(
            "on_scan_response_data_set: advertiser_id = {}, status = {}",
            advertiser_id,
            status
        );
    }

    fn on_advertising_parameters_updated(&self, advertiser_id: i32, tx_power: i32, status: i32) {
        print_info!(
            "on_advertising_parameters_updated: advertiser_id = {}, tx_power: {}, status = {}",
            advertiser_id,
            tx_power,
            status
        );
    }

    fn on_periodic_advertising_parameters_updated(&self, advertiser_id: i32, status: i32) {
        print_info!(
            "on_periodic_advertising_parameters_updated: advertiser_id = {}, status = {}",
            advertiser_id,
            status
        );
    }

    fn on_periodic_advertising_data_set(&self, advertiser_id: i32, status: i32) {
        print_info!(
            "on_periodic_advertising_data_set: advertiser_id = {}, status = {}",
            advertiser_id,
            status
        );
    }

    fn on_periodic_advertising_enabled(&self, advertiser_id: i32, enable: bool, status: i32) {
        print_info!(
            "on_periodic_advertising_enabled: advertiser_id = {}, enable = {}, status = {}",
            advertiser_id,
            enable,
            status
        );
    }
}

impl RPCProxy for AdvertisingSetCallback {
    fn get_object_id(&self) -> String {
        self.objpath.clone()
    }

    fn export_for_rpc(self: Box<Self>) {
        let cr = self.dbus_crossroads.clone();
        let iface = export_advertising_set_callback_dbus_intf(
            self.dbus_connection.clone(),
            &mut cr.lock().unwrap(),
            Arc::new(Mutex::new(DisconnectWatcher::new())),
        );
        cr.lock().unwrap().insert(self.get_object_id(), &[iface], Arc::new(Mutex::new(self)));
    }
}

pub(crate) struct BtGattCallback {
pub(crate) struct BtGattCallback {
    objpath: String,
    objpath: String,
    context: Arc<Mutex<ClientContext>>,
    context: Arc<Mutex<ClientContext>>,
+171 −62
Original line number Original line Diff line number Diff line
@@ -11,9 +11,10 @@ use btstack::bluetooth::{
    BluetoothDevice, IBluetooth, IBluetoothCallback, IBluetoothConnectionCallback, IBluetoothQA,
    BluetoothDevice, IBluetooth, IBluetoothCallback, IBluetoothConnectionCallback, IBluetoothQA,
};
};
use btstack::bluetooth_gatt::{
use btstack::bluetooth_gatt::{
    BluetoothGattCharacteristic, BluetoothGattDescriptor, BluetoothGattService,
    AdvertiseData, AdvertisingSetParameters, BluetoothGattCharacteristic, BluetoothGattDescriptor,
    GattWriteRequestStatus, GattWriteType, IBluetoothGatt, IBluetoothGattCallback,
    BluetoothGattService, GattWriteRequestStatus, GattWriteType, IAdvertisingSetCallback,
    IScannerCallback, LePhy, ScanFilter, ScanSettings,
    IBluetoothGatt, IBluetoothGattCallback, IScannerCallback, LePhy, PeriodicAdvertisingParameters,
    ScanFilter, ScanSettings,
};
};
use btstack::socket_manager::{
use btstack::socket_manager::{
    BluetoothServerSocket, BluetoothSocket, CallbackId, IBluetoothSocketManager,
    BluetoothServerSocket, BluetoothSocket, CallbackId, IBluetoothSocketManager,
@@ -41,6 +42,7 @@ use manager_service::iface_bluetooth_manager::{


use num_traits::{FromPrimitive, ToPrimitive};
use num_traits::{FromPrimitive, ToPrimitive};


use std::collections::HashMap;
use std::convert::{TryFrom, TryInto};
use std::convert::{TryFrom, TryInto};
use std::sync::Arc;
use std::sync::Arc;


@@ -570,6 +572,85 @@ impl IBluetoothManagerCallback for IBluetoothManagerCallbackDBus {
    fn on_hci_enabled_changed(&self, hci_interface: i32, enabled: bool) {}
    fn on_hci_enabled_changed(&self, hci_interface: i32, enabled: bool) {}
}
}


#[allow(dead_code)]
struct IAdvertisingSetCallbackDBus {}

impl RPCProxy for IAdvertisingSetCallbackDBus {}

#[generate_dbus_exporter(
    export_advertising_set_callback_dbus_intf,
    "org.chromium.bluetooth.AdvertisingSetCallback"
)]
impl IAdvertisingSetCallback for IAdvertisingSetCallbackDBus {
    #[dbus_method("OnAdvertisingSetStarted")]
    fn on_advertising_set_started(
        &self,
        reg_id: i32,
        advertiser_id: i32,
        tx_power: i32,
        status: i32,
    ) {
    }

    #[dbus_method("OnOwnAddressRead")]
    fn on_own_address_read(&self, advertiser_id: i32, address_type: i32, address: String) {}

    #[dbus_method("OnAdvertisingSetStopped")]
    fn on_advertising_set_stopped(&self, advertiser_id: i32) {}

    #[dbus_method("OnAdvertisingEnabled")]
    fn on_advertising_enabled(&self, advertiser_id: i32, enable: bool, status: i32) {}

    #[dbus_method("OnAdvertisingDataSet")]
    fn on_advertising_data_set(&self, advertiser_id: i32, status: i32) {}

    #[dbus_method("OnScanResponseDataSet")]
    fn on_scan_response_data_set(&self, advertiser_id: i32, status: i32) {}

    #[dbus_method("OnAdvertisingParametersUpdated")]
    fn on_advertising_parameters_updated(&self, advertiser_id: i32, tx_power: i32, status: i32) {}

    #[dbus_method("OnPeriodicAdvertisingParametersUpdated")]
    fn on_periodic_advertising_parameters_updated(&self, advertiser_id: i32, status: i32) {}

    #[dbus_method("OnPeriodicAdvertisingDataSet")]
    fn on_periodic_advertising_data_set(&self, advertiser_id: i32, status: i32) {}

    #[dbus_method("OnPeriodicAdvertisingEnabled")]
    fn on_periodic_advertising_enabled(&self, advertiser_id: i32, enable: bool, status: i32) {}
}

#[dbus_propmap(AdvertisingSetParameters)]
struct AdvertisingSetParametersDBus {
    connectable: bool,
    scannable: bool,
    is_legacy: bool,
    is_anonymous: bool,
    include_tx_power: bool,
    primary_phy: i32,
    secondary_phy: i32,
    interval: i32,
    tx_power_level: i32,
    own_address_type: i32,
}

#[dbus_propmap(AdvertiseData)]
pub struct AdvertiseDataDBus {
    service_uuids: Vec<String>,
    solicit_uuids: Vec<String>,
    transport_discovery_data: Vec<Vec<u8>>,
    manufacturer_data: HashMap<i32, Vec<u8>>,
    service_data: HashMap<String, Vec<u8>>,
    include_tx_power_level: bool,
    include_device_name: bool,
}

#[dbus_propmap(PeriodicAdvertisingParameters)]
pub struct PeriodicAdvertisingParametersDBus {
    pub include_tx_power: bool,
    pub interval: i32,
}

pub(crate) struct BluetoothGattDBusRPC {
pub(crate) struct BluetoothGattDBusRPC {
    client_proxy: ClientDBusProxy,
    client_proxy: ClientDBusProxy,
}
}
@@ -629,117 +710,145 @@ impl IBluetoothGatt for BluetoothGattDBus {
        dbus_generated!()
        dbus_generated!()
    }
    }


    // Advertising
    // Scanning
    fn register_advertiser(&self) {
        // TODO(b/233128294): implement
        todo!()
    }


    fn unregister_advertiser(&self) {
    fn scan_filter_setup(&self) {
        // TODO(b/233128294): implement
        // TODO(b/200066804): implement
        todo!()
        todo!()
    }
    }


    fn get_own_address(&self) {
    fn scan_filter_add(&self) {
        // TODO(b/233128294): implement
        // TODO(b/200066804): implement
        todo!()
        todo!()
    }
    }


    fn set_parameters(&self) {
    fn scan_filter_clear(&self) {
        // TODO(b/233128294): implement
        // TODO(b/200066804): implement
        todo!()
        todo!()
    }
    }


    fn set_data(&self) {
    fn scan_filter_enable(&self) {
        // TODO(b/233128294): implement
        // TODO(b/200066804): implement
        todo!()
        todo!()
    }
    }


    fn advertising_enable(&self) {
    fn scan_filter_disable(&self) {
        // TODO(b/233128294): implement
        // TODO(b/200066804): implement
        todo!()
        todo!()
    }
    }


    fn advertising_disable(&self) {
    fn set_scan_parameters(&self) {
        // TODO(b/233128294): implement
        // TODO(b/200066804): implement
        todo!()
        todo!()
    }
    }


    fn set_periodic_advertising_parameters(&self) {
    fn batch_scan_config_storage(&self) {
        // TODO(b/233128294): implement
        // TODO(b/200066804): implement
        todo!()
        todo!()
    }
    }


    fn set_periodic_advertising_data(&self) {
    fn batch_scan_enable(&self) {
        // TODO(b/233128294): implement
        // TODO(b/200066804): implement
        todo!()
        todo!()
    }
    }


    fn set_periodic_advertising_enable(&self) {
    fn batch_scan_disable(&self) {
        // TODO(b/233128294): implement
        // TODO(b/200066804): implement
        todo!()
        todo!()
    }
    }


    fn start_advertising(&self) {
    fn batch_scan_read_reports(&self) {
        // TODO(b/233128294): implement
        // TODO(b/200066804): implement
        todo!()
        todo!()
    }
    }


    fn start_advertising_set(&self) {
    // Advertising
        // TODO(b/233128294): implement
    #[dbus_method("RegisterAdvertiserCallback")]
        todo!()
    fn register_advertiser_callback(
        &mut self,
        callback: Box<dyn IAdvertisingSetCallback + Send>,
    ) -> u32 {
        dbus_generated!()
    }
    }


    // Scanning
    #[dbus_method("UnregisterAdvertiserCallback")]
    fn unregister_advertiser_callback(&mut self, callback_id: u32) {
        dbus_generated!()
    }


    fn scan_filter_setup(&self) {
    #[dbus_method("StartAdvertisingSet")]
        // TODO(b/200066804): implement
    fn start_advertising_set(
        todo!()
        &mut self,
        parameters: AdvertisingSetParameters,
        advertise_data: AdvertiseData,
        scan_response: Option<AdvertiseData>,
        periodic_parameters: Option<PeriodicAdvertisingParameters>,
        periodic_data: Option<AdvertiseData>,
        duration: i32,
        max_ext_adv_events: i32,
        callback_id: u32,
    ) -> i32 {
        dbus_generated!()
    }
    }


    fn scan_filter_add(&self) {
    #[dbus_method("StopAdvertisingSet")]
        // TODO(b/200066804): implement
    fn stop_advertising_set(&mut self, advertiser_id: i32) {
        todo!()
        dbus_generated!()
    }
    }


    fn scan_filter_clear(&self) {
    #[dbus_method("GetOwnAddress")]
        // TODO(b/200066804): implement
    fn get_own_address(&mut self, advertiser_id: i32) {
        todo!()
        dbus_generated!()
    }
    }


    fn scan_filter_enable(&self) {
    #[dbus_method("EnableAdvertisingSet")]
        // TODO(b/200066804): implement
    fn enable_advertising_set(
        todo!()
        &mut self,
        advertiser_id: i32,
        enable: bool,
        duration: i32,
        max_ext_adv_events: i32,
    ) {
        dbus_generated!()
    }
    }


    fn scan_filter_disable(&self) {
    #[dbus_method("SetAdvertisingData")]
        // TODO(b/200066804): implement
    fn set_advertising_data(&mut self, advertiser_id: i32, data: AdvertiseData) {
        todo!()
        dbus_generated!()
    }
    }


    fn set_scan_parameters(&self) {
    #[dbus_method("SetScanResponseData")]
        // TODO(b/200066804): implement
    fn set_scan_response_data(&mut self, advertiser_id: i32, data: AdvertiseData) {
        todo!()
        dbus_generated!()
    }
    }


    fn batch_scan_config_storage(&self) {
    #[dbus_method("SetAdvertisingParameters")]
        // TODO(b/200066804): implement
    fn set_advertising_parameters(
        todo!()
        &mut self,
        advertiser_id: i32,
        parameters: AdvertisingSetParameters,
    ) {
        dbus_generated!()
    }
    }


    fn batch_scan_enable(&self) {
    #[dbus_method("SetPeriodicAdvertisingParameters")]
        // TODO(b/200066804): implement
    fn set_periodic_advertising_parameters(
        todo!()
        &mut self,
        advertiser_id: i32,
        parameters: PeriodicAdvertisingParameters,
    ) {
        dbus_generated!()
    }
    }


    fn batch_scan_disable(&self) {
    #[dbus_method("SetPeriodicAdvertisingData")]
        // TODO(b/200066804): implement
    fn set_periodic_advertising_data(&mut self, advertiser_id: i32, data: AdvertiseData) {
        todo!()
        dbus_generated!()
    }
    }


    fn batch_scan_read_reports(&self) {
    /// Enable/Disable periodic advertising of the advertising set.
        // TODO(b/200066804): implement
    #[dbus_method("SetPeriodicAdvertisingEnable")]
        todo!()
    fn set_periodic_advertising_enable(&mut self, advertiser_id: i32, enable: bool) {
        dbus_generated!()
    }
    }


    // GATT Client
    // GATT Client
+25 −1
Original line number Original line Diff line number Diff line
@@ -8,7 +8,8 @@ use dbus_crossroads::Crossroads;
use tokio::sync::mpsc;
use tokio::sync::mpsc;


use crate::callbacks::{
use crate::callbacks::{
    BtCallback, BtConnectionCallback, BtManagerCallback, ScannerCallback, SuspendCallback,
    AdvertisingSetCallback, BtCallback, BtConnectionCallback, BtManagerCallback, ScannerCallback,
    SuspendCallback,
};
};
use crate::command_handler::CommandHandler;
use crate::command_handler::CommandHandler;
use crate::dbus_iface::{
use crate::dbus_iface::{
@@ -89,6 +90,9 @@ pub(crate) struct ClientContext {


    /// Identifies the callback to receive IScannerCallback method calls.
    /// Identifies the callback to receive IScannerCallback method calls.
    scanner_callback_id: Option<u32>,
    scanner_callback_id: Option<u32>,

    /// Identifies the callback to receive IAdvertisingSetCallback method calls.
    advertiser_callback_id: Option<u32>,
}
}


impl ClientContext {
impl ClientContext {
@@ -121,6 +125,7 @@ impl ClientContext {
            dbus_connection,
            dbus_connection,
            dbus_crossroads,
            dbus_crossroads,
            scanner_callback_id: None,
            scanner_callback_id: None,
            advertiser_callback_id: None,
        }
        }
    }
    }


@@ -378,6 +383,8 @@ async fn start_interactive_shell(
                    format!("/org/chromium/bluetooth/client/{}/suspend_callback", adapter);
                    format!("/org/chromium/bluetooth/client/{}/suspend_callback", adapter);
                let scanner_cb_objpath: String =
                let scanner_cb_objpath: String =
                    format!("/org/chromium/bluetooth/client/{}/scanner_callback", adapter);
                    format!("/org/chromium/bluetooth/client/{}/scanner_callback", adapter);
                let advertiser_cb_objpath: String =
                    format!("/org/chromium/bluetooth/client/{}/advertising_set_callback", adapter);


                let dbus_connection = context.lock().unwrap().dbus_connection.clone();
                let dbus_connection = context.lock().unwrap().dbus_connection.clone();
                let dbus_crossroads = context.lock().unwrap().dbus_crossroads.clone();
                let dbus_crossroads = context.lock().unwrap().dbus_crossroads.clone();
@@ -431,6 +438,23 @@ async fn start_interactive_shell(
                    .expect("D-Bus error on IBluetoothGatt::RegisterScannerCallback");
                    .expect("D-Bus error on IBluetoothGatt::RegisterScannerCallback");
                context.lock().unwrap().scanner_callback_id = Some(scanner_callback_id);
                context.lock().unwrap().scanner_callback_id = Some(scanner_callback_id);


                let advertiser_callback_id = context
                    .lock()
                    .unwrap()
                    .gatt_dbus
                    .as_mut()
                    .unwrap()
                    .rpc
                    .register_advertiser_callback(Box::new(AdvertisingSetCallback::new(
                        advertiser_cb_objpath.clone(),
                        context.clone(),
                        dbus_connection.clone(),
                        dbus_crossroads.clone(),
                    )))
                    .await
                    .expect("D-Bus error on IBluetoothGatt::RegisterAdvertiserCallback");
                context.lock().unwrap().advertiser_callback_id = Some(advertiser_callback_id);

                // When adapter is ready, Suspend API is also ready. Register as an observer.
                // When adapter is ready, Suspend API is also ready. Register as an observer.
                // TODO(b/224606285): Implement suspend debug utils in btclient.
                // TODO(b/224606285): Implement suspend debug utils in btclient.
                context.lock().unwrap().suspend_dbus.as_mut().unwrap().register_callback(Box::new(
                context.lock().unwrap().suspend_dbus.as_mut().unwrap().register_callback(Box::new(
+172 −50

File changed.

Preview size limit exceeded, changes collapsed.

+276 −90

File changed.

Preview size limit exceeded, changes collapsed.