Monado OpenXR Runtime
Loading...
Searching...
No Matches
pimax_p2.c File Reference

Pimax P2 driver implementation. More...

#include "xrt/xrt_device.h"
#include "xrt/xrt_results.h"
#include "util/u_misc.h"
#include "util/u_debug.h"
#include "util/u_time.h"
#include "util/u_device.h"
#include "util/u_var.h"
#include "util/u_file.h"
#include "math/m_vec2.h"
#include "math/m_api.h"
#include "os/os_time.h"
#include "pimax_p2.h"
#include <cjson/cJSON.h>
Include dependency graph for pimax_p2.c:

Macros

#define OFFSETS_MIN   -0.15
 
#define OFFSETS_MAX   0.15
 
#define OFFSETS_STEP   0.00005
 
#define PIMAX_P2_VID   0x0483
 
#define PIMAX_P2_PID   0x0101
 
#define PIMAX_P2_POLL_TIMEOUT   5
 
#define PIMAX_P2_POLL_WAIT   10
 
#define PIMAX_P2_POLL_KEEPALIVE_WAIT_COUNT   50
 
#define PIMAX_MESHES_DEFAULT_PATH   ".config/pimax/meshes"
 
#define PIMAX_MESHES_PATH_ENV_VAR   "PIMAX_MESHES_PATH"
 
#define PIMAX_MESH_NAME_ENV_VAR   "PIMAX_MESH_NAME"
 

Functions

static void pimax_8kx_get_display_props (struct pimax_p2_device *dev, struct pimax_p2_display_properties *out_props)
 
static void pimax_5ks_get_display_props (struct pimax_p2_device *dev, struct pimax_p2_display_properties *out_props)
 
static void pimax_p2d_get_display_props (struct pimax_p2_device *dev, struct pimax_p2_display_properties *out_props)
 
static void pimax_p2c_get_display_props (struct pimax_p2_device *dev, struct pimax_p2_display_properties *out_props)
 
static void pimax_p2b_get_display_props (struct pimax_p2_device *dev, struct pimax_p2_display_properties *out_props)
 
static void pimax_p2ea_get_display_props (struct pimax_p2_device *dev, struct pimax_p2_display_properties *out_props)
 
static void pimax_p2z_get_display_props (struct pimax_p2_device *dev, struct pimax_p2_display_properties *out_props)
 
static void pimax_p2y_get_display_props (struct pimax_p2_device *dev, struct pimax_p2_display_properties *out_props)
 
static void init_display_8kx (struct pimax_p2_device *dev)
 
static void init_display_p2c (struct pimax_p2_device *dev)
 
static float pimax_p2_8kx_lens_separation_from_raw (int16_t raw)
 
static float pimax_p2_8kx_ipd_from_raw (uint16_t raw)
 
static void pimax_p2_8kx_read_config (struct pimax_p2_device *dev)
 
static bool pimax_p2_get_power_status (hid_device *hid)
 
static void pimax_p2_8kx_poll_locked (struct pimax_p2_device *dev)
 
static void pimax_p2_open_hid (hid_device **dev)
 
static void pimax_p2_8kx_poll (struct pimax_p2_device *dev)
 
static void * pimax_p2_poll_thread_func (void *ptr)
 
static void pimax_p2_update_fovs_from_mesh (struct pimax_p2_device *dev, struct xrt_hmd_parts *hmd)
 
static void pimax_p2_delete_mesh_set (struct pimax_p2_device *dev)
 
static size_t pimax_p2_get_mesh_path (struct pimax_p2_device *dev, size_t max_len, char *out_path)
 
static void pimax_p2_load_meshes_from_file (struct pimax_p2_device *dev, const char *path)
 
static time_duration_ns init_p2_pimax8kx (struct hid_device_info *devinfo, struct pimax_p2_device **pdev)
 
xrt_result_t pimax_p2_get_view_poses (struct pimax_p2_device *dev, const struct xrt_vec3 *default_eye_relation, struct xrt_hmd_parts *hmd, uint32_t view_count, struct xrt_fov *out_fovs, struct xrt_pose *out_poses)
 Like xrt_device->get_view_poses, but does not fill in the head relation.
 
