PrimBuilder.cxx

00001 #include <algorithm>
00002 #include <sstream>
00003 #include "CommonWithDsp/primParams.h"
00004 
00005 #include "RodCrate/RodPrimList.h"
00006 
00007 #include "SctApiException.h"
00008 #include "SctApiDebug.h"
00009 #include "PrimBuilder.h"
00010 #include "utility.h"
00011 
00012 using namespace SctApi;
00013 
00014 PrimBuilder *PrimBuilder::singleton = 0;
00015 
00016 PrimBuilder::PrimBuilder() {}
00017 
00018 void PrimBuilder::slavePrimList(boost::shared_ptr<PrimListWrapper> parentList, 
00019                                 boost::shared_ptr<PrimListWrapper> primList, 
00020                                 unsigned int slaveNumber, bool await, bool response) {
00021   try {
00022     primList->list->bufferBuild();
00023   } catch (SctPixelRod::PrimListException &p) {
00024     std::cout << "Exception building prim list for slave " << slaveNumber << std::endl;
00025     std::cout << p.getDescriptor() << " ";
00026     std::cout << p.getData1() << ", " << p.getData2() << "\n";
00027     return;
00028   }
00029 
00030   // Get a copy of buffer and use SEND_SLAVE_LIST/START_SLAVE_LIST primitives
00031   // to have MDSP send it to the slave
00032   long buffLength = primList->list->getBufferLength();
00033   unsigned long* bufferStart = primList->list->getBuffer();
00034 
00035   // Create Slave List primitives
00036   int offset = sizeof(SEND_SLAVE_LIST_IN)/4;
00037 
00038   long *slaveData = new long[offset+buffLength];
00039 
00040   SEND_SLAVE_LIST_IN &slaveList = *(SEND_SLAVE_LIST_IN *)slaveData;
00041 
00042 #if (R_SEND_SLAVE_LIST == 103)
00043   slaveList.slaveNumber = slaveNumber;
00044   slaveList.listLength = buffLength;
00045   slaveList.slavePrimList = (unsigned int*)DEFAULT;
00046   slaveList.slaveRepData = (unsigned int*)DEFAULT;
00047 #else 
00048 #error "SEND_SLAVE_LIST not compiled (new revision)"
00049 #endif
00050 
00051   // Copy prim list as send data
00052   for (int i=0; i< buffLength; i++) {
00053     slaveData[offset + i] = bufferStart[i];
00054   }
00055 
00056   parentList->addPrimitive(offset+buffLength, 1, SEND_SLAVE_LIST, R_SEND_SLAVE_LIST, slaveData);
00057 
00058   delete [] slaveData;
00059 
00060   startSlaveList(parentList, slaveNumber, await, response);
00061 }
00062 
00063 void PrimBuilder::startSlaveList(boost::shared_ptr<PrimListWrapper> primList, 
00064                                  unsigned int slaveNumber, bool await, bool response) {
00065   START_SLAVE_LIST_IN startPrim;
00066 #if (R_START_SLAVE_LIST == 103)
00067   startPrim.slaveNumber = slaveNumber;
00068   startPrim.pauseMasterList = await?1:0;
00069   startPrim.getSlaveReply = response?1:0;
00070 #else
00071 #error "START_SLAVE_LIST not compiled (new revision)"
00072 #endif
00073 
00074   primList->addPrimitive(sizeof(START_SLAVE_LIST_IN)/4, 2, START_SLAVE_LIST, R_START_SLAVE_LIST, (long*)&startPrim);
00075 }
00076 
00077 void PrimBuilder::echo(boost::shared_ptr<PrimListWrapper> primList, Utility::MemoryBlock block) {
00078 #if (R_ECHO != 100) 
00079 #error "ECHO revision changed!"
00080 #endif
00081 
00082   long *myData = new long[block.size()];
00083   std::copy(block.address(), block.address() + block.size(), myData);
00084   primList->addPrimitive(block.size(), 1, ECHO, R_ECHO, myData);
00085 
00086   delete [] myData;
00087 }
00088 
00089 void PrimBuilder::startSlave(boost::shared_ptr<PrimListWrapper> prim, int s) {
00090   START_SLAVE_EXECUTING_IN data;
00091   data.slaveNumber = s;              // Slave
00092   data.commOnOff = SLV_DSP_COMM_ON;  // Comm on
00093   data.slaveType = SLAVE_MONITOR;    // Mode
00094   data.timeoutInUsec = 0x200000;     // Timeout
00095 
00096   prim->addPrimitive(sizeof(START_SLAVE_EXECUTING_IN)/4, 1, START_SLAVE_EXECUTING, R_START_SLAVE_EXECUTING, (long *)&data);
00097 }
00098 
00099 void PrimBuilder::readFifo(boost::shared_ptr<PrimListWrapper> prim, int id, int bank, int elems) {
00100   RW_FIFO_IN fifo;
00101 #if (R_RW_FIFO == 104)
00102   fifo.fifoId = id;
00103   fifo.bank = bank;
00104   fifo.readNotWrite = 1;
00105   fifo.numElements = elems;
00106   fifo.dataBaseAdr = (UINT32 *)0xffffffff;
00107 #else
00108 #error "RW_FIFO revision change"
00109 #endif
00110 
00111   prim->addPrimitive(sizeof(RW_FIFO_IN)/4, 1, RW_FIFO, R_RW_FIFO, (long *)&fifo);
00112 }
00113 
00114 void PrimBuilder::pollRegister(boost::shared_ptr<PrimListWrapper> prim, int r, int off, int width, int val, int timeout) {
00115   POLL_REG_FIELD_IN poll;
00116 
00117 #if (R_POLL_REG_FIELD == 105)
00118   poll.registerID = r;
00119   poll.offset = off;
00120   poll.width = width;
00121   poll.desiredValue = val;
00122   poll.timeoutInUsec = timeout;
00123 #else
00124 #error "POLL_REG_FIELD revision changed"
00125 #endif
00126 
00127   prim->addPrimitive(sizeof(POLL_REG_FIELD_IN)/4, 1, POLL_REG_FIELD, R_POLL_REG_FIELD, (long*)&poll);
00128 }
00129 
00130 void PrimBuilder::taskOp(boost::shared_ptr<PrimListWrapper> prim, int typ, int op, int data) {
00131   TASK_OPERATION_IN taskOp;
00132 #if (R_TASK_OPERATION == 100) 
00133   taskOp.taskType = typ;
00134   taskOp.taskOperation = op;
00135   taskOp.data = data;
00136 #else 
00137 #error "TASK_OPERATION revision change"
00138 #endif
00139 
00140   prim->addPrimitive(sizeof(TASK_OPERATION_IN)/4, 1, TASK_OPERATION, R_TASK_OPERATION, (long*)&taskOp);
00141 }
00142 
00143 void PrimBuilder::readRegister(boost::shared_ptr<PrimListWrapper> prim, int r) {
00144   RW_REG_FIELD_IN rField;
00145 #if (R_RW_REG_FIELD == 103) || (R_RW_REG_FIELD == 104) || (R_RW_REG_FIELD == 105)
00146   rField.registerID = r;
00147   rField.offset = 0;
00148   rField.width = 32;
00149   rField.readNotWrite = 1;
00150   rField.dataIn = 0; // Unused!
00151 #else
00152 #error "RW_REG_FIELD revision change"
00153 #endif
00154 
00155   prim->addPrimitive(sizeof(RW_REG_FIELD_IN)/4, 5, RW_REG_FIELD, R_RW_REG_FIELD, (long *)&rField);
00156 }
00157 
00158 void PrimBuilder::writeRegister(boost::shared_ptr<PrimListWrapper> prim, int r, int off, int wid, int value) {
00159   RW_REG_FIELD_IN rField;
00160 #if (R_RW_REG_FIELD == 103) || (R_RW_REG_FIELD == 104) || (R_RW_REG_FIELD == 105)
00161   rField.registerID = r;
00162   rField.offset = off;
00163   rField.width = wid;
00164   rField.readNotWrite = 0;
00165   rField.dataIn = value;
00166 #else
00167 #error "RW_REG_FIELD revision change"
00168 #endif
00169 
00170   prim->addPrimitive(sizeof(RW_REG_FIELD_IN)/4, 5, RW_REG_FIELD, R_RW_REG_FIELD, (long *)&rField);
00171 }
00172 
00173 void PrimBuilder::sendStream(boost::shared_ptr<PrimListWrapper> prim, int cmdBuff, bool capture) {
00174   SEND_STREAM_IN sendStream;
00175 
00176 #if (R_SEND_STREAM == 100)
00177 #if (R_RW_MODULE_DATA >= 103) 
00178 // interface for SEND_STREAM changed without version number change
00179 // so have to use a contemporary change to make this work :( AJB.
00180   sendStream.port = cmdBuff;
00181 #else
00182   sendStream.cmdBuff = cmdBuff;  
00183 #endif
00184   sendStream.captureSerOn = capture;
00185 #else
00186 #error "SEND_STREAM revision change"
00187 #endif
00188 
00189   prim->addPrimitive(sizeof(SEND_STREAM_IN)/4, 3, SEND_STREAM, R_SEND_STREAM, (long *)&sendStream);
00190 }
00191 
00192 void PrimBuilder::startEvTrap(boost::shared_ptr<PrimListWrapper> prim) {
00193   long trap[0] = {};
00194 
00195 #if (R_START_EVENT_TRAPPING != 101)
00196 #error "START_EVENT_TRAPPING revision change"
00197 #endif
00198 
00199   prim->addPrimitive(0, 0, START_EVENT_TRAPPING, R_START_EVENT_TRAPPING, trap);
00200 }
00201 
00202 void PrimBuilder::stopEvTrap(boost::shared_ptr<PrimListWrapper> prim) {
00203   long trap[0] = {};
00204 
00205 #if (R_STOP_EVENT_TRAPPING != 100)
00206 #error "STOP_EVENT_TRAPPING revision change"
00207 #endif
00208 
00209   prim->addPrimitive(0, 0, STOP_EVENT_TRAPPING, R_STOP_EVENT_TRAPPING, trap);
00210 }
00211 
00212 void PrimBuilder::setMemory(boost::shared_ptr<PrimListWrapper> primList, unsigned long address, unsigned long words, long value) {
00213   SET_MEMORY_IN prim;
00214 
00215 #if (R_SET_MEMORY == 100)
00216   prim.start = (UINT32 *)address;
00217   prim.size = words;
00218   prim.val = value;
00219 #else 
00220 #error "SET_MEMORY revision changed"
00221 #endif
00222 
00223   primList->addPrimitive(sizeof(SET_MEMORY_IN)/4, 1, SET_MEMORY, R_SET_MEMORY, (const long *)&prim);
00224 }
00225 
00226 void PrimBuilder::readSlaveMemory(boost::shared_ptr<PrimListWrapper> primList, unsigned long slave, unsigned long address, unsigned long words) {
00227   RW_SLAVE_MEMORY_IN rwPrim;
00228 
00229 #if (R_RW_SLAVE_MEMORY == 100)
00230   rwPrim.slaveNumber = slave;
00231   rwPrim.readNotWrite = 1;
00232   rwPrim.slaveAddress = (UINT32 *)address;
00233   rwPrim.masterAddress = (UINT32 *)0xffffffff;
00234   rwPrim.numWords = words;
00235 #else
00236 #error "RW_SLAVE_MEMORY revision change"
00237 #endif
00238 
00239   primList->addPrimitive(sizeof(RW_SLAVE_MEMORY_IN)/4, 1, RW_SLAVE_MEMORY, R_RW_SLAVE_MEMORY, (long*)&rwPrim);
00240 }
00241 
00242 void PrimBuilder::writeSlaveMemory(boost::shared_ptr<PrimListWrapper> primList, 
00243                                    unsigned long slave, unsigned long address, unsigned long length, unsigned long *data) {
00244   long *primData = new long[sizeof(RW_SLAVE_MEMORY_IN)/4 + length];
00245 
00246   RW_SLAVE_MEMORY_IN &rwPrim = *(RW_SLAVE_MEMORY_IN*)primData;
00247 
00248 #if (R_RW_SLAVE_MEMORY == 100)
00249   rwPrim.slaveNumber = slave;
00250   rwPrim.readNotWrite = 0;
00251   rwPrim.slaveAddress = (UINT32 *)address;
00252   rwPrim.masterAddress = (UINT32 *)0xffffffff;
00253   rwPrim.numWords = length;
00254 #else
00255 #error "RW_SLAVE_MEMORY revision change"
00256 #endif
00257 
00258   std::copy(data, data + length, primData + 5);
00259 
00260   primList->addPrimitive(sizeof(RW_SLAVE_MEMORY_IN)/4 + length, 
00261                          1, RW_SLAVE_MEMORY, R_RW_SLAVE_MEMORY, primData);
00262 }
00263 
00264 void PrimBuilder::rodMode(boost::shared_ptr<PrimListWrapper> rodModeList, 
00265                           int mode, int flag, int fifoSetup, int nBits, int delay, int message) {
00266 #ifndef R_SET_ROD_MODE
00267 #error "Set Rod Mode wasn't compiled"
00268 #elif (R_SET_ROD_MODE != 101)
00269 #error "Set Rod Mode wasn't compiled (wrong prim version)"
00270 #else
00271   SET_ROD_MODE_IN rodPrim;
00272   rodPrim.mode = mode;
00273   rodPrim.flag = flag;
00274   rodPrim.fifoSetup = fifoSetup;
00275   rodPrim.nBits = nBits;
00276   rodPrim.delay = delay;
00277   rodPrim.evtsPerL1A = 1;         // This is a pixel thing!
00278   rodPrim.message = message;
00279   rodModeList->addPrimitive(sizeof(SET_ROD_MODE_IN)/4, 
00280                             1, SET_ROD_MODE, R_SET_ROD_MODE, (long *)&rodPrim);
00281 #endif
00282 }
00283 
00284 void PrimBuilder::moduleMask(boost::shared_ptr<PrimListWrapper> maskList, 
00285                              int module, int port, int useStructSet, int passOn, int slvs,
00286                              int cmdLine, int dataLine0, int dataLine1, // 2 and 3 only for pixels
00287                              int cfg, int modMask0, int modMask1, int maskType, int storage, int maskSet) { 
00288 #if (R_MODULE_MASK == 101)
00289   // Load module masks
00290   MODULE_MASK_IN maskPrim;
00291   maskPrim.moduleNum = module;
00292   maskPrim.port = port;
00293   maskPrim.useStructSet = useStructSet;
00294   maskPrim.passOn = passOn;
00295   maskPrim.slvBits = slvs;
00296   maskPrim.cmdLine = cmdLine;
00297   maskPrim.dataLine[0] = dataLine0;
00298   maskPrim.dataLine[1] = dataLine1;
00299   maskPrim.dataLine[2] = 0;   // Pixels only 
00300   maskPrim.dataLine[3] = 0;   // Pixels only 
00301   maskPrim.cfg = cfg;               // Don't do manual mask bits set up
00302   maskPrim.modMask[0] = modMask0;
00303   maskPrim.modMask[1] = modMask1;
00304   maskPrim.maskType = maskType;
00305   maskPrim.storage = storage;
00306   maskPrim.maskSet = maskSet;
00307 
00308   maskList->addPrimitive(sizeof(MODULE_MASK_IN)/4,
00309                          1, MODULE_MASK, R_MODULE_MASK, (long *)&maskPrim);
00310 #elif (R_MODULE_MASK == 100) 
00311 #warning "MODULE_MASK method not compiled"
00312 #else 
00313 #error "MODULE_MASK revision change"
00314 #endif
00315 }
00316 
00317 void PrimBuilder::masksFromConfig(boost::shared_ptr<PrimListWrapper> maskList, int port) { 
00318   // passOn       == 0
00319   // cfg          == 0
00320   // useStructSet == 1
00321 
00322   // Everything ignored except          this
00323   moduleMask(maskList, ALL_MODULES, port, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
00324 }
00325 
00326 void PrimBuilder::masksToSlaves(boost::shared_ptr<PrimListWrapper> maskList, int slvBits) { 
00327   // passOn       == 1
00328   // cfg          == 0
00329   // useStructSet == 0
00330 
00331   // Use struct set and pass on...
00332   moduleMask(maskList, ALL_MODULES, 0, 0, 1, slvBits,
00333              // The rest is ignored
00334              0, 0, 0, 0, 0, 0, 0, 0, 0);
00335 }
00336 
00337 void PrimBuilder::masksConfig(boost::shared_ptr<PrimListWrapper> maskList, 
00338                               int moduleMasks[2], int port, int maskType, int command, int maskSet) { 
00339   // passOn       == 0
00340   // cfg          == 1
00341   // useStructSet == 0
00342 
00343   // Use cfg to issue command
00344   // What should the module parameter be?
00345   moduleMask(maskList, ALL_MODULES, port, 0, 0, 0, 0, 0, 0, 
00346              1, moduleMasks[0], moduleMasks[1], maskType, command, maskSet);
00347 }
00348 
00349 void PrimBuilder::masksConfigModule(boost::shared_ptr<PrimListWrapper> maskList, int module, int cmd, int rx0, int rx1) { 
00350   // passOn       == 0
00351   // cfg          == 0
00352   // useStructSet == 0
00353 
00354   // Configure one module
00355   moduleMask(maskList, module, 0, 0, 0, 0, cmd, rx0, rx1,
00356              // The rest is ignored
00357              0, 0, 0, 0, 0, 0);
00358 }
00359 
00360 
00361 void PrimBuilder::readModuleData(boost::shared_ptr<PrimListWrapper> primList, int bank, int channel) {
00362 
00363 #if (R_RW_MODULE_DATA == 103 )
00364   RwModuleDataIn primData;
00365   const unsigned size = sizeof(RwModuleDataIn)/4;
00366   primData.fRead = 1;
00367   primData.fCopy = 0;
00368   primData.copySrcCfgSet = 0;
00369   primData.cfgSet = bank;
00370 #warning "AJB has noticed a bug in the dsp code of 11 April 2005 which necessitates the fix below"
00371   // this isnt really a bitfield, but the dsp code currently doing getModule[1<<cfgfield] if it is cfgBitfield not set
00372   bool douglasHasFixedBugInApril05DspCode = true;
00373   primData.cfgBitfield = douglasHasFixedBugInApril05DspCode ? 0 : 1;
00374   primData.module = channel;
00375   primData.chip = ALL_CHIPS;
00376   primData.dataType = CONFIG_MODULE_ALL;
00377 #elif (R_RW_MODULE_DATA == 101) || (R_RW_MODULE_DATA == 102)
00378   RW_MODULE_DATA_IN primData;
00379   const unsigned size = sizeof(RW_MODULE_DATA_IN)/4;
00380   primData.readNotWrite = 1;
00381   primData.structId = bank;
00382   primData.moduleNum = channel;
00383   // Ignore configdata as this is a read
00384 #elif (R_RW_MODULE_DATA == 100)
00385   RW_MODULE_DATA_IN primData;
00386   const unsigned size = sizeof(RW_MODULE_DATA_IN)/4;
00387   primData.readNotWrite = 1;
00388   primData.structID = bank;
00389   primData.moduleNum = channel;
00390   // Ignore configdata as this is a read
00391 #else
00392 #error "RW_MODULE_DATA not compiled (primitive change)"
00393 #endif
00394   primList->addPrimitive(size, 1, RW_MODULE_DATA, R_RW_MODULE_DATA, (long*)&primData);
00395 }
00396 
00397 void PrimBuilder::copyModuleData(boost::shared_ptr<PrimListWrapper> primList, int from_bank, 
00398                  UINT32 to_banks_bitset, int channel) {
00399 #if (R_RW_MODULE_DATA == 103)
00400   RwModuleDataIn prim;
00401   prim.fRead = 0;
00402   prim.fCopy = 1;
00403   prim.copySrcCfgSet = from_bank;
00404   prim.cfgSet = to_banks_bitset;
00405   prim.cfgBitfield = true;
00406   prim.module = channel;
00407   prim.chip = ALL_CHIPS;
00408   prim.dataType = CONFIG_MODULE_ALL;
00409   primList->addPrimitive(sizeof(RwModuleDataIn)/4, 1, RW_MODULE_DATA, R_RW_MODULE_DATA, (long*)&prim);
00410 #else
00411   throw SctApiException("Cannot do on-rod copy of module data - should have used get/set");
00412 #warning "copyModuleData not compiled - change of prim version"
00413 #endif
00414 }
00415 
00416 void PrimBuilder::writeModuleData(boost::shared_ptr<PrimListWrapper> primList, const ABCDModule* module, int cfgSet_bits, int channel, UINT32 module_parts) {
00417 #if (R_RW_MODULE_DATA == 103 )
00418   const unsigned prim_size = sizeof(RwModuleDataIn)/4;
00419   
00420   RwModuleDataIn primData;
00421   primData.fRead = 0;
00422   primData.fCopy = 0;
00423   primData.copySrcCfgSet = 0;
00424   primData.cfgSet = cfgSet_bits;
00425   primData.cfgBitfield = 1;
00426   primData.module = channel;
00427   primData.chip = ALL_CHIPS;
00428   primData.dataType = module_parts;
00429   
00430   long* data;
00431   size_t data_size;
00432   switch (module_parts){
00433   case CONFIG_MODULE_ALL: {
00434     data_size = sizeof(ABCDModule)/sizeof(long);
00435     data = new long[data_size];
00436     std::copy((long*)module, (long*)module+data_size, data);
00437     break;
00438   }
00439   case CONFIG_MODULE_CFG:{
00440     unsigned s = 1; // size of cfg in UINT32 units
00441     data_size = s * N_SCT_CHIPS;
00442     data = new long[data_size];
00443     for (unsigned ichip=0; ichip<N_SCT_CHIPS; ++ichip){
00444       long* start = (long*)&module->chip[ichip].basic.config;
00445       std::copy(start, start+s, data+(ichip*s));
00446     }
00447     break;
00448   }
00449   case CONFIG_MODULE_CALDATA:{
00450     unsigned s = sizeof(ABCDCaldata)/sizeof(long);
00451     data_size = s * N_SCT_CHIPS;
00452     data = new long[data_size];
00453     for (unsigned ichip=0; ichip<N_SCT_CHIPS; ++ichip){
00454       long* start = (long*)&module->chip[ichip].caldata;
00455       std::copy(start, start+s, data+(ichip*s));
00456     }
00457     break;
00458   }
00459   case CONFIG_MODULE_BASIC:{
00460     unsigned s = sizeof(ABCDBasic)/sizeof(long);
00461     data_size = s * N_SCT_CHIPS;
00462     data = new long[data_size];
00463     for (unsigned ichip=0; ichip<N_SCT_CHIPS; ++ichip){
00464       long* start = (long*)&module->chip[ichip].basic;
00465       std::copy(start, start+s, data+(ichip*s));
00466     }
00467     break;
00468   }
00469   case CONFIG_MODULE_TRIM:{
00470     unsigned s = N_SCT_CHANS*8/32;
00471     data_size = s * N_SCT_CHIPS;
00472     data = new long[data_size];
00473     for (unsigned ichip=0; ichip<N_SCT_CHIPS; ++ichip){
00474       long* start = (long*)module->chip[ichip].trim;
00475       std::copy(start, start+s, data+(ichip*s));
00476     }
00477     break;
00478   }
00479   default:{
00480     std::ostringstream message;
00481     message << "PrimBuilder: ERROR Can't set cfgtype = " << module_parts;
00482     throw SctApiException(message.str().c_str());
00483   }
00484   }
00485   long* all_data   = new long[prim_size+data_size];
00486   long* prim_start = (long*)&primData;
00487   long* prim_end   = (long*)&primData + prim_size;
00488   
00489   std::copy(prim_start, prim_end, all_data);
00490   std::copy(data, data+data_size, all_data+prim_size);
00491   
00492   primList->addPrimitive(prim_size+data_size, 1, RW_MODULE_DATA, R_RW_MODULE_DATA, all_data);
00493   delete[] data;
00494   delete[] all_data;
00495 #elif (R_RW_MODULE_DATA == 101) || (R_RW_MODULE_DATA == 102)
00496 #warning "Using old (slow) multiple set"
00497   // for old primitives, do copy to many cfg sets by adding many primitives
00498   for (int i=0; i< N_MODULE_CONFIG_SETS; ++i){
00499     if (1<<i & cfgSet_bits){
00500       const unsigned int longsInConfig = sizeof(ABCDModule) / 4;
00501       long *configData = new long[sizeof(RW_MODULE_DATA_IN)/4+longsInConfig];
00502       RW_MODULE_DATA_IN &params = *(RW_MODULE_DATA_IN*)configData;
00503       params.readNotWrite = 0;
00504       params.structId = i;
00505       params.moduleNum = channel;
00506       params.configData = (ABCDModule *)0xffffffff;
00507       // Overwrite params.configData with the first word of the config (hence 3 not 4 and -1 in next line)
00508       std::copy((long *)module, ((long*)module)+longsInConfig, configData+3);
00509       primList->addPrimitive(sizeof(RW_MODULE_DATA_IN)/4+longsInConfig-1, 1, RW_MODULE_DATA, R_RW_MODULE_DATA, configData);
00510       delete [] configData;
00511     }
00512   }
00513 #else
00514 #error "RW_MODULE_DATA not compiled (primitive change)"
00515 #endif
00516 }
00517 
00518 void PrimBuilder::sendConfig(boost::shared_ptr<PrimListWrapper> primList, 
00519                              int port, int capture, int module0, int module1, int chip, int setLinks, int restore, 
00520                              int bank, int group, int data, int active, int enableData) {
00521   if (enableData!=0) {
00522     enableData=1; // I don't know whether primdata can cope with values other than 1, but in the past it was always given one, so we may as well do this small thing just to be on the safe side.
00523   }
00524 #if (R_SEND_CONFIG == 106)
00525   SendConfigIn primData;
00526   primData.port = port;
00527   primData.module[0] = module0;
00528   primData.module[1] = module1;
00529   primData.chip = chip;
00530   primData.setLinks = setLinks;
00531   primData.cfgSet = bank;
00532   primData.groupId = group;
00533   primData.dataType = data;
00534   primData.activeOnly = active;
00535   primData.enableDataTaking = enableData;
00536   primList->addPrimitive(sizeof(SendConfigIn)/4, 1, SEND_CONFIG, R_SEND_CONFIG, (long*)&primData);
00537 #elif (R_SEND_CONFIG == 104) || (R_SEND_CONFIG == 105)
00538   SEND_CONFIG_IN primData;
00539   primData.port = port;
00540   primData.captureSerOn = capture;
00541   primData.moduleNum[0] = module0;
00542   primData.moduleNum[1] = module1;
00543   primData.chipNum = chip;
00544   primData.setLinks = setLinks;             // Set links 
00545   primData.restore = restore;               // Restore links 
00546   primData.structId = bank;
00547   primData.groupId = group;
00548   primData.dataType = data;
00549   primData.activeOnly = active;
00550   primData.enableDataTaking = enableData;
00551   primList->addPrimitive(sizeof(SEND_CONFIG_IN)/4, 1, SEND_CONFIG, R_SEND_CONFIG, (long *)&primData);
00552 #else
00553 #error "Send config not compiled! (new prim version)" 
00554 #endif
00555 }
00556 
00557 void PrimBuilder::writeModuleVariable(boost::shared_ptr<PrimListWrapper> primList, UINT32 dsp_bank_set, int group, int channel, int chip, int type, float value) {
00558 #ifdef R_RW_MODULE_VARIABLE 
00559 #if (R_RW_MODULE_VARIABLE == 103)
00560   size_t prim_size = sizeof(RwModuleVariableIn)/4;
00561   long* data = new long[prim_size+1];
00562   RwModuleVariableIn& prim = *(RwModuleVariableIn*)data;
00563   prim.fRead = false;
00564   prim.cfgSet = dsp_bank_set;
00565   prim.cfgBitfield = true;
00566   prim.groupId = group;
00567   prim.module = channel;
00568   prim.chip = chip;
00569   prim.varType = type;
00570   prim.info = Debug::getInstance()->checkDebugOption(DEBUG_MODULE_CONFIG);
00571   prim.dataLen = 1;
00572   MDAT32* p_val = (MDAT32*) data+prim_size;
00573   *p_val=value;
00574   primList->addPrimitive(prim_size+1, 1, RW_MODULE_VARIABLE, R_RW_MODULE_VARIABLE, (long*)&prim);
00575   delete[] data;
00576 #elif (R_RW_MODULE_VARIABLE == 102 ) 
00577 #warning "Old version of RW_MODULE_VARIABLE may be slow"
00578   std::cout << "using old version of RW_MODULE_VARIABLE - multiple prims" << std::endl;
00579   RW_MODULE_VARIABLE_IN prim;
00580   prim.read = 0;
00581   prim.groupId = group;
00582   prim.module = channel;
00583   prim.chip = chip;
00584   prim.varType = type;
00585   prim.info = 1;         // Send text message confirming what was done
00586   prim.dataLen = 1;
00587   prim.data = (MDAT32*)(*(unsigned int*)(&value));
00588   for (int i=0; i< N_MODULE_CONFIG_SETS; ++i){
00589     if (1<<i & cfgSet_bits){
00590       prim.structId = bank;
00591       primList->addPrimitive(sizeof(RW_MODULE_VARIABLE_IN)/4, 1, RW_MODULE_VARIABLE, R_RW_MODULE_VARIABLE, (long*)&prim);
00592     }
00593   }
00594 #elif (R_RW_MODULE_VARIABLE == 101) 
00595 #error "This one doesn't work"
00596 #else 
00597 #error "Modify config (ROD) not compiled! (new prim version)" 
00598 #endif
00599 #else 
00600 #error "Modify config (ROD) not compiled! (primitive doesn't exist)" 
00601 #endif
00602 }
00603 
00604 void PrimBuilder::bocHistogram(boost::shared_ptr<PrimListWrapper> primList, int delay, int width, int numEvents, 
00605                    struct ::CmdList trigger, int port) {
00606 #ifdef R_BOC_HISTOGRAM
00607   BOC_HISTOGRAM_IN bocPrim;
00608 
00609 #if (R_BOC_HISTOGRAM == 101)
00610   bocPrim.delay = delay;
00611   bocPrim.width = width;
00612   bocPrim.count = numEvents;
00613   bocPrim.cmdList = trigger;
00614   bocPrim.port = port;
00615 #elif (R_BOC_HISTOGRAM == 100)
00616   bocPrim.numSamples = numEvents;
00617   bocPrim.numLoops = width;
00618 #else
00619 #warning "BOC_HISTOGRAM revision change"
00620 #endif
00621 
00622   primList->addPrimitive(sizeof(BOC_HISTOGRAM_IN)/4, 1, BOC_HISTOGRAM, R_BOC_HISTOGRAM, (long*)&bocPrim);
00623 #else 
00624 #warning "BOC_HISTOGRAM not compiled"
00625 #endif
00626 }
00627 
00628 void PrimBuilder::setTrigger(boost::shared_ptr<PrimListWrapper> primList, int currentBin, int histogramSet) 
00629 {
00630   SET_TRIGGER_IN triggerPrim;
00631 
00632 #if (R_SET_TRIGGER == 102)
00633   triggerPrim.bin = currentBin;
00634   triggerPrim.set = histogramSet;
00635 #else
00636 #warning "SET_TRIGGER revision change"
00637 #endif
00638 
00639   primList->addPrimitive(sizeof(SET_TRIGGER_IN)/4, 1, SET_TRIGGER, R_SET_TRIGGER, (long*)&triggerPrim);
00640 }
00641 
00642 PrimBuilder& PrimBuilder::instance() {
00643   if(!singleton) {
00644     singleton = new PrimBuilder;
00645   }
00646 
00647   return *singleton;
00648 }
00649 

Generated on Mon Feb 6 14:01:25 2006 for SCT DAQ/DCS Software - C++ by  doxygen 1.4.6