38#define HMD_TRACE(hmd, ...) U_LOG_XDEV_IFL_T(&hmd->base, hmd->log_level, __VA_ARGS__)
39#define HMD_DEBUG(hmd, ...) U_LOG_XDEV_IFL_D(&hmd->base, hmd->log_level, __VA_ARGS__)
40#define HMD_INFO(hmd, ...) U_LOG_XDEV_IFL_I(&hmd->base, hmd->log_level, __VA_ARGS__)
41#define HMD_WARN(hmd, ...) U_LOG_XDEV_IFL_W(&hmd->base, hmd->log_level, __VA_ARGS__)
42#define HMD_ERROR(hmd, ...) U_LOG_XDEV_IFL_E(&hmd->base, hmd->log_level, __VA_ARGS__)
44#define REPORT_MAX_SIZE 69
45#define KEEPALIVE_INTERVAL_NS 10000000000
47#define KEEPALIVE_SEND_RATE_NS ((KEEPALIVE_INTERVAL_NS * 19) / 20)
48#define IMU_SAMPLE_RATE (1000)
49#define NS_PER_SAMPLE (1000 * 1000)
50#define SERIAL_NUMBER_LENGTH 14
52#define CALIBRATION_HASH_BYTE_OFFSET 0x1bf0
53#define CALIBRATION_HASH_BYTE_LENGTH 0x10
55#define RIFT_CONFIG_SUBDIR "rift"
57#define CALIBRATION_HEADER_BYTE_OFFSET 0x0
58#define CALIBRATION_HEADER_BYTE_LENGTH 0x4
60#define CALIBRATION_BODY_BYTE_OFFSET 0x4
61#define CALIBRATION_BODY_BYTE_CHUNK_LENGTH 0x14
63#define MICROMETERS_TO_METERS(microns) ((float)microns / 1000000.0f)
66#define DEFAULT_EXTRA_EYE_ROTATION DEG_TO_RAD(30.0f)
68#define IN_REPORT_DK2 11
69#define IN_REPORT_RADIO_DATA 12
70#define IN_REPORT_CV1_RADIO_KEEPALIVE 13
72#define IN_REPORT_RADIO_DATA_SIZE 64
79#define SIZE_ASSERT(type, size) \
80 static_assert(sizeof(type) == (size), "Size of " #type " is not " #size " bytes as was expected")
82enum rift_feature_reports
85 FEATURE_REPORT_CONFIG = 2,
86 FEATURE_REPORT_CALIBRATE = 3,
87 FEATURE_REPORT_RANGE = 4,
88 FEATURE_REPORT_REGISTER = 5,
89 FEATURE_REPORT_DFU = 6,
90 FEATURE_REPORT_DK1_KEEP_ALIVE = 8,
91 FEATURE_REPORT_DISPLAY_INFO = 9,
92 FEATURE_REPORT_SERIAL = 10,
95 FEATURE_REPORT_TRACKING = 12,
96 FEATURE_REPORT_DISPLAY = 13,
97 FEATURE_REPORT_MAG_CALIBRATION = 14,
98 FEATURE_REPORT_POS_CALIBRATION = 15,
99 FEATURE_REPORT_CUSTOM_PATTERN = 16,
100 FEATURE_REPORT_KEEPALIVE_MUX = 17,
101 FEATURE_REPORT_MANUFACTURING = 18,
102 FEATURE_REPORT_UUID = 19,
103 FEATURE_REPORT_TEMPERATURE = 20,
104 FEATURE_REPORT_GYROOFFSET = 21,
105 FEATURE_REPORT_LENS_DISTORTION = 22,
108 FEATURE_REPORT_RADIO_CONTROL = 26,
109 FEATURE_REPORT_RADIO_READ_DATA_CMD = 27,
110 FEATURE_REPORT_ENABLE_COMPONENTS = 29,
113enum rift_config_report_flags
116 RIFT_CONFIG_REPORT_USE_RAW = 1,
118 RIFT_CONFIG_REPORT_INTERNAL_CALIBRATION = 1 << 1,
120 RIFT_CONFIG_REPORT_USE_CALIBRATION = 1 << 2,
122 RIFT_CONFIG_REPORT_AUTO_CALIBRATION = 1 << 3,
124 RIFT_CONFIG_REPORT_MOTION_KEEP_ALIVE = 1 << 4,
126 RIFT_CONFIG_REPORT_COMMAND_KEEP_ALIVE = 1 << 5,
129 RIFT_CONFIG_REPORT_USE_SENSOR_COORDINATES = 1 << 6,
132 RIFT_CONFIG_REPORT_OVERRIDE_POWER = 1 << 7,
135enum rift_distortion_type
137 RIFT_DISTORTION_TYPE_DIMS = 1,
138 RIFT_DISTORTION_TYPE_K = 2,
144 RIFT_LENS_TYPE_A = 0,
146 RIFT_LENS_TYPE_B = 1,
149enum rift_lens_distortion_version
152 RIFT_LENS_DISTORTION_NONE = 0,
154 RIFT_LENS_DISTORTION_LCSV_CATMULL_ROM_10_VERSION_1 = 1,
157enum rift_component_flags
159 RIFT_COMPONENT_DISPLAY = 1 << 0,
160 RIFT_COMPONENT_AUDIO = 1 << 1,
161 RIFT_COMPONENT_LEDS = 1 << 2,
175 uint8_t config_flags;
179 uint16_t sample_rate;
187 uint8_t distortion_type;
189 uint16_t resolution_x;
191 uint16_t resolution_y;
193 uint32_t display_width;
195 uint32_t display_height;
199 uint32_t lens_separation;
200 uint32_t lens_distance[2];
206#define CATMULL_COEFFICIENTS 11
207#define CHROMATIC_ABBERATION_COEFFEICENT_COUNT 4
214 uint16_t k[CATMULL_COEFFICIENTS];
216 uint16_t meters_per_tan_angle_at_center;
217 uint16_t chromatic_abberation[CHROMATIC_ABBERATION_COEFFEICENT_COUNT];
227 uint8_t num_distortions;
229 uint8_t distortion_idx;
235 uint16_t distortion_version;
244enum rift_position_calibration_version
247 RIFT_POSITION_CALIBRATION_VERSION_NONE = 0,
249 RIFT_POSITION_CALIBRATION_VERSION_DEFAULT = 1,
251 RIFT_POSITION_CALIBRATION_VERSION_FACTORY = 2,
253 RIFT_POSITION_CALIBRATION_VERSION_USER = 3,
256enum rift_position_calibration_type
258 RIFT_POSITION_CALIBRATION_TYPE_LED = 0,
259 RIFT_POSITION_CALIBRATION_TYPE_INERTIAL_SENSOR = 1,
276 uint16_t position_index;
278 uint16_t position_count;
280 uint16_t position_type;
285enum rift_custom_pattern_state
287 RIFT_CUSTOM_PATTERN_STAT_OFF = 0,
288 RIFT_CUSTOM_PATTERN_STAT_LOW = 1,
289 RIFT_CUSTOM_PATTERN_STAT_HIGH = 3,
296 uint8_t sequence_length;
317enum rift_display_mode
319 RIFT_DISPLAY_MODE_GLOBAL,
320 RIFT_DISPLAY_MODE_ROLLING_TOP_BOTTOM,
321 RIFT_DISPLAY_MODE_ROLLING_LEFT_RIGHT,
322 RIFT_DISPLAY_MODE_ROLLING_RIGHT_LEFT,
325enum rift_display_limit
327 RIFT_DISPLAY_LIMIT_ACL_OFF = 0,
328 RIFT_DISPLAY_LIMIT_ACL_30 = 1,
329 RIFT_DISPLAY_LIMIT_ACL_25 = 2,
330 RIFT_DISPLAY_LIMIT_ACL_50 = 3,
333enum rift_display_flags
335 RIFT_DISPLAY_USE_ROLLING = 1 << 6,
336 RIFT_DISPLAY_REVERSE_ROLLING = 1 << 7,
337 RIFT_DISPLAY_HIGH_BRIGHTNESS = 1 << 8,
338 RIFT_DISPLAY_SELF_REFRESH = 1 << 9,
339 RIFT_DISPLAY_READ_PIXEL = 1 << 10,
340 RIFT_DISPLAY_DIRECT_PENTILE = 1 << 11,
360 uint16_t persistence;
363 uint16_t lighting_offset;
365 uint16_t pixel_settle;
399 uint16_t presence_sensor;
400 uint16_t iad_adc_value;
406 "Incorrect version data size");
408#define DK2_MAX_SAMPLES 2
413 uint16_t sample_count;
414 uint16_t temperature;
415 uint32_t sample_timestamp;
421 uint16_t frame_count;
422 uint32_t frame_timestamp;
424 uint8_t tracking_pattern;
425 uint16_t tracking_count;
426 uint32_t tracking_timestamp;
445 uint16_t temperature;
450enum rift_radio_read_cmd
452 RIFT_RADIO_READ_CMD_FLASH_CONTROL = 0x0a,
453 RIFT_RADIO_READ_CMD_SERIAL = 0x88,
486 uint8_t radio_address[5];
491enum rift_radio_report_remote_button_masks
493 RIFT_REMOTE_BUTTON_MASK_DPAD_UP = 0x001,
494 RIFT_REMOTE_BUTTON_MASK_DPAD_DOWN = 0x002,
495 RIFT_REMOTE_BUTTON_MASK_DPAD_LEFT = 0x004,
496 RIFT_REMOTE_BUTTON_MASK_DPAD_RIGHT = 0x008,
497 RIFT_REMOTE_BUTTON_MASK_SELECT = 0x010,
498 RIFT_REMOTE_BUTTON_MASK_VOLUME_UP = 0x020,
499 RIFT_REMOTE_BUTTON_MASK_VOLUME_DOWN = 0x040,
500 RIFT_REMOTE_BUTTON_MASK_OCULUS = 0x080,
501 RIFT_REMOTE_BUTTON_MASK_BACK = 0x100,
512enum rift_radio_report_touch_buttons
514 RIFT_TOUCH_CONTROLLER_BUTTON_A = 0x01,
515 RIFT_TOUCH_CONTROLLER_BUTTON_X = 0x01,
516 RIFT_TOUCH_CONTROLLER_BUTTON_B = 0x02,
517 RIFT_TOUCH_CONTROLLER_BUTTON_Y = 0x02,
518 RIFT_TOUCH_CONTROLLER_BUTTON_MENU = 0x04,
519 RIFT_TOUCH_CONTROLLER_BUTTON_OCULUS = 0x04,
520 RIFT_TOUCH_CONTROLLER_BUTTON_STICK = 0x08,
523enum rift_radio_report_adc_channel
525 RIFT_TOUCH_CONTROLLER_ADC_STICK = 0x01,
526 RIFT_TOUCH_CONTROLLER_ADC_B_Y = 0x02,
527 RIFT_TOUCH_CONTROLLER_ADC_TRIGGER = 0x03,
528 RIFT_TOUCH_CONTROLLER_ADC_A_X = 0x04,
529 RIFT_TOUCH_CONTROLLER_ADC_THUMBREST = 0x08,
532 RIFT_TOUCH_CONTROLLER_ADC_UNK1 = 0x20,
533 RIFT_TOUCH_CONTROLLER_ADC_BATTERY = 0x21,
534 RIFT_TOUCH_CONTROLLER_ADC_HAPTIC_COUNTER = 0x23,
543 uint8_t touch_grip_stick_state[5];
551enum rift_radio_device_type
553 RIFT_RADIO_DEVICE_REMOTE = 1,
554 RIFT_RADIO_DEVICE_LEFT_TOUCH = 2,
555 RIFT_RADIO_DEVICE_RIGHT_TOUCH = 3,
556 RIFT_RADIO_DEVICE_TRACKED_OBJECT = 6,
578enum rift_tracking_flags
581 RIFT_TRACKING_ENABLE = 1 << 0,
583 RIFT_TRACKING_AUTO_INCREMENT = 1 << 1,
585 RIFT_TRACKING_USE_CARRIER = 1 << 2,
587 RIFT_TRACKING_SYNC_INPUT = 1 << 3,
589 RIFT_TRACKING_VSYNC_LOCK = 1 << 4,
591 RIFT_TRACKING_CUSTOM_PATTERN = 1 << 5,
603 uint16_t exposure_length;
606 uint16_t frame_interval;
608 uint16_t vsync_offset;
626 float k[CATMULL_COEFFICIENTS];
628 float meters_per_tan_angle_at_center;
629 float chromatic_abberation[CHROMATIC_ABBERATION_COEFFEICENT_COUNT];
635 uint16_t distortion_version;
661 float screen_gap_meters;
663 float lens_diameter_meters;
683enum rift_touch_controller_input
686 RIFT_TOUCH_CONTROLLER_INPUT_X_CLICK = 0,
687 RIFT_TOUCH_CONTROLLER_INPUT_X_TOUCH = 1,
688 RIFT_TOUCH_CONTROLLER_INPUT_Y_CLICK = 2,
689 RIFT_TOUCH_CONTROLLER_INPUT_Y_TOUCH = 3,
690 RIFT_TOUCH_CONTROLLER_INPUT_SYSTEM_CLICK = 4,
692 RIFT_TOUCH_CONTROLLER_INPUT_A_CLICK = 0,
693 RIFT_TOUCH_CONTROLLER_INPUT_A_TOUCH = 1,
694 RIFT_TOUCH_CONTROLLER_INPUT_B_CLICK = 2,
695 RIFT_TOUCH_CONTROLLER_INPUT_B_TOUCH = 3,
696 RIFT_TOUCH_CONTROLLER_INPUT_MENU_CLICK = 4,
698 RIFT_TOUCH_CONTROLLER_INPUT_SQUEEZE_VALUE = 5,
699 RIFT_TOUCH_CONTROLLER_INPUT_TRIGGER_TOUCH = 6,
700 RIFT_TOUCH_CONTROLLER_INPUT_TRIGGER_VALUE = 7,
701 RIFT_TOUCH_CONTROLLER_INPUT_THUMBSTICK_CLICK = 8,
702 RIFT_TOUCH_CONTROLLER_INPUT_THUMBSTICK_TOUCH = 9,
703 RIFT_TOUCH_CONTROLLER_INPUT_THUMBSTICK = 10,
704 RIFT_TOUCH_CONTROLLER_INPUT_THUMBREST_TOUCH = 11,
705 RIFT_TOUCH_CONTROLLER_INPUT_GRIP_POSE = 12,
706 RIFT_TOUCH_CONTROLLER_INPUT_AIM_POSE = 13,
707 RIFT_TOUCH_CONTROLLER_INPUT_TRIGGER_PROXIMITY = 14,
708 RIFT_TOUCH_CONTROLLER_INPUT_THUMB_PROXIMITY = 15,
709 RIFT_TOUCH_CONTROLLER_INPUT_COUNT = 16,
721 uint16_t joy_x_range[2];
722 uint16_t joy_x_dead[2];
723 uint16_t joy_y_range[2];
724 uint16_t joy_y_dead[2];
727 uint16_t trigger_range[3];
730 uint16_t middle_range[3];
733 uint16_t cap_sense_min[8];
734 uint16_t cap_sense_touch[8];
736 float gyro_calibration[3][3];
738 float accel_calibration[3][3];
753 uint8_t haptic_counter;
772 enum rift_radio_device_type device_type;
781 xrt_atomic_s32_t battery_status;
783 uint32_t last_device_remote_us;
792 bool calibration_read;
812 uint8_t calibration_hash[CALIBRATION_HASH_BYTE_LENGTH];
814 uint8_t calibration_data_buffer[CALIBRATION_BODY_BYTE_CHUNK_LENGTH];
816 uint8_t *calibration_body_json;
817 uint16_t calibration_body_json_length;
822enum rift_remote_inputs
824 RIFT_REMOTE_INPUT_DPAD_UP,
825 RIFT_REMOTE_INPUT_DPAD_DOWN,
826 RIFT_REMOTE_INPUT_DPAD_LEFT,
827 RIFT_REMOTE_INPUT_DPAD_RIGHT,
828 RIFT_REMOTE_INPUT_SELECT,
829 RIFT_REMOTE_INPUT_VOLUME_UP,
830 RIFT_REMOTE_INPUT_VOLUME_DOWN,
831 RIFT_REMOTE_INPUT_BACK,
832 RIFT_REMOTE_INPUT_OCULUS,
833 RIFT_REMOTE_INPUT_COUNT,
852enum rift_radio_command
854 RIFT_RADIO_COMMAND_NONE = 0,
855 RIFT_RADIO_COMMAND_READ_SERIAL,
856 RIFT_RADIO_COMMAND_READ_FLASH,
857 RIFT_RADIO_COMMAND_SEND_HAPTICS,
868typedef int (*flash_read_callback_t)(
void *user_data, uint16_t address, uint16_t length);
879 flash_read_callback_t read_callback;
903 bool use_constellation_poses;
910 uint32_t last_remote_sample_time_us;
914 uint32_t last_remote_exposure_time_us;
921 uint16_t last_tracking_count;
927 enum rift_variant variant;
936 uint16_t num_lens_distortions;
937 uint16_t distortion_in_use;
940 float icd_override_m;
944 bool imu_needs_calibration;
947 uint8_t radio_address[5];
956 struct t_constellation_tracker *constellation_tracker;
959 t_constellation_device_id_t constellation_device_id;
965 struct m_ff_f64 *gravity_correction;
980 enum rift_radio_command current_command;
1005rift_radio_device_type_to_touch_index(
enum rift_radio_device_type device_type)
1007 switch (device_type) {
1008 case RIFT_RADIO_DEVICE_LEFT_TOUCH:
return 0;
1009 case RIFT_RADIO_DEVICE_RIGHT_TOUCH:
return 1;
1010 case RIFT_RADIO_DEVICE_TRACKED_OBJECT:
return 2;
1011 default: assert(
false);
1017static inline enum rift_radio_device_type
1018rift_radio_touch_index_to_device_type(
size_t index)
1021 case 0:
return RIFT_RADIO_DEVICE_LEFT_TOUCH;
1022 case 1:
return RIFT_RADIO_DEVICE_RIGHT_TOUCH;
1023 case 2:
return RIFT_RADIO_DEVICE_TRACKED_OBJECT;
1024 default: assert(
false);
1027 return (
enum rift_radio_device_type)0;
1033 return (value - calibration->cap_sense_min[index]) /
1034 (calibration->cap_sense_touch[index] - calibration->cap_sense_min[index]);
1038rift_min_mid_max_range_to_float(uint16_t range[3], uint16_t value)
1040 if (value < range[1]) {
1041 return 1.0f - ((float)value - range[0]) / (range[1] - range[0]) * 0.5f;
1043 return 0.5f - ((float)value - range[1]) / (range[2] - range[1]) * 0.5f;
1048rift_touch_calibration_parse(
const char *calibration_data,
1049 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.
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.
Definition b_timing_source.h:23
Definition oh_device.c:483
Definition rift_internal.h:410
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:624
Definition rift_internal.h:210
Definition rift_internal.h:173
Definition rift_internal.h:293
Definition rift_internal.h:398
Definition rift_internal.h:185
Definition rift_internal.h:344
Definition rift_internal.h:309
Definition rift_internal.h:381
Definition rift_internal.h:374
Definition rift_internal.h:389
Definition rift_internal.h:432
A rift HMD device.
Definition rift_internal.h:895
timepoint_ns last_local_exposure_time_ns
The time of the last exposure, locked by sensor_thread.
Definition rift_internal.h:918
struct os_mutex device_mutex
Mutex to protect access to the device array, device count == -1 means uninitialized.
Definition rift_internal.h:950
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:916
uint32_t exposure_counter
A total counter for how many exposures have occurred.
Definition rift_internal.h:920
struct rift_hmd::@182 radio_state
Generic state for the radio state machine.
Definition rift_internal.h:441
Definition rift_internal.h:675
Definition rift_internal.h:224
Definition rift_internal.h:633
Definition rift_internal.h:263
Definition rift_internal.h:484
Definition rift_internal.h:457
Definition rift_internal.h:871
Definition rift_internal.h:861
char * serial
A pointer to store the serial string. Must contain at least SERIAL_NUMBER_LENGTH bytes.
Definition rift_internal.h:863
bool * serial_valid
A pointer to store when reading the serial was successful.
Definition rift_internal.h:865
Definition rift_internal.h:467
Definition rift_internal.h:560
Definition rift_internal.h:505
Definition rift_internal.h:538
Definition rift_internal.h:573
A Rift Remote device.
Definition rift_internal.h:842
xrt_atomic_s32_t buttons
The button state of the remote, stored as an atomic to avoid needing a mutex.
Definition rift_internal.h:846
bool serial_valid
Locked by radio_state.thread.
Definition rift_internal.h:849
Definition rift_internal.h:645
Definition rift_internal.h:720
Definition rift_internal.h:713
A Rift Touch controller device.
Definition rift_internal.h:767
struct rift_touch_controller::@180 radio_data
Locked by radio_state.thread.
Definition rift_internal.h:595
Definition rift_internal.h:651
A constellation tracker device is a device that the constellation tracker will attempt to track in 6d...
Definition t_constellation.h:315
The LED model is a series of points which define the real-world positions of all LEDs.
Definition t_constellation.h:260
A constellation tracker tracking source is an arbitrary source of tracking data for the constellation...
Definition t_constellation.h:215
A single HMD or input device.
Definition xrt_device.h:311
IMU Sample.
Definition xrt_tracking.h:134
A tightly packed 3x3 matrix of floats.
Definition xrt_defines.h:559
A pose composed of a position and orientation.
Definition xrt_defines.h:492
A 2 element vector with single floats.
Definition xrt_defines.h:268
A 3 element vector with single floats.
Definition xrt_defines.h:289
Header defining the tracking system integration in Monado.
C interface to basic IMU fusion.
Misc helpers for device drivers.
Basic logging functionality.
Definition rift_internal.h:882
Endian-specific byte order defines.