Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Data Structures | File List | Namespace Members | Data Fields | Globals | Related Pages

SlvSnap.cxx

00001 
00009 #include <iostream>
00010 using namespace std;
00011 
00012 #include <ctype.h>
00013 
00014 #include "RodModule.h"
00015 
00016 #include "RCCVmeInterface.h"
00017 
00018 int main(int argc, char *argv[]) {
00019 
00020 using namespace SctPixelRod;
00021 
00022   const unsigned long mapSize=0xc00040;         // Map size
00023   const long numSlaves=4;                       // Number of slaves
00024   unsigned long numWords;                       // Number of words to dump
00025   long dspStart;                                // Address limits to dump
00026   unsigned long statusVal;
00027   unsigned long txtAddress[4] = {ERR_BUFF_BASE, INFO_BUFF_BASE, \
00028           DIAG_BUFF_BASE, XFER_BUFF_BASE};
00029   unsigned long slvHpic;
00030   unsigned long hpicValue;
00031   void* genPtr;
00032   char* textBuff;
00033   clock_t startTime;
00034 
00035   long slvNumber = -1;
00036   std::string fileName(""), option;
00037   int slot = -1;
00038   unsigned long baseAddress;
00039   bool slaveRunning;
00040 
00041   if (argc > 1) {
00042     for (int i=1; i<argc; i++) {
00043       option = argv[i];
00044       if (option[0] != '-') break;
00045       switch (option[1]) {
00046         case 's': {
00047           slot = atoi(option.substr(2).c_str());
00048           break;
00049         }
00050         case 'v': {
00051           slvNumber = atoi(option.substr(2).c_str());
00052           break;
00053         }
00054         default: {
00055           break;
00056         }
00057       }
00058     }
00059   }
00060 
00061 // Prompt for slot number
00062   if (slot < 0 ) {
00063     cout << "Enter slot number (decimal):"; 
00064     cin >> slot;
00065     while ((slot < 1) || (slot > 21)) {
00066       cout << "Slot number out or range [1:21], re-enter: ";
00067       cin >> slot;
00068     }
00069   }
00070   baseAddress = slot << 24;
00071 
00072 // Create VME interface
00073   RCCVmeInterface *vme1 = new RCCVmeInterface();
00074   
00075 // Create RodModule but do not initialize it
00076   RodModule* rod0 = new RodModule(baseAddress, mapSize, *vme1, numSlaves);
00077 
00078 // Get Slave number to read
00079   if (slvNumber < 0 ) {
00080     cout << "Enter slave number (0-3):"; 
00081     cin >> slvNumber;
00082     while ((slvNumber < 0) || (slvNumber > 3)) {
00083       cout << "Slave number out or range [0:3], re-enter: ";
00084       cin >> slvNumber;
00085     }
00086   }
00087 
00088 // Check if slave is executing. Stop MDSP DMA access, if so.
00089   slaveRunning = false;
00090   slvHpic = SLAVE_HPIC_BASE + slvNumber*SLAVE_HPI_OFFSET;
00091   hpicValue = rod0->mdspSingleRead(slvHpic);
00092   if (hpicValue == 0xb000b) {
00093     slaveRunning = true;
00094     rod0->setVmeCommandRegBit(CR_DMA_ACCESS_REQ);
00095     startTime = clock();
00096     do {
00097       statusVal = rod0->slvSingleRead(STATUS_REG[0], slvNumber);
00098       if (statusVal == 0x1>>SR_DMA_ACCESS_ERR) {
00099         cout << "Error setting slave DMA ACCESS bit. Program terminating" << endl;
00100         return 0;
00101       }
00102       if ((clock()-startTime)/CLOCKS_PER_SEC > DSP_RESET_TIMEOUT) {
00103         cout << "Timeout waiting for SR_ACCESS_ACK" << endl;
00104       }
00105     } while (statusVal & 0x1>>SR_DMA_ACCESS_ACK);
00106   }
00107        
00108   dspStart = SLAVE_PRIM_BUFF_BASE;
00109   numWords = rod0->slvSingleRead(dspStart, slvNumber);
00110   if (numWords > PRIM_BUFF_SIZE) numWords = PRIM_BUFF_SIZE;
00111   unsigned long * buffer = new unsigned long[numWords];
00112   rod0->slvBlockRead(dspStart, buffer, numWords, slvNumber);
00113   
00114 // output the data and delete the buffer
00115   cout << "PRIM Buffer:" << endl;
00116   hex(cout);
00117   cout.fill('0');
00118   for (unsigned int i=0; i<numWords; i+=8) {
00119     cout.width(8); cout << buffer[i]   << ' ';
00120     cout.width(8); cout << buffer[i+1] << ' ';
00121     cout.width(8); cout << buffer[i+2] << ' ';
00122     cout.width(8); cout << buffer[i+3] << ' ';
00123     cout.width(8); cout << buffer[i+4] << ' ';
00124     cout.width(8); cout << buffer[i+5] << ' ';
00125     cout.width(8); cout << buffer[i+6] << ' ';
00126     cout.width(8); cout << buffer[i+7] << endl;
00127   }
00128   dec(cout);
00129   cout.fill(' ');
00130   delete [] buffer;
00131     
00132 // Get the REPLY buffer
00133     dspStart = SLAVE_REPLY_BUFF_BASE;
00134     numWords = rod0->slvSingleRead(dspStart, slvNumber);
00135     if (numWords > REPLY_BUFF_SIZE) numWords = REPLY_BUFF_SIZE;
00136     buffer = new unsigned long[numWords];
00137     rod0->slvBlockRead(dspStart, buffer, numWords, slvNumber);
00138   
00139 // output the data and delete the buffer
00140     cout << "REPLY Buffer:" << endl;
00141   hex(cout);
00142   cout.fill('0');
00143   for (unsigned int i=0; i<numWords; i+=8) {
00144     cout.width(8); cout << buffer[i]   << ' ';
00145     cout.width(8); cout << buffer[i+1] << ' ';
00146     cout.width(8); cout << buffer[i+2] << ' ';
00147     cout.width(8); cout << buffer[i+3] << ' ';
00148     cout.width(8); cout << buffer[i+4] << ' ';
00149     cout.width(8); cout << buffer[i+5] << ' ';
00150     cout.width(8); cout << buffer[i+6] << ' ';
00151     cout.width(8); cout << buffer[i+7] << endl;
00152   }
00153   dec(cout);
00154   cout.fill(' ');
00155   delete [] buffer;
00156 
00157 // Read and print the status and command registers  
00158   hex(cout);
00159   for (int i=0; i<3; i++) {
00160     statusVal = rod0->slvSingleRead(STATUS_REG[i], slvNumber);
00161     cout << "Status register " << i << " (hex)  = ";
00162     cout.width(8);
00163     cout << statusVal << endl;
00164   }
00165   for (int i=0; i<1; i++) {
00166     statusVal = rod0->slvSingleRead(COMMAND_REG[i], slvNumber);
00167     cout << "Command register " << i << " (hex) = ";
00168     cout.width(8);
00169     cout << statusVal << endl;
00170   }
00171   dec(cout);
00172     
00173 // Read and print all four text buffers in both hex and ascii
00174   numWords = 512;  
00175   for (int ibuf=0; ibuf<4; ibuf++) {
00176     dspStart = txtAddress[ibuf];
00177     unsigned long * buffer = new unsigned long[numWords];
00178     rod0->slvBlockRead(dspStart, buffer, numWords, slvNumber);
00179     switch(ibuf) {
00180       case 0: cout << endl << "Hexadecimal dump of ERR buffer:" << endl;
00181               break;
00182       case 1: cout << endl << "Hexadecimal dump of INFO buffer:" << endl;
00183               break;
00184       case 2: cout << endl << "Hexadecimal dump of DIAG buffer:" << endl;
00185               break;
00186       case 3: cout << endl << "Hexadecimal dump of XFER buffer:" << endl;
00187               break;
00188       }
00189     hex(cout);
00190     cout.fill('0');
00191     for (unsigned int i=0; i<numWords; i+=8) {
00192       cout.width(8); cout << buffer[i]   << ' ';
00193       cout.width(8); cout << buffer[i+1] << ' ';
00194       cout.width(8); cout << buffer[i+2] << ' ';
00195       cout.width(8); cout << buffer[i+3] << ' ';
00196       cout.width(8); cout << buffer[i+4] << ' ';
00197       cout.width(8); cout << buffer[i+5] << ' ';
00198       cout.width(8); cout << buffer[i+6] << ' ';
00199       cout.width(8); cout << buffer[i+7] << endl;
00200     }
00201     dec(cout);
00202     cout.fill(' ');
00203     genPtr = static_cast<void*>(buffer);
00204     textBuff = static_cast<char*>(genPtr);
00205     switch(ibuf) {
00206       case 0: cout << endl << "ASCII dump of ERR buffer:" << endl;
00207               break;
00208       case 1: cout << endl << "ASCII dump of INFO buffer:" << endl;
00209               break;
00210       case 2: cout << endl << "ASCII dump of DIAG buffer:" << endl;
00211               break;
00212       case 3: cout << endl << "ASCII dump of XFER buffer:" << endl;
00213               break;
00214       }
00215       for (unsigned int itext = 0; itext< 4*numWords; itext++) {
00216         if ((textBuff[itext]<' ') || (textBuff[itext] > '~')) textBuff[itext] = '.';
00217         cout << textBuff[itext];
00218         if ((itext+1)%64 == 0) cout << endl;
00219       }
00220       cout << endl;
00221         
00222     delete [] buffer;
00223   }
00224 
00225 // Restart master dma access if it was halted
00226   if (slaveRunning) {
00227     slaveRunning = false;
00228     rod0->clearVmeCommandRegBit(CR_DMA_ACCESS_REQ);
00229     do {
00230       statusVal = rod0->slvSingleRead(STATUS_REG[0], slvNumber);
00231       if (statusVal == 0x1>>SR_DMA_ACCESS_ERR) {
00232         cout << "Error setting slave DMA ACCESS bit. Program terminating" << endl;
00233         return 0;
00234       }
00235     } while ((statusVal & 0x1>>SR_DMA_ACCESS_ACK));
00236   } 
00237   
00238 // Clean up before exiting
00239   delete rod0;
00240   delete vme1;
00241 
00242   return 0;  
00243 }
00244 
00245 

Generated on Fri Dec 16 19:38:20 2005 for SCT DAQ/DCS Software - C++ by doxygen 1.3.5