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
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 }
Generated on Tue Jul 12 2022 18:48:53 by 1.7.2