diff --git a/source/RobotAPI/libraries/armem_gui/MemoryViewer.cpp b/source/RobotAPI/libraries/armem_gui/MemoryViewer.cpp index b7aa4b68ccbcca14dab48f014da975a3f089e3df..3f4f2cf444028946646e433dae5d85a1b80144d0 100644 --- a/source/RobotAPI/libraries/armem_gui/MemoryViewer.cpp +++ b/source/RobotAPI/libraries/armem_gui/MemoryViewer.cpp @@ -140,6 +140,7 @@ namespace armarx::armem::gui const bool update = true; memoryReaders = mns.getAllReaders(update); + memoryWriters = mns.getAllWriters(update); } // DebugObserver is optional (check for null on every call) if (not debugObserverName.empty()) @@ -213,13 +214,17 @@ namespace armarx::armem::gui void MemoryViewer::loadFromDisk(QString directory) { std::string status; - std::map<std::string, wm::Memory> data = - diskControl->loadFromDisk(directory, memoryGroup->queryWidget()->queryInput(), &status); + std::map<std::string, wm::Memory> data = diskControl->loadFromDisk(directory, memoryGroup->queryWidget()->queryInput(), &status); for (auto& [name, memory] : data) { - this->memoryData[name] = std::move(memory); + if (memoryWriters.count(name) > 0) + { + auto commit = armem::toCommit(memory); + memoryWriters.at(name).commit(commit); + } } + statusLabel->setText(QString::fromStdString(status)); emit memoryDataChanged(); @@ -228,7 +233,7 @@ namespace armarx::armem::gui void MemoryViewer::startQueries() { - memoryReaders = mns.getAllReaders(true); + //memoryReaders = mns.getAllReaders(true); startDueQueries(runningQueries, memoryReaders); } @@ -353,6 +358,7 @@ namespace armarx::armem::gui // Drop all entries in memoryData which are not in memoryReaders anymore. for (auto it = memoryData.begin(); it != memoryData.end();) { + auto name = it->second.name(); if (memoryReaders.count(it->first) == 0) { it = memoryData.erase(it); @@ -500,8 +506,6 @@ namespace armarx::armem::gui convMap[name] = &data; } - // if convMap.empty(), we still need to update to remove existing entries. - TIMING_START(GuiUpdate) memoryGroup->tree()->update(convMap); TIMING_END_STREAM(GuiUpdate, ARMARX_VERBOSE) diff --git a/source/RobotAPI/libraries/armem_gui/MemoryViewer.h b/source/RobotAPI/libraries/armem_gui/MemoryViewer.h index e29a2352014cebaf1a700097f7409f7f32cb5229..3a1fb2a1c89d05f6c36c92e76514a6dcf2dd4cc4 100644 --- a/source/RobotAPI/libraries/armem_gui/MemoryViewer.h +++ b/source/RobotAPI/libraries/armem_gui/MemoryViewer.h @@ -10,6 +10,7 @@ #include <RobotAPI/interface/armem/mns/MemoryNameSystemInterface.h> #include <RobotAPI/libraries/armem/client/MemoryNameSystem.h> #include <RobotAPI/libraries/armem/client/Reader.h> +#include <RobotAPI/libraries/armem/client/Writer.h> #include <RobotAPI/libraries/armem_gui/PeriodicUpdateWidget.h> #include <RobotAPI/libraries/armem_gui/lifecycle.h> #include <RobotAPI/libraries/armem_gui/instance/GroupBox.h> @@ -135,6 +136,7 @@ namespace armarx::armem::gui armem::client::MemoryNameSystem mns; std::map<std::string, armem::client::Reader> memoryReaders; + std::map<std::string, armem::client::Writer> memoryWriters; std::map<std::string, armem::wm::Memory> memoryData; std::map<std::string, Ice::AsyncResultPtr> runningQueries; diff --git a/source/RobotAPI/libraries/armem_gui/disk/ControlWidget.cpp b/source/RobotAPI/libraries/armem_gui/disk/ControlWidget.cpp index 5d4542d2fb99984504843fdd050f10492dcd3831..4965ff7235ea012cbfff730777d5063bb910aa1a 100644 --- a/source/RobotAPI/libraries/armem_gui/disk/ControlWidget.cpp +++ b/source/RobotAPI/libraries/armem_gui/disk/ControlWidget.cpp @@ -22,9 +22,9 @@ namespace armarx::armem::gui::disk { _latestDirectory = QString::fromStdString("/tmp/MemoryExport"); - _loadFromDiskButton = new QPushButton(" Load from Disk", this); + _loadFromDiskButton = new QPushButton(" Load Query from Disk into WM", this); _loadFromDiskButton->setIcon(QIcon(":/icons/document-open.svg")); - _storeOnDiskButton = new QPushButton(" Store on Disk", this); + _storeOnDiskButton = new QPushButton(" Store Query from WM on Disk", this); _storeOnDiskButton->setIcon(QIcon(":/icons/document-save.svg")); // Allow horizontal shrinking of buttons @@ -149,7 +149,8 @@ namespace armarx::armem::gui::disk armem::server::ltm::disk::Memory ltm(dir.path()); armem::wm::Memory memory; - ltm.loadAll(memory); + ltm.loadAll(memory); // load list of references + ltm.load(memory); // resolve a list of references memoryData[memory.name()] = std::move(memory); diff --git a/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitor.h b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitor.h index a34459ee1d2eed5598888fe21067c33735f660db..0bab97220aeecf9897ac0f4a8dde786c97315fed 100644 --- a/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitor.h +++ b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitor.h @@ -21,59 +21,68 @@ namespace armarx::armem::gui::instance using TreeDataVisitorBase::TreeDataVisitorBase; - void visitDictOnEnter(const std::string& key, const aron::data::VariantPtr&, const aron::data::VariantPtr& n) override + void visitDictOnEnter(const aron::data::VariantPtr& n) override { + const std::string key = n->getPath().getLastElement(); _visitEnter(key, "Dict", n->childrenSize()); } - void visitDictOnExit(const std::string&, const aron::data::VariantPtr&, const aron::data::VariantPtr&) override + void visitDictOnExit(const aron::data::VariantPtr&) override { _visitExit(); } - void visitListOnEnter(const std::string& key, const aron::data::VariantPtr&, const aron::data::VariantPtr& n) override + void visitListOnEnter(const aron::data::VariantPtr& n) override { + const std::string key = n->getPath().getLastElement(); _visitEnter(key, "List", n->childrenSize()); } - void visitListOnExit(const std::string&, const aron::data::VariantPtr&, const aron::data::VariantPtr&) override + void visitListOnExit(const aron::data::VariantPtr&) override { _visitExit(); } - void visitBool(const std::string& key, const aron::data::VariantPtr&, const aron::data::VariantPtr& b) override + void visitBool(const aron::data::VariantPtr& b) override { const auto x = *aron::data::Bool::DynamicCastAndCheck(b); + const std::string key = b->getPath().getLastElement(); this->addValueRow(key, x, "Bool"); } - void visitDouble(const std::string& key, const aron::data::VariantPtr&, const aron::data::VariantPtr& d) override + void visitDouble(const aron::data::VariantPtr& d) override { const auto x = *aron::data::Double::DynamicCastAndCheck(d); + const std::string key = d->getPath().getLastElement(); this->addValueRow(key, x, "Double"); } - void visitFloat(const std::string& key, const aron::data::VariantPtr&, const aron::data::VariantPtr& f) override + void visitFloat(const aron::data::VariantPtr& f) override { const auto x = *aron::data::Float::DynamicCastAndCheck(f); + const std::string key = f->getPath().getLastElement(); this->addValueRow(key, x, "Float"); } - void visitInt(const std::string& key, const aron::data::VariantPtr&, const aron::data::VariantPtr& i) override + void visitInt(const aron::data::VariantPtr& i) override { const auto x = *aron::data::Int::DynamicCastAndCheck(i); + const std::string key = i->getPath().getLastElement(); this->addValueRow(key, x, "Int"); } - void visitLong(const std::string& key, const aron::data::VariantPtr&, const aron::data::VariantPtr& l) override + void visitLong(const aron::data::VariantPtr& l) override { const auto x = *aron::data::Long::DynamicCastAndCheck(l); + const std::string key = l->getPath().getLastElement(); this->addValueRow(key, x, "Long"); } - void visitString(const std::string& key, const aron::data::VariantPtr&, const aron::data::VariantPtr& string) override + void visitString(const aron::data::VariantPtr& string) override { const auto x = *aron::data::String::DynamicCastAndCheck(string); + const std::string key = string->getPath().getLastElement(); this->addValueRow(key, x, "String"); } - void visitNDArray(const std::string& key, const aron::data::VariantPtr&, const aron::data::VariantPtr& array) override + void visitNDArray(const aron::data::VariantPtr& array) override { const auto x = *aron::data::NDArray::DynamicCastAndCheck(array); + const std::string key = array->getPath().getLastElement(); this->addValueRow(key, x, "ND Array"); } diff --git a/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedDataVisitor.h b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedDataVisitor.h index 72848d6ead11b304b61954f95e443822bb6c8ce2..558057cc067b5c4c5525ebe3ec3701350da68729 100644 --- a/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedDataVisitor.h +++ b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedDataVisitor.h @@ -28,126 +28,194 @@ namespace armarx::armem::gui::instance using TreeDataVisitorBase::TreeDataVisitorBase; - void visitDictOnEnter(const std::string& key, const aron::data::VariantPtr&, const aron::type::VariantPtr&, const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override + void visitDictOnEnter(const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override { + ARMARX_CHECK_NOT_NULL(data); + ARMARX_CHECK_NOT_NULL(type); + const std::string key = data->getPath().getLastElement(); _visitEnter(key, sanitizeTypeName(type->getFullName()), data->childrenSize()); } - void visitDictOnExit(const std::string& key, const aron::data::VariantPtr&, const aron::type::VariantPtr&, const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override + void visitDictOnExit(const aron::data::VariantPtr&, const aron::type::VariantPtr&) override { _visitExit(); } - void visitObjectOnEnter(const std::string& key, const aron::data::VariantPtr&, const aron::type::VariantPtr&, const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override + void visitObjectOnEnter(const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override { + ARMARX_CHECK_NOT_NULL(data); + ARMARX_CHECK_NOT_NULL(type); + const std::string key = data->getPath().getLastElement(); _visitEnter(key, sanitizeTypeName(type->getFullName()), data->childrenSize()); } - void visitObjectOnExit(const std::string& key, const aron::data::VariantPtr&, const aron::type::VariantPtr&, const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override + void visitObjectOnExit(const aron::data::VariantPtr&, const aron::type::VariantPtr&) override { _visitExit(); } - void visitListOnEnter(const std::string& key, const aron::data::VariantPtr&, const aron::type::VariantPtr&, const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override + void visitListOnEnter(const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override { + ARMARX_CHECK_NOT_NULL(data); + ARMARX_CHECK_NOT_NULL(type); + const std::string key = data->getPath().getLastElement(); _visitEnter(key, sanitizeTypeName(type->getFullName()), data->childrenSize()); } - void visitListOnExit(const std::string& key, const aron::data::VariantPtr&, const aron::type::VariantPtr&, const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override + void visitListOnExit(const aron::data::VariantPtr&, const aron::type::VariantPtr&) override { _visitExit(); } - void visitTupleOnEnter(const std::string& key, const aron::data::VariantPtr&, const aron::type::VariantPtr&, const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override + void visitTupleOnEnter(const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override { + ARMARX_CHECK_NOT_NULL(data); + ARMARX_CHECK_NOT_NULL(type); + const std::string key = data->getPath().getLastElement(); _visitEnter(key, sanitizeTypeName(type->getFullName()), data->childrenSize()); } - void visitTupleOnExit(const std::string& key, const aron::data::VariantPtr&, const aron::type::VariantPtr&, const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override + void visitTupleOnExit(const aron::data::VariantPtr&, const aron::type::VariantPtr&) override { _visitExit(); } // What about Pair?? - void visitBool(const std::string& key, const aron::data::VariantPtr&, const aron::type::VariantPtr&, const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override + void visitBool(const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override { + ARMARX_CHECK_NOT_NULL(data); + ARMARX_CHECK_NOT_NULL(type); + const std::string key = data->getPath().getLastElement(); + auto d = *aron::data::Bool::DynamicCastAndCheck(data); auto t = *aron::type::Bool::DynamicCastAndCheck(type); this->addValueRow(key, d, t); } - void visitDouble(const std::string& key, const aron::data::VariantPtr&, const aron::type::VariantPtr&, const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override + void visitDouble(const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override { + ARMARX_CHECK_NOT_NULL(data); + ARMARX_CHECK_NOT_NULL(type); + const std::string key = data->getPath().getLastElement(); + auto d = *aron::data::Double::DynamicCastAndCheck(data); auto t = *aron::type::Double::DynamicCastAndCheck(type); this->addValueRow(key, d, t); } - void visitFloat(const std::string& key, const aron::data::VariantPtr&, const aron::type::VariantPtr&, const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override + void visitFloat(const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override { + ARMARX_CHECK_NOT_NULL(data); + ARMARX_CHECK_NOT_NULL(type); + const std::string key = data->getPath().getLastElement(); + auto d = *aron::data::Float::DynamicCastAndCheck(data); auto t = *aron::type::Float::DynamicCastAndCheck(type); this->addValueRow(key, d, t); } - void visitInt(const std::string& key, const aron::data::VariantPtr&, const aron::type::VariantPtr&, const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override + void visitInt(const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override { + ARMARX_CHECK_NOT_NULL(data); + ARMARX_CHECK_NOT_NULL(type); + const std::string key = data->getPath().getLastElement(); + auto d = *aron::data::Int::DynamicCastAndCheck(data); auto t = *aron::type::Int::DynamicCastAndCheck(type); this->addValueRow(key, d, t); } - void visitLong(const std::string& key, const aron::data::VariantPtr&, const aron::type::VariantPtr&, const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override + void visitLong(const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override { + ARMARX_CHECK_NOT_NULL(data); + ARMARX_CHECK_NOT_NULL(type); + const std::string key = data->getPath().getLastElement(); + auto d = *aron::data::Long::DynamicCastAndCheck(data); auto t = *aron::type::Long::DynamicCastAndCheck(type); this->addValueRow(key, d, t); } - void visitString(const std::string& key, const aron::data::VariantPtr&, const aron::type::VariantPtr&, const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override + void visitString(const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override { + ARMARX_CHECK_NOT_NULL(data); + ARMARX_CHECK_NOT_NULL(type); + const std::string key = data->getPath().getLastElement(); + auto d = *aron::data::String::DynamicCastAndCheck(data); auto t = *aron::type::String::DynamicCastAndCheck(type); this->addValueRow(key, d, t); } - void visitTime(const std::string& key, const aron::data::VariantPtr&, const aron::type::VariantPtr&, const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override + void visitTime(const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override { + ARMARX_CHECK_NOT_NULL(data); + ARMARX_CHECK_NOT_NULL(type); + const std::string key = data->getPath().getLastElement(); + auto d = *aron::data::Long::DynamicCastAndCheck(data); auto t = *aron::type::Time::DynamicCastAndCheck(type); this->addValueRow(key, d, t); } - void visitMatrix(const std::string& key, const aron::data::VariantPtr&, const aron::type::VariantPtr&, const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override + void visitMatrix(const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override { + ARMARX_CHECK_NOT_NULL(data); + ARMARX_CHECK_NOT_NULL(type); + const std::string key = data->getPath().getLastElement(); + auto d = *aron::data::NDArray::DynamicCastAndCheck(data); auto t = *aron::type::Matrix::DynamicCastAndCheck(type); this->addValueRow(key, d, t); } - void visitQuaternion(const std::string& key, const aron::data::VariantPtr&, const aron::type::VariantPtr&, const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override + void visitQuaternion(const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override { + ARMARX_CHECK_NOT_NULL(data); + ARMARX_CHECK_NOT_NULL(type); + const std::string key = data->getPath().getLastElement(); + auto d = *aron::data::NDArray::DynamicCastAndCheck(data); auto t = *aron::type::Quaternion::DynamicCastAndCheck(type); this->addValueRow(key, d, t); } - void visitPointCloud(const std::string& key, const aron::data::VariantPtr&, const aron::type::VariantPtr&, const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override + void visitPointCloud(const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override { + ARMARX_CHECK_NOT_NULL(data); + ARMARX_CHECK_NOT_NULL(type); + const std::string key = data->getPath().getLastElement(); + auto d = *aron::data::NDArray::DynamicCastAndCheck(data); auto t = *aron::type::PointCloud::DynamicCastAndCheck(type); this->addValueRow(key, d, t); } - void visitPose(const std::string& key, const aron::data::VariantPtr&, const aron::type::VariantPtr&, const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override + void visitPose(const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override { + ARMARX_CHECK_NOT_NULL(data); + ARMARX_CHECK_NOT_NULL(type); + const std::string key = data->getPath().getLastElement(); + auto d = *aron::data::NDArray::DynamicCastAndCheck(data); auto t = *aron::type::Pose::DynamicCastAndCheck(type); this->addValueRow(key, d, t); } - void visitPosition(const std::string& key, const aron::data::VariantPtr&, const aron::type::VariantPtr&, const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override + void visitPosition(const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override { + ARMARX_CHECK_NOT_NULL(data); + ARMARX_CHECK_NOT_NULL(type); + const std::string key = data->getPath().getLastElement(); + auto d = *aron::data::NDArray::DynamicCastAndCheck(data); auto t = *aron::type::Position::DynamicCastAndCheck(type); this->addValueRow(key, d, t); } - void visitImage(const std::string& key, const aron::data::VariantPtr&, const aron::type::VariantPtr&, const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override + void visitImage(const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override { + ARMARX_CHECK_NOT_NULL(data); + ARMARX_CHECK_NOT_NULL(type); + const std::string key = data->getPath().getLastElement(); + auto d = *aron::data::NDArray::DynamicCastAndCheck(data); auto t = *aron::type::Image::DynamicCastAndCheck(type); this->addValueRow(key, d, t); } - void visitOrientation(const std::string& key, const aron::data::VariantPtr&, const aron::type::VariantPtr&, const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override + void visitOrientation(const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override { + ARMARX_CHECK_NOT_NULL(data); + ARMARX_CHECK_NOT_NULL(type); + const std::string key = data->getPath().getLastElement(); + auto d = *aron::data::NDArray::DynamicCastAndCheck(data); auto t = *aron::type::Orientation::DynamicCastAndCheck(type); this->addValueRow(key, d, t);