static void pimax_p2_fill_display (struct xrt_hmd_parts *hmd, struct pimax_p2_display_properties *display_props)
 
xrt_result_t pimax_p2_get_brightness (struct pimax_p2_device *dev, float *out_brightness)
 Get backlight brightness from 0 to 1.
 
xrt_result_t pimax_p2_set_brightness (struct pimax_p2_device *dev, float brightness, bool relative)
 Set backlight brightness from 0 to 1.
 
xrt_result_t pimax_p2_compute_distortion_from_mesh (struct pimax_p2_device *dev, uint32_t view, float u, float v, struct xrt_uv_triplet *out_result)
 Compute distortion, using the mesh loaded by init.
 
bool pimax_p2_init (struct pimax_p2_device **pdev)
 Initializes the Pimax HID device, enables the displays, and allocates and populates pdev with data.
 
void pimax_p2_destroy (struct pimax_p2_device *dev)
 Clean up a pimax_p2_device.
 
bool pimax_p2_setup_hmd (struct pimax_p2_device *pdev, struct xrt_hmd_parts *hmd)
 Fills the xrt_hmd_parts with data.
 

Variables

struct pimax_p2_model_config model_configs []
 
uint8_t pimax_packet_parallel_projections_off [64]
 
uint8_t pimax_init2 [64]
 
uint8_t pimax_keepalive [64]
 
uint8_t pimax_hmd_power [64]
 
uint8_t pimax_reboot [64]
 
uint8_t pimax_poll_freq [6] = {0x11, 0x00, 0x00, 0x0b, 0x10, 0x27}
 

Detailed Description

Pimax P2 driver implementation.

Author
Coreforge BC549.nosp@m.b@gm.nosp@m.ail.c.nosp@m.om

Variable Documentation

◆ model_configs

struct pimax_p2_model_config model_configs[]
Initial value:
= {
{L"Pimax P2EA", "Pimax 8K Plus", "p2ea.json", {pimax_p2ea_get_display_props, init_display_8kx}},
{L"Pimax P2E", "Pimax 8K Plus", "p2e.json", {pimax_p2ea_get_display_props, init_display_p2c}},
{L"Pimax P2A", "Pimax 5K Super", "p2a.json", {pimax_5ks_get_display_props, init_display_8kx}},
{L"Pimax P2C", "Pimax 5K Super", "p2c.json", {pimax_p2c_get_display_props, init_display_p2c}},
{L"Pimax P2N", "Pimax 8KX", "p2n.json", {pimax_8kx_get_display_props, init_display_8kx}},
{L"Pimax P2D", "Pimax 5K+", "p2d.json", {pimax_p2d_get_display_props, init_display_8kx}},
{L"Pimax P2B", "Pimax 5K XR", "p2b.json", {pimax_p2b_get_display_props, init_display_8kx}},
{L"Pimax P2Z", "Pimax 5K Super", "p2z.json", {pimax_p2z_get_display_props, init_display_8kx}},
{L"Pimax P2F", "Pimax 5K Super", "p2f.json", {pimax_p2z_get_display_props, init_display_8kx}},
{L"Pimax P2Y", "Pimax Artisan", "p2y.json", {pimax_p2y_get_display_props, init_display_8kx}},
}

◆ pimax_hmd_power

uint8_t pimax_hmd_power[64]
Initial value:
= {0xF0, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}

◆ pimax_init2

uint8_t pimax_init2[64]
Initial value:
= {0xF0, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xf6, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}

◆ pimax_keepalive

uint8_t pimax_keepalive[64]
Initial value:
= {0xF0, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}

◆ pimax_packet_parallel_projections_off

uint8_t pimax_packet_parallel_projections_off[64]
Initial value:
= {
0xF0, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}

◆ pimax_reboot

uint8_t pimax_reboot[64]
Initial value:
= {0xF0, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}