63 #include "rnr/rnrconfig.h" 76 StateEvent::StateEvent(
int nEventId,
77 const string &strEventName,
78 const string &strActionName)
80 m_nEventId = nEventId;
82 if( strEventName.empty() )
86 ss <<
"e" << m_nEventId;
91 m_strEventName = strEventName;
94 if( strActionName.empty() )
98 ss <<
"action_" << m_strEventName;
99 ss >> m_strActionName;
103 m_strActionName = strActionName;
107 int StateEvent::execAction(
State *pState,
119 State::State(
int nStateId,
120 const string &strStateName,
121 const string &strRefTag,
126 init(nStateId, strStateName, strRefTag);
128 for(i=0; listStateEvents[i] != NULL; ++i)
130 addStateEvent(listStateEvents[i]);
136 TransTblMap_T::iterator iter;
138 for(iter=m_mapTransTbl.begin(); iter!=m_mapTransTbl.end(); ++iter)
142 m_mapTransTbl.clear();
150 va_start(ap, pStateEvent);
152 for(i=0; pStateEvent != NULL; pStateEvent = va_arg(ap,
StateEvent *), ++i)
154 addStateEvent(pStateEvent);
164 TransTblMap_T::iterator pos;
166 if( pStateEvent != NULL )
168 if( (pos = m_mapTransTbl.find(pStateEvent->getEventId()))
169 != m_mapTransTbl.end() )
171 LOGWARN(
"%s: Event %s.%d already exists - replacing.",
172 m_strStateName.c_str(),
173 pos->second->getEventName().c_str(), pos->second->getEventId());
175 m_mapTransTbl.erase(pos);
178 m_mapTransTbl[pStateEvent->getEventId()] = pStateEvent;
180 LOGDIAG3(
"%s: %s.%d state event added.",
181 m_strStateName.c_str(),
182 pStateEvent->getEventName().c_str(), pStateEvent->getEventId());
186 bool State::deleteStateEvent(
int nEventId)
188 TransTblMap_T::iterator pos;
190 if( (pos = m_mapTransTbl.find(nEventId)) != m_mapTransTbl.end() )
193 m_mapTransTbl.erase(pos);
198 LOGERROR(
"%s: No event found in transition table with id=%d.",
199 m_strStateName.c_str(), nEventId);
204 int State::receiveEvent()
206 if( m_mapTransTbl.size() > 0 )
208 TransTblMap_T::iterator pos;
212 i = rand.
randrange(0, (
int)m_mapTransTbl.size()-1);
215 for(pos = m_mapTransTbl.begin(); i > 0; --i, ++pos);
217 return pos->second->getEventId();
225 int State::dispatchEvent(
int nPrevStateId,
int nEventId)
227 TransTblMap_T::iterator pos;
234 if( (pos = m_mapTransTbl.find(nEventId)) != m_mapTransTbl.end() )
236 pEvent = pos->second;
242 nNextStateId = pEvent->
execAction(
this, nPrevStateId, nEventId);
248 nNextStateId = m_nStateId;
257 nNextStateId = actionDefault(nPrevStateId, nEventId);
261 if( nNextStateId == StateIdThis )
263 nNextStateId = m_nStateId;
269 string State::getEventName(
int nEventId)
271 TransTblMap_T::iterator pos;
273 if( (pos = m_mapTransTbl.find(nEventId)) != m_mapTransTbl.end() )
275 return pos->second->getEventName();
283 string State::getActionName(
int nEventId)
285 TransTblMap_T::iterator pos;
287 if( (pos = m_mapTransTbl.find(nEventId)) != m_mapTransTbl.end() )
289 return pos->second->getActionName();
298 void State::printState(FILE *fp,
int indent)
300 TransTblMap_T::iterator iter;
303 fprintf(fp,
"%*sState: %s.%d\n",
304 indent,
"", m_strStateName.c_str(), m_nStateId);
306 for(iter = m_mapTransTbl.begin();
307 iter != m_mapTransTbl.end();
310 pEvent = iter->second;
311 fprintf(fp,
"%*sEvent: %s.%d %s\n",
313 pEvent->getEventName().c_str(), pEvent->getEventId(),
314 pEvent->getActionName().c_str());
318 void State::init(
int nStateId,
319 const string &strStateName,
320 const string &strRefTag)
323 m_nStateId = nStateId;
324 m_bHasQueuedEvent =
false;
327 if( strStateName.empty() )
331 ss <<
"S" << m_nStateId;
332 ss >> m_strStateName;
336 m_strStateName = strStateName;
339 if( strRefTag.empty() )
348 m_strRefTag = strRefTag;
352 string State::getReservedStateName(
int nStateId)
361 return m_strStateName;
362 case StateIdTerminate:
osManipIndent indent()
Left indent at current stream indentation level.
virtual int execAction(State *pState, int nPrevStateId, int nEventId)
Execute action associated with the event.
virtual bool evalGuardExpr(State *pState, int nPrevStateId, int nEventId)
Evaluate event guard condition.
int randrange(int nMin=0, int nMax=INT_MAX)
Generates a random integer uniformally distrubuted between [nMin, nMax].
Random variable generator class interface.
Random variable generators class.
State base class interface.