39#define HMD_TRACE(hmd, ...) U_LOG_XDEV_IFL_T(&hmd->base, hmd->log_level, __VA_ARGS__)
40#define HMD_DEBUG(hmd, ...) U_LOG_XDEV_IFL_D(&hmd->base, hmd->log_level, __VA_ARGS__)
41#define HMD_INFO(hmd, ...) U_LOG_XDEV_IFL_I(&hmd->base, hmd->log_level, __VA_ARGS__)
42#define HMD_WARN(hmd, ...) U_LOG_XDEV_IFL_W(&hmd->base, hmd->log_level, __VA_ARGS__)
43#define HMD_ERROR(hmd, ...) U_LOG_XDEV_IFL_E(&hmd->base, hmd->log_level, __VA_ARGS__)
45#define REPORT_MAX_SIZE 69
46#define KEEPALIVE_INTERVAL_NS 10000000000
48#define KEEPALIVE_SEND_RATE_NS ((KEEPALIVE_INTERVAL_NS * 19) / 20)
49#define IMU_SAMPLE_RATE (1000)
50#define NS_PER_SAMPLE (1000 * 1000)
51#define SERIAL_NUMBER_LENGTH 14
52#define RIFT_USB_LATENCY_BIAS (U_TIME_1US_IN_NS * 200LL)
53#define RIFT_RADIO_LATENCY_BIAS (U_TIME_1MS_IN_NS * 4LL)
55#define CALIBRATION_HASH_BYTE_OFFSET 0x1bf0
56#define CALIBRATION_HASH_BYTE_LENGTH 0x10
58#define RIFT_CONFIG_SUBDIR "rift"
60#define CALIBRATION_HEADER_BYTE_OFFSET 0x0
61#define CALIBRATION_HEADER_BYTE_LENGTH 0x4
63#define CALIBRATION_BODY_BYTE_OFFSET 0x4
64#define CALIBRATION_BODY_BYTE_CHUNK_LENGTH 0x14
66#define MICROMETERS_TO_METERS(microns) ((float)microns / 1000000.0f)
69#define DEFAULT_EXTRA_EYE_ROTATION DEG_TO_RAD(30.0f)
71#define IN_REPORT_DK2 11
72#define IN_REPORT_RADIO_DATA 12
73#define IN_REPORT_CV1_RADIO_KEEPALIVE 13
75#define IN_REPORT_RADIO_DATA_SIZE 64
82#define SIZE_ASSERT(type, size) \
83 static_assert(sizeof(type) == (size), "Size of " #type " is not " #size " bytes as was expected")
85enum rift_feature_reports
88 FEATURE_REPORT_CONFIG = 2,
89 FEATURE_REPORT_CALIBRATE = 3,
90 FEATURE_REPORT_RANGE = 4,
91 FEATURE_REPORT_REGISTER = 5,
92 FEATURE_REPORT_DFU = 6,
93 FEATURE_REPORT_DK1_KEEP_ALIVE = 8,
94 FEATURE_REPORT_DISPLAY_INFO = 9,
95 FEATURE_REPORT_SERIAL = 10,
98 FEATURE_REPORT_TRACKING = 12,
99 FEATURE_REPORT_DISPLAY = 13,
100 FEATURE_REPORT_MAG_CALIBRATION = 14,
101 FEATURE_REPORT_POS_CALIBRATION = 15,
102 FEATURE_REPORT_CUSTOM_PATTERN = 16,
103 FEATURE_REPORT_KEEPALIVE_MUX = 17,
104 FEATURE_REPORT_MANUFACTURING = 18,
105 FEATURE_REPORT_UUID = 19,
106 FEATURE_REPORT_TEMPERATURE = 20,
107 FEATURE_REPORT_GYROOFFSET = 21,
108 FEATURE_REPORT_LENS_DISTORTION = 22,
111 FEATURE_REPORT_RADIO_CONTROL = 26,
112 FEATURE_REPORT_RADIO_READ_DATA_CMD = 27,
113 FEATURE_REPORT_ENABLE_COMPONENTS = 29,
116enum rift_config_report_flags
119 RIFT_CONFIG_REPORT_USE_RAW = 1,
121 RIFT_CONFIG_REPORT_INTERNAL_CALIBRATION = 1 << 1,
123 RIFT_CONFIG_REPORT_USE_CALIBRATION = 1 << 2,
125 RIFT_CONFIG_REPORT_AUTO_CALIBRATION = 1 << 3,
127 RIFT_CONFIG_REPORT_MOTION_KEEP_ALIVE = 1 << 4,
129 RIFT_CONFIG_REPORT_COMMAND_KEEP_ALIVE = 1 << 5,
132 RIFT_CONFIG_REPORT_USE_SENSOR_COORDINATES = 1 << 6,
135 RIFT_CONFIG_REPORT_OVERRIDE_POWER = 1 << 7,
138enum rift_distortion_type
140 RIFT_DISTORTION_TYPE_DIMS = 1,
141 RIFT_DISTORTION_TYPE_K = 2,
147 RIFT_LENS_TYPE_A = 0,
149 RIFT_LENS_TYPE_B = 1,
152enum rift_lens_distortion_version
155 RIFT_LENS_DISTORTION_NONE = 0,
157 RIFT_LENS_DISTORTION_LCSV_CATMULL_ROM_10_VERSION_1 = 1,
160enum rift_component_flags
162 RIFT_COMPONENT_DISPLAY = 1 << 0,
163 RIFT_COMPONENT_AUDIO = 1 << 1,
164 RIFT_COMPONENT_LEDS = 1 << 2,
178 uint8_t config_flags;
182 uint16_t sample_rate;
190 uint8_t distortion_type;
192 uint16_t resolution_x;
194 uint16_t resolution_y;
196 uint32_t display_width;
198 uint32_t display_height;
202 uint32_t lens_separation;
203 uint32_t lens_distance[2];
209#define CATMULL_COEFFICIENTS 11
210#define CHROMATIC_ABBERATION_COEFFEICENT_COUNT 4
217 uint16_t k[CATMULL_COEFFICIENTS];
219 uint16_t meters_per_tan_angle_at_center;
220 uint16_t chromatic_abberation[CHROMATIC_ABBERATION_COEFFEICENT_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[CHROMATIC_ABBERATION_COEFFEICENT_COUNT];
638 uint16_t distortion_version;
664 float screen_gap_meters;
666 float lens_diameter_meters;
686enum rift_touch_controller_input
689 RIFT_TOUCH_CONTROLLER_INPUT_X_CLICK = 0,
690 RIFT_TOUCH_CONTROLLER_INPUT_X_TOUCH = 1,
691 RIFT_TOUCH_CONTROLLER_INPUT_Y_CLICK = 2,
692 RIFT_TOUCH_CONTROLLER_INPUT_Y_TOUCH = 3,
693 RIFT_TOUCH_CONTROLLER_INPUT_SYSTEM_CLICK = 4,
695 RIFT_TOUCH_CONTROLLER_INPUT_A_CLICK = 0,
696 RIFT_TOUCH_CONTROLLER_INPUT_A_TOUCH = 1,
697 RIFT_TOUCH_CONTROLLER_INPUT_B_CLICK = 2,
698 RIFT_TOUCH_CONTROLLER_INPUT_B_TOUCH = 3,
699 RIFT_TOUCH_CONTROLLER_INPUT_MENU_CLICK = 4,
701 RIFT_TOUCH_CONTROLLER_INPUT_SQUEEZE_VALUE = 5,
702 RIFT_TOUCH_CONTROLLER_INPUT_TRIGGER_TOUCH = 6,
703 RIFT_TOUCH_CONTROLLER_INPUT_TRIGGER_VALUE = 7,
704 RIFT_TOUCH_CONTROLLER_INPUT_THUMBSTICK_CLICK = 8,
705 RIFT_TOUCH_CONTROLLER_INPUT_THUMBSTICK_TOUCH = 9,
706 RIFT_TOUCH_CONTROLLER_INPUT_THUMBSTICK = 10,
707 RIFT_TOUCH_CONTROLLER_INPUT_THUMBREST_TOUCH = 11,
708 RIFT_TOUCH_CONTROLLER_INPUT_GRIP_POSE = 12,
709 RIFT_TOUCH_CONTROLLER_INPUT_AIM_POSE = 13,
710 RIFT_TOUCH_CONTROLLER_INPUT_TRIGGER_PROXIMITY = 14,
711 RIFT_TOUCH_CONTROLLER_INPUT_THUMB_PROXIMITY = 15,
712 RIFT_TOUCH_CONTROLLER_INPUT_COUNT = 16,
724 uint16_t joy_x_range[2];
725 uint16_t joy_x_dead[2];
726 uint16_t joy_y_range[2];
727 uint16_t joy_y_dead[2];
730 uint16_t trigger_range[3];
733 uint16_t middle_range[3];
736 uint16_t cap_sense_min[8];
737 uint16_t cap_sense_touch[8];
739 float gyro_calibration[3][3];
741 float accel_calibration[3][3];
756 uint8_t haptic_counter;
776 enum rift_radio_device_type device_type;
785 xrt_atomic_s32_t battery_status;
787 uint32_t last_device_remote_us;
796 bool calibration_read;
816 uint8_t calibration_hash[CALIBRATION_HASH_BYTE_LENGTH];
818 uint8_t calibration_data_buffer[CALIBRATION_BODY_BYTE_CHUNK_LENGTH];
820 uint8_t *calibration_body_json;
821 uint16_t calibration_body_json_length;
826enum rift_remote_inputs
828 RIFT_REMOTE_INPUT_DPAD_UP,
829 RIFT_REMOTE_INPUT_DPAD_DOWN,
830 RIFT_REMOTE_INPUT_DPAD_LEFT,
831 RIFT_REMOTE_INPUT_DPAD_RIGHT,
832 RIFT_REMOTE_INPUT_SELECT,
833 RIFT_REMOTE_INPUT_VOLUME_UP,
834 RIFT_REMOTE_INPUT_VOLUME_DOWN,
835 RIFT_REMOTE_INPUT_BACK,
836 RIFT_REMOTE_INPUT_OCULUS,
837 RIFT_REMOTE_INPUT_COUNT,
857enum rift_radio_command
859 RIFT_RADIO_COMMAND_NONE = 0,
860 RIFT_RADIO_COMMAND_READ_SERIAL,
861 RIFT_RADIO_COMMAND_READ_FLASH,
862 RIFT_RADIO_COMMAND_SEND_HAPTICS,
873typedef int (*flash_read_callback_t)(
void *user_data, uint16_t address, uint16_t length);
884 flash_read_callback_t read_callback;
893#define RIFT_EXPOSURE_HISTORY_SIZE 16
931 bool use_constellation_poses;
938 uint32_t last_remote_sample_time_us;
942 uint32_t last_remote_exposure_time_us;
949 uint16_t last_tracking_count;
961 enum rift_variant variant;
971 uint16_t num_lens_distortions;
972 uint16_t distortion_in_use;
975 float icd_override_m;
979 bool imu_needs_calibration;
982 uint8_t radio_address[5];
991 struct t_constellation_tracker *constellation_tracker;
994 t_constellation_device_id_t constellation_device_id;
1000 struct m_ff_f64 *gravity_correction;
1017 enum rift_radio_command current_command;
1060rift_radio_device_type_to_touch_index(
enum rift_radio_device_type device_type)
1062 switch (device_type) {
1063 case RIFT_RADIO_DEVICE_LEFT_TOUCH:
return 0;
1064 case RIFT_RADIO_DEVICE_RIGHT_TOUCH:
return 1;
1065 case RIFT_RADIO_DEVICE_TRACKED_OBJECT:
return 2;
1066 default: assert(
false);
1072static inline enum rift_radio_device_type
1073rift_radio_touch_index_to_device_type(
size_t index)
1076 case 0:
return RIFT_RADIO_DEVICE_LEFT_TOUCH;
1077 case 1:
return RIFT_RADIO_DEVICE_RIGHT_TOUCH;
1078 case 2:
return RIFT_RADIO_DEVICE_TRACKED_OBJECT;
1079 default: assert(
false);
1082 return (
enum rift_radio_device_type)0;
1088 return (value - calibration->cap_sense_min[index]) /
1089 (calibration->cap_sense_touch[index] - calibration->cap_sense_min[index]);
1093rift_min_mid_max_range_to_float(uint16_t range[3], uint16_t value)
1095 if (value < range[1]) {
1096 return 1.0f - ((float)value - range[0]) / (range[1] - range[0]) * 0.5f;
1098 return 0.5f - ((float)value - range[1]) / (range[2] - range[1]) * 0.5f;
1103rift_touch_calibration_parse(
const char *calibration_data,
1104 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:893
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:176
Definition rift_internal.h:296
Definition rift_internal.h:401
Definition rift_internal.h:188
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:897
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:901
uint32_t sequence
The value of rift_hmd::exposure_counter at this exposure.
Definition rift_internal.h:899
timepoint_ns recv_timestamp_ns
When the IN report announcing this exposure arrived, in local monotonic time.
Definition rift_internal.h:909
A rift HMD device.
Definition rift_internal.h:920
timepoint_ns last_local_exposure_time_ns
The time of the last exposure, locked by sensor_thread.
Definition rift_internal.h:946
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:953
struct os_mutex device_mutex
Mutex to protect access to the device array, device count == -1 means uninitialized.
Definition rift_internal.h:985
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:944
uint32_t exposure_counter
A total counter for how many exposures have occurred.
Definition rift_internal.h:948
uint64_t exposure_history_pushed
How many exposures have ever been pushed into the history, locked by sensor_thread.
Definition rift_internal.h:955
struct rift_hmd::@180 radio_state
Generic state for the radio state machine.
Definition rift_internal.h:444
Definition rift_internal.h:678
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:876
Definition rift_internal.h:866
char * serial
A pointer to store the serial string. Must contain at least SERIAL_NUMBER_LENGTH bytes.
Definition rift_internal.h:868
bool * serial_valid
A pointer to store when reading the serial was successful.
Definition rift_internal.h:870
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:846
xrt_atomic_s32_t buttons
The button state of the remote, stored as an atomic to avoid needing a mutex.
Definition rift_internal.h:851
bool serial_valid
Locked by radio_state.thread.
Definition rift_internal.h:854
Definition rift_internal.h:648
Definition rift_internal.h:723
Definition rift_internal.h:716
A Rift Touch controller device.
Definition rift_internal.h:770
struct rift_touch_controller::@178 radio_data
Locked by radio_state.thread.
Definition rift_internal.h:598
Definition rift_internal.h:654
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
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.
Basic logging functionality.
Definition rift_internal.h:887
Endian-specific byte order defines.