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:
Fri Jul 01 09:16:00 2011 +0000
Revision:
13:327622e38551
Parent:
6:567607a9a79f
made some improvements to get massstorage functioning

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 }