ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

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

//==============================================================================
//   AliTrigConnector - General connector class. A connector links a feeder
// device output to a number of other device inputs (clients). It transmits the 
// signal to all clients and calls their SetInput() method.
//==============================================================================

#include "AliTrigConnector.h"

#include <TObjArray.h>
#include <TClass.h>

#include "AliTrigDevice.h"
#include "AliTrigEvent.h"


ClassImp(AliTrigConnector)

//______________________________________________________________________________
AliTrigConnector::~AliTrigConnector()
{
// Destructor.
  if (fInputs) delete [] fInputs;
  if (fDevices) delete fDevices;
}

//______________________________________________________________________________
void AliTrigConnector::Connect(AliTrigDevice *client, Int_t input)
{
// Adds the device and its input to the list of clients.
  // Loop array of inputs to check if this input is already connected.
  for (Int_t i=0; i<fNclients; i++) {
    if (fInputs[i]==input && fDevices->At(i)==client) {
      Info("Connect", "Output #%d of device %s already connected to input #%d of device%s",
           fOutput, fFeeder->GetName(), input, client->GetName());
      return;
    } 
  }
//  if (strcmp(client->GetInputType(fFeeder->GetOutputType(fOutput))) {
//    Fatal("Cannot connect output slot #%d (type %s) of device %s to input slot #%d of device %s. Aborting",
//            fOutput, fFeeder->GetInputType(fOutput), fFeeder->GetName(), input, client->GetName());
//  }          
  if (!fArraySize) {
    fArraySize = 8;
    fInputs = new Int_t[fArraySize];
    fDevices = new TObjArray(fArraySize);
  }
  if (fNclients >= fArraySize) {
    fArraySize *= 2;
    Int_t *array = new Int_t[fArraySize];
    memcpy(array, fInputs, fNclients*sizeof(Int_t));
    delete [] fInputs;
    fInputs = array;
  }
  fInputs[fNclients] = input;
  fDevices->Add(client);
  fNclients++;
}    

//______________________________________________________________________________
void AliTrigConnector::Print(Option_t */*option*/) const
{
// Print info about this connector.
  Printf("   feeder: output #%d of device %s\n", fOutput, fFeeder->GetName());
  Printf("   client devices:\n");
  for (Int_t i=0; i<fNclients; i++) Printf("      #%d %s\n", fInputs[i], fDevices->At(i)->GetName());
}

//______________________________________________________________________________
Bool_t AliTrigConnector::Transmit(Bool_t value)
{
// Transmit Boolean signal from feeder to all clients.
  AliTrigDevice *nextclient;
  Bool_t transmit = kTRUE;
  for (Int_t i=0; i<fNclients; i++) {
    nextclient = (AliTrigDevice*)fDevices->At(i);
    Bool_t done = nextclient->SetInputValue(fInputs[i], value);
    if (!done) {
      Error("Transmit", "Connector %s: Boolean value cannot be transmitted to input %d of device %s",
            GetName(), i,  nextclient->GetName());
      transmit = kFALSE;      
    }
  }
  return transmit;
}

