Test version of BlueUSB stack. Includes SDP and RFCOMM. As Client it allows to connect to my fischertechnik TX Controller. As Server it echo\\\\\\\'s characters to Putty. PIN=1234

Dependencies:   mbed myUSBHost AvailableMemory

Dependents:   mbed_TANK_Kinect myBlueUSB_ros ftusbClass

Revision:
13:327622e38551
Parent:
6:567607a9a79f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ftclasslibusbdevbt.cpp	Fri Jul 01 09:16:00 2011 +0000
@@ -0,0 +1,134 @@
+#include "mbed.h"
+#include <vector>
+#include "Utils.h"
+#include "hci.h"
+#include "ftclasslibusbdevbt.h"
+
+//extern HCI* gHCI;
+class application;
+extern application App;
+
+void printf(const BD_ADDR* addr);
+
+void ftdev::receive(int socket, SocketState state, const u8* data, int len) {
+    printf("ftdev::receive was called: socket %d, state=%d, length=%d\n", socket, state, len);
+//    unsigned char req[] = "\xdget_ser_num\xd";
+    unsigned char req[] = {0xbe, 0xef, 6, 0xfc, 0,0,0,0,0, 0xaf};
+    if (len==0) {
+        switch (state) {
+            case SocketState_Opening:
+                break;
+            case SocketState_Open:
+                printf("sending request \n%s\n", req);
+                Socket_Send(sock, req, sizeof(req));
+                break;
+            case SocketState_Closing:
+            case SocketState_Closed:
+                return;
+        }
+    } else {
+        //printHex(data, len);
+        parse(data, len);
+        if (state==SocketState_Open)
+            ;//Socket_Close(sock);//replace with ft primitive
+    }
+}
+
+unsigned short ftdev::chksum() {
+    unsigned short sum = (X1_len & 0xFF) + (X1_len >> 8);
+    for (int i = 0; i < X1_len; i++)
+        sum += X1_pkt[i];
+    return -sum;
+}
+
+void ftdev::parse (const unsigned char *buf, unsigned len) {
+    unsigned i = 0;
+    while (i < len) {
+        char c = buf[i++];
+        switch (parseState) {
+            case 0: //ascii state
+                if (c==2)
+                    parseState = 1;
+                else
+                    putc(c, stdout);
+                break;
+            case 1:
+                if (c==0x55)
+                    parseState = 2;
+                else {
+                    parseState = 0;
+                    printf("expected 0x55 in X1 header, found %02X\n", c);
+                }
+                break;
+            case 2:
+                X1_len = c<<8;
+                parseState= 3;
+                break;
+            case 3:
+                X1_len += c;
+                parseState= 4;
+                X1_pkt = new unsigned char[X1_len];
+                X1_pos = 0;
+                break;
+            case 4:
+                if  (X1_pos < X1_len) X1_pkt[X1_pos++] = c;
+                else parseState = 5;
+                break;
+            case 5:
+                X1_crc = c<<8;
+                parseState= 6;
+                break;
+            case 6:
+                X1_crc += c;
+                parseState= 7;
+                break;
+            case 7:
+                if (c == 3 && X1_crc == chksum()) {
+                   //handlePkt();
+                   printHex(X1_pkt, X1_len);
+                }else
+                    printf("framing or checksum error, end char = %02X\n", c);
+                
+                parseState = 0;
+                break;
+        }
+    }
+}
+
+vector<ftbtdev*> ft_devs;
+ftdev  _ftdev; //single instance, just for test
+
+int GetNrOfFtBtDevices() {
+    return ft_devs.size();
+}
+
+unsigned InitFtBtDeviceList() {//assume inquiry has been done
+    static char FtDevClass[3] = {0x00, 0x1F, 0x82 };
+    BTDevice* devs[8];
+    int count = ((HCI*)&App)->GetDevices(devs,8);
+    int n = 0;
+    for (int i = 0; i < count; i++) {
+        if (memcmp(devs[i]->_info.dev_class, FtDevClass, 3)==0) {
+            ft_devs.push_back(new ftbtdev(&devs[i]->_info));
+            printf("%d: %s\n", n++, devs[i]->_name);
+        }
+//        printf("device %d (handle=%d) ", i, devs[i]->_handle);
+//        printfBytes("devclass: ", devs[i]->_info.dev_class, 3);
+    }
+    return n;
+}
+
+ftbtdev* GetFtUsbDeviceHandle(unsigned  Num) {
+    if (Num < ft_devs.size()) {
+        return ft_devs[Num];
+    }
+    return 0;
+}
+
+unsigned OpenFtBtDevice(ftbtdev* d) {
+    BD_ADDR* bd = d->BtAddr();
+    printf("Connecting to ");
+    printf(bd);
+    printf("\n");
+    return _ftdev.Open(bd, 1); //TODO: everything can go wrong here
+}