Update master to aliroot
[u/mrichter/AliRoot.git] / TRIGGER / AliTrigConnector.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16 /* $Id$ */
17 // Author: Andrei Gheata, 28/07/2009
18
19 //==============================================================================
20 //   AliTrigConnector - General connector class. A connector links a feeder
21 // device output to a number of other device inputs (clients). It transmits the 
22 // signal to all clients and calls their SetInput() method.
23 //==============================================================================
24
25 #include "AliTrigConnector.h"
26
27 #include <TObjArray.h>
28 #include <TClass.h>
29
30 #include "AliTrigDevice.h"
31 #include "AliTrigEvent.h"
32
33
34 ClassImp(AliTrigConnector)
35
36 //______________________________________________________________________________
37 AliTrigConnector::~AliTrigConnector()
38 {
39 // Destructor.
40   if (fInputs) delete [] fInputs;
41   if (fDevices) delete fDevices;
42 }
43
44 //______________________________________________________________________________
45 void AliTrigConnector::Connect(AliTrigDevice *client, Int_t input)
46 {
47 // Adds the device and its input to the list of clients.
48   // Loop array of inputs to check if this input is already connected.
49   for (Int_t i=0; i<fNclients; i++) {
50     if (fInputs[i]==input && fDevices->At(i)==client) {
51       Info("Connect", "Output #%d of device %s already connected to input #%d of device%s",
52            fOutput, fFeeder->GetName(), input, client->GetName());
53       return;
54     } 
55   }
56 //  if (strcmp(client->GetInputType(fFeeder->GetOutputType(fOutput))) {
57 //    Fatal("Cannot connect output slot #%d (type %s) of device %s to input slot #%d of device %s. Aborting",
58 //            fOutput, fFeeder->GetInputType(fOutput), fFeeder->GetName(), input, client->GetName());
59 //  }          
60   if (!fArraySize) {
61     fArraySize = 8;
62     fInputs = new Int_t[fArraySize];
63     fDevices = new TObjArray(fArraySize);
64   }
65   if (fNclients >= fArraySize) {
66     fArraySize *= 2;
67     Int_t *array = new Int_t[fArraySize];
68     memcpy(array, fInputs, fNclients*sizeof(Int_t));
69     delete [] fInputs;
70     fInputs = array;
71   }
72   fInputs[fNclients] = input;
73   fDevices->Add(client);
74   fNclients++;
75 }    
76
77 //______________________________________________________________________________
78 void AliTrigConnector::Print(Option_t */*option*/) const
79 {
80 // Print info about this connector.
81   Printf("   feeder: output #%d of device %s\n", fOutput, fFeeder->GetName());
82   Printf("   client devices:\n");
83   for (Int_t i=0; i<fNclients; i++) Printf("      #%d %s\n", fInputs[i], fDevices->At(i)->GetName());
84 }
85
86 //______________________________________________________________________________
87 Bool_t AliTrigConnector::Transmit(Bool_t value)
88 {
89 // Transmit Boolean signal from feeder to all clients.
90   AliTrigDevice *nextclient;
91   Bool_t transmit = kTRUE;
92   for (Int_t i=0; i<fNclients; i++) {
93     nextclient = (AliTrigDevice*)fDevices->At(i);
94     Bool_t done = nextclient->SetInputValue(fInputs[i], value);
95     if (!done) {
96       Error("Transmit", "Connector %s: Boolean value cannot be transmitted to input %d of device %s",
97             GetName(), i,  nextclient->GetName());
98       transmit = kFALSE;      
99     }
100   }
101   return transmit;
102 }
103
104 //______________________________________________________________________________
105 Bool_t AliTrigConnector::Transmit(AliTrigEvent *event)
106 {
107 // Transmit Boolean signal from feeder to all clients.
108   AliTrigDevice *nextclient;
109   Bool_t transmit = kTRUE;
110   for (Int_t i=0; i<fNclients; i++) {
111     nextclient = (AliTrigDevice*)fDevices->At(i);
112     Bool_t done = nextclient->SetInputValue(fInputs[i], event);
113     if (!done) {
114       Error("Transmit", "Connector %s: Event cannot be transmitted to input %d of device %s",
115             GetName(), i,  nextclient->GetName());
116       transmit = kFALSE;      
117     }
118   }
119   return transmit;    
120 }