#include <ImFusion/Stream/Stream.h>
#include <ImFusion/Stream/StreamData.h>
#include <ImFusion/Stream/StreamUtils.h>
#include <ImFusion/Stream/TrackingStream.h>
{
public:
explicit MockData(
Stream* stream)
{
}
MockData& operator=(const MockData& other)
{
m_stream = other.m_stream;
return *this;
}
};
class PeriodicStream :
public Stream
{
public:
protected:
bool openImpl() override { return true; }
bool closeImpl() override { return true; }
bool startImpl() override { return true; }
bool stopImpl() override { return true; }
std::optional<WorkContinuation> doWork() override
{
auto nextIterationTime = startTime + std::chrono::milliseconds(100);
StreamUtils::preciseSleep(std::chrono::milliseconds(80 * (
std::rand() / RAND_MAX)));
signalStreamData.emitSignal(md);
return WorkContinuation{nextIterationTime};
}
};
class ExactlyPeriodicStream :
public Stream
{
public:
protected:
bool openImpl() override { return true; }
bool closeImpl() override { return true; }
bool startImpl() override
{
return true;
}
bool stopImpl() override { return true; }
std::optional<WorkContinuation> doWork() override
{
if (m_nextData)
signalStreamData.emitSignal(std::move(m_nextData));
auto nextIterationTime = m_startTime + std::chrono::milliseconds(100 * m_iteration++);
StreamUtils::preciseSleep(std::chrono::milliseconds(80 * (
std::rand() / RAND_MAX)));
return WorkContinuation{nextIterationTime};
}
int m_iteration = 1;
std::chrono::system_clock::time_point m_startTime;
std::shared_ptr<MockData> m_nextData;
};
namespace MockFramework
{
void registerCallback(std::function<void()> callback) {}
bool start() { return true; }
bool stop() { return true; }
bool tearDown() { return true; }
};
class ExternalWorkStream :
public Stream
{
public:
protected:
bool openImpl() override
{
MockFramework::registerCallback([this]() {
signalStreamData.emitSignal(md);
});
return true;
}
bool closeImpl() override { return MockFramework::tearDown(); }
bool startImpl() override { return MockFramework::start(); }
bool stopImpl() override { return MockFramework::stop(); }
std::optional<WorkContinuation> doWork() override
{
return std::nullopt;
}
};
{
public:
~MyTrackingStream() { MyTrackingStream::close(); }
virtual bool openImpl() override
{
m_instruments->create(TrackerID{"systemUID-123", "", "Tracker 1"});
m_instruments->create(TrackerID{"systemUID-456", "", "Tracker 2"});
return true;
}
virtual std::optional<WorkContinuation> doWork() override
{
mat4 matrixTracker1 = mat4::Identity();
double qualityTracker1 = 1.0;
mat4 matrixTracker2 = mat4::Identity();
double qualityTracker2 = 1.0;
m_instruments->update("systemUID-123", matrixTracker1, qualityTracker1);
m_instruments->update("systemUID-456", matrixTracker2, qualityTracker2);
signalStreamData.emitSignal(createTrackingStreamData());
return {};
}
virtual std::string uuid() override { return "MyTrackingStream"; }
virtual bool closeImpl() override { return true; }
virtual bool startImpl() override { return true; }
virtual bool stopImpl() override { return true; }
};
Base class for all data streamed from a streaming device.
Definition StreamData.h:23
Base class representing a stream of changing data in the DataModel.
Definition Stream.h:60
Specialization of Stream for streams producing tracking data for spatial localization.
Definition TrackingStream.h:28
Namespace of the ImFusion SDK.
Definition Assert.h:7