>xabsl   The Extensible Agent Behavior Specification Language

XabslEngine Class Library Reference

 

XabslOption.cpp

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