>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
XabslAction.cppGo to the documentation of this file.00001 /** 00002 * @file XabslAction.cpp 00003 * 00004 * Implementation of class Action and helper classes 00005 * 00006 * @author <a href="http://www.sim.informatik.tu-darmstadt.de/pers/card/risler.html">Max Risler</a> 00007 */ 00008 00009 00010 #include "XabslAction.h" 00011 #include "XabslOption.h" 00012 00013 namespace xabsl 00014 { 00015 00016 Action* Action::create( 00017 InputSource& input, 00018 NamedArray<Option*>& options, 00019 NamedArray<BasicBehavior*>& basicBehaviors, 00020 Symbols& symbols, 00021 Option& option, 00022 State& state, 00023 ErrorHandler& errorHandler, 00024 const unsigned& time) 00025 { 00026 00027 char c[2]; 00028 char buf[100]; 00029 00030 input.readString(c,1); 00031 input.readString(buf,99); 00032 00033 switch (*c) 00034 { 00035 case 'o': 00036 XABSL_DEBUG_INIT(errorHandler.message("creating reference to option \"%s\"",buf)); 00037 00038 if (!options.exists(buf)) 00039 { 00040 errorHandler.error("XabslAction::create(): unknown option \"%s\" was encountered",buf); 00041 return 0; 00042 } 00043 else 00044 { 00045 ActionOption* action = new ActionOption(time); 00046 action->option = options[buf]; 00047 action->parameters = new ParameterAssignment(action->option->parameters, errorHandler); 00048 action->parameters->create(input, 00049 symbols, 00050 option, 00051 state); 00052 return action; 00053 } 00054 break; 00055 case 'a': 00056 XABSL_DEBUG_INIT(errorHandler.message("creating reference to basic behavior \"%s\"",buf)); 00057 00058 if (!basicBehaviors.exists(buf)) 00059 { 00060 errorHandler.error("XabslAction::create(): the subsequent basic behavior \"%s\" was not registered",buf); 00061 return 0; 00062 } 00063 else 00064 { 00065 ActionBasicBehavior* action = new ActionBasicBehavior(time); 00066 action->basicBehavior = basicBehaviors[buf]; 00067 action->parameters = new ParameterAssignment(action->basicBehavior->parameters, errorHandler); 00068 action->parameters->create(input, 00069 symbols, 00070 option, 00071 state); 00072 return action; 00073 } 00074 break; 00075 case 'd': 00076 XABSL_DEBUG_INIT(errorHandler.message("creating reference to decimal output symbol \"%s\"",buf)); 00077 00078 if (!symbols.decimalOutputSymbols.exists(buf)) 00079 { 00080 errorHandler.error("XabslAction::create(): decimal output symbol \"%s\" does not exist",buf); 00081 return 0; 00082 } 00083 else 00084 { 00085 ActionDecimalOutputSymbol* action = new ActionDecimalOutputSymbol(time); 00086 action->decimalOutputSymbol = symbols.decimalOutputSymbols[buf]; 00087 action->decimalOutputSymbolExpression = DecimalExpression::create(input,errorHandler,symbols,option,state); 00088 if (errorHandler.errorsOccurred) 00089 { 00090 errorHandler.error("XabslAction::create(): could not create decimal expression for output symbol \"%s\"",buf); 00091 delete action; 00092 return 0; 00093 } 00094 return action; 00095 } 00096 case 'b': 00097 XABSL_DEBUG_INIT(errorHandler.message("creating reference to boolean output symbol \"%s\"",buf)); 00098 00099 if (!symbols.booleanOutputSymbols.exists(buf)) 00100 { 00101 errorHandler.error("XabslAction::create(): boolean output symbol \"%s\" does not exist",buf); 00102 return 0; 00103 } 00104 else 00105 { 00106 ActionBooleanOutputSymbol* action = new ActionBooleanOutputSymbol(time); 00107 action->booleanOutputSymbol = symbols.booleanOutputSymbols[buf]; 00108 action->booleanOutputSymbolExpression = BooleanExpression::create(input,errorHandler,symbols,option,state); 00109 if (errorHandler.errorsOccurred) 00110 { 00111 errorHandler.error("XabslAction::create(): could not create boolean expression for output symbol \"%s\"",buf); 00112 delete action; 00113 return 0; 00114 } 00115 return action; 00116 } 00117 case 'e': 00118 XABSL_DEBUG_INIT(errorHandler.message("creating reference to enumerated output symbol \"%s\"",buf)); 00119 00120 if (!symbols.enumeratedOutputSymbols.exists(buf)) 00121 { 00122 errorHandler.error("XabslAction::create(): enumerated output symbol \"%s\" does not exist",buf); 00123 return 0; 00124 } 00125 else 00126 { 00127 ActionEnumeratedOutputSymbol* action = new ActionEnumeratedOutputSymbol(time); 00128 action->enumeratedOutputSymbol = symbols.enumeratedOutputSymbols[buf]; 00129 action->enumeratedOutputSymbolExpression = EnumeratedExpression::create(action->enumeratedOutputSymbol->enumeration,input,errorHandler,symbols,option,state); 00130 if (errorHandler.errorsOccurred) 00131 { 00132 errorHandler.error("XabslAction::create(): could not create enumerated expression for output symbol \"%s\"",buf); 00133 delete action; 00134 return 0; 00135 } 00136 return action; 00137 } 00138 } 00139 return 0; 00140 } 00141 00142 Action* Action::create( 00143 Behavior* behavior, 00144 ErrorHandler& errorHandler, 00145 const unsigned& time) 00146 { 00147 ActionBehavior* action = 0; 00148 if (Option* option = dynamic_cast<Option*>(behavior)) 00149 { 00150 action = new ActionOption(time); 00151 static_cast<ActionOption*>(action)->option = option; 00152 } 00153 else if (BasicBehavior* basicBehavior = dynamic_cast<BasicBehavior*>(behavior)) 00154 { 00155 action = new ActionBasicBehavior(time); 00156 static_cast<ActionBasicBehavior*>(action)->basicBehavior = basicBehavior; 00157 } 00158 if (action != 0) 00159 action->parameters = new ParameterAssignment(behavior->parameters, errorHandler); 00160 return action; 00161 } 00162 00163 ActionBehavior::~ActionBehavior() 00164 { 00165 if (parameters!=0) 00166 delete parameters; 00167 } 00168 00169 ActionDecimalOutputSymbol::~ActionDecimalOutputSymbol() 00170 { 00171 if (decimalOutputSymbolExpression!=0) 00172 delete decimalOutputSymbolExpression; 00173 } 00174 00175 ActionBooleanOutputSymbol::~ActionBooleanOutputSymbol() 00176 { 00177 if (booleanOutputSymbolExpression!=0) 00178 delete booleanOutputSymbolExpression; 00179 } 00180 00181 ActionEnumeratedOutputSymbol::~ActionEnumeratedOutputSymbol() 00182 { 00183 if (enumeratedOutputSymbolExpression!=0) 00184 delete enumeratedOutputSymbolExpression; 00185 } 00186 00187 void ActionBehavior::execute() 00188 { 00189 // execute subsequent option or basic behavior 00190 if (parameters->set()) 00191 getBehavior()->parametersChanged(); 00192 if (!getBehavior()->wasActive) getBehavior()->timeWhenActivated = time; 00193 getBehavior()->timeOfExecution = time - getBehavior()->timeWhenActivated; 00194 getBehavior()->execute(); 00195 getBehavior()->isActive = true; 00196 } 00197 00198 void ActionDecimalOutputSymbol::execute() 00199 { 00200 decimalOutputSymbolValue = decimalOutputSymbolExpression->getValue(); 00201 decimalOutputSymbol->setValue(decimalOutputSymbolValue); 00202 } 00203 00204 void ActionBooleanOutputSymbol::execute() 00205 { 00206 booleanOutputSymbolValue = booleanOutputSymbolExpression->getValue(); 00207 booleanOutputSymbol->setValue(booleanOutputSymbolValue); 00208 } 00209 00210 void ActionEnumeratedOutputSymbol::execute() 00211 { 00212 enumeratedOutputSymbolValue = enumeratedOutputSymbolExpression->getValue(); 00213 enumeratedOutputSymbol->setValue(enumeratedOutputSymbolValue); 00214 } 00215 00216 const Behavior* ActionOption::getBehavior() const 00217 { 00218 return option; 00219 } 00220 00221 const Behavior* ActionBasicBehavior::getBehavior() const 00222 { 00223 return basicBehavior; 00224 } 00225 00226 Behavior* ActionOption::getBehavior() 00227 { 00228 return option; 00229 } 00230 00231 Behavior* ActionBasicBehavior::getBehavior() 00232 { 00233 return basicBehavior; 00234 } 00235 00236 Behavior* Action::getBehavior() 00237 { 00238 if (ActionBehavior* action = dynamic_cast<ActionBehavior*>(this)) 00239 return action->getBehavior(); 00240 else 00241 return 0; 00242 } 00243 00244 Option* Action::getOption() 00245 { 00246 if (ActionOption* action = dynamic_cast<ActionOption*>(this)) 00247 return action->option; 00248 else 00249 return 0; 00250 } 00251 00252 BasicBehavior* Action::getBasicBehavior() 00253 { 00254 if (ActionBasicBehavior* action = dynamic_cast<ActionBasicBehavior*>(this)) 00255 return action->basicBehavior; 00256 else 00257 return 0; 00258 } 00259 00260 const Behavior* Action::getBehavior() const 00261 { 00262 if (const ActionBehavior* action = dynamic_cast<const ActionBehavior*>(this)) 00263 return action->getBehavior(); 00264 else 00265 return 0; 00266 } 00267 00268 const Option* Action::getOption() const 00269 { 00270 if (const ActionOption* action = dynamic_cast<const ActionOption*>(this)) 00271 return action->option; 00272 else 00273 return 0; 00274 } 00275 00276 const BasicBehavior* Action::getBasicBehavior() const 00277 { 00278 if (const ActionBasicBehavior* action = dynamic_cast<const ActionBasicBehavior*>(this)) 00279 return action->basicBehavior; 00280 else 00281 return 0; 00282 } 00283 00284 ParameterAssignment* Action::getParameters() 00285 { 00286 if (ActionBehavior* action = dynamic_cast<ActionBehavior*>(this)) 00287 return action->parameters; 00288 else 00289 return 0; 00290 } 00291 00292 const ParameterAssignment* Action::getParameters() const 00293 { 00294 if (const ActionBehavior* action = dynamic_cast<const ActionBehavior*>(this)) 00295 return action->parameters; 00296 else 00297 return 0; 00298 } 00299 00300 const DecimalOutputSymbol* Action::getDecimalOutputSymbol() const 00301 { 00302 if (const ActionDecimalOutputSymbol* action = dynamic_cast<const ActionDecimalOutputSymbol*>(this)) 00303 return action->decimalOutputSymbol; 00304 else 00305 return 0; 00306 } 00307 00308 const BooleanOutputSymbol* Action::getBooleanOutputSymbol() const 00309 { 00310 if (const ActionBooleanOutputSymbol* action = dynamic_cast<const ActionBooleanOutputSymbol*>(this)) 00311 return action->booleanOutputSymbol; 00312 else 00313 return 0; 00314 } 00315 00316 const EnumeratedOutputSymbol* Action::getEnumeratedOutputSymbol() const 00317 { 00318 if (const ActionEnumeratedOutputSymbol* action = dynamic_cast<const ActionEnumeratedOutputSymbol*>(this)) 00319 return action->enumeratedOutputSymbol; 00320 else 00321 return 0; 00322 } 00323 00324 double Action::getDecimalOutputSymbolValue() const 00325 { 00326 if (const ActionDecimalOutputSymbol* action = dynamic_cast<const ActionDecimalOutputSymbol*>(this)) 00327 return action->decimalOutputSymbolValue; 00328 else 00329 return 0; 00330 } 00331 00332 bool Action::getBooleanOutputSymbolValue() const 00333 { 00334 if (const ActionBooleanOutputSymbol* action = dynamic_cast<const ActionBooleanOutputSymbol*>(this)) 00335 return action->booleanOutputSymbolValue; 00336 else 00337 return false; 00338 } 00339 00340 int Action::getEnumeratedOutputSymbolValue() const 00341 { 00342 if (const ActionEnumeratedOutputSymbol* action = dynamic_cast<const ActionEnumeratedOutputSymbol*>(this)) 00343 return action->enumeratedOutputSymbolValue; 00344 else 00345 return 0; 00346 } 00347 00348 } // namespace Up | Main Page | Generated at Wed Aug 19 17:32:28 2009.
|
|
Copyright 2002 - 2009 by the XABSL developer team. See the licence for details. | |