diff --git a/applications/gui/src/ctrl_window.cpp b/applications/gui/src/ctrl_window.cpp index 3ab9285ed0e26e5cbdc2f1d03406a5c7858734d6..7b4308e584c88227f98f17064e5094c50a65a36a 100644 --- a/applications/gui/src/ctrl_window.cpp +++ b/applications/gui/src/ctrl_window.cpp @@ -1,13 +1,39 @@ #include "ctrl_window.hpp" #include <nanogui/layout.h> +#include <nanogui/label.h> +#include <nanogui/combobox.h> + +#include <vector> +#include <string> using ftl::gui::ControlWindow; +using std::string; +using std::vector; ControlWindow::ControlWindow(nanogui::Widget *parent, ftl::ctrl::Master *ctrl) : nanogui::Window(parent, "Control"), ctrl_(ctrl) { setLayout(new nanogui::GroupLayout()); + + using namespace nanogui; + + new Label(this, "Select Node","sans-bold"); + vector<string> details = ctrl->getSlaves(); + LOG(INFO) << "Details count = " << details.size(); + + vector<string> available; + for (auto &d : details) { + auto detail = ftl::config::json_t::parse(d); + LOG(INFO) << "DETAIL RECEIVED " << detail; + available.push_back(detail["title"].get<string>()); + } + + auto select = new ComboBox(this, available); + select->setCallback([this,available](int ix) { + LOG(INFO) << "Change node: " << ix; + + }); } ControlWindow::~ControlWindow() { diff --git a/applications/gui/src/main.cpp b/applications/gui/src/main.cpp index a62a091dbeb80700062f4fe772ad4c1f409f2161..5ada2cba5d4eece9bb89c2eb022bdead3a545a55 100644 --- a/applications/gui/src/main.cpp +++ b/applications/gui/src/main.cpp @@ -168,6 +168,14 @@ class FTLApplication : public nanogui::Screen { imageWindow->setLayout(new GroupLayout()); imageWindow->setSize(Vector2i(400,400)); + new Label(imageWindow, "Select source","sans-bold"); + auto available = net->findAll<string>("list_streams"); + auto select = new ComboBox(imageWindow, available); + select->setCallback([this,available](int ix) { + LOG(INFO) << "Change source: " << ix; + + }); + auto imageView = new VirtualCameraView(imageWindow); //cam.view = imageView; imageView->setGridThreshold(20); @@ -179,18 +187,7 @@ class FTLApplication : public nanogui::Screen { } } - auto window = new Window(this, "Sources"); - window->setLayout(new GroupLayout()); - - new Label(window, "Select source","sans-bold"); - auto available = net->findAll<string>("list_streams"); - auto select = new ComboBox(window, available); - select->setCallback([this,available](int ix) { - LOG(INFO) << "Change source: " << ix; - - }); - - window = new ftl::gui::ControlWindow(this, controller); + auto window = new ftl::gui::ControlWindow(this, controller); setVisible(true); performLayout(); diff --git a/components/common/cpp/include/loguru.hpp b/components/common/cpp/include/loguru.hpp index e43dc742e83d21405dacdafafa830a3251703998..a65ab2be28f1eeff9f918f075a0e7c78f9a04ba3 100644 --- a/components/common/cpp/include/loguru.hpp +++ b/components/common/cpp/include/loguru.hpp @@ -98,6 +98,7 @@ Website: www.ilikebigbits.com #define LOGURU_VERSION_PATCH 0 #define LOGURU_REPLACE_GLOG 1 +#define LOGURU_CATCH_SIGABRT 0 #if defined(_MSC_VER) #include <sal.h> // Needed for _In_z_ etc annotations diff --git a/components/control/cpp/include/ftl/master.hpp b/components/control/cpp/include/ftl/master.hpp index e069f12fcdfc813c27db76dbb75795b23f2570b0..17ca49c2c2fc9f08ebf5f7183f7c7cbbe10baf32 100644 --- a/components/control/cpp/include/ftl/master.hpp +++ b/components/control/cpp/include/ftl/master.hpp @@ -37,6 +37,8 @@ class Master { std::vector<std::string> getConfigurables(const ftl::UUID &peer); + std::vector<std::string> getSlaves(); + std::vector<ftl::config::json_t> get(const std::string &uri); ftl::config::json_t getOne(const std::string &uri); diff --git a/components/control/cpp/src/master.cpp b/components/control/cpp/src/master.cpp index 1724f1dd58f84610ba0bb576cb241bf2958137b8..5072c41553524bfae22f86702383f3f364a3a433 100644 --- a/components/control/cpp/src/master.cpp +++ b/components/control/cpp/src/master.cpp @@ -47,6 +47,10 @@ void Master::set(const ftl::UUID &peer, const string &uri, json_t &value) { net_->send(peer, "update_cfg", uri, (string)value); } +vector<string> Master::getSlaves() { + return net_->findAll<string>("slave_details"); +} + vector<string> Master::getConfigurables() { return {}; } diff --git a/components/control/cpp/src/slave.cpp b/components/control/cpp/src/slave.cpp index 8a6253195f5a38c69389868569d6eb9ba98fe990..fd348c18124e04117c70d85479180286f152d69b 100644 --- a/components/control/cpp/src/slave.cpp +++ b/components/control/cpp/src/slave.cpp @@ -4,6 +4,7 @@ using ftl::Configurable; using ftl::net::Universe; using ftl::ctrl::Slave; +using std::string; static void netLog(void* user_data, const loguru::Message& message) { Universe *net = (Universe*)user_data; @@ -30,6 +31,14 @@ Slave::Slave(Universe *net, ftl::Configurable *root) { return ftl::config::resolve(uri); }); + net->bind("slave_details", [net,root]() -> std::vector<std::string> { + ftl::config::json_t json { + {"id", net->id().to_string()}, + {"title", root->value("title", *root->get<string>("$id"))} + }; + return {json.dump()}; + }); + loguru::add_callback("net_log", netLog, net, loguru::Verbosity_INFO); } diff --git a/components/net/cpp/include/ftl/net/universe.hpp b/components/net/cpp/include/ftl/net/universe.hpp index 169eff58923b115287539c50358fe1840e91ce57..5ce99f3a5f781991f44ed1d33c24e0f717371e53 100644 --- a/components/net/cpp/include/ftl/net/universe.hpp +++ b/components/net/cpp/include/ftl/net/universe.hpp @@ -278,7 +278,7 @@ template <typename R, typename... ARGS> R Universe::call(const ftl::UUID &pid, const std::string &name, ARGS... args) { Peer *p = getPeer(pid); if (p == nullptr) { - LOG(ERROR) << "Attempting to call an unknown peer : " << pid.to_string(); + DLOG(WARNING) << "Attempting to call an unknown peer : " << pid.to_string(); throw -1; } return p->call<R>(name, args...); @@ -288,7 +288,7 @@ template <typename... ARGS> void Universe::send(const ftl::UUID &pid, const std::string &name, ARGS... args) { Peer *p = getPeer(pid); if (p == nullptr) { - LOG(ERROR) << "Attempting to call an unknown peer : " << pid.to_string(); + DLOG(WARNING) << "Attempting to call an unknown peer : " << pid.to_string(); throw -1; } p->send(name, args...); diff --git a/components/rgbd-sources/include/ftl/rgbd_streamer.hpp b/components/rgbd-sources/include/ftl/rgbd_streamer.hpp index 3d62721896c563711af7e1c2531900de246a504e..51c7a2e58bd2805968fdabedef32d3995c2726a3 100644 --- a/components/rgbd-sources/include/ftl/rgbd_streamer.hpp +++ b/components/rgbd-sources/include/ftl/rgbd_streamer.hpp @@ -61,6 +61,7 @@ class Streamer : public ftl::Configurable { std::shared_mutex mutex_; bool active_; ftl::net::Universe *net_; + bool late_; void _schedule(); void _swap(detail::StreamSource &); diff --git a/components/rgbd-sources/src/rgbd_streamer.cpp b/components/rgbd-sources/src/rgbd_streamer.cpp index 472f05cf2a24cf93b8af8e0da5c57a29ecedb01e..6d6157936637c88e1f66d2ccf36b6136676688f0 100644 --- a/components/rgbd-sources/src/rgbd_streamer.cpp +++ b/components/rgbd-sources/src/rgbd_streamer.cpp @@ -24,7 +24,7 @@ using std::chrono::milliseconds; #define THREAD_POOL_SIZE 6 Streamer::Streamer(nlohmann::json &config, Universe *net) - : ftl::Configurable(config), pool_(THREAD_POOL_SIZE) { + : ftl::Configurable(config), pool_(THREAD_POOL_SIZE), late_(false) { active_ = false; net_ = net; @@ -169,11 +169,15 @@ void Streamer::_schedule() { shared_lock<shared_mutex> slk(s.second->mutex); if (s.second->state != 0) { - LOG(WARNING) << "Stream not ready to schedule on time: " << uri; + if (!late_) LOG(WARNING) << "Stream not ready to schedule on time: " << uri; + late_ = true; continue; + } else { + late_ = false; } + if (s.second->clients[0].size() == 0) { - LOG(ERROR) << "Stream has no clients: " << uri; + //LOG(ERROR) << "Stream has no clients: " << uri; continue; } slk.unlock(); @@ -184,7 +188,7 @@ void Streamer::_schedule() { src->src->grab(); unique_lock<shared_mutex> lk(src->mutex); - LOG(INFO) << "Grab frame"; + //LOG(INFO) << "Grab frame"; src->state |= ftl::rgbd::detail::kGrabbed; _swap(*src); }); @@ -225,7 +229,7 @@ void Streamer::_schedule() { } unique_lock<shared_mutex> lk(src->mutex); - LOG(INFO) << "Tx Frame: " << uri; + DLOG(2) << "Tx Frame: " << uri; src->state |= ftl::rgbd::detail::kTransmitted; _swap(*src); });