mirror of
https://gitlab.freedesktop.org/monado/monado.git
synced 2025-01-19 21:28:50 +00:00
d/vive: Add initial support for Vive Pro.
This commit is contained in:
parent
e063e8245e
commit
2ed3109c95
|
@ -337,8 +337,17 @@ update_imu(struct vive_device *d, struct vive_imu_report *report)
|
|||
VIVE_SPEW(d, "GYRO %f %f %f", angular_velocity.x,
|
||||
angular_velocity.y, angular_velocity.z);
|
||||
|
||||
// flip x axis
|
||||
angular_velocity.x = -angular_velocity.x;
|
||||
switch (d->variant) {
|
||||
case VIVE_VARIANT_VIVE:
|
||||
// flip x axis
|
||||
angular_velocity.x = -angular_velocity.x;
|
||||
break;
|
||||
case VIVE_VARIANT_PRO:
|
||||
// flip y axis
|
||||
angular_velocity.y = -angular_velocity.y;
|
||||
break;
|
||||
default: VIVE_ERROR("Unhandled Vive variant\n"); return;
|
||||
}
|
||||
|
||||
math_quat_integrate_velocity(
|
||||
&d->rot_filtered, &angular_velocity,
|
||||
|
@ -488,6 +497,8 @@ vive_sensros_get_imu_range_report(struct vive_device *d)
|
|||
VIVE_ERROR("Gyroscope or accelerometer range too large.");
|
||||
VIVE_ERROR("Gyroscope: %d", report.gyro_range);
|
||||
VIVE_ERROR("Aaccelerometer: %d", report.accel_range);
|
||||
d->imu.gyro_range = 8.726646f;
|
||||
d->imu.acc_range = 39.226600f;
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -640,10 +651,23 @@ vive_parse_config(struct vive_device *d, char *json_string)
|
|||
|
||||
const nx_json *json = nx_json_parse(json_string, 0);
|
||||
if (json) {
|
||||
_json_get_vec3(json, "acc_bias", &d->imu.acc_bias);
|
||||
_json_get_vec3(json, "acc_scale", &d->imu.acc_scale);
|
||||
_json_get_vec3(json, "gyro_bias", &d->imu.gyro_bias);
|
||||
_json_get_vec3(json, "gyro_scale", &d->imu.gyro_scale);
|
||||
|
||||
switch (d->variant) {
|
||||
case VIVE_VARIANT_VIVE:
|
||||
_json_get_vec3(json, "acc_bias", &d->imu.acc_bias);
|
||||
_json_get_vec3(json, "acc_scale", &d->imu.acc_scale);
|
||||
_json_get_vec3(json, "gyro_bias", &d->imu.gyro_bias);
|
||||
_json_get_vec3(json, "gyro_scale", &d->imu.gyro_scale);
|
||||
break;
|
||||
case VIVE_VARIANT_PRO: {
|
||||
const nx_json *imu = nx_json_get(json, "imu");
|
||||
_json_get_vec3(imu, "acc_bias", &d->imu.acc_bias);
|
||||
_json_get_vec3(imu, "acc_scale", &d->imu.acc_scale);
|
||||
_json_get_vec3(imu, "gyro_bias", &d->imu.gyro_bias);
|
||||
_json_get_vec3(imu, "gyro_scale", &d->imu.gyro_scale);
|
||||
} break;
|
||||
default: VIVE_ERROR("Unknown Vive variant.\n"); return false;
|
||||
}
|
||||
|
||||
d->firmware.model_number =
|
||||
_json_get_string(json, "model_number");
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
#include "vive_prober.h"
|
||||
|
||||
static const char VIVE_PRODUCT_STRING[] = "HTC Vive";
|
||||
static const char VIVE_PRO_PRODUCT_STRING[] = "VIVE Pro";
|
||||
static const char VIVE_MANUFACTURER_STRING[] = "HTC";
|
||||
|
||||
DEBUG_GET_ONCE_BOOL_OPTION(vive_debug, "VIVE_PRINT_DEBUG", false)
|
||||
|
@ -111,6 +112,73 @@ init_vive1(struct xrt_prober *xp,
|
|||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
init_vive_pro(struct xrt_prober *xp,
|
||||
struct xrt_prober_device *dev,
|
||||
struct xrt_prober_device **devices,
|
||||
size_t num_devices,
|
||||
bool print_debug,
|
||||
struct xrt_device **out_xdev)
|
||||
{
|
||||
if (print_debug)
|
||||
_print_device_info(xp, dev);
|
||||
|
||||
if (!xrt_prober_match_string(xp, dev, XRT_PROBER_STRING_MANUFACTURER,
|
||||
VIVE_MANUFACTURER_STRING) ||
|
||||
!xrt_prober_match_string(xp, dev, XRT_PROBER_STRING_PRODUCT,
|
||||
VIVE_PRO_PRODUCT_STRING)) {
|
||||
if (print_debug)
|
||||
printf("Vive Pro manufactuer string did not match.\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
struct os_hid_device *sensors_dev = NULL;
|
||||
for (uint32_t i = 0; i < num_devices; i++) {
|
||||
struct xrt_prober_device *d = devices[i];
|
||||
|
||||
if (d->vendor_id != VALVE_VID &&
|
||||
d->product_id != VIVE_PRO_LHR_PID)
|
||||
continue;
|
||||
|
||||
if (print_debug)
|
||||
_print_device_info(xp, d);
|
||||
|
||||
int result =
|
||||
xrt_prober_open_hid_interface(xp, d, 0, &sensors_dev);
|
||||
if (result != 0) {
|
||||
VIVE_ERROR("Could not open Vive sensors device.");
|
||||
return -1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (sensors_dev == NULL) {
|
||||
VIVE_ERROR("Could not find Vive Pro sensors device.");
|
||||
return -1;
|
||||
}
|
||||
|
||||
struct os_hid_device *mainboard_dev = NULL;
|
||||
|
||||
int result = xrt_prober_open_hid_interface(xp, dev, 0, &mainboard_dev);
|
||||
if (result != 0) {
|
||||
VIVE_ERROR("Could not open Vive mainboard device.");
|
||||
free(sensors_dev);
|
||||
return -1;
|
||||
}
|
||||
struct vive_device *d =
|
||||
vive_device_create(mainboard_dev, sensors_dev, VIVE_VARIANT_PRO);
|
||||
if (d == NULL) {
|
||||
free(sensors_dev);
|
||||
free(mainboard_dev);
|
||||
return -1;
|
||||
}
|
||||
|
||||
*out_xdev = &d->base;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
vive_found(struct xrt_prober *xp,
|
||||
struct xrt_prober_device **devices,
|
||||
|
@ -134,6 +202,9 @@ vive_found(struct xrt_prober *xp,
|
|||
case VIVE_PID:
|
||||
return init_vive1(xp, dev, devices, num_devices, print_debug,
|
||||
out_xdev);
|
||||
case VIVE_PRO_MAINBOARD_PID:
|
||||
return init_vive_pro(xp, dev, devices, num_devices, print_debug,
|
||||
out_xdev);
|
||||
default:
|
||||
VIVE_ERROR("No product ids matched %.4x\n", dev->product_id);
|
||||
return -1;
|
||||
|
|
|
@ -67,6 +67,7 @@ struct xrt_prober_entry target_entry_list[] = {
|
|||
|
||||
#ifdef XRT_BUILD_DRIVER_VIVE
|
||||
{HTC_VID, VIVE_PID, vive_found, "HTC Vive"},
|
||||
{HTC_VID, VIVE_PRO_MAINBOARD_PID, vive_found, "HTC Vive Pro"},
|
||||
#endif
|
||||
|
||||
{0x0000, 0x0000, NULL, NULL}, // Terminate
|
||||
|
|
Loading…
Reference in a new issue