Based on myBlueUSB reference ver. http://mbed.org/users/networker/programs/myBlueUSB/lsm1ui

Dependencies:   mbed myUSBHost AvailableMemory rfcomm myBlueUSB sdp

Committer:
kenbumono
Date:
Tue Jul 05 08:25:59 2011 +0000
Revision:
0:8d8481ed6d49

        

Who changed what in which revision?

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