ROOT logo
#include "CamacIO.h"
// CAMAC related includes and definitions
#include "camac.hh"
// end of CAMAC related includes and definitions

#include <iostream>
using namespace std;

ClassImp(CamacIO)

/*!
Default contructor. Set object name and title
\param name is the object name
\param title is the object tile
*/
CamacIO::CamacIO(char* name,char* title):PelIO(name,title)
{
  mIsCamac = false;
}
/*!
*/
CamacIO::~CamacIO()
{
  for(int i=0;i<MAXOUTPUT;i++) closeOutput(i);
  closeInput();
}
/*!
Open input file from stream
\param file is the file name. If NULL CAMAC connection is open
*/
int CamacIO::openInput(char *file)
{
  if(mInput) { delete mInput; mInput = NULL;}
	
	TString tmp = file;
	
	if(tmp.BeginsWith("/dev/"))
	{
    mResidualSize = 0;
    mIsCamac = true;
    cc_handle = open (file, O_RDWR);
    if (cc_handle == -1)
    {
      if(isDebug()) cout <<"Error opening CAMAC connection \n";
      mIsCamac = false;
      return kWarn;
    }
	} 
	else 
	{ 
		if(isDebug()) cout <<"Opening file instead of CAMAC"<<endl;
		return PelIO::openInput(file);
  }
	return kOk;
}
/*!
Close input file 
*/
int CamacIO::closeInput()
{
  if(!mIsCamac) return kWarn; 
  else
  {
    stop();
    close(cc_handle);
    mIsCamac = false;
  }
  return kWarn;
}
/*!
Read data block from CAMAC
*/
int CamacIO::readBlock()
{
  if(!mIsCamac) 
	{
		PelIO::readBlock();
  }
	else
	{
	  int arg = 0;
    int ierr = ioctl(cc_handle, CCREADEVNT, (unsigned long) arg);
    int nbytes = read (cc_handle, mBlock, 8192);
    if(isDebug()) cout <<"ierr = "<<ierr<<"  nbytes = "<<nbytes<<endl;
    if(nbytes<1) return kEOF;
    BLOCKSIZE = nbytes/sizeof(unsigned short int);
    if(BLOCKSIZE<1) return kEOF;
    if(mDebug)
    {
      for(int i=0;i<BLOCKSIZE/8;i++) 
      { 
        for (int j=0;j<8;j++) cout <<hex<<(unsigned int)mBlock[i*8+j]<<"  "; 
        cout <<dec<<endl;
      }    
    }
	}
  return decodeBlock();
}
/*!
*/
int CamacIO::getNEventsLost()
{  
  if(!mIsCamac) return 0;
  else
  {
    int arg = 0;
    return ioctl(cc_handle, CCGETLOST, (unsigned long) arg);
  }
}
/*!
*/
int CamacIO::getNUsedBuffers()
{  
  if(!mIsCamac) return 0;
  else
  {
    int arg = 0;
    return ioctl(cc_handle, CCGETUSED, (unsigned long) arg);
  }
}
/*!
*/
int CamacIO::getNBuffers()
{  
  if(!mIsCamac) return 0;
  else
  {
    int arg = 0;
    return ioctl(cc_handle, CCGETBUF, (unsigned long) arg);
  }
}
/*!
\param file is the .evo filename
*/
int CamacIO::loadEVO(char* file)
{
  if(mIsCamac)
  {  
    int arg,ierr;
		arg=0xd03;
    ierr = ioctl (cc_handle, CCRESET, (unsigned long) arg);
  
    int EVOTYPE = CCLOADEH;
    TString T = file;
		if(!T.EndsWith(".evo") && !T.EndsWith(".evp"))
		{
      if(isDebug()) cout << "It is not an EVO/EVP file"<<endl;
      return kWarn;
		  
		}
    if(T.EndsWith(".evp")) EVOTYPE = CCLOADEHPLUS;
    
    FILE *evo = fopen(file,"r");
    if(evo==0)
    {
      if(isDebug()) cout << "Error opening EVO/EVP file"<<endl;
      return kWarn;
    }
  
    int NH,NL,NKK,NAUX,KSYS,NSHD,KAUX,ADINIT,tmp;
    char PROG_N[80], DATE[12],TIME[8];
    char* tmp2;
    unsigned char *ioff;
    unsigned int instr[8192];
    unsigned int D=1;
		
    if(isDebug()) cout <<"EVO TYPE = "<<EVOTYPE<<endl;
  
    if(EVOTYPE == CCLOADEH)
    {
      tmp = fscanf(evo,"%d %d %d %d %d %s %s ",&NKK,&NAUX,&KSYS,&NSHD,&KAUX,&DATE[0],&TIME[0]);
      tmp = fscanf(evo,"%76c \n",PROG_N);
      if(isDebug()) cout <<"Loading "<<PROG_N<<endl<<"Date = "<<DATE<<"  Time = "<<TIME<<endl;
      for(int i=0;i<NKK;i++)
      {
        tmp = fscanf(evo,"%x  ",&D);
        instr[i]=D;
        if(instr[i] == 0x2A0000) NH=i+1;  // number of init instructions
      }
    }
    else
    {
      tmp2 = fgets(PROG_N,80,evo); 
      tmp = fscanf(evo,"%d %d %d %d %d %d",&NKK,&KSYS,&KAUX,&NAUX,&NSHD,&ADINIT);
      if(isDebug()) cout <<"Loading "<<PROG_N<<endl;
      for(int i=0;i<NKK;i++)
      {
        tmp = fscanf(evo,"%x  ",&D);
        instr[i]=D;
	if(isDebug()) cout <<"i = "<<i<<(hex)<<"    0x"<<instr[i]<<(dec)<<endl;
        if(instr[i] == 0x00100002) NH=i+1;  // number of init instructions
      }
    
    }
    NL = NKK - NH; // number of loop instructions
    if(isDebug()) cout<<" NH,NL = "<<NH<<"  "<<NL<<endl;
  
    ierr = ioctl(cc_handle, EVOTYPE, (unsigned long) arg);
    ioff = (unsigned char *)instr;
    ierr = write (cc_handle,ioff, NH*4); // load first NH instrutions: this is setup
    ierr = ioctl(cc_handle, EVOTYPE, (unsigned long) arg);
    ioff=ioff+NH*4;
    ierr = write (cc_handle,ioff, NL*4); //load next NL instructions: this is event loop
    arg=256;
    ierr = ioctl(cc_handle, CCMAXSIZE, (unsigned long) arg);
    return kOk;
  }
  return kOk;
}
/*!
*/
int CamacIO::start()
{     
  if(mIsCamac)
  {
    int arg=0x0c03; //Running
    int ierr = ioctl(cc_handle, CCRESET, (unsigned long) arg);
    mResidualSize = 0;
    if(isDebug()) cout <<"CAMAC has started\n";
  } 
  else
  {
    cout <<"CAMAC Connection is not open \n";
    if(isDebug()) return kWarn;
  }
  return kOk;
}
/*!
*/
int CamacIO::setBufferSize(int size)
{     
  if(mIsCamac)
  {
    int arg=size; 
    int size1 = ioctl(cc_handle, CCMAXSIZE, (unsigned long) arg);
    if(isDebug()) cout <<"CAMAC buffer size set to "<<size1<<". Requested value was = "<<size<<"\n";
    return size1;
  } 
  else
  {
    if(isDebug()) cout <<"CAMAC Connection is not open \n";
    return 0;
  }
  return 0;
}
/*!
*/
int CamacIO::stop()
{     
  if(mIsCamac)
  {
    int arg=0x0d03; //Stop
    int ierr = ioctl(cc_handle, CCRESET, (unsigned long) arg);
    if(isDebug()) cout <<"CAMAC has stopped\n";
  } 
  else
  {
    if(isDebug()) cout <<"CAMAC Connection is not open \n";
    return kWarn;
  }
  return kOk;
}
/*!
\param slot is a slot in the camac where the scaler module is located
\param value is an array with the scaler values
*/
int CamacIO::readScalers(int slot,int* value,int crate)
{     
  if(mIsCamac)
  {
    int ierr = ioctl(cc_handle, CCSETCRATE, (unsigned long) crate);
    int Q,X,D;
    int N = slot;
    int F = 0;
    int A = 0;
    for(int i=0;i<12;i++)
    {
      A = i;
      cami24(N,A,F,&D,&Q,&X); 
      value[i] = D;
    }
  } 
  else
  {
    if(isDebug()) cout <<"CAMAC Connection is not open \n";
    for(int i=0;i<12;i++) value[i] = 0;
    return kWarn;
  }
  return kOk;
}
/*!
\param slot is a slot in the camac where the scaler module is located
*/
int CamacIO::clearScalers(int slot,int crate)
{     
  if(mIsCamac)
  {
    int ierr = ioctl(cc_handle, CCSETCRATE, (unsigned long) crate);
    int Q,X,D;
    int N = slot;
    int F = 9;
    int A = 0;
    cami24(N,A,F,&D,&Q,&X); 
  } 
  else
  {
    if(isDebug()) cout <<"CAMAC Connection is not open \n";
    return kWarn;
  }
  return kOk;
}
 CamacIO.cxx:1
 CamacIO.cxx:2
 CamacIO.cxx:3
 CamacIO.cxx:4
 CamacIO.cxx:5
 CamacIO.cxx:6
 CamacIO.cxx:7
 CamacIO.cxx:8
 CamacIO.cxx:9
 CamacIO.cxx:10
 CamacIO.cxx:11
 CamacIO.cxx:12
 CamacIO.cxx:13
 CamacIO.cxx:14
 CamacIO.cxx:15
 CamacIO.cxx:16
 CamacIO.cxx:17
 CamacIO.cxx:18
 CamacIO.cxx:19
 CamacIO.cxx:20
 CamacIO.cxx:21
 CamacIO.cxx:22
 CamacIO.cxx:23
 CamacIO.cxx:24
 CamacIO.cxx:25
 CamacIO.cxx:26
 CamacIO.cxx:27
 CamacIO.cxx:28
 CamacIO.cxx:29
 CamacIO.cxx:30
 CamacIO.cxx:31
 CamacIO.cxx:32
 CamacIO.cxx:33
 CamacIO.cxx:34
 CamacIO.cxx:35
 CamacIO.cxx:36
 CamacIO.cxx:37
 CamacIO.cxx:38
 CamacIO.cxx:39
 CamacIO.cxx:40
 CamacIO.cxx:41
 CamacIO.cxx:42
 CamacIO.cxx:43
 CamacIO.cxx:44
 CamacIO.cxx:45
 CamacIO.cxx:46
 CamacIO.cxx:47
 CamacIO.cxx:48
 CamacIO.cxx:49
 CamacIO.cxx:50
 CamacIO.cxx:51
 CamacIO.cxx:52
 CamacIO.cxx:53
 CamacIO.cxx:54
 CamacIO.cxx:55
 CamacIO.cxx:56
 CamacIO.cxx:57
 CamacIO.cxx:58
 CamacIO.cxx:59
 CamacIO.cxx:60
 CamacIO.cxx:61
 CamacIO.cxx:62
 CamacIO.cxx:63
 CamacIO.cxx:64
 CamacIO.cxx:65
 CamacIO.cxx:66
 CamacIO.cxx:67
 CamacIO.cxx:68
 CamacIO.cxx:69
 CamacIO.cxx:70
 CamacIO.cxx:71
 CamacIO.cxx:72
 CamacIO.cxx:73
 CamacIO.cxx:74
 CamacIO.cxx:75
 CamacIO.cxx:76
 CamacIO.cxx:77
 CamacIO.cxx:78
 CamacIO.cxx:79
 CamacIO.cxx:80
 CamacIO.cxx:81
 CamacIO.cxx:82
 CamacIO.cxx:83
 CamacIO.cxx:84
 CamacIO.cxx:85
 CamacIO.cxx:86
 CamacIO.cxx:87
 CamacIO.cxx:88
 CamacIO.cxx:89
 CamacIO.cxx:90
 CamacIO.cxx:91
 CamacIO.cxx:92
 CamacIO.cxx:93
 CamacIO.cxx:94
 CamacIO.cxx:95
 CamacIO.cxx:96
 CamacIO.cxx:97
 CamacIO.cxx:98
 CamacIO.cxx:99
 CamacIO.cxx:100
 CamacIO.cxx:101
 CamacIO.cxx:102
 CamacIO.cxx:103
 CamacIO.cxx:104
 CamacIO.cxx:105
 CamacIO.cxx:106
 CamacIO.cxx:107
 CamacIO.cxx:108
 CamacIO.cxx:109
 CamacIO.cxx:110
 CamacIO.cxx:111
 CamacIO.cxx:112
 CamacIO.cxx:113
 CamacIO.cxx:114
 CamacIO.cxx:115
 CamacIO.cxx:116
 CamacIO.cxx:117
 CamacIO.cxx:118
 CamacIO.cxx:119
 CamacIO.cxx:120
 CamacIO.cxx:121
 CamacIO.cxx:122
 CamacIO.cxx:123
 CamacIO.cxx:124
 CamacIO.cxx:125
 CamacIO.cxx:126
 CamacIO.cxx:127
 CamacIO.cxx:128
 CamacIO.cxx:129
 CamacIO.cxx:130
 CamacIO.cxx:131
 CamacIO.cxx:132
 CamacIO.cxx:133
 CamacIO.cxx:134
 CamacIO.cxx:135
 CamacIO.cxx:136
 CamacIO.cxx:137
 CamacIO.cxx:138
 CamacIO.cxx:139
 CamacIO.cxx:140
 CamacIO.cxx:141
 CamacIO.cxx:142
 CamacIO.cxx:143
 CamacIO.cxx:144
 CamacIO.cxx:145
 CamacIO.cxx:146
 CamacIO.cxx:147
 CamacIO.cxx:148
 CamacIO.cxx:149
 CamacIO.cxx:150
 CamacIO.cxx:151
 CamacIO.cxx:152
 CamacIO.cxx:153
 CamacIO.cxx:154
 CamacIO.cxx:155
 CamacIO.cxx:156
 CamacIO.cxx:157
 CamacIO.cxx:158
 CamacIO.cxx:159
 CamacIO.cxx:160
 CamacIO.cxx:161
 CamacIO.cxx:162
 CamacIO.cxx:163
 CamacIO.cxx:164
 CamacIO.cxx:165
 CamacIO.cxx:166
 CamacIO.cxx:167
 CamacIO.cxx:168
 CamacIO.cxx:169
 CamacIO.cxx:170
 CamacIO.cxx:171
 CamacIO.cxx:172
 CamacIO.cxx:173
 CamacIO.cxx:174
 CamacIO.cxx:175
 CamacIO.cxx:176
 CamacIO.cxx:177
 CamacIO.cxx:178
 CamacIO.cxx:179
 CamacIO.cxx:180
 CamacIO.cxx:181
 CamacIO.cxx:182
 CamacIO.cxx:183
 CamacIO.cxx:184
 CamacIO.cxx:185
 CamacIO.cxx:186
 CamacIO.cxx:187
 CamacIO.cxx:188
 CamacIO.cxx:189
 CamacIO.cxx:190
 CamacIO.cxx:191
 CamacIO.cxx:192
 CamacIO.cxx:193
 CamacIO.cxx:194
 CamacIO.cxx:195
 CamacIO.cxx:196
 CamacIO.cxx:197
 CamacIO.cxx:198
 CamacIO.cxx:199
 CamacIO.cxx:200
 CamacIO.cxx:201
 CamacIO.cxx:202
 CamacIO.cxx:203
 CamacIO.cxx:204
 CamacIO.cxx:205
 CamacIO.cxx:206
 CamacIO.cxx:207
 CamacIO.cxx:208
 CamacIO.cxx:209
 CamacIO.cxx:210
 CamacIO.cxx:211
 CamacIO.cxx:212
 CamacIO.cxx:213
 CamacIO.cxx:214
 CamacIO.cxx:215
 CamacIO.cxx:216
 CamacIO.cxx:217
 CamacIO.cxx:218
 CamacIO.cxx:219
 CamacIO.cxx:220
 CamacIO.cxx:221
 CamacIO.cxx:222
 CamacIO.cxx:223
 CamacIO.cxx:224
 CamacIO.cxx:225
 CamacIO.cxx:226
 CamacIO.cxx:227
 CamacIO.cxx:228
 CamacIO.cxx:229
 CamacIO.cxx:230
 CamacIO.cxx:231
 CamacIO.cxx:232
 CamacIO.cxx:233
 CamacIO.cxx:234
 CamacIO.cxx:235
 CamacIO.cxx:236
 CamacIO.cxx:237
 CamacIO.cxx:238
 CamacIO.cxx:239
 CamacIO.cxx:240
 CamacIO.cxx:241
 CamacIO.cxx:242
 CamacIO.cxx:243
 CamacIO.cxx:244
 CamacIO.cxx:245
 CamacIO.cxx:246
 CamacIO.cxx:247
 CamacIO.cxx:248
 CamacIO.cxx:249
 CamacIO.cxx:250
 CamacIO.cxx:251
 CamacIO.cxx:252
 CamacIO.cxx:253
 CamacIO.cxx:254
 CamacIO.cxx:255
 CamacIO.cxx:256
 CamacIO.cxx:257
 CamacIO.cxx:258
 CamacIO.cxx:259
 CamacIO.cxx:260
 CamacIO.cxx:261
 CamacIO.cxx:262
 CamacIO.cxx:263
 CamacIO.cxx:264
 CamacIO.cxx:265
 CamacIO.cxx:266
 CamacIO.cxx:267
 CamacIO.cxx:268
 CamacIO.cxx:269
 CamacIO.cxx:270
 CamacIO.cxx:271
 CamacIO.cxx:272
 CamacIO.cxx:273
 CamacIO.cxx:274
 CamacIO.cxx:275
 CamacIO.cxx:276
 CamacIO.cxx:277
 CamacIO.cxx:278
 CamacIO.cxx:279
 CamacIO.cxx:280
 CamacIO.cxx:281
 CamacIO.cxx:282
 CamacIO.cxx:283
 CamacIO.cxx:284
 CamacIO.cxx:285
 CamacIO.cxx:286
 CamacIO.cxx:287
 CamacIO.cxx:288
 CamacIO.cxx:289
 CamacIO.cxx:290
 CamacIO.cxx:291
 CamacIO.cxx:292
 CamacIO.cxx:293
 CamacIO.cxx:294
 CamacIO.cxx:295
 CamacIO.cxx:296
 CamacIO.cxx:297
 CamacIO.cxx:298
 CamacIO.cxx:299
 CamacIO.cxx:300
 CamacIO.cxx:301
 CamacIO.cxx:302
 CamacIO.cxx:303
 CamacIO.cxx:304
 CamacIO.cxx:305
 CamacIO.cxx:306
 CamacIO.cxx:307
 CamacIO.cxx:308
 CamacIO.cxx:309
 CamacIO.cxx:310
 CamacIO.cxx:311