ROOT logo
#ifndef ALITRIGSCHEDULER_H
#define ALITRIGSCHEDULER_H
/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 * See cxx source for full Copyright notice                               */

/* $Id$ */
// Author: Andrei Gheata, 27/07/2009

#ifndef ROOT_TNamed
#include "TNamed.h"
#endif

//==============================================================================
//
//   AliTrigScheduledGroup - A group of scheduled entries that will simply be
//                           fired-up sequentially. The group delay in global time
//                           units is the latest start time of the contained
//                           entries. A group has a priority assigned by the
//                           owner scheduler object. Groups are fired-up according
//                           a programable sequence.
//
//==============================================================================

class TObjArray;
class AliTrigScheduledEntry;
class AliTrigScheduler;

//______________________________________________________________________________
class AliTrigScheduledGroup : public TNamed {

private:
  Int_t                     fPriority;     // Group priority
  Int_t                     fDelay;        // Group max. delay.
  TObjArray                *fEntries;      // List of scheduled entries

private:
  AliTrigScheduledGroup(const AliTrigScheduledGroup &other);
  AliTrigScheduledGroup &operator=(const AliTrigScheduledGroup &other);

public:  
  AliTrigScheduledGroup();
  AliTrigScheduledGroup(const char *name, Int_t priority=0);
  virtual ~AliTrigScheduledGroup();
  
  void                      AddEntry(AliTrigScheduledEntry *entry);
  void                      FireUp(Int_t time);
  TObjArray                *GetScheduledEntries() const {return fEntries;}
  Int_t                     GetNentries() const;
  Int_t                     GetPriority() const {return fPriority;}
  Int_t                     GetDelay()    const {return fDelay;}
  virtual void              Print(Option_t *option) const;
  void                      RemoveEntry(AliTrigScheduledEntry *entry);  
  void                      SetPriority(Int_t priority) {fPriority = priority;}
    
  ClassDef(AliTrigScheduledGroup, 1) // Groups of scheduled response functions
};   

//==============================================================================
//
//   AliTrigScheduledSequence - A programable group sequence. Scheduled groups
//                      are owned and controlled by a trigger scheduler. They
//                      are fired-up in such a sequence. A sequence supports some
//                      default modes but can also be programed manually.
//
//==============================================================================

//______________________________________________________________________________
class AliTrigScheduledSequence : public TNamed {

public:
enum ESortingType {
  kDefault       = 0,
  kTimeInc       = 1,
  kTimeDec       = 2,
  kPriorityInc   = 3,
  kPriorityDec   = 4,
  kCustom        = 5
};  

private:
  AliTrigScheduler         *fScheduler;    // Scheduler to which the sequence applies
  Int_t                     fNgroups;      // Number of groups
  ESortingType              fType;         // Sorting type
  Int_t                    *fArray;        //[fNgroups] Array specifying the sequence

private:
  AliTrigScheduledSequence(const AliTrigScheduledSequence &other);
  AliTrigScheduledSequence &operator=(const AliTrigScheduledSequence &other);
  void                      SortArray(Int_t *array, Bool_t increasing);

public:
  AliTrigScheduledSequence();
  AliTrigScheduledSequence(const char *name, AliTrigScheduler *scheduler);
  virtual ~AliTrigScheduledSequence();
  
  Int_t                    *GetArray() const {return fArray;}
  Int_t                     GetNgroups() const {return fNgroups;}
  AliTrigScheduler         *GetScheduler() const {return fScheduler;}
  ESortingType              GetSortingType() const {return fType;}
  virtual void              Print(Option_t *option) const;
  void                      Sort(ESortingType type, Int_t *sequence=0);
  
  ClassDef(AliTrigScheduledSequence, 1)  // Class for a scheduled group sequence
};

//==============================================================================
//
//   AliTrigScheduler - Device response function scheduler. Every device has a
//                      scheduler, but the same scheduler can replay responses of
//                      several devices. A scheduler holds groups of scheduled 
//                      entries. The groups can be replayed in programable
//                      sequences. A default group and sequence are always created.
//
//==============================================================================

