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
00031
00032 long buffLength = primList->list->getBufferLength();
00033 unsigned long* bufferStart = primList->list->getBuffer();
00034
00035
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
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;
00092 data.commOnOff = SLV_DSP_COMM_ON;
00093 data.slaveType = SLAVE_MONITOR;
00094 data.timeoutInUsec = 0x200000;
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;
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
00179
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;
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,
00287 int cfg, int modMask0, int modMask1, int maskType, int storage, int maskSet) {
00288 #if (R_MODULE_MASK == 101)
00289
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;
00300 maskPrim.dataLine[3] = 0;
00301 maskPrim.cfg = cfg;
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
00319
00320
00321
00322
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
00328
00329
00330
00331
00332 moduleMask(maskList, ALL_MODULES, 0, 0, 1, slvBits,
00333
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
00340
00341
00342
00343
00344
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
00351
00352
00353
00354
00355 moduleMask(maskList, module, 0, 0, 0, 0, cmd, rx0, rx1,
00356
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
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
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
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;
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
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 ¶ms = *(RW_MODULE_DATA_IN*)configData;
00503 params.readNotWrite = 0;
00504 params.structId = i;
00505 params.moduleNum = channel;
00506 params.configData = (ABCDModule *)0xffffffff;
00507
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;
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;
00545 primData.restore = restore;
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;
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