Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  

TimModule.cxx

Go to the documentation of this file.
00001 //File: TimModule.cxx
00002 
00029 #include <iostream>  // for debug only
00030 
00031 using namespace std;
00032 
00033 #include "TimModule.h"
00034 
00035 // Namespace for the common routines for SCT and PIXEL ROD software.
00036 
00037 namespace SctPixelRod {
00038 
00039 // ************************* Class TimException ******************************
00040 
00042 
00043 TimException::TimException( std::string descriptor, int data1, int data2 ) :
00044              BaseException( descriptor ) {
00045 
00046   m_data1 = data1;
00047   m_data2 = data2;
00048   setType( TIM );
00049 }
00050 
00051 void TimException::what( std::ostream& os ) {
00052 
00053   os << "TimException: " << getDescriptor() << endl;
00054   os << "Data1: " << getData1() << endl;
00055   os << "Data2: " << getData2() << endl;
00056 }
00057 
00058 // ************************* Class TimModule *********************************
00059 
00060 // Constructors, destructor, and assignment
00061 
00062 // ------------------------- Constructor -------------------------------------
00063 
00065 
00069 TimModule::TimModule( UINT32 baseAddr, UINT32 mapSize, VmeInterface & vme ) :
00070            VmeModule( baseAddr, mapSize, vme ) {
00071 
00072   m_serialNumber = 0xFFFFFFFF;  // Set in initialize
00073 
00074   if (&vme == 0) throw TimException( "TimModule has no VmeInterface", 0, 0 );
00075 
00076   try {
00077     m_vmePort = new VmePort( baseAddr, mapSize, VmeInterface::A32, vme );
00078 
00079     m_vmePort->setExceptionTrapping( true );
00080   }
00081   catch (bad_alloc) {
00082     throw TimException( "TimModule caught bad_alloc", 0, 0 );
00083   }
00084   catch (VmeException x) {
00085     throw TimException( "TimModule caught VmeException",
00086                         x.getErrorClass(), x.getErrorCode() );
00087   }
00088 }
00089 
00090 // ------------------------- Destructor --------------------------------------
00091 
00095 TimModule::~TimModule() {
00096 
00097   delete m_vmePort;
00098   m_vmePort = 0;
00099 }
00100 
00101 // ---------------------------------------------------------------------------
00102 
00103 // Member methods
00104 
00105 // ------------------------- initialize --------------------------------------
00106 
00110 void TimModule::initialize() {
00111 
00112   // enable serial output streams
00113   regLoad( TIM_REG_RUN_ENABLES, TIM_BIT_EN_ID | TIM_BIT_EN_TYPE );
00114   regLoad( TIM_REG_COMMAND, 0 );                    // ensure stand-alone mode
00115   regLoad( TIM_REG_TRIGGER_BCID, TIM_BCID_OFFSET << 12 );  // set BCID offset
00116   fetchTimID();                                          // read serial number
00117 }
00118 
00119 // ------------------------- reset -------------------------------------------
00120 
00124 void TimModule::reset() {
00125 
00126   regLoad( TIM_REG_COMMAND, TIM_BIT_VRESET );
00127 }
00128 
00129 // ------------------------- status ------------------------------------------
00130 
00135 void TimModule::status() {
00136 
00137   cout << "status" << endl;
00138 
00139   cout << " Serial Number: " << m_serialNumber;
00140   cout << " Version: "       << m_firmware;
00141   cout << endl;
00142   hex(cout);
00143   cout << " L1ID: "   << fetchL1ID();
00144   cout << " BCID: "   << regFetch( TIM_REG_TRIGGER_BCID );
00145   cout << " status: " << regFetch( TIM_REG_STATUS );
00146   cout << endl;
00147   dec(cout);
00148 }
00149 
00150 // ------------------------- fetchL1ID ---------------------------------------
00154 UINT32 TimModule::fetchL1ID() {
00155 
00156   const UINT32 lo = regFetch( TIM_REG_TRIGGER_IDLO );
00157   const UINT32 hi = regFetch( TIM_REG_TRIGGER_IDHI );
00158   UINT32 l1id;
00159 
00160   if (m_firmware < 9) l1id = (lo & 0x0FFF) + ((hi & 0x0FFF) << 12);
00161   else                l1id = (lo & 0xFFFF) + ((hi & 0x00FF) << 16);
00162   return l1id;
00163 }
00164 
00165 // ------------------------- fetchTimID --------------------------------------
00166 
00170 UINT16 TimModule::fetchTimID() {
00171 
00172   const UINT16 timID = regFetch( TIM_REG_TIM_ID );
00173 
00174   m_serialNumber = timID & 0xFF;
00175   m_firmware     = timID >> 8;
00176   return timID;
00177 }
00178 
00179 // ------------------------- intTrigStart ------------------------------------
00180 
00184 void TimModule::intTrigStart( const TimMaskFrequency frequency ) {
00185 
00186   loadByteLo( TIM_REG_FREQUENCY, frequency );
00187   loadBitSet( TIM_REG_ENABLES, TIM_BIT_EN_INT_TRIG );
00188 }
00189 
00190 // ------------------------- intTrigStop -------------------------------------
00191 
00195 void TimModule::intTrigStop(void) { //*** void
00196 
00197   loadBitClear( TIM_REG_ENABLES, TIM_BIT_EN_INT_TRIG );
00198 }
00199 
00200 // ------------------------- issueCommand ------------------------------------
00201 
00205 void TimModule::issueCommand( const TimBitCommand mask ) {
00206 
00207   if (mask >  TIM_VSPA) loadBitClear( TIM_REG_COMMAND, mask );
00208   loadBitSet( TIM_REG_COMMAND, mask );
00209   if (mask >  TIM_VSPA) loadBitClear( TIM_REG_COMMAND, mask );
00210 }
00211 
00212 // ------------------------- issueVCAL ---------------------------------------
00213 
00218 void TimModule::issueVCAL( const UINT8 pipelineDelay ) {
00219 
00220   loadByteLo(   TIM_REG_DELAY, pipelineDelay );
00221   issueCommand( TIM_VCAL );
00222 }
00223 
00224 // ------------------------- loadBitSet --------------------------------------
00225 
00230 void TimModule::loadBitSet( const TimRegister addr, const UINT16 mask ) {
00231 
00232   UINT16 value = vmeFetch( addr );
00233   vmeLoad( addr, value | mask );
00234 }
00235 
00236 // ------------------------- loadBitClear ------------------------------------
00237 
00242 void TimModule::loadBitClear( const TimRegister addr, const UINT16 mask ) {
00243 
00244   UINT16 value = vmeFetch( addr );
00245   vmeLoad( addr, value & ~mask );
00246 }
00247 
00248 // ------------------------- loadByteHi --------------------------------------
00249 
00254 void TimModule::loadByteHi( const TimRegister addr, const UINT8 byte ) {
00255 
00256   UINT16 value = vmeFetch( addr );
00257   vmeLoad( addr, (value & 0x00FF) | (byte << 8) );
00258 }
00259 
00260 // ------------------------- loadByteLo --------------------------------------
00261 
00266 void TimModule::loadByteLo( const TimRegister addr, const UINT8 byte ) {
00267 
00268   UINT16 value = vmeFetch( addr );
00269   vmeLoad( addr, (value & 0xFF00) | byte );
00270 }
00271 
00272 // ------------------------- regFetch ----------------------------------------
00273 
00277 UINT16 TimModule::regFetch( const TimRegister addr ) {
00278 
00279   UINT16 data = vmeFetch( addr );
00280   return data;
00281 }
00282 
00283 // ------------------------- regLoad -----------------------------------------
00284 
00288 void TimModule::regLoad( const TimRegister addr, const UINT16 data ) {
00289 
00290   vmeLoad( addr, data );
00291 }
00292 
00293 // ------------------------- seqRun ------------------------------------------
00294 
00298 void TimModule::seqRun( const UINT16 size ) {
00299 
00300   regLoad( TIM_REG_SEQ_END,     size - 1 );
00301   regLoad( TIM_REG_SEQ_CONTROL, TIM_BIT_SEQ_RESET );
00302   regLoad( TIM_REG_SEQ_CONTROL, 0 );
00303   regLoad( TIM_REG_SEQ_CONTROL, TIM_BIT_SEQ_GO | TIM_BIT_SEQ_EN_ALL );
00304   // all outputs enabled
00305 }
00306 
00307 // ------------------------- seqFetch ----------------------------------------
00308 
00312 void TimModule::seqFetch( const UINT16 size, UINT16 buffer[] ) {
00313 
00314   for (int i = 0; i < size; i++) {
00315     buffer[i] = vmeFetch( TIM_SEQ_ADDR + i*2 );
00316   }
00317 }
00318 
00319 // ------------------------- seqLoad -----------------------------------------
00320 
00324 void TimModule::seqLoad( const UINT16 size, const UINT16 buffer[] ) {
00325 
00326   UINT16 data;
00327   for (int i = 0; i < size; i++) {
00328     data = buffer[i];
00329     vmeLoad( TIM_SEQ_ADDR + i*2, data );
00330   }
00331 }
00332 
00333 // ------------------------- vmeFetch ----------------------------------------
00334 
00338 UINT16 TimModule::vmeFetch( const UINT32 addr )
00339                   throw (VmeException &) {
00340 
00341   UINT16 data = 0;
00342   try {
00343     data = m_vmePort->read16( addr );
00344   }
00345   catch (VmeException & vmeFailed) {
00346     // Leave critical section before re-throwing the error
00347     throw vmeFailed;
00348   }
00349   return data;
00350 }
00351 
00352 // ------------------------- vmeLoad -----------------------------------------
00353 
00357 void TimModule::vmeLoad( const UINT32 addr, const UINT16 data )
00358                 throw (VmeException & ) {
00359 
00360   try {
00361     m_vmePort->write16( addr, data );
00362 //debug  throw VmeException(VmeException::BUS_ERROR, 1, m_vmePort);
00363   }
00364   catch (VmeException & vmeFailed) {
00365     // Leave critical section before re-throwing the error
00366     throw vmeFailed;
00367   }
00368 }
00369 
00370 } // End namespace SctPixelRod
00371 
00372 // ------------------------- Overload operator<< -----------------------------
00373 
00378 using namespace SctPixelRod;
00379 
00380 namespace std {
00381 
00382 ostream& operator<<( ostream& os, TimModule& tim ) {
00383 
00384   os << "TIM status" << endl;
00385 
00386   os << " Serial Number: " << tim.getSerialNumber();
00387   os << " Version: "       << tim.getFirmware() << endl;
00388   hex(cout);
00389   os << " L1ID: "   << tim.fetchL1ID();
00390   os << " BCID: "   << tim.regFetch( TIM_REG_TRIGGER_BCID );
00391   os << " status: " << tim.regFetch( TIM_REG_STATUS );
00392   os << endl;
00393 
00394   return os;
00395 }
00396 
00397 } // End namespace std

Generated on Sun Jun 27 19:57:31 2004 for TimModule by doxygen1.2.14 written by Dimitri van Heesch, © 1997-2002