1 // Copyright 2013, Fredrik Hultin.
2 // Copyright 2013, Jakob Bornecrantz.
3 // SPDX-License-Identifier: BSL-1.0
4 /*
5  * OpenHMD - Free and Open Source API and drivers for immersive technology.
6  */
7 
8 /* Deepoon Driver Internal Interface */
9 
10 
11 #ifndef DEEPOON_H
12 #define DEEPOON_H
13 
14 #include "../openhmdi.h"
15 
16 #define FEATURE_BUFFER_SIZE 256
17 
18 typedef enum {
19 	RIFT_CMD_SENSOR_CONFIG = 2,
20 	RIFT_CMD_RANGE = 4,
21 	RIFT_CMD_KEEP_ALIVE = 8,
22 	RIFT_CMD_DISPLAY_INFO = 9
23 } rift_sensor_feature_cmd;
24 
25 typedef enum {
26 	RIFT_CF_SENSOR,
27 	RIFT_CF_HMD
28 } rift_coordinate_frame;
29 
30 typedef enum {
31 	RIFT_IRQ_SENSORS = 1
32 } rift_irq_cmd;
33 
34 typedef enum {
35 	RIFT_DT_NONE,
36 	RIFT_DT_SCREEN_ONLY,
37 	RIFT_DT_DISTORTION
38 } rift_distortion_type;
39 
40 // Sensor config flags
41 #define RIFT_SCF_RAW_MODE           0x01
42 #define RIFT_SCF_CALIBRATION_TEST   0x02
43 #define RIFT_SCF_USE_CALIBRATION    0x04
44 #define RIFT_SCF_AUTO_CALIBRATION   0x08
45 #define RIFT_SCF_MOTION_KEEP_ALIVE  0x10
46 #define RIFT_SCF_COMMAND_KEEP_ALIVE 0x20
47 #define RIFT_SCF_SENSOR_COORDINATES 0x40
48 
49 
50 
51 typedef struct {
52 	uint16_t command_id;
53 	uint16_t accel_scale;
54 	uint16_t gyro_scale;
55 	uint16_t mag_scale;
56 } pkt_sensor_range;
57 
58 typedef struct {
59 	int32_t accel[3];
60 	int32_t gyro[3];
61 } pkt_tracker_sample;
62 
63 typedef struct {
64 	uint8_t report_id;
65 	uint8_t sample_delta;
66 	uint16_t sample_number;
67 	uint32_t tick;
68 	pkt_tracker_sample samples[2];
69 	int16_t mag[3];
70 } pkt_tracker_sensor;
71 
72 typedef struct {
73     uint16_t command_id;
74     uint8_t flags;
75     uint16_t packet_interval;
76     uint16_t keep_alive_interval; // in ms
77 } pkt_sensor_config;
78 
79 typedef struct {
80 	uint16_t command_id;
81 	rift_distortion_type distortion_type;
82 	uint8_t distortion_type_opts;
83 	uint16_t h_resolution, v_resolution;
84 	float h_screen_size, v_screen_size;
85 	float v_center;
86 	float lens_separation;
87 	float eye_to_screen_distance[2];
88 	float distortion_k[6];
89 } pkt_sensor_display_info;
90 
91 typedef struct {
92 	uint16_t command_id;
93 	uint16_t keep_alive_interval;
94 } pkt_keep_alive;
95 
96 
97 bool dp_decode_sensor_range(pkt_sensor_range* range, const unsigned char* buffer, int size);
98 bool dp_decode_sensor_display_info(pkt_sensor_display_info* info, const unsigned char* buffer, int size);
99 bool dp_decode_sensor_config(pkt_sensor_config* config, const unsigned char* buffer, int size);
100 bool dp_decode_tracker_sensor_msg(pkt_tracker_sensor* msg, const unsigned char* buffer, int size);
101 
102 void vec3f_from_dp_vec(const int32_t* smp, vec3f* out_vec);
103 
104 int dp_encode_sensor_config(unsigned char* buffer, const pkt_sensor_config* config);
105 int dp_encode_keep_alive(unsigned char* buffer, const pkt_keep_alive* keep_alive);
106 
107 void dp_dump_packet_sensor_range(const pkt_sensor_range* range);
108 void dp_dump_packet_sensor_config(const pkt_sensor_config* config);
109 void dp_dump_packet_sensor_display_info(const pkt_sensor_display_info* info);
110 void dp_dump_packet_tracker_sensor(const pkt_tracker_sensor* sensor);
111 
112 #endif
113