local fix version of myBlueUSB (http://mbed.org/users/networker/code/myBlueUSB/). - merge deleted files which are required to compile. - enable echo back of received data via RFCOMM.

Dependencies:   AvailableMemory FatFileSystem mbed myUSBHost

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers ftclasslibusbdevbt.cpp Source File

ftclasslibusbdevbt.cpp

00001 #include "mbed.h"
00002 #include <vector>
00003 #include "Utils.h"
00004 #include "hci.h"
00005 #include "ftclasslibusbdevbt.h"
00006 
00007 //extern HCI* gHCI;
00008 class application;
00009 extern application App;
00010 
00011 void printf(const BD_ADDR* addr);
00012 
00013 void ftdev::receive(int socket, SocketState state, const u8* data, int len) {
00014     printf("ftdev::receive was called: socket %d, state=%d, length=%d\n", socket, state, len);
00015 //    unsigned char req[] = "\xdget_ser_num\xd";
00016     unsigned char req[] = {0xbe, 0xef, 6, 0xfc, 0,0,0,0,0, 0xaf};
00017     if (len==0) {
00018         switch (state) {
00019             case SocketState_Opening:
00020                 break;
00021             case SocketState_Open:
00022                 printf("sending request \n%s\n", req);
00023                 Socket_Send(sock, req, sizeof(req));
00024                 break;
00025             case SocketState_Closing:
00026             case SocketState_Closed:
00027                 return;
00028         }
00029     } else {
00030         //printHex(data, len);
00031         parse(data, len);
00032         if (state==SocketState_Open)
00033             ;//Socket_Close(sock);//replace with ft primitive
00034     }
00035 }
00036 
00037 unsigned short ftdev::chksum() {
00038     unsigned short sum = (X1_len & 0xFF) + (X1_len >> 8);
00039     for (int i = 0; i < X1_len; i++)
00040         sum += X1_pkt[i];
00041     return -sum;
00042 }
00043 
00044 void ftdev::parse (const unsigned char *buf, unsigned len) {
00045     unsigned i = 0;
00046     while (i < len) {
00047         char c = buf[i++];
00048         switch (parseState) {
00049             case 0: //ascii state
00050                 if (c==2)
00051                     parseState = 1;
00052                 else
00053                     putc(c, stdout);
00054                 break;
00055             case 1:
00056                 if (c==0x55)
00057                     parseState = 2;
00058                 else {
00059                     parseState = 0;
00060                     printf("expected 0x55 in X1 header, found %02X\n", c);
00061                 }
00062                 break;
00063             case 2:
00064                 X1_len = c<<8;
00065                 parseState= 3;
00066                 break;
00067             case 3:
00068                 X1_len += c;
00069                 parseState= 4;
00070                 X1_pkt = new unsigned char[X1_len];
00071                 X1_pos = 0;
00072                 break;
00073             case 4:
00074                 if  (X1_pos < X1_len) X1_pkt[X1_pos++] = c;
00075                 else parseState = 5;
00076                 break;
00077             case 5:
00078                 X1_crc = c<<8;
00079                 parseState= 6;
00080                 break;
00081             case 6:
00082                 X1_crc += c;
00083                 parseState= 7;
00084                 break;
00085             case 7:
00086                 if (c == 3 && X1_crc == chksum()) {
00087                    //handlePkt();
00088                    printHex(X1_pkt, X1_len);
00089                 }else
00090                     printf("framing or checksum error, end char = %02X\n", c);
00091                 
00092                 parseState = 0;
00093                 break;
00094         }
00095     }
00096 }
00097 
00098 vector<ftbtdev*> ft_devs;
00099 ftdev  _ftdev; //single instance, just for test
00100 
00101 int GetNrOfFtBtDevices() {
00102     return ft_devs.size();
00103 }
00104 
00105 unsigned InitFtBtDeviceList() {//assume inquiry has been done
00106     static char FtDevClass[3] = {0x00, 0x1F, 0x82 };
00107     BTDevice* devs[8];
00108     int count = ((HCI*)&App)->GetDevices(devs,8);
00109     int n = 0;
00110     for (int i = 0; i < count; i++) {
00111         if (memcmp(devs[i]->_info.dev_class, FtDevClass, 3)==0) {
00112             ft_devs.push_back(new ftbtdev(&devs[i]->_info));
00113             printf("%d: %s\n", n++, devs[i]->_name);
00114         }
00115 //        printf("device %d (handle=%d) ", i, devs[i]->_handle);
00116 //        printfBytes("devclass: ", devs[i]->_info.dev_class, 3);
00117     }
00118     return n;
00119 }
00120 
00121 ftbtdev* GetFtUsbDeviceHandle(unsigned  Num) {
00122     if (Num < ft_devs.size()) {
00123         return ft_devs[Num];
00124     }
00125     return 0;
00126 }
00127 
00128 unsigned OpenFtBtDevice(ftbtdev* d) {
00129     BD_ADDR* bd = d->BtAddr();
00130     printf("Connecting to ");
00131     printf(bd);
00132     printf("\n");
00133     return _ftdev.Open(bd, 1); //TODO: everything can go wrong here
00134 }