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