diff --git a/src/xrt/auxiliary/util/u_pretty_print.c b/src/xrt/auxiliary/util/u_pretty_print.c index 05a98c1da..7fef52067 100644 --- a/src/xrt/auxiliary/util/u_pretty_print.c +++ b/src/xrt/auxiliary/util/u_pretty_print.c @@ -1,4 +1,5 @@ // Copyright 2022-2024, Collabora, Ltd. +// Copyright 2025, NVIDIA CORPORATION. // SPDX-License-Identifier: BSL-1.0 /*! * @file @@ -39,8 +40,20 @@ get_xrt_input_type_short_str(enum xrt_input_type type) case XRT_INPUT_TYPE_HAND_TRACKING: return "HAND_TRACKING"; case XRT_INPUT_TYPE_FACE_TRACKING: return "FACE_TRACKING"; case XRT_INPUT_TYPE_BODY_TRACKING: return "BODY_TRACKING"; - default: return ""; } + + return ""; +} + +const char * +get_xrt_output_type_short_str(enum xrt_output_type type) +{ + switch (type) { + case XRT_OUTPUT_TYPE_VIBRATION: return "XRT_OUTPUT_TYPE_VIBRATION"; + case XRT_OUTPUT_TYPE_FORCE_FEEDBACK: return "XRT_OUTPUT_TYPE_FORCE_FEEDBACK"; + } + + return ""; } void @@ -68,6 +81,61 @@ stack_only_sink(void *ptr, const char *str, size_t length) } +/* + * + * 'Exported' str functions. + * + */ + +const char * +u_str_xrt_input_name_or_null(enum xrt_input_name name) +{ +#define XRT_INPUT_LIST_TO_CASE(NAME, _) \ + case NAME: return #NAME; + + // No default case so we get warnings of missing entries. + switch (name) { + XRT_INPUT_LIST(XRT_INPUT_LIST_TO_CASE) + } + +#undef XRT_INPUT_LIST_TO_CASE + + return NULL; +} + +const char * +u_str_xrt_output_name_or_null(enum xrt_output_name name) +{ +#define XRT_OUTPUT_LIST_TO_CASE(NAME, _) \ + case NAME: return #NAME; + + // No default case so we get warnings of missing entries. + switch (name) { + XRT_OUTPUT_LIST(XRT_OUTPUT_LIST_TO_CASE) + } + +#undef XRT_OUTPUT_LIST_TO_CASE + + return NULL; +} + +const char * +u_str_xrt_device_name_or_null(enum xrt_device_name name) +{ +#define XRT_DEVICE_NAME_LIST_TO_CASE(NAME) \ + case NAME: return #NAME; + + // No default case so we get warnings of missing entries. + switch (name) { + XRT_DEVICE_NAME_LIST(XRT_DEVICE_NAME_LIST_TO_CASE) + } + +#undef XRT_DEVICE_NAME_LIST_TO_CASE + + return NULL; +} + + /* * * 'Exported' functions. @@ -112,17 +180,13 @@ u_pp(struct u_pp_delegate dg, const char *fmt, ...) void u_pp_xrt_input_name(struct u_pp_delegate dg, enum xrt_input_name name) { -#define XRT_INPUT_LIST_TO_CASE(NAME, _) \ - case NAME: DG(#NAME); return; - - switch (name) { - XRT_INPUT_LIST(XRT_INPUT_LIST_TO_CASE) + const char *might_be_null = u_str_xrt_input_name_or_null(name); + if (might_be_null != NULL) { + DG(might_be_null); + return; } -#undef XRT_INPUT_LIST_TO_CASE - /* - * No default case so we get warnings of missing entries. * Invalid values handled below. */ @@ -136,52 +200,21 @@ u_pp_xrt_input_name(struct u_pp_delegate dg, enum xrt_input_name name) void u_pp_xrt_output_name(struct u_pp_delegate dg, enum xrt_output_name name) { -#define XRT_OUTPUT_CASE(NAME) \ - case NAME: DG(#NAME); return - - switch (name) { - XRT_OUTPUT_CASE(XRT_OUTPUT_NAME_SIMPLE_VIBRATION); - XRT_OUTPUT_CASE(XRT_OUTPUT_NAME_PSMV_RUMBLE_VIBRATION); - XRT_OUTPUT_CASE(XRT_OUTPUT_NAME_INDEX_HAPTIC); - XRT_OUTPUT_CASE(XRT_OUTPUT_NAME_VIVE_HAPTIC); - XRT_OUTPUT_CASE(XRT_OUTPUT_NAME_WMR_HAPTIC); - - XRT_OUTPUT_CASE(XRT_OUTPUT_NAME_XBOX_HAPTIC_LEFT); - XRT_OUTPUT_CASE(XRT_OUTPUT_NAME_XBOX_HAPTIC_RIGHT); - XRT_OUTPUT_CASE(XRT_OUTPUT_NAME_XBOX_HAPTIC_LEFT_TRIGGER); - XRT_OUTPUT_CASE(XRT_OUTPUT_NAME_XBOX_HAPTIC_RIGHT_TRIGGER); - - XRT_OUTPUT_CASE(XRT_OUTPUT_NAME_TOUCH_HAPTIC); - - XRT_OUTPUT_CASE(XRT_OUTPUT_NAME_FORCE_FEEDBACK_LEFT); - XRT_OUTPUT_CASE(XRT_OUTPUT_NAME_FORCE_FEEDBACK_RIGHT); - - XRT_OUTPUT_CASE(XRT_OUTPUT_NAME_G2_CONTROLLER_HAPTIC); - XRT_OUTPUT_CASE(XRT_OUTPUT_NAME_ODYSSEY_CONTROLLER_HAPTIC); - XRT_OUTPUT_CASE(XRT_OUTPUT_NAME_ML2_CONTROLLER_VIBRATION); - - XRT_OUTPUT_CASE(XRT_OUTPUT_NAME_PSSENSE_VIBRATION); - XRT_OUTPUT_CASE(XRT_OUTPUT_NAME_PSSENSE_TRIGGER_FEEDBACK); - - XRT_OUTPUT_CASE(XRT_OUTPUT_NAME_VIVE_TRACKER_HAPTIC); - - XRT_OUTPUT_CASE(XRT_OUTPUT_NAME_OPPO_MR_HAPTIC); - - XRT_OUTPUT_CASE(XRT_OUTPUT_NAME_PICO_NEO3_HAPTIC); - XRT_OUTPUT_CASE(XRT_OUTPUT_NAME_PICO4_HAPTIC); - - XRT_OUTPUT_CASE(XRT_OUTPUT_NAME_VIVE_COSMOS_HAPTIC); - XRT_OUTPUT_CASE(XRT_OUTPUT_NAME_VIVE_FOCUS3_HAPTIC); + const char *might_be_null = u_str_xrt_output_name_or_null(name); + if (might_be_null != NULL) { + DG(might_be_null); + return; + } - XRT_OUTPUT_CASE(XRT_OUTPUT_NAME_TOUCH_PRO_HAPTIC); - XRT_OUTPUT_CASE(XRT_OUTPUT_NAME_TOUCH_PRO_HAPTIC_TRIGGER); - XRT_OUTPUT_CASE(XRT_OUTPUT_NAME_TOUCH_PRO_HAPTIC_THUMB); - XRT_OUTPUT_CASE(XRT_OUTPUT_NAME_TOUCH_PLUS_HAPTIC); + /* + * Invalid values handled below. + */ - XRT_OUTPUT_CASE(XRT_OUTPUT_NAME_PSVR2_HAPTIC); - } + uint32_t id = XRT_GET_OUTPUT_ID(name); + enum xrt_output_type type = XRT_GET_OUTPUT_TYPE(name); + const char *str = get_xrt_output_type_short_str(type); -#undef XRT_OUTPUT_CASE + u_pp(dg, "XRT_OUTPUT_0x%04x_%s", id, str); } void diff --git a/src/xrt/auxiliary/util/u_pretty_print.h b/src/xrt/auxiliary/util/u_pretty_print.h index 5e0f44b4d..10495419b 100644 --- a/src/xrt/auxiliary/util/u_pretty_print.h +++ b/src/xrt/auxiliary/util/u_pretty_print.h @@ -29,7 +29,50 @@ extern "C" { * they can easily be chained together to form a debug message printing out * various information. Most of the final logging functions in Monado inserts a * newline at the end of the message and we don't want two to be inserted. + * + * There are also helpers that goes from an enum to a string that that doesn't + * use the delegate to do the printing, these returns string that are compiled + * into the binary. They will return 'UNKNOWN' if they don't know the value. + * But can be made to return NULL on unknown. + */ + +/*! + * Returns a string of the input name, or NULL if invalid. + * + * @ingroup aux_pretty + */ +const char * +u_str_xrt_input_name_or_null(enum xrt_input_name name); + +/*! + * Returns a string of the output name, or NULL if invalid. + * + * @ingroup aux_pretty + */ +const char * +u_str_xrt_output_name_or_null(enum xrt_output_name name); + +/*! + * Returns a string of the device name, or NULL if invalid. + * + * @ingroup aux_pretty */ +const char * +u_str_xrt_device_name_or_null(enum xrt_device_name name); + +#define U_STR_NO_NULL(NAME, TYPE) \ + static inline const char *NAME(TYPE enumerate) \ + { \ + const char *str = NAME##_or_null(enumerate); \ + return str != NULL ? str : "UNKNOWN"; \ + } + +U_STR_NO_NULL(u_str_xrt_input_name, enum xrt_input_name) +U_STR_NO_NULL(u_str_xrt_output_name, enum xrt_output_name) +U_STR_NO_NULL(u_str_xrt_device_name, enum xrt_device_name) + +#undef U_STR_NO_NULL + /*! * Function prototype for receiving pretty printed strings.