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 
170 
171  connect(memoryGroup->predictionWidget(),
173  this,
175  connect(
177 
178  connect(this, &This::memoryDataChanged, this, &This::updateMemoryTree);
179  connect(memoryGroup->tree(),
181  this,
183 
184  connect(memoryGroup->tree(),
186  this,
188  connect(memoryGroup->tree(),
190  this,
192  connect(instanceGroup,
194  this,
196  connect(instanceGroup->view,
198  this,
200  connect(instanceGroup->view,
202  this,
204  }
205 
206  void
207  MemoryViewer::setLogTag(const std::string& _tag) // Leading _ silences a warning
208  {
209  Logging::setTag(_tag);
210  }
211 
212  void
214  {
215  if (mnsName.size() > 0)
216  {
217  component.usingProxy(mnsName);
218  }
219  if (debugObserverName.size() > 0)
220  {
221  component.usingProxy(debugObserverName);
222  }
223 
224  is_initialized = true;
225  emit initialized();
226  }
227 
228  void
229  MemoryViewer::onConnect(ManagedIceObject& component)
230  {
231  if (not mnsName.empty())
232  {
233  armem::mns::MemoryNameSystemInterfacePrx mnsProxy;
234  component.getProxy(mnsProxy, mnsName);
235  mns = client::MemoryNameSystem(mnsProxy);
236 
237  const bool update = true;
240  }
241  // DebugObserver is optional (check for null on every call)
242  if (not debugObserverName.empty())
243  {
244  component.getProxy(debugObserver, debugObserverName, false, "", false);
245  }
246 
248 
249  is_connected = true;
250  emit connected();
251  }
252 
253  void
254  MemoryViewer::onDisconnect(ManagedIceObject&)
255  {
256  periodicUpdateTimer->stop();
258 
259  is_connected = false;
260 
261  emit disconnected();
262  }
263 
264  void
265  MemoryViewer::collapseAll()
266  {
267  memoryGroup->tree()->collapseAll();
268  }
269 
270  void
271  MemoryViewer::startPeriodicUpdateTimer()
272  {
273  periodicUpdateTimer->start();
274  }
275 
276  const armem::wm::Memory*
277  MemoryViewer::getSingleMemoryData(const std::string& memoryName)
278  {
279  auto it = memoryData.find(memoryName);
280  if (it == memoryData.end())
281  {
282  std::stringstream ss;
283  ss << "Memory name '" << memoryName << "' is unknown. Known are: "
284  << simox::alg::join(simox::alg::get_keys(memoryData), ", ");
285  statusLabel->setText(QString::fromStdString(ss.str()));
286  return nullptr;
287  }
288  /*else if (not it->second.has_value())
289  {
290  return nullptr;
291  }*/
292  else
293  {
294  //return &it->second.value();
295  return &it->second;
296  }
297  }
298 
299  void
301  {
302  TIMING_START(MemoryStore);
303 
304  auto enabledMemories = memoryGroup->queryWidget()->getEnabledMemories();
305  for (auto& [name, reader] : memoryReaders)
306  {
307  // skip if memory should not be queried
308  if (std::find(enabledMemories.begin(), enabledMemories.end(), name) ==
309  enabledMemories.end())
310  {
311  continue;
312  }
313 
314  // Query memory
315  auto q_res = reader.query(memoryGroup->queryInput());
316  if (q_res.success)
317  {
318  server::dto::DirectlyStoreInput input;
319  input.memory = q_res.toIce().memory;
320  reader.directlyStore(input);
321  }
322  else
323  {
324  std::string s = "Query of memory " + name + " was unsuccessful.";
325  statusLabel->setText(QString::fromStdString(s));
326  }
327  }
328 
329  TIMING_END_STREAM(MemoryStore, ARMARX_VERBOSE);
330  }
331 
332  void
334  {
335 
336  TIMING_START(MemoryStartRecording);
337 
338  auto enabledMemories = memoryGroup->queryWidget()->getEnabledMemories();
339  for (auto& [name, reader] : memoryReaders)
340  {
341  // skip if memory should not be queried
342  if (std::find(enabledMemories.begin(), enabledMemories.end(), name) ==
343  enabledMemories.end())
344  {
345  continue;
346  }
347  reader.startRecording();
348  }
349 
350  TIMING_END_STREAM(MemoryStartRecording, ARMARX_VERBOSE);
351  }
352 
353  void
355  {
356 
357  TIMING_START(MemoryStopRecording);
358 
359  auto enabledMemories = memoryGroup->queryWidget()->getEnabledMemories();
360  for (auto& [name, reader] : memoryReaders)
361  {
362  // skip if memory should not be queried
363  if (std::find(enabledMemories.begin(), enabledMemories.end(), name) ==
364  enabledMemories.end())
365  {
366  continue;
367  }
368  reader.stopRecording();
369 
370  }
371 
372  TIMING_END_STREAM(MemoryStopRecording, ARMARX_VERBOSE);
373  }
374 
375 
376  void
378  {
379 
381  auto now = armem::Time::Now();
382 
383  const std::string memoryIDStr = memoryGroup->commitWidget()->getMemoryID();
384  const std::string aronJSONStr = memoryGroup->commitWidget()->getAronJSON();
385 
386  ARMARX_INFO << "Committing to " << memoryIDStr << " the data: " << aronJSONStr;
387 
388  MemoryID memId(memoryIDStr);
389 
390  if (!memId.hasEntityName())
391  {
392  ARMARX_WARNING << "The entered MemoryID '" << memoryIDStr
393  << "' does not contain an entity.";
394  }
395  else
396  {
397 
398  nlohmann::json json = nlohmann::json::parse(aronJSONStr);
399 
400  // ToDo: multiple objects
401  auto aron =
403  json);
404 
405  if (const auto& it = memoryWriters.find(memId.memoryName); it == memoryWriters.end())
406  {
407  ARMARX_WARNING << "No memory with name '" << memId.memoryName
408  << "' available for commit.";
409  }
410  else
411  {
412  armem::Commit comm;
413  auto& entityUpdate = comm.add();
414  entityUpdate.entityID = memId;
415  entityUpdate.confidence = 1.0;
416  entityUpdate.instancesData = {aron};
417  entityUpdate.referencedTime = now;
418  it->second.commit(comm);
419  }
420  }
421 
423  }
424 
425  void
426  MemoryViewer::storeOnDisk(QString directory)
427  {
428  TIMING_START(MemoryExport)
429 
430  std::string status;
431  std::vector<wm::Memory> memoryDataVec = simox::alg::get_values(memoryData);
432  diskControl->storeOnDisk(directory, memoryDataVec, &status);
433 
434  statusLabel->setText(QString::fromStdString(status));
435  TIMING_END_STREAM(MemoryExport, ARMARX_VERBOSE)
436  }
437 
438  void
439  MemoryViewer::loadFromDisk(QString directory)
440  {
441 
442  std::string status;
443  std::map<std::filesystem::path, wm::Memory> data =
445 
446  for (auto& [path, memory] : data)
447  {
448  std::string name = memory.id().memoryName;
449 
450  if (memoryWriters.count(name) > 0)
451  {
452  // we need to merge the current memory with the one from the disk.
453  // Please note that this may ignores coresegments, if not already existent
454  auto commit = armem::toCommit(memory);
455  memoryWriters.at(name).commit(commit);
456  }
457  else
458  {
459  ARMARX_INFO << "No memory with name '" << name
460  << "' available for commit. Create new virtual memory.";
461 
462  // Please note: Here we assume that a memory server with the same name does not exist.
463  // I think this assumption is ok, since nobody should use filepaths as memory name.
464  // Nonetheless, we did not restrict the user to do so...
465  std::string virtualMemoryName = name; // + " (at " + path.string() + ")";
466  memory.id().memoryName = virtualMemoryName;
467  memoryData[virtualMemoryName] = std::move(memory);
468  }
469  }
470 
471  statusLabel->setText(QString::fromStdString(status));
472 
473  emit memoryDataChanged();
474  }
475 
476  void
477  MemoryViewer::startQueries()
478  {
479  startDueQueries();
480  }
481 
482  void
483  MemoryViewer::processQueryResults()
484  {
485  const std::map<std::string, client::QueryResult> results = collectQueryResults();
486 
487  int errorCount = 0;
488  applyQueryResults(results, &errorCount);
489 
490  emit memoryDataChanged();
491  updateStatusLabel(errorCount);
492  }
493 
494  void
495  MemoryViewer::updateStatusLabel(int errorCount)
496  {
497  // Code to output status label information
498  if (statusLabel and errorCount > 0)
499  {
500  auto now = std::chrono::system_clock::now();
501  auto in_time_t = std::chrono::system_clock::to_time_t(now);
502 
503  std::stringstream ss;
504  ss << "Last update: " << std::put_time(std::localtime(&in_time_t), "%Y-%m-%d %X");
505  ss << "\nThe query produced " << errorCount << " errors! Please check log.";
506 
507  statusLabel->setText(QString::fromStdString(ss.str()));
508  }
509  }
510 
511  void
512  MemoryViewer::startDueQueries()
513  {
514 
515  armem::client::QueryInput input = memoryGroup->queryInput();
516  int recursionDepth = memoryGroup->queryWidget()->queryLinkRecursionDepth();
517 
518  // Can't use a structured binding here because you can't capture those in a lambda
519  // according to the C++ standard.
520  auto enabledMemories = memoryGroup->queryWidget()->getEnabledMemories();
521  for (const auto& pair : memoryReaders)
522  {
523  // skip if memory should not be queried
524  if (std::find(enabledMemories.begin(), enabledMemories.end(), pair.first) ==
525  enabledMemories.end())
526  {
527  continue;
528  }
529 
530  const auto& name = pair.first;
531  const auto& reader = pair.second;
532 
533  // skip if query already running
534  if (runningQueries.count(name) != 0)
535  {
536  continue;
537  }
538 
539  // You could pass the query function itself to async here,
540  // but that caused severe template headaches when I tried it.
541  runningQueries[name] = std::async(
542  std::launch::async,
543  [reader, input, recursionDepth, this]()
544  {
545  // Can't resolve MemoryLinks without data
546  return recursionDepth == 0 || input.dataMode == armem::query::DataMode::NoData
547  ? reader.query(input.toIce())
548  : reader.query(input.toIce(), mns, recursionDepth);
549  });
550  }
551  }
552 
553  std::map<std::string, client::QueryResult>
554  MemoryViewer::collectQueryResults()
555  {
556 
557  TIMING_START(tCollectQueryResults)
558 
559  std::map<std::string, client::QueryResult> results;
560  for (auto it = runningQueries.begin(); it != runningQueries.end();)
561  {
562  const std::string& name = it->first;
563  std::future<armem::query::data::Result>* queryPromise = &it->second;
564 
565  if (queryPromise->wait_for(std::chrono::seconds(0)) == std::future_status::ready)
566  {
567  if (auto jt = memoryReaders.find(name); jt != memoryReaders.end())
568  {
569  try
570  {
571  results[name] = client::QueryResult::fromIce(queryPromise->get());
572  }
573  catch (const Ice::ConnectionRefusedException&)
574  {
575  // Server is gone (MNS did not know about it yet) => Skip result.
576  }
577  }
578  // else: Server is gone (MNS knew about it) => Skip result.
579 
580  // Promise is completed => Clean up in any case.
581  it = runningQueries.erase(it);
582  }
583  else
584  {
585  ++it; // Uncompleted => Keep.
586  }
587  }
588 
589  TIMING_END_STREAM(tCollectQueryResults, ARMARX_VERBOSE)
590  if (debugObserver)
591  {
592  debugObserver->begin_setDebugChannel(
594  {
595  {"t Collect Query Results [ms]",
596  new Variant(tCollectQueryResults.toMilliSecondsDouble())},
597  {"# Collected Query Results", new Variant(static_cast<int>(results.size()))},
598  });
599  }
600 
601  return results;
602  }
603 
604  void
605  MemoryViewer::applyQueryResults(const std::map<std::string, client::QueryResult>& results,
606  int* outErrorCount)
607  {
608  TIMING_START(tProcessQueryResults)
609  for (const auto& [name, result] : results)
610  {
611  if (result.success)
612  {
613  memoryData[name] = std::move(result.memory);
614  }
615  else
616  {
617  ARMARX_WARNING << "Querying memory server '" << name << "' produced an error: \n"
618  << result.errorMessage;
619  if (outErrorCount)
620  {
621  outErrorCount++;
622  }
623  }
624  }
625 
626  // Perhaps remove entries
627  auto enabledMemories = memoryGroup->queryWidget()->getEnabledMemories();
628  for (auto it = memoryData.begin(); it != memoryData.end();)
629  {
630  // Drop all entries in memoryData which are not in memoryReaders anymore.
631  if (memoryReaders.count(it->first) == 0)
632  {
634  {
635  it = memoryData.erase(it);
636  }
637  else
638  {
639  ++it;
640  }
641  continue;
642  }
643 
644  // Drop all entries that are not enabled by user (which means that there is no query result)
645  if (std::find(enabledMemories.begin(), enabledMemories.end(), it->first) ==
646  enabledMemories.end())
647  {
649  {
650  it = memoryData.erase(it);
651  }
652  else
653  {
654  ++it;
655  }
656  continue;
657  }
658 
659  // Memory found
660  ++it;
661  }
662 
663  TIMING_END_STREAM(tProcessQueryResults, ARMARX_VERBOSE)
664  if (debugObserver)
665  {
666  debugObserver->begin_setDebugChannel(
668  {
669  {"t Process Query Results [ms]",
670  new Variant(tProcessQueryResults.toMilliSecondsDouble())},
671  {"# Processed Query Results", new Variant(static_cast<int>(results.size()))},
672  });
673  }
674  }
675 
676  void
678  {
679  const armem::wm::Memory* data = getSingleMemoryData(selectedID.memoryName);
680  if (data)
681  {
682  if (not selectedID.hasEntityName())
683  {
684  return;
685  }
686  armem::MemoryID id = selectedID;
687  const armem::wm::EntitySnapshot* snapshot = nullptr;
688  if (not id.hasTimestamp())
689  {
690  const armem::wm::Entity& entity = data->getEntity(id);
691  if (entity.empty())
692  {
693  return;
694  }
695  snapshot = &entity.getLatestSnapshot();
696  id.timestamp = snapshot->time();
697  }
698  if (not id.hasInstanceIndex())
699  {
700  if (not snapshot)
701  {
702  try
703  {
704  snapshot = &data->getSnapshot(id);
705  }
706  catch (const armem::error::ArMemError& e)
707  {
708  if (statusLabel)
709  {
710  statusLabel->setText(e.what());
711  }
712  }
713  }
714  if (snapshot && snapshot->size() > 0)
715  {
716  id.instanceIndex = 0;
717  }
718  }
719  if (id.hasInstanceIndex())
720  {
721  instanceGroup->view->update(id, *data);
722  }
723  }
724  }
725 
726  void
728  {
729  // ARMARX_IMPORTANT << "Resolving memory ID: " << id;
730 
731  auto handleError = [this](const std::string& msg)
732  {
733  statusLabel->setText(QString::fromStdString(msg));
734  ARMARX_WARNING << msg;
735  };
736 
737  if (id.memoryName.empty())
738  {
739  handleError("Memory name is empty.");
740  }
741 
742  aron::type::ObjectPtr segmentType;
743  std::optional<wm::EntityInstance> instance;
744  try
745  {
746  if (const wm::Memory* data = getSingleMemoryData(id.memoryName))
747  {
748  segmentType = data->getProviderSegment(id).aronType();
749 
750  if (id.hasInstanceIndex())
751  {
752  instance = data->getInstance(id);
753  }
754  else if (id.hasTimestamp())
755  {
756  instance = data->getSnapshot(id).getInstance(0);
757  }
758  else
759  {
760  instance = data->getEntity(id).getLatestSnapshot().getInstance(0);
761  }
762  }
763  }
764  catch (const armem::error::ArMemError&)
765  {
766  // May be handled by remote lookup
767  }
768 
769  if (not instance)
770  {
771  try
772  {
773  // Resolve remotely (may still fail, returns an optional).
774  instance = mns.resolveEntityInstance(id);
775  }
776  catch (const armem::error::ArMemError& e)
777  {
778  ARMARX_WARNING << e.what();
779  statusLabel->setText(e.what());
780  }
781  }
782 
783  if (instance)
784  {
785  auto* view = new InstanceView();
787  view->update(*instance, segmentType);
788  //instanceGroup->view->addInstanceView(*instance, segmentType);
789  }
790  else
791  {
792  // ToDo: Propagate error back to highlight selected entry in red
793  }
794  }
795 
796  void
797  MemoryViewer::updateListOfActiveMemories()
798  {
799  if (is_connected and mns) // mns must be connected and mns must be available
800  {
801  try
802  {
805 
806  std::vector<std::string> activeMemoryNames;
807 
808  // add all active memories to update list
810  memoryReaders.end(),
811  std::back_inserter(activeMemoryNames),
812  [](const auto& p) { return p.first; });
813 
814  TIMING_START(GuiUpdateAvailableMemories);
815  memoryGroup->queryWidget()->update(activeMemoryNames);
816  TIMING_END_STREAM(GuiUpdateAvailableMemories, ARMARX_VERBOSE);
817  }
818  catch (...)
819  {
820  // MNS was killed/stopped
821  // ignore?!
822  }
823  }
824  else
825  {
827  << deactivateSpam()
828  << "MNS not ready yet. Skip update of available memories in query widget.";
829  }
830  }
831 
832  void
833  MemoryViewer::updateMemoryTree()
834  {
835  std::map<std::string, const armem::wm::Memory*> memoriesToUpdate;
836 
837  //auto checkboxStates = memoryGroup->queryWidget()->getAvailableMemoryStates();
838  for (auto& [name, data] : memoryData)
839  {
840  memoriesToUpdate[name] = &data;
841  }
842 
843  TIMING_START(GuiUpdateMemoryTree)
844  memoryGroup->tree()->update(memoriesToUpdate);
845  TIMING_END_STREAM(GuiUpdateMemoryTree, ARMARX_VERBOSE)
846 
847  if (debugObserver)
848  {
849  try
850  {
851  debugObserver->setDebugDatafield(
853  "GUI Update [ms]",
854  new Variant(GuiUpdateMemoryTree.toMilliSecondsDouble()));
855  }
856  catch (const Ice::Exception&)
857  {
858  // Ignore ...
859  }
860  }
861  }
862 
863  void
865  QWidget* parent,
866  const QPoint& pos,
867  QMenu* menu)
868  {
869  // Called if we have to stop because of an error.
870  auto showMenu = [menu, pos]()
871  {
872  if (menu)
873  menu->exec(pos);
874  };
875 
876  if (memoryID == MemoryID())
877  {
878  // Empty MemoryID, don't try to generate actions.
879  showMenu();
880  return;
881  }
882 
883  mns::dto::MemoryServerInterfaces prx;
884  try
885  {
886  prx = mns.resolveServer(memoryID);
887  }
888  catch (const error::CouldNotResolveMemoryServer& e)
889  {
890  statusLabel->setText(
891  QString::fromStdString(e.makeMsg(memoryID, "Could not resolve memory server.")));
892  showMenu();
893  return;
894  }
895 
896  if (!prx.actions)
897  {
898  std::stringstream ss;
899  ss << "Memory server " << memoryID << " does not support actions or is offline.";
900  statusLabel->setText(QString::fromStdString(ss.str()));
901  showMenu();
902  return;
903  }
904 
905  actions::GetActionsOutputSeq result;
906  try
907  {
908  result = prx.actions->getActions({{armarx::toIce<data::MemoryID>(memoryID)}});
909  }
910  catch (const Ice::LocalException& e)
911  {
912  std::stringstream ss;
913  ss << "Could not get actions for " << memoryID << ".";
914  statusLabel->setText(QString::fromStdString(ss.str()));
915  showMenu();
916  return;
917  }
918 
919  if (result.size() == 0)
920  {
921  showMenu();
922  return;
923  }
924  auto builder = ActionsMenuBuilder(
925  memoryID,
926  parent,
927  [this, prx](const MemoryID& memoryID, const actions::ActionPath& path)
928  {
929  actions::data::ExecuteActionOutputSeq result;
930  try
931  {
932  result = prx.actions->executeActions(
933  {{armarx::toIce<armem::data::MemoryID>(memoryID), path}});
934  }
935  catch (const Ice::LocalException& e)
936  {
937  std::stringstream ss;
938  ss << "Failed to execute action: " << e.what();
939  statusLabel->setText(QString::fromStdString(ss.str()));
940  }
941 
942  for (const auto& [success, errorMessage] : result)
943  {
944  if (not success)
945  {
946  std::stringstream ss;
947  ss << "Failed to execute action: " << errorMessage;
948  statusLabel->setText(QString::fromStdString(ss.str()));
949  ARMARX_WARNING << ss.str();
950  }
951  }
952  });
953 
954  QMenu* actionsMenu = builder.buildActionsMenu(result[0]);
955  if (menu == nullptr)
956  {
957  actionsMenu->exec(pos);
958  }
959  else
960  {
961  menu->addMenu(actionsMenu);
962  menu->exec(pos);
963  }
964  }
965 
966  void
968  const aron::type::ObjectPtr& entityType,
970  const std::string& engineID)
971  {
972 
973  std::stringstream errorStream;
974  auto showError = [this, &errorStream]()
975  { statusLabel->setText(QString::fromStdString(errorStream.str())); };
976 
977  if (!entityID.hasEntityName() || entityID.hasGap())
978  {
979  errorStream << "Could not convert " << entityID << " to valid entity ID.";
980  showError();
981  return;
982  }
983  if (memoryReaders.find(entityID.memoryName) == memoryReaders.end())
984  {
985  errorStream << "Not connected to memory '" << entityID.memoryName
986  << "', cannot make prediction.";
987  showError();
988  return;
989  }
990  client::Reader reader = memoryReaders.at(entityID.memoryName);
991  if (!reader.predictionPrx)
992  {
993  errorStream << "Predictions are not available for memory '" << entityID.memoryName
994  << "'.";
995  showError();
996  return;
997  }
998  PredictionRequest request;
999  request.snapshotID = entityID.withTimestamp(timestamp);
1000  request.predictionSettings.predictionEngineID = engineID;
1001  PredictionResult result;
1002  try
1003  {
1004  result = reader.predict({request}).at(0);
1005  }
1006  catch (const Ice::LocalException& e)
1007  {
1008  errorStream << "Could not make prediction request: " << e.what();
1009  showError();
1010  return;
1011  }
1012 
1013  if (!result.success)
1014  {
1015  errorStream << "Prediction failed: " << result.errorMessage;
1016  showError();
1017  return;
1018  }
1019 
1020  auto* view = new AronDataView();
1021  instanceGroup->view->addDataView(view);
1022  view->update(result.prediction, entityType);
1023  }
1024 
1025  const static std::string CONFIG_KEY_MEMORY = "MemoryViewer.MemoryNameSystem";
1026  const static std::string CONFIG_KEY_DEBUG_OBSERVER = "MemoryViewer.DebugObserverName";
1027 
1028  void
1029  MemoryViewer::loadSettings(QSettings* settings)
1030  {
1031  mnsName = settings->value(QString::fromStdString(CONFIG_KEY_MEMORY), "MemoryNameSystem")
1032  .toString()
1033  .toStdString();
1035  settings->value(QString::fromStdString(CONFIG_KEY_DEBUG_OBSERVER), "DebugObserver")
1036  .toString()
1037  .toStdString();
1038  }
1039 
1040  void
1041  MemoryViewer::saveSettings(QSettings* settings)
1042  {
1043  settings->setValue(QString::fromStdString(CONFIG_KEY_MEMORY),
1044  QString::fromStdString(mnsName));
1045  settings->setValue(QString::fromStdString(CONFIG_KEY_DEBUG_OBSERVER),
1046  QString::fromStdString(debugObserverName));
1047  }
1048 
1049  void
1051  {
1052  dialog->addProxyFinder<armarx::armem::mns::MemoryNameSystemInterfacePrx>(
1053  {CONFIG_KEY_MEMORY, "MemoryNameSystem", "MemoryNameSystem"});
1055  {CONFIG_KEY_DEBUG_OBSERVER, "Debug Observer", "DebugObserver"});
1056  }
1057 
1058  void
1060  {
1061  mnsName = dialog->getProxyName(CONFIG_KEY_MEMORY);
1062  if (mnsName.empty())
1063  {
1064  mnsName = "MemoryNameSystem";
1065  }
1066  debugObserverName = dialog->getProxyName(CONFIG_KEY_DEBUG_OBSERVER);
1067  }
1068 
1069 } // 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:116
armarx::armem::gui::disk::ControlWidget::storeOnDisk
void storeOnDisk(QString directory, const std::vector< wm::Memory > memoryData, std::string *outStatus=nullptr)
Definition: ControlWidget.cpp:83
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:24
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:152
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:62
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:89
armarx::ProxyType::component
@ component
armarx::armem::gui::MemoryViewer::updateInstanceTree
void updateInstanceTree(const armem::MemoryID &selectedID)
Definition: MemoryViewer.cpp:677
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:172
armarx::armem::gui::MemoryViewer::debugObserver
DebugObserverInterfacePrx debugObserver
Definition: MemoryViewer.h:165
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:333
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:1059
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:154
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:228
armarx::armem::gui::MemoryViewer::commit
void commit()
Definition: MemoryViewer.cpp:377
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:459
armarx::armem::gui::ActionsMenuBuilder
Definition: ActionsMenuBuilder.h:11
ltm.h
armarx::armem::gui::MemoryViewer::resolveMemoryID
void resolveMemoryID(const MemoryID &id)
Definition: MemoryViewer.cpp:727
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:145
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:1050
armarx::gui::LifecycleClient::onInit
virtual void onInit()
Definition: lifecycle.cpp:82
armarx::armem::gui::MemoryViewer::storeOnDisk
void storeOnDisk(QString directory)
Definition: MemoryViewer.cpp:426
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:137
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:324
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:519
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:396
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:207
timestamp
std::string timestamp()
Definition: CartographerAdapter.cpp:85
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:563
armarx::armem::gui::MemoryViewer::statusLabel
QLabel * statusLabel
Definition: MemoryViewer.h:161
AronDataView.h
armarx::armem::gui::MemoryViewer::instanceGroup
armem::gui::InstanceGroupBox * instanceGroup
Definition: MemoryViewer.h:159
armarx::armem::gui::MemoryViewer::mns
armem::client::MemoryNameSystem mns
Definition: MemoryViewer.h:138
armarx::armem::gui::MemoryViewer::saveSettings
void saveSettings(QSettings *settings)
Definition: MemoryViewer.cpp:1041
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:143
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:967
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:864
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:164
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:143
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:157
armarx::armem::gui::MemoryViewer::loadFromDisk
void loadFromDisk(QString directory)
Definition: MemoryViewer.cpp:439
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:148
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:300
armarx::armem::gui::QueryWidget::getEnabledMemories
std::vector< std::string > getEnabledMemories() const
Definition: QueryWidget.cpp:250
armarx::armem::gui::instance::GroupBox::viewUpdated
void viewUpdated()
magic_enum::detail::find
constexpr std::size_t find(string_view str, char_type c) noexcept
Definition: magic_enum.hpp:309
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:155
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:140
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:1029
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:141
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:171
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:151
armarx::armem::gui::MemoryViewer::stopLTMRecording
void stopLTMRecording()
Definition: MemoryViewer.cpp:354
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:443
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