class AliTrigScheduledGroup;
class AliTrigScheduledSequence;

//______________________________________________________________________________
class AliTrigScheduler : public TNamed {

private:
  Int_t                     fNgroups;      // Number of scheduled groups (at least one)
  TObjArray                *fGroups;       // List of groups of response functions
  TObjArray                *fSequences;    // List of group replay sequences
  AliTrigScheduledSequence *fCurrentSequence; // Current group replay sequence

private:
  AliTrigScheduler(const AliTrigScheduler &other);
  AliTrigScheduler &operator=(const AliTrigScheduler &other);

public:
  AliTrigScheduler();
  AliTrigScheduler(const char *name);
  virtual ~AliTrigScheduler();
  
  void                      AddScheduledEntry(AliTrigScheduledEntry *entry, const char *togroup="default");
  AliTrigScheduledGroup    *AddGroup(const char *groupname);
  AliTrigScheduledGroup    *AddGroup(AliTrigScheduledGroup *group);
  AliTrigScheduledSequence *AddSequence(const char *seqname, AliTrigScheduledSequence::ESortingType type=AliTrigScheduledSequence::kDefault, 
                                        Int_t *sequence = 0);
  void                      FireUp(Int_t time);
  AliTrigScheduledSequence *GetCurrentSequence() const {return fCurrentSequence;}
  Int_t                     GetNgroups() const {return fNgroups;}
  TObjArray                *GetScheduledGroups() const {return fGroups;}
  AliTrigScheduledGroup    *GetScheduledGroup(Int_t i) const;
  AliTrigScheduledGroup    *GetScheduledGroup(const char *name) const;
  void                      SetCurrentSequence(AliTrigScheduledSequence *seq) {fCurrentSequence = seq;}
  void                      SetGroupPriority(const char *groupname, Int_t priority);
     
