31#define HMD_TRACE(hmd, ...) U_LOG_XDEV_IFL_T(&hmd->base, hmd->log_level, __VA_ARGS__)
32#define HMD_DEBUG(hmd, ...) U_LOG_XDEV_IFL_D(&hmd->base, hmd->log_level, __VA_ARGS__)
33#define HMD_INFO(hmd, ...) U_LOG_XDEV_IFL_I(&hmd->base, hmd->log_level, __VA_ARGS__)
34#define HMD_WARN(hmd, ...) U_LOG_XDEV_IFL_W(&hmd->base, hmd->log_level, __VA_ARGS__)
35#define HMD_ERROR(hmd, ...) U_LOG_XDEV_IFL_E(&hmd->base, hmd->log_level, __VA_ARGS__)
37#define REPORT_MAX_SIZE 69
38#define KEEPALIVE_INTERVAL_NS 10000000000
40#define KEEPALIVE_SEND_RATE_NS ((KEEPALIVE_INTERVAL_NS * 19) / 20)
41#define IMU_SAMPLE_RATE (1000)
42#define NS_PER_SAMPLE (1000 * 1000)
43#define SERIAL_NUMBER_LENGTH 14
45#define CALIBRATION_HASH_BYTE_OFFSET 0x1bf0
46#define CALIBRATION_HASH_BYTE_LENGTH 0x10
48#define CALIBRATION_HEADER_BYTE_OFFSET 0x0
49#define CALIBRATION_HEADER_BYTE_LENGTH 0x4
51#define CALIBRATION_BODY_BYTE_OFFSET 0x4
52#define CALIBRATION_BODY_BYTE_CHUNK_LENGTH 0x14
54#define MICROMETERS_TO_METERS(microns) ((float)microns / 1000000.0f)
57#define DEFAULT_EXTRA_EYE_ROTATION DEG_TO_RAD(30.0f)
59#define IN_REPORT_DK2 11
60#define IN_REPORT_RADIO_DATA 12
61#define IN_REPORT_CV1_RADIO_KEEPALIVE 13
63#define IN_REPORT_RADIO_DATA_SIZE 64
70#define SIZE_ASSERT(type, size) \
71 static_assert(sizeof(type) == (size), "Size of " #type " is not " #size " bytes as was expected")
73enum rift_feature_reports
76 FEATURE_REPORT_CONFIG = 2,
77 FEATURE_REPORT_CALIBRATE = 3,
78 FEATURE_REPORT_RANGE = 4,
79 FEATURE_REPORT_REGISTER = 5,
80 FEATURE_REPORT_DFU = 6,
81 FEATURE_REPORT_DK1_KEEP_ALIVE = 8,
82 FEATURE_REPORT_DISPLAY_INFO = 9,
83 FEATURE_REPORT_SERIAL = 10,
86 FEATURE_REPORT_TRACKING = 12,
87 FEATURE_REPORT_DISPLAY = 13,
88 FEATURE_REPORT_MAG_CALIBRATION = 14,
89 FEATURE_REPORT_POS_CALIBRATION = 15,
90 FEATURE_REPORT_CUSTOM_PATTERN = 16,
91 FEATURE_REPORT_KEEPALIVE_MUX = 17,
92 FEATURE_REPORT_MANUFACTURING = 18,
93 FEATURE_REPORT_UUID = 19,
94 FEATURE_REPORT_TEMPERATURE = 20,
95 FEATURE_REPORT_GYROOFFSET = 21,
96 FEATURE_REPORT_LENS_DISTORTION = 22,
99 FEATURE_REPORT_RADIO_CONTROL = 26,
100 FEATURE_REPORT_RADIO_READ_DATA_CMD = 27,
101 FEATURE_REPORT_ENABLE_COMPONENTS = 29,
104enum rift_config_report_flags
107 RIFT_CONFIG_REPORT_USE_RAW = 1,
109 RIFT_CONFIG_REPORT_INTERNAL_CALIBRATION = 1 << 1,
111 RIFT_CONFIG_REPORT_USE_CALIBRATION = 1 << 2,
113 RIFT_CONFIG_REPORT_AUTO_CALIBRATION = 1 << 3,
115 RIFT_CONFIG_REPORT_MOTION_KEEP_ALIVE = 1 << 4,
117 RIFT_CONFIG_REPORT_COMMAND_KEEP_ALIVE = 1 << 5,
120 RIFT_CONFIG_REPORT_USE_SENSOR_COORDINATES = 1 << 6,
123 RIFT_CONFIG_REPORT_OVERRIDE_POWER = 1 << 7,
126enum rift_distortion_type
128 RIFT_DISTORTION_TYPE_DIMS = 1,
129 RIFT_DISTORTION_TYPE_K = 2,
135 RIFT_LENS_TYPE_A = 0,
137 RIFT_LENS_TYPE_B = 1,
140enum rift_lens_distortion_version
143 RIFT_LENS_DISTORTION_NONE = 0,
145 RIFT_LENS_DISTORTION_LCSV_CATMULL_ROM_10_VERSION_1 = 1,
148enum rift_component_flags
150 RIFT_COMPONENT_DISPLAY = 1 << 0,
151 RIFT_COMPONENT_AUDIO = 1 << 1,
152 RIFT_COMPONENT_LEDS = 1 << 2,
166 uint8_t config_flags;
170 uint16_t sample_rate;
178 uint8_t distortion_type;
180 uint16_t resolution_x;
182 uint16_t resolution_y;
184 uint32_t display_width;
186 uint32_t display_height;
190 uint32_t lens_separation;
191 uint32_t lens_distance[2];
197#define CATMULL_COEFFICIENTS 11
198#define CHROMATIC_ABBERATION_COEFFEICENT_COUNT 4
205 uint16_t k[CATMULL_COEFFICIENTS];
207 uint16_t meters_per_tan_angle_at_center;
208 uint16_t chromatic_abberation[CHROMATIC_ABBERATION_COEFFEICENT_COUNT];
218 uint8_t num_distortions;
220 uint8_t distortion_idx;
226 uint16_t distortion_version;
244enum rift_display_mode
246 RIFT_DISPLAY_MODE_GLOBAL,
247 RIFT_DISPLAY_MODE_ROLLING_TOP_BOTTOM,
248 RIFT_DISPLAY_MODE_ROLLING_LEFT_RIGHT,
249 RIFT_DISPLAY_MODE_ROLLING_RIGHT_LEFT,
252enum rift_display_limit
254 RIFT_DISPLAY_LIMIT_ACL_OFF = 0,
255 RIFT_DISPLAY_LIMIT_ACL_30 = 1,
256 RIFT_DISPLAY_LIMIT_ACL_25 = 2,
257 RIFT_DISPLAY_LIMIT_ACL_50 = 3,
260enum rift_display_flags
262 RIFT_DISPLAY_USE_ROLLING = 1 << 6,
263 RIFT_DISPLAY_REVERSE_ROLLING = 1 << 7,
264 RIFT_DISPLAY_HIGH_BRIGHTNESS = 1 << 8,
265 RIFT_DISPLAY_SELF_REFRESH = 1 << 9,
266 RIFT_DISPLAY_READ_PIXEL = 1 << 10,
267 RIFT_DISPLAY_DIRECT_PENTILE = 1 << 11,
287 uint16_t persistence;
290 uint16_t lighting_offset;
292 uint16_t pixel_settle;
326 uint16_t presence_sensor;
327 uint16_t iad_adc_value;
333 "Incorrect version data size");
335#define DK2_MAX_SAMPLES 2
340 uint16_t sample_count;
341 uint16_t temperature;
342 uint32_t sample_timestamp;
348 uint16_t frame_count;
349 uint32_t frame_timestamp;
351 uint8_t tracking_pattern;
352 uint16_t tracking_count;
353 uint32_t tracking_timestamp;
372 uint16_t temperature;
377enum rift_radio_read_cmd
379 RIFT_RADIO_READ_CMD_FLASH_CONTROL = 0x0a,
380 RIFT_RADIO_READ_CMD_SERIAL = 0x88,
413 uint8_t radio_address[5];
418enum rift_radio_report_remote_button_masks
420 RIFT_REMOTE_BUTTON_MASK_DPAD_UP = 0x001,
421 RIFT_REMOTE_BUTTON_MASK_DPAD_DOWN = 0x002,
422 RIFT_REMOTE_BUTTON_MASK_DPAD_LEFT = 0x004,
423 RIFT_REMOTE_BUTTON_MASK_DPAD_RIGHT = 0x008,
424 RIFT_REMOTE_BUTTON_MASK_SELECT = 0x010,
425 RIFT_REMOTE_BUTTON_MASK_VOLUME_UP = 0x020,
426 RIFT_REMOTE_BUTTON_MASK_VOLUME_DOWN = 0x040,
427 RIFT_REMOTE_BUTTON_MASK_OCULUS = 0x080,
428 RIFT_REMOTE_BUTTON_MASK_BACK = 0x100,
439enum rift_radio_report_touch_buttons
441 RIFT_TOUCH_CONTROLLER_BUTTON_A = 0x01,
442 RIFT_TOUCH_CONTROLLER_BUTTON_X = 0x01,
443 RIFT_TOUCH_CONTROLLER_BUTTON_B = 0x02,
444 RIFT_TOUCH_CONTROLLER_BUTTON_Y = 0x02,
445 RIFT_TOUCH_CONTROLLER_BUTTON_MENU = 0x04,
446 RIFT_TOUCH_CONTROLLER_BUTTON_OCULUS = 0x04,
447 RIFT_TOUCH_CONTROLLER_BUTTON_STICK = 0x08,
456 uint8_t touch_grip_stick_state[5];
464enum rift_radio_device_type
466 RIFT_RADIO_DEVICE_REMOTE = 1,
467 RIFT_RADIO_DEVICE_LEFT_TOUCH = 2,
468 RIFT_RADIO_DEVICE_RIGHT_TOUCH = 3,
469 RIFT_RADIO_DEVICE_TRACKED_OBJECT = 6,
502 float k[CATMULL_COEFFICIENTS];
504 float meters_per_tan_angle_at_center;
505 float chromatic_abberation[CHROMATIC_ABBERATION_COEFFEICENT_COUNT];
511 uint16_t distortion_version;
537 float screen_gap_meters;
539 float lens_diameter_meters;
559enum rift_touch_controller_input
562 RIFT_TOUCH_CONTROLLER_INPUT_X_CLICK = 0,
563 RIFT_TOUCH_CONTROLLER_INPUT_X_TOUCH = 1,
564 RIFT_TOUCH_CONTROLLER_INPUT_Y_CLICK = 2,
565 RIFT_TOUCH_CONTROLLER_INPUT_Y_TOUCH = 3,
566 RIFT_TOUCH_CONTROLLER_INPUT_SYSTEM_CLICK = 4,
568 RIFT_TOUCH_CONTROLLER_INPUT_A_CLICK = 0,
569 RIFT_TOUCH_CONTROLLER_INPUT_A_TOUCH = 1,
570 RIFT_TOUCH_CONTROLLER_INPUT_B_CLICK = 2,
571 RIFT_TOUCH_CONTROLLER_INPUT_B_TOUCH = 3,
572 RIFT_TOUCH_CONTROLLER_INPUT_MENU_CLICK = 4,
574 RIFT_TOUCH_CONTROLLER_INPUT_SQUEEZE_VALUE = 5,
575 RIFT_TOUCH_CONTROLLER_INPUT_TRIGGER_TOUCH = 6,
576 RIFT_TOUCH_CONTROLLER_INPUT_TRIGGER_VALUE = 7,
577 RIFT_TOUCH_CONTROLLER_INPUT_THUMBSTICK_CLICK = 8,
578 RIFT_TOUCH_CONTROLLER_INPUT_THUMBSTICK_TOUCH = 9,
579 RIFT_TOUCH_CONTROLLER_INPUT_THUMBSTICK = 10,
580 RIFT_TOUCH_CONTROLLER_INPUT_THUMBREST_TOUCH = 11,
581 RIFT_TOUCH_CONTROLLER_INPUT_GRIP_POSE = 12,
582 RIFT_TOUCH_CONTROLLER_INPUT_AIM_POSE = 13,
583 RIFT_TOUCH_CONTROLLER_INPUT_TRIGGER_PROXIMITY = 14,
584 RIFT_TOUCH_CONTROLLER_INPUT_THUMB_PROXIMITY = 15,
585 RIFT_TOUCH_CONTROLLER_INPUT_COUNT = 16,
597 uint16_t joy_x_range[2];
598 uint16_t joy_x_dead[2];
599 uint16_t joy_y_range[2];
600 uint16_t joy_y_dead[2];
603 uint16_t trigger_range[3];
606 uint16_t middle_range[3];
609 uint16_t cap_sense_min[8];
610 uint16_t cap_sense_touch[8];
612 float gyro_calibration[3][3];
614 float accel_calibration[3][3];
629 uint8_t haptic_counter;
648 enum rift_radio_device_type device_type;
657 bool calibration_read;
667 uint8_t calibration_hash[CALIBRATION_HASH_BYTE_LENGTH];
669 uint8_t calibration_data_buffer[CALIBRATION_BODY_BYTE_CHUNK_LENGTH];
671 uint8_t *calibration_body_json;
672 uint16_t calibration_body_json_length;
677enum rift_remote_inputs
679 RIFT_REMOTE_INPUT_DPAD_UP,
680 RIFT_REMOTE_INPUT_DPAD_DOWN,
681 RIFT_REMOTE_INPUT_DPAD_LEFT,
682 RIFT_REMOTE_INPUT_DPAD_RIGHT,
683 RIFT_REMOTE_INPUT_SELECT,
684 RIFT_REMOTE_INPUT_VOLUME_UP,
685 RIFT_REMOTE_INPUT_VOLUME_DOWN,
686 RIFT_REMOTE_INPUT_BACK,
687 RIFT_REMOTE_INPUT_OCULUS,
688 RIFT_REMOTE_INPUT_COUNT,
707enum rift_radio_command
709 RIFT_RADIO_COMMAND_NONE = 0,
710 RIFT_RADIO_COMMAND_READ_SERIAL,
711 RIFT_RADIO_COMMAND_READ_FLASH,
722typedef int (*flash_read_callback_t)(
void *user_data, uint16_t address, uint16_t length);
733 flash_read_callback_t read_callback;
759 bool processed_sample_packet;
760 uint32_t last_remote_sample_time_us;
768 enum rift_variant variant;
773 uint16_t num_lens_distortions;
774 uint16_t distortion_in_use;
777 float icd_override_m;
781 bool imu_needs_calibration;
784 uint8_t radio_address[5];
801 enum rift_radio_command current_command;
826rift_radio_device_type_to_touch_index(
enum rift_radio_device_type device_type)
828 switch (device_type) {
829 case RIFT_RADIO_DEVICE_LEFT_TOUCH:
return 0;
830 case RIFT_RADIO_DEVICE_RIGHT_TOUCH:
return 1;
831 case RIFT_RADIO_DEVICE_TRACKED_OBJECT:
return 2;
832 default: assert(
false);
838static inline enum rift_radio_device_type
839rift_radio_touch_index_to_device_type(
size_t index)
842 case 0:
return RIFT_RADIO_DEVICE_LEFT_TOUCH;
843 case 1:
return RIFT_RADIO_DEVICE_RIGHT_TOUCH;
844 case 2:
return RIFT_RADIO_DEVICE_TRACKED_OBJECT;
845 default: assert(
false);
848 return (
enum rift_radio_device_type)0;
852rift_touch_calibration_parse(
const char *calibration_data,
853 size_t calibration_size,
u_logging_level
Logging level enum.
Definition: u_logging.h:45
int64_t timepoint_ns
Integer timestamp type.
Definition: u_time.h:77
C interface to math library.
A IMU fusion specially made for 3dof devices.
Wrapper header for <math.h> to ensure pi-related math constants are defined.
static Eigen::Map< const Eigen::Vector3f > position(const struct xrt_pose &pose)
Return a Eigen type wrapping a pose's position (const).
Definition: m_eigen_interop.hpp:217
Wrapper around OS native hid functions.
Wrapper around OS threading native functions.
Interface to Oculus Rift driver code.
static struct rift_hmd * rift_hmd(struct xrt_device *xdev)
Casting helper function.
Definition: rift_internal.h:808
Definition: oh_device.c:483
Definition: rift_internal.h:337
Definition: m_space.cpp:87
Definition: m_clock_tracking.c:35
Definition: m_imu_3dof.h:35
Definition: m_relation_history.cpp:49
Representing a single hid interface on a device.
Definition: os_hid.h:29
A wrapper around a native mutex.
Definition: os_threading.h:69
All in one helper that handles locking, waiting for change and starting a thread.
Definition: os_threading.h:499
Definition: rift_internal.h:500
Definition: rift_internal.h:201
Definition: rift_internal.h:164
Definition: rift_internal.h:325
Definition: rift_internal.h:176
Definition: rift_internal.h:271
Definition: rift_internal.h:236
Definition: rift_internal.h:308
Definition: rift_internal.h:301
Definition: rift_internal.h:316
Definition: rift_internal.h:359
A rift HMD device.
Definition: rift_internal.h:747
struct os_mutex device_mutex
Mutex to protect access to the device array, device count == -1 means uninitialized.
Definition: rift_internal.h:787
struct rift_hmd::@180 radio_state
Generic state for the radio state machine.
Definition: rift_internal.h:368
Definition: rift_internal.h:551
Definition: rift_internal.h:215
Definition: rift_internal.h:509
Definition: rift_internal.h:411
Definition: rift_internal.h:384
Definition: rift_internal.h:725
Definition: rift_internal.h:715
char * serial
A pointer to store the serial string. Must contain at least SERIAL_NUMBER_LENGTH bytes.
Definition: rift_internal.h:717
bool * serial_valid
A pointer to store when reading the serial was successful.
Definition: rift_internal.h:719
Definition: rift_internal.h:394
Definition: rift_internal.h:473
Definition: rift_internal.h:432
Definition: rift_internal.h:451
Definition: rift_internal.h:486
A Rift Remote device.
Definition: rift_internal.h:697
xrt_atomic_s32_t buttons
The button state of the remote, stored as an atomic to avoid needing a mutex.
Definition: rift_internal.h:701
bool serial_valid
Locked by radio_state.thread.
Definition: rift_internal.h:704
Definition: rift_internal.h:521
Definition: rift_internal.h:596
Definition: rift_internal.h:589
A Rift Touch controller device.
Definition: rift_internal.h:643
struct rift_touch_controller::@179 radio_data
Locked by radio_state.thread.
Definition: rift_internal.h:527
Definition: u_worker.c:38
A single HMD or input device.
Definition: xrt_device.h:310
struct xrt_hmd_parts * hmd
Null if this device does not interface with the users head.
Definition: xrt_device.h:322
A tightly packed 3x3 matrix of floats.
Definition: xrt_defines.h:546
A 2 element vector with single floats.
Definition: xrt_defines.h:268
A 3 element vector with single floats.
Definition: xrt_defines.h:289
Misc helpers for device drivers.
Basic logging functionality.
Definition: rift_internal.h:736
Endian-specific byte order defines.