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

Commit 0c59803d authored by Sonny Sasaka's avatar Sonny Sasaka
Browse files

floss: Add commands to btclient

This adds list-devices, adapter show, and renamed get_address to
get-address.

Bug: 199213563
Tag: #floss
Test: Run btclient on chromeos

Change-Id: I3c7a5121dcdd4d4519386f7661a4e63a1296596a
parent 9475247b
Loading
Loading
Loading
Loading
+32 −3
Original line number Diff line number Diff line
@@ -67,7 +67,9 @@ fn build_commands() -> HashMap<String, CommandOption> {
    command_options.insert(
        String::from("adapter"),
        CommandOption {
            description: String::from("Enable/Disable Bluetooth adapter. (e.g. adapter enable)"),
            description: String::from(
                "Enable/Disable/Show default bluetooth adapter. (e.g. adapter enable)",
            ),
            function_pointer: CommandHandler::cmd_adapter,
        },
    );
@@ -86,7 +88,7 @@ fn build_commands() -> HashMap<String, CommandOption> {
        },
    );
    command_options.insert(
        String::from("get_address"),
        String::from("get-address"),
        CommandOption {
            description: String::from("Gets the local device address."),
            function_pointer: CommandHandler::cmd_get_address,
@@ -99,6 +101,15 @@ fn build_commands() -> HashMap<String, CommandOption> {
            function_pointer: CommandHandler::cmd_help,
        },
    );
    command_options.insert(
        String::from("list-devices"),
        CommandOption {
            description: String::from(
                "List known remote devices from most recent discovery session.",
            ),
            function_pointer: CommandHandler::cmd_list_devices,
        },
    );
    command_options.insert(
        String::from("quit"),
        CommandOption {
@@ -190,13 +201,22 @@ impl CommandHandler {

    fn cmd_adapter(&mut self, args: &Vec<String>) {
        let default_adapter = self.context.lock().unwrap().default_adapter;
        enforce_arg_len(args, 1, "adapter <enable|disable>", || match &args[0][0..] {
        enforce_arg_len(args, 1, "adapter <enable|disable|show>", || match &args[0][0..] {
            "enable" => {
                self.context.lock().unwrap().manager_dbus.start(default_adapter);
            }
            "disable" => {
                self.context.lock().unwrap().manager_dbus.stop(default_adapter);
            }
            "show" => {
                let enabled = self.context.lock().unwrap().enabled;
                let address = match self.context.lock().unwrap().adapter_address.as_ref() {
                    Some(x) => x.clone(),
                    None => String::from(""),
                };
                print_info!("State: {}", if enabled { "enabled" } else { "disabled" });
                print_info!("Address: {}", address);
            }
            _ => {
                println!("Invalid argument '{}'", args[0]);
            }
@@ -211,6 +231,8 @@ impl CommandHandler {

        let address = self.context.lock().unwrap().adapter_dbus.as_ref().unwrap().get_address();
        print_info!("Local address = {}", &address);
        // Cache address for adapter show
        self.context.lock().unwrap().adapter_address = Some(address);
    }

    fn cmd_discovery(&mut self, args: &Vec<String>) {
@@ -258,6 +280,13 @@ impl CommandHandler {
    pub fn get_command_list(&self) -> Vec<String> {
        self.command_options.keys().map(|key| String::from(key)).collect::<Vec<String>>()
    }

    fn cmd_list_devices(&mut self, _args: &Vec<String>) {
        print_info!("Devices found in most recent discovery session:");
        for (key, val) in self.context.lock().unwrap().found_devices.iter() {
            print_info!("[{:18}] {}", key, val.name);
        }
    }
}

#[cfg(test)]
+29 −2
Original line number Diff line number Diff line
@@ -38,6 +38,16 @@ pub(crate) struct ClientContext {
    /// Current adapter is ready to be used?
    pub(crate) adapter_ready: bool,

    /// Current adapter address if known.
    pub(crate) adapter_address: Option<String>,

    /// Is adapter discovering?
    pub(crate) discovering_state: bool,

    /// Devices found in current discovery session. List should be cleared when a new discovery
    /// session starts so that previous results don't pollute current search.
    pub(crate) found_devices: HashMap<String, BluetoothDevice>,

    /// Proxy for manager interface.
    pub(crate) manager_dbus: BluetoothManagerDBus,

@@ -70,6 +80,9 @@ impl ClientContext {
            default_adapter: 0,
            enabled: false,
            adapter_ready: false,
            adapter_address: None,
            discovering_state: false,
            found_devices: HashMap::new(),
            manager_dbus,
            adapter_dbus: None,
            fg: tx,
@@ -157,18 +170,32 @@ impl manager_service::RPCProxy for BtManagerCallback {
/// Callback container for adapter interface callbacks.
struct BtCallback {
    objpath: String,
    context: Arc<Mutex<ClientContext>>,
}

impl IBluetoothCallback for BtCallback {
    fn on_address_changed(&self, addr: String) {
        print_info!("Address changed to {}", addr);
        print_info!("Address changed to {}", &addr);
        self.context.lock().unwrap().adapter_address = Some(addr);
    }

    fn on_device_found(&self, remote_device: BluetoothDevice) {
        self.context
            .lock()
            .unwrap()
            .found_devices
            .entry(remote_device.address.clone())
            .or_insert(remote_device.clone());

        print_info!("Found device: {:?}", remote_device);
    }

    fn on_discovering_changed(&self, discovering: bool) {
        self.context.lock().unwrap().discovering_state = discovering;

        if discovering {
            self.context.lock().unwrap().found_devices.clear();
        }
        print_info!("Discovering: {}", discovering);
    }

@@ -295,7 +322,7 @@ async fn start_interactive_shell(
                    .adapter_dbus
                    .as_mut()
                    .unwrap()
                    .register_callback(Box::new(BtCallback { objpath }));
                    .register_callback(Box::new(BtCallback { objpath, context: context.clone() }));
                context.lock().unwrap().adapter_ready = true;
            }
            ForegroundActions::Readline(result) => match result {