  ClassDef(AliTrigScheduler,1)  // Trigger scheduler class
};
#endif
 AliTrigScheduler.h:1
 AliTrigScheduler.h:2
 AliTrigScheduler.h:3
 AliTrigScheduler.h:4
 AliTrigScheduler.h:5
 AliTrigScheduler.h:6
 AliTrigScheduler.h:7
 AliTrigScheduler.h:8
 AliTrigScheduler.h:9
 AliTrigScheduler.h:10
 AliTrigScheduler.h:11
 AliTrigScheduler.h:12
 AliTrigScheduler.h:13
 AliTrigScheduler.h:14
 AliTrigScheduler.h:15
 AliTrigScheduler.h:16
 AliTrigScheduler.h:17
 AliTrigScheduler.h:18
 AliTrigScheduler.h:19
 AliTrigScheduler.h:20
 AliTrigScheduler.h:21
 AliTrigScheduler.h:22
 AliTrigScheduler.h:23
 AliTrigScheduler.h:24
 AliTrigScheduler.h:25
 AliTrigScheduler.h:26
 AliTrigScheduler.h:27
 AliTrigScheduler.h:28
 AliTrigScheduler.h:29
 AliTrigScheduler.h:30
 AliTrigScheduler.h:31
 AliTrigScheduler.h:32
 AliTrigScheduler.h:33
 AliTrigScheduler.h:34
 AliTrigScheduler.h:35
 AliTrigScheduler.h:36
 AliTrigScheduler.h:37
 AliTrigScheduler.h:38
 AliTrigScheduler.h:39
 AliTrigScheduler.h:40
 AliTrigScheduler.h:41
 AliTrigScheduler.h:42
 AliTrigScheduler.h:43
 AliTrigScheduler.h:44
 AliTrigScheduler.h:45
 AliTrigScheduler.h:46
 AliTrigScheduler.h:47
 AliTrigScheduler.h:48
 AliTrigScheduler.h:49
 AliTrigScheduler.h:50
 AliTrigScheduler.h:51
 AliTrigScheduler.h:52
 AliTrigScheduler.h:53
 AliTrigScheduler.h:54
 AliTrigScheduler.h:55
 AliTrigScheduler.h:56
 AliTrigScheduler.h:57
 AliTrigScheduler.h:58
 AliTrigScheduler.h:59
 AliTrigScheduler.h:60
 AliTrigScheduler.h:61
 AliTrigScheduler.h:62
 AliTrigScheduler.h:63
 AliTrigScheduler.h:64
 AliTrigScheduler.h:65
 AliTrigScheduler.h:66
 AliTrigScheduler.h:67
 AliTrigScheduler.h:68
 AliTrigScheduler.h:69
 AliTrigScheduler.h:70
 AliTrigScheduler.h:71
 AliTrigScheduler.h:72
 AliTrigScheduler.h:73
 AliTrigScheduler.h:74
 AliTrigScheduler.h:75
 AliTrigScheduler.h:76
 AliTrigScheduler.h:77
 AliTrigScheduler.h:78
 AliTrigScheduler.h:79
 AliTrigScheduler.h:80
 AliTrigScheduler.h:81
 AliTrigScheduler.h:82
 AliTrigScheduler.h:83
 AliTrigScheduler.h:84
 AliTrigScheduler.h:85
 AliTrigScheduler.h:86
 AliTrigScheduler.h:87
 AliTrigScheduler.h:88
 AliTrigScheduler.h:89
 AliTrigScheduler.h:90
 AliTrigScheduler.h:91
 AliTrigScheduler.h:92
 AliTrigScheduler.h:93
 AliTrigScheduler.h:94
 AliTrigScheduler.h:95
 AliTrigScheduler.h:96
 AliTrigScheduler.h:97
 AliTrigScheduler.h:98
 AliTrigScheduler.h:99
 AliTrigScheduler.h:100
 AliTrigScheduler.h:101
 AliTrigScheduler.h:102
 AliTrigScheduler.h:103
 AliTrigScheduler.h:104
 AliTrigScheduler.h:105
 AliTrigScheduler.h:106
 AliTrigScheduler.h:107
 AliTrigScheduler.h:108
 AliTrigScheduler.h:109
 AliTrigScheduler.h:110
 AliTrigScheduler.h:111
 AliTrigScheduler.h:112
 AliTrigScheduler.h:113
 AliTrigScheduler.h:114
 AliTrigScheduler.h:115
 AliTrigScheduler.h:116
 AliTrigScheduler.h:117
 AliTrigScheduler.h:118
 AliTrigScheduler.h:119
 AliTrigScheduler.h:120
 AliTrigScheduler.h:121
 AliTrigScheduler.h:122
 AliTrigScheduler.h:123
 AliTrigScheduler.h:124
 AliTrigScheduler.h:125
 AliTrigScheduler.h:126
 AliTrigScheduler.h:127
 AliTrigScheduler.h:128
 AliTrigScheduler.h:129
 AliTrigScheduler.h:130
 AliTrigScheduler.h:131
 AliTrigScheduler.h:132
 AliTrigScheduler.h:133
 AliTrigScheduler.h:134
 AliTrigScheduler.h:135
 AliTrigScheduler.h:136
 AliTrigScheduler.h:137
 AliTrigScheduler.h:138
 AliTrigScheduler.h:139
 AliTrigScheduler.h:140
 AliTrigScheduler.h:141
 AliTrigScheduler.h:142
 AliTrigScheduler.h:143
 AliTrigScheduler.h:144
 AliTrigScheduler.h:145
 AliTrigScheduler.h:146
 AliTrigScheduler.h:147
 AliTrigScheduler.h:148
 AliTrigScheduler.h:149
 AliTrigScheduler.h:150
 AliTrigScheduler.h:151
 AliTrigScheduler.h:152
 AliTrigScheduler.h:153