diff --git a/src/examples/test_ftdi.cpp b/src/examples/test_ftdi.cpp index ad031e3fa1cdee98a8c28ecea2ed7b00ea851154..c3e26de0d9eb0cc1ed9e247a9e692b3b99feed6f 100644 --- a/src/examples/test_ftdi.cpp +++ b/src/examples/test_ftdi.cpp @@ -2,6 +2,7 @@ #include "ftdiserver.h" #include "ftdiexceptions.h" #include <stdio.h> +#include <stdlib.h> /** \example test_ftdi.cpp * @@ -49,6 +50,7 @@ int main(int argc, char *argv[]) CFTDIServer *ftdi_server=CFTDIServer::instance(); CFTDI *ftdi_device=NULL; TFTDIconfig ftdi_config; + int count=15; ftdi_config.baud_rate = 115200; ftdi_config.word_length = 8; @@ -58,16 +60,33 @@ int main(int argc, char *argv[]) ftdi_config.write_timeout = 1000; ftdi_config.latency_timer = 16; + try{ std::cout << (*ftdi_server) << std::endl; if(ftdi_server->get_num_devices()>0) { - ftdi_device=ftdi_server->get_device(ftdi_server->get_serial_number(0)); - ftdi_device->config(&ftdi_config); - std::cout << (*ftdi_device) << std::endl; - ftdi_device->close(); + while(ftdi_device==NULL && count>0) + { + try{ + ftdi_device=ftdi_server->get_device(ftdi_server->get_serial_number(atoi(argv[1]))); + }catch(CException &e){ + std::cout << e.what() << std::endl; + count--; + } + } + if(count==0) + std::cout << "Device not available" << std::endl; + else + { + ftdi_device->config(&ftdi_config); + std::cout << (*ftdi_device) << std::endl; + ftdi_device->close(); + } } if(ftdi_device!=NULL) delete ftdi_device; + }catch(CException &e){ + std::cout << e.what() << std::endl; + } } diff --git a/src/usb_ftdi/ftdiserver.cpp b/src/usb_ftdi/ftdiserver.cpp index bb1e65d0cca813cd6f70969b0edb9178edb02fed..c3b54a42cd1421e21b7feee6b7d7cbf9d97ea408 100644 --- a/src/usb_ftdi/ftdiserver.cpp +++ b/src/usb_ftdi/ftdiserver.cpp @@ -1,12 +1,18 @@ #include "ftdiexceptions.h" #include "ftdiserver.h" #include "ftd2xx.h" +#include <stdlib.h> CFTDIServer *CFTDIServer::pinstance=NULL; CFTDIServer::CFTDIServer() { + struct timeval time; + this->scan_bus(); + // initialize the random number generator + gettimeofday(&time,NULL); + srand(time.tv_usec); } CFTDIServer::CFTDIServer(const CFTDIServer& object) @@ -196,11 +202,13 @@ std::string& CFTDIServer::get_description(unsigned int index) CFTDI *CFTDIServer::get_device(std::string& serial_desc) { std::string dev_name; - CFTDI *ftdi_device; + CFTDI *ftdi_device=NULL; unsigned int i=0; if(serial_desc.size()==0) { + usleep(((double)rand()/RAND_MAX)*100000); + this->scan_bus(); /* handle exceptions */ throw CFTDIServerException(_HERE_,"Invalid serial number or description - empty string.\n"); } @@ -210,15 +218,27 @@ CFTDI *CFTDIServer::get_device(std::string& serial_desc) { if(this->devices[i].serial_number==serial_desc || this->devices[i].description==serial_desc) { - dev_name="FTDI_"; - dev_name+=serial_desc; - ftdi_device=new CFTDI(dev_name); - ftdi_device->open((void *)&serial_desc); + try{ + dev_name="FTDI_"; + dev_name+=serial_desc; + ftdi_device=new CFTDI(dev_name); + ftdi_device->open((void *)&serial_desc); + }catch(CException &e){ + if(ftdi_device!=NULL) + { + delete ftdi_device; + ftdi_device=NULL; + } + usleep(((double)rand()/RAND_MAX)*100000); + this->scan_bus(); + throw; + } return ftdi_device; } } } - + usleep(((double)rand()/RAND_MAX)*100000); + this->scan_bus(); return NULL; }