Skip to content

Commit b0ee3a8

Browse files
committed
Add tracked data and device output timestamp
1 parent 2716d9b commit b0ee3a8

28 files changed

Lines changed: 336 additions & 162 deletions

examples/oxr/cpp/oxr_session_sharing.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -95,11 +95,11 @@ try
9595
if (i % 3 == 0)
9696
{
9797
std::cout << "Frame " << i << ": "
98-
<< "Hands=" << (left.is_active ? "ACTIVE" : "INACTIVE") << " | "
99-
<< "Head=" << (head.is_valid ? "VALID" : "INVALID");
100-
if (head.is_valid && head.pose)
98+
<< "Hands=" << (left.data->is_active ? "ACTIVE" : "INACTIVE") << " | "
99+
<< "Head=" << (head.data->is_valid ? "VALID" : "INVALID");
100+
if (head.data->is_valid && head.data->pose)
101101
{
102-
const auto& pos = head.pose->position();
102+
const auto& pos = head.data->pose->position();
103103
std::cout << " [" << pos.x() << ", " << pos.y() << ", " << pos.z() << "]";
104104
}
105105
std::cout << std::endl;

examples/oxr/cpp/oxr_simple_api_demo.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -87,13 +87,13 @@ try
8787
const auto& head = head_tracker->get_head(*session);
8888

8989
std::cout << "Frame " << i << ":" << std::endl;
90-
std::cout << " Left hand: " << (left.is_active ? "ACTIVE" : "INACTIVE") << std::endl;
91-
std::cout << " Right hand: " << (right.is_active ? "ACTIVE" : "INACTIVE") << std::endl;
92-
std::cout << " Head pose: " << (head.is_valid ? "VALID" : "INVALID") << std::endl;
90+
std::cout << " Left hand: " << (left.data->is_active ? "ACTIVE" : "INACTIVE") << std::endl;
91+
std::cout << " Right hand: " << (right.data->is_active ? "ACTIVE" : "INACTIVE") << std::endl;
92+
std::cout << " Head pose: " << (head.data->is_valid ? "VALID" : "INVALID") << std::endl;
9393

94-
if (head.is_valid && head.pose)
94+
if (head.data->is_valid && head.data->pose)
9595
{
96-
const auto& pos = head.pose->position();
96+
const auto& pos = head.data->pose->position();
9797
std::cout << " Position: [" << pos.x() << ", " << pos.y() << ", " << pos.z() << "]" << std::endl;
9898
}
9999
std::cout << std::endl;

examples/schemaio/frame_metadata_printer.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,8 @@ try
114114
}
115115

116116
// Print when we have new data (sequence_number changed)
117-
const auto& data = tracker->get_data(*session);
117+
const auto& tracked = tracker->get_data(*session);
118+
const auto& data = *tracked.data;
118119
if (data.sequence_number != last_printed_sequence)
119120
{
120121
print_frame_metadata(data, ++received_count);

examples/schemaio/pedal_printer.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,8 @@ try
7676
}
7777

7878
// Print current data if available
79-
const auto& data = tracker->get_data(*session);
79+
const auto& tracked = tracker->get_data(*session);
80+
const auto& data = *tracked.data;
8081
if (data.is_valid)
8182
{
8283
print_pedal_data(data, received_count++);

src/core/deviceio/cpp/controller_tracker.cpp

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include "inc/deviceio/deviceio_session.hpp"
77

88
#include <cassert>
9+
#include <chrono>
910
#include <cmath>
1011
#include <cstring>
1112
#include <iostream>
@@ -259,6 +260,11 @@ ControllerTracker::Impl::Impl(const OpenXRSessionHandles& handles)
259260
throw std::runtime_error("Failed to attach action sets: " + std::to_string(result));
260261
}
261262

263+
left_tracked_.data = std::make_shared<ControllerSnapshot>();
264+
left_tracked_.timestamp = std::make_shared<DeviceOutputTimestamp>();
265+
right_tracked_.data = std::make_shared<ControllerSnapshot>();
266+
right_tracked_.timestamp = std::make_shared<DeviceOutputTimestamp>();
267+
262268
std::cout << "ControllerTracker initialized (left + right)" << std::endl;
263269
}
264270

@@ -335,39 +341,38 @@ bool ControllerTracker::Impl::update(XrTime time)
335341
snapshot_out = ControllerSnapshot(grip_pose, aim_pose, inputs, is_active);
336342
};
337343

