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:
Mon Apr 04 16:47:10 2011 +0000
Revision:
1:0dde58e0cccf
initial revision

Who changed what in which revision?

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