bool StateType::Insert( CommandInterpreter& inInterpreter ) { string name = inInterpreter.GetToken(); string line = inInterpreter.GetRemainder(), stateline = name + " " + line + " 0 0"; State state; istringstream iss( stateline ); if( !( iss >> state ) ) throw bciexception( "Invalid state definition" ); { Lock lock( inInterpreter.StateMachine() ); switch( inInterpreter.StateMachine().SystemState() ) { case StateMachine::Idle: case StateMachine::WaitingForConnection: case StateMachine::Publishing: case StateMachine::Information: break; default: throw bciexception( "Could not add state " << name << " to list after information phase" ); } inInterpreter.StateMachine().States().Add( state ); } inInterpreter.StateMachine().ExecuteCallback( BCI_OnState, stateline.c_str() ); inInterpreter.Log() << "Added state " << name << " to list"; return true; }
bool StateType::Set( CommandInterpreter& inInterpreter ) { string name; State::ValueType value = 0; ostringstream oss; { Lock lock( inInterpreter.StateMachine() ); State& state = GetState( inInterpreter ); name = state.Name(); value = ::atoi( inInterpreter.GetToken().c_str() ); if( !inInterpreter.StateMachine().SetStateValue( name.c_str(), value ) ) throw bciexception( "Could not set state " << name << " to " << value ); // StateMachine::SetStateValue() does not set the value of the state object in its state list. state.SetValue( value ); oss << state; } inInterpreter.StateMachine().ExecuteCallback( BCI_OnState, oss.str().c_str() ); inInterpreter.Log() << "Set state " << name << " to " << value; return true; }