The open source OpenXR runtime

d/ht_ctrl_emu: Expose the device as XRT_DEVICE_HAND_CTRL_EMU

And bind to simple controller through rebindings.

Co-authored-by: Jakob Bornecrantz <tbornecrantz@nvidia.com>
Part-of: <https://gitlab.freedesktop.org/monado/monado/-/merge_requests/2619>

authored by

Wanhang Lu
Jakob Bornecrantz
and committed by
Marge Bot
2fbb6bce 79a472e6

+35 -14
+35 -14
src/xrt/drivers/ht_ctrl_emu/ht_ctrl_emu.cpp
··· 46 46 enum cemu_input_index 47 47 { 48 48 CEMU_INDEX_HAND_TRACKING, 49 - CEMU_INDEX_SELECT, 50 - CEMU_INDEX_MENU, 49 + CEMU_INDEX_PINCH_BOOL, 50 + CEMU_INDEX_PINCH_FLOAT, 51 51 CEMU_INDEX_GRIP, 52 52 CEMU_INDEX_AIM, 53 53 CEMU_NUM_INPUTS, ··· 373 373 struct cemu_device *dev = cemu_device(xdev); 374 374 struct cemu_system *sys = dev->sys; 375 375 376 - if (name != XRT_INPUT_SIMPLE_GRIP_POSE && name != XRT_INPUT_SIMPLE_AIM_POSE) { 376 + if (name != XRT_INPUT_HAND_CTRL_EMU_AIM_POSE && name != XRT_INPUT_HAND_CTRL_EMU_GRIP_POSE) { 377 377 U_LOG_XDEV_UNSUPPORTED_INPUT(&dev->base, dev->sys->log_level, name); 378 378 return XRT_ERROR_INPUT_UNSUPPORTED; 379 379 } ··· 391 391 392 392 xret = XRT_SUCCESS; 393 393 switch (name) { 394 - case XRT_INPUT_SIMPLE_GRIP_POSE: { 394 + case XRT_INPUT_HAND_CTRL_EMU_GRIP_POSE: { 395 395 xret = do_grip_pose(&joint_set, out_relation, sys->grip_offset_from_palm, dev->hand_index); 396 396 break; 397 397 } 398 - case XRT_INPUT_SIMPLE_AIM_POSE: { 398 + case XRT_INPUT_HAND_CTRL_EMU_AIM_POSE: { 399 399 // Assume that now we're doing everything in the timestamp from the hand-tracker, so use 400 400 // hand_timestamp_ns. This will cause the controller to lag behind but otherwise be correct 401 401 xret = do_aim_pose(dev, &joint_set, at_timestamp_ns, hand_timestamp_ns, out_relation); ··· 436 436 U_LOG_CHK_AND_RET(sys->log_level, xret, "xrt_device_get_hand_tracking"); 437 437 438 438 if (!joint_set.is_active) { 439 - xdev->inputs[CEMU_INDEX_SELECT].value.boolean = false; 440 - xdev->inputs[CEMU_INDEX_MENU].value.boolean = false; 439 + xdev->inputs[CEMU_INDEX_PINCH_BOOL].value.boolean = false; 440 + xdev->inputs[CEMU_INDEX_PINCH_FLOAT].value.vec1.x = 0.f; 441 441 return XRT_SUCCESS; 442 442 } 443 443 444 444 decide(joint_set.values.hand_joint_set_default[XRT_HAND_JOINT_INDEX_TIP].relation.pose.position, 445 445 joint_set.values.hand_joint_set_default[XRT_HAND_JOINT_THUMB_TIP].relation.pose.position, 446 - &xdev->inputs[CEMU_INDEX_SELECT].value.boolean); 446 + &xdev->inputs[CEMU_INDEX_PINCH_BOOL].value.boolean); 447 447 448 448 // For now, all other inputs are off - detecting any gestures more complicated than pinch is too unreliable for 449 449 // now. 450 - xdev->inputs[CEMU_INDEX_MENU].value.boolean = false; 450 + if (xdev->inputs[CEMU_INDEX_PINCH_BOOL].value.boolean) { 451 + xdev->inputs[CEMU_INDEX_PINCH_FLOAT].value.vec1.x = 1.0f; 452 + } else { 453 + xdev->inputs[CEMU_INDEX_PINCH_FLOAT].value.vec1.x = 0.0f; 454 + } 451 455 452 456 return XRT_SUCCESS; 453 457 } 454 458 459 + static struct xrt_binding_input_pair simple_inputs[3] = { 460 + {XRT_INPUT_SIMPLE_SELECT_CLICK, XRT_INPUT_HAND_CTRL_EMU_PINCH_BOOL}, 461 + {XRT_INPUT_SIMPLE_GRIP_POSE, XRT_INPUT_HAND_CTRL_EMU_GRIP_POSE}, 462 + {XRT_INPUT_SIMPLE_AIM_POSE, XRT_INPUT_HAND_CTRL_EMU_AIM_POSE}, 463 + }; 464 + 465 + static struct xrt_binding_profile binding_profiles[1] = { 466 + { 467 + .name = XRT_DEVICE_SIMPLE_CONTROLLER, 468 + .inputs = simple_inputs, 469 + .input_count = ARRAY_SIZE(simple_inputs), 470 + .outputs = nullptr, 471 + .output_count = 0, 472 + }, 473 + }; 455 474 456 475 extern "C" int 457 476 cemu_devices_create(struct xrt_device *head, struct xrt_device *hands, struct xrt_device **out_xdevs) ··· 481 500 482 501 cemud[i]->base.tracking_origin = hands->tracking_origin; 483 502 484 - cemud[i]->base.name = XRT_DEVICE_SIMPLE_CONTROLLER; 503 + cemud[i]->base.name = XRT_DEVICE_HAND_CTRL_EMU; 485 504 cemud[i]->base.supported.hand_tracking = true; 486 505 cemud[i]->base.supported.orientation_tracking = true; 487 506 cemud[i]->base.supported.position_tracking = true; 507 + cemud[i]->base.binding_profiles = binding_profiles; 508 + cemud[i]->base.binding_profile_count = ARRAY_SIZE(binding_profiles); 488 509 489 510 cemud[i]->base.inputs[CEMU_INDEX_HAND_TRACKING].name = ht_input_names[i]; 490 - cemud[i]->base.inputs[CEMU_INDEX_SELECT].name = XRT_INPUT_SIMPLE_SELECT_CLICK; 491 - cemud[i]->base.inputs[CEMU_INDEX_MENU].name = XRT_INPUT_SIMPLE_MENU_CLICK; 492 - cemud[i]->base.inputs[CEMU_INDEX_GRIP].name = XRT_INPUT_SIMPLE_GRIP_POSE; 493 - cemud[i]->base.inputs[CEMU_INDEX_AIM].name = XRT_INPUT_SIMPLE_AIM_POSE; 511 + cemud[i]->base.inputs[CEMU_INDEX_PINCH_BOOL].name = XRT_INPUT_HAND_CTRL_EMU_PINCH_BOOL; 512 + cemud[i]->base.inputs[CEMU_INDEX_PINCH_FLOAT].name = XRT_INPUT_HAND_CTRL_EMU_PINCH_VALUE; 513 + cemud[i]->base.inputs[CEMU_INDEX_GRIP].name = XRT_INPUT_HAND_CTRL_EMU_GRIP_POSE; 514 + cemud[i]->base.inputs[CEMU_INDEX_AIM].name = XRT_INPUT_HAND_CTRL_EMU_AIM_POSE; 494 515 495 516 cemud[i]->base.update_inputs = cemu_device_update_inputs; 496 517 cemud[i]->base.get_tracked_pose = cemu_device_get_tracked_pose;