00001
00002
00029 #include <iostream>
00030
00031 using namespace std;
00032
00033 #include "TimModule.h"
00034
00035
00036
00037 namespace SctPixelRod {
00038
00039
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
00059
00060
00061
00062
00063
00065
00069 TimModule::TimModule( UINT32 baseAddr, UINT32 mapSize, VmeInterface & vme ) :
00070 VmeModule( baseAddr, mapSize, vme ) {
00071
00072 m_serialNumber = 0xFFFFFFFF;
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
00091
00095 TimModule::~TimModule() {
00096
00097 delete m_vmePort;
00098 m_vmePort = 0;
00099 }
00100
00101
00102
00103
00104
00105
00106
00110 void TimModule::initialize() {
00111
00112
00113 regLoad( TIM_REG_RUN_ENABLES, TIM_BIT_EN_ID | TIM_BIT_EN_TYPE );
00114 regLoad( TIM_REG_COMMAND, 0 );
00115 regLoad( TIM_REG_TRIGGER_BCID, TIM_BCID_OFFSET << 12 );
00116 fetchTimID();
00117 }
00118
00119
00120
00124 void TimModule::reset() {
00125
00126 regLoad( TIM_REG_COMMAND, TIM_BIT_VRESET );
00127 }
00128
00129
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
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
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
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
00191
00195 void TimModule::intTrigStop(void) {
00196
00197 loadBitClear( TIM_REG_ENABLES, TIM_BIT_EN_INT_TRIG );
00198 }
00199
00200
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
00213
00218 void TimModule::issueVCAL( const UINT8 pipelineDelay ) {
00219
00220 loadByteLo( TIM_REG_DELAY, pipelineDelay );
00221 issueCommand( TIM_VCAL );
00222 }
00223
00224
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
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
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
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
00273
00277 UINT16 TimModule::regFetch( const TimRegister addr ) {
00278
00279 UINT16 data = vmeFetch( addr );
00280 return data;
00281 }
00282
00283
00284
00288 void TimModule::regLoad( const TimRegister addr, const UINT16 data ) {
00289
00290 vmeLoad( addr, data );
00291 }
00292
00293
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
00305 }
00306
00307
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
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
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
00347 throw vmeFailed;
00348 }
00349 return data;
00350 }
00351
00352
00353
00357 void TimModule::vmeLoad( const UINT32 addr, const UINT16 data )
00358 throw (VmeException & ) {
00359
00360 try {
00361 m_vmePort->write16( addr, data );
00362
00363 }
00364 catch (VmeException & vmeFailed) {
00365
00366 throw vmeFailed;
00367 }
00368 }
00369
00370 }
00371
00372
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 }