State.h
Go to the documentation of this file.
1/*
2* This file is part of ArmarX.
3*
4* ArmarX is free software; you can redistribute it and/or modify
5* it under the terms of the GNU General Public License version 2 as
6* published by the Free Software Foundation.
7*
8* ArmarX is distributed in the hope that it will be useful, but
9* WITHOUT ANY WARRANTY; without even the implied warranty of
10* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11* GNU General Public License for more details.
12*
13* You should have received a copy of the GNU General Public License
14* along with this program. If not, see <http://www.gnu.org/licenses/>.
15*
16* @package ArmarX::
17* @author Mirko Waechter ( mirko.waechter at kit dot edu)
18* @date 2014
19* @copyright http://www.gnu.org/licenses/gpl-2.0.txt
20* GNU General Public License
21*/
22
23#pragma once
24
25#include <memory>
26
27#include <QMap>
28#include <QMetaType>
29#include <QObject>
30
32#include <ArmarXCore/interface/statechart/StatechartIce.h>
33
35
36#include "Event.h"
37#include "SignalType.h"
38#include "StateParameter.h"
39#include "Transition.h"
42
44{
45
46 class State;
48 using StatePtr = std::shared_ptr<State>;
49 using DynamicRemoteStateClassPtr = std::shared_ptr<DynamicRemoteStateClass>;
50 using TransitionList = QList<TransitionPtr>;
51 using CTransitionList = QList<TransitionCPtr>;
52 using StateInstanceMap = QMap<QString, StateInstancePtr>;
53
54 class State : public QObject, public Logging, public std::enable_shared_from_this<State>
55 {
56 Q_OBJECT
57 public:
58 const QRectF margin;
59
60 explicit State(const QString& uuid = "");
61 ~State() override;
62 /**
63 * Annotates the State object created by parseXml() before with references to other states.
64 */
65 void addReferences(const QMap<QString, armarx::statechartmodel::StatePtr>& uuidStateMap);
66
67 QString
69 {
70 return stateName;
71 }
72
73 QString
74 getUUID() const
75 {
76 return UUID;
77 }
78
79 const QString&
81 {
82 return description;
83 }
84
85 const QList<QString>
86 getProxies() const
87 {
88 return proxies;
89 }
90
91 // QString getPath() const { return filePath;}
94 {
95 return inputParameters;
96 }
97
100 {
101 return localParameters;
102 }
103
105
106 const StateParameterMap&
108 {
109 return outputParameters;
110 }
111
112 CTransitionList getTransitions(bool withStartTransition = false) const;
113
114 const StateInstanceMap&
116 {
117 return substates;
118 }
119
120 const StateInstancePtr&
122 {
123 return activeSubstate;
124 }
125
128
129 const EventList&
131 {
132 return outgoingTransitions;
133 }
134
135 EventList getAllEvents() const;
136
137 QSizeF
138 getSize() const
139 {
140 return size;
141 }
142
143 virtual eStateType
144 getType() const
145 {
146 return eNormalState;
147 }
148
149 bool
150 getDirty() const
151 {
152 return dirty;
153 }
154
157 TransitionPtr findTransition(const QString& eventName,
158 const QString& transitionSourceName,
159 const QString& transitionDestinationName) const;
161
162 static QString StateTypeToString(eStateType type);
163 void connectToSubclasses();
164
165 bool isEditable() const;
166 signals:
167 /*
168 * @brief stateChanged
169 * name changed,
170 * parameters changed,
171 * promoted to endstate
172 * start substate changed
173 * @param state
174 * @param signalType
175 */
177
178 /*
179 * @brief substateChanged
180 * substate added
181 * substate removed
182 * substate moved
183 * substate resized
184 * substate instance name renamed
185 * substate
186 * @param substate
187 * @param signalType
188 */
190 statechartmodel::SignalType signalType);
191
192 /*
193 * @brief transitionChanged
194 * transition added
195 * transition removed
196 * transition event changed
197 * mapping changed,
198 * target/source state changed
199 * support point changed/added/removed
200 * @param transition
201 * @param signalType
202 */
204 statechartmodel::SignalType signalType);
205 void outgoingTransitionChanged(const QString& eventName,
206 statechartmodel::StatePtr stateClass,
207 statechartmodel::SignalType signalType);
208
209 void resized();
210 void dirtyStatusChanged(bool newStatus);
211
212 /**
213 * @brief stateDeleted Signals that the destructor of this state was called.
214 */
216
217 public slots:
218 void setStateName(const QString& newName);
219 void setDescription(const QString& newDescription);
220 void setSize(const QSizeF& newSize);
221 void setSubstateAreaSize(const QSizeF& newSize);
222
223 void setEditable(bool editable);
224
225 // Substate slots
228 QString instanceName = "",
229 const QPointF& pos = QPointF());
231 const QString& remoteStateOffererName,
232 QString instanceName = "",
233 const QPointF& pos = QPointF());
235 addDynamicRemoteSubstate(StatePtr state, QString instanceName, const QPointF& pos);
236 StateInstancePtr addEndSubstate(const QString& endstateName,
237 const QString& eventName,
238 const QPointF& pos = QPointF());
239
240 bool renameSubstate(QString oldName, QString newName);
241 bool removeSubstate(StateInstancePtr substate);
242 bool removeSubstate(QString stateInstanceName);
243 StateInstancePtr replaceSubstate(QString stateInstanceName, StateInstancePtr newInstance);
244 void replaceSubstates(StateInstanceMap newSubstateList);
245
246 void setActiveSubstate(StateInstancePtr newActiveState);
248 void setStartState(StateInstancePtr newStartState);
249 void setStartStateInputMapping(const ParameterMappingList& newStartStateInputMapping);
250
251 // Parameter slots
252 void setInputParameters(const StateParameterMap& newInputParameters);
253 void setLocalParameters(const StateParameterMap& newLocalParameters);
254 void setOutputParameters(const StateParameterMap& newOutputParameters);
255
256 // Transition slots
257 void addTransition(TransitionPtr newTransition);
258 void setTransitionMapping(TransitionCPtr transition,
259 const ParameterMappingList& mappingToNextStateInput,
260 const ParameterMappingList& mappingToParentLocal,
261 const ParameterMappingList& mappingToParentOutput);
263 const SupportPoints& points,
264 const QPointPtr& labelCenterPosition = QPointPtr(),
265 const FloatPtr& labelFontPointSize = FloatPtr());
266 void setTransitionActivated(TransitionCPtr transition);
267 void setTransitionUserCodeEnabled(TransitionCPtr transition, bool enabled = true);
268 void addDetachedTransition(const QString& eventName, StateInstancePtr sourceState);
270 StateInstancePtr newDest,
271 QPointList newSupportPoints = QPointList());
272 void detachTransitionDestination(TransitionCPtr transition, QPointF floatingEndPoint);
274 void bendTransition(TransitionCPtr transition, int u, int v);
275 void replaceTransitions(TransitionList newTransitionList);
276 void addSupportPoint(TransitionCPtr transition, QPointF supportPoint);
277
278 bool removeTransition(TransitionPtr transition);
279
280
281 void setOutgoingEvents(const EventList& outgoingEvents);
282 void updateTransition(const QString& eventName,
283 statechartmodel::StatePtr stateClass,
284 statechartmodel::SignalType signalType);
285
286 private slots:
287 void setDirty(statechartmodel::SignalType signalType);
288 void setDirty(statechartmodel::StateInstancePtr substate,
289 statechartmodel::SignalType signalType);
290 void setDirty(statechartmodel::TransitionCPtr transition,
291 statechartmodel::SignalType signalType);
292 void setDirty(bool dirty);
293
294 protected:
295 QList<StateInstancePtr> getInstances(statechartmodel::StatePtr stateClass) const;
297 TransitionPtr getTransition(const QString& eventName,
298 StateInstancePtr sourceInstance) const;
299 bool checkTransition(TransitionPtr transition) const;
300 bool checkSubstate(StatePtr newState) const;
302 QString stateName;
303 QString description;
304
305 QList<QString> proxies;
306
310
313
314 TransitionList transitions; /* Transition to start state has sourceState == 0 */
315 // QString filePath;?
316 QString UUID;
318
319 QSizeF size;
320 bool dirty;
322
323 private:
324 bool active;
325
326 void addDetachedTransitions(StateInstancePtr instance);
327 QPointF calcDetachedTransitionLastControlPoint(StateInstancePtr instance) const;
328 QPointF calcDetachedTransitionEndPoint(StateInstancePtr instance,
329 const QPointF& lastControlPoint) const;
330 friend class StateInstance;
331 };
332} // namespace armarx::statechartmodel
333Q_DECLARE_METATYPE(armarx::statechartmodel::StatePtr)
const StateInstanceMap & getSubstates() const
Definition State.h:115
TransitionList transitions
Definition State.h:314
State(const QString &uuid="")
Definition State.cpp:38
void stateChanged(statechartmodel::SignalType signalType)
StateInstancePtr addRemoteSubstate(StatePtr newRemoteSubstate, const QString &remoteStateOffererName, QString instanceName="", const QPointF &pos=QPointF())
Definition State.cpp:319
void setTransitionMapping(TransitionCPtr transition, const ParameterMappingList &mappingToNextStateInput, const ParameterMappingList &mappingToParentLocal, const ParameterMappingList &mappingToParentOutput)
Definition State.cpp:754
StateParameterMap outputParameters
Definition State.h:309
QString getStateName() const
Definition State.h:68
bool hasDescendant(statechartmodel::StatePtr state) const
Definition State.cpp:1261
bool checkTransition(TransitionPtr transition) const
Definition State.cpp:1184
void bendTransition(TransitionCPtr transition, int u, int v)
Definition State.cpp:1381
StateInstanceMap substates
Definition State.h:311
void addTransition(TransitionPtr newTransition)
Definition State.cpp:742
TransitionPtr getTransition(const QString &eventName, StateInstancePtr sourceInstance) const
Definition State.cpp:1153
void setLocalParameters(const StateParameterMap &newLocalParameters)
Definition State.cpp:715
void outgoingTransitionChanged(const QString &eventName, statechartmodel::StatePtr stateClass, statechartmodel::SignalType signalType)
void setStartState(StateInstancePtr newStartState)
Definition State.cpp:452
void setActiveSubstate(StateInstancePtr newActiveState)
Definition State.cpp:655
void replaceSubstates(StateInstanceMap newSubstateList)
Definition State.cpp:627
bool renameSubstate(QString oldName, QString newName)
Definition State.cpp:499
void setEditable(bool editable)
Definition State.cpp:269
void setStateName(const QString &newName)
Definition State.cpp:122
void setInputParameters(const StateParameterMap &newInputParameters)
Definition State.cpp:696
void updateTransitionDestination(TransitionCPtr transition, StateInstancePtr newDest, QPointList newSupportPoints=QPointList())
Definition State.cpp:854
QString getUUID() const
Definition State.h:74
StateInstancePtr getStartState() const
Definition State.cpp:136
StateInstancePtr replaceSubstate(QString stateInstanceName, StateInstancePtr newInstance)
Definition State.cpp:607
void substateChanged(statechartmodel::StateInstancePtr substate, statechartmodel::SignalType signalType)
virtual eStateType getType() const
Definition State.h:144
const EventList & getOutgoingEvents() const
Definition State.h:130
TransitionPtr findTransition(TransitionCPtr t) const
Definition State.cpp:1230
bool checkSubstate(StatePtr newState) const
Definition State.cpp:1218
const StateInstancePtr & getActiveSubstate() const
Definition State.h:121
const StateParameterMap & getLocalParameters() const
Definition State.h:99
static QString StateTypeToString(eStateType type)
Definition State.cpp:1294
ParameterMappingList getStartStateInputMapping() const
Definition State.cpp:143
StateInstancePtr activeSubstate
Definition State.h:312
QList< QString > proxies
Definition State.h:305
void setTransitionSupportPoints(statechartmodel::TransitionCPtr transition, const SupportPoints &points, const QPointPtr &labelCenterPosition=QPointPtr(), const FloatPtr &labelFontPointSize=FloatPtr())
Definition State.cpp:775
void setTransitionUserCodeEnabled(TransitionCPtr transition, bool enabled=true)
Definition State.cpp:819
const QList< QString > getProxies() const
Definition State.h:86
StateParameterMap localParameters
Definition State.h:308
void addReferences(const QMap< QString, armarx::statechartmodel::StatePtr > &uuidStateMap)
Annotates the State object created by parseXml() before with references to other states.
Definition State.cpp:70
void replaceTransitions(TransitionList newTransitionList)
Definition State.cpp:931
void transitionChanged(statechartmodel::TransitionCPtr transition, statechartmodel::SignalType signalType)
void addSupportPoint(TransitionCPtr transition, QPointF supportPoint)
Definition State.cpp:950
void setDescription(const QString &newDescription)
Definition State.cpp:230
CTransitionList getTransitions(bool withStartTransition=false) const
Definition State.cpp:108
void detachTransitionDestination(TransitionCPtr transition, QPointF floatingEndPoint)
Definition State.cpp:899
const StateParameterMap & getInputParameters() const
Definition State.h:93
StateInstancePtr addDynamicRemoteSubstate(StatePtr state, QString instanceName, const QPointF &pos)
Definition State.cpp:363
void dirtyStatusChanged(bool newStatus)
const QString & getDescription() const
Definition State.h:80
StateInstancePtr addEndSubstate(const QString &endstateName, const QString &eventName, const QPointF &pos=QPointF())
Definition State.cpp:408
const StateParameterMap & getOutputParameters() const
Definition State.h:107
void setOutgoingEvents(const EventList &outgoingEvents)
Definition State.cpp:988
void stateDeleted()
stateDeleted Signals that the destructor of this state was called.
const StateParameterMap getInputAndLocalParameters() const
Definition State.cpp:95
void addDetachedTransition(const QString &eventName, StateInstancePtr sourceState)
Definition State.cpp:835
void setOutputParameters(const StateParameterMap &newOutputParameters)
Definition State.cpp:734
void setTransitionActivated(TransitionCPtr transition)
Definition State.cpp:813
void setStartStateInputMapping(const ParameterMappingList &newStartStateInputMapping)
Definition State.cpp:477
StateParameterMap inputParameters
Definition State.h:307
EventList getAllEvents() const
Definition State.cpp:150
QList< StateInstancePtr > getInstances(statechartmodel::StatePtr stateClass) const
Definition State.cpp:1137
void setSize(const QSizeF &newSize)
Definition State.cpp:244
bool removeTransition(TransitionPtr transition)
Definition State.cpp:1166
TransitionCPtr getStartTransition() const
Definition State.cpp:192
bool removeSubstate(StateInstancePtr substate)
Definition State.cpp:535
void setSubstateAreaSize(const QSizeF &newSize)
Definition State.cpp:261
StateInstancePtr addSubstate(StateInstancePtr stateInstance)
Definition State.cpp:427
void updateTransition(const QString &eventName, statechartmodel::StatePtr stateClass, statechartmodel::SignalType signalType)
Definition State.cpp:1057
std::shared_ptr< State > StatePtr
Definition State.h:48
QMap< QString, StateParameterPtr > StateParameterMap
std::shared_ptr< StateInstance > StateInstancePtr
std::shared_ptr< DynamicRemoteStateClass > DynamicRemoteStateClassPtr
QList< ParameterMappingPtr > ParameterMappingList
Definition XmlWriter.h:49
QList< TransitionPtr > TransitionList
Definition State.h:50
std::shared_ptr< const Transition > TransitionCPtr
Definition Transition.h:91
SignalType
The SignalType enum.
Definition SignalType.h:34
QList< EventPtr > EventList
Definition XmlWriter.h:47
QList< TransitionCPtr > CTransitionList
Definition State.h:51
std::shared_ptr< Transition > TransitionPtr
Definition Transition.h:90
QMap< QString, StateInstancePtr > StateInstanceMap
Definition State.h:52
std::shared_ptr< QPointF > QPointPtr
Definition Transition.h:40
QList< QPointF > QPointList
Definition Transition.h:38
std::shared_ptr< float > FloatPtr
Definition Transition.h:39