diff --git a/src/xrt/auxiliary/vive/vive_config.c b/src/xrt/auxiliary/vive/vive_config.c index dbddee11c..362d68967 100644 --- a/src/xrt/auxiliary/vive/vive_config.c +++ b/src/xrt/auxiliary/vive/vive_config.c @@ -608,6 +608,12 @@ vive_config_parse_controller(struct vive_controller_config *d, char *json_string } else if (strcmp(d->firmware.model_number, "VIVE Tracker Pro MV") == 0) { d->variant = CONTROLLER_TRACKER_GEN2; VIVE_DEBUG(d, "Found Gen 2 tracker."); + } else if (strcmp(d->firmware.model_number, "VIVE Tracker 3.0 MV") == 0) { + d->variant = CONTROLLER_TRACKER_GEN3; + VIVE_DEBUG(d, "Found Gen 3 tracker."); + } else if (strcmp(d->firmware.model_number, "Tundra Tracker") == 0) { + d->variant = CONTROLLER_TRACKER_TUNDRA; + VIVE_DEBUG(d, "Found Tundra tracker."); } else { VIVE_ERROR(d, "Failed to parse controller variant!\n\tfirmware.model_[number|name]: '%s'", d->firmware.model_number); @@ -624,7 +630,9 @@ vive_config_parse_controller(struct vive_controller_config *d, char *json_string } break; case CONTROLLER_INDEX_LEFT: case CONTROLLER_INDEX_RIGHT: - case CONTROLLER_TRACKER_GEN2: { + case CONTROLLER_TRACKER_GEN2: + case CONTROLLER_TRACKER_GEN3: + case CONTROLLER_TRACKER_TUNDRA: { const cJSON *imu = u_json_get(json, "imu"); _get_pose_from_pos_x_z(imu, &d->imu.trackref); @@ -632,7 +640,8 @@ vive_config_parse_controller(struct vive_controller_config *d, char *json_string JSON_VEC3(imu, "acc_scale", &d->imu.acc_scale); JSON_VEC3(imu, "gyro_bias", &d->imu.gyro_bias); - if (d->variant == CONTROLLER_TRACKER_GEN2) + if (d->variant == CONTROLLER_TRACKER_GEN2 || d->variant == CONTROLLER_TRACKER_GEN3 || + d->variant == CONTROLLER_TRACKER_TUNDRA) JSON_VEC3(imu, "gyro_scale", &d->imu.gyro_scale); } break; default: VIVE_ERROR(d, "Unknown Vive watchman variant."); return false; diff --git a/src/xrt/auxiliary/vive/vive_config.h b/src/xrt/auxiliary/vive/vive_config.h index 8cd4c9ea8..646ed498f 100644 --- a/src/xrt/auxiliary/vive/vive_config.h +++ b/src/xrt/auxiliary/vive/vive_config.h @@ -63,6 +63,8 @@ enum VIVE_CONTROLLER_VARIANT CONTROLLER_INDEX_RIGHT, CONTROLLER_TRACKER_GEN1, CONTROLLER_TRACKER_GEN2, + CONTROLLER_TRACKER_GEN3, + CONTROLLER_TRACKER_TUNDRA, CONTROLLER_UNKNOWN }; diff --git a/src/xrt/drivers/survive/survive_driver.c b/src/xrt/drivers/survive/survive_driver.c index d71941a0a..6fae90479 100644 --- a/src/xrt/drivers/survive/survive_driver.c +++ b/src/xrt/drivers/survive/survive_driver.c @@ -1025,7 +1025,8 @@ _create_controller_device(struct survive_system *sys, U_LOG_IFL_E(sys->log_level, "Only creating 1 right controller!"); return false; } - } else if (variant == CONTROLLER_TRACKER_GEN1 || variant == CONTROLLER_TRACKER_GEN2) { + } else if (variant == CONTROLLER_TRACKER_GEN1 || variant == CONTROLLER_TRACKER_GEN2 || + variant == CONTROLLER_TRACKER_GEN3 || variant == CONTROLLER_TRACKER_TUNDRA) { for (int i = SURVIVE_NON_CONTROLLER_START; i < MAX_TRACKED_DEVICE_COUNT; i++) { if (sys->controllers[i] == NULL) { idx = i; @@ -1128,13 +1129,21 @@ _create_controller_device(struct survive_system *sys, survive->base.device_type = XRT_DEVICE_TYPE_ANY_HAND_CONTROLLER; } else if (survive->ctrl.config.variant == CONTROLLER_TRACKER_GEN1 || - survive->ctrl.config.variant == CONTROLLER_TRACKER_GEN2) { + survive->ctrl.config.variant == CONTROLLER_TRACKER_GEN2 || + survive->ctrl.config.variant == CONTROLLER_TRACKER_GEN3 || + survive->ctrl.config.variant == CONTROLLER_TRACKER_TUNDRA) { if (survive->ctrl.config.variant == CONTROLLER_TRACKER_GEN1) { survive->base.name = XRT_DEVICE_VIVE_TRACKER_GEN1; snprintf(survive->base.str, XRT_DEVICE_NAME_LEN, "Vive Tracker Gen1 (libsurvive)"); } else if (survive->ctrl.config.variant == CONTROLLER_TRACKER_GEN2) { survive->base.name = XRT_DEVICE_VIVE_TRACKER_GEN2; snprintf(survive->base.str, XRT_DEVICE_NAME_LEN, "Vive Tracker Gen2 (libsurvive)"); + } else if (survive->ctrl.config.variant == CONTROLLER_TRACKER_GEN3) { + survive->base.name = XRT_DEVICE_VIVE_TRACKER_GEN3; + snprintf(survive->base.str, XRT_DEVICE_NAME_LEN, "Vive Tracker Gen3 (libsurvive)"); + } else if (survive->ctrl.config.variant == CONTROLLER_TRACKER_TUNDRA) { + survive->base.name = XRT_DEVICE_VIVE_TRACKER_TUNDRA; + snprintf(survive->base.str, XRT_DEVICE_NAME_LEN, "Tundra Tracker Gen3 (libsurvive)"); } survive->base.device_type = XRT_DEVICE_TYPE_GENERIC_TRACKER; @@ -1186,6 +1195,8 @@ add_device(struct survive_system *ss, const struct SurviveSimpleConfigEvent *e) case CONTROLLER_INDEX_RIGHT: case CONTROLLER_TRACKER_GEN1: case CONTROLLER_TRACKER_GEN2: + case CONTROLLER_TRACKER_GEN3: + case CONTROLLER_TRACKER_TUNDRA: U_LOG_IFL_D(ss->log_level, "Adding controller: %s.", config.firmware.model_number); _create_controller_device(ss, sso, &config); break; diff --git a/src/xrt/drivers/vive/vive_controller.c b/src/xrt/drivers/vive/vive_controller.c index 7e009b76e..70c08554f 100644 --- a/src/xrt/drivers/vive/vive_controller.c +++ b/src/xrt/drivers/vive/vive_controller.c @@ -1200,6 +1200,16 @@ vive_controller_create(struct os_hid_device *controller_hid, enum watchman_gen w d->base.update_inputs = _update_tracker_inputs; d->base.device_type = XRT_DEVICE_TYPE_GENERIC_TRACKER; snprintf(d->base.str, XRT_DEVICE_NAME_LEN, "Vive Tracker Gen2 (vive)"); + } else if (d->config.variant == CONTROLLER_TRACKER_GEN3) { + d->base.name = XRT_DEVICE_VIVE_TRACKER_GEN3; + d->base.update_inputs = _update_tracker_inputs; + d->base.device_type = XRT_DEVICE_TYPE_GENERIC_TRACKER; + snprintf(d->base.str, XRT_DEVICE_NAME_LEN, "Vive Tracker Gen3 (vive)"); + } else if (d->config.variant == CONTROLLER_TRACKER_TUNDRA) { + d->base.name = CONTROLLER_TRACKER_TUNDRA; + d->base.update_inputs = _update_tracker_inputs; + d->base.device_type = XRT_DEVICE_TYPE_GENERIC_TRACKER; + snprintf(d->base.str, XRT_DEVICE_NAME_LEN, "Tundra Tracker Gen3 (vive)"); } else { d->base.name = XRT_DEVICE_GENERIC_HMD; d->base.device_type = XRT_DEVICE_TYPE_GENERIC_TRACKER;