//______________________________________________________________________________
Bool_t AliTrigConnector::Transmit(AliTrigEvent *event)
{
// Transmit Boolean signal from feeder to all clients.
  AliTrigDevice *nextclient;
  Bool_t transmit = kTRUE;
  for (Int_t i=0; i<fNclients; i++) {
    nextclient = (AliTrigDevice*)fDevices->At(i);
    Bool_t done = nextclient->SetInputValue(fInputs[i], event);
    if (!done) {
      Error("Transmit", "Connector %s: Event cannot be transmitted to input %d of device %s",
            GetName(), i,  nextclient->GetName());
      transmit = kFALSE;      
    }
  }
  return transmit;    
}
 AliTrigConnector.cxx:1
 AliTrigConnector.cxx:2
 AliTrigConnector.cxx:3
 AliTrigConnector.cxx:4
 AliTrigConnector.cxx:5
 AliTrigConnector.cxx:6
 AliTrigConnector.cxx:7
 AliTrigConnector.cxx:8
 AliTrigConnector.cxx:9
 AliTrigConnector.cxx:10
 AliTrigConnector.cxx:11
 AliTrigConnector.cxx:12
 AliTrigConnector.cxx:13
 AliTrigConnector.cxx:14
 AliTrigConnector.cxx:15
 AliTrigConnector.cxx:16
 AliTrigConnector.cxx:17
 AliTrigConnector.cxx:18
 AliTrigConnector.cxx:19
 AliTrigConnector.cxx:20
 AliTrigConnector.cxx:21
 AliTrigConnector.cxx:22
 AliTrigConnector.cxx:23
 AliTrigConnector.cxx:24
 AliTrigConnector.cxx:25
 AliTrigConnector.cxx:26
 AliTrigConnector.cxx:27
 AliTrigConnector.cxx:28
 AliTrigConnector.cxx:29
 AliTrigConnector.cxx:30
 AliTrigConnector.cxx:31
 AliTrigConnector.cxx:32
 AliTrigConnector.cxx:33
 AliTrigConnector.cxx:34
 AliTrigConnector.cxx:35
 AliTrigConnector.cxx:36
 AliTrigConnector.cxx:37
 AliTrigConnector.cxx:38
 AliTrigConnector.cxx:39
 AliTrigConnector.cxx:40
 AliTrigConnector.cxx:41
 AliTrigConnector.cxx:42
 AliTrigConnector.cxx:43
 AliTrigConnector.cxx:44
 AliTrigConnector.cxx:45
 AliTrigConnector.cxx:46
 AliTrigConnector.cxx:47
 AliTrigConnector.cxx:48
 AliTrigConnector.cxx:49
 AliTrigConnector.cxx:50
 AliTrigConnector.cxx:51
 AliTrigConnector.cxx:52
 AliTrigConnector.cxx:53
 AliTrigConnector.cxx:54
 AliTrigConnector.cxx:55
 AliTrigConnector.cxx:56
 AliTrigConnector.cxx:57
 AliTrigConnector.cxx:58
 AliTrigConnector.cxx:59
 AliTrigConnector.cxx:60
 AliTrigConnector.cxx:61
 AliTrigConnector.cxx:62
 AliTrigConnector.cxx:63
 AliTrigConnector.cxx:64
 AliTrigConnector.cxx:65
 AliTrigConnector.cxx:66
 AliTrigConnector.cxx:67
 AliTrigConnector.cxx:68
 AliTrigConnector.cxx:69
 AliTrigConnector.cxx:70
 AliTrigConnector.cxx:71
 AliTrigConnector.cxx:72
 AliTrigConnector.cxx:73
 AliTrigConnector.cxx:74
 AliTrigConnector.cxx:75
 AliTrigConnector.cxx:76
 AliTrigConnector.cxx:77
 AliTrigConnector.cxx:78
 AliTrigConnector.cxx:79
 AliTrigConnector.cxx:80
 AliTrigConnector.cxx:81
 AliTrigConnector.cxx:82
 AliTrigConnector.cxx:83
 AliTrigConnector.cxx:84
 AliTrigConnector.cxx:85
 AliTrigConnector.cxx:86
 AliTrigConnector.cxx:87
 AliTrigConnector.cxx:88
 AliTrigConnector.cxx:89
 AliTrigConnector.cxx:90
 AliTrigConnector.cxx:91
 AliTrigConnector.cxx:92
 AliTrigConnector.cxx:93
 AliTrigConnector.cxx:94
 AliTrigConnector.cxx:95
 AliTrigConnector.cxx:96
 AliTrigConnector.cxx:97
 AliTrigConnector.cxx:98
 AliTrigConnector.cxx:99
 AliTrigConnector.cxx:100
 AliTrigConnector.cxx:101
 AliTrigConnector.cxx:102
 AliTrigConnector.cxx:103
 AliTrigConnector.cxx:104
 AliTrigConnector.cxx:105
 AliTrigConnector.cxx:106
 AliTrigConnector.cxx:107
 AliTrigConnector.cxx:108
 AliTrigConnector.cxx:109
 AliTrigConnector.cxx:110
 AliTrigConnector.cxx:111
 AliTrigConnector.cxx:112
 AliTrigConnector.cxx:113
 AliTrigConnector.cxx:114
 AliTrigConnector.cxx:115
 AliTrigConnector.cxx:116
 AliTrigConnector.cxx:117
 AliTrigConnector.cxx:118
 AliTrigConnector.cxx:119
 AliTrigConnector.cxx:120