testing n-Bed with a Logitech C270 camera

Dependencies:   USBHost mbed

Fork of USBHostC270_example by Norimasa Okamoto

Revision:
11:6a8eef89eb22
Parent:
10:387c49b2fc7e
Child:
12:ea4badc78215
--- a/USBHostC270/BaseUvc.cpp	Sun Mar 17 13:22:13 2013 +0000
+++ b/USBHostC270/BaseUvc.cpp	Mon Mar 18 12:34:47 2013 +0000
@@ -102,12 +102,13 @@
     }
 }
 
-IsochronousEp::IsochronousEp(int addr, uint8_t ep, uint16_t size):BaseEp(addr, ep, size)
+void IsochronousEp::init(int addr, uint8_t ep, uint16_t size)
 {
-    ISO_DBG("%p FA:%d EP:%02X MPS:%d\n", this, addr, ep, size);
+    //ISO_DBG("%p FA:%d EP:%02X MPS:%d\n", this, addr, ep, size);
+    BaseEp::init(addr, ep, size);
     TEST_ASSERT(m_pED);
     
-    m_pED->Control |= (1 << 15); // F Format ITD
+    m_pED->setFormat(); // F Format ITD
 
     TEST_ASSERT(size >= 128 && size <= 1023);
     m_PacketSize = size;
@@ -116,8 +117,7 @@
     m_itd_queue_count = 0;
     reset();
     HCITD* itd = new_HCITD(this);
-    m_pED->TailTd = reinterpret_cast<HCTD*>(itd);
-    m_pED->HeadTd = reinterpret_cast<HCTD*>(itd); 
+    m_pED->init_queue<HCITD>(itd); 
     TEST_ASSERT(itd);
     if (itd == NULL) {
         return;
@@ -149,20 +149,15 @@
 {
     TEST_ASSERT(m_itd_queue_count >= 0);
     while(m_itd_queue_count < 3 && m_itd_queue_count < HCTD_QUEUE_SIZE) {
-        HCITD* itd = reinterpret_cast<HCITD*>(m_pED->TailTd);
-        TEST_ASSERT(itd);
-        if (itd == NULL) {
-            return NULL;
+        TEST_ASSERT(m_pED);
+        if (m_pED->Skip()) {
+            break;
         }
         HCITD* blank_itd = new_HCITD(this);
         TEST_ASSERT(blank_itd);
-        if (blank_itd == NULL) {
-            return NULL;
+        if (m_pED->enqueue<HCITD>(blank_itd)) {
+            m_itd_queue_count++;
         }
-        itd->Next = blank_itd;
-        m_pED->TailTd = reinterpret_cast<HCTD*>(blank_itd);
-        m_itd_queue_count++;
-        //DBG_IED(m_pED);
         enable(); // Enable Periodic
     }
     
@@ -202,47 +197,53 @@
 void IsochronousEp::disconnect()
 {
     m_pED->setSkip();
-    ISO_DBG("m_itd_queue_count: %d", m_itd_queue_count);
+    Thread::wait(50);
+    ISO_DBG("rtos-queue: %d", m_itd_queue_count);
+    int queue_count = m_itd_queue_count;
     Timer t;
     t.reset();
     t.start();
-    while(m_itd_queue_count > 0 && t.read_ms() <= (8*3)) {
-        HCITD* itd = get_queue_HCITD(0);
+    while(queue_count > 0 && t.read_ms() < 50) {
+        HCITD* itd = get_queue_HCITD(10);
         if (itd) {
-            ISO_DBG("ITD: %p", itd);
+            ISO_DBG("delete ITD:%p from rtos-queue %d ms", itd, t.read_ms());
             delete itd;
-            m_itd_queue_count--;
+            queue_count--;
             t.reset();
         }
     }
-    ISO_DBG("m_itd_queue_count: %d, t_ms: %d", m_itd_queue_count, t.read_ms());
-    HCITD* head = reinterpret_cast<HCITD*>(reinterpret_cast<uint32_t>(m_pED->HeadTd)&~3); // delete Halted and Toggle Carry bit
-    TEST_ASSERT(head);
+    ISO_DBG("rtos-queue: %d, %d ms", queue_count, t.read_ms());
+    while(1) {
+        HCITD* itd = m_pED->dequeue<HCITD>();
+        if (itd == NULL) {
+            break;
+        }
+        ISO_DBG("delete ITD:%p from ED(%p)-queue", itd, m_pED);        
+        delete itd;
+        TEST_ASSERT(queue_count > 0);
+        queue_count--;
+    }            
+    TEST_ASSERT(queue_count == 0);
     HCITD* tail = reinterpret_cast<HCITD*>(m_pED->TailTd);
+    ISO_DBG("delete ITD:%p from ED(%p)-tail", tail, m_pED);
     TEST_ASSERT(tail);
-    while(head != tail) {
-        HCITD* next = head->Next;
-        TEST_ASSERT(next);
-        ISO_DBG("ED ITD:%p next:%p", head, next);        
-        delete head;
-        TEST_ASSERT(m_itd_queue_count > 0);
-        m_itd_queue_count--;
-        head = next;
-    }
-    TEST_ASSERT(m_itd_queue_count == 0);
-    delete head;
+    delete tail;
+    m_pED->init_queue<HCITD>(NULL);
     
     _HCCA* hcca = reinterpret_cast<_HCCA*>(LPC_USB->HcHCCA);
     TEST_ASSERT(hcca);
     hcca->dequeue(m_pED);
+    ISO_DBG("delete ED:%p", m_pED);
     delete m_pED;
+    m_pED = NULL;
 }
 
-BaseEp::BaseEp(int addr, uint8_t ep, uint16_t size, int lowSpeed):m_td_queue_count(0)
+void BaseEp::init(int addr, uint8_t ep, uint16_t size, int lowSpeed)
 {
     ISO_DBG("%p FA=%d EN=%02x MPS=%d S=%d\n", this, addr, ep, size, lowSpeed);
     TEST_ASSERT(size >= 8 && size <= 1023);    
     TEST_ASSERT(lowSpeed == 0 || lowSpeed == 1);
     m_pED  = new _HCED(addr, ep, size, lowSpeed);
     TEST_ASSERT(m_pED);
+    m_td_queue_count = 0;
 }