MemoryViewer.cpp
Go to the documentation of this file.
1 #include "MemoryViewer.h"
2 
3 #include <QApplication>
4 #include <QBoxLayout>
5 #include <QCheckBox>
6 #include <QClipboard>
7 #include <QDialog>
8 #include <QGroupBox>
9 #include <QLabel>
10 #include <QLayout>
11 #include <QMenu>
12 #include <QSettings>
13 #include <QTimer>
14 
15 #include <Ice/Exception.h>
16 
17 #include <SimoxUtility/algorithm/get_map_keys_values.h>
18 #include <SimoxUtility/algorithm/string/string_tools.h>
19 
24 
26 
27 #include <RobotAPI/interface/armem/actions.h>
28 #include <RobotAPI/interface/armem/memory.h>
29 #include <RobotAPI/interface/armem/mns/MemoryNameSystemInterface.h>
39 
40 namespace armarx::armem::gui
41 {
42  MemoryViewer::MemoryViewer(QBoxLayout* updateWidgetLayout,
43  QGroupBox* memoryGroupBox,
44  QLayout* memoryGroupBoxParentLayout,
45  QGroupBox* instanceGroupBox,
46  QLayout* instanceGroupBoxParentLayout,
47  QBoxLayout* diskControlWidgetLayout,
48  QLabel* statusLabel)
49  {
50  Logging::setTag("MemoryViewer");
51 
52  this->statusLabel = statusLabel;
53  this->statusLabel->clear();
54 
55  statusLabel->setContextMenuPolicy(Qt::CustomContextMenu);
56  connect(statusLabel,
57  &QLabel::customContextMenuRequested,
58  [statusLabel](const QPoint& pos)
59  {
60  QMenu menu(statusLabel);
61  menu.addAction("Copy to clipboard",
62  [statusLabel]()
63  { QApplication::clipboard()->setText(statusLabel->text()); });
64  menu.addAction("Clear status", [statusLabel]() { statusLabel->clear(); });
65  menu.exec(statusLabel->mapToGlobal(pos));
66  });
67 
68 
69  // Update timer
70  this->updateWidgetLayout = updateWidgetLayout;
72  updateWidgetLayout->insertWidget(0, updateWidget);
73 
74  periodicUpdateTimer = new QTimer(this);
75  periodicUpdateTimer->setInterval(1000 / 60); // Keep this stable.
76 
77  // Memory View
78  auto retrieveEntityInfo = [this](const MemoryID& entityID) -> PredictionWidget::EntityInfo
79  {
80  client::Reader reader = memoryReaders.at(entityID.memoryName);
81  if (!reader.predictionPrx)
82  {
83  std::stringstream sstream;
84  sstream << "Predictions are not available for memory '" << entityID.memoryName
85  << "'.";
86  this->statusLabel->setText(QString::fromStdString(sstream.str()));
87  return {};
88  }
89 
90  std::map<MemoryID, std::vector<PredictionEngine>> predictionEngines;
91  client::QueryResult queryResult;
92  try
93  {
94  predictionEngines = reader.getAvailablePredictionEngines();
95  queryResult = reader.queryMemoryIDs({entityID}, armem::query::DataMode::NoData);
96  }
97  catch (const Ice::LocalException& e)
98  {
99  std::stringstream sstream;
100  sstream << "Could not get prediction engines and type from memory: " << e.what();
101  this->statusLabel->setText(QString::fromStdString(sstream.str()));
102  return {nullptr, {}};
103  }
104 
105  aron::type::ObjectPtr entityType;
106  if (queryResult.success)
107  {
108  auto* providerSegment = queryResult.memory.findProviderSegment(entityID);
109  if (providerSegment != nullptr)
110  {
111  entityType = providerSegment->aronType();
112  }
113  }
115  .type = entityType,
116  .engines = armem::accumulateEntriesContainingID(predictionEngines, entityID)};
117  };
118  memoryGroup = new armem::gui::MemoryGroupBox(std::move(retrieveEntityInfo));
119 
120  armarx::gui::replaceWidget(memoryGroupBox, memoryGroup, memoryGroupBoxParentLayout);
121  ARMARX_CHECK_NULL(memoryGroupBox);
122 
123  // Instance View
125  armarx::gui::replaceWidget(instanceGroupBox, instanceGroup, instanceGroupBoxParentLayout);
126  this->instanceGroup->setStatusLabel(statusLabel);
127  ARMARX_CHECK_NULL(instanceGroupBox);
128 
129  // Disk Control
130  if (diskControlWidgetLayout)
131  {
132  this->diskControlLayout = diskControlWidgetLayout;
134  diskControlWidgetLayout->addWidget(diskControl);
135  }
136 
137  // Connections
138  connect(diskControl,
140  this,
142  connect(diskControl,
144  this,
146 
147  connect(this, &This::connected, this, &This::startQueries);
148  connect(this, &This::connected, this, &This::startPeriodicUpdateTimer);
149  connect(updateWidget, &armem::gui::PeriodicUpdateWidget::update, this, &This::startQueries);
150  connect(
151  updateWidget, &armem::gui::PeriodicUpdateWidget::collapseAll, this, &This::collapseAll);
152 
153  connect(periodicUpdateTimer, &QTimer::timeout, this, &This::updateListOfActiveMemories);
154  connect(periodicUpdateTimer, &QTimer::timeout, this, &This::processQueryResults);
155 
156  connect(memoryGroup->queryWidget(),
158  this,
160  connect(memoryGroup->queryWidget(),
162  this,
164  connect(memoryGroup->queryWidget(),
166  this,
168 
169  connect(memoryGroup->predictionWidget(),
171  this,
173  connect(
175 
176  connect(this, &This::memoryDataChanged, this, &This::updateMemoryTree);
177  connect(memoryGroup->tree(),
179  this,
181 
182  connect(memoryGroup->tree(),
184  this,
186  connect(memoryGroup->tree(),
188  this,
190  connect(instanceGroup,
192  this,
194  connect(instanceGroup->view,
196  this,
198  connect(instanceGroup->view,
200  this,
202  }
203 
204  void
205  MemoryViewer::setLogTag(const std::string& _tag) // Leading _ silences a warning
206  {
207  Logging::setTag(_tag);
208  }
209 
210  void
212  {
213  if (mnsName.size() > 0)
214  {
215  component.usingProxy(mnsName);
216  }
217  if (debugObserverName.size() > 0)
218  {
219  component.usingProxy(debugObserverName);
220  }
221 
222  is_initialized = true;
223  emit initialized();
224  }
225 
226  void
227  MemoryViewer::onConnect(ManagedIceObject& component)
228  {
229  if (not mnsName.empty())
230  {
231  armem::mns::MemoryNameSystemInterfacePrx mnsProxy;
232  component.getProxy(mnsProxy, mnsName);
233  mns = client::MemoryNameSystem(mnsProxy);
234 
235  const bool update = true;
238  }
239  // DebugObserver is optional (check for null on every call)
240  if (not debugObserverName.empty())
241  {
242  component.getProxy(debugObserver, debugObserverName, false, "", false);
243  }
244 
246 
247  is_connected = true;
248  emit connected();
249  }
250 
251  void
252  MemoryViewer::onDisconnect(ManagedIceObject&)
253  {
254  periodicUpdateTimer->stop();
256 
257  is_connected = false;
258 
259  emit disconnected();
260  }
261 
262  void
263  MemoryViewer::collapseAll()
264  {
265  memoryGroup->tree()->collapseAll();
266  }
267 
268  void
269  MemoryViewer::startPeriodicUpdateTimer()
270  {
271  periodicUpdateTimer->start();
272  }
273 
274  const armem::wm::Memory*
275  MemoryViewer::getSingleMemoryData(const std::string& memoryName)
276  {
277  auto it = memoryData.find(memoryName);
278  if (it == memoryData.end())
279  {
280  std::stringstream ss;
281  ss << "Memory name '" << memoryName << "' is unknown. Known are: "
282  << simox::alg::join(simox::alg::get_keys(memoryData), ", ");
283  statusLabel->setText(QString::fromStdString(ss.str()));
284  return nullptr;
285  }
286  /*else if (not it->second.has_value())
287  {
288  return nullptr;
289  }*/
290  else
291  {
292  //return &it->second.value();
293  return &it->second;
294  }
295  }
296 
297  void
299  {
300  TIMING_START(MemoryStore);
301 
302  auto enabledMemories = memoryGroup->queryWidget()->getEnabledMemories();
303  for (auto& [name, reader] : memoryReaders)
304  {
305  // skip if memory should not be queried
306  if (std::find(enabledMemories.begin(), enabledMemories.end(), name) ==
307  enabledMemories.end())
308  {
309  continue;
310  }
311 
312  // Query memory
313  auto q_res = reader.query(memoryGroup->queryInput());
314  if (q_res.success)
315  {
316  server::dto::DirectlyStoreInput input;
317  input.memory = q_res.toIce().memory;
318  reader.directlyStore(input);
319  }
320  else
321  {
322  std::string s = "Query of memory " + name + " was unsuccessful.";
323  statusLabel->setText(QString::fromStdString(s));
324  }
325  }
326 
327  TIMING_END_STREAM(MemoryStore, ARMARX_VERBOSE);
328  }
329 
330  void
332  {
333 
334  TIMING_START(MemoryStartRecording);
335 
336  auto enabledMemories = memoryGroup->queryWidget()->getEnabledMemories();
337  for (auto& [name, reader] : memoryReaders)
338  {
339  // skip if memory should not be queried
340  if (std::find(enabledMemories.begin(), enabledMemories.end(), name) ==
341  enabledMemories.end())
342  {
343  continue;
344  }
345  reader.startRecording();
346  }
347 
348  TIMING_END_STREAM(MemoryStartRecording, ARMARX_VERBOSE);
349  }
350 
351  void
353  {
354 
355  TIMING_START(MemoryStopRecording);
356 
357  auto enabledMemories = memoryGroup->queryWidget()->getEnabledMemories();
358  for (auto& [name, reader] : memoryReaders)
359  {
360  // skip if memory should not be queried
361  if (std::find(enabledMemories.begin(), enabledMemories.end(), name) ==
362  enabledMemories.end())
363  {
364  continue;
365  }
366  reader.stopRecording();
367  }
368 
369  TIMING_END_STREAM(MemoryStopRecording, ARMARX_VERBOSE);
370  }
371 
372  void
374  {
375 
377  auto now = armem::Time::Now();
378 
379  const std::string memoryIDStr = memoryGroup->commitWidget()->getMemoryID();
380  const std::string aronJSONStr = memoryGroup->commitWidget()->getAronJSON();
381 
382  ARMARX_INFO << "Committing to " << memoryIDStr << " the data: " << aronJSONStr;
383 
384  MemoryID memId(memoryIDStr);
385 
386  if (!memId.hasEntityName())
387  {
388  ARMARX_WARNING << "The entered MemoryID '" << memoryIDStr
389  << "' does not contain an entity.";
390  }
391  else
392  {
393 
394  nlohmann::json json = nlohmann::json::parse(aronJSONStr);
395 
396  // ToDo: multiple objects
397  auto aron =
399  json);
400 
401  if (const auto& it = memoryWriters.find(memId.memoryName); it == memoryWriters.end())
402  {
403  ARMARX_WARNING << "No memory with name '" << memId.memoryName
404  << "' available for commit.";
405  }
406  else
407  {
408  armem::Commit comm;
409  auto& entityUpdate = comm.add();
410  entityUpdate.entityID = memId;
411  entityUpdate.confidence = 1.0;
412  entityUpdate.instancesData = {aron};
413  entityUpdate.referencedTime = now;
414  it->second.commit(comm);
415  }
416  }
417 
419  }
420 
421  void
422  MemoryViewer::storeOnDisk(QString directory)
423  {
424  TIMING_START(MemoryExport)
425 
426  std::string status;
427  std::vector<wm::Memory> memoryDataVec = simox::alg::get_values(memoryData);
428  diskControl->storeOnDisk(directory, memoryDataVec, &status);
429 
430  statusLabel->setText(QString::fromStdString(status));
431  TIMING_END_STREAM(MemoryExport, ARMARX_VERBOSE)
432  }
433 
434  void
435  MemoryViewer::loadFromDisk(QString directory)
436  {
437 
438  std::string status;
439  std::map<std::filesystem::path, wm::Memory> data =
441 
442  for (auto& [path, memory] : data)
443  {
444  std::string name = memory.id().memoryName;
445 
446  if (memoryWriters.count(name) > 0)
447  {
448  // we need to merge the current memory with the one from the disk.
449  // Please note that this may ignores coresegments, if not already existent
450  auto commit = armem::toCommit(memory);
451  memoryWriters.at(name).commit(commit);
452  }
453  else
454  {
455  ARMARX_INFO << "No memory with name '" << name
456  << "' available for commit. Create new virtual memory.";
457 
458  // Please note: Here we assume that a memory server with the same name does not exist.
459  // I think this assumption is ok, since nobody should use filepaths as memory name.
460  // Nonetheless, we did not restrict the user to do so...
461  std::string virtualMemoryName = name; // + " (at " + path.string() + ")";
462  memory.id().memoryName = virtualMemoryName;
463  memoryData[virtualMemoryName] = std::move(memory);
464  }
465  }
466 
467  statusLabel->setText(QString::fromStdString(status));
468 
469  emit memoryDataChanged();
470  }
471 
472  void
473  MemoryViewer::startQueries()
474  {
475  startDueQueries();
476  }
477 
478  void
479  MemoryViewer::processQueryResults()
480  {
481  const std::map<std::string, client::QueryResult> results = collectQueryResults();
482 
483  int errorCount = 0;
484  applyQueryResults(results, &errorCount);
485 
486  emit memoryDataChanged();
487  updateStatusLabel(errorCount);
488  }
489 
490  void
491  MemoryViewer::updateStatusLabel(int errorCount)
492  {
493  // Code to output status label information
494  if (statusLabel and errorCount > 0)
495  {
496  auto now = std::chrono::system_clock::now();
497  auto in_time_t = std::chrono::system_clock::to_time_t(now);
498 
499  std::stringstream ss;
500  ss << "Last update: " << std::put_time(std::localtime(&in_time_t), "%Y-%m-%d %X");
501  ss << "\nThe query produced " << errorCount << " errors! Please check log.";
502 
503  statusLabel->setText(QString::fromStdString(ss.str()));
504  }
505  }
506 
507  void
508  MemoryViewer::startDueQueries()
509  {
510 
511  armem::client::QueryInput input = memoryGroup->queryInput();
512  int recursionDepth = memoryGroup->queryWidget()->queryLinkRecursionDepth();
513 
514  // Can't use a structured binding here because you can't capture those in a lambda
515  // according to the C++ standard.
516  auto enabledMemories = memoryGroup->queryWidget()->getEnabledMemories();
517  for (const auto& pair : memoryReaders)
518  {
519  // skip if memory should not be queried
520  if (std::find(enabledMemories.begin(), enabledMemories.end(), pair.first) ==
521  enabledMemories.end())
522  {
523  continue;
524  }
525 
526  const auto& name = pair.first;
527  const auto& reader = pair.second;
528 
529  // skip if query already running
530  if (runningQueries.count(name) != 0)
531  {
532  continue;
533  }
534 
535  // You could pass the query function itself to async here,
536  // but that caused severe template headaches when I tried it.
537  runningQueries[name] = std::async(
538  std::launch::async,
539  [reader, input, recursionDepth, this]()
540  {
541  // Can't resolve MemoryLinks without data
542  return recursionDepth == 0 || input.dataMode == armem::query::DataMode::NoData
543  ? reader.query(input.toIce())
544  : reader.query(input.toIce(), mns, recursionDepth);
545  });
546  }
547  }
548 
549  std::map<std::string, client::QueryResult>
550  MemoryViewer::collectQueryResults()
551  {
552 
553  TIMING_START(tCollectQueryResults)
554 
555  std::map<std::string, client::QueryResult> results;
556  for (auto it = runningQueries.begin(); it != runningQueries.end();)
557  {
558  const std::string& name = it->first;
559  std::future<armem::query::data::Result>* queryPromise = &it->second;
560 
561  if (queryPromise->wait_for(std::chrono::seconds(0)) == std::future_status::ready)
562  {
563  if (auto jt = memoryReaders.find(name); jt != memoryReaders.end())
564  {
565  try
566  {
567  results[name] = client::QueryResult::fromIce(queryPromise->get());
568  }
569  catch (const Ice::ConnectionRefusedException&)
570  {
571  // Server is gone (MNS did not know about it yet) => Skip result.
572  }
573  }
574  // else: Server is gone (MNS knew about it) => Skip result.
575 
576  // Promise is completed => Clean up in any case.
577  it = runningQueries.erase(it);
578  }
579  else
580  {
581  ++it; // Uncompleted => Keep.
582  }
583  }
584 
585  TIMING_END_STREAM(tCollectQueryResults, ARMARX_VERBOSE)
586  if (debugObserver)
587  {
588  debugObserver->begin_setDebugChannel(
590  {
591  {"t Collect Query Results [ms]",
592  new Variant(tCollectQueryResults.toMilliSecondsDouble())},
593  {"# Collected Query Results", new Variant(static_cast<int>(results.size()))},
594  });
595  }
596 
597  return results;
598  }
599 
600  void
601  MemoryViewer::applyQueryResults(const std::map<std::string, client::QueryResult>& results,
602  int* outErrorCount)
603  {
604  TIMING_START(tProcessQueryResults)
605  for (const auto& [name, result] : results)
606  {
607  if (result.success)
608  {
609  memoryData[name] = std::move(result.memory);
610  }
611  else
612  {
613  ARMARX_WARNING << "Querying memory server '" << name << "' produced an error: \n"
614  << result.errorMessage;
615  if (outErrorCount)
616  {
617  outErrorCount++;
618  }
619  }
620  }
621 
622  // Perhaps remove entries
623  auto enabledMemories = memoryGroup->queryWidget()->getEnabledMemories();
624  for (auto it = memoryData.begin(); it != memoryData.end();)
625  {
626  // Drop all entries in memoryData which are not in memoryReaders anymore.
627  if (memoryReaders.count(it->first) == 0)
628  {
630  {
631  it = memoryData.erase(it);
632  }
633  else
634  {
635  ++it;
636  }
637  continue;
638  }
639 
640  // Drop all entries that are not enabled by user (which means that there is no query result)
641  if (std::find(enabledMemories.begin(), enabledMemories.end(), it->first) ==
642  enabledMemories.end())
643  {
645  {
646  it = memoryData.erase(it);
647  }
648  else
649  {
650  ++it;
651  }
652  continue;
653  }
654 
655  // Memory found
656  ++it;
657  }
658 
659  TIMING_END_STREAM(tProcessQueryResults, ARMARX_VERBOSE)
660  if (debugObserver)
661  {
662  debugObserver->begin_setDebugChannel(
664  {
665  {"t Process Query Results [ms]",
666  new Variant(tProcessQueryResults.toMilliSecondsDouble())},
667  {"# Processed Query Results", new Variant(static_cast<int>(results.size()))},
668  });
669  }
670  }
671 
672  void
674  {
675  const armem::wm::Memory* data = getSingleMemoryData(selectedID.memoryName);
676  if (data)
677  {
678  if (not selectedID.hasEntityName())
679  {
680  return;
681  }
682  armem::MemoryID id = selectedID;
683  const armem::wm::EntitySnapshot* snapshot = nullptr;
684  if (not id.hasTimestamp())
685  {
686  const armem::wm::Entity& entity = data->getEntity(id);
687  if (entity.empty())
688  {
689  return;
690  }
691  snapshot = &entity.getLatestSnapshot();
692  id.timestamp = snapshot->time();
693  }
694  if (not id.hasInstanceIndex())
695  {
696  if (not snapshot)
697  {
698  try
699  {
700  snapshot = &data->getSnapshot(id);
701  }
702  catch (const armem::error::ArMemError& e)
703  {
704  if (statusLabel)
705  {
706  statusLabel->setText(e.what());
707  }
708  }
709  }
710  if (snapshot && snapshot->size() > 0)
711  {
712  id.instanceIndex = 0;
713  }
714  }
715  if (id.hasInstanceIndex())
716  {
717  instanceGroup->view->update(id, *data);
718  }
719  }
720  }
721 
722  void
724  {
725  // ARMARX_IMPORTANT << "Resolving memory ID: " << id;
726 
727  auto handleError = [this](const std::string& msg)
728  {
729  statusLabel->setText(QString::fromStdString(msg));
730  ARMARX_WARNING << msg;
731  };
732 
733  if (id.memoryName.empty())
734  {
735  handleError("Memory name is empty.");
736  }
737 
738  aron::type::ObjectPtr segmentType;
739  std::optional<wm::EntityInstance> instance;
740  try
741  {
742  if (const wm::Memory* data = getSingleMemoryData(id.memoryName))
743  {
744  segmentType = data->getProviderSegment(id).aronType();
745 
746  if (id.hasInstanceIndex())
747  {
748  instance = data->getInstance(id);
749  }
750  else if (id.hasTimestamp())
751  {
752  instance = data->getSnapshot(id).getInstance(0);
753  }
754  else
755  {
756  instance = data->getEntity(id).getLatestSnapshot().getInstance(0);
757  }
758  }
759  }
760  catch (const armem::error::ArMemError&)
761  {
762  // May be handled by remote lookup
763  }
764 
765  if (not instance)
766  {
767  try
768  {
769  // Resolve remotely (may still fail, returns an optional).
770  instance = mns.resolveEntityInstance(id);
771  }
772  catch (const armem::error::ArMemError& e)
773  {
774  ARMARX_WARNING << e.what();
775  statusLabel->setText(e.what());
776  }
777  }
778 
779  if (instance)
780  {
781  auto* view = new InstanceView();
783  view->update(*instance, segmentType);
784  //instanceGroup->view->addInstanceView(*instance, segmentType);
785  }
786  else
787  {
788  // ToDo: Propagate error back to highlight selected entry in red
789  }
790  }
791 
792  void
793  MemoryViewer::updateListOfActiveMemories()
794  {
795  if (is_connected and mns) // mns must be connected and mns must be available
796  {
797  try
798  {
801 
802  std::vector<std::string> activeMemoryNames;
803 
804  // add all active memories to update list
806  memoryReaders.end(),
807  std::back_inserter(activeMemoryNames),
808  [](const auto& p) { return p.first; });
809 
810  TIMING_START(GuiUpdateAvailableMemories);
811  memoryGroup->queryWidget()->update(activeMemoryNames);
812  TIMING_END_STREAM(GuiUpdateAvailableMemories, ARMARX_VERBOSE);
813  }
814  catch (...)
815  {
816  // MNS was killed/stopped
817  // ignore?!
818  }
819  }
820  else
821  {
823  << deactivateSpam()
824  << "MNS not ready yet. Skip update of available memories in query widget.";
825  }
826  }
827 
828  void
829  MemoryViewer::updateMemoryTree()
830  {
831  std::map<std::string, const armem::wm::Memory*> memoriesToUpdate;
832 
833  //auto checkboxStates = memoryGroup->queryWidget()->getAvailableMemoryStates();
834  for (auto& [name, data] : memoryData)
835  {
836  memoriesToUpdate[name] = &data;
837  }
838 
839  TIMING_START(GuiUpdateMemoryTree)
840  memoryGroup->tree()->update(memoriesToUpdate);
841  TIMING_END_STREAM(GuiUpdateMemoryTree, ARMARX_VERBOSE)
842 
843  if (debugObserver)
844  {
845  try
846  {
847  debugObserver->setDebugDatafield(
849  "GUI Update [ms]",
850  new Variant(GuiUpdateMemoryTree.toMilliSecondsDouble()));
851  }
852  catch (const Ice::Exception&)
853  {
854  // Ignore ...
855  }
856  }
857  }
858 
859  void
861  QWidget* parent,
862  const QPoint& pos,
863  QMenu* menu)
864  {
865  // Called if we have to stop because of an error.
866  auto showMenu = [menu, pos]()
867  {
868  if (menu)
869  menu->exec(pos);
870  };
871 
872  if (memoryID == MemoryID())
873  {
874  // Empty MemoryID, don't try to generate actions.
875  showMenu();
876  return;
877  }
878 
879  mns::dto::MemoryServerInterfaces prx;
880  try
881  {
882  prx = mns.resolveServer(memoryID);
883  }
884  catch (const error::CouldNotResolveMemoryServer& e)
885  {
886  statusLabel->setText(
887  QString::fromStdString(e.makeMsg(memoryID, "Could not resolve memory server.")));
888  showMenu();
889  return;
890  }
891 
892  if (!prx.actions)
893  {
894  std::stringstream ss;
895  ss << "Memory server " << memoryID << " does not support actions or is offline.";
896  statusLabel->setText(QString::fromStdString(ss.str()));
897  showMenu();
898  return;
899  }
900 
901  actions::GetActionsOutputSeq result;
902  try
903  {
904  result = prx.actions->getActions({{armarx::toIce<data::MemoryID>(memoryID)}});
905  }
906  catch (const Ice::LocalException& e)
907  {
908  std::stringstream ss;
909  ss << "Could not get actions for " << memoryID << ".";
910  statusLabel->setText(QString::fromStdString(ss.str()));
911  showMenu();
912  return;
913  }
914 
915  if (result.size() == 0)
916  {
917  showMenu();
918  return;
919  }
920  auto builder = ActionsMenuBuilder(
921  memoryID,
922  parent,
923  [this, prx](const MemoryID& memoryID, const actions::ActionPath& path)
924  {
925  actions::data::ExecuteActionOutputSeq result;
926  try
927  {
928  result = prx.actions->executeActions(
929  {{armarx::toIce<armem::data::MemoryID>(memoryID), path}});
930  }
931  catch (const Ice::LocalException& e)
932  {
933  std::stringstream ss;
934  ss << "Failed to execute action: " << e.what();
935  statusLabel->setText(QString::fromStdString(ss.str()));
936  }
937 
938  for (const auto& [success, errorMessage] : result)
939  {
940  if (not success)
941  {
942  std::stringstream ss;
943  ss << "Failed to execute action: " << errorMessage;
944  statusLabel->setText(QString::fromStdString(ss.str()));
945  ARMARX_WARNING << ss.str();
946  }
947  }
948  });
949 
950  QMenu* actionsMenu = builder.buildActionsMenu(result[0]);
951  if (menu == nullptr)
952  {
953  actionsMenu->exec(pos);
954  }
955  else
956  {
957  menu->addMenu(actionsMenu);
958  menu->exec(pos);
959  }
960  }
961 
962  void
964  const aron::type::ObjectPtr& entityType,
965  const armarx::DateTime& timestamp,
966  const std::string& engineID)
967  {
968 
969  std::stringstream errorStream;
970  auto showError = [this, &errorStream]()
971  { statusLabel->setText(QString::fromStdString(errorStream.str())); };
972 
973  if (!entityID.hasEntityName() || entityID.hasGap())
974  {
975  errorStream << "Could not convert " << entityID << " to valid entity ID.";
976  showError();
977  return;
978  }
979  if (memoryReaders.find(entityID.memoryName) == memoryReaders.end())
980  {
981  errorStream << "Not connected to memory '" << entityID.memoryName
982  << "', cannot make prediction.";
983  showError();
984  return;
985  }
986  client::Reader reader = memoryReaders.at(entityID.memoryName);
987  if (!reader.predictionPrx)
988  {
989  errorStream << "Predictions are not available for memory '" << entityID.memoryName
990  << "'.";
991  showError();
992  return;
993  }
994  PredictionRequest request;
995  request.snapshotID = entityID.withTimestamp(timestamp);
996  request.predictionSettings.predictionEngineID = engineID;
997  PredictionResult result;
998  try
999  {
1000  result = reader.predict({request}).at(0);
1001  }
1002  catch (const Ice::LocalException& e)
1003  {
1004  errorStream << "Could not make prediction request: " << e.what();
1005  showError();
1006  return;
1007  }
1008 
1009  if (!result.success)
1010  {
1011  errorStream << "Prediction failed: " << result.errorMessage;
1012  showError();
1013  return;
1014  }
1015 
1016  auto* view = new AronDataView();
1017  instanceGroup->view->addDataView(view);
1018  view->update(result.prediction, entityType);
1019  }
1020 
1021  const static std::string CONFIG_KEY_MEMORY = "MemoryViewer.MemoryNameSystem";
1022  const static std::string CONFIG_KEY_DEBUG_OBSERVER = "MemoryViewer.DebugObserverName";
1023 
1024  void
1025  MemoryViewer::loadSettings(QSettings* settings)
1026  {
1027  mnsName = settings->value(QString::fromStdString(CONFIG_KEY_MEMORY), "MemoryNameSystem")
1028  .toString()
1029  .toStdString();
1031  settings->value(QString::fromStdString(CONFIG_KEY_DEBUG_OBSERVER), "DebugObserver")
1032  .toString()
1033  .toStdString();
1034  }
1035 
1036  void
1037  MemoryViewer::saveSettings(QSettings* settings)
1038  {
1039  settings->setValue(QString::fromStdString(CONFIG_KEY_MEMORY),
1040  QString::fromStdString(mnsName));
1041  settings->setValue(QString::fromStdString(CONFIG_KEY_DEBUG_OBSERVER),
1042  QString::fromStdString(debugObserverName));
1043  }
1044 
1045  void
1047  {
1048  dialog->addProxyFinder<armarx::armem::mns::MemoryNameSystemInterfacePrx>(
1049  {CONFIG_KEY_MEMORY, "MemoryNameSystem", "MemoryNameSystem"});
1051  {CONFIG_KEY_DEBUG_OBSERVER, "Debug Observer", "DebugObserver"});
1052  }
1053 
1054  void
1056  {
1057  mnsName = dialog->getProxyName(CONFIG_KEY_MEMORY);
1058  if (mnsName.empty())
1059  {
1060  mnsName = "MemoryNameSystem";
1061  }
1062  debugObserverName = dialog->getProxyName(CONFIG_KEY_DEBUG_OBSERVER);
1063  }
1064 
1065 } // namespace armarx::armem::gui
armarx::armem::detail::SuccessHeader::success
bool success
Definition: SuccessHeader.h:19
armarx::armem::client::MemoryNameSystem::resolveServer
mns::dto::MemoryServerInterfaces resolveServer(const MemoryID &memoryID)
Resolve the given memory server for the given memory ID.
Definition: MemoryNameSystem.cpp:113
armarx::armem::gui::disk::ControlWidget::storeOnDisk
void storeOnDisk(QString directory, const std::vector< wm::Memory > memoryData, std::string *outStatus=nullptr)
Definition: ControlWidget.cpp:80
armarx::armem::gui::disk::ControlWidget
Definition: ControlWidget.h:19
armarx::armem::base::detail::MemoryContainerBase::empty
bool empty() const
Definition: MemoryContainerBase.h:41
armarx::armem::client::Reader
Reads data from a memory server.
Definition: Reader.h:23
ARMARX_VERBOSE
#define ARMARX_VERBOSE
Definition: Logging.h:187
TIMING_START
#define TIMING_START(name)
Definition: TimeUtil.h:289
armarx::armem::gui::PeriodicUpdateWidget::collapseAll
void collapseAll()
armarx::armem::gui::MemoryViewer::updateWidget
armem::gui::PeriodicUpdateWidget * updateWidget
Definition: MemoryViewer.h:151
armarx::armem::PredictionRequest
Definition: Prediction.h:48
armarx::armem::gui::instance::InstanceView::update
void update(const MemoryID &id, const wm::Memory &memory)
Definition: InstanceView.cpp:61
armarx::armem::client::QueryResult::memory
wm::Memory memory
The slice of the memory that matched the query.
Definition: Query.h:58
armarx::armem::base::detail::GetFindProviderSegmentMixin::findProviderSegment
auto * findProviderSegment(const MemoryID &providerSegmentID)
Retrieve a provider segment.
Definition: lookup_mixins.h:474
armarx::armem::gui::PredictionWidget::EntityInfo::type
aron::type::ObjectPtr type
Definition: PredictionWidget.h:51
armarx::gui::LifecycleClient::onDisconnect
virtual void onDisconnect()
Definition: lifecycle.cpp:92
ActionsMenuBuilder.h
armarx::armem::Commit
A bundle of updates to be sent to the memory.
Definition: Commit.h:84
armarx::ProxyType::component
@ component
armarx::armem::gui::MemoryViewer::updateInstanceTree
void updateInstanceTree(const armem::MemoryID &selectedID)
Definition: MemoryViewer.cpp:673
armarx::armem::gui::instance::DataView::memoryIdResolutionRequested
void memoryIdResolutionRequested(const MemoryID &id)
armarx::armem::gui::MemoryViewer::is_connected
std::atomic_bool is_connected
Definition: MemoryViewer.h:171
armarx::armem::gui::MemoryViewer::debugObserver
DebugObserverInterfacePrx debugObserver
Definition: MemoryViewer.h:164
armarx::armem::accumulateEntriesContainingID
std::vector< ValueT > accumulateEntriesContainingID(const std::map< MemoryID, ValueT > &idMap, const MemoryID &id)
Return all values of keys containing the given ID.
Definition: container_maps.h:261
armarx::armem::base::detail::GetLatestSnapshotMixin::getLatestSnapshot
auto & getLatestSnapshot(int snapshotIndex=0)
Retrieve the latest entity snapshot.
Definition: lookup_mixins.h:199
armarx::armem::gui::MemoryViewer::startLTMRecording
void startLTMRecording()
Definition: MemoryViewer.cpp:331
armarx::core::time::DateTime::Now
static DateTime Now()
Definition: DateTime.cpp:51
armarx::armem::gui::QueryWidget::storeInLTM
void storeInLTM()
armarx::armem::gui::MemoryViewer::readConfigDialog
void readConfigDialog(SimpleConfigDialog *dialog)
Definition: MemoryViewer.cpp:1055
armarx::armem::gui::MemoryViewer::connected
void connected()
armarx::armem::gui::InstanceGroupBox
instance::GroupBox InstanceGroupBox
Definition: GroupBox.h:46
armarx::armem::gui::MemoryViewer::diskControlLayout
QLayout * diskControlLayout
Definition: MemoryViewer.h:153
armarx::armem::PredictionRequest::predictionSettings
PredictionSettings predictionSettings
Definition: Prediction.h:51
armarx::armem::gui::memory::GroupBox::queryInput
armem::client::QueryInput queryInput() const
Definition: GroupBox.cpp:113
armarx::aron::data::converter::AronNlohmannJSONConverter::ConvertFromNlohmannJSONObject
static data::DictPtr ConvertFromNlohmannJSONObject(const nlohmann::json &, const armarx::aron::Path &p={})
Definition: NLohmannJSONConverter.cpp:25
armarx::armem::gui::QueryWidget::stopRecording
void stopRecording()
armarx::armem::client::Reader::predictionPrx
server::PredictingMemoryInterfacePrx predictionPrx
Definition: Reader.h:210
armarx::armem::gui::MemoryViewer::commit
void commit()
Definition: MemoryViewer.cpp:373
armarx::armem::gui::PeriodicUpdateWidget
Definition: PeriodicUpdateWidget.h:14
armarx::armem::error::ArMemError
Base class for all exceptions thrown by the armem library.
Definition: ArMemError.h:18
armarx::armem::gui::disk::ControlWidget::requestedStoreOnDisk
void requestedStoreOnDisk(QString directory)
armarx::armem::client::MemoryNameSystem::resolveEntityInstance
std::optional< wm::EntityInstance > resolveEntityInstance(const MemoryID &id)
Resolve a memory ID to an EntityInstance.
Definition: MemoryNameSystem.cpp:329
armarx::armem::gui::ActionsMenuBuilder
Definition: ActionsMenuBuilder.h:11
ltm.h
armarx::armem::gui::MemoryViewer::resolveMemoryID
void resolveMemoryID(const MemoryID &id)
Definition: MemoryViewer.cpp:723
armarx::armem::client::QueryResult
Result of a QueryInput.
Definition: Query.h:50
armarx::armem::gui::MemoryViewer::runningQueries
std::map< std::string, std::future< armem::query::data::Result > > runningQueries
Definition: MemoryViewer.h:144
armarx::armem::gui::PeriodicUpdateWidget::update
void update()
armarx::armem::PredictionResult
Definition: Prediction.h:57
armarx::armem::gui::ActionsMenuBuilder::buildActionsMenu
QMenu * buildActionsMenu(actions::data::GetActionsOutput &actionsOutput)
Definition: ActionsMenuBuilder.cpp:16
SimpleConfigDialog.h
armarx::armem::gui::MemoryViewer::instanceTreeUpdated
void instanceTreeUpdated()
armarx::armem::gui::instance::DataView::actionsMenuRequested
void actionsMenuRequested(const MemoryID &memoryID, QWidget *parent, const QPoint &pos, QMenu *menu)
armarx::gui::replaceWidget
void replaceWidget(WidgetT *&old, QWidget *neu, QLayout *parentLayout)
Definition: gui_utils.h:34
MemoryViewer.h
armarx::memory
Brief description of class memory.
Definition: memory.h:38
armarx::armem::gui::MemoryViewer::writeConfigDialog
void writeConfigDialog(SimpleConfigDialog *dialog)
Definition: MemoryViewer.cpp:1046
armarx::gui::LifecycleClient::onInit
virtual void onInit()
Definition: lifecycle.cpp:82
armarx::armem::gui::MemoryViewer::storeOnDisk
void storeOnDisk(QString directory)
Definition: MemoryViewer.cpp:422
TIMING_END_STREAM
#define TIMING_END_STREAM(name, os)
Definition: TimeUtil.h:310
NLohmannJSONConverter.h
armarx::armem::gui::instance::GroupBox::setStatusLabel
void setStatusLabel(QLabel *statusLabel)
Definition: GroupBox.cpp:37
armarx::armem::gui::MemoryViewer::mnsName
std::string mnsName
Definition: MemoryViewer.h:136
armarx::armem::gui::InstanceView
instance::InstanceView InstanceView
Definition: InstanceView.h:56
armarx::armem::client::Reader::queryMemoryIDs
QueryResult queryMemoryIDs(const std::vector< MemoryID > &ids, armem::query::DataMode dataMode=armem::query::DataMode::WithData) const
Query a specific set of memory IDs.
Definition: Reader.cpp:287
armarx::armem::client::Reader::predict
std::vector< PredictionResult > predict(const std::vector< PredictionRequest > &requests) const
Get a prediction for the state of multiple entity instances in the future.
Definition: Reader.cpp:482
armarx::status
status
Definition: FiniteStateMachine.h:244
armarx::armem::server::wm::Memory
Definition: memory_definitions.h:122
armarx::armem::gui::memory::TreeWidget::updated
void updated()
Tree contents have changed.
armarx::armem::error::CouldNotResolveMemoryServer::makeMsg
static std::string makeMsg(const MemoryID &memoryID, const std::string &errorMessage="")
Definition: mns.cpp:36
armarx::armem::MemoryID
A memory ID.
Definition: MemoryID.h:47
armarx::armem::gui::memory::GroupBox::queryWidget
QueryWidget * queryWidget() const
Definition: GroupBox.cpp:77
ManagedIceObject.h
armarx::armem::PredictionResult::prediction
aron::data::DictPtr prediction
Definition: Prediction.h:63
armarx::armem::client::MemoryNameSystem::getAllReaders
std::map< std::string, Reader > getAllReaders(bool update=true)
Get Readers for all registered servers.
Definition: MemoryNameSystem.cpp:266
armarx::armem::gui::instance::DataView::addDataView
void addDataView(DataView *dataView)
Definition: DataView.cpp:79
data
uint8_t data[1]
Definition: EtherCATFrame.h:68
armarx::armem::gui::memory::GroupBox::predictionWidget
PredictionWidget * predictionWidget() const
Definition: GroupBox.cpp:95
armarx::aron::input
ReaderT::InputType & input
Definition: rw.h:12
TreeTypedJSONConverter.h
armarx::armem::gui::MemoryGroupBox
memory::GroupBox MemoryGroupBox
Definition: GroupBox.h:59
armarx::armem::wm::Memory
Client-side working memory.
Definition: memory_definitions.h:133
wm.h
armarx::armem::gui::MemoryViewer::setLogTag
void setLogTag(const std::string &tag)
Definition: MemoryViewer.cpp:205
armarx::armem::client::Reader::getAvailablePredictionEngines
std::map< MemoryID, std::vector< PredictionEngine > > getAvailablePredictionEngines() const
Get the list of prediction engines supported by the memory.
Definition: Reader.cpp:526
armarx::armem::gui::MemoryViewer::statusLabel
QLabel * statusLabel
Definition: MemoryViewer.h:160
AronDataView.h
armarx::armem::gui::MemoryViewer::instanceGroup
armem::gui::InstanceGroupBox * instanceGroup
Definition: MemoryViewer.h:158
armarx::armem::gui::MemoryViewer::mns
armem::client::MemoryNameSystem mns
Definition: MemoryViewer.h:137
armarx::armem::gui::MemoryViewer::saveSettings
void saveSettings(QSettings *settings)
Definition: MemoryViewer.cpp:1037
armarx::armem::gui::AronDataView
instance::AronDataView AronDataView
Definition: AronDataView.h:40
armarx::armem::gui::PredictionWidget::EntityInfo
Definition: PredictionWidget.h:49
armarx::control::hardware_config::tagName
std::string tagName(ConfigTag tag)
Definition: Config.cpp:301
armarx::armem::wm::EntitySnapshot
Client-side working memory entity snapshot.
Definition: memory_definitions.h:80
armarx::armem::MemoryID::hasGap
bool hasGap() const
Indicate whether this ID has a gap such as in 'Memory//MyProvider' (no core segment name).
Definition: MemoryID.cpp:163
armarx::armem::gui::memory::TreeWidget::actionsMenuRequested
void actionsMenuRequested(const MemoryID &memoryID, QWidget *parent, const QPoint &pos, QMenu *menu)
armarx::armem::gui::QueryWidget::update
void update(const std::vector< std::string > &memoryNames)
Definition: QueryWidget.cpp:150
armarx::armem::gui::MemoryViewer::memoryData
std::map< std::string, armem::wm::Memory > memoryData
Definition: MemoryViewer.h:142
armarx::armem::gui::MemoryViewer::makePrediction
void makePrediction(const MemoryID &entityID, const aron::type::ObjectPtr &entityType, const armarx::DateTime &timestamp, const std::string &engineID)
Definition: MemoryViewer.cpp:963
armarx::armem::gui::PredictionWidget::makePrediction
void makePrediction(const MemoryID &entityID, const aron::type::ObjectPtr &entityType, const armarx::DateTime &timestamp, const std::string &engineID)
armarx::armem::server::ltm::util::mongodb::detail::update
bool update(mongocxx::collection &coll, const nlohmann::json &query, const nlohmann::json &update)
Definition: mongodb.cpp:68
armarx::armem::gui::MemoryViewer::showActionsMenu
void showActionsMenu(const MemoryID &memoryID, QWidget *parent, const QPoint &pos, QMenu *menu)
Definition: MemoryViewer.cpp:860
armarx::SimpleConfigDialog::addProxyFinder
void addProxyFinder(const std::vector< EntryData > &entryData)
Definition: SimpleConfigDialog.h:103
armarx::armem::MemoryID::hasEntityName
bool hasEntityName() const
Definition: MemoryID.h:121
armarx::armem::MemoryID::memoryName
std::string memoryName
Definition: MemoryID.h:50
armarx::transform
auto transform(const Container< InputT, Alloc > &in, OutputT(*func)(InputT const &)) -> Container< OutputT, typename std::allocator_traits< Alloc >::template rebind_alloc< OutputT >>
Convenience function (with less typing) to transform a container of type InputT into the same contain...
Definition: algorithm.h:351
armarx::armem::gui::CommitWidget::getAronJSON
std::string getAronJSON() const
Definition: CommitWidget.cpp:56
armarx::armem::gui::CommitWidget::commit
void commit()
armarx::core::time::DateTime
Represents a point in time.
Definition: DateTime.h:24
armarx::armem::gui::MemoryViewer::debugObserverName
std::string debugObserverName
Definition: MemoryViewer.h:163
armarx::armem::gui::MemoryViewer::disconnected
void disconnected()
armarx::armem::gui::QueryWidget::startRecording
void startRecording()
armarx::gui::LifecycleClient::onConnect
virtual void onConnect()
Definition: lifecycle.cpp:87
armarx::ManagedIceObject
The ManagedIceObject is the base class for all ArmarX objects.
Definition: ManagedIceObject.h:162
armarx::armem::gui::disk::ControlWidget::loadFromDisk
std::map< std::filesystem::path, wm::Memory > loadFromDisk(QString directory, const armem::client::QueryInput &queryInput, std::string *outStatus=nullptr)
Definition: ControlWidget.cpp:123
armarx::armem::base::EntitySnapshotBase::time
Time & time()
Definition: EntitySnapshotBase.h:59
armarx::armem::Commit::add
EntityUpdate & add()
Definition: Commit.cpp:80
armarx::armem::gui::MemoryViewer::memoryGroup
armem::gui::MemoryGroupBox * memoryGroup
Definition: MemoryViewer.h:156
armarx::armem::gui::MemoryViewer::loadFromDisk
void loadFromDisk(QString directory)
Definition: MemoryViewer.cpp:435
armarx::armem::gui::QueryWidget::dropRemovedMemories
bool dropRemovedMemories() const
Definition: QueryWidget.cpp:210
armarx::armem::PredictionResult::errorMessage
std::string errorMessage
Definition: Prediction.h:60
armarx::armem::gui::MemoryViewer::periodicUpdateTimer
QTimer * periodicUpdateTimer
Periodically triggers query result collection and updates the available memories.
Definition: MemoryViewer.h:147
TimeUtil.h
ARMARX_INFO
#define ARMARX_INFO
Definition: Logging.h:181
armarx::armem::gui::disk::ControlWidget::requestedLoadFromDisk
void requestedLoadFromDisk(QString directory)
armarx::armem::gui::MemoryViewer::queryAndStoreInLTM
void queryAndStoreInLTM()
Definition: MemoryViewer.cpp:298
armarx::armem::gui::QueryWidget::getEnabledMemories
std::vector< std::string > getEnabledMemories() const
Definition: QueryWidget.cpp:250
armarx::armem::gui::instance::GroupBox::viewUpdated
void viewUpdated()
armarx::armem::laser_scans::constants::memoryName
const std::string memoryName
Definition: constants.h:28
armarx::armem::gui::MemoryViewer::MemoryViewer
MemoryViewer(QBoxLayout *updateWidgetLayout, QGroupBox *memoryGroupBox, QLayout *memoryGroupBoxParentLayout, QGroupBox *instanceGroupBox, QLayout *instanceGroupBoxParentLayout, QBoxLayout *diskControlWidgetLayout, QLabel *statusLabel)
Definition: MemoryViewer.cpp:42
armarx::armem::gui
Definition: ActionsMenuBuilder.cpp:5
armarx::armem::index::memoryID
const MemoryID memoryID
Definition: memory_ids.cpp:28
IceInternal::ProxyHandle<::IceProxy::armarx::DebugObserverInterface >
armarx::armem::query::DataMode::NoData
@ NoData
Just get the structure, but no ARON data.
armarx::Logging::tag
LogTag tag
Definition: Logging.h:278
armarx::armem::gui::MemoryViewer::diskControl
armem::gui::disk::ControlWidget * diskControl
Definition: MemoryViewer.h:154
armarx::armem::gui::instance::GroupBox::view
InstanceView * view
Definition: GroupBox.h:38
ARMARX_CHECK_NULL
#define ARMARX_CHECK_NULL(ptr)
Definition: ExpressionException.h:212
armarx::armem::MemoryID::withTimestamp
MemoryID withTimestamp(Time time) const
Definition: MemoryID.cpp:433
armarx::armem::gui::MemoryViewer::memoryReaders
std::map< std::string, armem::client::Reader > memoryReaders
Definition: MemoryViewer.h:139
armarx::armem::error::CouldNotResolveMemoryServer
Indicates that a query to the Memory Name System failed.
Definition: mns.h:24
armarx::Logging::deactivateSpam
SpamFilterDataPtr deactivateSpam(float deactivationDurationSec=10.0f, const std::string &identifier="", bool deactivate=true) const
disables the logging for the current line for the given amount of seconds.
Definition: Logging.cpp:99
armarx::armem::gui::memory::TreeWidget::selectedItemChanged
void selectedItemChanged(const MemoryID &id)
The selected item or its contents have changed.
ice_conversions_templates.h
armarx::armem::wm::Entity
Client-side working memory entity.
Definition: memory_definitions.h:93
armarx::aron::type::ObjectPtr
std::shared_ptr< Object > ObjectPtr
Definition: Object.h:36
armarx::Logging::setTag
void setTag(const LogTag &tag)
Definition: Logging.cpp:54
armarx::armem::gui::MemoryViewer::loadSettings
void loadSettings(QSettings *settings)
Definition: MemoryViewer.cpp:1025
armarx::armem::PredictionResult::success
bool success
Definition: Prediction.h:59
armarx::armem::gui::MemoryViewer::memoryWriters
std::map< std::string, armem::client::Writer > memoryWriters
Definition: MemoryViewer.h:140
ARMARX_WARNING
#define ARMARX_WARNING
Definition: Logging.h:193
armarx::armem::gui::MemoryViewer::initialized
void initialized()
armarx::armem::gui::MemoryViewer::is_initialized
std::atomic_bool is_initialized
Definition: MemoryViewer.h:170
armarx::armem::gui::QueryWidget::queryLinkRecursionDepth
int queryLinkRecursionDepth() const
Definition: QueryWidget.cpp:271
armarx::armem::gui::PeriodicUpdateWidget::stopTimer
void stopTimer()
Definition: PeriodicUpdateWidget.cpp:106
armarx::armem::client::QueryResult::fromIce
static QueryResult fromIce(const armem::query::data::Result &ice)
Definition: Query.cpp:26
armarx::armem::gui::MemoryViewer::memoryTreeUpdated
void memoryTreeUpdated()
armarx::armem::gui::QueryWidget::dropDisabledMemories
bool dropDisabledMemories() const
Definition: QueryWidget.cpp:216
armarx::armem::gui::CommitWidget::getMemoryID
std::string getMemoryID() const
Definition: CommitWidget.cpp:62
armarx::armem::EntityUpdate::entityID
MemoryID entityID
The entity's ID.
Definition: Commit.h:28
armarx::armem::gui::MemoryViewer::memoryDataChanged
void memoryDataChanged()
Variant.h
armarx::armem::gui::MemoryViewer::updateWidgetLayout
QLayout * updateWidgetLayout
Definition: MemoryViewer.h:150
armarx::armem::gui::MemoryViewer::stopLTMRecording
void stopLTMRecording()
Definition: MemoryViewer.cpp:352
armarx::armem::toCommit
Commit toCommit(const ContainerT &container)
Definition: operations.h:23
armarx::ctrlutil::s
double s(double t, double s0, double v0, double a0, double j)
Definition: CtrlUtil.h:33
armarx::SimpleConfigDialog::getProxyName
std::string getProxyName(const std::string &entryName) const
Definition: SimpleConfigDialog.cpp:47
armarx::armem::PredictionRequest::snapshotID
armem::MemoryID snapshotID
Definition: Prediction.h:50
armarx::armem::gui::memory::GroupBox::tree
TreeWidget * tree() const
Definition: GroupBox.cpp:107
gui_utils.h
armarx::armem::gui::memory::TreeWidget::update
void update(const armem::wm::Memory &memory)
Definition: TreeWidget.cpp:154
armarx::armem::client::MemoryNameSystem::getAllWriters
std::map< std::string, Writer > getAllWriters(bool update=true)
Get Writers for all registered servers.
Definition: MemoryNameSystem.cpp:313
armarx::status::success
@ success
container_maps.h
ice_conversions.h
armarx::armem::PredictionSettings::predictionEngineID
std::string predictionEngineID
Definition: Prediction.h:42
armarx::armem::gui::PeriodicUpdateWidget::startTimerIfEnabled
void startTimerIfEnabled()
Definition: PeriodicUpdateWidget.cpp:88
armarx::armem::gui::memory::GroupBox::commitWidget
CommitWidget * commitWidget() const
Definition: GroupBox.cpp:101
armarx::SimpleConfigDialog
A config-dialog containing one (or multiple) proxy finders.
Definition: SimpleConfigDialog.h:84
armarx::human::MemoryID
const armem::MemoryID MemoryID
Definition: memory_ids.cpp:28