OMKController.h

Go to the documentation of this file.
00001 /*
00002  * This file is part of openMask (c) 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 ControllerHEADER
00019 #define ControllerHEADER
00020 
00021 #include "OMKBaseType.h"
00022 #include "OMKSignalDispatcher.h"
00023 #include "OMKSimulatedObject.h"
00024 #include "OMKReferenceObjectHandle.h"
00025 #include "OMKValuedEvent.h"
00026 
00027 #ifdef _OMK_MUTEX_
00028 #  include "OMKMutexLock.h"
00029 #endif
00030 
00031 //---------------------------------------------------------------------
00032 namespace OMK
00033 {
00034 class Process;
00035 template <typename T> class AbstractInput;
00036 class ObjectDescriptor ;
00037 class MultipleConfigurationParameter ;
00038 class KernelObjectAbstractFactory ;
00039 class DoubleList;
00040 class Scheduler ;
00041 class Name;
00042 
00043 //---------------------------------------------------------------------
00053 class OMK_API Controller : public SimulatedObject
00054 {
00055  public:
00060   Controller(ObjectDescriptor & simulationTree,
00061              const Date & initialDate);
00062 
00065   virtual ~Controller();
00066 
00067   /* init
00068    * send MaskStart to all initial objects 
00069    */
00070   virtual void init();
00071 
00075   virtual void run();
00076 
00081   template <typename Type> std::list<const ObjectDescriptor *> * listDescendantsOfType(const Name & objectName) ;
00082 
00087   template <typename Type> std::list<const ObjectDescriptor * > * listBrothersOfType (const Name objectName) ;
00088 
00089  protected:
00091   virtual void computeNextSimulationStep();
00092 
00096   virtual void scheduleObject(ReferenceObjectHandle * ref);
00097 
00098  public: 
00099 
00102   void processStartEventAfterMorphose(ReferenceObjectHandle * objectHandle) ;
00104   //   typedef vector<Name> publicMirrorList;
00105   virtual void createLocalObject( const ObjectDescriptor & newLObjectDescription, 
00106                                   const Name & fathersLName ) ;
00107   virtual int getMirrorsNbre() { return 1;};
00108   virtual bool isAMirror (const Name & name) { return false ;};
00109   virtual std::vector<Name> getMirrorList () {return std::vector<Name>() ;};
00110   virtual std::vector<Name> getIsolatedMirrorList() {return std::vector<Name>() ;};
00111   virtual std::vector<Name> getNonIsolatedMirrorList() {return std::vector<Name>() ;};
00112   virtual bool testIfTroubleOccured() {return false; } ;
00113   virtual void createNewSite ( const Date & ) {} ;
00114   typedef std::pair< Name,Name > MigrationObjectPrm ;
00115   DECLARE_TYPE_EVENT( MigrationObjectPrm, MigrationObject ) ;
00116   void migrateObjectToProcess ( Name &nomObjet, Name &nomProcess) ;
00117   virtual std::list<Name> getDisconnectedProcessusList () { return std::list<Name> () ;};
00118   virtual std::map<Name, int> getDisconnectedProcessusMap () { return std::map<Name, int> () ;};
00119 
00125   virtual Frequency computeAdequateFrequency(const Frequency & suggestedFrequency);
00126 
00133   virtual void runControllersStep(ReferenceObjectHandle * objectHandle);
00134 
00137   virtual void compute();
00138 
00141   virtual void finish() ;
00142 
00143  protected:
00147   MultipleConfigurationParameter * getSchedulingParametersOfObject(ObjectDescriptor &) ;
00148 
00155   SimulatedObject * createDescribedObject(const ObjectDescriptor * description);
00156 
00159   virtual void setProcessOfDescriptor ( ObjectDescriptor & objectDescription, const Name & newProcessName ) ;
00160 
00161  public:
00165   static void error (const char * mess) ;
00166 
00168   static Date initialSimulationDate ;
00169 
00173   void showDateAndStepNumber(bool show = true);
00174 
00176   virtual const Date & getSimulatedDate () const ;
00177 
00179   virtual int getCycleFrequency() const ;
00180 
00182   virtual int getCyclePeriod() const ;
00183 
00185   typedef std::pair< ObjectDescriptor,Name > CreateObjectPrm ;
00186   DECLARE_TYPE_EVENT( CreateObjectPrm, CreateObject ) ;
00187 
00194   virtual void createObject(const ObjectDescriptor & newObjectDescription, const Name & fathersName);
00195 
00203   virtual void destroyObject(const Name & name, bool recursively);
00204 
00210   virtual void changeObjectsFather(const Name & name , const Name & newFather) ;
00211 
00217   virtual void changeObjectsFather(ObjectDescriptor * object, ObjectDescriptor * newFather) ;
00218 
00219  protected:                                        
00228   virtual void computeScheduling(bool fromOriginal) ;
00229 
00232   virtual void sendInitialEventsTo(ReferenceObjectHandle & objectHandle, const Date & dateOfMaskStart) ;
00233 
00240   virtual void deleteObject(ObjectDescriptor * objectDescription);
00241 
00246   virtual ObjectHandle * removeObjectFromDataStructures(const Name &);
00247 
00248  public:
00253   virtual SimulatedObject * getPointerToDuplicatedObjectNamed(const Name & name);
00254 
00261   virtual SimulatedObject * getPointerToSimulatedObjectNamed(const Name & name);
00262 
00263  protected:
00264   friend class InputNT;
00265   friend class OMK::SimulatedObject;
00266 
00270   virtual void processNewObjectDeclaration ( ObjectDescriptor & declaration, const Date & declarationDate ) ;
00271 
00275   virtual ReferenceObjectHandle * createReferenceObject (const ObjectDescriptor * idObjet);
00276       
00277  public:   
00283   virtual const ObjectDescriptor & getObjectDescriptorOfObject(const Name & objectName) ;
00284 
00285   // calculate least common multiplier
00286   static int lcm (const int a, const int b) ;
00287 
00288   // calculate greatest common divisor
00289   static int gcd (const int a, const int b) ;
00290 
00292   std::vector<Name> _publicReferentielObjectsVector ;
00293   virtual std::vector<Name> getReferentielList();
00294 
00295  protected:
00298   virtual Scheduler * createScheduler() ;
00299    
00303   virtual void scheduleControlledObjects();
00304 
00306   virtual void advanceSimulatedDate();
00307 
00311   virtual void createControlledObjects(const ObjectDescriptor * subTree);
00312 
00315   NameToPointerMap<ReferenceObjectHandle> _referenceObjectsMap ;
00316    
00320   ObjectDescriptor & _simulationTree;
00321 
00323   unsigned long int _numberOfSimulatedSteps;
00324 
00325   virtual void setCycleFrequency(int newFrequency) ;
00326 
00328   Frequency _stepFrequency;
00329 
00331   int _cycleFrequency; 
00332 
00334   int _cyclePeriod ;
00335 
00338   int _nbStepsByCycle;
00339 
00343   int _stepPeriod;
00344 
00346   Date _date;
00347 
00349   bool _showDateAndStepNumber;
00350 
00352   ReferenceObjectHandle::SimulatedObjectComputingState * _computeStatePointer ;
00353 
00354  public: 
00356   virtual void actOnSystemEvent ( Event * event ) ;
00357    
00359   virtual void reactToControlledObjectsSystemEvents();
00360 
00362   virtual void processStartEventOf(ReferenceObjectHandle * objectHandle);
00363 
00365   virtual void processDeleteEventOf(ReferenceObjectHandle * objectHandle);
00366 
00370   virtual void hasEventsToProcess(ReferenceObjectHandle * referenceObjectHandle);
00371 
00374   virtual void postponeEventProcessing ( ReferenceObjectHandle * referenceObjectHandle );
00375 
00379   virtual void noActivationNeededFor ( ReferenceObjectHandle * referenceObjectHandle ) ;
00380 
00383   virtual void addToPendingEvents( Event * ) ;
00384 
00393   virtual bool addToPendingRegistrations(const EventIdentifier & sig, 
00394                                          const Name & producer,
00395                                          const EventIdentifier & eventId,
00396                                          const Name & registrant) ;
00397 
00405   virtual bool removeFromPendingRegistrations(const EventIdentifier & sig,
00406                                               const Name & producer,
00407                                               const Name & registrant);
00408 
00410   virtual bool processEvent(Event *);
00411 
00413   virtual void processEventsOfSuspendedObjects();
00414 
00419   virtual void broadcastEventsForSignal (Event & event, const EventIdentifier & sigId);
00420 
00426   virtual bool receiveRegistrationForSignal(const EventIdentifier & sigId, 
00427                                             const Name & registrant, 
00428                                             const EventIdentifier & eventId);
00429 
00434   virtual bool receiveCancellationForSignal(const EventIdentifier & sigId,
00435                                             const Name & registrant ) ;
00436 
00437  protected:
00439   SignalDispatcher _controledObjectsSignalsDispatcher ;
00440 
00442   virtual void setComputingState(ReferenceObjectHandle *, ReferenceObjectHandle::SimulatedObjectComputingState) const ;
00443      
00444  protected:
00446    bool _forcedCompute ;
00447 
00449    Scheduler * _scheduler ;
00450 
00454    std::list<ReferenceObjectHandle *> *_objectsNeedingActivationList[ 2 ]; 
00455 
00457    int _currentListOfObjectsNeedingActivation ;
00458 
00460    virtual void switchSystemEventList() ;
00461 
00463    std::list <Event *> *_systemEventsList[ 2 ] ;
00464 
00466    unsigned int _currentWritableSystemEventsList ;
00467 
00469    std::list <ReferenceObjectHandle * > _listOfObjectsWithPostPonedEvents ;
00470 
00471 #ifdef _OMK_MUTEX_
00472 
00473    OMKMutexLock _mutexSystemEventsList ;
00474 #endif
00475 
00476    std::map <Name, std::list<Event *> > _pendingEventsList ;
00477 
00478 #ifdef _OMK_MUTEX_
00479 
00480    OMKMutexLock _mutexPendingDataStructures ;
00481 #endif
00482 
00484    std::map <Name, SignalDispatcher *> _pendingRegistrationRequests ;
00485 
00487    virtual void purgeMemoryFromOldEvents ( const Date & dateOfOldestKept ) ;
00488 
00490    virtual Date getPurgeDate() ; 
00491 
00496    std::list <std::pair <Date, ObjectHandle *> > _deletedObjectHandles ;
00497 
00498  protected:
00500    //ReferenceObjectHandle * _objectHandle ;
00501 
00505    virtual int getOutputHistorySize(void) ;
00506 
00511    virtual ReferenceObjectHandle * createReferenceObjectHandle(SimulatedObject & obj);
00512 
00519    virtual ReferenceObjectHandle * newOMKReferenceObjectHandle(SimulatedObject & object, 
00520                                                                   Controller & controller,
00521                                                                   SignalDispatcher * signalDispatcher);
00522 
00524    virtual void deleteObjectHandle ( ObjectHandle * objectHandle ) ;
00525 
00526  public:
00532    static bool setKernelObjectFactory(KernelObjectAbstractFactory * aFactory); 
00533 
00535    static KernelObjectAbstractFactory * getKernelObjectFactory () ;
00536 
00537 
00545    template <typename Type>
00546    Input<Type> * createInput(const Name & name, 
00547                              SimulatedObject & owner,
00548                              bool makeConnectable,
00549                              int requestedPrecisionLevel) ;
00550 
00558    template <typename Type>
00559    SensitiveInput<Type> * createSensitiveInput( const Name & name, 
00560                                                 SimulatedObject & owner,
00561                                                 bool makeConnectable,
00562                                                 int requestedPrecisionLevel) ;
00563 
00571    template <typename Type>
00572    SensitiveNotifyingInput<Type> * createSensitiveNotifyingInput(const Name & name, 
00573                                                                  SimulatedObject & owner,
00574                                                                  bool makeConnectable,
00575                                                                  int requestedPrecisionLevel);
00576 
00584    template <typename Type>
00585    Output<Type> * createOutput(const Name & name, 
00586                                SimulatedObject & owner,
00587                                OMK::Type::PolatorNT * polator) ;
00588 
00595    template <typename Type>
00596    ControlParameter<Type> * createControlParameter(const Name & name, 
00597                                                    SimulatedObject & owner,
00598                                                    OMK::Type::PolatorNT * polator);
00599 
00608    template <typename Type>
00609    InputAlias<Type> * createInputAlias(const Name & name, 
00610                                        SimulatedObject & owner,
00611                                        AbstractInput<Type> * input,
00612                                        int requestedPrecisionLevel);
00613 
00622    template <typename Type>
00623    SensitiveInputAlias<Type> * createSensitiveInputAlias(const Name & name, 
00624                                                          SimulatedObject & owner,
00625                                                          AbstractInput<Type> * input,
00626                                                          int requestedPrecisionLevel);
00627 
00636    template <typename Type>
00637    SensitiveNotifyingInputAlias<Type> * createSensitiveNotifyingInputAlias(const Name & name, 
00638                                                                            SimulatedObject & owner,
00639                                                                            AbstractInput<Type> * input,
00640                                                                            int requestedPrecisionLevel);
00641 
00650    template <typename Type>
00651    OutputAlias<Type> * createOutputAlias(const Name & name,
00652                                          SimulatedObject & owner,
00653                                          Output<Type> * output,
00654                                          OMK::Type::PolatorNT * polator);
00655   
00656  private:
00658    static KernelObjectAbstractFactory * kernelObjectFactory ;
00659 
00660 }; // Controller
00661 
00662 } // namespace OMK
00663 
00664 
00665 #include <OMKObjectDescriptor.h>
00666 #include <OMKKernelObjectAbstractFactory.h>
00667 
00668 namespace OMK
00669 {
00674 template <typename Type> 
00675 inline std::list<const ObjectDescriptor *> * 
00676 Controller::listDescendantsOfType(const Name & objectName)
00677 {
00678   const ObjectDescriptor * objectDescriptor = getObjectDescriptor ().findDescendantNamed ( objectName ) ;
00679   if ( objectDescriptor != NULL )
00680     {
00681       return objectDescriptor->template listDescendantsOfType<Type> () ; 
00682     }
00683   else
00684     {
00685       return new std::list<const ObjectDescriptor *>() ;
00686     }
00687 }
00688 
00693 template <typename Type> 
00694 inline std::list<const ObjectDescriptor * > * 
00695 Controller::listBrothersOfType (const Name objectName)
00696 {
00697   const ObjectDescriptor * objectDescriptor = getObjectDescriptor ().findDescendantNamed ( objectName ) ;
00698   if ( objectDescriptor != NULL )
00699     {
00700       objectDescriptor = objectDescriptor->getFathersObjectDescriptor() ;
00701       if ( objectDescriptor != NULL )
00702         {
00703           return objectDescriptor->template listBrothersOfType<Type> () ; 
00704         }
00705       else
00706         {
00707           return new std::list<const ObjectDescriptor *>() ;
00708         }
00709     }
00710   else
00711     {
00712       return new std::list<const ObjectDescriptor *>() ;
00713     }
00714 }
00715 
00723 template <typename Type>
00724 inline Input<Type> *
00725 Controller::createInput(const Name & name, 
00726                         SimulatedObject & owner,
00727                         bool makeConnectable,
00728                         int requestedPrecisionLevel) 
00729 {
00730   return getKernelObjectFactory ()->template createInput<Type> (name,owner,makeConnectable,requestedPrecisionLevel);
00731 }
00732 
00740 template <typename Type>
00741 inline SensitiveInput<Type> * 
00742 Controller::createSensitiveInput(const Name & name,
00743                                  SimulatedObject & owner,
00744                                  bool makeConnectable,
00745                                  int requestedPrecisionLevel) 
00746 {
00747   return getKernelObjectFactory ()->template createSensitiveInput<Type>(name,owner,makeConnectable,requestedPrecisionLevel);
00748 }
00749 
00757 template <typename Type>
00758 inline SensitiveNotifyingInput<Type> * Controller::createSensitiveNotifyingInput(const Name & name, 
00759                                                                                  SimulatedObject & owner,
00760                                                                                  bool makeConnectable,
00761                                                                                  int requestedPrecisionLevel) 
00762 {
00763   return getKernelObjectFactory ()->template createSensitiveNotifyingInput<Type>(name,owner,makeConnectable,requestedPrecisionLevel);
00764 }
00765 
00773 template <typename Type>
00774 inline Output<Type> *
00775 Controller::createOutput(const Name & name, 
00776                          SimulatedObject & owner,
00777                          OMK::Type::PolatorNT * polator) 
00778 {
00779   return getKernelObjectFactory ()->template createOutput<Type>(name,owner,getOutputHistorySize(),polator);
00780 }
00781 
00788 template <typename Type>
00789 inline ControlParameter<Type> * 
00790 Controller::createControlParameter(const Name & name, 
00791                                    SimulatedObject & owner,
00792                                    OMK::Type::PolatorNT * polator) 
00793 {
00794   return getKernelObjectFactory ()->template createControlParameter<Type>(name,owner,getOutputHistorySize(),polator);
00795 }
00796 
00805 template <typename Type>
00806 inline InputAlias<Type> * 
00807 Controller::createInputAlias(const Name & name, 
00808                              SimulatedObject & owner,
00809                              AbstractInput<Type> * input,
00810                              int requestedPrecisionLevel)
00811 {   
00812   return getKernelObjectFactory ()->template createInputAlias<Type>(name,owner,input,requestedPrecisionLevel);
00813 }
00814 
00823 template <typename Type>
00824 inline SensitiveInputAlias<Type> * 
00825 Controller::createSensitiveInputAlias(const Name & name, 
00826                                       SimulatedObject & owner,
00827                                       AbstractInput<Type> * input,
00828                                       int requestedPrecisionLevel)
00829 {
00830   return getKernelObjectFactory ()->template createSensitiveInputAlias<Type>(name,owner,input,requestedPrecisionLevel);
00831 }
00832 
00841 template <typename Type>
00842 inline SensitiveNotifyingInputAlias<Type> * 
00843 Controller::createSensitiveNotifyingInputAlias(const Name & name, 
00844                                                SimulatedObject & owner,
00845                                                AbstractInput<Type> * input,
00846                                                int requestedPrecisionLevel)
00847 {   
00848   return getKernelObjectFactory ()->template createSensitiveNotifyingInputAlias<Type>(name,owner,input,requestedPrecisionLevel);
00849 }
00850 
00859 template <typename Type>
00860 inline OutputAlias<Type> *
00861 Controller::createOutputAlias(const Name & name, 
00862                               SimulatedObject & owner,
00863                               Output<Type> * output,
00864                               OMK::Type::PolatorNT * polator)
00865 {
00866   return getKernelObjectFactory ()->template createOutputAlias<Type>(name,owner,output,getOutputHistorySize(),polator);
00867 }
00868   
00869 } // namespace OMK
00870 
00871 #include "OMKSimulatedObject.inl" 
00872 
00873 #endif

logo OpenMask

Documentation generated on Mon Jun 9 11:45:56 2008

Generated with doxygen by Dimitri van Heesch ,   1997-2007