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