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

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

Merge "floss: Implement BLE advertising methods and callbacks"

parents ccb35a8a 73ce7ccd
Loading
Loading
Loading
Loading
+39 −11
Original line number Diff line number Diff line
@@ -339,7 +339,7 @@ impl RPCProxy for ScannerCallback {

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

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

@@ -362,7 +362,7 @@ impl IAdvertisingSetCallback for AdvertisingSetCallback {
        reg_id: i32,
        advertiser_id: i32,
        tx_power: i32,
        status: i32,
        status: GattStatus,
    ) {
        print_info!(
            "on_advertising_set_started: reg_id = {}, advertiser_id = {}, tx_power = {}, status = {}",
@@ -371,6 +371,23 @@ impl IAdvertisingSetCallback for AdvertisingSetCallback {
            tx_power,
            status
        );
        if status == GattStatus::Success {
            if let Some(Some(ex_adv_id)) =
                self.context.lock().unwrap().adv_sets.insert(reg_id, Some(advertiser_id))
            {
                print_error!(
                    "on_advertising_set_started: previous advertising set ({}) registered ({}) is omitted",
                    ex_adv_id,
                    reg_id,
                    );
            }
        } else {
            print_error!(
                "on_advertising_set_started: remove advertising set registered ({})",
                reg_id
            );
            self.context.lock().unwrap().adv_sets.remove(&reg_id);
        }
    }

    fn on_own_address_read(&self, advertiser_id: i32, address_type: i32, address: String) {
@@ -384,9 +401,10 @@ impl IAdvertisingSetCallback for AdvertisingSetCallback {

    fn on_advertising_set_stopped(&self, advertiser_id: i32) {
        print_info!("on_advertising_set_stopped: advertiser_id = {}", advertiser_id);
        self.context.lock().unwrap().adv_sets.retain(|_, val| *val != Some(advertiser_id));
    }

    fn on_advertising_enabled(&self, advertiser_id: i32, enable: bool, status: i32) {
    fn on_advertising_enabled(&self, advertiser_id: i32, enable: bool, status: GattStatus) {
        print_info!(
            "on_advertising_enabled: advertiser_id = {}, enable = {}, status = {}",
            advertiser_id,
@@ -395,7 +413,7 @@ impl IAdvertisingSetCallback for AdvertisingSetCallback {
        );
    }

    fn on_advertising_data_set(&self, advertiser_id: i32, status: i32) {
    fn on_advertising_data_set(&self, advertiser_id: i32, status: GattStatus) {
        print_info!(
            "on_advertising_data_set: advertiser_id = {}, status = {}",
            advertiser_id,
@@ -403,7 +421,7 @@ impl IAdvertisingSetCallback for AdvertisingSetCallback {
        );
    }

    fn on_scan_response_data_set(&self, advertiser_id: i32, status: i32) {
    fn on_scan_response_data_set(&self, advertiser_id: i32, status: GattStatus) {
        print_info!(
            "on_scan_response_data_set: advertiser_id = {}, status = {}",
            advertiser_id,
@@ -411,7 +429,12 @@ impl IAdvertisingSetCallback for AdvertisingSetCallback {
        );
    }

    fn on_advertising_parameters_updated(&self, advertiser_id: i32, tx_power: i32, status: i32) {
    fn on_advertising_parameters_updated(
        &self,
        advertiser_id: i32,
        tx_power: i32,
        status: GattStatus,
    ) {
        print_info!(
            "on_advertising_parameters_updated: advertiser_id = {}, tx_power: {}, status = {}",
            advertiser_id,
@@ -420,7 +443,7 @@ impl IAdvertisingSetCallback for AdvertisingSetCallback {
        );
    }

    fn on_periodic_advertising_parameters_updated(&self, advertiser_id: i32, status: i32) {
    fn on_periodic_advertising_parameters_updated(&self, advertiser_id: i32, status: GattStatus) {
        print_info!(
            "on_periodic_advertising_parameters_updated: advertiser_id = {}, status = {}",
            advertiser_id,
@@ -428,7 +451,7 @@ impl IAdvertisingSetCallback for AdvertisingSetCallback {
        );
    }

    fn on_periodic_advertising_data_set(&self, advertiser_id: i32, status: i32) {
    fn on_periodic_advertising_data_set(&self, advertiser_id: i32, status: GattStatus) {
        print_info!(
            "on_periodic_advertising_data_set: advertiser_id = {}, status = {}",
            advertiser_id,
@@ -436,7 +459,12 @@ impl IAdvertisingSetCallback for AdvertisingSetCallback {
        );
    }

    fn on_periodic_advertising_enabled(&self, advertiser_id: i32, enable: bool, status: i32) {
    fn on_periodic_advertising_enabled(
        &self,
        advertiser_id: i32,
        enable: bool,
        status: GattStatus,
    ) {
        print_info!(
            "on_periodic_advertising_enabled: advertiser_id = {}, enable = {}, status = {}",
            advertiser_id,
+83 −0
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@ use crate::ClientContext;
use crate::{console_red, console_yellow, print_error, print_info};
use bt_topshim::btif::{BtConnectionState, BtTransport};
use btstack::bluetooth::{BluetoothDevice, IBluetooth, IBluetoothQA};
use btstack::bluetooth_adv::{AdvertiseData, AdvertisingSetParameters};
use btstack::bluetooth_gatt::{IBluetoothGatt, RSSISettings, ScanSettings, ScanType};
use btstack::uuid::{Profile, UuidHelper, UuidWrapper};
use manager_service::iface_bluetooth_manager::IBluetoothManager;
@@ -156,6 +157,14 @@ fn build_commands() -> HashMap<String, CommandOption> {
            function_pointer: CommandHandler::cmd_le_scan,
        },
    );
    command_options.insert(
        String::from("advertise"),
        CommandOption {
            rules: vec![String::from("advertise <on|off>")],
            description: String::from("Advertising utilities."),
            function_pointer: CommandHandler::cmd_advertise,
        },
    );
    command_options.insert(
        String::from("get-address"),
        CommandOption {
@@ -881,6 +890,80 @@ impl CommandHandler {
        });
    }

    // TODO(b/233128828): More options will be implemented to test BLE advertising.
    // Such as setting advertising parameters, starting multiple advertising sets, etc.
    fn cmd_advertise(&mut self, args: &Vec<String>) {
        if !self.context.lock().unwrap().adapter_ready {
            self.adapter_not_ready();
            return;
        }
        if self.context.lock().unwrap().advertiser_callback_id == None {
            return;
        }
        let callback_id = self.context.lock().unwrap().advertiser_callback_id.clone().unwrap();

        enforce_arg_len(args, 1, "advertise <commands>", || match &args[0][0..] {
            "on" => {
                if self.context.lock().unwrap().adv_sets.keys().len() > 0 {
                    print_error!("Already started advertising");
                    return;
                }

                let params = AdvertisingSetParameters {
                    connectable: false,
                    scannable: false,
                    is_legacy: true,
                    is_anonymous: false,
                    include_tx_power: true,
                    primary_phy: 1,
                    secondary_phy: 1,
                    interval: 160,
                    tx_power_level: -21,
                    own_address_type: 0, // random
                };

                let data = AdvertiseData {
                    service_uuids: Vec::<String>::new(),
                    solicit_uuids: Vec::<String>::new(),
                    transport_discovery_data: Vec::<Vec<u8>>::new(),
                    manufacturer_data: HashMap::<i32, Vec<u8>>::from([(0, vec![0, 1, 2])]),
                    service_data: HashMap::<String, Vec<u8>>::new(),
                    include_tx_power_level: true,
                    include_device_name: false,
                };

                let reg_id = self
                    .context
                    .lock()
                    .unwrap()
                    .gatt_dbus
                    .as_mut()
                    .unwrap()
                    .start_advertising_set(params, data, None, None, None, 0, 0, callback_id);
                print_info!("Starting advertising set for reg_id = {}", reg_id);
            }
            "off" => {
                let adv_sets = self.context.lock().unwrap().adv_sets.clone();
                for (_, val) in adv_sets.iter() {
                    if let Some(&adv_id) = val.as_ref() {
                        print_info!("Stopping advertising set {}", adv_id);
                        self.context
                            .lock()
                            .unwrap()
                            .gatt_dbus
                            .as_mut()
                            .unwrap()
                            .stop_advertising_set(adv_id);
                    }
                }
                self.context.lock().unwrap().adv_sets.clear();
            }
            _ => {
                println!("Invalid argument '{}'", args[0]);
            }
        });
    }

    /// Get the list of rules of supported commands
    pub fn get_command_rule_list(&self) -> Vec<String> {
        self.command_options.values().flat_map(|cmd| cmd.rules.clone()).collect()
+20 −8
Original line number Diff line number Diff line
@@ -629,7 +629,7 @@ impl IAdvertisingSetCallback for IAdvertisingSetCallbackDBus {
        reg_id: i32,
        advertiser_id: i32,
        tx_power: i32,
        status: i32,
        status: GattStatus,
    ) {
    }

@@ -640,25 +640,37 @@ impl IAdvertisingSetCallback for IAdvertisingSetCallbackDBus {
    fn on_advertising_set_stopped(&self, advertiser_id: i32) {}

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

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

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

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

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

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

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

#[dbus_propmap(AdvertisingSetParameters)]
+4 −0
Original line number Diff line number Diff line
@@ -96,6 +96,9 @@ pub(crate) struct ClientContext {

    /// Keeps track of active LE scanners.
    active_scanner_ids: HashSet<u8>,

    /// Advertising sets started/registered. Map from reg_id to advertiser_id.
    adv_sets: HashMap<i32, Option<i32>>,
}

impl ClientContext {
@@ -130,6 +133,7 @@ impl ClientContext {
            scanner_callback_id: None,
            advertiser_callback_id: None,
            active_scanner_ids: HashSet::new(),
            adv_sets: HashMap::new(),
        }
    }

+18 −8
Original line number Diff line number Diff line
@@ -242,7 +242,7 @@ impl IAdvertisingSetCallback for AdvertisingSetCallbackDBus {
        reg_id: i32,
        advertiser_id: i32,
        tx_power: i32,
        status: i32,
        status: GattStatus,
    ) {
        dbus_generated!()
    }
@@ -258,37 +258,47 @@ impl IAdvertisingSetCallback for AdvertisingSetCallbackDBus {
    }

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

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

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

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

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

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

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