338-
update_controller(left_hand_path_, left_grip_space_, left_aim_space_, left_controller_);
339-
update_controller(right_hand_path_, right_grip_space_, right_aim_space_, right_controller_);
340-
341-
last_timestamp_ = DeviceDataTimestamp(time, time, 0);
344+
update_controller(left_hand_path_, left_grip_space_, left_aim_space_, *left_tracked_.data);
345+
update_controller(right_hand_path_, right_grip_space_, right_aim_space_, *right_tracked_.data);
342346

343-
return left_controller_.is_active() || right_controller_.is_active();
344-
}
347+
auto now_ns =
348+
std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::steady_clock::now().time_since_epoch()).count();
349+
*left_tracked_.timestamp = DeviceOutputTimestamp(now_ns, time, 0);
350+
*right_tracked_.timestamp = DeviceOutputTimestamp(now_ns, time, 0);
351+
last_record_timestamp_ = DeviceDataTimestamp(time, time, 0);
345352

346-
const ControllerSnapshot& ControllerTracker::Impl::get_left_controller() const
347-
{
348-
return left_controller_;
353+
return left_tracked_.data->is_active() || right_tracked_.data->is_active();
349354
}
350355

351-
const ControllerSnapshot& ControllerTracker::Impl::get_right_controller() const
356+
const ControllerSnapshotTrackedT& ControllerTracker::Impl::get_left_controller() const
352357
{
353-
return right_controller_;
358+
return left_tracked_;
354359
}
355360

356-
XrTime ControllerTracker::Impl::get_last_update_time() const
361+
const ControllerSnapshotTrackedT& ControllerTracker::Impl::get_right_controller() const
357362
{
358-
return last_timestamp_.sample_time_device_clock();
363+
return right_tracked_;
359364
}
360365

361366
DeviceDataTimestamp ControllerTracker::Impl::serialize(flatbuffers::FlatBufferBuilder& builder, size_t channel_index) const
362367
{
363-
const ControllerSnapshot& snapshot = (channel_index == 0) ? left_controller_ : right_controller_;
368+
const ControllerSnapshot& snapshot = (channel_index == 0) ? *left_tracked_.data : *right_tracked_.data;
364369

365370
ControllerSnapshotRecordBuilder record_builder(builder);
366371
record_builder.add_data(&snapshot);
367-
record_builder.add_timestamp(&last_timestamp_);
372+
record_builder.add_timestamp(&last_record_timestamp_);
368373
builder.Finish(record_builder.Finish());
369374

370-
return last_timestamp_;
375+
return last_record_timestamp_;
371376
}
372377

373378
// ============================================================================
@@ -380,21 +385,16 @@ std::vector<std::string> ControllerTracker::get_required_extensions() const
380385
return {};
381386
}
382387

383-
const ControllerSnapshot& ControllerTracker::get_left_controller(const DeviceIOSession& session) const
388+
const ControllerSnapshotTrackedT& ControllerTracker::get_left_controller(const DeviceIOSession& session) const
384389
{
385390
return static_cast<const Impl&>(session.get_tracker_impl(*this)).get_left_controller();
386391
}
387392

388-
const ControllerSnapshot& ControllerTracker::get_right_controller(const DeviceIOSession& session) const
393+
const ControllerSnapshotTrackedT& ControllerTracker::get_right_controller(const DeviceIOSession& session) const
389394
{
390395
return static_cast<const Impl&>(session.get_tracker_impl(*this)).get_right_controller();
391396
}
392397

