00001 
00002 #ifndef __DAQpp_DAQmanager_h__
00003 #define __DAQpp_DAQmanager_h__
00004 #include <map>
00005 #include <functional>
00006 #include <algorithm>
00007 
00008 #include <DAQ++/RunManager.h>
00009 #include <DAQ++/Module.h>
00010 #include <DAQ++/ObserverModel.h>
00011 #include <DAQ++/Thread.h>
00012 
00013 namespace DAQpp
00014 {
00016     typedef std::map<std::string, RunManager *> RunManagerMap;
00018     typedef std::map<std::string, Module *> ModulesMap;
00019 
00020     class Semaphore;
00021 
00036     class DAQTrigger
00037     {
00038     public:
00040         DAQTrigger()
00041         {}
00042 
00044         virtual ~DAQTrigger()
00045         {}
00046 
00050         virtual bool operator()()
00051         {
00052             return true;
00053         }
00054     };
00055 
00247 
00248     class DAQmanager : public Observable
00249     {
00250     public:
00255         enum DAQstatus {
00256             Running  = 1,  
00257             Threaded = 2,  
00259             Loop     = 4,  
00261             Public   = 6   
00263         };
00264 
00265     private:
00271         class DAQinternal
00272         {
00273         protected:
00275             DAQmanager *mngr;
00276         public:
00278             DAQinternal() : mngr( DAQmanager::theDAQmanager() )
00279             {}
00280         };
00281         friend class DAQinternal; 
00282 
00284         static DAQmanager theManager;
00285 
00287         RunManagerMap runm;
00288 
00293         class RunManagerSet : public std::set<RunManager *>, public Condition , public DAQinternal
00294         {
00295         public:
00297             RunManagerSet()
00298             {}
00300             std::pair<iterator, bool> insert(const value_type &x);
00302             iterator insert(iterator pos, const value_type &x);
00304             void erase(iterator pos);
00306             size_type erase(const key_type &k);
00308             void erase(iterator first, iterator last);
00310             void clear();
00312             bool condition();
00313         };
00317         RunManagerSet active;
00318 
00320         ModulesMap mmap;
00321 
00323         int state;
00324 
00325 
00327         class RunCondition : public DAQinternal, public Condition
00328         {
00329         public:
00330             RunCondition()
00331             {}
00332             bool condition()
00333             {
00334                 bool rc = !mngr->isRunning();
00335                 if (!mngr->isLooping() )
00336                     rc |= mngr->active.empty();
00337 
00338                 return rc;
00339             }
00340         };
00344         RunCondition daq_cond;
00345 
00347         class DAQthread : public DAQinternal, public Thread
00348         {
00349         public:
00351             DAQthread()
00352             {}
00353 
00355             void run();
00356         };
00360         DAQthread thread;
00361 
00362 
00367         DAQTrigger *trigger;
00368     protected:
00370         DAQmanager();
00371 
00373         DAQmanager(const DAQmanager &);
00374 
00376         void operator=(const DAQmanager &)
00377         {}
00378 
00379     public:
00384         ~DAQmanager();
00385 
00387         static DAQmanager *theDAQmanager()
00388         {
00389             return &theManager;
00390         }
00391 
00392 
00393 
00394 
00396         enum msg
00397         {
00398             startDAQ,     
00399             stopDAQ,      
00400             nwModule,     
00401             nwRunManager, 
00402             rmModule,     
00403             rmRunManager, 
00404             acRunManager, 
00405             dcRunManager  
00406         };
00407 
00409         typedef std::pair<msg, char *> newObjArg;
00410 
00412         void addModule(Module *m)
00413         {
00414             mmap[m->get_id()] = m;
00415             new_obj(nwModule, (char *)m);
00416         }
00417 
00419         Module * deleteModule(Module *m)
00420         {
00421             mmap.erase(m->get_id());
00422             new_obj(rmModule, (char *)m);
00423             return m;
00424         }
00425 
00427         Module *find_module(const DAQid &id)
00428         {
00429             ModulesMap::iterator it = mmap.find(id);
00430 
00431             if ( it == mmap.end() )
00432                 return 0;
00433             else
00434                 return (*it).second;
00435         }
00436 
00438         const ModulesMap & ModuleMap()
00439         {
00440             return mmap;
00441         }
00442 
00444         int countModules()
00445         {
00446             return mmap.size();
00447         }
00448 
00450         void addRunManager(RunManager *m)
00451         {
00452             runm[m->get_id()] = m;
00453             new_obj(nwRunManager, (char *)m);
00454         }
00455 
00457         RunManager *deleteRunManager(RunManager *m)
00458         {
00459             if ( m->isActive() )
00460                 m->deActivate();
00461             runm.erase(m->get_id());
00462             new_obj(rmRunManager, (char *)m);
00463             return m;
00464         }
00465 
00467         int countRunManager()
00468         {
00469             return runm.size();
00470         }
00471 
00473         RunManager *find_runmanager(const DAQid &id)
00474         {
00475             RunManagerMap::iterator it = runm.find(id);
00476 
00477             if ( it == runm.end() )
00478                 return 0;
00479             else
00480                 return (*it).second;
00481         }
00482 
00484         const RunManagerMap & RunMmap()
00485         {
00486             return runm;
00487         }
00488 
00490         void addActiveRunManager(RunManager *rm);
00491 
00493         void removeActiveRunManager(RunManager *rm);
00494 
00496         int countActiveRunManager()
00497         {
00498             return active.size();
00499         }
00500 
00501 
00502 
00504         class RunAcquire : public DAQinternal,
00505                            public std::unary_function<RunManager const *, void>
00506         {
00507         public:
00509             RunAcquire()
00510             {}
00512             void operator()( RunManager *rm);
00513         };
00514 
00532         void StartRun(int flags);
00533 
00537         void startRunManager(RunManager *);
00538 
00542         void stopRunManager(RunManager *);
00543 
00547         void WaitForEndOfRun(int tmout = -1);
00548 
00550         bool isRunning()
00551         {
00552             return (state & Running) != 0;
00553         }
00555         bool isLooping()
00556         {
00557             return (state & Loop) != 0;
00558         }
00560         bool isThreaded()
00561         {
00562             return (state & Threaded) != 0;
00563         }
00565         void StopRun();
00566 
00567 
00568 
00569 
00574         void set_trigger( DAQTrigger *func );
00575 
00576     private:
00580         void Acquire();
00581 
00585         void processTheEvent();
00586 
00588         void new_obj(msg tp, char *ptr)
00589         {
00590             Arg< newObjArg > arg( newObjArg(tp, ptr) );
00591             notifyObservers(&arg);
00592         }
00593 
00594     };
00595 
00596 
00597 }
00598 #endif