ScenarioListController.cpp
Go to the documentation of this file.
1 /*
2  * This file is part of ArmarX.
3  *
4  * Copyright (C) 2011-2016, High Performance Humanoid Technologies (H2T), Karlsruhe Institute of Technology (KIT), all rights reserved.
5  *
6  * ArmarX is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  *
10  * ArmarX is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program. If not, see <http://www.gnu.org/licenses/>.
17  *
18  * @package ArmarXCore::core
19  * @author Cedric Seehausen (usdnr at kit dot edu)
20  * @date 2016
21  * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
22  * GNU General Public License
23  */
24 
25 
26 #include "ScenarioListController.h"
27 
28 #include "../gui/namelocationview.h"
29 #include "../gui/scenarioitem.h"
40 #include <QTimer>
41 #include <QSettings>
42 #include <QMessageBox>
43 #include <sstream>
44 #include <QApplication>
45 #include <SimoxUtility/algorithm/string/string_tools.h>
46 
47 using namespace ScenarioManager;
48 using namespace Controller;
49 using namespace Data_Structure;
50 using namespace Parser;
51 using namespace Exec;
52 
53 #define UPDATE_TIMER 500 //ms
54 
56  : QObject(parent),
57  treemodel(),
59  packages(packages), executor(executor)
60 {
61  qRegisterMetaType<ApplicationInstanceStatusMap>("ApplicationInstanceStatusMap");
62  qRegisterMetaType<FilterableTreeModelSortFilterProxyModelPtr>("FilterableTreeModelSortFilterProxyModelPtr");
63 
64  QTimer* timer = new QTimer(this);
65  QObject::connect(timer, SIGNAL(timeout()), this, SLOT(updateStati()));
66  timer->start(UPDATE_TIMER);
67 
68  updateTask = new armarx::SimplePeriodicTask<>([&]
69  {
70  fetchStati();
71  }, 100, false, "ScenarioManagerUpdateStatusTask");
72  updateTask->start();
73 
74  model->setDynamicSortFilter(true);
75  model->setSourceModel(&treemodel);
76 
77  QObject::connect(&createScenarioView, SIGNAL(created(std::string, std::string)),
78  this, SLOT(createdScenario(std::string, std::string)));
79 
80  QObject::connect(&treemodel, SIGNAL(applicationsDrop(QList<QPair<QString, ScenarioManager::Data_Structure::Application*>>, int, QModelIndex)),
81  this, SLOT(addApplicationsToScenario(QList<QPair<QString, ScenarioManager::Data_Structure::Application*>>, int, QModelIndex)));
82  QObject::connect(this, SIGNAL(statusFetched(ApplicationInstanceStatusMap)), this, SLOT(updateStati(ApplicationInstanceStatusMap)));
83 }
84 
86 {
87  updateTask->stop();
88 }
89 
91 {
92  return model;
93 }
94 
95 void ScenarioListController::stop(int row, int column, QModelIndex parent)
96 {
97  ScenarioItem* item = model->data(model->index(row, column, parent), SCENARIOITEMSOURCE).value<ScenarioItem*>();
98  if (item == nullptr)
99  {
100  return;
101  }
102  if (parent.isValid())
103  {
104  if (parent.parent().isValid()) //stop application
105  {
106  if (!item->isEnabled())
107  {
108  return;
109  }
111  executor->stopApplication(instance);
112  }
113  else //stop packageSubpackage
114  {
115  if (!item->isEnabled())
116  {
117  return;
118  }
119  for (const auto& app : *item->getApplicationInstances())
120  {
121  executor->stopApplication(app);
122  }
123  }
124 
125  }
126  else //stop scenario
127  {
128  ScenarioPtr scenario = item->getScenario();
129  StatusManager statusManager;
130  if (statusManager.isIceScenario(scenario))
131  {
132  executor->removeScenario(scenario);
133  }
134  else
135  {
136  executor->stopScenario(scenario);
137  }
138  }
139 }
140 
142 {
143  updateTask->stop();
144 }
145 
146 void ScenarioListController::start(int row, int column, QModelIndex parent, ScenarioStartModes mode)
147 {
148  ScenarioItem* item = model->data(model->index(row, column, parent), SCENARIOITEMSOURCE).value<ScenarioItem*>();
149  if (!item)
150  {
151  return;
152  }
153  if (parent.isValid())
154  {
155  auto deploy = [&](ScenarioPtr scenario)
156  {
157  ARMARX_CHECK_EXPRESSION(scenario);
158 
159  // if (mode == IceStart || st)
160  {
161  executor->setStarter(StarterFactory::getFactory()->getIceStarter(iceAdmin), scenario);
162  StatusManager statusManager;
163  statusManager.setIceScenario(scenario, true);
164  if (!executor->isScenarioDeployed(scenario))
165  {
166  try
167  {
168  executor->deployScenario(scenario).get();
169  }
170  catch (IceGrid::DeploymentException& ex)
171  {
172  ShowWarningDialog(QString::fromStdString(ex.reason));
173  return;
174  }
175 
176  }
177  }
178  };
179 
180 
181  if (parent.parent().isValid()) //start application
182  {
183  if (!item->isEnabled())
184  {
185  return;
186  }
188  instance->updateFound();
189  if (!instance->getFound())
190  {
191  ShowWarningDialog("The binary `" + QString::fromStdString(instance->getExecutableAbsPath()) + "` for the application " + QString::fromStdString(instance->getName()) + " could not be found");
192  treemodel.update();
193  return;
194  }
195  auto scenario = instance->getScenario();
197  if (s.isIceScenario(scenario))
198  {
199  deploy(scenario);
200  }
201  executor->startApplication(instance);
202  }
203  else // start packagesubtree
204  {
205  if (!item->isEnabled())
206  {
207  return;
208  }
210  if (!item->getApplicationInstances()->empty())
211  {
214  if (s.isIceScenario(item->getApplicationInstances()->at(0)->getScenario()))
215  {
216  deploy(item->getApplicationInstances()->at(0)->getScenario());
217  }
218  }
219  for (const auto& app : *item->getApplicationInstances())
220  {
221  app->updateFound();
222  if (!app->getFound())
223  {
224  ShowWarningDialog("The Binary for the Application " + QString::fromStdString(app->getName()) + " could not be found");
225  treemodel.update();
226  return;
227  }
228 
229  executor->startApplication(app);
230  }
231  }
232  }
233  else //start scenario
234  {
235  startScenario(item, mode);
236  }
237 }
238 
239 void ScenarioListController::startScenario(ScenarioItem* scenarioItem, ScenarioStartModes mode)
240 {
241  ScenarioPtr scenario = scenarioItem->getScenario();
242  StartScenario(scenario, mode, executor, iceAdmin);
243 }
244 
245 void ScenarioListController::restart(int row, int column, QModelIndex parent)
246 {
247  //hole entsprechende application aus dem package und uebergebe sie dem executor zum restarten & update model entsprechend
248  ScenarioItem* item = model->data(model->index(row, column, parent), SCENARIOITEMSOURCE).value<ScenarioItem*>();
249  if (item == nullptr || !item->isEnabled())
250  {
251  return;
252  }
253  if (parent.isValid())
254  {
255  if (parent.parent().isValid())
256  {
257  //start/stop application
258  executor->restartApplication(item->getApplicationInstance());
259  }
260  else
261  {
262  //start/stop packageSubtree
263  for (const auto& app : *item->getApplicationInstances())
264  {
265  executor->restartApplication(app);
266  }
267  }
268 
269  }
270  else //start/stop scenario
271  {
272  try
273  {
274  executor->restartScenario(item->getScenario());
275  }
276  catch (IceGrid::ServerStartException& ex)
277  {
278  ShowWarningDialog("Ice had an launching error. Please make sure your remote launch settings are correct");
279  }
280  }
281 }
282 
284  QList<QPair<QString,
286  int row, const QModelIndex& parent)
287 {
288  ScenarioItem* item;//reinterpret_cast<ScenarioItem*>(model->data(parent, SCENARIOITEM).data());
289  QModelIndex scenarioIndex;
290 
291  if (parent.parent().isValid() && parent.parent().parent().isValid())
292  {
293  item = model->data(parent.parent().parent(), SCENARIOITEMPROXY).value<ScenarioItem*>();
294  scenarioIndex = parent.parent().parent();
295  }
296  else if (parent.parent().isValid())
297  {
298  item = model->data(parent.parent(), SCENARIOITEMPROXY).value<ScenarioItem*>();
299  scenarioIndex = parent.parent();
300  }
301  else
302  {
303  item = model->data(parent, SCENARIOITEMPROXY).value<ScenarioItem*>();
304  scenarioIndex = parent;
305  }
306 
307  if (item == nullptr)
308  {
309  return;
310  }
311 
312  ScenarioPtr scenario = item->getScenario();
313  if (!scenario->isScenarioFileWriteable())
314  {
315  QMessageBox::critical(0, "Adding application failed!", "The scenario '" + QString::fromStdString(scenario->getName()) + "' is read only. You cannot add an application to this scenario!");
316  return;
317  }
319  std::vector<std::string> acceptedApps = generator.getDependencieTree(scenario->getPackage()->getName());
320 
321 
322  for (const auto& pair : applications)
323  {
325  PackagePtr appPackage;
326  for (const auto& package : *packages)
327  {
328  for (const auto& pApp : *package->getApplications())
329  {
330  if (pApp->getName().compare(app->getName()) == 0)
331  {
332  appPackage = package;
333  }
334  }
335  }
336 
337  if (appPackage.get() == nullptr)
338  {
339  return;
340  }
341 
342  if (std::find(acceptedApps.begin(), acceptedApps.end(), appPackage->getName()) == acceptedApps.end())
343  {
344  const std::string dependenciesStr = simox::alg::join(acceptedApps, ", ");
345 
346  QMessageBox box;
347  QString message("You cannot drop an app from ");
348  message.append(QString::fromStdString(appPackage->getName()));
349  message.append(" into a scenario from ");
350  message.append(QString::fromStdString(scenario->getPackage()->getName()));
351  message.append(QString::fromStdString(". Package `" + scenario->getPackage()->getName() + "` depends on " + dependenciesStr));
352  box.setText(message);
353  box.exec();
354  return;
355  }
356 
357 
358  const std::string appName = app->getName();
359 
360  int instanceCounter = 0;
361  std::string instanceName = pair.first.toStdString();
362  if (instanceName.empty())
363  {
364  for (const ApplicationInstancePtr& instances : *scenario->getApplications())
365  {
366  if (instances->getName().compare(appName) == 0)
367  {
368  instanceCounter++;
369  }
370  }
371  if (instanceCounter == 0)
372  {
373  instanceName = "";
374  }
375  else
376  {
377  instanceName = "instance" + std::to_string(instanceCounter);
378  }
379 
380  }
381  else
382  {
383  for (const ApplicationInstancePtr& instances : *scenario->getApplications())
384  {
385  if (instances->getInstanceName().compare(instanceName) == 0)
386  {
387  instanceCounter++;
388  }
389  }
390  if (instanceCounter > 0)
391  {
392  instanceName += std::to_string(instanceCounter);
393  }
394  }
395 
396 
397  std::string configPath = scenario->getPath();
398  configPath = configPath.substr(0, configPath.find_last_of('/'));
399  configPath.append("/config/");
400 
401 
402  configPath.append(app->getName());
403  if (!instanceName.empty())
404  {
405  configPath.append(".");
406  configPath.append(instanceName);
407  }
408  configPath.append(".cfg");
409 
410  std::ofstream out(configPath);
411  out.close();
412 
413  ApplicationInstancePtr appInstance(new ApplicationInstance(app->getExecutableName(), app->getPathToExecutable(), instanceName, configPath, appPackage->getName(), scenario, "", true, false));
414 
415  std::string cacheDir = Parser::IceParser::getCacheDir();
416 
417  executor->loadAndSetCachedProperties(appInstance, cacheDir, true);
418  appInstance->load(true);
419 
420  for (const auto& elem : app->getProperties()->getProperties()->getPropertiesForPrefix(""))
421  {
422  appInstance->modifyProperty(elem.first, elem.second);
423  appInstance->setDefaultPropertyEnabled(elem.first, true);
424  }
425 
426  appInstance->save();
427 
428  scenario->addApplication(appInstance);
429 
430  QModelIndex subScenarioIndex = findSubScenarioModelIndexByScenarioIndex(scenarioIndex, appPackage->getName());;
431 
432  //if this is unvalid than the user dropped an app out of an package that is not currently used inside the scenario
433  //so create subscenario item
434  //this behaviour was kind of buggy be careful while optimising
435  if (!subScenarioIndex.isValid())
436  {
437  std::vector<ApplicationInstancePtr> list;
438 
439  ScenarioItem* subScenarioItem = new ScenarioItem(appPackage->getName(), list);
440 
441  treemodel.insertRow(0, subScenarioItem, scenarioIndex);
442 
443  subScenarioIndex = findSubScenarioModelIndexByScenarioIndex(scenarioIndex, appPackage->getName());
444 
445  treemodel.insertRow(0, new ScenarioItem(appInstance), subScenarioIndex);
446  }
447  else
448  {
449  treemodel.insertRow(0, new ScenarioItem(appInstance), subScenarioIndex);
450  }
451  }
452  scenario->save();
453 
454 }
455 
457 {
458  ScenarioItem* scenItem;
459  if (item.parent().isValid() && item.parent().parent().isValid())
460  {
461  scenItem = model->data(item.parent().parent(), SCENARIOITEMSOURCE).value<ScenarioItem*>();
462 
463  if (scenItem == nullptr)
464  {
465  return;
466  }
467 
468  ScenarioItem* appItem = model->data(item, SCENARIOITEMSOURCE).value<ScenarioItem*>();
469 
470  ScenarioPtr scenario = scenItem->getScenario();
471  scenario->removeApplication(appItem->getApplicationInstance());
472 
473  scenario->save();
474  treemodel.removeRow(model->mapToSource(item).row(), model->mapToSource(item.parent()));
475  }
476  else if (item.parent().isValid())
477  {
478  scenItem = model->data(item.parent(), SCENARIOITEMSOURCE).value<ScenarioItem*>();
479 
480  if (scenItem == nullptr)
481  {
482  return;
483  }
484 
485  ScenarioItem* packageItem = model->data(item, SCENARIOITEMSOURCE).value<ScenarioItem*>();
486 
487  ScenarioPtr scenario = scenItem->getScenario();
488 
489  for (const auto& app : *packageItem->getApplicationInstances())
490  {
491  scenario->removeApplication(app);
492  }
493  scenario->save();
494  treemodel.removeRow(model->mapToSource(item).row(), model->mapToSource(item.parent()));
495  }
496  else
497  {
498  scenItem = model->data(item, SCENARIOITEMSOURCE).value<ScenarioItem*>();
499 
500  if (scenItem == nullptr)
501  {
502  return;
503  }
504 
505  ScenarioPtr scen = scenItem->getScenario();
506 
507  const std::string file = armarx::ArmarXDataPath::GetDefaultUserConfigPath() + "/ScenarioManager.conf";
508  QSettings settings(QString(file.c_str()), QSettings::NativeFormat);
509  QStringList scenarios = settings.value("scenarios").toStringList();
510  scenarios.removeDuplicates();
511  QString toFind(QString::fromStdString(scen->getName()));
512  toFind.append("::Package::");
513  toFind.append(QString::fromStdString(scen->getPackage()->getName()));
514  scenarios.removeAt(scenarios.indexOf(toFind));
515  settings.setValue("scenarios", scenarios);
516 
517  for (const auto& package : *packages)
518  {
519  for (auto it = package->getScenarios()->begin(); it != package->getScenarios()->end(); ++it)
520  {
521  if (scen.get() == it->get())
522  {
523  package->getScenarios()->erase(it);
524  break;
525  }
526  }
527  }
528  treemodel.removeRow(model->mapToSource(item).row(), model->mapToSource(item.parent()));
529  emit updated();
530  }
531 }
532 
534 {
535  ARMARX_TRACE;
536 
537  if (packages->size() != 0)
538  {
539  QVector<QPair<QString, bool> > packageNames;
540  for (const auto& package : *packages)
541  {
542  packageNames << qMakePair(QString::fromStdString(package->getName()), package->isScenarioPathWritable());
543  }
544  createScenarioView.setPackages(packageNames);
545  createScenarioView.exec();
546  }
547  else
548  {
549  QMessageBox messageBox;
550  messageBox.setText("You have to have at least one Package open to create an Scenario");
551  messageBox.exec();
552  }
553 
554  ARMARX_TRACE;
555 }
556 
557 void ScenarioListController::createdScenario(std::string name, std::string packageStr)
558 {
559  XMLScenarioParser parser;
560 
561  PackagePtr package;
562  for (unsigned int i = 0; i < packages->size(); i++)
563  {
564  if (packages->at(i)->getName().compare(packageStr) == 0)
565  {
566  package = packages->at(i);
567  break;
568  }
569  }
570  if (package.get() == nullptr)
571  {
572  return;
573  }
574 
575  if (parser.isScenarioexistent(name, package))
576  {
577  QMessageBox box;
578  QString message("The Scenario " + QString::fromStdString(name) + " already exists in Package " + QString::fromStdString(packageStr));
579  box.setText(message);
580  box.exec();
581  return;
582  }
583 
584  ScenarioPtr ptr = parser.createNewScenario(name, package);
585  if (ptr.get() == nullptr)
586  {
587  return;
588  }
589 
590  for (const auto& package : *packages)
591  {
592  if (package->getName().compare(packageStr) == 0)
593  {
594  package->addScenario(ptr);
595  treemodel.insertRow(0, new ScenarioItem(ptr));
596  break;
597  }
598  }
599 
600  const std::string file = armarx::ArmarXDataPath::GetDefaultUserConfigPath() + "/ScenarioManager.conf";
601  QSettings settings(QString(file.c_str()), QSettings::NativeFormat);
602  QStringList scenarios = settings.value("scenarios").toStringList();
603  scenarios.removeDuplicates();
604  QString toAdd;
605  toAdd.append(QString::fromStdString(ptr->getName()));
606  toAdd.append("::Package::");
607  toAdd.append(QString::fromStdString(package->getName()));
608  scenarios.append(toAdd);
609  settings.setValue("scenarios", scenarios);
610  emit updated();
611 }
612 
614 {
615 
616  ScenarioItem* item = model->data(index, SCENARIOITEMSOURCE).value<ScenarioItem*>();
617  if (index.column() > 0 || item == nullptr)
618  {
619  return;
620  }
621 
622  if (index.parent().isValid())
623  {
624  if (index.parent().parent().isValid())
625  {
626  ApplicationInstancePtr appInstance = item->getApplicationInstance();
627  appInstance->updateFound();
628  if (!appInstance->getFound())
629  {
630  QMessageBox message;
631  message.setText("Could not find Application " + item->data(0).toString() + " at " + QString::fromStdString(appInstance->getPathToExecutable()) + ".");
632  message.exec();
633  if (!appInstance->getFound())
634  {
635  updateModel();
636  emit updated();
637  }
638  return;
639  }
640 
641  emit applicationInstanceClicked(appInstance, item);
642  }
643  else
644  {
645  return;
646  }
647  }
648  else
649  {
650  emit scenarioClicked(item->getScenario());
651  }
652 }
653 
654 void ScenarioListController::updateModel() //Scenarios don't have a setStatus-method, therefore UI should calculate Scenario status based on other
655 {
656  ScenarioItem* rootItem = treemodel.getRootItem();
657 
658  for (const auto& package : *packages)
659  {
660  auto scenarios = package->getScenarios();
661  for (const auto& scenario : *scenarios)
662  {
663  std::map<std::string, std::vector<ApplicationInstancePtr>> packageSubtrees;
664  for (const auto& app : *scenario->getApplications())
665  {
666  std::string packageName = app->getPackageName();
667 
668  if (packageSubtrees.count(packageName) == 0)
669  {
670  packageSubtrees[packageName] = std::vector<ApplicationInstancePtr>();
671  }
672  packageSubtrees[packageName].push_back(app);
673  }
674 
675  ScenarioItem* scenarioItem;
676  int index = findScenario(rootItem, scenario->getName(), scenario->getPackage()->getName());
677  if (index == -1)
678  {
679  scenarioItem = new ScenarioItem(scenario);
680 
681  for (const auto& it : packageSubtrees)
682  {
683  ScenarioItem* currentItem = new ScenarioItem(it.first, it.second);
684  scenarioItem->appendChild(currentItem);
685  }
686  treemodel.insertRow(0, scenarioItem);
687  }
688  else
689  {
690  scenarioItem = static_cast<ScenarioItem*>(rootItem->child(index));
691 
692  for (int i = 0; i < scenarioItem->childCount(); i++)
693  {
694  ScenarioItem* subPackageItem = static_cast<ScenarioItem*>(scenarioItem->child(i));
695  std::string name = subPackageItem->data(0).toString().toStdString();
696 
697  std::vector<ApplicationInstancePtr> currentBuildSubtree = packageSubtrees[name];
698  ApplicationInstanceVectorPtr currentTreeSubtree = subPackageItem->getApplicationInstances();
699  for (size_t k = 0; k < currentTreeSubtree->size(); k++)
700  {
701  bool found = false;
702  for (size_t j = 0; j < currentBuildSubtree.size(); j++)
703  {
704  if (currentTreeSubtree->at(k)->getName() == currentBuildSubtree[j]->getName()
705  && currentTreeSubtree->at(k)->getInstanceName() == currentBuildSubtree[j]->getInstanceName())
706  {
707  found = true;
708  break;
709  }
710  }
711  if (!found)
712  {
713  treemodel.insertRow(0, new ScenarioItem(currentTreeSubtree->at(k)), findSubScenarioModelIndex(scenario->getName(), name));
714  }
715  }
716  }
717  }
718  }
719  }
720 }
721 
722 QModelIndex ScenarioListController::findApplicationModelIndex(ScenarioManager::Data_Structure::ApplicationInstancePtr application)
723 {
724  QModelIndex subScenarioModelIndex = findSubScenarioModelIndex(application->getScenario()->getName(), application->getPackageName());
725  if (!subScenarioModelIndex.isValid())
726  {
727  return QModelIndex();
728  }
729  int count = 0;
730  QModelIndex appIndex = subScenarioModelIndex.child(0, 0);
731  while (true)
732  {
733  appIndex = appIndex.sibling(count, 0);
734  if (!appIndex.isValid())
735  {
736  return QModelIndex();
737  }
738  if (application->getInstanceName().empty())
739  {
740  if (application->getName() == appIndex.data().toString().toStdString())
741  {
742  return appIndex;
743  }
744  }
745  else
746  {
747  if (application->getInstanceName() + "." + application->getName() == appIndex.data().toString().toStdString())
748  {
749  return appIndex;
750  }
751  }
752 
753  count++;
754  }
755 }
756 
757 QModelIndex ScenarioListController::findSubScenarioModelIndex(std::string scenarioName, std::string packageName)
758 {
759  QModelIndex scenarioIndex = treemodel.index(0, 0);
760 
761  bool scenarioFound = false;
762  int count = 0;
763  while (!scenarioFound)
764  {
765  scenarioIndex = scenarioIndex.sibling(count, 0);
766 
767  if (!scenarioIndex.isValid())
768  {
769  return QModelIndex();
770  }
771  if (scenarioName == scenarioIndex.data().toString().toStdString())
772  {
773  scenarioFound = true;
774  break;
775  }
776 
777  count++;
778  }
779 
780  count = 0;
781  while (true)
782  {
783  QModelIndex currentSubPackageIndex = scenarioIndex.child(count, 0);
784  if (!currentSubPackageIndex.isValid())
785  {
786  return QModelIndex();
787  }
788  if (packageName == currentSubPackageIndex.data().toString().toStdString())
789  {
790  return currentSubPackageIndex;
791  }
792  count++;
793  }
794 
795  return QModelIndex();
796 }
797 
798 QModelIndex ScenarioListController::findSubScenarioModelIndexByScenarioIndex(QModelIndex scenarioIndex, std::string packageName)
799 {
800  int count = 0;
801  while (true)
802  {
803  QModelIndex currentSubPackageIndex = scenarioIndex.child(count, 0);
804  if (packageName == currentSubPackageIndex.data().toString().toStdString())
805  {
806  return currentSubPackageIndex;
807  }
808  if (!currentSubPackageIndex.isValid())
809  {
810  return QModelIndex();
811  }
812  count++;
813  }
814 
815  return QModelIndex();
816 }
817 
818 //looks if the current scenario is already added
819 int ScenarioListController::findScenario(ScenarioItem* rootItem, std::string name, std::string packageName)
820 {
821  for (int i = 0; i < rootItem->childCount(); i++)
822  {
823  if (static_cast<ScenarioItem*>(rootItem->child(i))->getScenario()->getName() == name
824  && static_cast<ScenarioItem*>(rootItem->child(i))->getScenario()->getPackage()->getName() == packageName)
825  {
826  return i;
827  }
828  }
829 
830  return -1;
831 }
832 
833 
835 {
836  std::vector<ApplicationInstancePtr> apps;
837  {
838  std::unique_lock lock(applicationInstanceMutex);
839  apps.swap(applicationInstances);
840  }
841  if (apps.empty())
842  {
843  return;
844  }
846  IceUtil::Time start = IceUtil::Time ::now();
847  //update all app instances and scenarios
848  for (const ApplicationInstancePtr& appInst : apps)
849  {
850  std::string status = executor->getApplicationStatus(appInst);
851  stati[appInst] = status;
852 
853  }
854  ARMARX_DEBUG << deactivateSpam(5) << "Fetching scenario stati took " << (IceUtil::Time::now() - start).toMilliSecondsDouble() << " ms";
855  emit statusFetched(stati);
856 }
857 
858 bool ScenarioListController::StartScenario(ScenarioPtr scenario, ScenarioStartModes mode, ExecutorPtr executor, IceGrid::AdminPrx iceAdmin)
859 {
860  StatusManager statusManager;
861  StopStrategyFactory stopStrategyFactory;
862 
863  if (mode == LocalStart)
864  {
865  // Make sure all required data files are generated when launching scenario
866  const ApplicationInstanceVectorPtr applications = scenario->getApplications();
867  ARMARX_CHECK_NOT_NULL(applications);
868  for (ApplicationInstancePtr applicationInstance : *applications)
869  {
870  executor->loadAndSetCachedProperties(applicationInstance, Parser::IceParser::getCacheDir(), false, false);
871  applicationInstance->load();
872  }
873 
874  if (statusManager.isIceScenario(scenario) && scenario->getStatus() != ApplicationStatus::Stopped)
875  {
876  QMessageBox::StandardButton reply;
877  reply = QMessageBox::question(nullptr, "", "The Scenario is currently running via Ice do you want to remove it ?", QMessageBox::Yes | QMessageBox::No);
878  if (reply == QMessageBox::No)
879  {
880  return false;
881  }
882  else
883  {
884  executor->setStarter(StarterFactory::getFactory()->getIceStarter(iceAdmin), scenario);
885  executor->setStopStrategy(stopStrategyFactory.getKillStrategy(StopperFactory::getFactory()->getIceStopper(iceAdmin)), scenario);
886 
887  statusManager.setIceScenario(scenario, true);
888  executor->removeScenario(scenario);
889  return false;
890  }
891  }
892  executor->setStarter(StarterFactory::getFactory()->getStarter(), scenario);
893  executor->setStopStrategy(executor->getDefaultStopStrategy(), scenario);
894 
895  statusManager.setIceScenario(scenario, false);
896 
897  if (!scenario->allApplicationsFound())
898  {
899  ShowWarningDialog("Not all binaries in the Scenario " + QString::fromStdString(scenario->getName()) + " could be found", true, QString::fromStdString(scenario->getName() + "BinariesMissing"));
900  // return false;
901  }
902  executor->startScenario(scenario);
903  }
904  else
905  {
906  if (!statusManager.isIceScenario(scenario) && scenario->getStatus() != ApplicationStatus::Stopped)
907  {
908  QMessageBox::StandardButton reply;
909  reply = QMessageBox::question(nullptr, "", "The Scenario is currently running locally - do you want to stop it ?", QMessageBox::Yes | QMessageBox::No);
910  if (reply == QMessageBox::No)
911  {
912  return false;
913  }
914  else
915  {
916  executor->setStarter(StarterFactory::getFactory()->getStarter(), scenario);
917  executor->setStopStrategy(executor->getDefaultStopStrategy(), scenario);
918 
919  executor->stopScenario(scenario);
920  return false;
921  }
922  }
923  executor->setStarter(StarterFactory::getFactory()->getIceStarter(iceAdmin), scenario);
924  executor->setStopStrategy(stopStrategyFactory.getKillStrategy(StopperFactory::getFactory()->getIceStopper(iceAdmin)), scenario);
925 
926  if (!scenario->allApplicationsFound())
927  {
928  ShowWarningDialog("Not all binaries in the Scenario " + QString::fromStdString(scenario->getName()) + " could be found", true, QString::fromStdString(scenario->getName() + "BinariesMissing"));
929  // updateStati();
930  // return true;
931  }
932 
933  statusManager.setIceScenario(scenario, true);
934  if (!executor->isScenarioDeployed(scenario))
935  {
936  try
937  {
938  executor->deployScenario(scenario).get();
939  }
940  catch (IceGrid::DeploymentException& ex)
941  {
942  ShowWarningDialog(QString::fromStdString(ex.reason));
943  return false;
944  }
945 
946  }
947  // else
948  {
949  try
950  {
951  executor->startScenario(scenario).get();
952  }
953  catch (IceGrid::ServerStartException& ex)
954  {
955  ShowWarningDialog("Ice had an launching error. Please make sure your remote launch settings are correct. Did you sync everything?\nId: " + QString::fromStdString(ex.id)
956  + "\nReason: " + QString::fromStdString(ex.reason)) ;
957  return false;
958  }
959  }
960  }
961  return true;
962 }
963 
964 
966 {
967  //update all app instances and scenarios
968  // but this needs to be done async -> first get list of applications,
969  // then send these to other thread
970  std::vector<ApplicationInstancePtr> apps;
971  for (ScenarioManager::Data_Structure::PackagePtr& package : *packages)
972  {
973  ScenarioVectorPtr scenarios = package->getScenarios();
974  for (const ScenarioPtr& scenario : *scenarios)
975  {
976  ApplicationInstanceVectorPtr appInsts = scenario->getApplications();
977  for (const ApplicationInstancePtr& appInst : *appInsts)
978  {
979  apps.push_back(appInst);
980  }
981  }
982  }
983 
984  {
985  std::unique_lock lock(applicationInstanceMutex);
986  apps.swap(applicationInstances);
987  }
988 }
989 
991 {
992  bool changed = false;
993  for (auto& pair : stati)
994  {
995 
996  bool statusChanged = pair.first->setStatus(pair.second);
997  changed |= statusChanged;
998  }
999  // ARMARX_DEBUG << deactivateSpam(5) << "Updating scenarios took " << (IceUtil::Time::now() - start).toMilliSecondsDouble() << " ms";
1000  if (changed)
1001  {
1002  auto start = IceUtil::Time ::now();
1003  treemodel.update();
1004  ARMARX_DEBUG << deactivateSpam(5) << "Updating scenario Model took " << (IceUtil::Time::now() - start).toMilliSecondsDouble() << " ms";
1005  }
1006 
1007  emit statusUpdated();
1008 }
1009 
1011 {
1012  for (const auto& package : *packages)
1013  {
1014  for (const auto& scenario : *package->getScenarios())
1015  {
1016  if (application->getScenario()->getName() == scenario->getName())
1017  {
1018  std::string cacheDir = Parser::IceParser::getCacheDir();
1019  executor->loadAndSetCachedProperties(application, cacheDir, false, false);
1020  qApp->processEvents();
1021 
1022  scenario->save();
1023  return;
1024  }
1025  }
1026  }
1027 }
1028 
1029 void ScenarioListController::setIceAdmin(IceGrid::AdminPrx iceAdmin)
1030 {
1031  this->iceAdmin = iceAdmin;
1032 }
1033 
1034 void ScenarioListController::ShowWarningDialog(QString message, bool showOnce, QString messageId)
1035 {
1036  static std::set<QString> dialogIds;
1037  if (showOnce)
1038  {
1039  ARMARX_CHECK_EXPRESSION(!messageId.isEmpty());
1040  if (dialogIds.count(messageId))
1041  {
1042  return;
1043  }
1044  dialogIds.insert(messageId);
1045  }
1046  QMessageBox box;
1047  box.setText(message);
1048  box.exec();
1049 }
ScenarioItem
TreeItem representing data contained in a Scenario or an Application.
Definition: scenarioitem.h:38
ScenarioManager::Controller::ApplicationInstanceStatusMap
std::map< ApplicationInstancePtr, std::string > ApplicationInstanceStatusMap
Definition: ScenarioListController.h:48
ScenarioManager::Data_Structure::Application::getProperties
armarx::PropertyDefinitionsPtr getProperties()
Definition: Application.cpp:104
ScenarioManager::Data_Structure::ApplicationInstancePtr
std::shared_ptr< ApplicationInstance > ApplicationInstancePtr
Definition: ApplicationInstance.h:33
ScenarioManager::Data_Structure::ScenarioPtr
std::shared_ptr< Scenario > ScenarioPtr
Definition: Scenario.h:36
iceparser.h
ScenarioItem::getPackageName
std::string getPackageName()
Definition: scenarioitem.cpp:180
TreeModel::index
QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const override
Definition: treemodel.cpp:96
index
uint8_t index
Definition: EtherCATFrame.h:59
ScenarioManager::Data_Structure::ApplicationInstanceVectorPtr
std::shared_ptr< std::vector< ApplicationInstancePtr > > ApplicationInstanceVectorPtr
Definition: ApplicationInstance.h:35
TreeModel::insertRow
bool insertRow(int position, TreeItem *item, const QModelIndex &parent=QModelIndex())
Definition: treemodel.cpp:192
TreeItem::data
virtual QVariant data(int column) const
Definition: treeitem.cpp:64
list
list(APPEND SOURCES ${QT_RESOURCES}) set(COMPONENT_LIBS ArmarXGui ArmarXCoreObservers ArmarXCoreEigen3Variants PlotterController $
Definition: CMakeLists.txt:49
LocalStart
@ LocalStart
Definition: scenariolistview.h:46
TreeItem::parent
TreeItem * parent()
Definition: treeitem.cpp:69
ARMARX_CHECK_NOT_NULL
#define ARMARX_CHECK_NOT_NULL(ptr)
This macro evaluates whether ptr is not null and if it turns out to be false it will throw an Express...
Definition: ExpressionException.h:206
ScenarioManager::Parser::DependenciesGenerator::getDependencieTree
static DependencyTree getDependencieTree(std::string packageName)
Definition: DependenciesGenerator.cpp:46
StopperFactory.h
ScenarioManager::Controller::ScenarioListController::stop
void stop(int row, int column, QModelIndex parent)
Definition: ScenarioListController.cpp:95
SCENARIOITEMSOURCE
@ SCENARIOITEMSOURCE
Definition: treeitem.h:36
TreeItem::appendChild
void appendChild(TreeItem *child)
Definition: treeitem.cpp:43
ScenarioItem::getApplicationInstances
ScenarioManager::Data_Structure::ApplicationInstanceVectorPtr getApplicationInstances()
Definition: scenarioitem.cpp:195
ScenarioManager::Controller::ScenarioListController::setIceAdmin
void setIceAdmin(IceGrid::AdminPrx iceAdmin)
Set an IceAdmin for the controller.
Definition: ScenarioListController.cpp:1029
message
message(STATUS "Boost-Library-Dir: " "${Boost_LIBRARY_DIRS}") message(STATUS "Boost-LIBRARIES
Definition: CMakeLists.txt:8
ScenarioManager::Exec::ExecutorPtr
std::shared_ptr< Executor > ExecutorPtr
Definition: Executor.h:171
ScenarioModel::getRootItem
ScenarioItem * getRootItem()
Definition: scenariomodel.cpp:239
ScenarioManager::Data_Structure::PackageVectorPtr
std::shared_ptr< std::vector< ScenarioManager::Data_Structure::PackagePtr > > PackageVectorPtr
Definition: Package.h:122
ScenarioModel::update
void update()
Updates this model.
Definition: scenariomodel.cpp:208
ScenarioManager::Controller::ScenarioListController::updated
void updated()
Gets emitted after changes have been made to the data structure.
ScenarioManager::Controller::ScenarioListController::scenarioClicked
void scenarioClicked(Data_Structure::ScenarioPtr scenario)
Gets emitted after a Scenario has been clicked.
ApplicationInstancePtr
std::shared_ptr< ScenarioManager::Data_Structure::ApplicationInstance > ApplicationInstancePtr
Definition: StopStrategy.h:7
TreeItem::childCount
int childCount() const
Definition: treeitem.cpp:54
StatusManager.h
ScenarioManager::Controller::ScenarioListController::StartScenario
static bool StartScenario(ScenarioManager::Data_Structure::ScenarioPtr scenario, ScenarioStartModes mode, Exec::ExecutorPtr executor, IceGrid::AdminPrx iceAdmin)
Definition: ScenarioListController.cpp:858
TreeItem::child
TreeItem * child(int row)
Definition: treeitem.cpp:49
ScenarioManager::Data_Structure::Application
Class containing data about an application Provides methods to get and set the date contained in the ...
Definition: Application.h:45
ScenarioManager::Controller::ScenarioListController::start
void start(int row, int column, QModelIndex parent, ScenarioStartModes mode)
Starts or stops the object in the specified location.
Definition: ScenarioListController.cpp:146
CreateScenarioView::setPackages
void setPackages(QVector< QPair< QString, bool >> const &packages)
Sets the packages which are shown in the view.
Definition: createscenarioview.cpp:44
ARMARX_TRACE
#define ARMARX_TRACE
Definition: trace.h:69
armarx::status
status
Definition: FiniteStateMachine.h:259
PackageBuilder.h
ScenarioManager::Controller::ScenarioListController::createdScenario
void createdScenario(std::string name, std::string package)
Creates a new scenario in the package.
Definition: ScenarioListController.cpp:557
ScenarioManager::Controller::ScenarioListController::restart
void restart(int row, int column, QModelIndex parent)
Restarts the object in the specified location.
Definition: ScenarioListController.cpp:245
ScenarioStartModes
ScenarioStartModes
Definition: scenariolistview.h:44
ScenarioManager::Data_Structure::PackagePtr
std::shared_ptr< Package > PackagePtr
Definition: Package.h:121
TreeItem::isEnabled
bool isEnabled()
Definition: treeitem.cpp:89
ScenarioManager::Parser::DependenciesGenerator
Definition: DependenciesGenerator.h:38
ARMARX_DEBUG
#define ARMARX_DEBUG
Definition: Logging.h:177
ScenarioManager::Controller::ScenarioListController::stopUpdateTask
void stopUpdateTask()
Definition: ScenarioListController.cpp:141
FilterableTreeModelSortFilterProxyModelPtr
std::shared_ptr< FilterableTreeModelSortFilterProxyModel > FilterableTreeModelSortFilterProxyModelPtr
Definition: filterabletreemodelsortfilterproxymodel.h:65
FilterableTreeModelSortFilterProxyModel
Model of the FilterableTreeView.
Definition: filterabletreemodelsortfilterproxymodel.h:41
ScenarioManager::Controller::ScenarioListController::~ScenarioListController
~ScenarioListController() override
Destructor.
Definition: ScenarioListController.cpp:85
DependenciesGenerator.h
UPDATE_TIMER
#define UPDATE_TIMER
Definition: ScenarioListController.cpp:53
XMLScenarioParser.h
ScenarioManager::StatusManager::isIceScenario
bool isIceScenario(Data_Structure::ScenarioPtr scenario)
Definition: StatusManager.cpp:85
ScenarioManager::StatusManager
Definition: StatusManager.h:7
armarx::armem::Time
armarx::core::time::DateTime Time
Definition: forward_declarations.h:13
armarx::to_string
const std::string & to_string(const std::string &s)
Definition: StringHelpers.h:40
ScenarioManager::Controller::ScenarioListController::showApplication
void showApplication(const QModelIndex &index)
Calculates the object at the given index and signals to show it.
Definition: ScenarioListController.cpp:613
ScenarioManager::Data_Structure::Application::getExecutableName
std::string getExecutableName()
Definition: Application.cpp:168
ScenarioManager::Controller::ScenarioListController::ScenarioListController
ScenarioListController(Data_Structure::PackageVectorPtr packages, Exec::ExecutorPtr executor, QObject *parent=0)
Constructor which sets the data structure, the executor and optionally the parent object.
Definition: ScenarioListController.cpp:55
armarx::ArmarXDataPath::GetDefaultUserConfigPath
static std::string GetDefaultUserConfigPath()
The user config directory of ArmarX.
Definition: ArmarXDataPath.cpp:782
ExpressionException.h
ScenarioManager::Controller::ScenarioListController::addApplicationsToScenario
void addApplicationsToScenario(QList< QPair< QString, ScenarioManager::Data_Structure::Application * > > applications, int row, const QModelIndex &parent)
Adds applications to a scenario.
Definition: ScenarioListController.cpp:283
ScenarioManager::Parser::IceParser::getCacheDir
static std::string getCacheDir()
Definition: iceparser.cpp:304
TreeModel::removeRow
bool removeRow(int position, const QModelIndex &parent=QModelIndex())
Definition: treemodel.cpp:204
ScenarioManager::Controller::ScenarioListController::statusFetched
void statusFetched(ApplicationInstanceStatusMap stati)
No
Introduction Thank you for taking interest in our work and downloading this software This library implements the algorithm described in the paper R R R Klein Efficient RANSAC for Point Cloud Shape in Computer Graphics No
Definition: ReadMe.txt:21
ScenarioManager::Controller::ScenarioListController::updateStati
void updateStati()
Updates the statuses of all Applications and Scenarios.
Definition: ScenarioListController.cpp:965
IceStorm::parser
Parser * parser
Definition: Parser.cpp:33
ARMARX_CHECK_EXPRESSION
#define ARMARX_CHECK_EXPRESSION(expression)
This macro evaluates the expression and if it turns out to be false it will throw an ExpressionExcept...
Definition: ExpressionException.h:73
ScenarioManager::Controller::ScenarioListController::saveScenario
void saveScenario(ScenarioManager::Data_Structure::ApplicationInstancePtr application)
Definition: ScenarioListController.cpp:1010
SCENARIOITEMPROXY
@ SCENARIOITEMPROXY
Definition: treeitem.h:37
ScenarioManager
Definition: Application.cpp:166
ScenarioManager::Data_Structure::Application::getPathToExecutable
std::string getPathToExecutable()
Definition: Application.cpp:94
ApplicationInstance
Interface for classes that handle the starting of applications Classes implementing this interface al...
StopStrategyFactory.h
ScenarioManager::Data_Structure::Application::getName
std::string getName()
Definition: Application.cpp:89
ScenarioManager::Controller::ScenarioListController::applicationInstanceClicked
void applicationInstanceClicked(Data_Structure::ApplicationInstancePtr appInstance, ScenarioItem *item)
Gets emitted after an ApplicationInstance has been clicked.
ScenarioManager::Controller::ScenarioListController::createScenario
void createScenario()
Shows a view that allows the user to create a new Scenario.
Definition: ScenarioListController.cpp:533
ScenarioListController.h
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
Logging.h
ScenarioManager::Controller::ScenarioListController::removeItem
void removeItem(QModelIndex item)
Removes an item from the model.
Definition: ScenarioListController.cpp:456
ScenarioItem::getScenario
ScenarioManager::Data_Structure::ScenarioPtr getScenario()
If this item represents a Scenario, it is returned.
Definition: scenarioitem.cpp:185
ScenarioManager::Controller::ScenarioListController::statusUpdated
void statusUpdated()
Gets emitted after changes have been made to the States of the Applications.
ScenarioManager::StatusManager::setIceScenario
void setIceScenario(Data_Structure::ScenarioPtr scenario, bool state)
Definition: StatusManager.cpp:97
StarterFactory.h
ScenarioManager::Controller::ScenarioListController::fetchStati
void fetchStati()
fetches application stati over their designated strategy.
Definition: ScenarioListController.cpp:834
armarx::ctrlutil::s
double s(double t, double s0, double v0, double a0, double j)
Definition: CtrlUtil.h:33
ScenarioItem::getApplicationInstance
ScenarioManager::Data_Structure::ApplicationInstancePtr getApplicationInstance()
If this item represents an Application, it is returned.
Definition: scenarioitem.cpp:190
ScenarioManager::Controller::ScenarioListController::getTreeModel
FilterableTreeModelSortFilterProxyModelPtr getTreeModel()
Returns the model used by the ScenarioListView and managed by this controller.
Definition: ScenarioListController.cpp:90
ScenarioManager::Controller::ScenarioListController::updateModel
void updateModel()
Updates the model by reloading all scenarios and applications.
Definition: ScenarioListController.cpp:654
armarx::SimplePeriodicTask
Usage:
Definition: ApplicationNetworkStats.h:32
ScenarioManager::Data_Structure::ScenarioVectorPtr
std::shared_ptr< std::vector< ScenarioPtr > > ScenarioVectorPtr
Definition: Scenario.h:38
GfxTL::Yes
OnOff< true > Yes
Definition: OnOff.h:12