00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "Xabsl2Option.h"
00010
00011 Xabsl2Statement* Xabsl2Statement::createStatement(Xabsl2InputSource& input,
00012 Xabsl2Option* subsequentOption,
00013 Xabsl2ErrorHandler& errorHandler,
00014 Xabsl2Array<Xabsl2State*>& states,
00015 Xabsl2Array<double>& parameters,
00016 Xabsl2Symbols& symbols,
00017 unsigned long& timeOfOptionExecution,
00018 unsigned long& timeOfStateExecution)
00019 {
00020 char c[100];
00021
00022 input.readString(c,1);
00023
00024 switch (*c)
00025 {
00026 case 't':
00027 return new Xabsl2TransitionToState(input, errorHandler, states);
00028 case 'i':
00029 return new Xabsl2IfElseBlock(input, subsequentOption,errorHandler, states,
00030 parameters, symbols, timeOfOptionExecution, timeOfStateExecution);
00031 default:
00032 errorHandler.error("Xabsl2Statement::create(): unknown type \"%c\"",*c);
00033 return 0;
00034 }
00035 }
00036
00037 Xabsl2Statement::~Xabsl2Statement()
00038 {
00039 }
00040
00041 Xabsl2IfElseBlock::Xabsl2IfElseBlock(Xabsl2InputSource& input,
00042 Xabsl2Option* subsequentOption,
00043 Xabsl2ErrorHandler& errorHandler,
00044 Xabsl2Array<Xabsl2State*>& states,
00045 Xabsl2Array<double>& parameters,
00046 Xabsl2Symbols& symbols,
00047 unsigned long& timeOfOptionExecution,
00048 unsigned long& timeOfStateExecution) :
00049 ifCondition(0), ifStatement(0), elseStatement(0)
00050 {
00051
00052
00053 XABSL2_DEBUG_INIT(errorHandler.message("creating if statement"));
00054
00055 ifCondition = Xabsl2BooleanExpression::create(input, subsequentOption,errorHandler,
00056 parameters, symbols, timeOfOptionExecution, timeOfStateExecution);
00057 if (errorHandler.errorsOccurred)
00058 {
00059 errorHandler.error("Xabsl2IfElseBlock::Xabsl2IfElseBlock(): could not create if condition");
00060 return;
00061 }
00062
00063 ifStatement = Xabsl2Statement::createStatement(input,subsequentOption,errorHandler,
00064 states,parameters, symbols, timeOfOptionExecution, timeOfStateExecution);
00065 if (errorHandler.errorsOccurred)
00066 {
00067 errorHandler.error("Xabsl2IfElseBlock::Xabsl2IfElseBlock(): could not create if statement");
00068 return;
00069 }
00070
00071
00072 int numberOfElseIfStatements = (int)input.readValue();
00073
00074 for (int i=0;i<numberOfElseIfStatements; i++)
00075 {
00076 XABSL2_DEBUG_INIT(errorHandler.message("creating else-if statement"));
00077
00078 elseIfConditions.append("else-if",Xabsl2BooleanExpression::create(input, subsequentOption,
00079 errorHandler, parameters, symbols,timeOfOptionExecution, timeOfStateExecution));
00080 if (errorHandler.errorsOccurred)
00081 {
00082 errorHandler.error("Xabsl2IfElseBlock::Xabsl2IfElseBlock(): could not create else-if condition");
00083 return;
00084 }
00085
00086 elseIfStatements.append("else-if",Xabsl2Statement::createStatement(input,subsequentOption,
00087 errorHandler,states, parameters, symbols, timeOfOptionExecution, timeOfStateExecution));
00088 if (errorHandler.errorsOccurred)
00089 {
00090 errorHandler.error("Xabsl2IfElseBlock::Xabsl2IfElseBlock(): could not create else-if statement");
00091 return;
00092 }
00093 }
00094
00095
00096 XABSL2_DEBUG_INIT(errorHandler.message("creating else statement"));
00097
00098 elseStatement = Xabsl2Statement::createStatement(input, subsequentOption,
00099 errorHandler, states, parameters, symbols, timeOfOptionExecution, timeOfStateExecution);
00100 if (errorHandler.errorsOccurred)
00101 errorHandler.error("Xabsl2IfElseBlock::Xabsl2IfElseBlock(): could not create else statement");
00102
00103 }
00104
00105 Xabsl2IfElseBlock::~Xabsl2IfElseBlock()
00106 {
00107 if (ifCondition != 0) delete ifCondition;
00108 if (ifStatement != 0) delete ifStatement;
00109
00110 int i;
00111 for (i=0; i<elseIfStatements.getSize(); i++)
00112 {
00113 if (elseIfConditions[i] != 0)
00114 delete elseIfConditions[i];
00115 if (elseIfStatements[i] != 0)
00116 delete elseIfStatements[i];
00117 }
00118
00119 if (elseStatement != 0) delete elseStatement;
00120 }
00121
00122 Xabsl2State* Xabsl2IfElseBlock::getNextState()
00123 {
00124 if (ifCondition->getValue()) return ifStatement->getNextState();
00125
00126 for (int i=0; i<elseIfConditions.getSize(); i++)
00127 {
00128 if (elseIfConditions[i]->getValue()) return elseIfStatements[i]->getNextState();
00129 }
00130
00131 return elseStatement->getNextState();
00132 }
00133
00134 Xabsl2TransitionToState::Xabsl2TransitionToState(Xabsl2InputSource& input,
00135 Xabsl2ErrorHandler& errorHandler,
00136 Xabsl2Array<Xabsl2State*>& states)
00137 {
00138 char buf[100];
00139 input.readString(buf,99);
00140
00141 nextState = states.getElement(buf);
00142
00143 XABSL2_DEBUG_INIT(errorHandler.message("creating a transition to state \"%s\"",nextState->n));
00144 }
00145
00146 Xabsl2State* Xabsl2TransitionToState::getNextState()
00147 {
00148 return nextState;
00149 }
00150
00151 Xabsl2State::Xabsl2State(const char* name, Xabsl2ErrorHandler& errorHandler,
00152 unsigned long (*pTimeFunction)())
00153 : Xabsl2NamedItem(name), errorHandler(errorHandler), decisionTree(0),
00154 targetState(false), pTimeFunction(pTimeFunction)
00155 {
00156 }
00157
00158 Xabsl2State::~Xabsl2State()
00159 {
00160 if (decisionTree != 0) delete decisionTree;
00161 for (int i=0; i<parameterValues.getSize(); i++)
00162 if (parameterValues[i]!=0)
00163 delete parameterValues[i];
00164 }
00165
00166 void Xabsl2State::create(Xabsl2InputSource& input,
00167 Xabsl2Array<Xabsl2Option*>& options,
00168 Xabsl2Array<Xabsl2BasicBehavior&>& basicBehaviors,
00169 Xabsl2Array<Xabsl2State*>& states,
00170 Xabsl2Array<double>& parameters,
00171 Xabsl2Symbols& symbols,
00172 unsigned long& timeOfOptionExecution)
00173 {
00174 XABSL2_DEBUG_INIT(errorHandler.message("creating state \"%s\"",n));
00175
00176 char c[100]; char buf[100];
00177
00178
00179 input.readString(c,1);
00180 if (*c == '1')
00181 {
00182 targetState = true;
00183 }
00184
00185
00186 input.readString(c,1);
00187 input.readString(buf,99);
00188 switch (*c)
00189 {
00190 case 'o':
00191 subsequentOption = options.getElement(buf);
00192 subsequentBasicBehavior = 0;
00193 break;
00194 case 'b':
00195 if (!basicBehaviors.exists(buf))
00196 {
00197 errorHandler.error("Xabsl2State::create(): the subsequent basic behavior \"%s\" was not registered",buf);
00198 return;
00199 }
00200 subsequentBasicBehavior = &basicBehaviors.getElement(buf);
00201 subsequentOption = 0;
00202 break;
00203 }
00204
00205
00206 int numberOfParameters = (int)input.readValue();
00207
00208 int i;
00209 for (i = 0; i<numberOfParameters; i++)
00210 {
00211 input.readString(buf,99);
00212 XABSL2_DEBUG_INIT(errorHandler.message("creating expession for set parameter \"%s\"",buf));
00213
00214 if (subsequentOption != 0)
00215 {
00216 if (!subsequentOption->parameters.exists(buf))
00217 {
00218 errorHandler.error("Xabsl2State::create(): the subsequent option does not have a parameter \"%s\"",buf);
00219 return;
00220 }
00221 parametersOfSubsequentBehavior.append(buf,&subsequentOption->parameters.getPElement(buf)->e);
00222 }
00223 else
00224 {
00225 if (!subsequentBasicBehavior->parameters.exists(buf))
00226 {
00227 errorHandler.error("Xabsl2State::create(): the subsequent basic behavior does not have a parameter \"%s\"",buf);
00228 return;
00229 }
00230 parametersOfSubsequentBehavior.append(buf,&subsequentBasicBehavior->parameters.getPElement(buf)->e);
00231 }
00232
00233 parameterValues.append(buf,Xabsl2DecimalExpression::create(input,subsequentOption,errorHandler,parameters,symbols,timeOfOptionExecution,timeOfStateExecution));
00234 if (errorHandler.errorsOccurred)
00235 {
00236 errorHandler.error("Xabsl2State::create(): could not create decimal expression for parameter \"%s\"",buf);
00237 return;
00238 }
00239 }
00240
00241
00242 int numberOfSetOutputSymbol = (int)input.readValue();
00243
00244 for(i = 0; i< numberOfSetOutputSymbol; i++)
00245 {
00246 input.readString(buf,99);
00247 XABSL2_DEBUG_INIT(errorHandler.message("creating reference to enumerated output symbol \"%s\"",buf));
00248
00249 if (!symbols.existsEnumeratedOutputSymbol(buf))
00250 {
00251 errorHandler.error("Xabsl2State::create(): enumerated output symbol \"%s\" does not exist",buf);
00252 return;
00253 }
00254 outputSymbols.append(buf,symbols.getEnumeratedOutputSymbol(buf));
00255 input.readString(buf,99);
00256
00257 if (!outputSymbols[i]->enumElements.exists(buf))
00258 {
00259 errorHandler.error("Xabsl2State::create(): enum element \"%s\" of enumerated output symbol \"%s\" does not exist",buf, outputSymbols[i]->n);
00260 return;
00261 }
00262 outputSymbolValues.append(buf,outputSymbols[i]->enumElements.getElement(buf)->v);
00263 }
00264
00265
00266 decisionTree = Xabsl2Statement::createStatement(input,subsequentOption,errorHandler,
00267 states,parameters, symbols, timeOfOptionExecution,timeOfStateExecution);
00268 if (errorHandler.errorsOccurred)
00269 errorHandler.error("Xabsl2State::create(): could not create decision tree for state \"%s\"",n);
00270 }
00271
00272 Xabsl2State* Xabsl2State::getNextState()
00273 {
00274 timeOfStateExecution = pTimeFunction() - timeWhenStateWasActivated;
00275
00276 Xabsl2State* nextState = decisionTree->getNextState();
00277
00278 return nextState;
00279 }
00280
00281 void Xabsl2State::setOutputSymbols()
00282 {
00283 int i;
00284
00285
00286 if (subsequentBasicBehavior!=0)
00287 {
00288 for (i=0;i<subsequentBasicBehavior->parameters.getSize();i++)
00289 {
00290 subsequentBasicBehavior->parameters[i] = 0;
00291 }
00292 }
00293 else
00294 {
00295 for (i=0;i<subsequentOption->parameters.getSize();i++)
00296 {
00297 subsequentOption->parameters.setElement(i,0);
00298 }
00299 }
00300
00301
00302 for (i=0; i<parametersOfSubsequentBehavior.getSize(); i++)
00303 {
00304 *parametersOfSubsequentBehavior[i] = parameterValues[i]->getValue();
00305 }
00306
00307 for (i = 0; i < outputSymbols.getSize(); i++)
00308 {
00309 outputSymbols[i]->activeValue = outputSymbolValues[i];
00310 outputSymbols[i]->activeValueWasSet = true;
00311 }
00312 }
00313
00314 void Xabsl2State::reset()
00315 {
00316 timeWhenStateWasActivated = pTimeFunction();
00317 timeOfStateExecution = 0;
00318 }
00319
00320 bool Xabsl2State::isTargetState() const
00321 {
00322 return targetState;
00323 }
00324
00325 Xabsl2Option::Xabsl2Option(const char* name,
00326 Xabsl2InputSource& input,
00327 Xabsl2ErrorHandler& errorHandler,
00328 unsigned long (*pTimeFunction)())
00329 : Xabsl2NamedItem(name), activeState(0), optionIsActive(false), optionWasActive(false),
00330 initialState(0), errorHandler(errorHandler),
00331 pTimeFunction(pTimeFunction)
00332 {
00333 int numberOfOptionParameters = (int)input.readValue();
00334 char buf[100];
00335 for (int i=0; i< numberOfOptionParameters; i++)
00336 {
00337 input.readString(buf,99);
00338 XABSL2_DEBUG_INIT(errorHandler.message("registering option parameter \"%s\" for option \"%s\"",buf,n));
00339
00340 parameters.append(buf,0);
00341 }
00342 }
00343
00344 Xabsl2Option::~Xabsl2Option()
00345 {
00346 for (int i=0;i<states.getSize();i++)
00347 if (states[i]!=0)
00348 delete states[i];
00349 }
00350
00351 void Xabsl2Option::create(Xabsl2InputSource& input,
00352 Xabsl2Array<Xabsl2Option*>& options,
00353 Xabsl2Array<Xabsl2BasicBehavior&>& basicBehaviors,
00354 Xabsl2Symbols& symbols
00355 )
00356 {
00357 int i;
00358
00359
00360 int numberOfStates = (int)input.readValue();
00361
00362 char stateName[100];
00363
00364
00365 for (i=0; i< numberOfStates; i++)
00366 {
00367 input.readString(stateName, 99);
00368 states.append(stateName, new Xabsl2State(stateName,errorHandler,pTimeFunction));
00369 }
00370 XABSL2_DEBUG_INIT(errorHandler.message("Xabsl2Option::create(): registered %i states",numberOfStates));
00371
00372
00373 input.readString(stateName,99);
00374 initialState = states.getElement(stateName);
00375 activeState = initialState;
00376
00377 XABSL2_DEBUG_INIT(errorHandler.message("Xabsl2Option::create(): initial state: \"%s\"",initialState->n));
00378
00379
00380 for (i=0; i< numberOfStates; i++)
00381 {
00382 states[i]->create(input, options, basicBehaviors, states, parameters, symbols, timeOfOptionExecution);
00383 if (errorHandler.errorsOccurred)
00384 {
00385 errorHandler.error("Xabsl2Option::create(): could not create state \"%s\"",states[i]->n);
00386 return;
00387 }
00388 }
00389
00390 }
00391
00392 void Xabsl2Option::execute()
00393 {
00394 if (!optionWasActive)
00395 {
00396 timeWhenOptionWasActivated = pTimeFunction();
00397 activeState = initialState;
00398 activeState->reset();
00399 }
00400 optionIsActive = true;
00401 timeOfOptionExecution = pTimeFunction() - timeWhenOptionWasActivated;
00402
00403 Xabsl2State* newState = activeState->getNextState();
00404
00405 if (newState != activeState)
00406 {
00407 newState->reset();
00408 }
00409 activeState = newState;
00410 activeState->setOutputSymbols();
00411 }
00412
00413 bool Xabsl2Option::getOptionReachedATargetState() const
00414 {
00415 if (optionWasActive && activeState->isTargetState())
00416 {
00417 return true;
00418 }
00419 else
00420 {
00421 return false;
00422 }
00423 }
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500
00501
00502
00503
00504
00505
00506
00507
00508
00509
00510
00511
00512
00513
00514
00515