00001 /* 00002 * This file is part of openMask © INRIA, CNRS, Universite de Rennes 1 1993-2002, thereinafter the Software 00003 * 00004 * The Software has been developped within the Siames Project. 00005 * INRIA, the University of Rennes 1 and CNRS jointly hold intellectual property rights 00006 * 00007 * The Software has been registered with the Agence pour la Protection des 00008 * Programmes (APP) under registration number IDDN.FR.001.510008.00.S.P.2001.000.41200 00009 * 00010 * This file may be distributed under the terms of the Q Public License 00011 * version 1.0 as defined by Trolltech AS of Norway and appearing in the file 00012 * LICENSE.QPL included in the packaging of this file. 00013 * 00014 * Licensees holding valid specific licenses issued by INRIA, CNRS or Université de Rennes 1 00015 * for the software may use this file in accordance with that specific license 00016 * 00017 */ 00018 #ifndef PsControllerHEADER 00019 #define PsControllerHEADER 00020 00021 00022 #include <Psn.h> 00023 #include <PsNameToPointerMap.h> 00024 00025 class PsnDoubleList; 00026 00027 class PsName; 00028 #include <PsSimulatedObject.h> 00029 class PsObjectDescriptor; 00030 class PsDuplicatedObject; 00031 #include <PsnReferenceObjectHandle.h> 00032 class PsnMirrorObjectHandle; 00033 class PsnProcess; 00034 template <typename Type> class PsAbstractInput; 00035 class PsnScheduler ; 00036 class PsnSemaphore ; 00037 class PsMultipleConfigurationParameter ; 00038 #include <PsKernelObjectAbstractFactory.h> 00039 #include "PsnSignalDispatcher.h" 00040 00048 class PsController : public PsSimulatedObject 00049 { 00050 public: 00055 PsController(PsObjectDescriptor & simulationTree, 00056 const PsDate & initialDate); 00057 00058 00061 virtual ~PsController(); 00062 00063 /* Init 00064 * send MaskStart to all initial objects 00065 */ 00066 virtual void init(); 00067 00071 virtual void run(); 00072 00077 template <typename Type> list<const PsObjectDescriptor *> * listDescendantsOfType(const PsName & objectName) 00078 { 00079 const PsObjectDescriptor * objectDescriptor = getObjectDescriptor ().findDescendantNamed ( objectName ) ; 00080 if ( objectDescriptor != NULL ) 00081 { 00082 return objectDescriptor->template listDescendantsOfType<Type> () ; 00083 } 00084 else 00085 { 00086 return new list<const PsObjectDescriptor *>() ; 00087 } 00088 } 00089 00094 template <typename Type> list<const PsObjectDescriptor * > * listBrothersOfType (const PsName objectName) 00095 { 00096 const PsObjectDescriptor * objectDescriptor = getObjectDescriptor ().findDescendantNamed ( objectName ) ; 00097 if ( objectDescriptor != NULL ) 00098 { 00099 objectDescriptor = objectDescriptor->getFathersDescriptor() ; 00100 if ( objectDescriptor != NULL ) 00101 { 00102 return objectDescriptor->template listBrothersOfType<Type> () ; 00103 } 00104 else 00105 { 00106 return new list<const PsObjectDescriptor *>() ; 00107 } 00108 } 00109 else 00110 { 00111 return new list<const PsObjectDescriptor *>() ; 00112 } 00113 } 00114 00115 protected: 00118 virtual void computeNextSimulationStep(); 00119 00123 virtual void scheduleObject(PsnReferenceObjectHandle * ref); 00124 00125 public: 00131 virtual PsFrequency computeAdequateFrequency(const PsFrequency & suggestedFrequency); 00132 00139 virtual void runControllersStep(PsnReferenceObjectHandle * objectHandle); 00140 00144 virtual void compute(); 00145 00147 virtual void finish() ; 00148 protected: 00152 PsMultipleConfigurationParameter * getSchedulingParametersOfObject(PsObjectDescriptor &) ; 00153 00154 00161 PsSimulatedObject * createDescribedObject(const PsObjectDescriptor * description); 00162 00165 virtual void setProcessOfDescriptor ( PsObjectDescriptor & objectDescription, const PsName & newProcessName ) ; 00166 public: 00170 static void error (const char * mess) ; 00171 00172 00174 static PsDate initialSimulationDate ; 00175 00176 00180 void showDateAndStepNumber(bool show = true); 00181 00182 00184 virtual const PsDate & getSimulatedDate () const ; 00185 00186 00188 virtual int getCycleFrequency() const ; 00189 00190 00192 virtual int getCyclePeriod() const ; 00193 00200 virtual void createObject(const PsObjectDescriptor & newObjectDescription, const PsName & fathersName); 00201 00202 00210 virtual void destroyObject(const PsName & name, bool recursively); 00211 00212 00218 virtual void changeObjectsFather(const PsName & name , const PsName & newFather) ; 00219 00220 00226 virtual void changeObjectsFather(PsObjectDescriptor * object, PsObjectDescriptor * newFather) ; 00227 00228 protected: 00237 virtual void computeScheduling (bool fromOriginal) ; 00238 00239 00242 virtual void sendInitialEventsTo ( PsnReferenceObjectHandle & objectHandle, const PsDate & dateOfMaskStart) ; 00243 00244 00251 virtual void deleteObject(PsObjectDescriptor * objectDescription); 00252 00253 00259 virtual PsnObjectHandle * removeObjectFromDataStructures(const PsName &); 00260 00261 00262 public: 00263 00268 virtual PsDuplicatedObject * getPointerToDuplicatedObjectNamed (const PsName & name); 00269 00270 00277 virtual PsSimulatedObject * getPointerToSimulatedObjectNamed (const PsName & name); 00278 00279 protected: 00280 friend class PsInputNT; 00281 friend class PsSimulatedObject; 00282 00286 virtual void processNewObjectDeclaration ( PsObjectDescriptor & declaration, const PsDate & declarationDate ) ; 00287 00291 virtual PsnReferenceObjectHandle * createReferenceObject (const PsObjectDescriptor * idObjet); 00292 00293 public: 00299 virtual const PsObjectDescriptor & getObjectDescriptorOfObject(const PsName & objectName) ; 00300 00301 00302 // calculate least common multiplier 00303 static int lcm (const int a, const int b) ; 00304 00305 00306 // calculate greatest common divisor 00307 static int gcd (const int a, const int b) ; 00308 00309 00310 protected: 00313 virtual PsnScheduler * createScheduler() ; 00314 00318 virtual void scheduleControlledObjects(); 00319 00320 00323 virtual void advanceSimulatedDate(); 00324 00325 00329 virtual void createControlledObjects(const PsObjectDescriptor * subTree); 00330 00331 00334 PsNameToPointerMap<PsnReferenceObjectHandle> _referenceObjectsMap ; 00335 00336 00340 PsObjectDescriptor & _simulationTree; 00341 00342 00344 unsigned long int _numberOfSimulatedSteps; 00345 00346 virtual void setCycleFrequency(int newFrequency) ; 00347 00349 PsFrequency _stepFrequency; 00350 00352 int _cycleFrequency; 00353 00355 int _cyclePeriod ; 00356 00359 int _nbStepsByCycle; 00360 00364 int _stepPeriod; 00365 00366 00368 PsDate _date; 00369 00370 00372 bool _showDateAndStepNumber; 00373 00374 00376 PsnReferenceObjectHandle::SimulatedObjectComputingState * _computeStatePointer ; 00377 00378 00379 public: 00381 virtual void actOnSystemEvent ( PsEvent * event ) ; 00382 00383 00387 virtual void reactToControlledObjectsSystemEvents(); 00388 00389 00392 virtual void processStartEventOf(PsnReferenceObjectHandle * objectHandle); 00393 00394 00397 virtual void processDeleteEventOf(PsnReferenceObjectHandle * objectHandle); 00398 00399 00403 virtual void hasEventsToProcess(PsnReferenceObjectHandle * referenceObjectHandle); 00404 00405 00408 virtual void postponeEventProcessing ( PsnReferenceObjectHandle * referenceObjectHandle ); 00409 00410 00414 virtual void noActivationNeededFor ( PsnReferenceObjectHandle * referenceObjectHandle ) ; 00415 00416 00419 virtual void addToPendingEvents( PsEvent * ) ; 00420 00421 00429 virtual bool addToPendingRegistrations(const PsEventIdentifier & sig, 00430 const PsName & producer, 00431 const PsEventIdentifier & eventId, 00432 const PsName & registrant) ; 00433 00434 00441 virtual bool removeFromPendingRegistrations ( const PsEventIdentifier & sig, 00442 const PsName & producer, 00443 const PsName & registrant ) ; 00444 00447 virtual bool processEvent(PsEvent *); 00448 00449 00452 virtual void processEventsOfSuspendedObjects(); 00453 00454 00459 virtual void broadcastEventsForSignal (PsEvent & event, const PsEventIdentifier & sigId); 00460 00461 00467 virtual bool receiveRegistrationForSignal(const PsEventIdentifier & sigId, 00468 const PsName & registrant, 00469 const PsEventIdentifier & eventId); 00470 00471 00476 virtual bool receiveCancellationForSignal ( const PsEventIdentifier & sigId , 00477 const PsName & registrant ) ; 00478 protected: 00481 PsnSignalDispatcher _controledObjectsSignalsDispatcher ; 00482 00484 virtual void setComputingState(PsnReferenceObjectHandle * , PsnReferenceObjectHandle::SimulatedObjectComputingState ) const ; 00485 00486 protected: 00488 bool _forcedCompute ; 00489 00491 PsnScheduler * _scheduler ; 00492 00496 list<PsnReferenceObjectHandle *> * _objectsNeedingActivationList [2]; 00497 00499 int _currentListOfObjectsNeedingActivation ; 00500 00502 virtual void switchSystemEventList() ; 00503 00505 list <PsEvent *> * _systemEventsList [ 2 ] ; 00506 00508 unsigned int _currentWritableSystemEventsList ; 00509 00511 list <PsnReferenceObjectHandle * > _listOfObjectsWithPostPonedEvents ; 00512 00514 PsnMutexLock _mutexSystemEventsList ; 00515 00517 map <PsName, list<PsEvent *> > _pendingEventsList ; 00518 00520 PsnMutexLock _mutexPendingDataStructures ; 00521 00523 map <PsName, PsnSignalDispatcher *> _pendingRegistrationRequests ; 00524 00526 virtual void purgeMemoryFromOldEvents ( const PsDate & dateOfOldestKept ) ; 00527 00529 virtual PsDate getPurgeDate() ; 00530 00531 00536 list <pair <PsDate, PsnObjectHandle *> > _deletedObjectHandles ; 00537 00538 protected: 00540 //PsnReferenceObjectHandle * _objectHandle ; 00541 00545 virtual int getOutputHistorySize(void) ; 00546 00547 00552 virtual PsnReferenceObjectHandle * createReferenceObjectHandle(PsSimulatedObject & obj); 00553 00560 virtual PsnReferenceObjectHandle * newPsnReferenceObjectHandle(PsSimulatedObject & object, 00561 PsController & controller, 00562 PsnSignalDispatcher * signalDispatcher); 00563 00565 virtual void deleteObjectHandle ( PsnObjectHandle * objectHandle ) ; 00566 00567 public: 00573 static bool setKernelObjectFactory ( PsKernelObjectAbstractFactory * aFactory ) ; 00574 00576 static PsKernelObjectAbstractFactory * getKernelObjectFactory () ; 00577 00578 00586 template <typename Type> 00587 PsInput<Type> * createInput(const PsName & name, 00588 PsSimulatedObject & owner, 00589 bool makeConnectable, 00590 int requestedPrecisionLevel) 00591 { 00592 return getKernelObjectFactory ()->template createInput<Type> (name,owner,makeConnectable,requestedPrecisionLevel); 00593 } 00594 00595 00603 template <typename Type> 00604 PsSensitiveInput<Type> * createSensitiveInput( const PsName & name, 00605 PsSimulatedObject & owner, 00606 bool makeConnectable, 00607 int requestedPrecisionLevel) 00608 { 00609 return getKernelObjectFactory ()->template createSensitiveInput<Type>(name,owner,makeConnectable,requestedPrecisionLevel); 00610 } 00611 00612 00620 template <typename Type> 00621 PsSensitiveNotifyingInput<Type> * createSensitiveNotifyingInput( const PsName & name, 00622 PsSimulatedObject & owner, 00623 bool makeConnectable, 00624 int requestedPrecisionLevel) 00625 { 00626 return getKernelObjectFactory ()->template createSensitiveNotifyingInput<Type>(name,owner,makeConnectable,requestedPrecisionLevel); 00627 } 00628 00629 00637 template <typename Type> 00638 PsOutput<Type> * createOutput(const PsName & name, 00639 PsSimulatedObject & owner, 00640 PsPolatorNT * polator) 00641 { 00642 return getKernelObjectFactory ()->template createOutput<Type>(name,owner,getOutputHistorySize(),polator); 00643 } 00644 00645 00652 template <typename Type> 00653 PsControlParameter<Type> * createControlParameter( const PsName & name, 00654 PsSimulatedObject & owner, 00655 PsPolatorNT * polator) 00656 { 00657 return getKernelObjectFactory ()->template createControlParameter<Type>(name,owner,getOutputHistorySize(),polator); 00658 } 00659 00660 00669 template <typename Type> 00670 PsInputAlias<Type> * createInputAlias(const PsName & name, 00671 PsSimulatedObject & owner, 00672 PsAbstractInput<Type> * input, 00673 int requestedPrecisionLevel) 00674 { 00675 return getKernelObjectFactory ()->template createInputAlias<Type>(name,owner,input,requestedPrecisionLevel); 00676 } 00677 00678 00687 template <typename Type> 00688 PsSensitiveInputAlias<Type> * createSensitiveInputAlias(const PsName & name, 00689 PsSimulatedObject & owner, 00690 PsAbstractInput<Type> * input, 00691 int requestedPrecisionLevel){ 00692 return getKernelObjectFactory ()->template createSensitiveInputAlias<Type>(name,owner,input,requestedPrecisionLevel); 00693 } 00694 00695 00704 template <typename Type> 00705 PsSensitiveNotifyingInputAlias<Type> * createSensitiveNotifyingInputAlias(const PsName & name, 00706 PsSimulatedObject & owner, 00707 PsAbstractInput<Type> * input, 00708 int requestedPrecisionLevel) 00709 { 00710 return getKernelObjectFactory ()->template createSensitiveNotifyingInputAlias<Type>(name,owner,input,requestedPrecisionLevel); 00711 } 00712 00721 template <typename Type> 00722 PsOutputAlias<Type> * createOutputAlias(const PsName & name, 00723 PsSimulatedObject & owner, 00724 PsOutput<Type> * output, 00725 PsPolatorNT * polator) 00726 { 00727 return getKernelObjectFactory ()->template createOutputAlias<Type>(name,owner,output,getOutputHistorySize(),polator); 00728 } 00729 00730 private: 00732 static PsKernelObjectAbstractFactory * kernelObjectFactory ; 00733 00734 public: 00735 enum WarningLevels { NoWarnings, 00736 SomeWarnings, 00737 AllWarnings, 00738 ExceptionOnWarnings, 00739 FatalWarnings}; 00740 00741 static WarningLevels warningLevel ; 00742 00747 static void warning (const string & warningMessage, WarningLevels warningLevel ) ; 00748 00749 }; // PsController 00750 #endif
| Documentation generated on Mon Nov 25 15:24:59 2002 |
Generated with doxygen 1.2.12 by Dimitri van Heesch , 1997-2001 |