Monado OpenXR Runtime
Loading...
Searching...
No Matches
protocol.h
Go to the documentation of this file.
1// Copyright 2025, rcelyte
2// SPDX-License-Identifier: BSL-1.0
3/*!
4 * @file
5 * @brief Parser for a small subset of the SolarXR Flatbuffers protocol, as defined at
6 * https://github.com/SlimeVR/SolarXR-Protocol
7 * @ingroup drv_solarxr
8 */
9
10#pragma once
11#include "xrt/xrt_defines.h"
12#include <assert.h>
13
14#ifdef __cplusplus
15extern "C" {
16#endif
17
18typedef uint32_t flatbuffers_uoffset_t; // little-endian byte order
19
20enum solarxr_body_part
21{
22 SOLARXR_BODY_PART_NONE = 0,
23 SOLARXR_BODY_PART_HEAD = 1,
24 SOLARXR_BODY_PART_NECK = 2,
25 SOLARXR_BODY_PART_CHEST = 3,
26 SOLARXR_BODY_PART_WAIST = 4,
27 SOLARXR_BODY_PART_HIP = 5,
28 SOLARXR_BODY_PART_LEFT_UPPER_LEG = 6,
29 SOLARXR_BODY_PART_RIGHT_UPPER_LEG = 7,
30 SOLARXR_BODY_PART_LEFT_LOWER_LEG = 8,
31 SOLARXR_BODY_PART_RIGHT_LOWER_LEG = 9,
32 SOLARXR_BODY_PART_LEFT_FOOT = 10,
33 SOLARXR_BODY_PART_RIGHT_FOOT = 11,
34 SOLARXR_BODY_PART_LEFT_LOWER_ARM = 14,
35 SOLARXR_BODY_PART_RIGHT_LOWER_ARM = 15,
36 SOLARXR_BODY_PART_LEFT_UPPER_ARM = 16,
37 SOLARXR_BODY_PART_RIGHT_UPPER_ARM = 17,
38 SOLARXR_BODY_PART_LEFT_HAND = 18,
39 SOLARXR_BODY_PART_RIGHT_HAND = 19,
40 SOLARXR_BODY_PART_LEFT_SHOULDER = 20,
41 SOLARXR_BODY_PART_RIGHT_SHOULDER = 21,
42 SOLARXR_BODY_PART_UPPER_CHEST = 22,
43 SOLARXR_BODY_PART_LEFT_HIP = 23,
44 SOLARXR_BODY_PART_RIGHT_HIP = 24,
45 SOLARXR_BODY_PART_LEFT_THUMB_PROXIMAL = 25,
46 SOLARXR_BODY_PART_LEFT_THUMB_INTERMEDIATE = 26,
47 SOLARXR_BODY_PART_LEFT_THUMB_DISTAL = 27,
48 SOLARXR_BODY_PART_LEFT_INDEX_PROXIMAL = 28,
49 SOLARXR_BODY_PART_LEFT_INDEX_INTERMEDIATE = 29,
50 SOLARXR_BODY_PART_LEFT_INDEX_DISTAL = 30,
51 SOLARXR_BODY_PART_LEFT_MIDDLE_PROXIMAL = 31,
52 SOLARXR_BODY_PART_LEFT_MIDDLE_INTERMEDIATE = 32,
53 SOLARXR_BODY_PART_LEFT_MIDDLE_DISTAL = 33,
54 SOLARXR_BODY_PART_LEFT_RING_PROXIMAL = 34,
55 SOLARXR_BODY_PART_LEFT_RING_INTERMEDIATE = 35,
56 SOLARXR_BODY_PART_LEFT_RING_DISTAL = 36,
57 SOLARXR_BODY_PART_LEFT_LITTLE_PROXIMAL = 37,
58 SOLARXR_BODY_PART_LEFT_LITTLE_INTERMEDIATE = 38,
59 SOLARXR_BODY_PART_LEFT_LITTLE_DISTAL = 39,
60 SOLARXR_BODY_PART_RIGHT_THUMB_PROXIMAL = 40,
61 SOLARXR_BODY_PART_RIGHT_THUMB_INTERMEDIATE = 41,
62 SOLARXR_BODY_PART_RIGHT_THUMB_DISTAL = 42,
63 SOLARXR_BODY_PART_RIGHT_INDEX_PROXIMAL = 43,
64 SOLARXR_BODY_PART_RIGHT_INDEX_INTERMEDIATE = 44,
65 SOLARXR_BODY_PART_RIGHT_INDEX_DISTAL = 45,
66 SOLARXR_BODY_PART_RIGHT_MIDDLE_PROXIMAL = 46,
67 SOLARXR_BODY_PART_RIGHT_MIDDLE_INTERMEDIATE = 47,
68 SOLARXR_BODY_PART_RIGHT_MIDDLE_DISTAL = 48,
69 SOLARXR_BODY_PART_RIGHT_RING_PROXIMAL = 49,
70 SOLARXR_BODY_PART_RIGHT_RING_INTERMEDIATE = 50,
71 SOLARXR_BODY_PART_RIGHT_RING_DISTAL = 51,
72 SOLARXR_BODY_PART_RIGHT_LITTLE_PROXIMAL = 52,
73 SOLARXR_BODY_PART_RIGHT_LITTLE_INTERMEDIATE = 53,
74 SOLARXR_BODY_PART_RIGHT_LITTLE_DISTAL = 54,
75 SOLARXR_BODY_PART_MAX_ENUM,
76};
77
78#define FLATBUFFERS_VECTOR(type_) \
79 struct \
80 { \
81 uint32_t length; \
82 const type_ *data; \
83 }
84
86{ // table solarxr_protocol.datatypes.TrackerId
87 bool has_device_id;
88 uint8_t device_id;
89 uint8_t tracker_num;
90};
91
92typedef FLATBUFFERS_VECTOR(char) flatbuffers_vector_char_t;
93
95{ // table solarxr_protocol.data_feed.tracker.TrackerInfo
96 enum solarxr_body_part body_part;
97 flatbuffers_vector_char_t display_name;
98};
99
100typedef struct
101{
102 flatbuffers_uoffset_t offset;
104
106{ // table solarxr_protocol.data_feed.tracker.TrackerData
107 bool has_info;
108 bool has_rotation;
109 bool has_position;
110 bool has_raw_angular_velocity;
111 bool has_linear_acceleration;
112 struct solarxr_tracker_id tracker_id;
113 struct solarxr_tracker_info info;
114 struct xrt_quat rotation;
115 struct xrt_vec3 position;
116 struct xrt_vec3 raw_angular_velocity;
117 struct xrt_vec3 linear_acceleration;
118};
119
120typedef struct
121{
122 flatbuffers_uoffset_t offset;
124
126
128{ // table solarxr_protocol.data_feed.device_data.DeviceData
129 uint8_t id;
130 flatbuffers_vector_solarxr_tracker_data_t trackers; // solarxr_protocol.data_feed.tracker.TrackerData[]
131};
132
133typedef struct
134{
135 flatbuffers_uoffset_t offset;
137
139{ // table solarxr_protocol.data_feed.Bone
140 enum solarxr_body_part body_part;
141 struct xrt_quat rotation_g;
142 float bone_length;
143 struct xrt_vec3 head_position_g;
144};
145
148
150{ // table solarxr_protocol.data_feed.DataFeedUpdate
151 flatbuffers_vector_solarxr_device_data_t devices; // solarxr_protocol.data_feed.device_data.DeviceData[]
153 synthetic_trackers; // solarxr_protocol.data_feed.tracker.TrackerData[]
154 flatbuffers_vector_solarxr_bone_t bones; // solarxr_protocol.data_feed.Bone[]
155};
156
157enum solarxr_data_feed_message_type
158{
159 SOLARXR_DATA_FEED_MESSAGE_POLL_DATA_FEED = 1,
160 SOLARXR_DATA_FEED_MESSAGE_START_DATA_FEED = 2,
161 SOLARXR_DATA_FEED_MESSAGE_DATA_FEED_UPDATE = 3,
162};
163
164union solarxr_data_feed_message { // union solarxr_protocol.data_feed.DataFeedMessage
165 struct solarxr_data_feed_update data_feed_update;
166};
167
168typedef struct
169{
170 flatbuffers_uoffset_t offset;
172
174{ // table solarxr_protocol.data_feed.DataFeedMessageHeader
175 enum solarxr_data_feed_message_type message_type;
176 union solarxr_data_feed_message message;
177};
178
180{ // table solarxr_protocol.rpc.SteamVRTrackersSetting
181 bool waist;
182 bool chest;
183 bool left_foot;
184 bool right_foot;
185 bool left_knee;
186 bool right_knee;
187 bool left_elbow;
188 bool right_elbow;
189 bool left_hand;
190 bool right_hand;
191};
192
194{ // table solarxr_protocol.rpc.SettingsResponse
195 struct solarxr_steamvr_trackers_setting steam_vr_trackers;
196};
197
198enum solarxr_rpc_message_type
199{
200 SOLARXR_RPC_MESSAGE_TYPE_SETTINGS_REQUEST = 6,
201 SOLARXR_RPC_MESSAGE_TYPE_SETTINGS_RESPONSE = 7,
202};
203
204union solarxr_rpc_message { // union solarxr_protocol.rpc.RpcMessage
205 struct solarxr_settings_response settings_response;
206};
207
208typedef struct
209{
210 flatbuffers_uoffset_t offset;
212
214{ // table solarxr_protocol.rpc.RpcMessageHeader
215 enum solarxr_rpc_message_type message_type;
216 union solarxr_rpc_message message;
217};
218
219typedef struct
220{
221 flatbuffers_uoffset_t offset;
223
226
228{ // table solarxr_protocol.MessageBundle
230 data_feed_msgs; // solarxr_protocol.data_feed.DataFeedMessageHeader[]
231 flatbuffers_vector_solarxr_rpc_message_header_t rpc_msgs; // solarxr_protocol.rpc.RpcMessageHeader[]
232};
233
234bool
235read_solarxr_message_bundle(struct solarxr_message_bundle *out,
236 const uint8_t buffer[],
237 size_t buffer_len,
238 const solarxr_message_bundle_t *ref);
239bool
240read_solarxr_data_feed_message_header(struct solarxr_data_feed_message_header *out,
241 const uint8_t buffer[],
242 size_t buffer_len,
244bool
245read_solarxr_rpc_message_header(struct solarxr_rpc_message_header *out,
246 const uint8_t buffer[],
247 size_t buffer_len,
249bool
250read_solarxr_device_data(struct solarxr_device_data *out,
251 const uint8_t buffer[],
252 size_t buffer_len,
253 const solarxr_device_data_t *ref);
254bool
255read_solarxr_tracker_data(struct solarxr_tracker_data *out,
256 const uint8_t buffer[],
257 size_t buffer_len,
258 const solarxr_tracker_data_t *ref);
259bool
260read_solarxr_bone(struct solarxr_bone *out, const uint8_t buffer[], size_t buffer_len, const solarxr_bone_t *ref);
261
262#ifdef __cplusplus
263}
264#endif
Definition protocol.h:92
Definition protocol.h:147
Definition protocol.h:134
Definition protocol.h:139
Definition protocol.h:169
Definition protocol.h:174
Definition protocol.h:150
Definition protocol.h:121
Definition protocol.h:128
Definition protocol.h:220
Definition protocol.h:228
Definition protocol.h:209
Definition protocol.h:214
Definition protocol.h:194
Definition protocol.h:180
Definition protocol.h:101
Definition protocol.h:106
Definition protocol.h:86
Definition protocol.h:95
A quaternion with single floats.
Definition xrt_defines.h:235
A 3 element vector with single floats.
Definition xrt_defines.h:289
Definition protocol.h:164
Definition protocol.h:204
Common defines and enums for XRT.