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

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

Merge "floss: Add advertise set-scan-rsp command"

parents 3ab0eec7 ef0cc88d
Loading
Loading
Loading
Loading
+17 −4
Original line number Diff line number Diff line
@@ -15,6 +15,9 @@ pub(crate) struct AdvSet {

    /// Advertising data.
    pub(crate) data: AdvertiseData,

    /// Scan response data.
    pub(crate) scan_rsp: AdvertiseData,
}

impl AdvSet {
@@ -33,21 +36,31 @@ impl AdvSet {
        };

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

        let scan_rsp = AdvertiseData {
            service_uuids: vec![Uuid::from([
                0x00, 0x00, 0xfe, 0xf3, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b,
                0x34, 0xfb,
            ])],
            solicit_uuids: Vec::new(),
            transport_discovery_data: Vec::new(),
            manufacturer_data: HashMap::from([(0, vec![0, 1, 2])]),
            manufacturer_data: HashMap::new(),
            service_data: HashMap::from([(
                "0000fef3-0000-1000-8000-00805f9b34fb".to_string(),
                vec![0x0a, 0x0b],
            )]),
            include_tx_power_level: true,
            include_device_name: true,
            include_tx_power_level: false,
            include_device_name: false,
        };

        AdvSet { adv_id: None, params, data }
        AdvSet { adv_id: None, params, data, scan_rsp }
    }
}
+36 −2
Original line number Diff line number Diff line
@@ -164,7 +164,11 @@ fn build_commands() -> HashMap<String, CommandOption> {
    command_options.insert(
        String::from("advertise"),
        CommandOption {
            rules: vec![String::from("advertise <on|off|set-interval>")],
            rules: vec![
                String::from("advertise <on|off>"),
                String::from("advertise set-interval <ms>"),
                String::from("advertise set-scan-rsp <enable|disable>"),
            ],
            description: String::from("Advertising utilities."),
            function_pointer: CommandHandler::cmd_advertise,
        },
@@ -947,7 +951,8 @@ impl CommandHandler {
        }
        let callback_id = self.context.lock().unwrap().advertiser_callback_id.clone().unwrap();

        enforce_arg_len(args, 1, "advertise <on|off|set-interval>", || match &args[0][0..] {
        let cmd_usage = "advertise <on|off|set-interval|set-scan-rsp>";
        enforce_arg_len(args, 1, cmd_usage, || match &args[0][0..] {
            "on" => {
                let mut context = self.context.lock().unwrap();

@@ -1004,6 +1009,35 @@ impl CommandHandler {
                    context.gatt_dbus.as_mut().unwrap().set_advertising_parameters(adv_id, params);
                }
            }
            "set-scan-rsp" => {
                if args.len() < 2 {
                    println!("usage: advertise set-scan-rsp <enable|disable>");
                    return;
                }
                let enable = match &args[1][0..] {
                    "enable" => true,
                    "disable" => false,
                    _ => false,
                };

                let mut context = self.context.lock().unwrap();
                context.adv_sets.iter_mut().for_each(|(_, s)| s.params.scannable = enable);

                let advs: Vec<(_, _, _)> = context
                    .adv_sets
                    .iter()
                    .filter_map(|(_, s)| {
                        s.adv_id
                            .map(|adv_id| (adv_id.clone(), s.params.clone(), s.scan_rsp.clone()))
                    })
                    .collect();
                for (adv_id, params, scan_rsp) in advs {
                    print_info!("Setting scan response data for {}", adv_id);
                    context.gatt_dbus.as_mut().unwrap().set_scan_response_data(adv_id, scan_rsp);
                    print_info!("Setting parameters for {}", adv_id);
                    context.gatt_dbus.as_mut().unwrap().set_advertising_parameters(adv_id, params);
                }
            }
            _ => {
                println!("Invalid argument '{}'", args[0]);
            }