393-
XrTime ControllerTracker::get_last_update_time(const DeviceIOSession& session) const
394-
{
395-
return static_cast<const Impl&>(session.get_tracker_impl(*this)).get_last_update_time();
396-
}
397-
398398
std::shared_ptr<ITrackerImpl> ControllerTracker::create_tracker(const OpenXRSessionHandles& handles) const
399399
{
400400
return std::make_shared<Impl>(handles);

src/core/deviceio/cpp/frame_metadata_tracker_oak.cpp

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include <flatbuffers/flatbuffers.h>
99
#include <schema/oak_bfbs_generated.h>
1010

11+
#include <chrono>
1112
#include <vector>
1213

1314
namespace core
@@ -22,6 +23,8 @@ class FrameMetadataTrackerOak::Impl : public ITrackerImpl
2223
public:
2324
Impl(const OpenXRSessionHandles& handles, SchemaTrackerConfig config) : m_schema_reader(handles, std::move(config))
2425
{
26+
m_tracked.data = std::make_shared<FrameMetadataT>();
27+
m_tracked.timestamp = std::make_shared<DeviceOutputTimestamp>();
2528
}
2629

2730
bool update(XrTime /* time */) override
@@ -44,23 +47,27 @@ class FrameMetadataTrackerOak::Impl : public ITrackerImpl
4447

4548
if (!m_pending_records.empty())
4649
{
47-
m_data = m_pending_records.back().data;
48-
m_last_timestamp = m_pending_records.back().timestamp;
50+
*m_tracked.data = m_pending_records.back().data;
51+
auto now_ns =
52+
std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::steady_clock::now().time_since_epoch())
53+
.count();
54+
*m_tracked.timestamp = DeviceOutputTimestamp(now_ns, 0, 0);
55+
m_last_record_timestamp = m_pending_records.back().timestamp;
4956
}
5057

5158
return true;
5259
}
5360

5461
DeviceDataTimestamp serialize(flatbuffers::FlatBufferBuilder& builder, size_t /* channel_index */) const override
5562
{
56-
auto data_offset = FrameMetadata::Pack(builder, &m_data);
63+
auto data_offset = FrameMetadata::Pack(builder, m_tracked.data.get());
5764

5865
FrameMetadataRecordBuilder record_builder(builder);
5966
record_builder.add_data(data_offset);
60-
record_builder.add_timestamp(&m_last_timestamp);
67+
record_builder.add_timestamp(&m_last_record_timestamp);
6168
builder.Finish(record_builder.Finish());
6269

63-
return m_last_timestamp;
70+
return m_last_record_timestamp;
6471
}
6572

6673
void serialize_all(size_t /* channel_index */, const RecordCallback& callback) const override
@@ -79,9 +86,9 @@ class FrameMetadataTrackerOak::Impl : public ITrackerImpl
7986
}
8087
}
8188

82-
const FrameMetadataT& get_data() const
89+
const FrameMetadataTrackedT& get_data() const
8390
{
84-
return m_data;
91+
return m_tracked;
8592
}
8693

8794
private:
@@ -92,8 +99,8 @@ class FrameMetadataTrackerOak::Impl : public ITrackerImpl
9299
};
93100

94101
SchemaTracker m_schema_reader;
95-
FrameMetadataT m_data;
96-
DeviceDataTimestamp m_last_timestamp{};
102+
FrameMetadataTrackedT m_tracked;
103+
DeviceDataTimestamp m_last_record_timestamp{};
97104
std::vector<PendingRecord> m_pending_records;
98105
};
99106

@@ -140,7 +147,7 @@ const SchemaTrackerConfig& FrameMetadataTrackerOak::get_config() const
140147
return m_config;
141148
}
142149

143-
const FrameMetadataT& FrameMetadataTrackerOak::get_data(const DeviceIOSession& session) const
150+
const FrameMetadataTrackedT& FrameMetadataTrackerOak::get_data(const DeviceIOSession& session) const
144151
{
145152
return static_cast<const Impl&>(session.get_tracker_impl(*this)).get_data();
146153
}

src/core/deviceio/cpp/full_body_tracker_pico.cpp

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include "inc/deviceio/deviceio_session.hpp"
77

88
#include <cassert>
9+
#include <chrono>
910
#include <cstring>
1011
#include <iostream>
1112

@@ -26,13 +27,13 @@ class FullBodyTrackerPicoImpl : public ITrackerImpl
2627
bool update(XrTime time) override;
2728
DeviceDataTimestamp serialize(flatbuffers::FlatBufferBuilder& builder, size_t channel_index) const override;
2829

29-
const FullBodyPosePicoT& get_body_pose() const;
30+
const FullBodyPosePicoTrackedT& get_body_pose() const;
3031

3132
private:
3233
XrSpace base_space_;
3334
XrBodyTrackerBD body_tracker_;
34-
FullBodyPosePicoT body_pose_;
35-
DeviceDataTimestamp last_timestamp_{};
35+
FullBodyPosePicoTrackedT tracked_;
36+
DeviceDataTimestamp last_record_timestamp_{};
3637

