client: Add scan.pattern command
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Thu, 20 Feb 2020 00:25:04 +0000 (16:25 -0800)
committerAyush Garg <ayush.garg@samsung.com>
Mon, 12 Apr 2021 09:00:48 +0000 (14:30 +0530)
This uses the new Pattern filter:

[bluetooth]# scan.pattern Living
[bluetooth]# scan on
SetDiscoveryFilter success
Discovery started
[CHG] Controller XX:XX:XX:XX:XX:XX Discovering: yes
[NEW] Device XX:XX:XX:XX:XX:XX Living Room TV

Signed-off-by: Anuj Jain <anuj01.jain@samsung.com>
Signed-off-by: Ayush Garg <ayush.garg@samsung.com>
client/main.c

index 5add8b8..1ea718d 100644 (file)
@@ -1160,6 +1160,7 @@ static void cmd_default_agent(int argc, char *argv[])
 
 static struct set_discovery_filter_args {
        char *transport;
+       char *pattern;
        dbus_uint16_t rssi;
        dbus_int16_t pathloss;
        char **uuids;
@@ -1244,6 +1245,10 @@ static void set_discovery_filter_setup(DBusMessageIter *iter, void *user_data)
                                                DBUS_TYPE_BOOLEAN,
                                                &args->discoverable);
 
+       if (args->pattern != NULL)
+               g_dbus_dict_append_entry(&dict, "Pattern", DBUS_TYPE_STRING,
+                                               &args->pattern);
+
        dbus_message_iter_close_container(iter, &dict);
 }
 
@@ -1443,6 +1448,22 @@ static void cmd_scan_filter_discoverable(int argc, char *argv[])
                set_discovery_filter(false);
 }
 
+static void cmd_scan_filter_pattern(int argc, char *argv[])
+{
+       if (argc < 2 || !strlen(argv[1])) {
+               bt_shell_printf("Pattern: %s\n", filter.pattern);
+               return bt_shell_noninteractive_quit(EXIT_SUCCESS);
+       }
+
+       free(filter.pattern);
+       filter.pattern = strdup(argv[1]);
+
+       filter.set = false;
+
+       if (filter.active)
+               set_discovery_filter(false);
+}
+
 static void filter_clear_uuids(void)
 {
        g_strfreev(filter.uuids);
@@ -1476,6 +1497,12 @@ static void filter_clear_discoverable(void)
        filter.discoverable = false;
 }
 
+static void filter_clear_pattern(void)
+{
+       free(filter.pattern);
+       filter.pattern = NULL;
+}
+
 struct clear_entry {
        const char *name;
        void (*clear) (void);
@@ -1488,6 +1515,7 @@ static const struct clear_entry filter_clear[] = {
        { "transport", filter_clear_transport },
        { "duplicate-data", filter_clear_duplicate },
        { "discoverable", filter_clear_discoverable },
+       { "pattern", filter_clear_pattern },
        {}
 };
 
@@ -2645,8 +2673,11 @@ static const struct bt_shell_menu scan_menu = {
        { "discoverable", "[on/off]", cmd_scan_filter_discoverable,
                                "Set/Get discoverable filter",
                                NULL },
+       { "pattern", "[value]", cmd_scan_filter_pattern,
+                               "Set/Get pattern filter",
+                               NULL },
        { "clear",
-               "[uuids/rssi/pathloss/transport/duplicate-data/discoverable]",
+       "[uuids/rssi/pathloss/transport/duplicate-data/discoverable/pattern]",
                                cmd_scan_filter_clear,
                                "Clears discovery filter.",
                                filter_clear_generator },