Cat
UsbFTMLInterface.cpp
Go to the documentation of this file.
1 //$Id: UsbFTMLInterface.cpp,v 1.1.1.1 2005/01/05 16:42:10 machefer Exp $
2 //------------------------------------------------------------------------------
3 //
4 // Package : UsbFTMLInterface
5 //
6 // Description:
7 //
8 // Author(s) : F. Machefert -
9 // Date : 14 January 2004
10 //
11 //------------------------------------------------------------------------------
12 
13 #include "UsbFTMLInterface.h"
14 
15 
16 //=========================================================================
17 //
18 //=========================================================================
20  m_usbId(-1),
21  m_serialNum(std::string("None")),
22  m_deviceDesc(std::string("None")),
23  m_latencyTimer(2),
24  m_txTimeOut(1000),
25  m_rxTimeOut(1000),
26  m_txBuffer(4096),
27  m_rxBuffer(32768),
28  m_nFrames (0),
29  m_wordSize(WS_DWord),
30  m_fakeErr (FK_LETSBETRUE),
31  m_rdBlockMax(65536),
32  m_wrBlockMax(65536),
33  m_interrupts(true),
34  m_showEpromState(false),
35  m_printout(false)
36 {
37  setName("usb");
38  setType("UsbFTMLInterface");
39  info("Todo : time efficiency by creating the buffer once for all ?");
40  // add(Attrib::INTERFACE);
41 }
42 
43 
44 //=========================================================================
45 //
46 //=========================================================================
48  unsigned char msecs=0;
49  char desc[256];
50  char serial[64];
51 
52  strcpy(desc , m_deviceDesc.c_str());
53  strcpy(serial, m_serialNum.c_str());
54 
55  info("Start USB device initialisation.","UsbFTMLInterface::init");
56  if (m_usbId>0)
57  {
58  error("Usb device already open.","UsbFTMLInterface::init");
59  close();
60  }
61  if (!USB_FindDevices(desc))
62  {
64  error("Cannot find Usb Device "+name()+" with device description "+
65  m_deviceDesc,"UsbFTMLInterface::init");
66  }
67  else
68  {
69  info("Device with device description "+m_deviceDesc+" found.","UsbFTMLInterface::init");
70  info("Try to open device with serial number "+m_serialNum+".","UsbFTMLInterface::init");
71  m_usbId=OpenUsbDevice(serial);
72  if (m_usbId<0)
73  {
74  error("Could not find device with serial number "+m_serialNum,"UsbFTMLInterface::init");
75  if (GetDeviceSerNum(serial,0)!=FT_OK)
76  {
77  error("Serial number do not match first device found.","UsbFTMLInterface::init");
78  }
79  else
80  {
81  info("Extracted serial number "+std::string(serial)+".","UsbFTMLInterface::init");
82  if (GetDeviceDesc(desc,0)!=FT_OK)
83  {
85  fatal("Device description do not match first device either. Abort",
86  "UsbFTMLInterface::init");
87  }
88  else
89  {
90  info("Device found. Extracted description "+std::string(desc)+".",
91  "UsbFTMLInterface::init");
92  m_usbId=OpenUsbDevice(serial);
93  if (m_usbId<0)
94  {
96  fatal("Cannot open device. Abort.","UsbFTMLInterface::init");
97  }
98  }
99  }
100  }
101 
102  info("Device opened with UsbId "+itos(m_usbId)+".","UsbFTMLInterface::init");
103 
104  m_deviceDesc = std::string(desc);
105  m_serialNum = std::string(serial);
106 
108  if (!USB_Init(m_usbId,true))
109  {
111  fatal("Could not initialize the USB device "+name()+". Abort.",
112  "UsbFTMLInterface::init");
113  }
114 
115  info("Usb device initialization done.","UsbFTMLInterface::init");
116 
120  USB_GetLatencyTimer(m_usbId, &msecs);
121 
124  // UsbSetMaxLayer(m_usbId,1);
125  }
126  USB_PurgeBuffers(m_usbId); // PurgeBuffers après le reset cause une erreur lors de la première lecture effectuée via le port usb.
128  wait(1000);
130  return StatusCode::SUCCESS;
131 }
132 
133 
134 //=========================================================================
135 //
136 //=========================================================================
137 StatusCode UsbFTMLInterface::read(unsigned long int address,
138  unsigned long int nWords,
139  boost::python::list &obj)
140 {
141  StatusCode status;
142  verbose("USB Reading :","UsbFTMLInterface::read");
143  switch (m_wordSize)
144  {
145  case WS_Byte:
146  {
147  unsigned char *data=new unsigned char[nWords];
148  status = usbReadU8( address, nWords, data);
149  info("Data format is "+itos(WS_Byte),"UsbFTMLInterface::read");
150  for(unsigned int i = 0; i < nWords; i++){
151  verbose("wd "+itos(i)+" "+itos(data[i]),"UsbFTMLInterface::read");
152  obj.append(data[i]);
153  };
154  delete data;
155  }
156  break;
157  case WS_Word:
158  {
159  unsigned short *data=new unsigned short[nWords];
160  status = usbReadU16( address, nWords, data);
161  verbose("Data format is "+itos(WS_Word),"UsbFTMLInterface::read");
162  for(unsigned int i = 0; i < nWords; i++){
163  verbose("wd "+itos(i)+" "+itos(data[i]),"UsbFTMLInterface::read");
164  obj.append(data[i]);
165  };
166  delete data;
167  }
168  break;
169  case WS_DWord:
170  {
171  unsigned long *data=new unsigned long[nWords];
172  status = usbReadU32( address, nWords, data);
173  verbose("Data format is "+itos(WS_DWord),"UsbFTMLInterface::read");
174  for(unsigned int i = 0; i < nWords; i++){
175  verbose("wd "+itos(i)+" "+itos(data[i]),"UsbFTMLInterface::read");
176  obj.append(data[i]);
177  };
178  delete data;
179  }
180  break;
181  default:
182  error("Wrong word size.","UsbFTMLInterface::read");
183  status=StatusCode::FAILURE;
184  }
185  return status;
186 }
187 
188 //=========================================================================
189 //
190 //=========================================================================
191 StatusCode UsbFTMLInterface::write(unsigned long int address,
192  boost::python::list obj)
193 {
194  unsigned long int nWords = len(obj);
195  StatusCode status;
196  verbose("USB Writing :");
197  switch (m_wordSize)
198  {
199  case WS_Byte:
200  {
201  unsigned char *data=new unsigned char[nWords];
202  for(unsigned int i = 0; i < nWords; i++){
203  data[i]=(boost::python::extract<unsigned char>(obj[i]));
204  verbose("Data format is "+itos(WS_Byte),"UsbFTMLInterface::write");
205  verbose("wd "+itos(i)+" "+itos(data[i]),"UsbFTMLInterface::write");
206  };
207  status = usbWriteU8(address, nWords, data);
208  delete data;
209  }
210  break;
211  case WS_Word:
212  {
213  unsigned short *data=new unsigned short[nWords];
214  for(unsigned int i = 0; i < nWords; i++){
215  verbose("Data format is "+itos(WS_Word),"UsbFTMLInterface::write");
216  data[i]=(boost::python::extract<unsigned short>(obj[i]));
217  verbose("wd "+itos(i)+" "+itos(data[i]),"UsbFTMLInterface::write");
218  };
219  status = usbWriteU16(address, nWords, data);
220  delete data;
221  }
222  break;
223  case WS_DWord:
224  {
225  unsigned long *data=new unsigned long[nWords];
226  for(unsigned int i = 0; i < nWords; i++){
227  data[i]=(boost::python::extract<unsigned long>(obj[i]));
228  verbose("Data format is "+itos(WS_DWord),"UsbFTMLInterface::write");
229  verbose("wd "+itos(i)+" "+itos(data[i]),"UsbFTMLInterface::write");
230  }
231  status = usbWriteU32(address, nWords, data);
232  delete data;
233  }
234  break;
235  default:
236  error("Wrong word size.","read");
237  status=StatusCode::FAILURE;
238  }
239  return status;
240 }
241 
242 //=========================================================================
243 //
244 //=========================================================================
245 StatusCode UsbFTMLInterface::usbRead(unsigned long int address,
246  unsigned long int nWords,
247  std::vector<U32> &words)
248 {
249  StatusCode status;
250  verbose("USB Reading :","UsbFTMLInterface::read");
251  words.clear();
252  words.reserve(nWords);
253  switch (m_wordSize)
254  {
255  case WS_Byte:
256  {
257  unsigned char *data=new unsigned char[nWords];
258  status = usbReadU8( address, nWords, data);
259  for(unsigned int i = 0; i < nWords; i++){
260  verbose("wd "+itos(i)+" "+itos(data[i]),"UsbFTMLInterface::usbRead");
261  words.push_back(data[i]);
262  };
263  delete data;
264  }
265  break;
266  case WS_Word:
267  {
268  unsigned short *data=new unsigned short[nWords];
269  status = usbReadU16( address, nWords, data);
270  for(unsigned int i = 0; i < nWords; i++){
271  verbose("wd "+itos(i)+" "+itos(data[i]),"UsbFTMLInterface::usbRead");
272  words.push_back(data[i]);
273  };
274  delete data;
275  }
276  break;
277  case WS_DWord:
278  {
279  unsigned long *data=new unsigned long[nWords];
280  status = usbReadU32( address, nWords, data);
281  for(unsigned int i = 0; i < nWords; i++){
282  verbose("wd "+itos(i)+" "+itos(data[i]),"UsbFTMLInterface::usbRead");
283  words.push_back(data[i]);
284  };
285  delete data;
286  }
287  break;
288  default:
289  error("Wrong word size.","UsbFTMLInterface::read");
290  status=StatusCode::FAILURE;
291  }
292  return status;
293 }
294 
295 //=========================================================================
296 //
297 //=========================================================================
298 StatusCode UsbFTMLInterface::usbWrite(unsigned long int address,
299  std::vector<U32> words)
300 {
301  unsigned long int nWords = words.size();
302  StatusCode status;
303  verbose("USB Writing :");
304  switch (m_wordSize)
305  {
306  case WS_Byte:
307  {
308  unsigned char *data=new unsigned char[nWords];
309  for(unsigned int i = 0; i < nWords; i++){
310  data[i]=words[i];
311  verbose("Data format is "+itos(WS_Byte),"UsbFTMLInterface::usbWrite");
312  verbose("wd "+itos(i)+" "+itos(data[i]),"UsbFTMLInterface::usbWrite");
313  };
314  status = usbWriteU8(address, nWords, data);
315  delete data;
316  }
317  break;
318  case WS_Word:
319  {
320  unsigned short *data=new unsigned short[nWords];
321  for(unsigned int i = 0; i < nWords; i++){
322  data[i]=words[i];
323  verbose("Data format is "+itos(WS_Word),"UsbFTMLInterface::usbWrite");
324  verbose("wd "+itos(i)+" "+itos(data[i]),"UsbFTMLInterface::usbWrite");
325  };
326  status = usbWriteU16(address, nWords, data);
327  delete data;
328  }
329  break;
330  case WS_DWord:
331  {
332  unsigned long *data=new unsigned long[nWords];
333  for(unsigned int i = 0; i < nWords; i++){
334  data[i]=words[i];
335  verbose("Data format is "+itos(WS_DWord),"UsbFTMLInterface::usbWrite");
336  verbose("wd "+itos(i)+" "+itos(data[i]) ,"UsbFTMLInterface::usbWrite");
337  }
338  status = usbWriteU32(address, nWords, data);
339  delete data;
340  }
341  break;
342  default:
343  error("Wrong word size.","read");
344  status=StatusCode::FAILURE;
345  }
346  return status;
347 }
348 //=========================================================================
349 //
350 //=========================================================================
351 StatusCode UsbFTMLInterface::usbReadU8 ( unsigned long int address,
352  unsigned long int nWords,
353  unsigned char *data ) {
354 
355  USB_Error rdErr=USB_NoErr;
356  long int bytecount=0;
357 
358  long int nData = (long int)(nWords);
359 
360  int path = -1;
361 
362  bytecount=UsbReadML(m_usbId, &path, address, data, nData);
363 
364  if (nData==bytecount){
365  verbose(itos(bytecount)+" bytes read from USB Interface "+name(),
366  "UsbFTMLInterface::usbRead8");
367  return StatusCode::SUCCESS;
368  }
369 
370  if (bytecount<0){
371  rdErr=USB_GetLastError();
372  error("USB error number "+itos(rdErr)+" - USB_INT_FRAME="+itos(USB_INT_FRAME),
373  " UsbFTMLInterface::usbRead8");
374  if (rdErr==USB_INT_FRAME){
375  PrintFrameInfo();
376  }
377  return StatusCode::FAILURE;
378  }
379 
380  if (0==bytecount){
381  error(" O Byte read from USB interface "+name()+".","UsbFTMLInterface::usbRead8");
382  return StatusCode::FAILURE;
383  }
384 
385  if (nData!=bytecount){
386  error(itos(bytecount)+" byte(s) read from USB interface "+name()+
387  " out of "+itos(nData)+" bytes expected.","UsbFTMLInterface::usbRead8");
388  return StatusCode::FAILURE;
389  }
390 
391  return StatusCode::SUCCESS;
392 }
393 
394 //=========================================================================
395 //
396 //=========================================================================
397 StatusCode UsbFTMLInterface::usbReadU16 ( unsigned long int address,
398  unsigned long int nWords,
399  unsigned short *data ) {
400 
401  USB_Error rdErr=USB_NoErr;
402  long int bytecount=0;
403 
404  verbose("in UsbReadU16.");
405 
406 
407  long int nData = (long int)(2*nWords);
408 
409  unsigned char *buff=new unsigned char [nData];
410 
411 
412  verbose("before usbread");
413 
414  int path = -1;
415  bytecount=UsbReadML(m_usbId, &path, address, buff, nData);
416 
417  verbose("after usbread");
418 
419  for (unsigned long word=0; word<nWords; ++word)
420  {
421  data[word]=buff[2*word+1];
422  data[word]=(data[word]<<8)|buff[2*word];
423  }
424 
425  delete buff;
426 
427  if (nData==bytecount){
428  verbose(itos(bytecount)+" bytes read from USB Interface "+name(),
429  "UsbFTMLInterface::usbReadU16");
430  return StatusCode::SUCCESS;
431  }
432 
433  if (bytecount<0){
434  rdErr=USB_GetLastError();
435  error("USB error number "+itos(rdErr)+" - USB_INT_FRAME="+itos(USB_INT_FRAME),
436  " UsbFTMLInterface::usbReadU16");
437  if (rdErr==USB_INT_FRAME){
438  PrintFrameInfo();
439  }
440  return StatusCode::FAILURE;
441  }
442 
443  if (0==bytecount){
444  error(" O Byte read from USB interface "+name()+".",
445  "UsbFTMLInterface::usbReadU16");
446  return StatusCode::FAILURE;
447  }
448 
449  if (nData!=bytecount){
450  error(itos(bytecount)+" byte(s) read from USB interface "+name()+
451  " out of "+itos(nData)+" bytes expected.",
452  "UsbFTMLInterface::usbReadU16");
453  return StatusCode::FAILURE;
454  }
455 
456  return StatusCode::SUCCESS;
457 }
458 
459 //=========================================================================
460 //
461 //=========================================================================
462 StatusCode UsbFTMLInterface::usbReadU32 ( unsigned long int address,
463  unsigned long int nWords,
464  unsigned long *data ) {
465 
466  USB_Error rdErr=USB_NoErr;
467  long int bytecount=0;
468 
469  long int nData = (long int)(4*nWords);
470 
471  unsigned char *buff=new unsigned char [nData];
472 
473  int path = -1;
474 
475  bytecount=UsbReadML(m_usbId, &path, address, buff, nData);
476 
477  for (unsigned long word=0; word<nWords; ++word)
478  {
479  data[word]=buff[4*word+3];
480  data[word]=(data[word]<<8)|buff[4*word+2];
481  data[word]=(data[word]<<8)|buff[4*word+1];
482  data[word]=(data[word]<<8)|buff[4*word];
483  }
484 
485  delete buff;
486 
487  if (nData==bytecount){
488  verbose(itos(bytecount)+" bytes read from USB Interface "+name(),
489  "UsbFTMLInterface::usbRead");
490  return StatusCode::SUCCESS;
491  }
492 
493  if (bytecount<0){
494  rdErr=USB_GetLastError();
495  error("USB error number "+itos(rdErr)+" - USB_INT_FRAME="+itos(USB_INT_FRAME),
496  " UsbFTMLInterface::usbRead32");
497  if (rdErr==USB_INT_FRAME){
498  PrintFrameInfo();
499  }
500  return StatusCode::FAILURE;
501  }
502 
503  if (0==bytecount){
504  error(" O Byte read from USB interface "+name()+".","UsbFTMLInterface::usbRead32");
505  return StatusCode::FAILURE;
506  }
507 
508  if (nData!=bytecount){
509  error(itos(bytecount)+" byte(s) read from USB interface "+name()+
510  " out of "+itos(nData)+" bytes expected.","UsbFTMLInterface::usbRead32");
511  return StatusCode::FAILURE;
512  }
513  return StatusCode::SUCCESS;
514 }
515 
516 //=========================================================================
517 //
518 //=========================================================================
519 StatusCode UsbFTMLInterface::usbWriteU8 (unsigned long int address ,
520  unsigned long int nWords,
521  unsigned char *data ) {
522  USB_Error wrErr=USB_NoErr;
523  long int bytecount=0;
524 
525  long int nData=(long int)(nWords);
526 
527  int path = -1;
528  bytecount=UsbWrtML(m_usbId, &path, address, data, nData);
529 
530  if (bytecount<0){
531  wrErr=USB_GetLastError();
532  error("USB error number "+itos(wrErr)+" - USB_INT_FRAME="+itos(USB_INT_FRAME),
533  "UsbFTMLInterface::usbWrite8");
534  if (wrErr==USB_INT_FRAME){
535  PrintFrameInfo();
536  }
537  return StatusCode::FAILURE;
538  }
539 
540  if (nData==bytecount){
541  verbose(itos(bytecount)+" bytes written on USB Interface "+name(),
542  "UsbFTMLInterface::usbWrite8");
543  }
544 
545  if (0==bytecount){
546  error(" O Byte written on USB interface "+name()+".","UsbFTMLInterface::usbWrite8");
547  return StatusCode::FAILURE;
548  }
549 
550  if (nData!=bytecount){
551  error(itos(bytecount)+" byte(s) written on USB interface "+name()+
552  " out of "+itos(nData)+" bytes to be sent.","UsbFTMLInterface::usbWrite8");
553  return StatusCode::FAILURE;
554  }
555 
556  return StatusCode::SUCCESS;
557 }
558 
559 //=========================================================================
560 //
561 //=========================================================================
562 StatusCode UsbFTMLInterface::usbWriteU16 (unsigned long int address ,
563  unsigned long int nWords,
564  unsigned short *data ) {
565  USB_Error wrErr=USB_NoErr;
566  long int bytecount=0;
567 
568  long int nData=(long int)(2*nWords);
569 
570  int path = -1;
571  bytecount=UsbWrtML(m_usbId, &path, address, data, nData);
572 
573  if (bytecount<0){
574  wrErr=USB_GetLastError();
575  error("USB error number "+itos(wrErr)+" - USB_INT_FRAME="+itos(USB_INT_FRAME),
576  "UsbFTMLInterface::usbWrite16");
577  if (wrErr==USB_INT_FRAME){
578  PrintFrameInfo();
579  }
580  return StatusCode::FAILURE;
581  }
582 
583  if (nData==bytecount){
584  verbose(itos(bytecount)+" bytes written on USB Interface "+name(),
585  "UsbFTMLInterface::usbWrite16");
586  }
587 
588  if (0==bytecount){
589  error(" O Byte written on USB interface "+name()+".","UsbFTMLInterface::usbWrite16");
590  return StatusCode::FAILURE;
591  }
592 
593  if (nData!=bytecount){
594  error(itos(bytecount)+" byte(s) written on USB interface "+name()+
595  " out of "+itos(nData)+" bytes to be sent.","UsbFTMLInterface::usbWrite16");
596  return StatusCode::FAILURE;
597  }
598 
599  return StatusCode::SUCCESS;
600 }
601 
602 //=========================================================================
603 //
604 //=========================================================================
605 StatusCode UsbFTMLInterface::usbWriteU32 (unsigned long int address ,
606  unsigned long int nWords,
607  unsigned long *data ) {
608  USB_Error wrErr=USB_NoErr;
609  long int bytecount=0;
610 
611  long int nData=(long int)(4*nWords);
612 
613  int path = -1;
614  bytecount=UsbWrtML(m_usbId, &path, address, data, nData);
615 
616  if (bytecount<0){
617  wrErr=USB_GetLastError();
618  error("USB error number "+itos(wrErr)+" - USB_INT_FRAME="+itos(USB_INT_FRAME),
619  "UsbFTMLInterface::usbWrite32");
620  if (wrErr==USB_INT_FRAME){
621  PrintFrameInfo();
622  }
623  return StatusCode::FAILURE;
624  }
625 
626  if (nData==bytecount){
627  verbose(itos(bytecount)+" bytes written on USB Interface "+name(),
628  "UsbFTMLInterface::usbWrite32");
629  }
630 
631  if (0==bytecount){
632  error(" O Byte written on USB interface "+name()+".","UsbFTMLInterface::usbWrite32");
633  return StatusCode::FAILURE;
634  }
635 
636  if (nData!=bytecount){
637  error(itos(bytecount)+" byte(s) written on USB interface "+name()+
638  " out of "+itos(nData)+" bytes to be sent.","UsbFTMLInterface::usbWrite32");
639  return StatusCode::FAILURE;
640  }
641 
642  return StatusCode::SUCCESS;
643 }
644 
645 //=========================================================================
646 //
647 //=========================================================================
648 StatusCode UsbFTMLInterface::usbWriteRead ( unsigned long int address,
649  std::vector<U8> dataWrite,
650  std::vector<U8> &dataRead ) {
651  USB_Error rdErr=USB_NoErr, wrErr=USB_NoErr;
652  long int bytecount=0;
653  long int nData=dataWrite.size();
654  const unsigned long int bufSize=nData+4;
655  U8* bufWr=new U8[bufSize];
656  U8* bufRd=new U8[bufSize];
657 
658  for(int j=0; j<nData; ++j) bufWr[j] = static_cast<unsigned char>(dataWrite[j]);
659 
660  int path = -1;
661  bytecount=UsbWrtML(m_usbId, &path, address, bufWr, nData);
662 
663  if (bytecount<0){
664  wrErr=USB_GetLastError();
665  error("USB error number "+itos(wrErr)+" - USB_INT_FRAME="+itos(USB_INT_FRAME),
666  " UsbFTMLInterface::usbWriteRead");
667  if (wrErr==USB_INT_FRAME){
668  PrintFrameInfo();
669  }
670  return StatusCode::FAILURE;
671  }
672 
673  if (nData==bytecount){
674  verbose(itos(bytecount)+" bytes written on USB Interface "+name(),
675  "UsbFTMLInterface::usbWriteRead");
676 
677  int path = -1;
678  bytecount=UsbReadML(m_usbId, &path, address, bufRd, nData);
679 
680  if (nData==bytecount){
681  verbose(itos(bytecount)+" bytes read from USB Interface "+name(),
682  "UsbFTMLInterface::usbRead");
683  for(int j=0; j<nData; ++j) dataRead[j] = static_cast<unsigned char>(bufRd[j]);
684  return StatusCode::SUCCESS;
685  }
686 
687  if (bytecount<0){
688  rdErr=USB_GetLastError();
689  error("USB error number "+itos(rdErr)+" - USB_INT_FRAME="+itos(USB_INT_FRAME),
690  " UsbFTMLInterface::usbWriteRead");
691  if (rdErr==USB_INT_FRAME){
692  PrintFrameInfo();
693  }
694  return StatusCode::FAILURE;
695  }
696 
697  if (0==bytecount){
698  error(" O Byte read from USB interface "+name()+".","UsbFTMLInterface::usbRead");
699  return StatusCode::FAILURE;
700  }
701 
702  if (nData!=bytecount){
703  error(itos(bytecount)+" byte(s) read from USB interface "+name()+
704  " out of "+itos(nData)+" bytes expected.","UsbFTMLInterface::usbRead");
705  return StatusCode::FAILURE;
706  }
707  }
708 
709 
710  if (0==bytecount){
711  error(" O Byte written n USB interface "+name()+".","UsbFTMLInterface::usbWrite");
712  return StatusCode::FAILURE;
713  }
714 
715  if (nData!=bytecount){
716  error(itos(bytecount)+" byte(s) written USB interface "+name()+
717  " out of "+itos(nData)+" bytes to be sent.","UsbFTMLInterface::usbWrite");
718  return StatusCode::FAILURE;
719  }
720 
722 }
723 
724 //=========================================================================
725 //
726 //=========================================================================
728  if (m_usbId>0)
729  {
730  info("Close USB device "+name()+" [id="+itos(m_usbId)+"]","UsbFTMLInterface::close");
732  }
733  m_usbId=-1;
734 }
735 
736 //=========================================================================
737 //
738 //=========================================================================
740 
741  unsigned long int address = io->address();
742  unsigned long int nWords = io->length();
743 
744  StatusCode status;
745  switch (io->wordSize())
746  {
747  case (IOdata::Byte):
748  if (nWords<m_rdBlockMax+1){
749  verbose("Reading a single block "+itos(nWords)+"/"+itos(m_rdBlockMax),
750  "UsbFTMLInterface::read");
751  status = usbReadU8( address, nWords, io->dataU8());
752  }
753  else {
754  // int nwords=nWords;
755  U8* data=io->dataU8();
756  int nXfer=(int)(nWords/m_rdBlockMax)+1;
757  for (int i=0; i<nXfer ; ++i){
758  if (i<nXfer-1){
759  verbose("Reading block "+itos(i)+
760  " of size "+itos(m_rdBlockMax),
761  "UsbFTMLInterface::read");
762  status = usbReadU8( address,
763  m_rdBlockMax ,
764  data);
765  data+=sizeof(U8*)*m_rdBlockMax;
766  }
767  else {
768  verbose("Reading last block "+itos(i)+
769  " of size "+itos(nWords%m_rdBlockMax),
770  "UsbFTMLInterface::read");
771  status = usbReadU8( address,
772  nWords%m_rdBlockMax ,
773  data);
774  data+=sizeof(U8*)*(nWords%m_rdBlockMax);
775  }
776  }
777  }
778  break;
779  case (IOdata::Word):
780  status = usbReadU16( address, nWords, io->dataU16());
781  break;
782  case (IOdata::DWord):
783  status = usbReadU32( address, nWords, io->dataU32());
784  break;
785  default:
786  error("Wrong word size.","UsbFTMLInterface::read");
787  status=StatusCode::FAILURE;
788  }
789  return status;
790 }
791 
792 //=========================================================================
793 //
794 //=========================================================================
796 
797  unsigned long int address = io->address();
798  unsigned long int nWords = io->length();
799  StatusCode status;
800  switch (io->wordSize())
801  {
802  case (IOdata::Byte):
803  if (nWords<m_wrBlockMax+1){
804  verbose("Writing a single block "+itos(nWords)+"/"+itos(m_wrBlockMax),
805  "UsbFTMLInterface::write");
806  status = usbWriteU8(address, nWords, io->dataU8());
807  }
808  else {
809  // int nwords=nWords;
810  U8* data=io->dataU8();
811  int nXfer=(int)ceil((float)(nWords)/(float)(m_wrBlockMax));
812  verbose("number of Xfer="+itos(nXfer)+
813  " "+itos(m_wrBlockMax)+
814  " "+itos(nWords),"");
815  for (int i=0; i<nXfer ; ++i){
816  if (i<nXfer-1){
817  verbose("Writing block "+itos(i)+
818  " of size "+itos(m_wrBlockMax),
819  "UsbFTMLInterface::write");
820  status = usbWriteU8( address,
821  m_wrBlockMax ,
822  data);
823  data+=sizeof(U8)*m_wrBlockMax;
824  }
825  else {
826  //nWords%m_wrBlockMax
827  unsigned int nwords=nWords-(nXfer-1)*m_wrBlockMax;
828  verbose("Writing last block "+itos(i)+
829  " of size "+itos(nwords),
830  "UsbFTMLInterface::write");
831  status = usbWriteU8( address,
832  nwords,
833  data);
834  data+=sizeof(U8)*(nwords);
835  }
836  }
837  }
838  break;
839  case (IOdata::Word):
840  status = usbWriteU16(address, nWords, io->dataU16());
841  break;
842  case (IOdata::DWord):
843  status = usbWriteU32(address, nWords, io->dataU32());
844  break;
845  default:
846  error("Wrong word size.","UsbFTMLInterface::read");
847  status=StatusCode::FAILURE;
848  }
849  return status;
850 }
void info(std::string mymsg)
Definition: Object.h:38
std::string itos(int)
Definition: Tools.cpp:46
void verbose(std::string mymsg)
Definition: Object.h:36
StatusCode usbReadU8(unsigned long int, unsigned long int, unsigned char *)
#define USB_NoErr
Definition: LALUsbML.h:69
LALUSB_API BOOL _cstmcall USB_GetLatencyTimer(int id, PUCHAR msecs)
StatusCode usbWrite(unsigned long int, std::vector< U32 >)
unsigned long m_wordSize
LALUSB_API void _cstmcall USB_Perror(USB_Error err_code)
U32 address()
Definition: IOdata.h:59
LALUSB_API BOOL _cstmcall USB_SetLatencyTimer(int id, UCHAR msecs)
void setName(std::string name)
Definition: Object.h:51
StatusCode read(IOdata *)
StatusCode usbWriteU32(unsigned long int, unsigned long int, unsigned long *)
void fatal(std::string mymsg)
Definition: Object.h:41
U32 * dataU32()
Definition: IOdata.h:222
StatusCode write(IOdata *)
LALUSB_API BOOL _cstmcall USB_ResetDevice(int id)
LALUSB_API int _cstmcall OpenUsbDevice(char *sernumstr)
FT_STATUS USB_Error
Definition: LALUsbML.h:72
LALUSB_API FT_STATUS _cstmcall GetDeviceSerNum(char *buffer, int index)
Definition: ftd2xx.h:80
void setType(std::string type)
Definition: Object.h:52
LALUSB_API BOOL _cstmcall USB_ResetMode(int id)
void error(std::string mymsg)
Definition: Object.h:40
LALUSB_API void _cstmcall CloseUsbDevice(int id)
def data(object, stream=None)
Definition: shell.py:150
LALUSB_API BOOL _cstmcall USB_PurgeBuffers(int id)
unsigned char U8
LALUSB_API int _cstmcall UsbWrtML(int id, int *target_path_array, char sub_addr, void *buffer, int count)
U32 length()
Definition: IOdata.h:175
LALUSB_API int _cstmcall UsbReadML(int id, int *target_path_array, char sub_addr, void *buffer, int usercount)
unsigned char m_latencyTimer
Definition: IOdata.h:17
U16 * dataU16()
Definition: IOdata.h:218
virtual StatusCode init()
StatusCode usbReadU16(unsigned long int, unsigned long int, unsigned short *)
std::string m_deviceDesc
StatusCode usbWriteRead(unsigned long int, std::vector< U8 >, std::vector< U8 > &)
StatusCode usbWriteU8(unsigned long int, unsigned long int, unsigned char *)
U8 * dataU8()
Definition: IOdata.h:214
LALUSB_API BOOL _cstmcall USB_SetTimeouts(int id, int tx_timeout, int rx_timeout)
LALUSB_API BOOL _cstmcall USB_FindDevices(char *DeviceDescriptionStr)
StatusCode usbReadU32(unsigned long int, unsigned long int, unsigned long *)
LALUSB_API BOOL _cstmcall USB_Init(int id, BOOL verbose)
std::string name() const
Definition: Object.h:28
LALUSB_API FT_STATUS _cstmcall GetDeviceDesc(char *buffer, int index)
LALUSB_API BOOL _cstmcall USB_SetSynchronousMode(int id, int sleep_time)
StatusCode usbWriteU16(unsigned long int, unsigned long int, unsigned short *)
StatusCode usbRead(unsigned long int, unsigned long int, std::vector< U32 > &)
LALUSB_API void _cstmcall UsbSetIntCheckingState(BOOL truefalse)
IOdata::WordSize wordSize()
Definition: IOdata.h:133
void wait(int nbr_ms)
Definition: Tools.cpp:271
std::string m_serialNum
LALUSB_API BOOL _cstmcall USB_SetXferSize(int id, unsigned long txsize, unsigned long rxsize)
def obj()
Definition: shell.py:26
LALUSB_API USB_Error _cstmcall USB_GetLastError(void)
std::string path(std::string=std::string(""))
Definition: Hierarchy.cpp:344
LALUSB_API void _cstmcall PrintFrameInfo(void)