USB Host WAN Dongle library

Fork of USBHostWANDongle_bleedingedge by Donatien Garnier

Revision:
3:4394986752db
Parent:
2:a8b2d0cd9bbd
Child:
4:d229ebfb85c4
--- a/USB3GModule/WANDongle.cpp	Tue Jun 26 13:43:54 2012 +0000
+++ b/USB3GModule/WANDongle.cpp	Fri Jul 06 08:53:17 2012 +0000
@@ -28,7 +28,7 @@
 #include "WANDongle.h"
 #include "WANDongleInitializer.h"
 
-WANDongle::WANDongle() : cb_tx_en(false), cb_rx_en(false), listener(NULL), m_serialCount(0)
+WANDongle::WANDongle() : m_serialCount(0)
 {
     host = USBHost::getHostInst();
     init();
@@ -63,27 +63,45 @@
           DBG("Enumerate");
           host->enumerate(dev);
           
-          WANDongleInitializer* initializer = getInitializers();
+          DBG("Device has VID:%04x PID%04x", dev->getVid(), dev->getPid());
           
-          while(initializer++)
+          WANDongleInitializer** initializer = WANDongleInitializer::getInitializers(host);
+          
+          while((*initializer))
           {
-            if ((dev->getVid() == initializer->getSerialVid()) && (dev->getPid() == initializer->getSerialPid()))
+            DBG("*initializer=%p", *initializer);
+            DBG("(*initializer)->getSerialVid()=%04x", (*initializer)->getSerialVid());
+            DBG("(*initializer)->getSerialPid()=%04x", (*initializer)->getSerialPid());
+            if ((dev->getVid() == (*initializer)->getSerialVid()) && (dev->getPid() == (*initializer)->getSerialPid()))
             {
+              DBG("The dongle is in virtual serial mode");
               host->registerDriver(dev, 0, this, &WANDongle::init);
-              m_serialCount = initializer->getSerialPortCount();
+              m_serialCount = (*initializer)->getSerialPortCount();
+              if( m_serialCount > WANDONGLE_MAX_SERIAL_PORTS )
+              {
+                m_serialCount = WANDONGLE_MAX_SERIAL_PORTS;
+              }
               for(int j = 0; j < m_serialCount; j++)
               {
-                m_serial[j].connect( initializer->getEp(dev, j, false), initializer->getEp(dev, j, true) );
+                DBG("Connecting serial port #%d", j+1);
+                DBG("Ep %p", (*initializer)->getEp(dev, j, false));
+                DBG("Ep %p", (*initializer)->getEp(dev, j, true));
+                m_serial[j].connect( dev, (*initializer)->getEp(dev, j, false), (*initializer)->getEp(dev, j, true) );
               }
+              
+              DBG("Device connected");
+              
               dev_connected = true;
               host->unlock();
+              
+              
               return true;
             }
-            else if ((dev->getVid() == initializer->getMSDVid()) && (dev->getPid() == initializer->getMSDPid()))
+            else if ((dev->getVid() == (*initializer)->getMSDVid()) && (dev->getPid() == (*initializer)->getMSDPid()))
             {
               DBG("Vodafone K3370 dongle detected in MSD mode");
               //Try to switch   
-              if( initializer->switchMode() )
+              if( (*initializer)->switchMode(dev) )
               {
                 DBG("Switched OK");
                 host->unlock();
@@ -96,6 +114,7 @@
                 return false;
               }
             }
+            (*initializer)++;
           } //while()
       } //if()
   } //for()
@@ -103,7 +122,7 @@
   return false;
 }
 
-IUSBHostSerial* WANDongle::getSerial(int index)
+IUSBHostSerial& WANDongle::getSerial(int index)
 {
   return m_serial[index];
 }
@@ -117,5 +136,8 @@
 void WANDongle::init()
 {
   dev_connected = false;
+  for(int i = 0; i < WANDONGLE_MAX_SERIAL_PORTS; i++)
+  {
+    m_serial[i].init(host);
+  }
 }
-