#include <logic_state.h>
Nevrax France
Definition at line 56 of file logic_state.h.
Public Member Functions | |
void | addEvent (CLogicEvent event) |
void | addSIdMap (const TSIdMap &sIdMap) |
CLogicState () | |
void | enterState () |
void | exitState () |
void | fillVarMap (std::multimap< NLMISC::CEntityId, std::string > &stateMachineVariables) |
void | getMessagesToSend (std::multimap< NLMISC::CEntityId, NLNET::CMessage > &msgs) |
std::string | getName () |
void | processLogic () |
void | read (xmlNodePtr node) |
void | setLogicStateMachine (CLogicStateMachine *logicStateMachine) |
void | setName (std::string name) |
void | trySendEntryMessages () |
void | trySendEventMessages () |
void | write (xmlNodePtr node) const |
Data Fields | |
std::vector< CLogicEventMessage > | _EntryMessages |
entry messages | |
std::vector< CLogicEvent > | _Events |
logic | |
std::vector< CLogicEventMessage > | _ExitMessages |
exit messages | |
CLogicStateMachine * | _LogicStateMachine |
state machine containing this state | |
std::multimap< NLMISC::CEntityId, NLNET::CMessage > | _MessagesToSend |
messages to send by the service | |
std::string | _StateName |
state name |
|
Default constructor Definition at line 42 of file logic_state.cpp. References _StateName.
00043 { 00044 _StateName = "no_state"; 00045 _LogicStateMachine = 0; 00046 00047 } // CLogicState // |
|
Add an event
Definition at line 81 of file logic_state.cpp. References NLLOGIC::CLogicEvent::setLogicStateMachine().
00082 { 00083 event.setLogicStateMachine( _LogicStateMachine ); 00084 _Events.push_back( event ); 00085 00086 } // addEvent // |
|
Associate message destination name with sid
Definition at line 96 of file logic_state.cpp. References _EntryMessages, _ExitMessages, trySendEntryMessages(), trySendEventMessages(), and NLLOGIC::TSIdMap.
00097 { 00098 vector<CLogicEventMessage>::iterator itMsg; 00099 00101 for( itMsg = _EntryMessages.begin(); itMsg != _EntryMessages.end(); ++itMsg ) 00102 { 00103 TSIdMap::const_iterator itId = sIdMap.find( (*itMsg).Destination ); 00104 // if message destination exists in the map we associate the sid with the message 00105 if( itId != sIdMap.end() ) 00106 { 00107 (*itMsg).DestinationId = (*itId).second; 00108 } 00109 } 00111 trySendEntryMessages(); 00112 00113 00114 // event messages 00115 vector<CLogicEvent>::iterator itEvt; 00116 for( itEvt = _Events.begin(); itEvt != _Events.end(); ++itEvt ) 00117 { 00118 string dest = (*itEvt).EventAction.EventMessage.Destination; 00119 TSIdMap::const_iterator itId = sIdMap.find( dest ); 00120 // if message destination exists in the map we associate the sid with the message 00121 if( itId != sIdMap.end() ) 00122 { 00123 (*itEvt).EventAction.EventMessage.DestinationId = (*itId).second; 00124 } 00125 } 00127 trySendEventMessages(); 00128 00129 00131 for( itMsg = _ExitMessages.begin(); itMsg != _ExitMessages.end(); ++itMsg ) 00132 { 00133 TSIdMap::const_iterator itId = sIdMap.find( (*itMsg).Destination ); 00134 // if message destination exists in the map we associate the sid with the message 00135 if( itId != sIdMap.end() ) 00136 { 00137 (*itMsg).DestinationId = (*itId).second; 00138 } 00139 } 00140 00141 } // addSIdMap // |
|
send the entry messages Definition at line 184 of file logic_state.cpp. References trySendEntryMessages().
00185 { 00187 trySendEntryMessages(); 00188 00189 } // enterState // |
|
send the exit messages Definition at line 196 of file logic_state.cpp. References _EntryMessages, _ExitMessages, _MessagesToSend, and NLMISC::CMemStream::serial().
00197 { 00198 vector<CLogicEventMessage>::iterator itMsg; 00199 for( itMsg = _ExitMessages.begin(); itMsg != _ExitMessages.end(); ++itMsg ) 00200 { 00201 if( (*itMsg).DestinationId != CEntityId() ) 00202 { 00203 CMessage msgOut( (*itMsg).MessageId ); 00204 msgOut.serial( (*itMsg).Arguments ); 00205 00206 _MessagesToSend.insert( make_pair((*itMsg).DestinationId,msgOut) ); 00207 } 00208 } 00209 00210 // reset the entry messages send status 00211 for( itMsg = _EntryMessages.begin(); itMsg != _EntryMessages.end(); ++itMsg ) 00212 { 00213 (*itMsg).ToSend = false; 00214 (*itMsg).Sent = false; 00215 } 00216 00217 // reset all events 00218 vector<CLogicEvent>::iterator itEvent; 00219 for( itEvent = _Events.begin(); itEvent != _Events.end(); ++itEvent ) 00220 { 00221 (*itEvent).reset(); 00222 } 00223 00224 // reset the exit messages send status 00225 for( itMsg = _ExitMessages.begin(); itMsg != _ExitMessages.end(); ++itMsg ) 00226 { 00227 (*itMsg).ToSend = false; 00228 (*itMsg).Sent = false; 00229 } 00230 00231 } // exitState // |
|
Fill a map associating all the referenced var in the state with the id of service managing them (debug purpose) Definition at line 315 of file logic_state.cpp. References condition, and NLLOGIC::CLogicStateMachine::getCondition().
00316 { 00317 // events 00318 vector<CLogicEvent>::iterator itEvt; 00319 for( itEvt = _Events.begin(); itEvt != _Events.end(); ++itEvt ) 00320 { 00321 // get the condition used in the event 00322 CLogicCondition condition; 00323 if( _LogicStateMachine->getCondition((*itEvt).ConditionName,condition) ) 00324 { 00325 // get vars used in the conditions 00326 set<string> condVars; 00327 condition.fillVarSet( condVars ); 00328 00329 // add var with related service 00330 set<string>::iterator itCV; 00331 for( itCV = condVars.begin(); itCV != condVars.end(); ++itCV ) 00332 { 00333 stateMachineVariables.insert( make_pair((*itEvt).EventAction.EventMessage.DestinationId,*itCV) ); 00334 } 00335 } 00336 } 00337 00338 } // fillVarMap // |
|
Get the messages to send
Definition at line 296 of file logic_state.cpp. References _MessagesToSend.
00297 { 00298 multimap<CEntityId,CMessage>::iterator itMsg; 00299 for( itMsg = _MessagesToSend.begin(); itMsg != _MessagesToSend.end(); ++itMsg ) 00300 { 00301 msgs.insert( *itMsg ); 00302 } 00303 00304 // erase all the messages 00305 _MessagesToSend.clear(); 00306 00307 } // getMessagesToSend // |
|
get the state name
Definition at line 104 of file logic_state.h. References _StateName. Referenced by NLLOGIC::CLogicStateMachine::addState().
00104 { return _StateName; } |
|
Test the conditions of this state Definition at line 148 of file logic_state.cpp. References NLLOGIC::CLogicStateMachine::setCurrentState(), and trySendEventMessages().
00149 { 00150 // test all conditions managed by this state 00151 vector<CLogicEvent>::iterator itEvent; 00152 for( itEvent = _Events.begin(); itEvent != _Events.end(); ++itEvent ) 00153 { 00154 if( (*itEvent).testCondition() ) 00155 { 00156 //nlinfo("The condition %s is valid",(*itEvent).ConditionName.c_str()); 00157 if( (*itEvent).EventAction.IsStateChange ) 00158 { 00159 _LogicStateMachine->setCurrentState( (*itEvent).EventAction.StateChange ); 00160 } 00161 else 00162 { 00163 // this message will be sent as soon as the dest id will be given 00164 (*itEvent).EventAction.enableSendMessage(); 00165 00167 trySendEventMessages(); 00168 } 00169 } 00170 else 00171 { 00172 // reset message send status here to be able to send messages several times in the logic state 00173 // --> this has to be done if we want messages to be sent every time the condition becomes verified 00174 } 00175 } 00176 00177 } // processLogic // |
|
Definition at line 379 of file logic_state.cpp. References _EntryMessages, _ExitMessages, _StateName, NLLOGIC::getXMLProp(), uint, v, and NLLOGIC::xmlCheckNodeName().
00380 { 00381 xmlCheckNodeName (node, "STATE"); 00382 00383 _StateName = getXMLProp (node, "Name"); 00384 00385 { 00386 // Count the parent 00387 uint nb = CIXml::countChildren (node, "ENTRY_EVENT_MESSAGE"); 00388 uint i = 0; 00389 xmlNodePtr parent = CIXml::getFirstChildNode (node, "ENTRY_EVENT_MESSAGE"); 00390 while (i<nb) 00391 { 00392 CLogicEventMessage v; 00393 v.read(parent); 00394 _EntryMessages.push_back(v); 00395 00396 // Next parent 00397 parent = CIXml::getNextChildNode (parent, "ENTRY_EVENT_MESSAGE"); 00398 i++; 00399 } 00400 } 00401 00402 { 00403 // Count the parent 00404 uint nb = CIXml::countChildren (node, "EXIT_EVENT_MESSAGE"); 00405 uint i = 0; 00406 xmlNodePtr parent = CIXml::getFirstChildNode (node, "EXIT_EVENT_MESSAGE"); 00407 while (i<nb) 00408 { 00409 CLogicEventMessage v; 00410 v.read(parent); 00411 _ExitMessages.push_back(v); 00412 00413 // Next parent 00414 parent = CIXml::getNextChildNode (parent, "EXIT_EVENT_MESSAGE"); 00415 i++; 00416 } 00417 } 00418 00419 { 00420 // Count the parent 00421 uint nb = CIXml::countChildren (node, "EVENT"); 00422 uint i = 0; 00423 xmlNodePtr parent = CIXml::getFirstChildNode (node, "EVENT"); 00424 while (i<nb) 00425 { 00426 CLogicEvent v; 00427 v.read(parent); 00428 _Events.push_back(v); 00429 00430 // Next parent 00431 parent = CIXml::getNextChildNode (parent, "EVENT"); 00432 i++; 00433 } 00434 } 00435 00436 } |
|
Set the state machine which contains this state
Definition at line 54 of file logic_state.cpp. References nlwarning. Referenced by NLLOGIC::CLogicStateMachine::addState().
00055 { 00056 if( logicStateMachine == 0 ) 00057 { 00058 nlwarning("(LOGIC)<CLogicCondition::setLogicStateMachine> The state machine is null"); 00059 } 00060 else 00061 { 00062 // init the logic state machine for this state 00063 _LogicStateMachine = logicStateMachine; 00064 00065 // init the logic state machine in each event 00066 vector<CLogicEvent>::iterator itEvent; 00067 for( itEvent = _Events.begin(); itEvent != _Events.end(); ++itEvent ) 00068 { 00069 (*itEvent).setLogicStateMachine( logicStateMachine ); 00070 } 00071 } 00072 00073 } // setLogicStateMachine // |
|
set the state name
Definition at line 97 of file logic_state.h. References _StateName.
00097 { _StateName = name; } |
|
Try to send the entry messages Definition at line 239 of file logic_state.cpp. References _EntryMessages, _MessagesToSend, and NLMISC::CMemStream::serial(). Referenced by addSIdMap(), and enterState().
00240 { 00242 vector<CLogicEventMessage>::iterator itMsg; 00243 for( itMsg = _EntryMessages.begin(); itMsg != _EntryMessages.end(); ++itMsg ) 00244 { 00245 if( !(*itMsg).Sent && (*itMsg).DestinationId.getType() != 0xfe ) 00246 { 00247 CMessage msgOut( (*itMsg).MessageId ); 00248 msgOut.serial( (*itMsg).Arguments ); 00249 00250 _MessagesToSend.insert( make_pair((*itMsg).DestinationId,msgOut) ); 00251 00252 (*itMsg).ToSend = false; 00253 (*itMsg).Sent = true; 00254 } 00255 } 00256 00257 } // trySendEntryMessages // |
|
Try to send the event messages Definition at line 265 of file logic_state.cpp. References _MessagesToSend, and NLMISC::CMemStream::serial(). Referenced by addSIdMap(), and processLogic().
00266 { 00267 // test all conditions managed by this state 00268 vector<CLogicEvent>::iterator itEvent; 00269 for( itEvent = _Events.begin(); itEvent != _Events.end(); ++itEvent ) 00270 { 00271 if( (*itEvent).EventAction.EventMessage.ToSend == true ) 00272 { 00273 if( (*itEvent).EventAction.EventMessage.Sent == false ) 00274 { 00275 if( (*itEvent).EventAction.EventMessage.DestinationId.getType() != 0xfe ) 00276 { 00277 CMessage msgOut( (*itEvent).EventAction.EventMessage.MessageId ); 00278 msgOut.serial( (*itEvent).EventAction.EventMessage.Arguments ); 00279 00280 _MessagesToSend.insert( make_pair((*itEvent).EventAction.EventMessage.DestinationId,msgOut) ); 00281 00282 (*itEvent).EventAction.EventMessage.ToSend = false; 00283 (*itEvent).EventAction.EventMessage.Sent = true; 00284 } 00285 } 00286 } 00287 } 00288 00289 } // trySendEventMessages // |
|
serial Definition at line 359 of file logic_state.cpp. References _EntryMessages, _ExitMessages, _StateName, and uint.
00360 { 00361 xmlNodePtr elmPtr = xmlNewChild ( node, NULL, (const xmlChar*)"STATE", NULL); 00362 xmlSetProp (elmPtr, (const xmlChar*)"Name", (const xmlChar*)_StateName.c_str()); 00363 00364 uint i; 00365 for (i = 0; i < _EntryMessages.size(); i++) 00366 { 00367 _EntryMessages[i].write(elmPtr, "ENTRY_"); 00368 } 00369 for (i = 0; i < _ExitMessages.size(); i++) 00370 { 00371 _ExitMessages[i].write(elmPtr, "EXIT_"); 00372 } 00373 for (i = 0; i < _Events.size(); i++) 00374 { 00375 _Events[i].write(elmPtr); 00376 } 00377 } |
|
entry messages
Definition at line 64 of file logic_state.h. Referenced by addSIdMap(), exitState(), read(), trySendEntryMessages(), and write(). |
|
logic
Definition at line 70 of file logic_state.h. |
|
exit messages
Definition at line 67 of file logic_state.h. Referenced by addSIdMap(), exitState(), read(), and write(). |
|
state machine containing this state
Definition at line 73 of file logic_state.h. |
|
messages to send by the service
Definition at line 76 of file logic_state.h. Referenced by exitState(), getMessagesToSend(), trySendEntryMessages(), and trySendEventMessages(). |
|
state name
Definition at line 61 of file logic_state.h. Referenced by CLogicState(), getName(), read(), setName(), and write(). |