Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members  

PsController.h

Go to the documentation of this file.
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

logo OpenMask

Documentation generated on Mon Nov 25 15:24:59 2002

Generated with doxygen 1.2.12 by Dimitri van Heesch ,   1997-2001