Scenario.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 Dennis Weigelt
20  * @date 2016
21  * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
22  * GNU General Public License
23  */
24 
25 
26 #include "Scenario.h"
27 #include "../parser/XMLScenarioParser.h"
30 #include <filesystem>
31 #include <Ice/Properties.h>
32 #include <fstream>
33 
34 using namespace ScenarioManager;
35 
36 
37 Data_Structure::Scenario::Scenario(std::string name, std::string creationTime, std::string lastChangedTime, PackagePtr package, std::string globalConfigName, std::string subfolder, ScenarioDeploymentType deploymentType, IceEnvMap iceEnvVariables)
38  : name(name), creationTime(creationTime),
39  lastChangedTime(lastChangedTime),
40  globalConfigName(globalConfigName),
41  subfolder(subfolder),
42  deploymentType(deploymentType),
43  package(package),
44  applications(new std::vector<ApplicationInstancePtr>()),
45  globalConfig(new armarx::PropertyDefinitionContainer(name)),
46  iceEnviromentVariables(iceEnvVariables)
47 {
49  armarx::IceProperties* cfgInternal = static_cast<armarx::IceProperties*>(cfgProperties.get());
50  cfgInternal->setInheritanceSolver(nullptr);
51  nodeName = "NodeMain";
52  globalConfig->setProperties(cfgProperties);
53  globalConfig->setPrefix("");
54  globalConfig->setDescription("Global Config from Scenario " + name);
55 }
56 
58 {
59  return this->name;
60 }
61 
62 void Data_Structure::Scenario::setName(std::string name)
63 {
64  this->name = name;
65 }
66 
68 {
69  return this->creationTime;
70 }
71 
73 {
74  return this->lastChangedTime;
75 }
76 
78 {
79  return globalConfigName;
80 }
81 
83 {
84  return subfolder;
85 }
86 
88 {
89  std::string scenarioPath = package.lock()->getScenarioPath();
90 
91  if (subfolder.empty())
92  {
93  scenarioPath.append("/").append(name).append("/").append(name).append(".scx");
94  }
95  else
96  {
97  scenarioPath.append("/").append(subfolder).append("/").append(name).append("/").append(name).append(".scx");
98  }
99 
100  return scenarioPath;
101 }
102 
104 {
105  std::string scenarioPath = package.lock()->getScenarioPath();
106 
107  scenarioPath.append("/").append(name);
108 
109  return scenarioPath;
110 }
111 
113 {
114  std::ofstream ofs;
115  ofs.open(getPath().c_str(), std::ofstream::out | std::ofstream::app);
116  ARMARX_DEBUG << getPath() << " is writeable: " << ofs.is_open();
117 
118  return ofs.is_open();
119 
120  std::filesystem::file_status s = std::filesystem::status(std::filesystem::path(getPath()));
121  if ((s.permissions() & std::filesystem::perms::owner_write) != std::filesystem::perms::none)
122  {
123  return true;
124  }
125  return false;
126 }
127 
129 {
130  return package.lock();
131 }
132 
134 {
135  std::string status = ApplicationStatus::Unknown;
136  for (auto app : *applications)
137  {
138  if (!app->getEnabled())
139  {
140  continue;
141  }
142  if (status == ApplicationStatus::Unknown && app->getStatus() == ApplicationStatus::Running)
143  {
145  }
146  else if (status == ApplicationStatus::Unknown && app->getStatus() == ApplicationStatus::Stopped)
147  {
149  }
150  else if (status == ApplicationStatus::Unknown && app->getStatus() == ApplicationStatus::Inactive)
151  {
153  }
154  else if (status == ApplicationStatus::Running && app->getStatus() == ApplicationStatus::Running)
155  {
157  }
158  else if (status == ApplicationStatus::Stopped && app->getStatus() == ApplicationStatus::Stopped)
159  {
161  }
162  else if (status == ApplicationStatus::Inactive && app->getStatus() == ApplicationStatus::Inactive)
163  {
165  }
166  else if ((status == ApplicationStatus::Running && app->getStatus() == ApplicationStatus::Stopped)
167  || (status == ApplicationStatus::Stopped && app->getStatus() == ApplicationStatus::Running)
168  || (status == ApplicationStatus::Stopped && app->getStatus() == ApplicationStatus::Inactive)
169  || (status == ApplicationStatus::Running && app->getStatus() == ApplicationStatus::Inactive)
170  || (status == ApplicationStatus::Inactive && app->getStatus() == ApplicationStatus::Running)
171  || (status == ApplicationStatus::Inactive && app->getStatus() == ApplicationStatus::Stopped))
172  {
174  break;
175  }
176  else if (app->getStatus() == ApplicationStatus::Waiting)
177  {
179  break;
180  }
181  else if (app->getStatus() == ApplicationStatus::Unknown)
182  {
184  break;
185  }
186  else
187  {
189  break;
190  }
191  }
192 
193  return status;
194 }
195 
197 {
198  this->lastChangedTime = time;
199 }
200 
202 {
203  globalConfigName = name;
204 }
205 
207 {
208  return applications;
209 }
210 
212 {
213  for (auto app : *applications)
214  {
215  if (app->getName() == name)
216  {
217  return app;
218  }
219  }
220 
221  return ApplicationInstancePtr(nullptr);
222 }
223 
225 {
226  applications->push_back(application);
227 }
228 
230 {
231  for (auto iter = applications->begin(); iter != applications->end(); ++iter)
232  {
233  if (*iter == application)
234  {
235  (*iter)->deleteConfig();
236  applications->erase(iter);
237  return;
238  }
239  }
240 }
241 
242 void Data_Structure::Scenario::updateApplicationByName(std::string name) //gehört diese Methode hier rein? evtl signal/slot mit Controller
243 {
244  // TODO - implement Scenario::updateApplicationByName
245  //throw "Not yet implemented";
246 }
247 
249 {
250  // TODO - implement Scenario::updateApplication
251  //throw "Not yet implemented";
252 }
253 
255 {
257  parser.saveScenario(shared_from_this());
258 }
259 
261 {
262  if (!isReadOnly())
263  {
264  return;
265  }
266 
267  if (!std::filesystem::is_symlink(getGlobalConfigPath()))
268  {
269  ARMARX_WARNING << "Make local called on non-linked global scenario config";
270  return;
271  }
272 
273  std::filesystem::remove(getGlobalConfigPath());
274  this->save();
275  // Reload to register status changes
276  this->reloadGlobalConf();
277 }
278 
280 {
281  return std::filesystem::is_symlink(getGlobalConfigPath());
282 }
283 
285 {
286  for (auto it : *applications)
287  {
288  it->load();
289  }
290 }
291 
293 {
294  if (isGlobalConfigFileexistent())
295  {
296  globalConfig->getProperties()->load(getGlobalConfigPath());
297  }
298 }
299 
301 {
302  return globalConfig;
303 }
304 
306 {
307  std::filesystem::path scenarioPath;
308  if (subfolder.empty())
309  {
310  scenarioPath = std::filesystem::path(package.lock()->getScenarioPath().append("/").append(name).append("/"));
311  }
312  else
313  {
314  scenarioPath = std::filesystem::path(package.lock()->getScenarioPath().append("/").append(subfolder + "/").append(name).append("/"));
315  }
316 
317  scenarioPath = scenarioPath / std::filesystem::path(globalConfigName.empty() ? "./config/global.cfg" : globalConfigName);
318  return scenarioPath.string();
319 }
320 
322 {
323  std::ofstream ofs;
324  ofs.open(getGlobalConfigPath().c_str(), std::ofstream::out | std::ofstream::app);
325  ARMARX_DEBUG << getGlobalConfigPath() << " is writeable: " << ofs.is_open();
326 
327  return ofs.is_open();
328 }
329 
331 {
332  return std::filesystem::exists(std::filesystem::path(getGlobalConfigPath()));
333 }
334 
336 {
337  for (auto app : *applications)
338  {
339  if (app->getStatusWriteBlock())
340  {
341  return true;
342  }
343  }
344  return false;
345 }
346 
348 {
349  for (auto app : *applications)
350  {
351  app->setStatusWriteBlock(state);
352  }
353 }
354 
356 {
357  return deploymentType;
358 }
359 
361 {
362  deploymentType = type;
363 }
364 
366 {
367  std::vector<std::string> result;
368  for (auto app : *applications)
369  {
370  result.push_back(app->getEffectiveNodeName());
371  }
372  return result;
373 }
374 
376 {
377  for (auto app : *applications)
378  {
379  app->updateFound();
380  if (!app->getFound())
381  {
382  return false;
383  }
384  }
385  return true;
386 }
387 
388 void Data_Structure::Scenario::addIceEnviromentVariable(std::string name, std::string variable)
389 {
390  iceEnviromentVariables[name] = variable;
391 }
392 
394 {
395  iceEnviromentVariables[name] = "";
396 }
397 
398 std::map<std::string, std::string> Data_Structure::Scenario::getIceEnviromentVariables()
399 {
400  return iceEnviromentVariables;
401 }
402 
404 {
405  return nodeName;
406 }
407 
409 {
410  nodeName = value;
411 }
ScenarioManager::Data_Structure::Scenario::getName
std::string getName()
Definition: Scenario.cpp:57
ScenarioManager::Data_Structure::Scenario::getGlobalConfigPath
std::string getGlobalConfigPath()
Definition: Scenario.cpp:305
ScenarioManager::Data_Structure::Scenario::updateApplication
void updateApplication(ApplicationInstancePtr application)
Definition: Scenario.cpp:248
ScenarioManager::Data_Structure::Scenario::getIceEnviromentVariables
IceEnvMap getIceEnviromentVariables()
Definition: Scenario.cpp:398
ScenarioManager::Data_Structure::ApplicationInstancePtr
std::shared_ptr< ApplicationInstance > ApplicationInstancePtr
Definition: ApplicationInstance.h:33
ScenarioManager::Data_Structure::Scenario::getGlobalConfig
armarx::PropertyDefinitionsPtr getGlobalConfig()
Definition: Scenario.cpp:300
ScenarioManager::Data_Structure::Scenario::setScenarioDeploymentType
void setScenarioDeploymentType(ScenarioDeploymentType type)
Definition: Scenario.cpp:360
Scenario.h
ScenarioManager::Data_Structure::ApplicationInstanceVectorPtr
std::shared_ptr< std::vector< ApplicationInstancePtr > > ApplicationInstanceVectorPtr
Definition: ApplicationInstance.h:35
ScenarioManager::Data_Structure::Scenario::setNodeName
void setNodeName(const std::string &value)
Definition: Scenario.cpp:408
ScenarioManager::Data_Structure::Scenario::setName
void setName(std::string name)
Definition: Scenario.cpp:62
ScenarioManager::Data_Structure::Scenario::getScenarioDeploymentType
ScenarioDeploymentType getScenarioDeploymentType()
Definition: Scenario.cpp:355
ScenarioManager::Data_Structure::IceEnvMap
std::map< std::string, std::string > IceEnvMap
Definition: Scenario.h:49
ScenarioManager::Data_Structure::Scenario::setLastChangedTime
void setLastChangedTime(std::string time)
Sets the last-changed-time to now.
Definition: Scenario.cpp:196
ScenarioManager::Data_Structure::Scenario::clearIceEnviromentVariable
void clearIceEnviromentVariable(std::string name)
Definition: Scenario.cpp:393
ScenarioManager::Parser::XMLScenarioParser
This class provides different methods to parse and save scenario data in XML-Files....
Definition: XMLScenarioParser.h:56
ScenarioManager::Data_Structure::ApplicationStatus::Stopped
static const std::string Stopped
Definition: ApplicationInstance.h:47
ScenarioManager::Data_Structure::Scenario::getPath
std::string getPath()
Definition: Scenario.cpp:87
ScenarioManager::Data_Structure::Scenario::makeLocalGlobalConfig
void makeLocalGlobalConfig()
Definition: Scenario.cpp:260
ScenarioManager::Data_Structure::Scenario::reloadGlobalConf
void reloadGlobalConf()
Definition: Scenario.cpp:292
ScenarioManager::Data_Structure::ApplicationStatus::Running
static const std::string Running
Definition: ApplicationInstance.h:48
ScenarioManager::Data_Structure::Scenario::getStatus
std::string getStatus()
Definition: Scenario.cpp:133
ScenarioManager::Data_Structure::Scenario::allApplicationsFound
bool allApplicationsFound()
Definition: Scenario.cpp:375
IceInternal::Handle< ::Ice::Properties >
armarx::navigation::algorithms::save
bool save(const Costmap &costmap, const std::filesystem::path &directory)
Definition: persistence.cpp:101
ScenarioManager::Data_Structure::Scenario::getApplications
ApplicationInstanceVectorPtr getApplications()
Definition: Scenario.cpp:206
ScenarioManager::Data_Structure::ScenarioDeploymentType
ScenarioDeploymentType
Definition: Scenario.h:51
armarx::status
status
Definition: FiniteStateMachine.h:259
cxxopts::value
std::shared_ptr< Value > value()
Definition: cxxopts.hpp:926
ScenarioManager::Data_Structure::Scenario::getApplicationByName
ApplicationInstancePtr getApplicationByName(std::string name)
Definition: Scenario.cpp:211
ScenarioManager::Data_Structure::Scenario::addApplication
void addApplication(ApplicationInstancePtr application)
Adds an Application to this scenario.
Definition: Scenario.cpp:224
ScenarioManager::Data_Structure::Scenario::getFolder
std::string getFolder()
Definition: Scenario.cpp:103
ScenarioManager::Data_Structure::Scenario::reloadAppInstances
void reloadAppInstances()
Definition: Scenario.cpp:284
ScenarioManager::Data_Structure::PackagePtr
std::shared_ptr< Package > PackagePtr
Definition: Package.h:121
ScenarioManager::Data_Structure::Scenario::getNodeName
std::string getNodeName() const
Definition: Scenario.cpp:403
ScenarioManager::Data_Structure::Scenario::getSubfolder
std::string getSubfolder()
Definition: Scenario.cpp:82
ARMARX_DEBUG
#define ARMARX_DEBUG
Definition: Logging.h:177
ScenarioManager::Data_Structure::ApplicationStatus::Waiting
static const std::string Waiting
Definition: ApplicationInstance.h:49
armarx::IceProperties::create
static Ice::PropertiesPtr create(const Ice::PropertiesPtr &iceProperties=nullptr)
Definition: IceProperties.cpp:32
ScenarioManager::Data_Structure::ApplicationStatus::Inactive
static const std::string Inactive
Definition: ApplicationInstance.h:52
ScenarioManager::Data_Structure::ApplicationStatus::Mixed
static const std::string Mixed
Definition: ApplicationInstance.h:50
ScenarioManager::Data_Structure::ApplicationStatus::Unknown
static const std::string Unknown
Definition: ApplicationInstance.h:51
ScenarioManager::Data_Structure::Scenario::getCreationTime
std::string getCreationTime()
SCENARIO_H.
Definition: Scenario.cpp:67
ScenarioManager::Data_Structure::Scenario::getGlobalConfigName
std::string getGlobalConfigName()
Definition: Scenario.cpp:77
ScenarioManager::Data_Structure::Scenario::getStatusWriteBlock
bool getStatusWriteBlock()
Definition: Scenario.cpp:335
armarx::IceProperties::setInheritanceSolver
virtual void setInheritanceSolver(const InheritanceSolverPtr &inheritanceSolver)
Sets an inheritance solver in case of testing or using a non-default solver.
Definition: IceProperties.cpp:217
ScenarioManager::Data_Structure::Scenario::isGlobalConfigFileexistent
bool isGlobalConfigFileexistent()
Definition: Scenario.cpp:330
armarx::IceProperties
IceProperties stores ice properties and resolves property inheritance.
Definition: IceProperties.h:120
IceStorm::parser
Parser * parser
Definition: Parser.cpp:33
ScenarioManager::Data_Structure::Scenario::getAllDeploymendNodeNames
std::vector< std::string > getAllDeploymendNodeNames()
Definition: Scenario.cpp:365
ScenarioManager::Data_Structure::Scenario::isScenarioFileWriteable
bool isScenarioFileWriteable()
Definition: Scenario.cpp:112
ScenarioManager::Data_Structure::Scenario::isReadOnly
bool isReadOnly()
Definition: Scenario.cpp:279
ScenarioManager
Definition: Application.cpp:166
ScenarioManager::Data_Structure::Scenario::getPackage
PackagePtr getPackage()
Definition: Scenario.cpp:128
std
Definition: Application.h:66
IceUtil::Handle< class PropertyDefinitionContainer >
ScenarioManager::Data_Structure::Scenario::Scenario
Scenario(std::string name, std::string creationTime, std::string lastChangedTime, PackagePtr package, std::string globalConfigName="./config/global.cfg", std::string subfolder="", ScenarioDeploymentType deploymentType=ScenarioDeploymentType::Remote, IceEnvMap iceEnvVariables=IceEnvMap())
Constructor that sets some base information about the scenario.
Definition: Scenario.cpp:37
ScenarioManager::Data_Structure::Scenario::addIceEnviromentVariable
void addIceEnviromentVariable(std::string name, std::string variable)
Definition: Scenario.cpp:388
ScenarioManager::Data_Structure::Scenario::isGlobalConfigWritable
bool isGlobalConfigWritable()
Definition: Scenario.cpp:321
ScenarioManager::Data_Structure::Scenario::getLastChangedTime
std::string getLastChangedTime()
Definition: Scenario.cpp:72
ScenarioManager::Data_Structure::Scenario::updateApplicationByName
void updateApplicationByName(std::string name)
Definition: Scenario.cpp:242
ScenarioManager::Data_Structure::Scenario::setGlobalConfigName
void setGlobalConfigName(std::string name)
Definition: Scenario.cpp:201
ScenarioManager::Data_Structure::Scenario::setStatusWriteBlock
void setStatusWriteBlock(bool state)
Definition: Scenario.cpp:347
Logging.h
ARMARX_WARNING
#define ARMARX_WARNING
Definition: Logging.h:186
IceProperties.h
ScenarioManager::Data_Structure::Scenario::save
void save()
Definition: Scenario.cpp:254
ScenarioManager::Data_Structure::Scenario::removeApplication
void removeApplication(ApplicationInstancePtr application)
Removes an Application from this scenario.
Definition: Scenario.cpp:229
armarx::ctrlutil::s
double s(double t, double s0, double v0, double a0, double j)
Definition: CtrlUtil.h:33
armarx
This file offers overloads of toIce() and fromIce() functions for STL container types.
Definition: ArmarXTimeserver.cpp:28