// Test program to test the methods for reading to and writing from slave memory #include using namespace std; #include #include "RodModule.h" #include "primParams.h" #include "RCCVmeInterface.h" #include "parameters.h" int main(int argc, char *argv[]) { using namespace SctPixelRod; unsigned long startAddr; long numWords; long slvNumber = -1; std::string option; int slot = -1; unsigned long baseAddress, txtBuffSize; MdspMemoryMap* mdspMap; if (argc > 1) { for (int i=1; i> slot; while ((slot < 1) || (slot > 21)) { cout << "Slot number out or range [1:21], re-enter: "; cin >> slot; } } baseAddress = slot << 24; // Create VME interface RCCVmeInterface *vme1; try { vme1 = new RCCVmeInterface(); } catch (VmeException &v) { cout << "VmeException creating VME interface." << endl; cout << "ErrorClass = " << v.getErrorClass() << endl; cout << "ErrorCode = " << v.getErrorCode() << endl; } // Create RodModule and initialize it RodModule* rod0 = new RodModule(baseAddress, mapSize, *vme1, numSlaves); try{ rod0->initialize(false); } catch (HpiException &h) { cout << h; return 1; } catch (VmeException &v) { cout << "VmeException initialising RodModule." << endl; cout << "ErrorClass = " << v.getErrorClass() << endl; cout << "ErrorCode = " << v.getErrorCode() << endl; return 1; } catch (RodException &r) { cout << r; return 1; } catch (BaseException &b) { cout << b; return 1; } // Create a buffer for text messages mdspMap = rod0->getMdspMap(); txtBuffSize = mdspMap->txtBufferSize(0); char * myTextBuffer; try { myTextBuffer= new char[txtBuffSize]; } catch (std::bad_alloc) { cout << "Unable to allocate text buffer in main."; } // Get Slave number if (slvNumber < 0 ) { cout << "Enter slave number (0-3):"; cin >> slvNumber; while ((slvNumber < 0) || (slvNumber > 3)) { cout << "Slave number out or range [0:3], re-enter: "; cin >> slvNumber; } } // Read and save the original contents of memory from 0x20 through 0x3F cout << "Reading eight word block from slave addresses 0x20 to 0x3F\n"; numWords = 8; unsigned long* blockData; blockData = new unsigned long[numWords]; startAddr = 0x20; try { rod0->slvBlockRead( startAddr, blockData, numWords, slvNumber); } catch (RodException &r) { cout << r.getDescriptor() << " " << "\n"; }; cout << "Result: "; for (int i=0; i< numWords; i++) { cout << hex << blockData[i] << " "; } cout << endl; // Do a single word write, then read it back to verify it unsigned long testWord=0xc0deface; unsigned long readWord; cout << "Writing a single word to slave address 0x20\n"; startAddr = 0x20; try { rod0->slvSingleWrite(startAddr, testWord, slvNumber); } catch (RodException &r) { cout << r.getDescriptor() << " " << endl; }; cout << "Reading a single word from slave address 0x20\n"; try { readWord = rod0->slvSingleRead(startAddr, slvNumber); } catch (RodException &r) { cout << r.getDescriptor() << " " << "\n"; }; cout << "Result: " << hex << readWord << endl; // Write a block to 0x20 through 0x3F unsigned long* testData; testData = new unsigned long[numWords]; for (int ii=0; iislvBlockWrite( startAddr, testData, numWords, slvNumber); } catch (RodException &r) { cout << r.getDescriptor() << " " << "\n"; }; for (int i=0; i < numWords; i++) { testData[i] = 0; } // Read the block back cout << "Reading the eight word block back\n"; try { rod0->slvBlockRead( startAddr, testData, numWords, slvNumber); } catch (RodException &r) { cout << r.getDescriptor() << " " << "\n"; }; cout << "Result: "; for (int i=0; i< numWords; i++) { cout << hex << testData[i] << " "; } cout << endl; // Write the original data back in cout << "Writing original data block to slave addresses 0x20 to 0x3F\n"; try { rod0->slvBlockWrite( startAddr, blockData, numWords, slvNumber); } catch (RodException &r) { cout << r.getDescriptor() << " " << "\n"; }; // Clean up: clear primList, delete primitive, delete the outList delete [] blockData; delete [] testData; delete [] myTextBuffer; // Delete the ROD and VME objects before exiting delete rod0; delete vme1; return 0; }