[PATCH 08/10] android/client: Add tab completion to GATT client

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This patch adds tab completion to GATT client methods.
---
 android/client/if-gatt.c |  209 +++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 187 insertions(+), 22 deletions(-)

diff --git a/android/client/if-gatt.c b/android/client/if-gatt.c
index 62e0a81..3fe55e8 100644
--- a/android/client/if-gatt.c
+++ b/android/client/if-gatt.c
@@ -356,12 +356,20 @@ static char *btgatt_read_params_t2str(const btgatt_read_params_t *data,
 
 /* BT-GATT Client callbacks. */
 
+/* Cache client_if and conn_id for tab completion */
+static char client_if_str[20];
+static char conn_id_str[20];
+/* Cache address for tab completion */
+static char last_addr[MAX_ADDR_STR_LEN];
+
 /* Callback invoked in response to register_client */
 static void gattc_register_client_cb(int status, int client_if,
 							bt_uuid_t *app_uuid)
 {
 	char buf[MAX_UUID_STR_LEN];
 
+	snprintf(client_if_str, sizeof(client_if_str), "%d", client_if);
+
 	haltest_info("%s: status=%d client_if=%d app_uuid=%s\n", __func__,
 						status, client_if,
 						gatt_uuid_t2str(app_uuid, buf));
@@ -380,11 +388,9 @@ static void gattc_scan_result_cb(bt_bdaddr_t *bda, int rssi, uint8_t *adv_data)
 static void gattc_connect_cb(int conn_id, int status, int client_if,
 							bt_bdaddr_t *bda)
 {
-	char buf[MAX_ADDR_STR_LEN];
-
 	haltest_info("%s: conn_id=%d status=%d, client_if=%d bda=%s\n",
 					__func__, conn_id, status, client_if,
-					bt_bdaddr_t2str(bda, buf));
+					bt_bdaddr_t2str(bda, last_addr));
 }
 
 /* Callback invoked in response to close */
@@ -740,6 +746,15 @@ static void register_client_p(int argc, const char **argv)
 
 /* unregister_client */
 
+static void unregister_client_c(int argc, const char **argv,
+					enum_func *enum_func, void **user)
+{
+	if (argc == 3) {
+		*user = client_if_str;
+		*enum_func = enum_one_string;
+	}
+}
+
 static void unregister_client_p(int argc, const char **argv)
 {
 	int client_if;
@@ -752,6 +767,9 @@ static void unregister_client_p(int argc, const char **argv)
 
 /* scan */
 
+/* Same completion as unregister for now, start stop is not auto completed */
+#define scan_c unregister_client_c
+
 static void scan_p(int argc, const char **argv)
 {
 	int client_if;
@@ -770,6 +788,18 @@ static void scan_p(int argc, const char **argv)
 
 /* connect */
 
+static void connect_c(int argc, const char **argv, enum_func *enum_func,
+								void **user)
+{
+	if (argc == 3) {
+		*user = client_if_str;
+		*enum_func = enum_one_string;
+	} else if (argc == 4) {
+		*user = NULL;
+		*enum_func = enum_devices;
+	}
+}
+
 static void connect_p(int argc, const char **argv)
 {
 	int client_if;
@@ -789,6 +819,21 @@ static void connect_p(int argc, const char **argv)
 
 /* disconnect */
 
+static void disconnect_c(int argc, const char **argv, enum_func *enum_func,
+								void **user)
+{
+	if (argc == 3) {
+		*user = client_if_str;
+		*enum_func = enum_one_string;
+	} else if (argc == 4) {
+		*user = last_addr;
+		*enum_func = enum_one_string;
+	} else if (argc == 5) {
+		*user = conn_id_str;
+		*enum_func = enum_one_string;
+	}
+}
+
 static void disconnect_p(int argc, const char **argv)
 {
 	int client_if;
@@ -805,6 +850,17 @@ static void disconnect_p(int argc, const char **argv)
 
 /* refresh */
 
+static void refresh_c(int argc, const char **argv, enum_func *enum_func,
+								void **user)
+{
+	if (argc == 3) {
+		*user = client_if_str;
+		*enum_func = enum_one_string;
+	} else if (argc == 4) {
+		*enum_func = enum_devices;
+	}
+}
+
 static void refresh_p(int argc, const char **argv)
 {
 	int client_if;
@@ -819,6 +875,15 @@ static void refresh_p(int argc, const char **argv)
 
 /* search_service */
 
+static void search_service_c(int argc, const char **argv, enum_func *enum_func,
+								void **user)
+{
+	if (argc == 3) {
+		*user = conn_id_str;
+		*enum_func = enum_one_string;
+	}
+}
+
 static void search_service_p(int argc, const char **argv)
 {
 	int conn_id;
@@ -839,6 +904,15 @@ static void search_service_p(int argc, const char **argv)
 
 /* get_included_service */
 
+static void get_included_service_c(int argc, const char **argv,
+					enum_func *enum_func, void **user)
+{
+	if (argc == 3) {
+		*user = conn_id_str;
+		*enum_func = enum_one_string;
+	}
+}
+
 static void get_included_service_p(int argc, const char **argv)
 {
 	int conn_id;
@@ -853,6 +927,9 @@ static void get_included_service_p(int argc, const char **argv)
 
 /* get_characteristic */
 
+/* Same completion as get_included_service_c */
+#define get_characteristic_c get_included_service_c
+
 static void get_characteristic_p(int argc, const char **argv)
 {
 	int conn_id;
@@ -867,6 +944,9 @@ static void get_characteristic_p(int argc, const char **argv)
 
 /* get_descriptor */
 
+/* Same completion as get_included_service_c */
+#define get_descriptor_c get_included_service_c
+
 static void get_descriptor_p(int argc, const char **argv)
 {
 	int conn_id;
@@ -884,6 +964,9 @@ static void get_descriptor_p(int argc, const char **argv)
 
 /* read_characteristic */
 
+/* Same completion as get_included_service_c */
+#define read_characteristic_c get_included_service_c
+
 static void read_characteristic_p(int argc, const char **argv)
 {
 	int conn_id;
@@ -906,6 +989,24 @@ static void read_characteristic_p(int argc, const char **argv)
 
 /* write_characteristic */
 
+static void write_characteristic_c(int argc, const char **argv,
+					enum_func *enum_func, void **user)
+{
+	/*
+	 * This should be from tGATT_WRITE_TYPE but it's burried
+	 * inside bluedroid guts
+	 */
+	static const char *wrtypes[] = { "1", "2", "3", NULL };
+
+	if (argc == 3) {
+		*user = conn_id_str;
+		*enum_func = enum_one_string;
+	} else if (argc == 6) {
+		*user = wrtypes;
+		*enum_func = enum_strings;
+	}
+}
+
 static void write_characteristic_p(int argc, const char **argv)
 {
 	int conn_id;
@@ -950,6 +1051,9 @@ static void write_characteristic_p(int argc, const char **argv)
 
 /* read_descriptor */
 
+/* Same completion as get_included_service_c */
+#define read_descriptor_c get_included_service_c
+
 static void read_descriptor_p(int argc, const char **argv)
 {
 	int conn_id;
@@ -974,6 +1078,24 @@ static void read_descriptor_p(int argc, const char **argv)
 
 /* write_descriptor */
 
+static void write_descriptor_c(int argc, const char **argv,
+					enum_func *enum_func, void **user)
+{
+	/*
+	 * This should be from tGATT_WRITE_TYPE but it's burried
+	 * inside bluedroid guts
+	 */
+	static const char *wrtypes[] = { "1", "2", "3", NULL };
+
+	if (argc == 3) {
+		*user = conn_id_str;
+		*enum_func = enum_one_string;
+	} else if (argc == 7) {
+		*user = wrtypes;
+		*enum_func = enum_strings;
+	}
+}
+
 static void write_descriptor_p(int argc, const char **argv)
 {
 	int conn_id;
@@ -1020,6 +1142,9 @@ static void write_descriptor_p(int argc, const char **argv)
 
 /* execute_write */
 
+/* Same completion as search_service */
+#define execute_write_c search_service_c
+
 static void execute_write_p(int argc, const char **argv)
 {
 	int conn_id;
@@ -1040,6 +1165,18 @@ static void execute_write_p(int argc, const char **argv)
 
 /* register_for_notification */
 
+static void register_for_notification_c(int argc, const char **argv,
+					enum_func *enum_func, void **user)
+{
+	if (argc == 3) {
+		*user = client_if_str;
+		*enum_func = enum_one_string;
+	} else if (argc == 4) {
+		*user = last_addr;
+		*enum_func = enum_one_string;
+	}
+}
+
 static void register_for_notification_p(int argc, const char **argv)
 {
 	int client_if;
@@ -1059,6 +1196,9 @@ static void register_for_notification_p(int argc, const char **argv)
 
 /* deregister_for_notification */
 
+/* Same completion as search_service */
+#define deregister_for_notification_c register_for_notification_c
+
 static void deregister_for_notification_p(int argc, const char **argv)
 {
 	int client_if;
@@ -1078,6 +1218,17 @@ static void deregister_for_notification_p(int argc, const char **argv)
 
 /* read_remote_rssi */
 
+static void read_remote_rssi_c(int argc, const char **argv,
+					enum_func *enum_func, void **user)
+{
+	if (argc == 3) {
+		*user = client_if_str;
+		*enum_func = enum_one_string;
+	} else if (argc == 4) {
+		*enum_func = enum_devices;
+	}
+}
+
 static void read_remote_rssi_p(int argc, const char **argv)
 {
 	int client_if;
@@ -1092,6 +1243,13 @@ static void read_remote_rssi_p(int argc, const char **argv)
 
 /* get_device_type */
 
+static void get_device_type_c(int argc, const char **argv, enum_func *enum_func,
+								void **user)
+{
+	if (argc == 3)
+		*enum_func = enum_devices;
+}
+
 static void get_device_type_p(int argc, const char **argv)
 {
 	bt_bdaddr_t bd_addr;
@@ -1106,6 +1264,13 @@ static void get_device_type_p(int argc, const char **argv)
 
 /* test_command */
 
+static void test_command_c(int argc, const char **argv, enum_func *enum_func,
+								void **user)
+{
+	if (argc == 4)
+		*enum_func = enum_devices;
+}
+
 static void test_command_p(int argc, const char **argv)
 {
 	int command;
@@ -1138,31 +1303,31 @@ static void test_command_p(int argc, const char **argv)
 
 static struct method client_methods[] = {
 	STD_METHODH(register_client, "[<uuid>]"),
-	STD_METHODH(unregister_client, "<client_if>"),
-	STD_METHODH(scan, "<client_if> [1|0]"),
-	STD_METHODH(connect, "<client_if> <addr> [<is_direct>]"),
-	STD_METHODH(disconnect, "<client_if> <addr> <conn_id>"),
-	STD_METHODH(refresh, "<client_if> <addr>"),
-	STD_METHODH(search_service, "<conn_id> [<uuid>]"),
-	STD_METHODH(get_included_service, "<conn_id> <srvc_id>"),
-	STD_METHODH(get_characteristic, "<conn_id> <srvc_id>"),
-	STD_METHODH(get_descriptor, "<conn_id> <srvc_id> <char_id>"),
-	STD_METHODH(read_characteristic,
+	STD_METHODCH(unregister_client, "<client_if>"),
+	STD_METHODCH(scan, "<client_if> [1|0]"),
+	STD_METHODCH(connect, "<client_if> <addr> [<is_direct>]"),
+	STD_METHODCH(disconnect, "<client_if> <addr> <conn_id>"),
+	STD_METHODCH(refresh, "<client_if> <addr>"),
+	STD_METHODCH(search_service, "<conn_id> [<uuid>]"),
+	STD_METHODCH(get_included_service, "<conn_id> <srvc_id>"),
+	STD_METHODCH(get_characteristic, "<conn_id> <srvc_id>"),
+	STD_METHODCH(get_descriptor, "<conn_id> <srvc_id> <char_id>"),
+	STD_METHODCH(read_characteristic,
 			"<conn_id> <srvc_id> <char_id> [<auth_req>]"),
-	STD_METHODH(write_characteristic,
+	STD_METHODCH(write_characteristic,
 			"<conn_id> <srvc_id> <char_id> <write_type> <hex_value> [<auth_req>]"),
-	STD_METHODH(read_descriptor,
+	STD_METHODCH(read_descriptor,
 			"<conn_id> <srvc_id> <char_id> <descr_id> [<auth_req>]"),
-	STD_METHODH(write_descriptor,
+	STD_METHODCH(write_descriptor,
 			"<conn_id> <srvc_id> <char_id> <descr_id> <write_type> <hex_value> [<auth_req>]"),
-	STD_METHODH(execute_write, "<conn_id> <execute>"),
-	STD_METHODH(register_for_notification,
+	STD_METHODCH(execute_write, "<conn_id> <execute>"),
+	STD_METHODCH(register_for_notification,
 			"<client_if> <addr> <srvc_id> <char_id>"),
-	STD_METHODH(deregister_for_notification,
+	STD_METHODCH(deregister_for_notification,
 			"<client_if> <addr> <srvc_id> <char_id>"),
-	STD_METHODH(read_remote_rssi, "<client_if> <addr>"),
-	STD_METHODH(get_device_type, "<addr>"),
-	STD_METHODH(test_command,
+	STD_METHODCH(read_remote_rssi, "<client_if> <addr>"),
+	STD_METHODCH(get_device_type, "<addr>"),
+	STD_METHODCH(test_command,
 			"<cmd> <addr> <uuid> [u1] [u2] [u3] [u4] [u5]"),
 	END_METHOD
 };
-- 
1.7.9.5

--
To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux