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