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 DEFINE_FLATBUFFERS_VECTOR(type_, name_) \
79 static inline struct name_ \
80 { \
81 uint32_t length; \
82 const type_ *data; \
83 } name_(const struct flatbuffers_vector from) \
84 { \
85 return (struct name_){from.length, (const type_ *)from.data}; \
86 }
87
88DEFINE_FLATBUFFERS_VECTOR(void, flatbuffers_vector)
89
91{ // table solarxr_protocol.datatypes.TrackerId
92 bool has_device_id;
93 uint8_t device_id;
94 uint8_t tracker_num;
95};
96
97DEFINE_FLATBUFFERS_VECTOR(char, flatbuffers_vector_char)
98
100{ // table solarxr_protocol.data_feed.tracker.TrackerInfo
101 enum solarxr_body_part body_part;
102 struct flatbuffers_vector_char display_name;
103};
104
105typedef struct
106{
107 flatbuffers_uoffset_t offset;
109
111{ // table solarxr_protocol.data_feed.tracker.TrackerData
112 bool has_info;
113 bool has_rotation;
114 bool has_position;
115 bool has_raw_angular_velocity;
116 bool has_linear_acceleration;
117 struct solarxr_tracker_id tracker_id;
118 struct solarxr_tracker_info info;
119 struct xrt_quat rotation;
120 struct xrt_vec3 position;
121 struct xrt_vec3 raw_angular_velocity;
122 struct xrt_vec3 linear_acceleration;
123};
124
125typedef struct
126{
127 flatbuffers_uoffset_t offset;
129
131
133{ // table solarxr_protocol.data_feed.device_data.DeviceData
134 uint8_t id;
135 struct flatbuffers_vector_solarxr_tracker_data trackers; // solarxr_protocol.data_feed.tracker.TrackerData[]
136};
137
138typedef struct
139{
140 flatbuffers_uoffset_t offset;
142
144{ // table solarxr_protocol.data_feed.Bone
145 enum solarxr_body_part body_part;
146 struct xrt_quat rotation_g;
147 float bone_length;
148 struct xrt_vec3 head_position_g;
149};
150
153
155{ // table solarxr_protocol.data_feed.DataFeedUpdate
156 struct flatbuffers_vector_solarxr_device_data devices; // solarxr_protocol.data_feed.device_data.DeviceData[]
158 synthetic_trackers; // solarxr_protocol.data_feed.tracker.TrackerData[]
159 struct flatbuffers_vector_solarxr_bone bones; // solarxr_protocol.data_feed.Bone[]
160};
161
162enum solarxr_data_feed_message_type
163{
164 SOLARXR_DATA_FEED_MESSAGE_POLL_DATA_FEED = 1,
165 SOLARXR_DATA_FEED_MESSAGE_START_DATA_FEED = 2,
166 SOLARXR_DATA_FEED_MESSAGE_DATA_FEED_UPDATE = 3,
167};
168
169union solarxr_data_feed_message { // union solarxr_protocol.data_feed.DataFeedMessage
170 struct solarxr_data_feed_update data_feed_update;
171};
172
173typedef struct
174{
175 flatbuffers_uoffset_t offset;
177
179{ // table solarxr_protocol.data_feed.DataFeedMessageHeader
180 enum solarxr_data_feed_message_type message_type;
181 union solarxr_data_feed_message message;
182};
183
185{ // table solarxr_protocol.rpc.SteamVRTrackersSetting
186 bool waist;
187 bool chest;
188 bool left_foot;
189 bool right_foot;
190 bool left_knee;
191 bool right_knee;
192 bool left_elbow;
193 bool right_elbow;
194 bool left_hand;
195 bool right_hand;
196};
197
199{ // table solarxr_protocol.rpc.SettingsResponse
200 struct solarxr_steamvr_trackers_setting steam_vr_trackers;
201};
202
203enum solarxr_rpc_message_type
204{
205 SOLARXR_RPC_MESSAGE_TYPE_SETTINGS_REQUEST = 6,
206 SOLARXR_RPC_MESSAGE_TYPE_SETTINGS_RESPONSE = 7,
207};
208
209union solarxr_rpc_message { // union solarxr_protocol.rpc.RpcMessage
210 struct solarxr_settings_response settings_response;
211};
212
213typedef struct
214{
215 flatbuffers_uoffset_t offset;
217
219{ // table solarxr_protocol.rpc.RpcMessageHeader
220 enum solarxr_rpc_message_type message_type;
221 union solarxr_rpc_message message;
222};
223
224typedef struct
225{
226 flatbuffers_uoffset_t offset;
228
231
233{ // table solarxr_protocol.MessageBundle
235 data_feed_msgs; // solarxr_protocol.data_feed.DataFeedMessageHeader[]
236 struct flatbuffers_vector_solarxr_rpc_message_header rpc_msgs; // solarxr_protocol.rpc.RpcMessageHeader[]
237};
238
239#undef DEFINE_FLATBUFFERS_VECTOR
240
241bool
242read_solarxr_message_bundle(struct solarxr_message_bundle *out,
243 const uint8_t buffer[],
244 size_t buffer_len,
245 const solarxr_message_bundle_t *ref);
246bool
247read_solarxr_data_feed_message_header(struct solarxr_data_feed_message_header *out,
248 const uint8_t buffer[],
249 size_t buffer_len,
251bool
252read_solarxr_rpc_message_header(struct solarxr_rpc_message_header *out,
253 const uint8_t buffer[],
254 size_t buffer_len,
256bool
257read_solarxr_device_data(struct solarxr_device_data *out,
258 const uint8_t buffer[],
259 size_t buffer_len,
260 const solarxr_device_data_t *ref);
261bool
262read_solarxr_tracker_data(struct solarxr_tracker_data *out,
263 const uint8_t buffer[],
264 size_t buffer_len,
265 const solarxr_tracker_data_t *ref);
266bool
267read_solarxr_bone(struct solarxr_bone *out, const uint8_t buffer[], size_t buffer_len, const solarxr_bone_t *ref);
268
269#ifdef __cplusplus
270}
271#endif
Definition protocol.h:97
Definition protocol.h:152
Definition protocol.h:88
Definition protocol.h:139
Definition protocol.h:144
Definition protocol.h:174
Definition protocol.h:179
Definition protocol.h:155
Definition protocol.h:126
Definition protocol.h:133
Definition protocol.h:225
Definition protocol.h:233
Definition protocol.h:214
Definition protocol.h:219
Definition protocol.h:199
Definition protocol.h:185
Definition protocol.h:106
Definition protocol.h:111
Definition protocol.h:91
Definition protocol.h:100
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:169
Definition protocol.h:209
Common defines and enums for XRT.