Cat
A3PE.cpp
Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 //
3 // Package : A3PE
4 //
5 // Description:
6 //
7 // Author(s) : F. Machefert -
8 // Date : 10 February 2004
9 //
10 //------------------------------------------------------------------------------
11 #include <iostream>
12 #include <sstream>
13 #include <fstream>
14 
15 // include files
16 #ifndef WIN32
17 #include <unistd.h>
18 #endif
19 #include <algorithm>
20 
21 // local include file
22 #include "A3PE.h"
23 
24 // =====
25 // Resets register
26 
28  info("Reset Storage Fifo","A3PE::resetStorageFifo");
29  return m_resetReg->setBit(1,1);
30 }
31 
33  info("Reset USB Phasers","A3PE::resetUsbPhasers");
34  return m_resetReg->setBit(2,1);
35 }
36 
38  info("Reset Latency counter","A3PE::resetLatencyCounter");
39  return m_resetReg->setBit(4,1);
40 }
41 
43  info("Reset acquisition write counter","A3PE::resetAcquisitionWriteCounter");
44  return m_resetReg->setBit(5,1);
45 }
46 
48  info("Reset Pattern Fifo","A3PE::resetPatternFifo");
49  return m_resetReg->setBit(6,1);
50 }
51 
53  info("Reset Trigger Fifo","A3PE::resetTriggerFifo");
54  return m_resetReg->setBit(7,1);
55 }
56 
58  info("Reset ToAx Ram","A3PE::resetToAXRam");
59  return m_resetReg->setBit(8,1);
60 }
61 
63  info("Reset FromAX Ram","A3PE::resetFromAXRam");
64  return m_resetReg->setBit(9,1);
65 }
66 
68  info("Reset Sequence From-To AX","A3PE::resetSequenceFromToAX");
69  return m_resetReg->setBit(10,1);
70 }
71 
73  info("Reset FE triggered.","A3PE::resetFE");
74  return m_resetReg->setBit(14,1);
75 }
76 
78  info("Reset SPI triggered.","A3PE::resetSPI");
79  return m_resetReg->setBit(15,1);
80 }
81 
82 // =====
83 // Setup Register
84 
85 // Set
86 
87 StatusCode A3PE::setEnableADC(unsigned int adc, bool enable){
88  if (adc<8){
89  info("Configuring ADC "+itos(adc)+" input enable to "+itos(enable));
90  return m_setupReg->setBit(adc,enable);
91  }
92  else{
93  warning("You cannot setup adc number "+itos(adc)+
94  ". No action.","A3PE::setEnableADC");
95  return StatusCode::FAILURE;
96  }
97 }
98 
100  if (enable) {
101  if (m_setupReg->setBit(8,true).isFailure()||
102  m_setupReg->setBit(9,true).isFailure()){
103  error("Cannot set usb storage fifo write bit","A3PE::setWriteStorageFifoUsb");
104  return StatusCode::FAILURE;
105  }
106  else {
107  info("Storage Fifo Usb Write mode set.","A3PE::setWriteStorageFifoUsb");
108  }
109  return StatusCode::SUCCESS;
110  }
111  else {
112  if (m_setupReg->setBit(8,false).isFailure()||
113  m_setupReg->setBit(9,false).isFailure()){
114  error("Cannot set fifo storage ADC write bit","A3PE::setWriteStorageFifoUsb");
115  return StatusCode::FAILURE;
116  }
117  else {
118  info("Storage Fifo ADC Write mode set.","A3PE::setWriteStorageFifoUsb");
119  }
120  return StatusCode::SUCCESS;
121  }
122 }
123 
125  if (enable){
126  if (m_setupReg->setBit(9,true).isFailure()){
127  error("Cannot set pattern fifo read bit",
128  "A3PE::setReadPatternFifoUsb");
129  return StatusCode::FAILURE;
130  }
131  else {
132  info("Pattern Fifo Usb read mode set.",
133  "A3PE::setReadPatternFifoUsb");
134  }
135  return StatusCode::SUCCESS;
136  }
137  else {
138  if (m_setupReg->setBit(9,false).isFailure()){
139  error("Cannot set pattern fifo read bit",
140  "A3PE::setReadPatternFifoUsb");
141  return StatusCode::FAILURE;
142  }
143  else {
144  info("Pattern Fifo 40MHz read mode set.",
145  "A3PE::setWritePatternFifoUsb");
146  }
147  return StatusCode::SUCCESS;
148  }
149 }
150 
151 
153  if (enable){
154  if (m_setupReg->setBit(11,true).isFailure()){
155  error("Cannot set trigger fifo read bit",
156  "A3PE::setReadtriggerFifoUsb");
157  return StatusCode::FAILURE;
158  }
159  else {
160  info("Trigger Fifo Usb read mode set.",
161  "A3PE::setReadTriggerFifoUsb");
162  }
163  return StatusCode::SUCCESS;
164  }
165  else {
166  if (m_setupReg->setBit(11,false).isFailure()){
167  error("Cannot set trigger fifo read bit",
168  "A3PE::setReadTriggerFifoUsb");
169  return StatusCode::FAILURE;
170  }
171  else {
172  info("Trigger Fifo 40MHz read mode set.",
173  "A3PE::setReadTriggerFifoUsb");
174  }
175  return StatusCode::SUCCESS;
176  }
177 }
178 
180  m_toAXRamPtr->io()->setU16(0,(add&0x1FF));
181  if (m_toAXRamPtr->write().isFailure()){
182  error("Cannot write toAxRamPtr register "+m_toAXRamPtr->name(),
183  "A3PE::setAddToAXRam");
184  return StatusCode::FAILURE;
185  }
186  debug("toAXRamPtr register set to "+itos(add)+".","A3PE::setAddToAXRam");
187  return StatusCode::SUCCESS;
188 }
189 
191  m_fromAXRamPtr->io()->setU16(0,(add&0x1FF));
192  if (m_fromAXRamPtr->write().isFailure()){
193  error("Cannot write AddFromAxRam register "+m_fromAXRamPtr->name(),
194  "A3PE::setAddFromAXRam");
195  return StatusCode::FAILURE;
196  }
197  debug("fromAXRamPtr register set to "+itos(add)+".","A3PE::setAddFromAXRam");
198  return StatusCode::SUCCESS;
199 }
200 
202  if (m_setupReg->setBit(10,enable).isFailure()||
203  m_setupReg->setBit(11,enable).isFailure()){
204  error("Cannot set ToAXfifo read bit","A3PE::setReadToAXRamUsb");
205  return StatusCode::FAILURE;
206  }
207  else {
208  debug("ToAXRam read mode set.","A3PE::setReadToAXRamUsb");
209  }
210  return StatusCode::SUCCESS;
211 }
212 
214  if (m_setupReg->setBit(10,enable).isFailure()||
215  m_setupReg->setBit(11,enable).isFailure()){
216  error("Cannot set usb FromAXfifo write bit","A3PE::writeFromAXFifoUsb");
217  return StatusCode::FAILURE;
218  }
219  else {
220  debug("write FromAXFifo USB Write mode set.","A3PE::writeFromAXFifoUsb");
221  }
222  return StatusCode::SUCCESS;
223 }
224 
226  if (enable) {
227  if (m_setupReg->setBit(9,1).isFailure()||
228  m_setupReg->setBit(11,1).isFailure()
229  //||m_setupReg->setBit(12,0).isFailure()
230  ){
231  error("Cannot set AXRam USB clock mode","A3PE::setAXRamUsb");
232  return StatusCode::FAILURE;
233  }
234  }
235  else {
236  if (m_setupReg->setBit(9,0).isFailure()||
237  m_setupReg->setBit(11,0).isFailure()
238  //||m_setupReg->setBit(12,1).isFailure()
239  ){
240  error("Cannot set AXRam acquisition clock mode","A3PE::setAXRamUsb");
241  return StatusCode::FAILURE;
242  }
243  }
244  debug("AXRam USB clock mode set to "+itos(enable),"A3PE::setAXRamUsb");
245  return StatusCode::SUCCESS;
246 }
247 
249  if (m_setupReg->getBit(8)==1&&m_setupReg->getBit(9)==1) return true;
250  return false;
251 }
252 
254  if (m_setupReg->getBit(9)==1) return true;
255  return false;
256 }
257 
259  if (m_setupReg->getBit(9)==1) return true;
260  return false;
261 }
262 
263 // Get
264 
265 bool A3PE::enableADC(unsigned int adc){
266  if (adc<8){
267  return m_setupReg->getBit(adc);
268  }
269  return false;
270 }
271 
273  return (m_setupReg->getBit(10)==1&&m_setupReg->getBit(11)==1);
274 }
275 
277  return (m_setupReg->getBit(10)==1&&m_setupReg->getBit(11)==1);
278 }
279 
281  info("Switch AX internal loop mode to "+itos(mode),"A3PE::setInternalAXSequence");
282  return m_setupReg->setBit(12,mode);
283 }
284 
286  debug("Get fpga loop mode","A3PE::internalAXSequence");
287  return m_setupReg->getBit(12);
288 }
289 
290 StatusCode A3PE::setPipeline(unsigned int val){
291  if (val>2) {
292  warning("Cannot set pipeline to coded value "+itos(val),"A3PE::setPipeline");
293  return StatusCode::FAILURE;
294  }
295  m_acqReg->read();
296  unsigned int data=(m_acqReg->io()->dataU16()[0])&0xFF3F;
297  m_acqReg->io()->setU16(0,data|(((val&3)<<6)));
298  if (m_acqReg->write().isFailure()){
299  error("Cannot write acquisition register "+m_acqReg->name(),
300  "A3PE::setPipeline");
301  return StatusCode::FAILURE;
302  }
303  info("Acquisition register bits set to "+itos(val),"A3PE::setPipeline");
304  return StatusCode::SUCCESS;
305 }
306 
307 unsigned int A3PE::pipeline(){
308  if (m_acqReg->read().isFailure()){
309  error("Cannot read acquisition register "+m_acqReg->name(),
310  "A3PE::pipeline");
311  return 0;
312  }
313  return (((m_acqReg->io()->dataU16()[0])>>6)&3);
314 }
315 
316 StatusCode A3PE::setLengthAX(unsigned int val){
317  m_lengthAX->io()->setU16(0,val&0xfff);
318  if (m_lengthAX->write().isFailure()){
319  error("Cannot write length AX register "+m_lengthAX->name(),
320  "Register::setLengthAX");
321  return StatusCode::FAILURE;
322  }
323  debug("LengthAX register set to "+itos(val),"A3PE::setLengthAX");
324  return StatusCode::SUCCESS;
325 }
326 
327 StatusCode A3PE::setLatencyAX(unsigned int val){
328  m_latencyAX->io()->setU32(0,val);
329  if (m_latencyAX->write().isFailure()){
330  error("Cannot write latency AX register "+m_latencyAX->name(),
331  "Register::setLatencyAX");
332  return StatusCode::FAILURE;
333  }
334  debug("LatencyAX register set to "+itos(val),"A3PE::setLatencyAX");
335  return StatusCode::SUCCESS;
336 }
337 
338 unsigned int A3PE::lengthAX(){
339  if (m_lengthAX->read().isFailure()){
340  error("Cannot read Length AX register "+m_lengthAX->name(),
341  "A3PE::lengthAX");
342  return 0;
343  }
344  unsigned long int data=m_lengthAX->io()->dataU16()[0];
345  return (data&0xffff);
346 }
347 
348 unsigned int A3PE::latencyAX(){
349  if (m_latencyAX->read().isFailure()){
350  error("Cannot read Latency AX register "+m_latencyAX->name(),
351  "A3PE::latencyAX");
352  return 0;
353  }
354  unsigned long int data=m_latencyAX->io()->dataU32()[0];
355  return (data&0xffffff);
356  return 0;
357 }
358 
359 
360 // =====
361 // Acquisition register
362 
364  debug("Trigger sequence started","A3PE::trigger");
365  return m_acqReg->setBit(0,1);
366 }
367 
369  if (m_acqReg->setBit(1,enable).isFailure()){
370  error("Cannot set software trigger bit","A3PE::setSoftwareTrigger");
371  return StatusCode::FAILURE;
372  }
373  else{
374  info("Software trigger mode set to "+itos(enable),"A3PE::setSoftwareTrigger");
375  }
376  return StatusCode::SUCCESS;
377 }
378 
380  return m_acqReg->getBit(1);
381 }
382 
384  // enable data storage
385  if (m_acqReg->read().isFailure()){
386  error("Cannot read acquisition register "+name(),"A3P3::enableStorage");
387  return StatusCode::FAILURE;
388  }
389  unsigned int data=m_acqReg->io()->dataU16()[0];
390  // info("Value before acquisition: "+itos(data));
391  data|=4;
392  m_acqReg->io()->setU16(0,data);
393  if (m_acqReg->write().isFailure()){
394  error("Cannot write acquisition register ","A3P3::enableStorage");
395  return StatusCode::FAILURE;
396  }
397  // reset the busy line
398  m_resetReg->io()->setU16(0,8);
399  if (m_resetReg->write().isFailure()){
400  error("Cannot reset Busy line"+name(),"A3P3::enableStorage");
401  return StatusCode::FAILURE;
402  }
403  return StatusCode::SUCCESS;
404 }
405 
407  bool isReady=m_acqReg->getBit(2);
408  if (isReady) {
409  debug("Spying EnableStorage bit - Data Ready: NO ","A3PE::dataReady");
410  }
411  else {
412  debug("Spying EnableStorage bit - Data Ready: YES","A3PE::dataReady");
413  }
414  return (!isReady);
415 }
416 
418  debug("Acquisition sequence started","A3PE::acquisition");
419  warning("This acquisition trigger does not release the busy bit !",
420  "A3PE::acquisition");
421  return m_acqReg->setBit(3,1);
422 }
423 
424 // =====
425 // Status register
426 
427 // =====
428 // Clock division register
431  error("Cannot read Clock Division register "+m_clockDivisionReg->name(),
432  "Register::setClockDivision");
433  return StatusCode::FAILURE;
434  }
435  unsigned long int data=m_clockDivisionReg->io()->dataU32()[0];
436  data &= ~(16777215); // switch last 24 bits at 0
437  data |= ( val & 16777215 ); // or with the desired value
438  m_clockDivisionReg->io()->setU32(0,data);
440  error("Cannot write Clock Division register "+m_clockDivisionReg->name(),
441  "Register::setClockDivision");
442  return StatusCode::FAILURE;
443  }
444  info("Clock Division set to "+itos(val),"A3PE::setClockDivision");
445  return StatusCode::SUCCESS;
446 }
447 
448 unsigned int A3PE::clockDivision(){
450  error("Cannot read Clock Division register "+m_clockDivisionReg->name(),
451  "Register::setClockDivision");
452  return 0;
453  }
454  unsigned long int data=m_clockDivisionReg->io()->dataU32()[0];
455  return (data&(16777215)); // switch last 24 bits at 0
456 }
457 
458 // ======
459 // Trigger generator
460 
462  if (m_triggerReg->read().isFailure()){
463  error("Cannot read Trigger register "+m_triggerReg->name(),
464  "Register::setTriggerDelay");
465  return StatusCode::FAILURE;
466  }
467  unsigned long int data=m_triggerReg->io()->dataU32()[0];
468  data &= ~(255); // switch last 8 bits to 0
469  data |= ( val & 255); // or with the desired value
470  m_triggerReg->io()->setU32(0,data);
471  if (m_triggerReg->write().isFailure()){
472  error("Cannot write Trigger register "+m_triggerReg->name(),
473  "Register::setTriggerDelay");
474  return StatusCode::FAILURE;
475  }
476  info("Trigger delay set to "+itos(val),"A3PE::setTriggerDelay");
477  return StatusCode::SUCCESS;
478 }
479 
480 unsigned int A3PE::triggerDelay(){
481  if (m_triggerReg->read().isFailure()){
482  error("Cannot read Trigger register "+m_triggerReg->name(),
483  "Register::triggerDelay");
484  return 0;
485  }
486  unsigned long int data=m_triggerReg->io()->dataU32()[0];
487  return (data&(255));
488 }
489 /*
490 StatusCode A3PE::setSeqPulseDelay(unsigned int val){
491  if (m_seqPulseReg->read().isFailure()){
492  error("Cannot read SeqPulse register "+m_seqPulseReg->name(),
493  "Register::setSeqPulseDelay");
494  return StatusCode::FAILURE;
495  }
496  unsigned long int data=m_seqPulseReg->io()->dataU32()[0];
497  data &= ~(255); // switch last 8 bits to 0
498  data |= ( val & 255); // or with the desired value
499  m_seqPulseReg->io()->setU32(0,data);
500  if (m_seqPulseReg->write().isFailure()){
501  error("Cannot write seqPulse register "+m_seqPulseReg->name(),
502  "Register::setSeqPulseDelay");
503  return StatusCode::FAILURE;
504  }
505  info("SeqPulse delay set to "+itos(val),"A3PE::setSeqPulseDelay");
506  return StatusCode::SUCCESS;
507 }
508 
509 unsigned int A3PE::seqPulseDelay(){
510  if (m_seqPulseReg->read().isFailure()){
511  error("Cannot read SeqPulse register "+m_seqPulseReg->name(),
512  "Register::seqPulseDelay");
513  return 0;
514  }
515  unsigned long int data=m_seqPulseReg->io()->dataU32()[0];
516  return (data&(255));
517 }
518 */
519 
521  if (m_triggerReg->read().isFailure()){
522  error("Cannot read Trigger register "+m_triggerReg->name(),
523  "Register::setTriggerRate");
524  return StatusCode::FAILURE;
525  }
526  unsigned long int data=m_triggerReg->io()->dataU32()[0];
527  data &= ~(65535<<8); // switch 16 bits to 0
528  data |= ( (val & 65535)<<8); // or with the desired value
529  m_triggerReg->io()->setU32(0,data);
530  if (m_triggerReg->write().isFailure()){
531  error("Cannot write Trigger register "+m_triggerReg->name(),
532  "Register::setTriggerRate");
533  return StatusCode::FAILURE;
534  }
535  info("Trigger rate set to "+itos(val),"A3PE::setTriggerRate");
536  return StatusCode::SUCCESS;
537 }
538 
539 unsigned int A3PE::triggerRate(){
540  if (m_triggerReg->read().isFailure()){
541  error("Cannot read Trigger register "+m_triggerReg->name(),
542  "Register::setTriggerRate");
543  return 0;
544  }
545  unsigned long int data=m_triggerReg->io()->dataU32()[0];
546  return (data>>8) & (65535) ;
547 }
548 
549 StatusCode A3PE::setNTrigger(unsigned int val){
550  if (m_triggerReg->read().isFailure()){
551  error("Cannot read Trigger register "+m_triggerReg->name(),
552  "Register::setNTrigger");
553  return StatusCode::FAILURE;
554  }
555  unsigned long int data=m_triggerReg->io()->dataU32()[0];
556  data &= ~(255<<24); // switch last 8 bits at 0
557  data |= (( val & 255)<<24); // or with the desired value
558  m_triggerReg->io()->setU32(0,data);
559  if (m_triggerReg->write().isFailure()){
560  error("Cannot write Trigger register "+m_triggerReg->name(),
561  "Register::setNTrigger");
562  return StatusCode::FAILURE;
563  }
564  info("Trigger counter set to "+itos(val),"A3PE::setNTrigger");
565  return StatusCode::SUCCESS;
566 }
567 
568 unsigned int A3PE::nTrigger(){
569  if (m_triggerReg->read().isFailure()){
570  error("Cannot read Trigger register "+m_triggerReg->name(),
571  "Register::setNTrigger");
572  return 0;
573  }
574  unsigned long int data=m_triggerReg->io()->dataU32()[0];
575  return ((data>>24)&255);
576 }
577 
578 // =====
579 // Latency register
580 
581 StatusCode A3PE::setFifoLatency(unsigned short val){
582  if (m_latencyReg->read().isFailure()){
583  error("Cannot read Latency register "+m_latencyReg->name(),
584  "Register::setFifoLatency");
585  return StatusCode::FAILURE;
586  }
587  unsigned short data=m_latencyReg->io()->dataU16()[0];
588  data = (val & 65535);
589  m_latencyReg->io()->setU16(0,data);
590  if (m_latencyReg->write().isFailure()){
591  error("Cannot write Latency register "+m_latencyReg->name(),
592  "Register::setFifoLatency");
593  return StatusCode::FAILURE;
594  }
595  info("Trigger Fifo Latency set to "+itos(val),"Register::setFifoLatency");
596  return StatusCode::SUCCESS;
597 }
598 
599 unsigned int A3PE::fifoLatency(){
600  if (m_latencyReg->read().isFailure()){
601  error("Cannot read Latency register "+m_latencyReg->name(),
602  "Register::setFifoLatency");
603  return 0;
604  }
605  unsigned short data=m_latencyReg->io()->dataU16()[0];
606  return (data&65535);
607 }
608 
609 // =====
610 // Fifo depth
611 
612 StatusCode A3PE::setFifoDepth(unsigned int val){
614  error("Cannot read writeLengthFifo register "+m_writeLengthFifoReg->name(),
615  "Register::setFifoDepth");
616  return StatusCode::FAILURE;
617  m_storageRam->setSize(96,val);
618  }
619  unsigned short data=m_writeLengthFifoReg->io()->dataU16()[0];
620  data = (val & 511);
621  m_writeLengthFifoReg->io()->setU16(0,data);
623  error("Cannot write writeLengthFifo register "+m_writeLengthFifoReg->name(),
624  "Register::setFifoDepth");
625  return StatusCode::FAILURE;
626  }
627  info("Fifo Depth set to "+itos(val),"Register::setFifoDepth");
628  return StatusCode::SUCCESS;
629 }
630 
631 unsigned int A3PE::fifoDepth(){
633  error("Cannot read writeLengthFifo register "+m_writeLengthFifoReg->name(),
634  "Register::setFifoDepth");
635  return 0;
636  }
637  unsigned short data=m_writeLengthFifoReg->io()->dataU16()[0];
638  return (data&511);
639 }
640 
642  RAM* fifo=storageRam();
643  fifo->read();
644  int val[12];
645  char line[100];
646  for (unsigned int d=0; d<fifoDepth(); ++d){
647  val[0] =fifo->io()->dataU8( 0+12*d);
648  val[1] =fifo->io()->dataU8( 1+12*d);
649  val[2] =fifo->io()->dataU8( 2+12*d);
650  val[3] =fifo->io()->dataU8( 3+12*d);
651  val[4] =fifo->io()->dataU8( 4+12*d);
652  val[5] =fifo->io()->dataU8( 5+12*d);
653  val[6] =fifo->io()->dataU8( 6+12*d);
654  val[7] =fifo->io()->dataU8( 7+12*d);
655  val[8] =fifo->io()->dataU8( 8+12*d);
656  val[9] =fifo->io()->dataU8( 9+12*d);
657  val[10]=fifo->io()->dataU8(10+12*d);
658  val[11]=fifo->io()->dataU8(11+12*d);
659  sprintf(line,"%3d -> %4d %4d %4d %4d %4d %4d %4d %4d",
660  d,
661  val[0]+((val[1]&0xf)<<8),(val[1]>>4)+(val[2]<<4),
662  val[3]+((val[4]&0xf)<<8),(val[4]>>4)+(val[5]<<4),
663  val[6]+((val[7]&0xf)<<8),(val[7]>>4)+(val[8]<<4),
664  val[9]+((val[10]&0xf)<<8),(val[10]>>4)+(val[11]<<4)
665  );
666  info(line);
667  }
668 }
669 
670 void A3PE::loadStorage(std::string filename){
671  std::ifstream ifs(filename.c_str(),std::ifstream::in);
672  std::string s;
673  std::string comment;
674  std::istringstream instream;
675  U8* data=storageRam()->io()->dataU8();
676  int depth=fifoDepth();
677  int d=0;
678  int c0, c1, c2, c3, c4, c5, c6, c7;
679  while (getline(ifs, s) && d<depth) { // Reads line into s
680  instream.clear(); // Reset from possible previous errors.
681  instream.str(s); // Use s as source of input.
682  instream>>std::ws;
683  if (!instream.eof()) {
684  instream >> comment;
685  if (comment==std::string("#")) {
686  info(s);
687  }
688  else {
689  instream.clear(); // Reset from possible previous errors.
690  instream.str(s); // Use s as source of input.
691  instream>>c0>>c1>>c2>>c3>>c4>>c5>>c6>>c7;
692  info(itos(c0)+" "+itos(c1)+" "+itos(c2)+" "+itos(c3)
693  +" "+itos(c4)+" "+itos(c5)+" "+itos(c6)+" "+itos(c7));
694  data[ 12*d]=(c0&0xff);
695  data[ 1+12*d]=((c0>>8)&0xf)+((c1<<4)&0xf0);
696  data[ 2+12*d]=((c1>>4)&0xff);
697  data[ 3+12*d]=(c2&0xff);
698  data[ 4+12*d]=((c2>>8)&0xf)+((c3<<4)&0xf0);
699  data[ 5+12*d]=((c3>>4)&0xff);
700  data[ 6+12*d]=(c4&0xff);
701  data[ 7+12*d]=((c4>>8)&0xf)+((c5<<4)&0xf0);
702  data[ 8+12*d]=((c5>>4)&0xff);
703  data[ 9+12*d]=(c6&0xff);
704  data[10+12*d]=((c6>>8)&0xf)+((c7<<4)&0xf0);
705  data[11+12*d]=((c7>>4)&0xff);
706  d++;
707  }
708  }
709  }
710  ifs.close();
712  storageRam()->write();
713  setWriteStorageFifoUsb(false);
714 }
715 
717  RAM* fifo=patternRam();
718  setReadPatternFifoUsb(true);
719  fifo->read();
720  setReadPatternFifoUsb(false);
721  int val[12];
722  char line[100];
723  for (unsigned int d=0; d<fifo->depth(); ++d){
724  val[0] =fifo->io()->dataU8( 0+12*d);
725  val[1] =fifo->io()->dataU8( 1+12*d);
726  val[2] =fifo->io()->dataU8( 2+12*d);
727  val[3] =fifo->io()->dataU8( 3+12*d);
728  val[4] =fifo->io()->dataU8( 4+12*d);
729  val[5] =fifo->io()->dataU8( 5+12*d);
730  val[6] =fifo->io()->dataU8( 6+12*d);
731  val[7] =fifo->io()->dataU8( 7+12*d);
732  val[8] =fifo->io()->dataU8( 8+12*d);
733  val[9] =fifo->io()->dataU8( 9+12*d);
734  val[10]=fifo->io()->dataU8(10+12*d);
735  val[11]=fifo->io()->dataU8(11+12*d);
736  sprintf(line,"%3d -> %4d %4d %4d %4d %4d %4d %4d %4d",
737  d,
738  val[0]+((val[1]&0xf)<<8),(val[1]>>4)+(val[2]<<4),
739  val[3]+((val[4]&0xf)<<8),(val[4]>>4)+(val[5]<<4),
740  val[6]+((val[7]&0xf)<<8),(val[7]>>4)+(val[8]<<4),
741  val[9]+((val[10]&0xf)<<8),(val[10]>>4)+(val[11]<<4)
742  );
743  info(line);
744  }
745 }
746 
747 void A3PE::loadPattern(std::string filename){
748  std::ifstream ifs(filename.c_str(),std::ifstream::in);
749  std::string s;
750  std::string comment;
751  std::istringstream instream;
752  U8* data=patternRam()->io()->dataU8();
753  int depth=patternRam()->depth();
754  int d=0;
755  int c0, c1, c2, c3, c4, c5, c6, c7;
756  while (getline(ifs, s) && d<depth) { // Reads line into s
757  instream.clear(); // Reset from possible previous errors.
758  instream.str(s); // Use s as source of input.
759  instream>>std::ws;
760  if (!instream.eof()) {
761  instream >> comment;
762  if (comment==std::string("#")) {
763  info(s);
764  }
765  else {
766  instream.clear(); // Reset from possible previous errors.
767  instream.str(s); // Use s as source of input.
768  instream>>c0>>c1>>c2>>c3>>c4>>c5>>c6>>c7;
769  info(itos(c0)+" "+itos(c1)+" "+itos(c2)+" "+itos(c3)
770  +" "+itos(c4)+" "+itos(c5)+" "+itos(c6)+" "+itos(c7));
771  data[ 12*d]=(c0&0xff);
772  data[ 1+12*d]=((c0>>8)&0xf)+((c1<<4)&0xf0);
773  data[ 2+12*d]=((c1>>4)&0xff);
774  data[ 3+12*d]=(c2&0xff);
775  data[ 4+12*d]=((c2>>8)&0xf)+((c3<<4)&0xf0);
776  data[ 5+12*d]=((c3>>4)&0xff);
777  data[ 6+12*d]=(c4&0xff);
778  data[ 7+12*d]=((c4>>8)&0xf)+((c5<<4)&0xf0);
779  data[ 8+12*d]=((c5>>4)&0xff);
780  data[ 9+12*d]=(c6&0xff);
781  data[10+12*d]=((c6>>8)&0xf)+((c7<<4)&0xf0);
782  data[11+12*d]=((c7>>4)&0xff);
783  d++;
784  }
785  }
786  }
787  ifs.close();
788  patternRam()->write();
789 }
790 
792  RAM* fifo=triggerRam();
793  setReadTriggerFifoUsb(true);
794  fifo->read();
795  setReadTriggerFifoUsb(false);
796  int val;
797  char line[100];
798  for (int d=0; d<fifo->depth(); ++d){
799  val=fifo->io()->dataU8(d);
800  sprintf(line,"%3d -> %1d %1d %1d %1d %1d %1d %1d %1d",
801  d,
802  val&0x1,(val>>1)&0x1,(val>>2)&0x1,(val>>3)&0x1,
803  (val>>4)&0x1,(val>>5)&0x1,(val>>6)&0x1,(val>>7)&0x1);
804  info(line);
805  }
806 }
807 
808 
809 void A3PE::loadTrigger(std::string filename){
810  std::ifstream ifs(filename.c_str(),std::ifstream::in);
811  std::string s;
812  std::string comment;
813  std::istringstream instream;
814  U8* data=triggerRam()->io()->dataU8();
815  int depth=triggerRam()->depth();
816  int d=0;
817  int c0, c1, c2, c3, c4, c5, c6, c7;
818  while (getline(ifs, s) && d<depth) { // Reads line into s
819  instream.clear(); // Reset from possible previous errors.
820  instream.str(s); // Use s as source of input.
821  instream>>std::ws;
822  if (!instream.eof()) {
823  instream >> comment;
824  if (comment==std::string("#")) {
825  info(s);
826  }
827  else {
828  instream.clear(); // Reset from possible previous errors.
829  instream.str(s); // Use s as source of input.
830  instream>>c0>>c1>>c2>>c3>>c4>>c5>>c6>>c7;
831  info(itos(c0)+" "+itos(c1)+" "+itos(c2)+" "+itos(c3)
832  +" "+itos(c4)+" "+itos(c5)+" "+itos(c6)+" "+itos(c7));
833  data[d]=c0+((c1&0x1)<<1)+((c2&0x1)<<2)+((c3&0x1)<<3)+
834  ((c4&0x1)<<4)+((c5&0x1)<<5)+((c6&0x1)<<6)+((c7&0x1)<<7);
835  warning(itos(d)+" => "+itos(data[d]));
836  d++;
837  }
838  }
839  }
840  ifs.close();
841  triggerRam()->write();
842 }
843 
845  setAddToAXRam(0);
846  setReadToAXRamUsb(true);
847  toAXRam()->read();
848  setReadToAXRamUsb(false);
849  U8* val=toAXRam()->io()->dataU8();
850  char line[100];
851  for (int d=0; d<toAXRam()->depth(); ++d){
852  sprintf(line,"%3d -> %1d %1d %1d %1d",
853  d,val[4*d],val[1+4*d],val[2+4*d],val[3+4*d]);
854  info(line);
855  }
856 }
857 
858 void A3PE::loadToAX(std::string filename){
859  setAXRamUsb(true);
860  setAddToAXRam(0);
861  info("loadtoax="+filename);
862  std::ifstream ifs(filename.c_str(),std::ifstream::in);
863  std::string s;
864  std::string comment;
865  std::istringstream instream;
866  U8* data=toAXRam()->io()->dataU8();
867  int depth=toAXRam()->depth();
868  int d=0;
869  int c0, c1, c2, c3;
870  while (getline(ifs, s) && d<depth) { // Reads line into s
871  instream.clear(); // Reset from possible previous errors.
872  instream.str(s); // Use s as source of input.
873  instream>>std::ws;
874  if (!instream.eof()) {
875  instream >> comment;
876  if (comment==std::string("#")) {
877  info(s);
878  }
879  else {
880  instream.clear(); // Reset from possible previous errors.
881  instream.str(s); // Use s as source of input.
882  instream>>c0>>c1>>c2>>c3;
883  info(itos(c0)+" "+itos(c1)+" "+itos(c2)+" "+itos(c3));
884  data[ 4*d]=c0&0xff;
885  data[1+4*d]=c1&0xff;
886  data[2+4*d]=c2&0xff;
887  data[3+4*d]=c3&0xff;
888  d++;
889  }
890  }
891  }
892  ifs.close();
893  toAXRam()->write();
894 }
895 
897  setAXRamUsb(true);
898  setAddFromAXRam(0);
899  fromAXRam()->read();
900  U8* val=fromAXRam()->io()->dataU8();
901  unsigned int l=lengthAX();
902  info("Length AX="+itos(l));
903  char line[100];
904  for (int d=0; d<l+2; ++d){
905  sprintf(line,"%3d -> %1d %1d %1d %1d",
906  d,val[4*d],val[1+4*d],val[2+4*d],val[3+4*d]);
907  info(line);
908  }
909 }
910 
911 void A3PE::loadFromAX(std::string filename){
912  setAddFromAXRam(0);
913  std::ifstream ifs(filename.c_str(),std::ifstream::in);
914  std::string s;
915  std::string comment;
916  std::istringstream instream;
917  U8* data=fromAXRam()->io()->dataU8();
918  int depth=fromAXRam()->depth();
919  int d=0;
920  int c0, c1, c2, c3;
921  while (getline(ifs, s) && d<depth) { // Reads line into s
922  instream.clear(); // Reset from possible previous errors.
923  instream.str(s); // Use s as source of input.
924  instream>>std::ws;
925  if (!instream.eof()) {
926  instream >> comment;
927  if (comment==std::string("#")) {
928  info(s);
929  }
930  else {
931  instream.clear(); // Reset from possible previous errors.
932  instream.str(s); // Use s as source of input.
933  instream>>c0>>c1>>c2>>c3;
934  info(itos(c0)+" "+itos(c1)+" "+itos(c2)+" "+itos(c3));
935  data[ 4*d]=c0&0xff;
936  data[1+4*d]=c1&0xff;
937  data[2+4*d]=c2&0xff;
938  data[3+4*d]=c3&0xff;
939  d++;
940  }
941  }
942  }
943  ifs.close();
944  setWriteFromAXRamUsb(true);
945  fromAXRam()->write();
946  setWriteFromAXRamUsb(false);
947 }
948 
950  setAXRamUsb(false);
951  setAddToAXRam(0);
952  setAddFromAXRam(0);
953  if (m_acqReg->setBit(4,1).isFailure()){
954  error("Cannot set AX sequence start bit bit","A3PE::startAXSequence");
955  return StatusCode::FAILURE;
956  }
957  return StatusCode::SUCCESS;
958 }
959 
void info(std::string mymsg)
Definition: Object.h:38
std::string itos(int)
Definition: Tools.cpp:46
Register * m_triggerReg
Definition: A3PE.h:597
bool isFailure() const
Definition: StatusCode.h:68
void dumpFromAX()
Definition: A3PE.cpp:896
Definition: RAM.h:16
unsigned int latencyAX()
Definition: A3PE.cpp:348
bool getBit(unsigned int)
Definition: Register.cpp:66
StatusCode setNTrigger(unsigned int)
Definition: A3PE.cpp:549
bool readTriggerFifoUsb()
Definition: A3PE.cpp:258
StatusCode setTriggerRate(unsigned int)
Definition: A3PE.cpp:520
bool readPatternFifoUsb()
Definition: A3PE.cpp:253
StatusCode setReadToAXRamUsb(bool)
Definition: A3PE.cpp:201
RAM * fromAXRam()
Definition: A3PE.h:552
bool readToAXRamUsb()
Definition: A3PE.cpp:272
unsigned int triggerRate()
Definition: A3PE.cpp:539
StatusCode setSize(unsigned int, unsigned int)
Definition: RAM.cpp:29
StatusCode setSoftwareTrigger(bool)
Definition: A3PE.cpp:368
StatusCode setReadPatternFifoUsb(bool)
Definition: A3PE.cpp:124
unsigned int clockDivision()
Definition: A3PE.cpp:448
void add(int attribut)
Definition: Attrib.h:67
virtual StatusCode write()
Definition: IOobject.h:80
StatusCode setAddToAXRam(int)
Definition: A3PE.cpp:179
StatusCode resetLatencyCounter()
Definition: A3PE.cpp:37
Register * m_fromAXRamPtr
Definition: A3PE.h:605
Register * m_lengthAX
Definition: A3PE.h:609
StatusCode resetUsbPhasers()
Definition: A3PE.cpp:32
StatusCode setFifoDepth(unsigned int)
Definition: A3PE.cpp:612
StatusCode resetSequenceFromToAX()
Definition: A3PE.cpp:67
Register * m_writeLengthFifoReg
Definition: A3PE.h:594
void loadToAX(std::string)
Definition: A3PE.cpp:858
RAM * patternRam()
Definition: A3PE.h:540
void loadTrigger(std::string)
Definition: A3PE.cpp:809
StatusCode setU16(unsigned long int, U16)
Definition: IOdata.cpp:60
RAM * storageRam()
Definition: A3PE.h:536
bool writeStorageFifoUsb()
Definition: A3PE.cpp:248
bool softwareTrigger()
Definition: A3PE.cpp:379
U32 * dataU32()
Definition: IOdata.h:222
void dumpStorage()
Definition: A3PE.cpp:641
StatusCode resetSPI()
Definition: A3PE.cpp:77
void dumpPattern()
Definition: A3PE.cpp:716
StatusCode startSequenceAX()
Definition: A3PE.cpp:949
Register * m_setupReg
Definition: A3PE.h:590
RAM * triggerRam()
Definition: A3PE.h:544
virtual StatusCode read()
Definition: IOobject.h:73
StatusCode setU32(unsigned long int, U32)
Definition: IOdata.cpp:77
bool dataReady()
Definition: A3PE.cpp:406
void error(std::string mymsg)
Definition: Object.h:40
void debug(std::string mymsg)
Definition: Object.h:37
def data(object, stream=None)
Definition: shell.py:150
StatusCode setBit(unsigned int, bool)
Definition: Register.cpp:32
Register * m_resetReg
Definition: A3PE.h:589
unsigned int triggerDelay()
Definition: A3PE.cpp:480
StatusCode setLatencyAX(unsigned int)
Definition: A3PE.cpp:327
RAM * m_storageRam
Definition: A3PE.h:601
StatusCode trigger()
Definition: A3PE.cpp:363
StatusCode setTriggerDelay(unsigned int)
Definition: A3PE.cpp:461
StatusCode setPipeline(unsigned int)
Definition: A3PE.cpp:290
StatusCode resetStorageFifo()
Definition: A3PE.cpp:27
Register * m_clockDivisionReg
Definition: A3PE.h:596
U16 * dataU16()
Definition: IOdata.h:218
StatusCode resetPatternFifo()
Definition: A3PE.cpp:47
StatusCode setFifoLatency(unsigned short)
Definition: A3PE.cpp:581
unsigned int nTrigger()
Definition: A3PE.cpp:568
void loadStorage(std::string)
Definition: A3PE.cpp:670
StatusCode setAddFromAXRam(int)
Definition: A3PE.cpp:190
StatusCode setReadTriggerFifoUsb(bool)
Definition: A3PE.cpp:152
void loadFromAX(std::string)
Definition: A3PE.cpp:911
Register * m_latencyReg
Definition: A3PE.h:593
unsigned int lengthAX()
Definition: A3PE.cpp:338
StatusCode enableStorage()
Definition: A3PE.cpp:383
int depth()
Definition: RAM.h:32
U8 * dataU8()
Definition: IOdata.h:214
Register * m_acqReg
Definition: A3PE.h:592
Register * m_latencyAX
Definition: A3PE.h:608
RAM * toAXRam()
Definition: A3PE.h:548
bool writeFromAXRamUsb()
Definition: A3PE.cpp:276
std::string name() const
Definition: Object.h:28
unsigned char U8
Definition: A3PE.h:24
StatusCode setWriteStorageFifoUsb(bool)
Definition: A3PE.cpp:99
StatusCode acquisition()
Definition: A3PE.cpp:417
Register * m_toAXRamPtr
Definition: A3PE.h:604
StatusCode resetTriggerFifo()
Definition: A3PE.cpp:52
StatusCode resetAcquisitionWriteCounter()
Definition: A3PE.cpp:42
unsigned int fifoDepth()
Definition: A3PE.cpp:631
void warning(std::string mymsg)
Definition: Object.h:39
StatusCode resetToAXRam()
Definition: A3PE.cpp:57
StatusCode setAXRamUsb(bool)
Definition: A3PE.cpp:225
unsigned int pipeline()
Definition: A3PE.cpp:307
StatusCode resetFromAXRam()
Definition: A3PE.cpp:62
StatusCode setInternalAXSequence(bool)
Definition: A3PE.cpp:280
StatusCode setClockDivision(unsigned int)
Definition: A3PE.cpp:429
StatusCode setEnableADC(unsigned int, bool)
Definition: A3PE.cpp:87
bool internalAXSequence()
Definition: A3PE.cpp:285
unsigned int fifoLatency()
Definition: A3PE.cpp:599
void dumpToAX()
Definition: A3PE.cpp:844
StatusCode resetFE()
Definition: A3PE.cpp:72
void dumpTrigger()
Definition: A3PE.cpp:791
IOdata * io()
Definition: IOobject.h:66
StatusCode setLengthAX(unsigned int)
Definition: A3PE.cpp:316
StatusCode setWriteFromAXRamUsb(bool)
Definition: A3PE.cpp:213
void loadPattern(std::string)
Definition: A3PE.cpp:747
bool enableADC(unsigned int)
Definition: A3PE.cpp:265