diff --git a/applications/reconstruct/src/main.cpp b/applications/reconstruct/src/main.cpp index e6a7d2d8b3e7f39bb47bbd3b43b4cd3ce166db38..eaf225b635b266431624ad3eabb9ddfb04fe990c 100644 --- a/applications/reconstruct/src/main.cpp +++ b/applications/reconstruct/src/main.cpp @@ -58,15 +58,57 @@ using ftl::registration::loadTransformations; using ftl::registration::saveTransformations; static Eigen::Affine3d create_rotation_matrix(float ax, float ay, float az) { - Eigen::Affine3d rx = - Eigen::Affine3d(Eigen::AngleAxisd(ax, Eigen::Vector3d(1, 0, 0))); - Eigen::Affine3d ry = - Eigen::Affine3d(Eigen::AngleAxisd(ay, Eigen::Vector3d(0, 1, 0))); - Eigen::Affine3d rz = - Eigen::Affine3d(Eigen::AngleAxisd(az, Eigen::Vector3d(0, 0, 1))); - return rz * rx * ry; + Eigen::Affine3d rx = + Eigen::Affine3d(Eigen::AngleAxisd(ax, Eigen::Vector3d(1, 0, 0))); + Eigen::Affine3d ry = + Eigen::Affine3d(Eigen::AngleAxisd(ay, Eigen::Vector3d(0, 1, 0))); + Eigen::Affine3d rz = + Eigen::Affine3d(Eigen::AngleAxisd(az, Eigen::Vector3d(0, 0, 1))); + return rz * rx * ry; } +// TODO: Remove this class (requires more general solution). Also does not +// process disconnections/reconnections/types etc. correctly. +class ConfigProxy { + private: + vector<ftl::UUID> peers_; + vector<std::string> uris_; + ftl::net::Universe *net_; + + public: + ConfigProxy(ftl::net::Universe *net) { + net_ = net; + + auto response = net_->findAll<std::string>("node_details"); + for (auto &r : response) { + auto r_json = json_t::parse(r); + peers_.push_back(ftl::UUID(r_json["id"].get<std::string>())); + uris_.push_back(r_json["title"].get<std::string>()); + } + } + + void add(ftl::Configurable *root, const std::string &uri, const std::string &name) { + auto config = json_t::parse(net_->call<string>(peers_[0], "get_cfg", uris_[0] + "/" + uri)); + auto *proxy = ftl::create<ftl::Configurable>(root, name); + + for (auto &itm : config.get<json::object_t>()) { + auto key = itm.first; + auto value = itm.second; + if (*key.begin() == '$') { continue; } + + proxy->set(key, value); + proxy->on(key, [this, uri, key, value, proxy](const ftl::config::Event&) { + for (size_t i = 0; i < uris_.size(); i++) { + // TODO: check that config exists? + auto peer = peers_[i]; + std::string name = uris_[i] + "/" + uri + "/" + key; + net_->send(peer, "update_cfg", name, proxy->getConfig()[key].dump()); + } + }); + } + } +}; + static void run(ftl::Configurable *root) { Universe *net = ftl::create<Universe>(root, "net"); ftl::ctrl::Slave slave(net, root); @@ -117,6 +159,9 @@ static void run(ftl::Configurable *root) { return; } + auto configproxy = ConfigProxy(net); + configproxy.add(root, "source/disparity", "disparity"); + // Create scene transform, intended for axis aligning the walls and floor Eigen::Matrix4d transform; if (root->getConfig()["transform"].is_object()) {