StatechartContext.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::Statechart
19 * @author Mirko Waechter( mirko.waechter at kit dot edu)
20 * @date 2012
21 * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
22 * GNU General Public License
23 */
24 #include "StatechartContext.h"
25 
27 #include <ArmarXCore/core/services/profiler/Profiler.h> // for ProfilerPtr
28 
29 #include "../core/application/Application.h"
30 #include "../observers/ObserverObjectFactories.h"
31 #include "../observers/exceptions/local/InvalidChannelException.h"
32 #include "../observers/variant/DatafieldRef.h"
33 #include "../statechart/StatechartObjectFactories.h"
34 #include "ParameterMapping.h"
35 #include "State.h"
36 #include "StatechartManager.h"
37 
38 namespace armarx
39 {
42  {
43  defineOptionalProperty<int>("ProfilingDepth",
44  -1,
45  "-1 to profile all hierarchy levels; any positive number to "
46  "stop profiling after a certain depth in the state hierarchy");
47  }
48 
50  {
53  setTag("StatechartContext");
54  }
55 
57  {
58  }
59 
62  {
65  }
66 
67  void
68  StatechartContext::onInitComponent()
69  {
70  if (!reportingTopic.empty())
71  {
73  }
74  stateReporter.reset(new Profiler::Profiler());
75  stateReporter->setName("StatechartReporter");
76 
77  getProfiler()->setName(getName());
78  usingProxy("ConditionHandler");
79  usingProxy("SystemObserver");
80  eventDistributor = new StatechartEventDistributor;
81  eventDistributor->setStatechartName(getName());
82  eventDistributor->setStatechartManager(statechartManager);
83 
84  getArmarXManager()->addObject(ManagedIceObjectPtr::dynamicCast(eventDistributor), false);
85 
87 
90  }
91 
92  void
93  StatechartContext::onConnectComponent()
94  {
95  ARMARX_DEBUG << "Starting StatechartContext\n" << flush;
96 
97  conditionHandlerPrx = getProxy<ConditionHandlerInterfacePrx>("ConditionHandler");
98  systemObserverPrx = getProxy<SystemObserverInterfacePrx>("SystemObserver");
99  if (!reportingTopic.empty())
100  {
101  stateReporter->setLoggingStrategy(
102  Profiler::LoggingStrategyPtr(new Profiler::IceBufferedLoggingStrategy(
103  Component::getTopic<ProfilerListenerPrx>(reportingTopic))));
104  }
105 
106 
109  startStatechart();
110  }
111 
112  void
113  StatechartContext::onDisconnectComponent()
114  {
115  eventDistributor->clearEventMap();
116  }
117 
118  void
119  StatechartContext::onExitComponent()
120  {
121 
122  statechartManager->shutdown();
124  ARMARX_VERBOSE << "shutting statechart down" << flush;
125  }
126 
127  TimedVariantBaseList
129  const DataFieldIdentifierBaseList& identifierList)
130  {
131  if (observerMap.find(observerName) == observerMap.end())
132  {
133  observerMap[observerName] = getProxy<ObserverInterfacePrx>(observerName);
134  }
135 
136  return observerMap[observerName]->getDataFields(identifierList);
137  }
138 
141  {
142  if (observerMap.find(identifier->observerName) == observerMap.end())
143  {
144  observerMap[identifier->observerName] =
145  getProxy<ObserverInterfacePrx>(identifier->observerName);
146  }
147 
148  return observerMap[identifier->observerName]->getDataField(identifier);
149  }
150 
152  StatechartContext::getChannelRef(const std::string& observerName,
153  const std::string& channelName)
154  {
155  ObserverInterfacePrx obs;
156  auto it = observerMap.find(observerName);
157 
158  if (it == observerMap.end())
159  {
160  try
161  {
162  obs = getProxy<ObserverInterfacePrx>(observerName);
163  ObserverInterfacePrx::checkedCast(obs);
164  }
165  catch (...)
166  {
167  throw exceptions::local::InvalidChannelException(observerName + "." + channelName);
168  }
169 
170  observerMap[observerName] = obs;
171  }
172  else
173  {
174  obs = it->second;
175  }
176 
177  return new ChannelRef(obs, channelName);
178  }
179 
182  {
183  ChannelRefPtr channel = getChannelRef(datafieldIdentifier.getObserverName(),
184  datafieldIdentifier.getChannelName());
185  return new DatafieldRef(channel, datafieldIdentifier.getDataFieldName());
186  }
187 
189  StatechartContext::getDatafieldRef(ChannelRefPtr channelRef, const std::string& datafieldName)
190  {
191  return new DatafieldRef(channelRef, datafieldName);
192  }
193 
194  bool
196  StringVariantContainerBaseMap startParameters)
197  {
198  newToplevelState->init(this, statechartManager.get());
199 
200  return statechartManager->setToplevelState(newToplevelState, startParameters);
201  }
202 
203  void
205  {
206  autoEnterToplevelState = autoEnter;
207  }
208 
209  void
210  StatechartContext::setReportingTopic(std::string reportingTopic)
211  {
212  this->reportingTopic = reportingTopic;
213  }
214 
215  void
217  {
219  }
220 
221  const StatechartProfilePtr&
223  {
224  return selectedStatechartProfile;
225  }
226 
227  void
229  {
230  selectedStatechartProfile = value;
231  }
232 
233 } // namespace armarx
ARMARX_VERBOSE
#define ARMARX_VERBOSE
Definition: Logging.h:187
armarx::StatechartContext::getDataFromObserver
VariantBasePtr getDataFromObserver(const DataFieldIdentifierBasePtr &identifier) override
Definition: StatechartContext.cpp:140
armarx::StatechartContext::onConnectStatechart
virtual void onConnectStatechart()=0
onConnectStatechart is called before armarx::StatechartContext::startStatechart() and after armarx::S...
armarx::StatechartContext::onInitStatechartContext
virtual void onInitStatechartContext()
onInitStatechartonInitStatechartContext can be implemented by subclasses
Definition: StatechartContext.h:104
armarx::StatechartContext::setReportingTopic
void setReportingTopic(std::string reportingTopic)
Definition: StatechartContext.cpp:210
armarx::StatechartContext::systemObserverPrx
SystemObserverInterfacePrx systemObserverPrx
Definition: StatechartContext.h:198
armarx::ManagedIceObject::getArmarXManager
ArmarXManagerPtr getArmarXManager() const
Returns the ArmarX manager used to add and remove components.
Definition: ManagedIceObject.cpp:360
armarx::DataFieldIdentifier::getObserverName
std::string getObserverName() const
Retrieve observer name.
Definition: DataFieldIdentifier.h:105
armarx::StatechartProfilePtr
std::shared_ptr< class StatechartProfile > StatechartProfilePtr
Definition: StatechartContext.h:51
armarx::StatechartContext::conditionHandlerPrx
ConditionHandlerInterfacePrx conditionHandlerPrx
Definition: StatechartContext.h:197
ParameterMapping.h
armarx::ManagedIceObject::getProfiler
Profiler::ProfilerPtr getProfiler() const
getProfiler returns an instance of armarx::Profiler
Definition: ManagedIceObject.cpp:372
armarx::Profiler::LoggingStrategyPtr
std::shared_ptr< LoggingStrategy > LoggingStrategyPtr
Definition: LoggingStrategy.h:42
armarx::StatechartContext::getChannelRef
ChannelRefPtr getChannelRef(const std::string &observerName, const std::string &channelName) override
Definition: StatechartContext.cpp:152
StatechartContext.h
IceLoggingStrategy.h
IceInternal::Handle<::armarx::VariantBase >
armarx::XMLStatechartContext::getSelectedStatechartProfile
const StatechartProfilePtr & getSelectedStatechartProfile() const
Definition: StatechartContext.cpp:222
armarx::DataFieldIdentifier::getChannelName
std::string getChannelName() const
Retrieve channel name.
Definition: DataFieldIdentifier.h:116
armarx::StatechartContext::setToplevelState
bool setToplevelState(const armarx::StatePtr &newToplevelState, StringVariantContainerBaseMap startParameters=StringVariantContainerBaseMap())
setToplevelState initializes newToplevelState with the current StatechartContext and the current Stat...
Definition: StatechartContext.cpp:195
armarx::StatechartContext::startStatechart
void startStatechart()
startStatechart actives both, the toplevel startchart stored in the variable statechart and the State...
Definition: StatechartContext.cpp:216
armarx::ParameterMapping::_setStatechartContext
static void _setStatechartContext(StatechartContext *__context)
Definition: ParameterMapping.cpp:645
armarx::StatechartContext::reportingTopic
std::string reportingTopic
Definition: StatechartContext.h:203
armarx::StatechartContext::eventDistributor
StatechartEventDistributorPtr eventDistributor
The EventListenerInterface instance, that receives events from observers and redirects them to the co...
Definition: StatechartContext.h:195
cxxopts::value
std::shared_ptr< Value > value()
Definition: cxxopts.hpp:855
armarx::DataFieldIdentifier::getDataFieldName
std::string getDataFieldName() const
Retrieve datafield name.
Definition: DataFieldIdentifier.h:127
State.h
armarx::flush
const LogSender::manipulator flush
Definition: LogSender.h:251
ARMARX_DEBUG
#define ARMARX_DEBUG
Definition: Logging.h:184
armarx::StatechartContext::observerMap
std::unordered_map< std::string, ObserverInterfacePrx > observerMap
Definition: StatechartContext.h:190
armarx::VariantType::ChannelRef
const VariantTypeId ChannelRef
Definition: ChannelRef.h:169
armarx::StatechartContextPropertyDefinitions::StatechartContextPropertyDefinitions
StatechartContextPropertyDefinitions(std::string prefix)
Definition: StatechartContext.cpp:40
armarx::StatechartContext::getDatafieldRef
DatafieldRefPtr getDatafieldRef(const DataFieldIdentifier &datafieldIdentifier) override
Definition: StatechartContext.cpp:181
armarx::StatechartContext::onExitStatechart
virtual void onExitStatechart()
onExitStatechart can be implemented by subclasses
Definition: StatechartContext.h:186
armarx::StatechartContext::stateReporter
Profiler::ProfilerPtr stateReporter
Definition: StatechartContext.h:202
armarx::StatechartContext::~StatechartContext
~StatechartContext() override
Definition: StatechartContext.cpp:56
armarx::exceptions::local::InvalidChannelException
Definition: InvalidChannelException.h:33
armarx::VariantType::DatafieldRef
const VariantTypeId DatafieldRef
Definition: DatafieldRef.h:197
armarx::StatechartContext::createPropertyDefinitions
PropertyDefinitionsPtr createPropertyDefinitions() override
Definition: StatechartContext.cpp:61
armarx::Component::getConfigIdentifier
std::string getConfigIdentifier()
Retrieve config identifier for this component as set in constructor.
Definition: Component.cpp:79
armarx::StatechartContext::statechartManager
StatechartManagerPtr statechartManager
Definition: StatechartContext.h:196
StatechartManager.h
Profiler.h
armarx::ComponentPropertyDefinitions
Default component property definition container.
Definition: Component.h:69
armarx::ManagedIceObject::offeringTopic
void offeringTopic(const std::string &name)
Registers a topic for retrival after initialization.
Definition: ManagedIceObject.cpp:300
armarx::StatechartContext::getDataListFromObserver
TimedVariantBaseList getDataListFromObserver(std::string observerName, const DataFieldIdentifierBaseList &identifierList) override
Definition: StatechartContext.cpp:128
IceUtil::Handle
Definition: forward_declarations.h:30
armarx::XMLStatechartContext::setSelectedStatechartProfile
void setSelectedStatechartProfile(const StatechartProfilePtr &value)
Definition: StatechartContext.cpp:228
armarx::StatechartContext::onInitStatechart
virtual void onInitStatechart()=0
onInitStatechart this method is called when the statechart is started.
armarx::ManagedIceObject::getName
std::string getName() const
Retrieve name of object.
Definition: ManagedIceObject.cpp:108
armarx::StatechartContext::StatechartContext
StatechartContext()
Definition: StatechartContext.cpp:49
armarx::StatechartContext::autoEnterToplevelState
bool autoEnterToplevelState
Definition: StatechartContext.h:201
armarx::Logging::setTag
void setTag(const LogTag &tag)
Definition: Logging.cpp:54
armarx::StatechartContext::onConnectStatechartContext
virtual void onConnectStatechartContext()
onConnectStatechartContext can be implemented by subclasses
Definition: StatechartContext.h:117
armarx::DataFieldIdentifierBaseList
::std::vector<::armarx::DataFieldIdentifierBasePtr > DataFieldIdentifierBaseList
Definition: StatechartContextInterface.h:43
armarx::PropertyDefinitionsPtr
IceUtil::Handle< class PropertyDefinitionContainer > PropertyDefinitionsPtr
PropertyDefinitions smart pointer type.
Definition: forward_declarations.h:35
armarx::ManagedIceObject::usingProxy
bool usingProxy(const std::string &name, const std::string &endpoints="")
Registers a proxy for retrieval after initialization and adds it to the dependency list.
Definition: ManagedIceObject.cpp:154
armarx
This file offers overloads of toIce() and fromIce() functions for STL container types.
Definition: ArmarXTimeserver.cpp:27
armarx::StatechartManager
Definition: StatechartManager.h:40
armarx::StatechartContextPropertyDefinitions
The StatechartContextPropertyDefinitions class contains properties associated with all statecharts.
Definition: StatechartContext.h:56
armarx::DataFieldIdentifier
DataFieldIdentifier provide the basis to identify data field within a distributed ArmarX scenario.
Definition: DataFieldIdentifier.h:48
armarx::StatechartContext::setAutoEnterToplevelState
void setAutoEnterToplevelState(bool autoEnter)
setAutoStartStatechart controls whether the toplevelstate is automatically entered,...
Definition: StatechartContext.cpp:204