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

Committer:
networker
Date:
Sat Jun 11 19:45:42 2011 +0000
Revision:
6:567607a9a79f
new release because of some changes to the libraries.
Also added functions to spoof the mac address on csr dongles

Who changed what in which revision?

UserRevisionLine numberNew contents of line
networker 6:567607a9a79f 1 #include "mbed.h"
networker 6:567607a9a79f 2 #include <vector>
networker 6:567607a9a79f 3 #include "Utils.h"
networker 6:567607a9a79f 4 #include "hci.h"
networker 6:567607a9a79f 5 #include "ftclasslibusbdevbt.h"
networker 6:567607a9a79f 6
networker 6:567607a9a79f 7 //extern HCI* gHCI;
networker 6:567607a9a79f 8 class application;
networker 6:567607a9a79f 9 extern application App;
networker 6:567607a9a79f 10
networker 6:567607a9a79f 11 void printf(const BD_ADDR* addr);
networker 6:567607a9a79f 12
networker 6:567607a9a79f 13 void ftdev::receive(int socket, SocketState state, const u8* data, int len) {
networker 6:567607a9a79f 14 printf("ftdev::receive was called: socket %d, state=%d, length=%d\n", socket, state, len);
networker 6:567607a9a79f 15 // unsigned char req[] = "\xdget_ser_num\xd";
networker 6:567607a9a79f 16 unsigned char req[] = {0xbe, 0xef, 6, 0xfc, 0,0,0,0,0, 0xaf};
networker 6:567607a9a79f 17 if (len==0) {
networker 6:567607a9a79f 18 switch (state) {
networker 6:567607a9a79f 19 case SocketState_Opening:
networker 6:567607a9a79f 20 break;
networker 6:567607a9a79f 21 case SocketState_Open:
networker 6:567607a9a79f 22 printf("sending request \n%s\n", req);
networker 6:567607a9a79f 23 Socket_Send(sock, req, sizeof(req));
networker 6:567607a9a79f 24 break;
networker 6:567607a9a79f 25 case SocketState_Closing:
networker 6:567607a9a79f 26 case SocketState_Closed:
networker 6:567607a9a79f 27 return;
networker 6:567607a9a79f 28 }
networker 6:567607a9a79f 29 } else {
networker 6:567607a9a79f 30 //printHex(data, len);
networker 6:567607a9a79f 31 parse(data, len);
networker 6:567607a9a79f 32 if (state==SocketState_Open)
networker 6:567607a9a79f 33 ;//Socket_Close(sock);//replace with ft primitive
networker 6:567607a9a79f 34 }
networker 6:567607a9a79f 35 }
networker 6:567607a9a79f 36
networker 6:567607a9a79f 37 unsigned short ftdev::chksum() {
networker 6:567607a9a79f 38 unsigned short sum = (X1_len & 0xFF) + (X1_len >> 8);
networker 6:567607a9a79f 39 for (int i = 0; i < X1_len; i++)
networker 6:567607a9a79f 40 sum += X1_pkt[i];
networker 6:567607a9a79f 41 return -sum;
networker 6:567607a9a79f 42 }
networker 6:567607a9a79f 43
networker 6:567607a9a79f 44 void ftdev::parse (const unsigned char *buf, unsigned len) {
networker 6:567607a9a79f 45 unsigned i = 0;
networker 6:567607a9a79f 46 while (i < len) {
networker 6:567607a9a79f 47 char c = buf[i++];
networker 6:567607a9a79f 48 switch (parseState) {
networker 6:567607a9a79f 49 case 0: //ascii state
networker 6:567607a9a79f 50 if (c==2)
networker 6:567607a9a79f 51 parseState = 1;
networker 6:567607a9a79f 52 else
networker 6:567607a9a79f 53 putc(c, stdout);
networker 6:567607a9a79f 54 break;
networker 6:567607a9a79f 55 case 1:
networker 6:567607a9a79f 56 if (c==0x55)
networker 6:567607a9a79f 57 parseState = 2;
networker 6:567607a9a79f 58 else {
networker 6:567607a9a79f 59 parseState = 0;
networker 6:567607a9a79f 60 printf("expected 0x55 in X1 header, found %02X\n", c);
networker 6:567607a9a79f 61 }
networker 6:567607a9a79f 62 break;
networker 6:567607a9a79f 63 case 2:
networker 6:567607a9a79f 64 X1_len = c<<8;
networker 6:567607a9a79f 65 parseState= 3;
networker 6:567607a9a79f 66 break;
networker 6:567607a9a79f 67 case 3:
networker 6:567607a9a79f 68 X1_len += c;
networker 6:567607a9a79f 69 parseState= 4;
networker 6:567607a9a79f 70 X1_pkt = new unsigned char[X1_len];
networker 6:567607a9a79f 71 X1_pos = 0;
networker 6:567607a9a79f 72 break;
networker 6:567607a9a79f 73 case 4:
networker 6:567607a9a79f 74 if (X1_pos < X1_len) X1_pkt[X1_pos++] = c;
networker 6:567607a9a79f 75 else parseState = 5;
networker 6:567607a9a79f 76 break;
networker 6:567607a9a79f 77 case 5:
networker 6:567607a9a79f 78 X1_crc = c<<8;
networker 6:567607a9a79f 79 parseState= 6;
networker 6:567607a9a79f 80 break;
networker 6:567607a9a79f 81 case 6:
networker 6:567607a9a79f 82 X1_crc += c;
networker 6:567607a9a79f 83 parseState= 7;
networker 6:567607a9a79f 84 break;
networker 6:567607a9a79f 85 case 7:
networker 6:567607a9a79f 86 if (c == 3 && X1_crc == chksum()) {
networker 6:567607a9a79f 87 //handlePkt();
networker 6:567607a9a79f 88 printHex(X1_pkt, X1_len);
networker 6:567607a9a79f 89 }else
networker 6:567607a9a79f 90 printf("framing or checksum error, end char = %02X\n", c);
networker 6:567607a9a79f 91
networker 6:567607a9a79f 92 parseState = 0;
networker 6:567607a9a79f 93 break;
networker 6:567607a9a79f 94 }
networker 6:567607a9a79f 95 }
networker 6:567607a9a79f 96 }
networker 6:567607a9a79f 97
networker 6:567607a9a79f 98 vector<ftbtdev*> ft_devs;
networker 6:567607a9a79f 99 ftdev _ftdev; //single instance, just for test
networker 6:567607a9a79f 100
networker 6:567607a9a79f 101 int GetNrOfFtBtDevices() {
networker 6:567607a9a79f 102 return ft_devs.size();
networker 6:567607a9a79f 103 }
networker 6:567607a9a79f 104
networker 6:567607a9a79f 105 unsigned InitFtBtDeviceList() {//assume inquiry has been done
networker 6:567607a9a79f 106 static char FtDevClass[3] = {0x00, 0x1F, 0x82 };
networker 6:567607a9a79f 107 BTDevice* devs[8];
networker 6:567607a9a79f 108 int count = ((HCI*)&App)->GetDevices(devs,8);
networker 6:567607a9a79f 109 int n = 0;
networker 6:567607a9a79f 110 for (int i = 0; i < count; i++) {
networker 6:567607a9a79f 111 if (memcmp(devs[i]->_info.dev_class, FtDevClass, 3)==0) {
networker 6:567607a9a79f 112 ft_devs.push_back(new ftbtdev(&devs[i]->_info));
networker 6:567607a9a79f 113 printf("%d: %s\n", n++, devs[i]->_name);
networker 6:567607a9a79f 114 }
networker 6:567607a9a79f 115 // printf("device %d (handle=%d) ", i, devs[i]->_handle);
networker 6:567607a9a79f 116 // printfBytes("devclass: ", devs[i]->_info.dev_class, 3);
networker 6:567607a9a79f 117 }
networker 6:567607a9a79f 118 return n;
networker 6:567607a9a79f 119 }
networker 6:567607a9a79f 120
networker 6:567607a9a79f 121 ftbtdev* GetFtUsbDeviceHandle(unsigned Num) {
networker 6:567607a9a79f 122 if (Num < ft_devs.size()) {
networker 6:567607a9a79f 123 return ft_devs[Num];
networker 6:567607a9a79f 124 }
networker 6:567607a9a79f 125 return 0;
networker 6:567607a9a79f 126 }
networker 6:567607a9a79f 127
networker 6:567607a9a79f 128 unsigned OpenFtBtDevice(ftbtdev* d) {
networker 6:567607a9a79f 129 BD_ADDR* bd = d->BtAddr();
networker 6:567607a9a79f 130 printf("Connecting to ");
networker 6:567607a9a79f 131 printf(bd);
networker 6:567607a9a79f 132 printf("\n");
networker 6:567607a9a79f 133 return _ftdev.Open(bd, 1); //TODO: everything can go wrong here
networker 6:567607a9a79f 134 }