mirror of
https://gitlab.freedesktop.org/monado/monado.git
synced 2025-01-23 23:21:46 +00:00
151 lines
3.2 KiB
C
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
|