40#define HMD_TRACE(hmd, ...) U_LOG_XDEV_IFL_T(&hmd->base, hmd->log_level, __VA_ARGS__)
41#define HMD_DEBUG(hmd, ...) U_LOG_XDEV_IFL_D(&hmd->base, hmd->log_level, __VA_ARGS__)
42#define HMD_INFO(hmd, ...) U_LOG_XDEV_IFL_I(&hmd->base, hmd->log_level, __VA_ARGS__)
43#define HMD_WARN(hmd, ...) U_LOG_XDEV_IFL_W(&hmd->base, hmd->log_level, __VA_ARGS__)
44#define HMD_ERROR(hmd, ...) U_LOG_XDEV_IFL_E(&hmd->base, hmd->log_level, __VA_ARGS__)
46#define REPORT_MAX_SIZE 69
47#define KEEPALIVE_INTERVAL_NS 10000000000
49#define KEEPALIVE_SEND_RATE_NS ((KEEPALIVE_INTERVAL_NS * 19) / 20)
50#define IMU_SAMPLE_RATE (1000)
51#define NS_PER_SAMPLE (1000 * 1000)
52#define SERIAL_NUMBER_LENGTH 14
53#define RIFT_USB_LATENCY_BIAS (U_TIME_1US_IN_NS * 200LL)
54#define RIFT_RADIO_LATENCY_BIAS (U_TIME_1MS_IN_NS * 4LL)
56#define CALIBRATION_HASH_BYTE_OFFSET 0x1bf0
57#define CALIBRATION_HASH_BYTE_LENGTH 0x10
59#define RIFT_CONFIG_SUBDIR "rift"
61#define CALIBRATION_HEADER_BYTE_OFFSET 0x0
62#define CALIBRATION_HEADER_BYTE_LENGTH 0x4
64#define CALIBRATION_BODY_BYTE_OFFSET 0x4
65#define CALIBRATION_BODY_BYTE_CHUNK_LENGTH 0x14
67#define MICROMETERS_TO_METERS(microns) ((float)microns / 1000000.0f)
70#define DEFAULT_EXTRA_EYE_ROTATION DEG_TO_RAD(30.0f)
72#define IN_REPORT_DK2 11
73#define IN_REPORT_RADIO_DATA 12
74#define IN_REPORT_CV1_RADIO_KEEPALIVE 13
76#define IN_REPORT_RADIO_DATA_SIZE 64
83#define SIZE_ASSERT(type, size) \
84 static_assert(sizeof(type) == (size), "Size of " #type " is not " #size " bytes as was expected")
86enum rift_feature_reports
89 FEATURE_REPORT_CONFIG = 2,
90 FEATURE_REPORT_CALIBRATE = 3,
91 FEATURE_REPORT_RANGE = 4,
92 FEATURE_REPORT_REGISTER = 5,
93 FEATURE_REPORT_DFU = 6,
94 FEATURE_REPORT_DK1_KEEP_ALIVE = 8,
95 FEATURE_REPORT_DISPLAY_INFO = 9,
96 FEATURE_REPORT_SERIAL = 10,
99 FEATURE_REPORT_TRACKING = 12,
100 FEATURE_REPORT_DISPLAY = 13,
101 FEATURE_REPORT_MAG_CALIBRATION = 14,
102 FEATURE_REPORT_POS_CALIBRATION = 15,
103 FEATURE_REPORT_CUSTOM_PATTERN = 16,
104 FEATURE_REPORT_KEEPALIVE_MUX = 17,
105 FEATURE_REPORT_MANUFACTURING = 18,
106 FEATURE_REPORT_UUID = 19,
107 FEATURE_REPORT_TEMPERATURE = 20,
108 FEATURE_REPORT_GYROOFFSET = 21,
109 FEATURE_REPORT_LENS_DISTORTION = 22,
112 FEATURE_REPORT_RADIO_CONTROL = 26,
113 FEATURE_REPORT_RADIO_READ_DATA_CMD = 27,
114 FEATURE_REPORT_ENABLE_COMPONENTS = 29,
117enum rift_config_report_flags
120 RIFT_CONFIG_REPORT_USE_RAW = 1,
122 RIFT_CONFIG_REPORT_INTERNAL_CALIBRATION = 1 << 1,
124 RIFT_CONFIG_REPORT_USE_CALIBRATION = 1 << 2,
126 RIFT_CONFIG_REPORT_AUTO_CALIBRATION = 1 << 3,
128 RIFT_CONFIG_REPORT_MOTION_KEEP_ALIVE = 1 << 4,
130 RIFT_CONFIG_REPORT_COMMAND_KEEP_ALIVE = 1 << 5,
133 RIFT_CONFIG_REPORT_USE_SENSOR_COORDINATES = 1 << 6,
136 RIFT_CONFIG_REPORT_OVERRIDE_POWER = 1 << 7,
139enum rift_distortion_type
141 RIFT_DISTORTION_TYPE_DIMS = 1,
142 RIFT_DISTORTION_TYPE_K = 2,
148 RIFT_LENS_TYPE_A = 0,
150 RIFT_LENS_TYPE_B = 1,
153enum rift_lens_distortion_version
156 RIFT_LENS_DISTORTION_NONE = 0,
158 RIFT_LENS_DISTORTION_LCSV_CATMULL_ROM_10_VERSION_1 = 1,
161enum rift_component_flags
163 RIFT_COMPONENT_DISPLAY = 1 << 0,
164 RIFT_COMPONENT_AUDIO = 1 << 1,
165 RIFT_COMPONENT_LEDS = 1 << 2,
179 uint8_t config_flags;
183 uint16_t sample_rate;
191 uint8_t distortion_type;
193 uint16_t resolution_x;
195 uint16_t resolution_y;
197 uint32_t display_width;
199 uint32_t display_height;
203 uint32_t lens_separation;
204 uint32_t lens_distance[2];
210#define CATMULL_COEFFICIENTS 11
217 uint16_t k[CATMULL_COEFFICIENTS];
219 uint16_t meters_per_tan_angle_at_center;
220 uint16_t chromatic_abberation[U_RIFT_CHROMATIC_ABBERATION_COUNT];
230 uint8_t num_distortions;
232 uint8_t distortion_idx;
238 uint16_t distortion_version;
247enum rift_position_calibration_version
250 RIFT_POSITION_CALIBRATION_VERSION_NONE = 0,
252 RIFT_POSITION_CALIBRATION_VERSION_DEFAULT = 1,
254 RIFT_POSITION_CALIBRATION_VERSION_FACTORY = 2,
256 RIFT_POSITION_CALIBRATION_VERSION_USER = 3,
259enum rift_position_calibration_type
261 RIFT_POSITION_CALIBRATION_TYPE_LED = 0,
262 RIFT_POSITION_CALIBRATION_TYPE_INERTIAL_SENSOR = 1,
279 uint16_t position_index;
281 uint16_t position_count;
283 uint16_t position_type;
288enum rift_custom_pattern_state
290 RIFT_CUSTOM_PATTERN_STAT_OFF = 0,
291 RIFT_CUSTOM_PATTERN_STAT_LOW = 1,
292 RIFT_CUSTOM_PATTERN_STAT_HIGH = 3,
299 uint8_t sequence_length;
320enum rift_display_mode
322 RIFT_DISPLAY_MODE_GLOBAL,
323 RIFT_DISPLAY_MODE_ROLLING_TOP_BOTTOM,
324 RIFT_DISPLAY_MODE_ROLLING_LEFT_RIGHT,
325 RIFT_DISPLAY_MODE_ROLLING_RIGHT_LEFT,
328enum rift_display_limit
330 RIFT_DISPLAY_LIMIT_ACL_OFF = 0,
331 RIFT_DISPLAY_LIMIT_ACL_30 = 1,
332 RIFT_DISPLAY_LIMIT_ACL_25 = 2,
333 RIFT_DISPLAY_LIMIT_ACL_50 = 3,
336enum rift_display_flags
338 RIFT_DISPLAY_USE_ROLLING = 1 << 6,
339 RIFT_DISPLAY_REVERSE_ROLLING = 1 << 7,
340 RIFT_DISPLAY_HIGH_BRIGHTNESS = 1 << 8,
341 RIFT_DISPLAY_SELF_REFRESH = 1 << 9,
342 RIFT_DISPLAY_READ_PIXEL = 1 << 10,
343 RIFT_DISPLAY_DIRECT_PENTILE = 1 << 11,
363 uint16_t persistence;
366 uint16_t lighting_offset;
368 uint16_t pixel_settle;
402 uint16_t presence_sensor;
403 uint16_t iad_adc_value;
409 "Incorrect version data size");
411#define DK2_MAX_SAMPLES 2
416 uint16_t sample_count;
417 uint16_t temperature;
418 uint32_t sample_timestamp;
424 uint16_t frame_count;
425 uint32_t frame_timestamp;
427 uint8_t tracking_pattern;
428 uint16_t tracking_count;
429 uint32_t tracking_timestamp;
448 uint16_t temperature;
453enum rift_radio_read_cmd
455 RIFT_RADIO_READ_CMD_FLASH_CONTROL = 0x0a,
456 RIFT_RADIO_READ_CMD_SERIAL = 0x88,
489 uint8_t radio_address[5];
494enum rift_radio_report_remote_button_masks
496 RIFT_REMOTE_BUTTON_MASK_DPAD_UP = 0x001,
497 RIFT_REMOTE_BUTTON_MASK_DPAD_DOWN = 0x002,
498 RIFT_REMOTE_BUTTON_MASK_DPAD_LEFT = 0x004,
499 RIFT_REMOTE_BUTTON_MASK_DPAD_RIGHT = 0x008,
500 RIFT_REMOTE_BUTTON_MASK_SELECT = 0x010,
501 RIFT_REMOTE_BUTTON_MASK_VOLUME_UP = 0x020,
502 RIFT_REMOTE_BUTTON_MASK_VOLUME_DOWN = 0x040,
503 RIFT_REMOTE_BUTTON_MASK_OCULUS = 0x080,
504 RIFT_REMOTE_BUTTON_MASK_BACK = 0x100,
515enum rift_radio_report_touch_buttons
517 RIFT_TOUCH_CONTROLLER_BUTTON_A = 0x01,
518 RIFT_TOUCH_CONTROLLER_BUTTON_X = 0x01,
519 RIFT_TOUCH_CONTROLLER_BUTTON_B = 0x02,
520 RIFT_TOUCH_CONTROLLER_BUTTON_Y = 0x02,
521 RIFT_TOUCH_CONTROLLER_BUTTON_MENU = 0x04,
522 RIFT_TOUCH_CONTROLLER_BUTTON_OCULUS = 0x04,
523 RIFT_TOUCH_CONTROLLER_BUTTON_STICK = 0x08,
526enum rift_radio_report_adc_channel
528 RIFT_TOUCH_CONTROLLER_ADC_STICK = 0x01,
529 RIFT_TOUCH_CONTROLLER_ADC_B_Y = 0x02,
530 RIFT_TOUCH_CONTROLLER_ADC_TRIGGER = 0x03,
531 RIFT_TOUCH_CONTROLLER_ADC_A_X = 0x04,
532 RIFT_TOUCH_CONTROLLER_ADC_THUMBREST = 0x08,
535 RIFT_TOUCH_CONTROLLER_ADC_UNK1 = 0x20,
536 RIFT_TOUCH_CONTROLLER_ADC_BATTERY = 0x21,
537 RIFT_TOUCH_CONTROLLER_ADC_HAPTIC_COUNTER = 0x23,
546 uint8_t touch_grip_stick_state[5];
554enum rift_radio_device_type
556 RIFT_RADIO_DEVICE_REMOTE = 1,
557 RIFT_RADIO_DEVICE_LEFT_TOUCH = 2,
558 RIFT_RADIO_DEVICE_RIGHT_TOUCH = 3,
559 RIFT_RADIO_DEVICE_TRACKED_OBJECT = 6,
581enum rift_tracking_flags
584 RIFT_TRACKING_ENABLE = 1 << 0,
586 RIFT_TRACKING_AUTO_INCREMENT = 1 << 1,
588 RIFT_TRACKING_USE_CARRIER = 1 << 2,
590 RIFT_TRACKING_SYNC_INPUT = 1 << 3,
592 RIFT_TRACKING_VSYNC_LOCK = 1 << 4,
594 RIFT_TRACKING_CUSTOM_PATTERN = 1 << 5,
606 uint16_t exposure_length;
609 uint16_t frame_interval;
611 uint16_t vsync_offset;
629 float k[CATMULL_COEFFICIENTS];
631 float meters_per_tan_angle_at_center;
632 float chromatic_abberation[U_RIFT_CHROMATIC_ABBERATION_COUNT];
638 uint16_t distortion_version;
656enum rift_touch_controller_input
659 RIFT_TOUCH_CONTROLLER_INPUT_X_CLICK = 0,
660 RIFT_TOUCH_CONTROLLER_INPUT_X_TOUCH = 1,
661 RIFT_TOUCH_CONTROLLER_INPUT_Y_CLICK = 2,
662 RIFT_TOUCH_CONTROLLER_INPUT_Y_TOUCH = 3,
663 RIFT_TOUCH_CONTROLLER_INPUT_SYSTEM_CLICK = 4,
665 RIFT_TOUCH_CONTROLLER_INPUT_A_CLICK = 0,
666 RIFT_TOUCH_CONTROLLER_INPUT_A_TOUCH = 1,
667 RIFT_TOUCH_CONTROLLER_INPUT_B_CLICK = 2,
668 RIFT_TOUCH_CONTROLLER_INPUT_B_TOUCH = 3,
669 RIFT_TOUCH_CONTROLLER_INPUT_MENU_CLICK = 4,
671 RIFT_TOUCH_CONTROLLER_INPUT_SQUEEZE_VALUE = 5,
672 RIFT_TOUCH_CONTROLLER_INPUT_TRIGGER_TOUCH = 6,
673 RIFT_TOUCH_CONTROLLER_INPUT_TRIGGER_VALUE = 7,
674 RIFT_TOUCH_CONTROLLER_INPUT_THUMBSTICK_CLICK = 8,
675 RIFT_TOUCH_CONTROLLER_INPUT_THUMBSTICK_TOUCH = 9,
676 RIFT_TOUCH_CONTROLLER_INPUT_THUMBSTICK = 10,
677 RIFT_TOUCH_CONTROLLER_INPUT_THUMBREST_TOUCH = 11,
678 RIFT_TOUCH_CONTROLLER_INPUT_GRIP_POSE = 12,
679 RIFT_TOUCH_CONTROLLER_INPUT_AIM_POSE = 13,
680 RIFT_TOUCH_CONTROLLER_INPUT_TRIGGER_PROXIMITY = 14,
681 RIFT_TOUCH_CONTROLLER_INPUT_THUMB_PROXIMITY = 15,
682 RIFT_TOUCH_CONTROLLER_INPUT_COUNT = 16,
694 uint16_t joy_x_range[2];
695 uint16_t joy_x_dead[2];
696 uint16_t joy_y_range[2];
697 uint16_t joy_y_dead[2];
700 uint16_t trigger_range[3];
703 uint16_t middle_range[3];
706 uint16_t cap_sense_min[8];
707 uint16_t cap_sense_touch[8];
709 float gyro_calibration[3][3];
711 float accel_calibration[3][3];
726 uint8_t haptic_counter;
746 enum rift_radio_device_type device_type;
755 xrt_atomic_s32_t battery_status;
757 uint32_t last_device_remote_us;
766 bool calibration_read;
786 uint8_t calibration_hash[CALIBRATION_HASH_BYTE_LENGTH];
788 uint8_t calibration_data_buffer[CALIBRATION_BODY_BYTE_CHUNK_LENGTH];
790 uint8_t *calibration_body_json;
791 uint16_t calibration_body_json_length;
796enum rift_remote_inputs
798 RIFT_REMOTE_INPUT_DPAD_UP,
799 RIFT_REMOTE_INPUT_DPAD_DOWN,
800 RIFT_REMOTE_INPUT_DPAD_LEFT,
801 RIFT_REMOTE_INPUT_DPAD_RIGHT,
802 RIFT_REMOTE_INPUT_SELECT,
803 RIFT_REMOTE_INPUT_VOLUME_UP,
804 RIFT_REMOTE_INPUT_VOLUME_DOWN,
805 RIFT_REMOTE_INPUT_BACK,
806 RIFT_REMOTE_INPUT_OCULUS,
807 RIFT_REMOTE_INPUT_COUNT,
827enum rift_radio_command
829 RIFT_RADIO_COMMAND_NONE = 0,
830 RIFT_RADIO_COMMAND_READ_SERIAL,
831 RIFT_RADIO_COMMAND_READ_FLASH,
832 RIFT_RADIO_COMMAND_SEND_HAPTICS,
843typedef int (*flash_read_callback_t)(
void *user_data, uint16_t address, uint16_t length);
854 flash_read_callback_t read_callback;
863#define RIFT_EXPOSURE_HISTORY_SIZE 16
901 bool use_constellation_poses;
908 uint32_t last_remote_sample_time_us;
912 uint32_t last_remote_exposure_time_us;
919 uint16_t last_tracking_count;
931 enum rift_variant variant;
941 uint16_t num_lens_distortions;
942 uint16_t distortion_in_use;
949 float icd_override_m;
953 bool imu_needs_calibration;
956 uint8_t radio_address[5];
965 struct t_constellation_tracker *constellation_tracker;
968 t_constellation_device_id_t constellation_device_id;
974 struct m_ff_f64 *gravity_correction;
991 enum rift_radio_command current_command;
1034rift_radio_device_type_to_touch_index(
enum rift_radio_device_type device_type)
1036 switch (device_type) {
1037 case RIFT_RADIO_DEVICE_LEFT_TOUCH:
return 0;
1038 case RIFT_RADIO_DEVICE_RIGHT_TOUCH:
return 1;
1039 case RIFT_RADIO_DEVICE_TRACKED_OBJECT:
return 2;
1040 default: assert(
false);
1046static inline enum rift_radio_device_type
1047rift_radio_touch_index_to_device_type(
size_t index)
1050 case 0:
return RIFT_RADIO_DEVICE_LEFT_TOUCH;
1051 case 1:
return RIFT_RADIO_DEVICE_RIGHT_TOUCH;
1052 case 2:
return RIFT_RADIO_DEVICE_TRACKED_OBJECT;
1053 default: assert(
false);
1056 return (
enum rift_radio_device_type)0;
1062 return (value - calibration->cap_sense_min[index]) /
1063 (calibration->cap_sense_touch[index] - calibration->cap_sense_min[index]);
1067rift_min_mid_max_range_to_float(uint16_t range[3], uint16_t value)
1069 if (value < range[1]) {
1070 return 1.0f - ((float)value - range[0]) / (range[1] - range[0]) * 0.5f;
1072 return 0.5f - ((float)value - range[1]) / (range[2] - range[1]) * 0.5f;
1077rift_touch_calibration_parse(
const char *calibration_data,
1078 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
#define container_of(ptr, type, field)
Get the holder from a pointer to a field.
Definition xrt_compiler.h:298
C interface to math library.
Helpers to estimate offsets between clocks.
A fifo that also lets you dynamically filter.
A IMU fusion specially made for 3dof devices.
Wrapper header for <math.h> to ensure pi-related math constants are defined.
Wrapper around OS native hid functions.
Wrapper around OS threading native functions.
Interface to Oculus Rift driver code.
#define RIFT_EXPOSURE_HISTORY_SIZE
How many past exposures a frame can be matched against. At ~60 Hz this is a little over a quarter sec...
Definition rift_internal.h:863
Definition oh_device.c:483
Definition rift_internal.h:413
Definition m_space.cpp:87
Definition m_clock_tracking.c:35
Definition m_filter_fifo.c:198
Definition m_filter_fifo.c:23
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:627
Definition rift_internal.h:213
Definition rift_internal.h:177
Definition rift_internal.h:296
Definition rift_internal.h:401
Definition rift_internal.h:189
Definition rift_internal.h:347
Definition rift_internal.h:312
Definition rift_internal.h:384
Definition rift_internal.h:377
Definition rift_internal.h:392
Definition rift_internal.h:435
One camera exposure the HMD told us about, held so that late frames can still find the exposure they ...
Definition rift_internal.h:867
timepoint_ns timestamp_ns
When the exposure started, in local monotonic time. This is what frames matched to it are timestamped...
Definition rift_internal.h:871
timepoint_ns recv_timestamp_ns
When the IN report announcing this exposure arrived, in local monotonic time.
Definition rift_internal.h:879
uint32_t sequence_id
The value of rift_hmd::exposure_counter at this exposure.
Definition rift_internal.h:869
A rift HMD device.
Definition rift_internal.h:890
timepoint_ns last_local_exposure_time_ns
The time of the last exposure, locked by sensor_thread.
Definition rift_internal.h:916
struct rift_exposure_event exposure_history[16]
The most recent exposures, newest at (exposure_history_pushed - 1) % RIFT_EXPOSURE_HISTORY_SIZE,...
Definition rift_internal.h:923
struct os_mutex device_mutex
Mutex to protect access to the device array, device count == -1 means uninitialized.
Definition rift_internal.h:959
float default_icd
Interpupillary distance of the headset, in meters.
Definition rift_internal.h:948
timepoint_ns last_remote_exposure_time_ns
The time of the last exposure in remote time, only accessed from the sensor thread,...
Definition rift_internal.h:914
struct rift_hmd::@181 radio_state
Generic state for the radio state machine.
uint32_t exposure_counter
A total counter for how many exposures have occurred.
Definition rift_internal.h:918
uint64_t exposure_history_pushed
How many exposures have ever been pushed into the history, locked by sensor_thread.
Definition rift_internal.h:925
Definition rift_internal.h:444
Definition rift_internal.h:648
Definition rift_internal.h:227
Definition rift_internal.h:636
Definition rift_internal.h:266
Definition rift_internal.h:487
Definition rift_internal.h:460
Definition rift_internal.h:846
Definition rift_internal.h:836
char * serial
A pointer to store the serial string. Must contain at least SERIAL_NUMBER_LENGTH bytes.
Definition rift_internal.h:838
bool * serial_valid
A pointer to store when reading the serial was successful.
Definition rift_internal.h:840
Definition rift_internal.h:470
Definition rift_internal.h:563
Definition rift_internal.h:508
Definition rift_internal.h:541
Definition rift_internal.h:576
A Rift Remote device.
Definition rift_internal.h:816
xrt_atomic_s32_t buttons
The button state of the remote, stored as an atomic to avoid needing a mutex.
Definition rift_internal.h:821
bool serial_valid
Locked by radio_state.thread.
Definition rift_internal.h:824
Definition rift_internal.h:693
Definition rift_internal.h:686
A Rift Touch controller device.
Definition rift_internal.h:740
struct rift_touch_controller::@179 radio_data
Locked by radio_state.thread.
Definition rift_internal.h:598
A constellation tracker device is a device that the constellation tracker will attempt to track in 6d...
Definition t_constellation.h:362
The LED model is a series of points which define the real-world positions of all LEDs.
Definition t_constellation.h:286
A constellation tracker tracking source is an arbitrary source of tracking data for the constellation...
Definition t_constellation.h:229
A time sync sink is a component that receives timing events from a stable timing source,...
Definition t_time_sync.h:69
A time sync source is a component that generates timing events for an t_timing_event_sink to consume.
Definition t_time_sync.h:102
Definition u_distortion_mesh.h:242
Definition u_distortion_mesh.h:223
A single HMD or input device.
Definition xrt_device.h:357
Object used to track all sinks and frame producers in a graph.
Definition xrt_frame.h:108
A interface object used for destroying a frame graph.
Definition xrt_frame.h:87
IMU Sample.
Definition xrt_tracking.h:139
An object to send IMU samples to.
Definition xrt_tracking.h:181
A tightly packed 3x3 matrix of floats.
Definition xrt_defines.h:580
A pose composed of a position and orientation.
Definition xrt_defines.h:513
A 2 element vector with single floats.
Definition xrt_defines.h:279
A 3 element vector with single floats.
Definition xrt_defines.h:310
Header defining the tracking system integration in Monado.
C interface to basic IMU fusion.
Header defining interfaces for time synchronization in Monado.
Misc helpers for device drivers.
Code to generate disortion meshes.
Basic logging functionality.
Definition rift_internal.h:857
Endian-specific byte order defines.