>xabsl   The Extensible Agent Behavior Specification Language

XabslEngine Class Library Reference

 

XabslAction.cpp

Go 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.