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

Commit 78509860 authored by JohnLai's avatar JohnLai
Browse files

Floss: Add GATT client command for setting connectable

Add GATT client command to set advertising connectable on/off.

Bug: 259356347
Test: Manually
Tag: #floss
Change-Id: I7a62c3dfac4d2373cd8e73dd5da48a07ec508a01
parent b2df79f1
Loading
Loading
Loading
Loading
+35 −0
Original line number Diff line number Diff line
@@ -197,6 +197,7 @@ fn build_commands() -> HashMap<String, CommandOption> {
                String::from("advertise set-interval <ms>"),
                String::from("advertise set-scan-rsp <enable|disable>"),
                String::from("advertise set-raw-data <raw-adv-data> <adv-id>"),
                String::from("advertise set-connectable <on|off> <adv-id>"),
            ],
            description: String::from("Advertising utilities."),
            function_pointer: CommandHandler::cmd_advertise,
@@ -1232,6 +1233,40 @@ impl CommandHandler {
                    context.gatt_dbus.as_mut().unwrap().set_advertising_parameters(adv_id, params);
                }
            }
            "set-connectable" => {
                let connectable = match &get_arg(args, 1)?[..] {
                    "on" => true,
                    "off" => false,
                    _ => false,
                };

                let adv_id = String::from(get_arg(args, 2)?)
                    .parse::<i32>()
                    .or(Err("Failed parsing adv_id"))?;

                let mut context = self.context.lock().unwrap();

                let advs: Vec<(_, _)> = context
                    .adv_sets
                    .iter_mut()
                    .filter_map(|(_, s)| {
                        if !(s.adv_id.map_or(false, |id| id == adv_id)) {
                            return None;
                        }
                        s.params.connectable = connectable;
                        Some((s.params.clone(), s.data.clone()))
                    })
                    .collect();

                for (params, data) in advs {
                    print_info!("Setting advertising parameters for {}", adv_id);
                    context.gatt_dbus.as_mut().unwrap().set_advertising_parameters(adv_id, params);

                    // renew the flags
                    print_info!("Setting advertising data for {}", adv_id);
                    context.gatt_dbus.as_mut().unwrap().set_advertising_data(adv_id, data);
                }
            }
            "set-scan-rsp" => {
                let enable = match &get_arg(args, 1)?[..] {
                    "enable" => true,