The open source OpenXR runtime
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

libmonado: Fix dynamic roles

+51 -20
+51 -20
src/xrt/targets/libmonado/monado.c
··· 48 48 * 49 49 */ 50 50 51 + enum role_enum 52 + { 53 + ROLE_HEAD, 54 + ROLE_EYES, 55 + ROLE_LEFT, 56 + ROLE_RIGHT, 57 + ROLE_GAMEPAD, 58 + ROLE_HAND_LEFT, 59 + ROLE_HAND_RIGHT, 60 + }; 61 + 51 62 #define CHECK_NOT_NULL(ARG) \ 52 63 do { \ 53 64 if (ARG == NULL) { \ ··· 309 320 CHECK_NOT_NULL(role_name); 310 321 CHECK_NOT_NULL(out_device_id); 311 322 312 - #ifndef MND_PP_DEV_ID_FROM_ROLE 313 - #define MND_PP_DEV_ID_FROM_ROLE(role) \ 314 - if (strcmp(role_name, #role) == 0) { \ 315 - *out_device_id = (int32_t)root->ipc_c.ism->roles.role; \ 316 - return MND_SUCCESS; \ 323 + enum role_enum role; 324 + 325 + #define TO_ENUM(STRING, ENUM) \ 326 + if (strcmp(role_name, STRING) == 0) { \ 327 + role = ENUM; \ 328 + } else 329 + 330 + TO_ENUM("head", ROLE_HEAD) 331 + TO_ENUM("eyes", ROLE_EYES) 332 + TO_ENUM("left", ROLE_LEFT) 333 + TO_ENUM("right", ROLE_RIGHT) 334 + TO_ENUM("gamepad", ROLE_GAMEPAD) 335 + TO_ENUM("hand-tracking-left", ROLE_HAND_LEFT) 336 + TO_ENUM("hand-tracking-right", ROLE_HAND_RIGHT) 337 + { 338 + PE("Invalid role name (%s)", role_name); 339 + return MND_ERROR_INVALID_VALUE; 317 340 } 318 - #endif 319 - MND_PP_DEV_ID_FROM_ROLE(head) 320 - MND_PP_DEV_ID_FROM_ROLE(left) 321 - MND_PP_DEV_ID_FROM_ROLE(right) 322 - MND_PP_DEV_ID_FROM_ROLE(gamepad) 323 - MND_PP_DEV_ID_FROM_ROLE(eyes) 324 - #undef MND_PP_DEV_ID_FROM_ROLE 325 - if (strcmp(role_name, "hand-tracking-left") == 0) { 326 - *out_device_id = root->ipc_c.ism->roles.hand_tracking.left; 327 - return MND_SUCCESS; 341 + #undef TO_ENUM 342 + 343 + switch (role) { 344 + case ROLE_HEAD: *out_device_id = root->ipc_c.ism->roles.head; return MND_SUCCESS; 345 + case ROLE_EYES: *out_device_id = root->ipc_c.ism->roles.eyes; return MND_SUCCESS; 346 + case ROLE_HAND_LEFT: *out_device_id = root->ipc_c.ism->roles.hand_tracking.left; return MND_SUCCESS; 347 + case ROLE_HAND_RIGHT: *out_device_id = root->ipc_c.ism->roles.hand_tracking.right; return MND_SUCCESS; 348 + case ROLE_LEFT: 349 + case ROLE_RIGHT: 350 + case ROLE_GAMEPAD: break; 328 351 } 329 - if (strcmp(role_name, "hand-tracking-right") == 0) { 330 - *out_device_id = root->ipc_c.ism->roles.hand_tracking.right; 331 - return MND_SUCCESS; 352 + 353 + struct xrt_system_roles roles; 354 + xrt_result_t xret = ipc_call_system_devices_get_roles(&root->ipc_c, &roles); 355 + if (xret != XRT_SUCCESS) { 356 + PE("Failed to get dynamic roles"); 357 + return MND_ERROR_OPERATION_FAILED; 332 358 } 333 359 334 - PE("Invalid role name (%s)", role_name); 335 - return MND_ERROR_INVALID_VALUE; 360 + // Assumes roles index match device id. 361 + switch (role) { 362 + case ROLE_LEFT: *out_device_id = roles.left; return MND_SUCCESS; 363 + case ROLE_RIGHT: *out_device_id = roles.right; return MND_SUCCESS; 364 + case ROLE_GAMEPAD: *out_device_id = roles.gamepad; return MND_SUCCESS; 365 + default: PE("Internal error, shouldn't get here"); return MND_ERROR_OPERATION_FAILED; 366 + } 336 367 }