Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members | Related Pages

Tools/Xabsl2/GT/GTXabsl2EngineExecutor.cpp

Go to the documentation of this file.
00001 /**
00002 * @file GTXabsl2EngineExecutor.cpp
00003 * 
00004 * Implementation of class GTXabsl2EngineExecutor.
00005 *
00006 * @author Martin Lötzsch
00007 */
00008 
00009 #include "GTXabsl2EngineExecutor.h"
00010 #include "Tools/Debugging/Debugging.h"
00011 #include "Platform/GTAssert.h"
00012 #include "Platform/SystemCall.h"
00013 
00014 GTXabsl2EngineExecutor::GTXabsl2EngineExecutor (SolutionRequest::xabsl2EngineID id,
00015                                                 SolutionRequest::ModuleID module,
00016                                                 const unsigned long& frameNumber) 
00017 : pEngine(0), errorHandler(id), id(id), debugMode(executeOption), 
00018 module(module), profiler(id, &frameNumber)
00019 {
00020 }
00021 
00022 GTXabsl2EngineExecutor::~GTXabsl2EngineExecutor()
00023 {
00024   if (pEngine!=0) delete pEngine;
00025 }
00026 
00027 void GTXabsl2EngineExecutor::init(Xabsl2InputSource& input)
00028 {
00029   if (pEngine != 0) delete pEngine;
00030   watchedBooleanInputSymbols.clear();
00031   watchedDecimalInputSymbols.clear();
00032   watchedEnumeratedInputSymbols.clear();
00033   watchedEnumeratedOutputSymbols.clear();
00034   setEnumeratedOutputSymbols.clear();
00035   setEnumeratedOutputSymbolValues.clear();
00036   
00037   this->debugMode = executeRootOption;
00038   
00039   errorHandler.errorsOccurred = false; // reset the error handler
00040   
00041   unsigned long startTime = SystemCall::getCurrentSystemTime();
00042   unsigned long freeMemoryBefore = SystemCall::getFreeMem();
00043   
00044   pEngine = new Xabsl2Engine(errorHandler,&SystemCall::getCurrentSystemTime);
00045   
00046   registerSymbolsAndBasicBehaviors();
00047   profiler.registerSymbols(*pEngine);
00048   
00049   pEngine->createOptionGraph(input);
00050 
00051   if (!errorHandler.errorsOccurred)
00052   {
00053     errorHandler.message("created a new Engine (%li ms, %li bytes)", 
00054       SystemCall::getCurrentSystemTime() - startTime, 
00055       freeMemoryBefore - SystemCall::getFreeMem());
00056     profiler.init(*pEngine);
00057     
00058   }
00059 }
00060 
00061 void GTXabsl2EngineExecutor::executeEngine()
00062 {
00063   if (errorHandler.errorsOccurred)
00064   {
00065     executeIfEngineCouldNotBeCreated();
00066     return;
00067   }
00068   
00069   switch (debugMode)
00070   {
00071   case executeRootOption:
00072     pEngine->setRootOption();
00073     pEngine->execute();
00074     break;
00075   case executeOption:
00076     // execute the complete option graph beginning from the root option
00077     // (the root option can be changed from the Xabsl2 dialog 
00078     pEngine->execute();
00079     break;
00080   case executeBasicBehavior:
00081     // don't execute the option graph but only the basic behavior
00082     pEngine->executeSelectedBasicBehavior();
00083     break;
00084   }
00085   
00086   // do profiling (only when executing an engine)
00087   if(debugMode == executeRootOption || debugMode == executeOption){
00088     
00089     if(profiler.profilerCollectMode == GTXabsl2Profiler::collectProfiles)
00090       profiler.doProfiling(*pEngine);
00091     if(profiler.profilerWriteMode == GTXabsl2Profiler::writeProfiles && profiler.size()){
00092       profiler.recordCollectedLogs();
00093     }
00094     else if(profiler.profilerWriteMode == GTXabsl2Profiler::writeCompleteProfiles && profiler.size()){
00095       profiler.recordCompleteLog();
00096     }
00097     profiler.profilerWriteMode = GTXabsl2Profiler::dontWriteProfiles;
00098   }
00099   // Set the output symbols that were requested by the Xabsl2 Dialog
00100   for (int i=0; i<setEnumeratedOutputSymbols.getSize(); i++)
00101   {
00102     setEnumeratedOutputSymbols[i]->activeValue = setEnumeratedOutputSymbolValues[i];
00103     setEnumeratedOutputSymbols[i]->activeValueWasSet = true;
00104   }
00105   pEngine->setOutputSymbols();
00106   
00107   // send debug messages to the Xabsl2 Dialog if requested
00108   switch(module)
00109   {
00110   case SolutionRequest::behaviorControl:
00111     if (getDebugKeyTable().isActive(DebugKeyTable::sendXabsl2DebugMessagesForBehaviorControl)) 
00112       sendDebugMessage();
00113     break;
00114   case SolutionRequest::headControl:
00115     if (getDebugKeyTable().isActive(DebugKeyTable::sendXabsl2DebugMessagesForHeadControl)) 
00116       sendDebugMessage();
00117     break;
00118   default:
00119     ASSERT(false);
00120 
00121   }
00122 }
00123 
00124 void GTXabsl2EngineExecutor::sendDebugMessage()
00125 {
00126   int i, j;// char buf[200];
00127   
00128   Out& out = getDebugOut().bin;
00129   
00130   // send the id of the behavior contol solution
00131   out << (char)id;
00132   
00133   // send the name of the selected agent 
00134   out << pEngine->getSelectedAgentName();
00135   
00136   // watched decimal input symbols;
00137   out << watchedDecimalInputSymbols.getSize();
00138   for (i = 0; i < watchedDecimalInputSymbols.getSize(); i++)
00139     out << watchedDecimalInputSymbols[i]->n << watchedDecimalInputSymbols[i]->getValue();
00140   
00141   // watched boolean input symbols;
00142   out << watchedBooleanInputSymbols.getSize();
00143   for (i = 0; i < watchedBooleanInputSymbols.getSize(); i++)
00144     out << watchedBooleanInputSymbols[i]->n << (char)watchedBooleanInputSymbols[i]->getValue();
00145   
00146   // watched enumerated input symbols;
00147   out << watchedEnumeratedInputSymbols.getSize();
00148   for (i = 0; i < watchedEnumeratedInputSymbols.getSize(); i++)
00149   {
00150     Xabsl2EnumeratedInputSymbol* s = watchedEnumeratedInputSymbols[i];
00151     out << s->n;
00152     int v = s->getValue();
00153     for (j = 0; j < s->enumElements.getSize();j++)
00154     {
00155       if (s->enumElements[j]->v == v) break;
00156     }
00157     if (j==s->enumElements.getSize())
00158     {
00159       out << " ";
00160     }
00161     else
00162     {
00163       out << s->enumElements[j]->n; 
00164     }
00165   }
00166   
00167   // watched enumerated output symbols;
00168   out << watchedEnumeratedOutputSymbols.getSize();
00169   for (i=0; i<watchedEnumeratedOutputSymbols.getSize(); i++)
00170   {
00171     Xabsl2EnumeratedOutputSymbol* s = watchedEnumeratedOutputSymbols[i];
00172     out << s->n;
00173     for (j = 0; j < s->enumElements.getSize();j++)
00174     {
00175       if (s->enumElements[j]->v == s->activeValue) break;
00176     }
00177     if (j==s->enumElements.getSize())
00178     {
00179       out << " ";
00180     }
00181     else
00182     {
00183       out << s->enumElements[j]->n; 
00184     }
00185   }
00186   
00187   // the number of active options
00188   int numberOfActiveOptions = 0;
00189   const Xabsl2Option* option;  
00190   if (debugMode == executeOption || debugMode == executeRootOption)  
00191     // number of active options is 0 when basic behaviors are tested separately
00192   {
00193     option = pEngine->getRootOption();
00194     
00195     while (option!=0)
00196     {
00197       option = option->activeState->subsequentOption;
00198       numberOfActiveOptions++;
00199     }
00200   }
00201   out << numberOfActiveOptions;
00202   
00203   // For each active option: 
00204   // name, duration of activation, active state, duration of state activation
00205   if (debugMode == executeOption || debugMode == executeRootOption)  
00206   {
00207     option = pEngine->getRootOption();
00208     
00209     while (option!=0)
00210     {
00211       out << option->n << option->timeOfOptionExecution 
00212         << option->activeState->n << option->activeState->timeOfStateExecution; 
00213       
00214       // the number of parameters of the executed option
00215       int numberOfOptionParameters = option->parameters.getSize();
00216       out << (char)numberOfOptionParameters;
00217       
00218       for (i = 0; i < numberOfOptionParameters; i++)
00219       {
00220         out << option->parameters.getName(i);
00221         out << option->parameters[i];
00222       }
00223       
00224       option = option->activeState->subsequentOption;
00225     }
00226   }
00227   
00228   // the executed basic behavior
00229   const Xabsl2BasicBehavior* bb = pEngine->getSelectedBasicBehavior();
00230   out << bb->n;
00231   
00232   // the number of parameters of the executed basic behavior
00233   char numberOfBasicBehaviorParameters = bb->parameters.getSize();
00234   out << numberOfBasicBehaviorParameters;
00235   
00236   // sends for each parameter of the executed basic behavior the name and the value
00237   for (i=0;i<numberOfBasicBehaviorParameters;i++)
00238   {
00239     out << bb->parameters.getName(i);
00240     out << bb->parameters[i];
00241   }
00242   
00243   // send the generated main action as a string
00244   char buf[200];
00245   printGeneratedMainActionToString(buf);
00246   out << buf;
00247   
00248   getDebugOut().finishMessage(idXabsl2DebugMessage);
00249 }
00250 
00251 bool GTXabsl2EngineExecutor::handleMessage(InMessage& message)
00252 {
00253   switch (message.getMessageID())
00254   {
00255   case idXabsl2DebugRequest:
00256     {
00257       // temporary variables
00258       char buf[100];
00259       char buf2[100];
00260       double valueDouble;
00261       char c;
00262       int i, numberOfWatchedInputSymbols, numberOfWatchedEnumeratedOutputSymbols;
00263       
00264       message.bin >> c;
00265       
00266       if ((SolutionRequest::xabsl2EngineID)c != this->id)
00267       {
00268         // the request was sent for another engine
00269         return true;
00270       }
00271 
00272       // clear the old pointer arrays
00273       watchedDecimalInputSymbols.clear();
00274       watchedBooleanInputSymbols.clear();
00275       watchedEnumeratedInputSymbols.clear();
00276       watchedEnumeratedOutputSymbols.clear();
00277       setEnumeratedOutputSymbols.clear();
00278       setEnumeratedOutputSymbolValues.clear();
00279       
00280       // input symbols
00281       message.bin >> numberOfWatchedInputSymbols;
00282       
00283       for (i=0; i< numberOfWatchedInputSymbols; i++)
00284       {
00285         message.bin >> c;
00286         message.bin >> buf;
00287         switch(c)
00288         {
00289         case 'd':
00290           if (pEngine->existsDecimalInputSymbol(buf))
00291             watchedDecimalInputSymbols.append(buf,pEngine->getDecimalInputSymbol(buf));
00292           break;
00293         case 'b':
00294           if (pEngine->existsBooleanInputSymbol(buf))
00295             watchedBooleanInputSymbols.append(buf,pEngine->getBooleanInputSymbol(buf));
00296           break;
00297         case 'e':
00298           if (pEngine->existsEnumeratedInputSymbol(buf))
00299             watchedEnumeratedInputSymbols.append(buf,pEngine->getEnumeratedInputSymbol(buf));
00300           break;
00301         }
00302       }
00303       
00304       // enumerated output symbols
00305       message.bin >> numberOfWatchedEnumeratedOutputSymbols;
00306       for (i=0; i< numberOfWatchedEnumeratedOutputSymbols; i++)
00307       {
00308         message.bin >> buf;
00309         if (pEngine->existsEnumeratedOutputSymbol(buf))
00310           watchedEnumeratedOutputSymbols.append(buf,pEngine->getEnumeratedOutputSymbol(buf));
00311       }
00312       // 
00313       char mode;
00314       char numberOfParameters;
00315       message.bin >> mode;
00316       switch (mode)
00317       {
00318       case 'b':
00319         debugMode = executeBasicBehavior;
00320         message.bin >> buf;
00321         if(!pEngine->setSelectedBasicBehavior(buf))
00322         {
00323           OUTPUT(idText, text, "BasicBehavior " << buf << " does not exist");
00324         }
00325         
00326         message.bin >> numberOfParameters;
00327         for(i = 0; i < numberOfParameters; i++)
00328         {
00329           message.bin >> buf2;
00330           message.bin  >> valueDouble;
00331           pEngine->setBasicBehaviorParameter(buf, buf2, valueDouble);
00332         }
00333         break;
00334       case 'o':
00335         debugMode = executeOption;
00336         message.bin >> buf;
00337         if(!pEngine->setRootOption(buf))
00338         {
00339           OUTPUT(idText, text, "Option " << buf << " does not exist");
00340         }
00341         message.bin >> numberOfParameters;
00342         for(i = 0; i < numberOfParameters; i++)
00343         {
00344           message.bin >> buf2;
00345           message.bin  >> valueDouble;
00346           pEngine->setOptionParameter(buf, buf2, valueDouble);
00347         }
00348         break;
00349       case 'd':
00350         debugMode = executeRootOption;
00351         break;
00352       }
00353       
00354       // changed output symbols
00355       char numberOfChangedOutputSymbols;
00356       message.bin >> numberOfChangedOutputSymbols;
00357       for(i = 0; i < numberOfChangedOutputSymbols; i++)
00358       {
00359         message.bin >> buf;  //name
00360         message.bin >> buf2; // value
00361         if (!pEngine->existsEnumeratedOutputSymbol(buf))
00362         {
00363           OUTPUT(idText,text,"Enumerated output symbol " << buf << " does not exist");
00364         }
00365         else
00366         {
00367           Xabsl2EnumeratedOutputSymbol* pSymbol = pEngine->getEnumeratedOutputSymbol(buf);
00368           int value = 0;
00369           
00370           setEnumeratedOutputSymbols.append(buf,pSymbol);
00371           
00372           if (!pSymbol->enumElements.exists(buf2))
00373           {
00374             OUTPUT(idText,text,"Enum element " << buf2 << " for symbol " << buf 
00375               << " does not exist");
00376           }
00377           else
00378           {
00379             value = pSymbol->enumElements.getElement(buf2)->v;
00380           }
00381           setEnumeratedOutputSymbolValues.append(buf,value);
00382         }
00383       }
00384       
00385       return true;
00386     }
00387   case idXabsl2IntermediateCode:
00388     {
00389       char c;
00390       message.bin >> c;
00391       
00392       if ((SolutionRequest::xabsl2EngineID)c != this->id)
00393       {
00394         // the request was sent for another engine
00395         return true;
00396       }
00397 
00398       Xabsl2MessageInputSource input(message.config);
00399       init(input);
00400       return true;
00401     }
00402   default:
00403     return false;
00404   }
00405 }
00406 
00407 void GTXabsl2EngineExecutor::setSelectedAgent(const char* name)
00408 {
00409   if (pEngine != 0) 
00410     pEngine->setSelectedAgent(name);
00411 }
00412 
00413 GTXabsl2ErrorHandler::GTXabsl2ErrorHandler(SolutionRequest::xabsl2EngineID id)
00414 : id (id)
00415 {
00416 }
00417 
00418 void GTXabsl2ErrorHandler::printError(const char* text)
00419 {
00420   OUTPUT(idText, text, "(" 
00421     << SolutionRequest::getXabsl2EngineIDName(id)
00422     << " Xabsl2Engine) error: " << text);
00423 }
00424 
00425 void GTXabsl2ErrorHandler::printMessage(const char* text)
00426 {
00427   OUTPUT(idText, text, "(" 
00428     << SolutionRequest::getXabsl2EngineIDName(id)
00429     << " Xabsl2Engine): " << text);
00430 }
00431 
00432 Xabsl2FileInputSource::Xabsl2FileInputSource(const char* fileName)
00433 : Xabsl2NamedItem(fileName), file(0)
00434 {
00435 }
00436 
00437 Xabsl2FileInputSource::~Xabsl2FileInputSource()
00438 {
00439   if (file!=0) delete file;
00440 }
00441 
00442 bool Xabsl2FileInputSource::open()
00443 {
00444   if (file==0) file=new InConfigFile(n);
00445   return (file!=0 && file->exists());
00446 }
00447 
00448 
00449 void Xabsl2FileInputSource::close()
00450 {
00451   if (file!=0) delete file;
00452   file = 0;
00453 }
00454 
00455 double Xabsl2FileInputSource::readValue()
00456 {
00457   double d=0;
00458   if (file!=0) *file >> d;
00459   return d;
00460 }
00461 
00462 bool Xabsl2FileInputSource::readString(char* destination, int maxLength)
00463 {
00464   if (file!=0) *file >> destination;
00465   return true;
00466 }
00467 
00468 Xabsl2MessageInputSource::Xabsl2MessageInputSource(InConfigMessage& message)
00469 : message(message)
00470 {
00471 }
00472 
00473 double Xabsl2MessageInputSource::readValue()
00474 {
00475   double d;
00476   message >> d;
00477   return d;
00478 }
00479 
00480 bool Xabsl2MessageInputSource::readString(char* destination, int maxLength)
00481 {
00482   message >> destination;
00483   return true;
00484 }
00485 
00486 
00487 /*
00488 * Change log :
00489 * 
00490 * $Log: GTXabsl2EngineExecutor.cpp,v $
00491 * Revision 1.5  2004/06/24 17:01:39  spranger
00492 * profiler: no log-write-out-attempts when log is empty
00493 *
00494 * Revision 1.4  2004/06/14 17:16:06  spranger
00495 * changed profiler interface
00496 *
00497 * Revision 1.3  2004/05/24 16:33:08  spranger
00498 * bugfix
00499 *
00500 * Revision 1.2  2004/05/23 18:59:06  spranger
00501 * added framenumber to GTXabsl2EngineExecutor for profiler,
00502 * added profiler
00503 *
00504 * Revision 1.1.1.1  2004/05/22 17:37:40  cvsadm
00505 * created new repository GT2004_WM
00506 *
00507 * Revision 1.3  2004/05/18 14:28:21  loetzsch
00508 * now Xabsl2 intermediate code can be sent to different modules
00509 *
00510 * Revision 1.2  2004/05/17 18:35:23  loetzsch
00511 * continued support for multiple Xabsl engines in different modules
00512 *
00513 * Revision 1.1  2004/05/14 11:37:08  loetzsch
00514 * support for multiple xabsl2engines in different modules
00515 * preliminary GT2004HeadControl (does not work at all)
00516 *
00517 */
00518 

Generated on Thu Sep 23 19:57:42 2004 for GT2004 by doxygen 1.3.6