BTstack Bluetooth stack

Dependencies:   mbed USBHost

USBホストライブラリを変更しました。

  • Bluetoothマウス(VGP-BMS33)での動作を確認しました。mouse_demo.cpp
Revision:
2:871b41f4789e
Parent:
1:b657594559be
--- a/USBHostBTstack/USBHostBTstack.cpp	Thu Mar 21 13:53:05 2013 +0000
+++ b/USBHostBTstack/USBHostBTstack.cpp	Fri Mar 22 22:35:57 2013 +0000
@@ -1,12 +1,15 @@
+// USBHostBTstack.cpp
 #include "USBHostBTstack.h"
 #include "dbg.h"
 
-#define BTSTACK_DEBUG 1
+//#define BTSTACK_DEBUG
 
 #ifdef BTSTACK_DEBUG
 #define BT_DBG(x, ...) std::printf("[%s:%d]"x"\r\n", __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
+#define BT_DBG_BYTES(STR,BUF,LEN) _debug_bytes(__PRETTY_FUNCTION__,__LINE__,STR,BUF,LEN)
 #else
 #define BT_DBG(...)  while(0);
+#define BT_DBG_BYTES(S,BUF,LEN) while(0);
 #endif
 
 #define HCI_COMMAND_DATA_PACKET 0x01
@@ -81,30 +84,28 @@
     return false;
 }
 
-void USBHostBTstack::int_rxHandler() {
-    int len_listen = int_in->getSize();
+void USBHostBTstack::int_rxHandler()
+{
     int len = int_in->getLengthTransferred();
-    
-    BT_DBG("len_listen: %d, len: %d", len_listen, len);
-    if (m_pCb) {
-        m_pCb(HCI_EVENT_PACKET, int_report, len);
-    }
-    if (dev) {
-        host->interruptRead(dev, int_in, int_report, len_listen, false);
-    }
+    BT_DBG_BYTES("HCI_EVT:", int_report, len);
+    Packet* pkt = mail_box.alloc();
+    TEST_ASSERT(pkt);
+    pkt->type = HCI_EVENT_PACKET;
+    pkt->buf = int_report;
+    pkt->len = len;
+    mail_box.put(pkt);
 }
 
-void USBHostBTstack::bulk_rxHandler() {
-    int len_listen = bulk_in->getSize();
+void USBHostBTstack::bulk_rxHandler()
+{
     int len = bulk_in->getLengthTransferred();
-    
-    BT_DBG("len_listen: %d, len: %d", len_listen, len);
-    if (m_pCb) {
-        m_pCb(HCI_ACL_DATA_PACKET, bulk_report, len);
-    }
-    if (dev) {
-        host->bulkRead(dev, bulk_in, bulk_report, len_listen, false);
-    }
+    BT_DBG_BYTES("ACL_RCV:", bulk_report, len);
+    Packet* pkt = mail_box.alloc();
+    TEST_ASSERT(pkt);
+    pkt->type = HCI_ACL_DATA_PACKET;
+    pkt->buf = bulk_report;
+    pkt->len = len;
+    mail_box.put(pkt);
 }
 
 /*virtual*/ void USBHostBTstack::setVidPid(uint16_t vid, uint16_t pid)
@@ -117,7 +118,6 @@
     BT_DBG("intf_nb=%d,intf_class=%02X,intf_subclass=%d,intf_protocol=%d", intf_nb, intf_class, intf_subclass, intf_protocol);
     if ((btstack_intf == -1) && intf_class == 0xe0) {
         btstack_intf = intf_nb;
-        btstack_device_found = true;
         return true;
     }
     return false;
@@ -158,22 +158,22 @@
 
 int USBHostBTstack::send_packet(uint8_t packet_type, uint8_t* packet, int size)
 {
-    BT_DBG("packet_type: %d, packet: %p, size: %d", packet_type, packet, size);
     USB_TYPE res;
     switch(packet_type){
         case HCI_COMMAND_DATA_PACKET:
+            BT_DBG_BYTES("HCI_CMD:", packet, size);
             res = host->controlWrite(dev,
                     USB_HOST_TO_DEVICE | USB_REQUEST_TYPE_CLASS | USB_RECIPIENT_DEVICE, 
                     0, 0, 0, packet, size);
             TEST_ASSERT(res == USB_TYPE_OK);
             break;
         case HCI_ACL_DATA_PACKET:
+            BT_DBG_BYTES("ACL_SND:", packet, size);
             res = host->bulkWrite(dev, bulk_out, packet, size);
             TEST_ASSERT(res == USB_TYPE_OK);
             break;
         default:
             TEST_ASSERT(0);
-            return -1;
     }
     return 0;
 }
@@ -184,3 +184,32 @@
     m_pCb = pMethod;
 }
 
+void USBHostBTstack::poll()
+{
+    osEvent evt = mail_box.get(0); // non-blocking
+    if (evt.status == osEventMail) {
+        Packet* pkt = reinterpret_cast<Packet*>(evt.value.p);
+        TEST_ASSERT(pkt);
+        //BT_DBG("type: %d, buf: %p, len: %d", pkt->type, pkt->buf, pkt->len);
+        if (m_pCb) {
+            m_pCb(pkt->type, pkt->buf, pkt->len);
+        }
+        if (dev) {
+            if (pkt->type == HCI_EVENT_PACKET) { 
+                host->interruptRead(dev, int_in, int_report, int_in->getSize(), false);
+            } else { // HCI_ACL_DATA_PACKET
+                host->bulkRead(dev, bulk_in, bulk_report, bulk_in->getSize(), false);
+            }
+        }
+        mail_box.free(pkt);
+    }
+}
+
+void _debug_bytes(const char* pretty, int line, const char* s, uint8_t* buf, int len)
+{
+    printf("[%s:%d]\n%s", pretty, line, s);
+    for(int i = 0; i < len; i++) {
+        printf(" %02x", buf[i]);
+    }
+    printf("\n");
+}