monado/src/xrt/drivers/rift_s/rift_s_firmware.h
Jan Schmidt 9fbe81e494 d/rift_s: Port OpenHMD Oculus Rift S driver
Port across the Oculus Rift S driver from OpenHMD as a native
Monado driver.

This is mostly the same as the OpenHMD 3DOF driver, with
slightly better HMD distortion correction, various small
fixes, some capsense touch detection support.

Controller poses are rotated 40° to match grip pose.
2022-09-25 02:17:44 +10:00

151 lines
3.2 KiB
C

/*
* Copyright 2020 Jan Schmidt
* SPDX-License-Identifier: BSL-1.0
*
* OpenHMD - Free and Open Source API and drivers for immersive technology.
*/
/*!
* @file
* @brief Oculus Rift S firmware parsing interface
*
* Functions for parsing JSON configuration from the HMD
* and Touch Controller firmware.
*
* @author Jan Schmidt <jan@centricular.com>
* @ingroup drv_rift_s
*/
#ifndef __RTFT_S_FIRMWARE__
#define __RTFT_S_FIRMWARE__
#include "math/m_mathinclude.h"
#include "math/m_api.h"
#include "rift_s.h"
enum rift_s_firmware_block
{
RIFT_S_FIRMWARE_BLOCK_SERIAL_NUM = 0x0B,
RIFT_S_FIRMWARE_BLOCK_THRESHOLD = 0xD,
RIFT_S_FIRMWARE_BLOCK_IMU_CALIB = 0xE,
RIFT_S_FIRMWARE_BLOCK_CAMERA_CALIB = 0xF,
RIFT_S_FIRMWARE_BLOCK_DISPLAY_COLOR_CALIB = 0x10,
RIFT_S_FIRMWARE_BLOCK_LENS_CALIB = 0x12
};
enum rift_s_camera_ids
{
RIFT_S_CAMERA_TOP = 0x0,
RIFT_S_CAMERA_SIDE_LEFT = 0x1,
RIFT_S_CAMERA_FRONT_RIGHT = 0x2,
RIFT_S_CAMERA_FRONT_LEFT = 0x3,
RIFT_S_CAMERA_SIDE_RIGHT = 0x4,
};
struct rift_s_imu_calibration
{
struct xrt_matrix_4x4 device_from_imu;
struct
{
struct xrt_matrix_3x3 rectification;
struct xrt_vec3 offset;
} gyro;
struct
{
struct xrt_matrix_3x3 rectification;
struct xrt_vec3 offset_at_0C;
struct xrt_vec3 temp_coeff;
} accel;
};
struct rift_s_projection_pinhole
{
float cx, cy; /* Principal point */
float fx, fy; /* Focal length */
};
struct rift_s_fisheye62_distortion
{
float k[6]; /* Radial distortion coefficients */
float p2, p1; /* Tangential distortion parameters */
};
struct rift_s_camera_calibration
{
struct xrt_rect roi;
struct xrt_matrix_4x4 device_from_camera;
struct rift_s_projection_pinhole projection;
struct rift_s_fisheye62_distortion distortion;
};
#define RIFT_S_MAX_CAMERAS 5
struct rift_s_camera_calibration_block
{
struct rift_s_camera_calibration cameras[RIFT_S_MAX_CAMERAS];
};
/* Rift S controller LED entry */
struct rift_s_led
{
// Relative position in metres
struct xrt_vec3 pos;
// Normal
struct xrt_vec3 dir;
// 85.0, 80.0, 0.0 in all entries so far
struct xrt_vec3 angles;
};
struct rift_s_lensing_model
{
int num_points;
float points[4];
};
struct rift_s_controller_imu_calibration
{
struct
{
struct xrt_matrix_3x3 rectification;
struct xrt_vec3 offset;
} gyro;
struct
{
struct xrt_matrix_3x3 rectification;
struct xrt_vec3 offset;
} accel;
struct xrt_vec3 imu_position;
uint8_t num_leds;
struct rift_s_led *leds;
/* For some reason we have a separate calibration
* 4x4 matrix on top of the separate rectification
* and offset for gyro and accel
*/
struct xrt_matrix_4x4 gyro_calibration;
struct xrt_matrix_4x4 accel_calibration;
/* Lensing models */
int num_lensing_models;
struct rift_s_lensing_model *lensing_models;
};
int
rift_s_parse_proximity_threshold(char *json, int *proximity_threshold);
int
rift_s_parse_imu_calibration(char *json, struct rift_s_imu_calibration *c);
int
rift_s_parse_camera_calibration_block(char *json, struct rift_s_camera_calibration_block *c);
int
rift_s_controller_parse_imu_calibration(char *json, struct rift_s_controller_imu_calibration *c);
void
rift_s_controller_free_imu_calibration(struct rift_s_controller_imu_calibration *c);
#endif