From 29b1713be9425ec31d78de1261afde4e9440e934 Mon Sep 17 00:00:00 2001
From: Jakob Bornecrantz <jakob@collabora.com>
Date: Wed, 4 Sep 2019 12:43:57 +0100
Subject: [PATCH] xrt: Add enum xrt_device_name so that state trackers can
 reason about device

---
 src/xrt/drivers/hdk/hdk_device.cpp       |  6 ++++--
 src/xrt/drivers/hydra/hydra_driver.c     |  3 ++-
 src/xrt/drivers/ohmd/oh_device.c         |  3 ++-
 src/xrt/drivers/psmv/psmv_driver.c       |  3 ++-
 src/xrt/drivers/psvr/psvr_device.c       |  3 ++-
 src/xrt/include/xrt/xrt_defines.h        | 12 ++++++++++++
 src/xrt/include/xrt/xrt_device.h         |  9 +++++----
 src/xrt/state_trackers/oxr/oxr_system.c  |  2 +-
 src/xrt/state_trackers/prober/p_prober.c | 10 +++++-----
 src/xrt/targets/cli/cli_cmd_test.c       |  4 ++--
 10 files changed, 37 insertions(+), 18 deletions(-)

diff --git a/src/xrt/drivers/hdk/hdk_device.cpp b/src/xrt/drivers/hdk/hdk_device.cpp
index 10cf9b270..22a5549fc 100644
--- a/src/xrt/drivers/hdk/hdk_device.cpp
+++ b/src/xrt/drivers/hdk/hdk_device.cpp
@@ -272,10 +272,13 @@ hdk_device_create(struct os_hid_device *dev,
 	hd->base.get_view_pose = hdk_device_get_view_pose;
 	hd->base.destroy = hdk_device_destroy;
 	hd->base.inputs[0].name = XRT_INPUT_GENERIC_HEAD_RELATION;
+	hd->base.name = XRT_DEVICE_GENERIC_HMD;
 	hd->dev = dev;
 	hd->print_spew = print_spew;
 	hd->print_debug = print_debug;
 
+	snprintf(hd->base.str, XRT_DEVICE_NAME_LEN, "OSVR HDK-family Device");
+
 	if (variant == HDK_UNKNOWN) {
 		HDK_ERROR(hd, "Don't know which HDK variant this is.");
 		hdk_device_destroy(&hd->base);
@@ -442,8 +445,7 @@ hdk_device_create(struct os_hid_device *dev,
 
 
 	if (hd->print_debug) {
-		u_device_dump_config(&hd->base, __func__,
-		                     "OSVR HDK-family Device");
+		u_device_dump_config(&hd->base, __func__, hd->base.str);
 	}
 
 	return hd;
diff --git a/src/xrt/drivers/hydra/hydra_driver.c b/src/xrt/drivers/hydra/hydra_driver.c
index 83879efde..799791b77 100644
--- a/src/xrt/drivers/hydra/hydra_driver.c
+++ b/src/xrt/drivers/hydra/hydra_driver.c
@@ -685,7 +685,8 @@ hydra_found(struct xrt_prober *xp,
 		hd->base.update_inputs = hydra_device_update_inputs;
 		hd->base.get_tracked_pose = hydra_device_get_tracked_pose;
 		// hs->base.set_output = hydra_device_set_output;
-		snprintf(hd->base.name, XRT_DEVICE_NAME_LEN, "%s %i",
+		hd->base.name = XRT_DEVICE_HYDRA;
+		snprintf(hd->base.str, XRT_DEVICE_NAME_LEN, "%s %i",
 		         "Razer Hydra Controller", (int)(i + 1));
 		SET_INPUT(1_CLICK);
 		SET_INPUT(2_CLICK);
diff --git a/src/xrt/drivers/ohmd/oh_device.c b/src/xrt/drivers/ohmd/oh_device.c
index 7fdef5b2b..6b34318c3 100644
--- a/src/xrt/drivers/ohmd/oh_device.c
+++ b/src/xrt/drivers/ohmd/oh_device.c
@@ -353,13 +353,14 @@ oh_device_create(ohmd_context *ctx,
 	ohd->base.get_view_pose = oh_device_get_view_pose;
 	ohd->base.destroy = oh_device_destroy;
 	ohd->base.inputs[0].name = XRT_INPUT_GENERIC_HEAD_RELATION;
+	ohd->base.name = XRT_DEVICE_GENERIC_HMD;
 	ohd->ctx = ctx;
 	ohd->dev = dev;
 	ohd->print_spew = print_spew;
 	ohd->print_debug = print_debug;
 	ohd->enable_finite_difference = debug_get_bool_option_oh_finite_diff();
 
-	snprintf(ohd->base.name, XRT_DEVICE_NAME_LEN, "%s", prod);
+	snprintf(ohd->base.str, XRT_DEVICE_NAME_LEN, "%s", prod);
 
 	const struct device_info info = get_info(ohd, prod);
 
diff --git a/src/xrt/drivers/psmv/psmv_driver.c b/src/xrt/drivers/psmv/psmv_driver.c
index 8f8960d75..4f251b04b 100644
--- a/src/xrt/drivers/psmv/psmv_driver.c
+++ b/src/xrt/drivers/psmv/psmv_driver.c
@@ -477,7 +477,8 @@ psmv_found(struct xrt_prober *xp,
 	psmv->base.update_inputs = psmv_device_update_inputs;
 	psmv->base.get_tracked_pose = psmv_device_get_tracked_pose;
 	psmv->base.set_output = psmv_device_set_output;
-	snprintf(psmv->base.name, XRT_DEVICE_NAME_LEN, "%s",
+	psmv->base.name = XRT_DEVICE_PSMV;
+	snprintf(psmv->base.str, XRT_DEVICE_NAME_LEN, "%s",
 	         "PS Move Controller");
 	psmv->hid = hid;
 	SET_INPUT(PS_CLICK);
diff --git a/src/xrt/drivers/psvr/psvr_device.c b/src/xrt/drivers/psvr/psvr_device.c
index 30c599512..e8cc4bf7a 100644
--- a/src/xrt/drivers/psvr/psvr_device.c
+++ b/src/xrt/drivers/psvr/psvr_device.c
@@ -686,8 +686,9 @@ psvr_device_create(struct hid_device_info *hmd_handle_info,
 	psvr->base.get_view_pose = psvr_device_get_view_pose;
 	psvr->base.destroy = psvr_device_destroy;
 	psvr->base.inputs[0].name = XRT_INPUT_GENERIC_HEAD_RELATION;
+	psvr->base.name = XRT_DEVICE_GENERIC_HMD;
 
-	snprintf(psvr->base.name, XRT_DEVICE_NAME_LEN, "PS VR Headset");
+	snprintf(psvr->base.str, XRT_DEVICE_NAME_LEN, "PS VR Headset");
 
 	ret = open_hid(psvr, hmd_handle_info, &psvr->hmd_handle);
 	if (ret != 0) {
diff --git a/src/xrt/include/xrt/xrt_defines.h b/src/xrt/include/xrt/xrt_defines.h
index f4859377d..1637778db 100644
--- a/src/xrt/include/xrt/xrt_defines.h
+++ b/src/xrt/include/xrt/xrt_defines.h
@@ -302,6 +302,18 @@ struct xrt_space_relation
  *
  */
 
+/*!
+ * A enum that is used to name devices so that the
+ * state trackers can reason about the devices easier.
+ */
+enum xrt_device_name
+{
+	XRT_DEVICE_GENERIC_HMD = 1,
+
+	XRT_DEVICE_PSMV = 2,
+	XRT_DEVICE_HYDRA = 3,
+};
+
 /*!
  * Base type of this inputs.
  *
diff --git a/src/xrt/include/xrt/xrt_device.h b/src/xrt/include/xrt/xrt_device.h
index 31c72485d..e6453c54f 100644
--- a/src/xrt/include/xrt/xrt_device.h
+++ b/src/xrt/include/xrt/xrt_device.h
@@ -179,10 +179,11 @@ struct xrt_output
  */
 struct xrt_device
 {
-	/*!
-	 * A string describing the device.
-	 */
-	char name[XRT_DEVICE_NAME_LEN];
+	//! Enum identifier of the device.
+	enum xrt_device_name name;
+
+	//! A string describing the device.
+	char str[XRT_DEVICE_NAME_LEN];
 
 	//! Null if this device does not interface with the users head.
 	struct xrt_hmd_parts *hmd;
diff --git a/src/xrt/state_trackers/oxr/oxr_system.c b/src/xrt/state_trackers/oxr/oxr_system.c
index adc2a50ed..2c83011ea 100644
--- a/src/xrt/state_trackers/oxr/oxr_system.c
+++ b/src/xrt/state_trackers/oxr/oxr_system.c
@@ -180,7 +180,7 @@ oxr_system_get_properties(struct oxr_logger *log,
 	properties->systemId = sys->systemId;
 
 	// Needed to silence the warnings.
-	const char *name = sys->head->name;
+	const char *name = sys->head->str;
 
 	snprintf(properties->systemName, XR_MAX_SYSTEM_NAME_SIZE, "Monado: %s",
 	         name);
diff --git a/src/xrt/state_trackers/prober/p_prober.c b/src/xrt/state_trackers/prober/p_prober.c
index 007398ee9..547a0eada 100644
--- a/src/xrt/state_trackers/prober/p_prober.c
+++ b/src/xrt/state_trackers/prober/p_prober.c
@@ -414,7 +414,7 @@ handle_found_device(struct prober* p,
                     size_t num_xdevs,
                     struct xrt_device* xdev)
 {
-	P_DEBUG(p, "Found '%s' %p", xdev->name, (void*)xdev);
+	P_DEBUG(p, "Found '%s' %p", xdev->str, (void*)xdev);
 
 	// For controllers we put them after the first found HMD.
 	if (xdev->hmd == NULL) {
@@ -426,7 +426,7 @@ handle_found_device(struct prober* p,
 		}
 
 		P_ERROR(p, "Too many controller devices closing '%s'",
-		        xdev->name);
+		        xdev->str);
 		xdev->destroy(xdev);
 		return;
 	}
@@ -437,7 +437,7 @@ handle_found_device(struct prober* p,
 		return;
 	}
 
-	P_ERROR(p, "Found more then one, HMD closing '%s'", xdev->name);
+	P_ERROR(p, "Found more then one, HMD closing '%s'", xdev->str);
 	xdev->destroy(xdev);
 }
 
@@ -507,7 +507,7 @@ select_device(struct xrt_prober* xp,
 
 
 	if (xdevs[0] != NULL) {
-		P_DEBUG(p, "Found HMD! '%s'", xdevs[0]->name);
+		P_DEBUG(p, "Found HMD! '%s'", xdevs[0]->str);
 		return 0;
 	}
 
@@ -519,7 +519,7 @@ select_device(struct xrt_prober* xp,
 			continue;
 		}
 
-		P_DEBUG(p, "Destroying '%s'", xdevs[i]->name);
+		P_DEBUG(p, "Destroying '%s'", xdevs[i]->str);
 		xdevs[i]->destroy(xdevs[i]);
 		xdevs[i] = NULL;
 	}
diff --git a/src/xrt/targets/cli/cli_cmd_test.c b/src/xrt/targets/cli/cli_cmd_test.c
index 6269647f8..b8de8bf8f 100644
--- a/src/xrt/targets/cli/cli_cmd_test.c
+++ b/src/xrt/targets/cli/cli_cmd_test.c
@@ -73,7 +73,7 @@ cli_cmd_test(int argc, const char **argv)
 			continue;
 		}
 
-		printf("\tFound '%s'\n", xdevs[i]->name);
+		printf("\tFound '%s'\n", xdevs[i]->str);
 	}
 
 	// End of program
@@ -84,7 +84,7 @@ cli_cmd_test(int argc, const char **argv)
 			continue;
 		}
 
-		printf("\tDestroying '%s'\n", xdevs[i]->name);
+		printf("\tDestroying '%s'\n", xdevs[i]->str);
 
 		xdevs[i]->destroy(xdevs[i]);
 		xdevs[i] = NULL;
-- 
GitLab