>xabsl | The Extensible Agent Behavior Specification Language |
start | team | language reference | tools | xabsl engine | download | licence | |
XabslEngine Class Library Reference | |
  | |
Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members
XabslOption.cppGo to the documentation of this file.00001 /** 00002 * @file XabslOption.cpp 00003 * 00004 * Implementation of class Option and helper classes 00005 * 00006 * @author <a href="http://www.martin-loetzsch.de">Martin Loetzsch</a> 00007 * @author <a href="http://www.sim.informatik.tu-darmstadt.de/pers/card/risler.html">Max Risler</a> 00008 */ 00009 00010 #include "XabslOption.h" 00011 #include "XabslCoopState.h" 00012 00013 namespace xabsl 00014 { 00015 00016 OptionParameters::OptionParameters(InputSource& input, 00017 ErrorHandler& errorHandler, 00018 Symbols& symbols) : Parameters(errorHandler) 00019 { 00020 int numberOfOptionParameters = (int)input.readValue(); 00021 char buf[100]; 00022 char c[2]; 00023 for (int i=0; i< numberOfOptionParameters; i++) 00024 { 00025 input.readString(c,1); 00026 switch (c[0]) 00027 { 00028 case 'd': 00029 input.readString(buf,99); 00030 XABSL_DEBUG_INIT(errorHandler.message("registering decimal option parameter \"%s\"",buf)); 00031 decimal.append(buf, new double(0)); 00032 break; 00033 case 'b': 00034 input.readString(buf,99); 00035 XABSL_DEBUG_INIT(errorHandler.message("registering boolean option parameter \"%s\"",buf)); 00036 boolean.append(buf, new bool(false)); 00037 break; 00038 case 'e': 00039 input.readString(buf,99); 00040 if (!symbols.enumerations.exists(buf)) 00041 { 00042 errorHandler.error("XabslOptionParameters::OptionParameters(): enumeration \"%s\" was not registered",buf); 00043 return; 00044 } 00045 const Enumeration* enumeration = symbols.enumerations[buf]; 00046 if (enumeration->enumElements.getSize() == 0) 00047 { 00048 errorHandler.error("XabslOptionParameters::OptionParameters(): no enumeration elements for \"%s\" were registered",buf); 00049 return; 00050 } 00051 input.readString(buf,99); 00052 XABSL_DEBUG_INIT(errorHandler.message("registering enumerated option parameter \"%s\"",buf)); 00053 enumerated.append(buf, new int(enumeration->enumElements[0]->v)); 00054 enumerations.append(buf,enumeration); 00055 break; 00056 } 00057 } 00058 } 00059 00060 OptionParameters::~OptionParameters() 00061 { 00062 int i; 00063 for (i = 0; i < decimal.getSize(); i++) 00064 delete decimal[i]; 00065 for (i = 0; i < boolean.getSize(); i++) 00066 delete boolean[i]; 00067 for (i = 0; i < enumerated.getSize(); i++) 00068 delete enumerated[i]; 00069 } 00070 00071 Option::Option(const char* name, 00072 InputSource& input, 00073 ErrorHandler& errorHandler, 00074 Symbols& symbols, 00075 const unsigned& time, 00076 int index) 00077 : Behavior(name), activeState(0), 00078 initialState(0), errorHandler(errorHandler), 00079 time(time), 00080 index(index) 00081 00082 { 00083 parameters = new OptionParameters(input, errorHandler, symbols); 00084 } 00085 00086 Option::~Option() 00087 { 00088 for (int i=0;i<states.getSize();i++) 00089 if (states[i]!=0) 00090 delete states[i]; 00091 delete parameters; 00092 } 00093 00094 void Option::create(InputSource& input, 00095 NamedArray<Option*>& options, 00096 NamedArray<BasicBehavior*>& basicBehaviors, 00097 Symbols& symbols, 00098 const int& agentPriority, 00099 const int& synchronizationTicks 00100 ) 00101 { 00102 int i; 00103 00104 // the number of states of the option 00105 int numberOfStates = (int)input.readValue(); 00106 00107 char stateName[100]; 00108 char c[2]; 00109 00110 // register all states to the array 00111 for (i=0; i< numberOfStates; i++) 00112 { 00113 input.readString(stateName, 99); 00114 // cooperative state or not 00115 input.readString(c,1); 00116 switch (*c) 00117 { 00118 case 'n': 00119 states.append(stateName, new State(stateName,errorHandler,time,index,i)); 00120 break; 00121 case 's': 00122 states.append(stateName, new SynchronizedState(stateName,errorHandler,time,index,i,agentPriority,synchronizationTicks,(int)input.readValue())); 00123 break; 00124 case 'c': 00125 states.append(stateName, new CapacityState(stateName,errorHandler,time,index,i,agentPriority,synchronizationTicks,(int)input.readValue())); 00126 break; 00127 } 00128 } 00129 XABSL_DEBUG_INIT(errorHandler.message("XabslOption::create(): registered %i states",numberOfStates)); 00130 00131 // set the initial state 00132 input.readString(stateName,99); 00133 initialState = states[stateName]; 00134 activeState = initialState; 00135 00136 XABSL_DEBUG_INIT(errorHandler.message("XabslOption::create(): initial state: \"%s\"",initialState->n)); 00137 00138 // create the states and their subelements 00139 for (i=0; i< numberOfStates; i++) 00140 { 00141 states[i]->create(input, options, basicBehaviors, states, symbols); 00142 if (errorHandler.errorsOccurred) 00143 { 00144 errorHandler.error("XabslOption::create(): could not create state \"%s\"",states[i]->n); 00145 return; 00146 } 00147 } 00148 00149 } 00150 00151 void Option::execute() 00152 { 00153 if (isActive) 00154 { 00155 errorHandler.error("XabslOption::execute(): option \"%s\" is contained in activation tree more than once. Aborting execution.",n); 00156 return; 00157 } 00158 if (!wasActive) 00159 { 00160 activeState = initialState; 00161 activeState->reset(); 00162 } 00163 00164 State* newState = activeState->getNextState(); 00165 if (newState != activeState) 00166 { 00167 activeState = newState; 00168 activeState->reset(); 00169 } 00170 00171 for (int j=0; j < activeState->actions.getSize(); j++) 00172 { 00173 activeState->actions[j]->execute(); 00174 } 00175 } 00176 00177 bool Option::getOptionReachedATargetState() const 00178 { 00179 if (wasActive && activeState->isTargetState()) 00180 { 00181 return true; 00182 } 00183 else 00184 { 00185 return false; 00186 } 00187 } 00188 00189 } // namespace 00190 Up | Main Page | Generated at Wed Aug 19 17:32:29 2009.
|
|
Copyright 2002 - 2009 by the XABSL developer team. See the licence for details. | |