3738
// Extension function pointers
3839
PFN_xrCreateBodyTrackerBD pfn_create_body_tracker_;
@@ -100,7 +101,10 @@ FullBodyTrackerPicoImpl::FullBodyTrackerPicoImpl(const OpenXRSessionHandles& han
100101
throw std::runtime_error("Failed to create body tracker: " + std::to_string(result));
101102
}
102103

103-
body_pose_.is_active = false;
104+
tracked_.data = std::make_shared<FullBodyPosePicoT>();
105+
tracked_.timestamp = std::make_shared<DeviceOutputTimestamp>();
106+
107+
tracked_.data->is_active = false;
104108

105109
std::cout << "FullBodyTrackerPico initialized (24 joints)" << std::endl;
106110
}
@@ -134,19 +138,22 @@ bool FullBodyTrackerPicoImpl::update(XrTime time)
134138
XrResult result = pfn_locate_body_joints_(body_tracker_, &locate_info, &locations);
135139
if (XR_FAILED(result))
136140
{
137-
body_pose_.is_active = false;
141+
tracked_.data->is_active = false;
138142
return false;
139143
}
140144

141145
// allJointPosesTracked indicates if all joint poses are valid
142-
body_pose_.is_active = locations.allJointPosesTracked;
146+
tracked_.data->is_active = locations.allJointPosesTracked;
143147

144-
last_timestamp_ = DeviceDataTimestamp(time, time, 0);
148+
auto now_ns =
149+
std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::steady_clock::now().time_since_epoch()).count();
150+
*tracked_.timestamp = DeviceOutputTimestamp(now_ns, time, 0);
151+
last_record_timestamp_ = DeviceDataTimestamp(time, time, 0);
145152

146153
// Ensure joints struct is allocated
147-
if (!body_pose_.joints)
154+
if (!tracked_.data->joints)
148155
{
149-
body_pose_.joints = std::make_unique<BodyJointsPico>();
156+
tracked_.data->joints = std::make_unique<BodyJointsPico>();
150157
}
151158

152159
for (uint32_t i = 0; i < XR_BODY_JOINT_COUNT_BD; ++i)
@@ -164,28 +171,28 @@ bool FullBodyTrackerPicoImpl::update(XrTime time)
164171

165172
// Create BodyJointPose and set it in the array
166173
BodyJointPose joint_pose(pose, is_valid);
167-
body_pose_.joints->mutable_joints()->Mutate(i, joint_pose);
174+
tracked_.data->joints->mutable_joints()->Mutate(i, joint_pose);
168175
}
169176

170177
return true;
171178
}
172179

173-
const FullBodyPosePicoT& FullBodyTrackerPicoImpl::get_body_pose() const
180+
const FullBodyPosePicoTrackedT& FullBodyTrackerPicoImpl::get_body_pose() const
174181
{
175-
return body_pose_;
182+
return tracked_;
176183
}
177184

178185
DeviceDataTimestamp FullBodyTrackerPicoImpl::serialize(flatbuffers::FlatBufferBuilder& builder,
179186
size_t /* channel_index */) const
180187
{
181-
auto data_offset = FullBodyPosePico::Pack(builder, &body_pose_);
188+
auto data_offset = FullBodyPosePico::Pack(builder, tracked_.data.get());
182189

183190
FullBodyPosePicoRecordBuilder record_builder(builder);
184191
record_builder.add_data(data_offset);
185-
record_builder.add_timestamp(&last_timestamp_);
192+
record_builder.add_timestamp(&last_record_timestamp_);
186193
builder.Finish(record_builder.Finish());
187194

188-
return last_timestamp_;
195+
return last_record_timestamp_;
189196
}
190197

191198
// ============================================================================
@@ -197,7 +204,7 @@ std::vector<std::string> FullBodyTrackerPico::get_required_extensions() const
197204
return { XR_BD_BODY_TRACKING_EXTENSION_NAME };
198205
}
199206

200-
const FullBodyPosePicoT& FullBodyTrackerPico::get_body_pose(const DeviceIOSession& session) const
207+
const FullBodyPosePicoTrackedT& FullBodyTrackerPico::get_body_pose(const DeviceIOSession& session) const
201208
{
202209
return static_cast<const FullBodyTrackerPicoImpl&>(session.get_tracker_impl(*this)).get_body_pose();
203210
}

0 commit comments

Comments
 (0)