19#include "xrt/xrt_config_drivers.h"
22#ifdef XRT_BUILD_DRIVER_PIMAX_P2
26#include "openvr_driver.h"
31#include <unordered_map>
36#include <condition_variable>
44 using ContextPtr = std::shared_ptr<Context>;
46 vr::ITrackedDeviceServerDriver *driver;
48 const std::string &steam_install;
51 vr::ITrackedDeviceServerDriver *p_driver,
53 const std::string &p_stream_install)
54 : ctx{p_ctx}, driver{p_driver}, serial{p_serial}, steam_install{p_stream_install}
66 Property(vr::PropertyTypeTag_t tag,
void *buffer, uint32_t bufferSize);
68 vr::PropertyTypeTag_t tag;
69 std::vector<uint8_t> buffer;
78 std::vector<vr::VRInputComponentHandle_t>
handles;
83 get_input_from_name(std::string_view name);
86 update_pose(
const vr::DriverPose_t &newPose)
const;
92 vr::ETrackedPropertyError
93 handle_properties(
const vr::PropertyWrite_t *batch, uint32_t count);
95 vr::ETrackedPropertyError
96 handle_read_properties(vr::PropertyRead_t *batch, uint32_t count);
106 inline vr::VRInputComponentHandle_t
109 vr::VRInputComponentHandle_t h = ++this->ctx->input.next_handle;
110 this->handles.push_back(h);
116 std::shared_ptr<Context> ctx;
117 vr::PropertyContainerHandle_t container_handle{0};
118 std::unordered_map<vr::ETrackedDeviceProperty, Property> properties;
119 std::unordered_map<std::string_view, xrt_input *> inputs_map;
120 std::vector<xrt_input> inputs_vec;
121 inline static xrt_pose chaperone = XRT_POSE_IDENTITY;
123 std::string manufacturer;
125 float vsync_to_photon_ns{0.f};
126 bool provides_battery_status{
false};
127 bool charging{
false};
130 vr::ETrackedPropertyError
131 handle_generic_property_write(
const vr::PropertyWrite_t &prop);
132 vr::ETrackedPropertyError
133 handle_generic_property_read(vr::PropertyRead_t &prop);
135 virtual vr::ETrackedPropertyError
136 handle_property_write(
const vr::PropertyWrite_t &prop);
139 set_input_class(
const InputClass *input_class);
142 vr::ITrackedDeviceServerDriver *driver;
145 init_chaperone(
const std::string &steam_install);
154 if (hid !=
nullptr) {
155 vp2_hid_destroy(hid);
161#ifdef XRT_BUILD_DRIVER_PIMAX_P2
168 if (dev !=
nullptr) {
179 xrt_pose eye[2] = {XRT_POSE_IDENTITY, XRT_POSE_IDENTITY};
184 vr::IVRDisplayComponent *display;
196#ifdef XRT_BUILD_DRIVER_PIMAX_P2
197 struct PimaxData pimax{};
213 SetDisplayEyeToHead(uint32_t unWhichDevice,
214 const vr::HmdMatrix34_t &eyeToHeadLeft,
215 const vr::HmdMatrix34_t &eyeToHeadRight);
219 uint64_t at_timestamp_ns,
230 set_hmd_parts(std::unique_ptr<Parts> parts);
243#ifdef XRT_BUILD_DRIVER_PIMAX_P2
249 std::unique_ptr<Parts> hmd_parts{
nullptr};
254 vr::ETrackedPropertyError
255 handle_property_write(
const vr::PropertyWrite_t &prop)
override;
258 set_nominal_frame_interval(uint64_t interval_ns);
260 std::condition_variable hmd_parts_cv;
261 std::mutex hmd_parts_mut;
262 float brightness{1.0f};
263 AnalogGainRange analog_gain_range{};
275 set_haptic_handle(vr::VRInputComponentHandle_t handle);
282 int64_t desired_timestamp_ns,
284 int64_t *out_timestamp_ns);
290 update_skeleton_transforms(std::span<const vr::VRBoneTransform_t> bones);
293 set_skeleton(std::span<const vr::VRBoneTransform_t> bones,
xrt_hand hand,
bool is_simulated,
const char *path);
300 generate_palm_pose_offset(std::span<const vr::VRBoneTransform_t> bones,
xrt_hand hand);
303 vr::VRInputComponentHandle_t haptic_handle{0};
304 size_t latest_haptic_event{0};
305 std::unique_ptr<xrt_output> output{
nullptr};
306 bool has_hand_tracking{
false};
307 xrt_hand skeleton_hand = XRT_HAND_LEFT;
308 std::array<std::optional<xrt_pose>, 2> palm_offsets;
309 std::array<xrt_input, 2> hand_tracking_inputs{};
311 struct JointsWithTimestamp
314 int64_t timestamp{0};
318 vr::ETrackedPropertyError
319 handle_property_write(
const vr::PropertyWrite_t &prop)
override;
Definition context.hpp:44
Definition device.hpp:267
vr::VRInputComponentHandle_t new_input_handle_locked()
Call with devices_mut held.
Definition device.hpp:107
std::vector< vr::VRInputComponentHandle_t > handles
The component handles that are attached to this device.
Definition device.hpp:78
void get_pose(uint64_t at_timestamp_ns, xrt_space_relation *out_relation)
Helper to use the m_relation_history member.
Definition device.cpp:803
virtual xrt_result_t get_tracked_pose(xrt_input_name name, uint64_t at_timestamp_ns, xrt_space_relation *out_relation)=0
Maps to xrt_device::get_tracked_pose.
Definition device.hpp:176
xrt_result_t update_inputs()
Update any attached inputs.
Definition device.cpp:913
Stores some number of values in a ring buffer, overwriting the earliest-pushed-remaining element if o...
Definition u_template_historybuf.hpp:38
SteamVR driver context - implements xrt_tracking_origin and IVRDriverContext.
VIVE_VARIANT
Headset variant.
Definition vive_common.h:44
void pimax_p2_destroy(struct pimax_p2_device *dev)
Clean up a pimax_p2_device.
Definition pimax_p2.c:1111
xrt_hand
Enumeration for left and right hand.
Definition xrt_defines.h:1511
xrt_input_name
Every internal input source known to monado with a baked in type.
Definition xrt_defines.h:961
enum xrt_result xrt_result_t
Result type used across Monado.
xrt_output_name
Name of a output with a baked in type.
Definition xrt_defines.h:1645
Small utility for keeping track of the history of an xrt_space_relation, ie.
Pimax P2 driver header - inherits xrt_device.
Definition device.hpp:188
Definition device.hpp:182
Definition device.hpp:195
Definition device.hpp:149
Definition m_relation_history.cpp:50
Definition pimax_p2.h:152
Compositor information for a device.
Definition xrt_device.h:120
Compositor mode information for a device.
Definition xrt_device.h:152
A single HMD or input device.
Definition xrt_device.h:328
xrt_result_t(* set_output)(struct xrt_device *xdev, enum xrt_output_name name, const struct xrt_output_value *value)
Set a output value.
Definition xrt_device.h:526
xrt_result_t(* compute_distortion)(struct xrt_device *xdev, uint32_t view, float u, float v, struct xrt_uv_triplet *out_result)
Compute the distortion at a single point.
Definition xrt_device.h:646
xrt_result_t(* get_hand_tracking)(struct xrt_device *xdev, enum xrt_input_name name, int64_t desired_timestamp_ns, struct xrt_hand_joint_set *out_value, int64_t *out_timestamp_ns)
Get relationship of hand joints to the tracking origin space as the base space.
Definition xrt_device.h:427
xrt_result_t(* notify_chirality)(struct xrt_device *xdev, bool has_chirality, enum xrt_hand chirality)
Notify the device of it's new chirality, or that it no longer has a set chirality.
Definition xrt_device.h:766
xrt_result_t(* set_brightness)(struct xrt_device *xdev, float brightness, bool relative)
Set the display brightness.
Definition xrt_device.h:726
xrt_result_t(* get_battery_status)(struct xrt_device *xdev, bool *out_present, bool *out_charging, float *out_charge)
Get battery status information.
Definition xrt_device.h:702
xrt_result_t(* get_brightness)(struct xrt_device *xdev, float *out_brightness)
Get the current display brightness.
Definition xrt_device.h:714
xrt_result_t(* get_compositor_info)(struct xrt_device *xdev, const struct xrt_device_compositor_mode *mode, struct xrt_device_compositor_info *out_info)
Gets the compositor info for a device for the given mode.
Definition xrt_device.h:737
xrt_result_t(* get_view_poses)(struct xrt_device *xdev, const struct xrt_vec3 *default_eye_relation, int64_t at_timestamp_ns, enum xrt_view_type view_type, uint32_t view_count, struct xrt_space_relation *out_head_relation, struct xrt_fov *out_fovs, struct xrt_pose *out_poses)
Get the per-view pose in relation to the view space.
Definition xrt_device.h:623
xrt_result_t(* get_tracked_pose)(struct xrt_device *xdev, enum xrt_input_name name, int64_t at_timestamp_ns, struct xrt_space_relation *out_relation)
Get relationship of a tracked device to the tracking origin space as the base space.
Definition xrt_device.h:399
Describes a projection matrix fov.
Definition xrt_defines.h:542
Joint set type used for hand tracking.
Definition xrt_defines.h:1554
All of the device components that deals with interfacing to a users head.
Definition xrt_device.h:165
A union of all output types.
Definition xrt_defines.h:2422
A pose composed of a position and orientation.
Definition xrt_defines.h:522
The main prober that probes and manages found but not opened HMD devices that are connected to the sy...
Definition xrt_prober.h:136
A relation with two spaces, includes velocity and acceleration.
Definition xrt_defines.h:713
Represents a uv triplet for distortion, basically just three xrt_vec2.
Definition xrt_defines.h:300
A 3 element vector with single floats.
Definition xrt_defines.h:310
Ringbuffer implementation for keeping track of the past state of things.
Common things like defines for Vive and Index.
Implementation of the Vive Pro 2 HID interface.
xrt_view_type
View type to be rendered to by the compositor.
Definition xrt_defines.h:2453
Header defining an xrt display or controller device.