Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed myUSBHost AvailableMemory
Dependents: mbed_TANK_Kinect myBlueUSB_ros ftusbClass
ftclasslibusbdevbt.cpp@3:50196dce45f8, 2011-05-04 (annotated)
- Committer:
- networker
- Date:
- Wed May 04 09:31:15 2011 +0000
- Revision:
- 3:50196dce45f8
- Parent:
- 1:0dde58e0cccf
Who changed what in which revision?
| User | Revision | Line number | New 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 | } |