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