// Test program to send a single ECHO primitive to a slave DSP // // The output consists of a buffer of three primitives: // 1. An ECHO reply from the MDSP with "beef" data // 2. A reply from a SEND_SLAVE_LIST primitive with data in the following format: // a. a primitive list with one primitive // b. an ECHO reply from the slave with "feed" data // 3. An ECHO reply from the MDSP with "cafe" data #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; int slaveNumber=-1; RodPrimList primList(1); // Primitive List long myTextLength; // Actual length of text message TEXT_BUFFER_TYPE myTextType; // Buffer type for latest message PrimState returnPState; TextBuffState returnTState; std::string ipramFile("../Dsp/Pixel/Binary/sdsp_ipram.bin"); std::string idramFile("../Dsp/Pixel/Binary/sdsp_idram.bin"); std::string extFile("../Dsp/Pixel/Binary/sdsp_xcode.bin"); std::string fileName(""), option; bool initRod = true; 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 = new RCCVmeInterface(); // Create RodModule and initialize it RodModule* rod0 = new RodModule(baseAddress, mapSize, *vme1, numSlaves); if (initRod) { try{ rod0->initialize(); } catch (HpiException &h) { cout << h; } catch (VmeException &v) { cout << "VmeException creating RodModule." << endl; cout << "ErrorClass = " << v.getErrorClass() << endl; cout << "ErrorCode = " << v.getErrorCode() << endl; } catch (RodException &r) { cout << r; } } // Initialize slave if (slaveNumber < 0 ) { cout << "Enter slave number (0-3):"; cin >> slaveNumber; while ((slaveNumber < 0) || (slaveNumber > 3)) { cout << "Slave number out or range [0:3], re-enter: "; cin >> slaveNumber; } } try { rod0->initSlaveDsp(ipramFile, idramFile, extFile, slaveNumber, 'v'); } catch (RodException & r) { cout << r.getDescriptor() <<", " << r.getData1() << ", " << r.getData2() << '\n'; }; // 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."; } // Create and Send an ECHO primitive to a slave DSP long sdataLength; // cout << "Enter number of data words for Slave DSP: "; // cin >> sdataLength; sdataLength = 16; long* echoData; try { echoData = new long[sdataLength]; } catch (std::bad_alloc) { cout << "Unable to allocate echoData in main."; } for (long i=0; igetDescriptor() << " "; cout << p->getData1() << ", " << p->getData2() << "\n"; }; delete [] mechoData; delete [] mechoData2; try { rod0->sendPrimList(&primList); } catch (HpiException *h) { hex(cout); cout << h->getDescriptor() << '\n'; cout << "calcAddr: " << h->getCalcAddr() << ", readAddr: " << h->getReadAddr() << '\n'; dec(cout); } catch (VmeException &v) { cout << "VmeException in SendPrimList." << endl; cout << "ErrorClass = " << v.getErrorClass() << endl; cout << "ErrorCode = " << v.getErrorCode() << endl; }; // Wait for ROD to begin executing and then wait for it to finish executing // Check for error messages in text buffer and read them out if they exist. // Note: this is NOT how primHandler and textHandler will be used once we // go to threads. This is for debugging the code only. do { try { returnPState = rod0->primHandler(); } catch (VmeException &v) { cout << "VmeException in first primHandler call." << endl; cout << "ErrorClass = " << v.getErrorClass() << endl; cout << "ErrorCode = " << v.getErrorCode() << endl; } try { returnTState = rod0->textHandler(); } catch (VmeException &v) { cout << "VmeException in first textHandler call." << endl; cout << "ErrorClass = " << v.getErrorClass() << endl; cout << "ErrorCode = " << v.getErrorCode() << endl; } if (returnTState == TEXT_RQ_SET) { do { try { returnTState = rod0->textHandler(); } catch (VmeException &v) { cout << "VmeException in second textHandler call." << endl; cout << "ErrorClass = " << v.getErrorClass() << endl; cout << "ErrorCode = " << v.getErrorCode() << endl; } } while (returnTState != TEXT_READOUT); rod0->getTextBuffer(myTextBuffer, myTextLength, myTextType); rod0->clearTextBuffer(); for (int i=0; iprimHandler(); } catch (RodException *r) { cout << r->getDescriptor() <<", " << r->getData1() << ", " << r->getData2() << '\n'; } catch (VmeException &v) { cout << "VmeException in second primHandler call." << endl; cout << "ErrorClass = " << v.getErrorClass() << endl; cout << "ErrorCode = " << v.getErrorCode() << endl; } } while ((returnPState != PRIM_WAITING)&&(returnPState != PRIM_IDLE)); // Retrieve output buffer RodOutList* outList = rod0->getOutList(); // Print results (User processing of outList) UINT32 outLength = UINT32(outList->getLength()); unsigned long* outBody = outList->getBody(); UINT32 outIndex = UINT32(outBody[1]); UINT32 outNumPrims = outBody[2]; UINT32 outPrimVersion = outBody[3]; cout << "outLength = " << outLength << ", outIndex = " << outIndex << ", outNumPrims = " << outNumPrims << ", outPrimVersion = " << outPrimVersion <<'\n'; int outPtr = 4; for (UINT32 j=0; jdeleteOutList(); // Delete the ROD and VME objects before exiting delete rod0; delete vme1; return 0; }