Skip to content
Snippets Groups Projects
Commit 81daaece authored by Nicolas Pope's avatar Nicolas Pope
Browse files

Allow local device sources

parent 30ab39dd
Branches
No related tags found
1 merge request!316Resolves #343 GUI and Frame Refactor
Pipeline #28048 failed
......@@ -18,6 +18,10 @@
#include "modules.hpp"
#ifdef HAVE_PYLON
#include <pylon/PylonIncludes.h>
#endif
using std::unique_ptr;
using std::make_unique;
......@@ -132,6 +136,9 @@ void FTLGui::mainloop() {
////////////////////////////////////////////////////////////////////////////////
int main(int argc, char **argv) {
#ifdef HAVE_PYLON
Pylon::PylonAutoInitTerm autoInitTerm;
#endif
nanogui::init();
......
......@@ -18,7 +18,7 @@ using LockedFrameSet = ftl::Transactional<ftl::data::FrameSet*>;
* and searched for using timestamp and frameset id. One instance of a builder
* should be created for each frameset id.
*/
class BaseBuilder {
class BaseBuilder : public ftl::data::Generator {
public:
BaseBuilder(ftl::data::Pool *pool, int id);
BaseBuilder();
......@@ -33,6 +33,8 @@ class BaseBuilder {
void setID(uint32_t id) { id_ = id; }
void setPool(ftl::data::Pool *p) { pool_ = p; }
inline ftl::Handle onFrameSet(const ftl::data::FrameSetCallback &cb) override { return cb_.on(cb); }
/**
* Retrieve an fps + latency pair, averaged since last call to this
* function.
......@@ -47,6 +49,7 @@ class BaseBuilder {
ftl::data::Pool *pool_;
int id_;
size_t size_;
ftl::Handler<const ftl::data::FrameSetPtr&> cb_;
};
/**
......@@ -84,20 +87,17 @@ class LocalBuilder : public BaseBuilder {
* A local builder that generates framesets using a timer and populates the
* frames using a discrete source object before generating a callback.
*/
class IntervalSourceBuilder : public LocalBuilder, public ftl::data::Generator {
class IntervalSourceBuilder : public LocalBuilder {
public:
IntervalSourceBuilder(ftl::data::Pool *pool, int id, ftl::data::DiscreteSource *src);
IntervalSourceBuilder(ftl::data::Pool *pool, int id, const std::list<ftl::data::DiscreteSource*> &srcs);
IntervalSourceBuilder();
~IntervalSourceBuilder();
inline ftl::Handle onFrameSet(const ftl::data::FrameSetCallback &cb) override { return cb_.on(cb); }
void start();
void stop();
private:
ftl::Handler<const ftl::data::FrameSetPtr&> cb_;
ftl::Handle capture_;
ftl::Handle retrieve_;
std::list<ftl::data::DiscreteSource *> srcs_;
......@@ -107,22 +107,19 @@ class IntervalSourceBuilder : public LocalBuilder, public ftl::data::Generator {
* A local builder that generates framesets manually and populates the
* frames using a discrete source object before generating a callback.
*/
class ManualSourceBuilder : public LocalBuilder, public ftl::data::Generator {
class ManualSourceBuilder : public LocalBuilder {
public:
ManualSourceBuilder(ftl::data::Pool *pool, int id, ftl::data::DiscreteSource *src);
ManualSourceBuilder();
~ManualSourceBuilder();
inline ftl::Handle onFrameSet(const ftl::data::FrameSetCallback &cb) override { return cb_.on(cb); }
void tick();
private:
ftl::Handler<const ftl::data::FrameSetPtr&> cb_;
ftl::data::DiscreteSource *src_;
};
class ForeignBuilder : public BaseBuilder, public ftl::data::Generator {
class ForeignBuilder : public BaseBuilder {
public:
ForeignBuilder(ftl::data::Pool *pool, int id);
ForeignBuilder();
......@@ -130,8 +127,6 @@ class ForeignBuilder : public BaseBuilder, public ftl::data::Generator {
//inline void setID(int id) { id_ = id; }
inline ftl::Handle onFrameSet(const ftl::data::FrameSetCallback &cb) override { return cb_.on(cb); }
LockedFrameSet get(int64_t timestamp, size_t ix) override;
LockedFrameSet get(int64_t timestamp) override;
......@@ -143,7 +138,6 @@ class ForeignBuilder : public BaseBuilder, public ftl::data::Generator {
//std::list<ftl::data::FrameSet*> allocated_; // Keep memory allocations
size_t head_;
ftl::Handler<const ftl::data::FrameSetPtr&> cb_;
MUTEX mutex_;
int mspf_;
int64_t last_ts_;
......
......@@ -383,11 +383,27 @@ uint32_t Feed::add(const std::string &path) {
return fsid;
}
else if (scheme == ftl::URI::SCHEME_DEVICE) {
auto &config = getConfig()["sources"].emplace_back();
uri.to_json(config);
int fsid = allocateFrameSetId();
std::string srcname = std::string("source") + std::to_string(fsid);
//auto &config = uri.to_json(root->getConfig()["source"]);
uri.to_json(getConfig()[srcname]);
//ftl::stream::Stream* stream = ftl::create<ftl::stream::Stream>(config);
//stream_->add(stream, allocateFrameSetId());
//addPipeline(fsid);
// Make the source object
auto *source = ftl::create<ftl::rgbd::Source>(this, srcname, net_);
// Create local builder instance
auto *creator = new ftl::streams::IntervalSourceBuilder(pool_.get(), fsid, {source});
std::shared_ptr<ftl::streams::BaseBuilder> creatorptr(creator);
receiver_->registerBuilder(creatorptr);
creator->start();
// TODO: Maintain a record or list of sources for control / removal purposes
// Perhaps just maintain a list of creators
}
else if ((scheme == ftl::URI::SCHEME_TCP) ||
......
......@@ -79,6 +79,10 @@ void Receiver::registerBuilder(const std::shared_ptr<ftl::streams::BaseBuilder>
auto i = builders_.find(b->id());
if (i != builders_.end()) throw FTL_Error("Builder already exists");
builders_[b->id()] = b;
handles_.push_back(std::move(b->onFrameSet([this](const ftl::data::FrameSetPtr& fs) {
callback_.trigger(fs);
return true;
})));
}
//void Receiver::onAudio(const ftl::audio::FrameSet::Callback &cb) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment