class library to access fischertechnik interfaces via USB
Dependencies: FatFileSystem mbed myBlueUSB neigbourhood rfcomm sdp
main.cpp@1:4676e8b9b357, 2013-03-11 (annotated)
- Committer:
- networker
- Date:
- Mon Mar 11 08:04:37 2013 +0000
- Revision:
- 1:4676e8b9b357
- Parent:
- 0:7da612835693
first publication of this experimental class, just for sharing wip
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
networker |
0:7da612835693 | 1 | /* |
networker |
0:7da612835693 | 2 | Copyright (c) 2010 Peter Barrett |
networker |
0:7da612835693 | 3 | |
networker |
0:7da612835693 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy |
networker |
0:7da612835693 | 5 | of this software and associated documentation files (the "Software"), to deal |
networker |
0:7da612835693 | 6 | in the Software without restriction, including without limitation the rights |
networker |
0:7da612835693 | 7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
networker |
0:7da612835693 | 8 | copies of the Software, and to permit persons to whom the Software is |
networker |
0:7da612835693 | 9 | furnished to do so, subject to the following conditions: |
networker |
0:7da612835693 | 10 | |
networker |
0:7da612835693 | 11 | The above copyright notice and this permission notice shall be included in |
networker |
0:7da612835693 | 12 | all copies or substantial portions of the Software. |
networker |
0:7da612835693 | 13 | |
networker |
0:7da612835693 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
networker |
0:7da612835693 | 15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
networker |
0:7da612835693 | 16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
networker |
0:7da612835693 | 17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
networker |
0:7da612835693 | 18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
networker |
0:7da612835693 | 19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
networker |
0:7da612835693 | 20 | THE SOFTWARE. |
networker |
0:7da612835693 | 21 | */ |
networker |
0:7da612835693 | 22 | |
networker |
0:7da612835693 | 23 | #include "mbed.h" |
networker |
0:7da612835693 | 24 | #include "USBHost.h" |
networker |
0:7da612835693 | 25 | #include "Utils.h" |
networker |
0:7da612835693 | 26 | #include "ftlibclass.h" |
networker |
0:7da612835693 | 27 | #include "ftlibclassusb.h" |
networker |
0:7da612835693 | 28 | #include "ftlibclasstxc.h" |
networker |
0:7da612835693 | 29 | #include "ftlibclasstxcbt.h" |
networker | 1:4676e8b9b357 | 30 | #include "neighbourhood.h" |
networker | 1:4676e8b9b357 | 31 | #include "btserial.h" |
networker | 1:4676e8b9b357 | 32 | |
networker | 1:4676e8b9b357 | 33 | class tx_emul { |
networker | 1:4676e8b9b357 | 34 | typedef void (*handler)(unsigned char *, int); |
networker | 1:4676e8b9b357 | 35 | int sock; |
networker | 1:4676e8b9b357 | 36 | unsigned char sndbuf[20], recbuf[20]; |
networker | 1:4676e8b9b357 | 37 | int pos; |
networker | 1:4676e8b9b357 | 38 | int reclen, chksum; |
networker | 1:4676e8b9b357 | 39 | handler onMsg; |
networker | 1:4676e8b9b357 | 40 | void send(int len) { |
networker | 1:4676e8b9b357 | 41 | sndbuf[2] = len; |
networker | 1:4676e8b9b357 | 42 | sndbuf[len+3] = 0; |
networker | 1:4676e8b9b357 | 43 | for (int i = 2; i < len + 3; i++) |
networker | 1:4676e8b9b357 | 44 | sndbuf[len+3] += sndbuf[i]; |
networker | 1:4676e8b9b357 | 45 | Socket_Send(sock, sndbuf, len+4); |
networker | 1:4676e8b9b357 | 46 | printfBytes("Sent msg:", sndbuf, len+4); |
networker | 1:4676e8b9b357 | 47 | } |
networker | 1:4676e8b9b357 | 48 | static void callback(int socket, SocketState state, const unsigned char *data, int len, void* userData) { |
networker | 1:4676e8b9b357 | 49 | tx_emul *self = (tx_emul*)userData; |
networker | 1:4676e8b9b357 | 50 | self->cb(socket, state, data, len); |
networker | 1:4676e8b9b357 | 51 | } |
networker | 1:4676e8b9b357 | 52 | void cb(int socket, SocketState state, const unsigned char *data, int len) { |
networker | 1:4676e8b9b357 | 53 | int i = 0; |
networker | 1:4676e8b9b357 | 54 | if (state == SocketState_Open) |
networker | 1:4676e8b9b357 | 55 | if (len > 0) |
networker | 1:4676e8b9b357 | 56 | while (i<len) { |
networker | 1:4676e8b9b357 | 57 | switch (pos) { |
networker | 1:4676e8b9b357 | 58 | case 0: |
networker | 1:4676e8b9b357 | 59 | if (data[i] == 0xBE) pos = 1; |
networker | 1:4676e8b9b357 | 60 | break; |
networker | 1:4676e8b9b357 | 61 | case 1: |
networker | 1:4676e8b9b357 | 62 | if (data[i] == 0xEF) pos = 2; |
networker | 1:4676e8b9b357 | 63 | else pos = 0; |
networker | 1:4676e8b9b357 | 64 | break; |
networker | 1:4676e8b9b357 | 65 | case 2: |
networker | 1:4676e8b9b357 | 66 | chksum = reclen = data[i]; |
networker | 1:4676e8b9b357 | 67 | break; |
networker | 1:4676e8b9b357 | 68 | default: |
networker | 1:4676e8b9b357 | 69 | if (pos < reclen+3) { |
networker | 1:4676e8b9b357 | 70 | chksum += data[i]; |
networker | 1:4676e8b9b357 | 71 | recbuf[pos-3] = data[i]; |
networker | 1:4676e8b9b357 | 72 | pos++; |
networker | 1:4676e8b9b357 | 73 | } else { |
networker | 1:4676e8b9b357 | 74 | if (chksum==data[i]) { |
networker | 1:4676e8b9b357 | 75 | if (onMsg) onMsg(recbuf, reclen); |
networker | 1:4676e8b9b357 | 76 | printfBytes("BEEF msg:", recbuf, reclen); |
networker | 1:4676e8b9b357 | 77 | } else |
networker | 1:4676e8b9b357 | 78 | printf("BEEF checksum error, should be %02x, got %02x\n", chksum, data[i]); |
networker | 1:4676e8b9b357 | 79 | pos = 0; |
networker | 1:4676e8b9b357 | 80 | } |
networker | 1:4676e8b9b357 | 81 | } |
networker | 1:4676e8b9b357 | 82 | i++; |
networker | 1:4676e8b9b357 | 83 | } |
networker | 1:4676e8b9b357 | 84 | else { |
networker | 1:4676e8b9b357 | 85 | const char *ack = "CONN_ACK"; |
networker | 1:4676e8b9b357 | 86 | strcpy((char*)sndbuf+3, ack); |
networker | 1:4676e8b9b357 | 87 | send(strlen(ack)); |
networker | 1:4676e8b9b357 | 88 | printf("Sent %s\n", ack); |
networker | 1:4676e8b9b357 | 89 | } |
networker | 1:4676e8b9b357 | 90 | else if (state == SocketState_Closed) { |
networker | 1:4676e8b9b357 | 91 | //reopen it again |
networker | 1:4676e8b9b357 | 92 | pos = 0; |
networker | 1:4676e8b9b357 | 93 | sock = Socket_Listen(SOCKET_RFCOM, 1, callback, this); |
networker | 1:4676e8b9b357 | 94 | } |
networker | 1:4676e8b9b357 | 95 | } |
networker | 1:4676e8b9b357 | 96 | |
networker | 1:4676e8b9b357 | 97 | public: |
networker | 1:4676e8b9b357 | 98 | tx_emul(handler h=0): onMsg(h) { |
networker | 1:4676e8b9b357 | 99 | sndbuf[0] = 0xBE; |
networker | 1:4676e8b9b357 | 100 | sndbuf[1] = 0xEF; |
networker | 1:4676e8b9b357 | 101 | pos = 0; |
networker | 1:4676e8b9b357 | 102 | sock = Socket_Listen(SOCKET_RFCOM, 1, callback, this); |
networker | 1:4676e8b9b357 | 103 | } |
networker | 1:4676e8b9b357 | 104 | ~tx_emul() { |
networker | 1:4676e8b9b357 | 105 | Socket_Close(sock); |
networker | 1:4676e8b9b357 | 106 | } |
networker | 1:4676e8b9b357 | 107 | void sendMsg(unsigned char hwid, unsigned char subid, unsigned short cmd, unsigned short val) { |
networker | 1:4676e8b9b357 | 108 | sndbuf[3] = hwid; |
networker | 1:4676e8b9b357 | 109 | sndbuf[4] = subid; |
networker | 1:4676e8b9b357 | 110 | sndbuf[5] = cmd; |
networker | 1:4676e8b9b357 | 111 | sndbuf[6] = cmd>>8; |
networker | 1:4676e8b9b357 | 112 | sndbuf[7] = val; |
networker | 1:4676e8b9b357 | 113 | sndbuf[8] = val>>8; |
networker | 1:4676e8b9b357 | 114 | send(6); |
networker | 1:4676e8b9b357 | 115 | } |
networker | 1:4676e8b9b357 | 116 | }; |
networker |
0:7da612835693 | 117 | |
networker |
0:7da612835693 | 118 | Serial pc(USBTX, USBRX); |
networker |
0:7da612835693 | 119 | |
networker |
0:7da612835693 | 120 | FT_TRANSFER_AREA *ta = 0; |
networker |
0:7da612835693 | 121 | TA *tax = 0; |
networker |
0:7da612835693 | 122 | NOTIFICATION_EVENTS ne; |
networker |
0:7da612835693 | 123 | |
networker |
0:7da612835693 | 124 | int main() { |
networker |
0:7da612835693 | 125 | pc.baud(460800); |
networker |
0:7da612835693 | 126 | printf("USBShell\nNow get a bunch of usb things and plug them in\n"); |
networker |
0:7da612835693 | 127 | USBInit(); |
networker |
0:7da612835693 | 128 | int state = 0; |
networker |
0:7da612835693 | 129 | Timer time; |
networker |
0:7da612835693 | 130 | time.start(); |
networker |
0:7da612835693 | 131 | int n, r0, r1, r2, r3=0; |
networker | 1:4676e8b9b357 | 132 | // ftusbdev* h = 0; |
networker |
0:7da612835693 | 133 | ftusbdevtxbt* h = 0; |
networker | 1:4676e8b9b357 | 134 | tx_emul *fttxbt = 0; |
networker |
0:7da612835693 | 135 | printf("Start enumeration\n"); |
networker |
0:7da612835693 | 136 | for (;;) { |
networker |
0:7da612835693 | 137 | switch (state) { |
networker |
0:7da612835693 | 138 | case 0: //enumeration, allow 3 seconds |
networker |
0:7da612835693 | 139 | if (time.read() >= 20) { |
networker | 1:4676e8b9b357 | 140 | if (tx_emulation) |
networker | 1:4676e8b9b357 | 141 | state = 10; |
networker | 1:4676e8b9b357 | 142 | else |
networker | 1:4676e8b9b357 | 143 | state = 1; |
networker |
0:7da612835693 | 144 | printf("Start initialisation\n"); |
networker |
0:7da612835693 | 145 | } |
networker |
0:7da612835693 | 146 | break; |
networker |
0:7da612835693 | 147 | case 1: //init program |
networker |
0:7da612835693 | 148 | r0 = ftlib::InitFtLib(); |
networker |
0:7da612835693 | 149 | printf("InitFtLib() returns %d\n", r0); |
networker |
0:7da612835693 | 150 | r1 = ftusbdevtxbt::InitFtUsbDeviceList(); |
networker |
0:7da612835693 | 151 | printf("InitFtUsbDeviceList() returns %d\n", r1); |
networker |
0:7da612835693 | 152 | n = ftusbdev::GetNumFtUsbDevice(); |
networker |
0:7da612835693 | 153 | printf("GetNumFtUsbDevice() returns %d\n", n); |
networker |
0:7da612835693 | 154 | for (int i = 0; i < n; i++) { |
networker |
0:7da612835693 | 155 | ftdev* h = ftusbdev::GetFtUsbDeviceHandle(i); |
networker |
0:7da612835693 | 156 | printf("handle = %p\n", h); |
networker |
0:7da612835693 | 157 | unsigned sn = h->GetFtSerialNr(); |
networker |
0:7da612835693 | 158 | printf("S/N=%d\n", sn); |
networker |
0:7da612835693 | 159 | char *name = h->GetFtLongNameStrg(); |
networker |
0:7da612835693 | 160 | printf("%d: %s SN=%08d\n", i, name, sn); |
networker |
0:7da612835693 | 161 | delete[] name; |
networker |
0:7da612835693 | 162 | //USBLoop(); |
networker |
0:7da612835693 | 163 | } |
networker |
0:7da612835693 | 164 | h = dynamic_cast<ftusbdevtxbt*>(ftusbdev::GetFtUsbDeviceHandle(0)); |
networker |
0:7da612835693 | 165 | if (h==0) { |
networker |
0:7da612835693 | 166 | printf("Cast failed\n"); |
networker |
0:7da612835693 | 167 | state = 4; |
networker |
0:7da612835693 | 168 | break; |
networker |
0:7da612835693 | 169 | } |
networker |
0:7da612835693 | 170 | r2 = h->OpenFtUsbDevice(); |
networker |
0:7da612835693 | 171 | printf("OpenFtUsbDevice() returns %08x\n", r2); |
networker | 1:4676e8b9b357 | 172 | // ta = h->GetFtTransferAreaAddress(); |
networker |
0:7da612835693 | 173 | tax = h->GetFtTransferAreaAddress(0); |
networker |
0:7da612835693 | 174 | r3 = h->StartFtTransferArea(&ne); |
networker |
0:7da612835693 | 175 | if (r3) { |
networker |
0:7da612835693 | 176 | printf("Could not start thread %08X\n", r3); |
networker |
0:7da612835693 | 177 | state = 3; |
networker |
0:7da612835693 | 178 | break; |
networker |
0:7da612835693 | 179 | } |
networker |
0:7da612835693 | 180 | state = 2; |
networker |
0:7da612835693 | 181 | printf("Start main loop\n"); |
networker |
0:7da612835693 | 182 | break; |
networker |
0:7da612835693 | 183 | case 2: //main loop |
networker |
0:7da612835693 | 184 | ftlib::poll(); |
networker |
0:7da612835693 | 185 | /* if (ta->ChangeEg) { |
networker | 1:4676e8b9b357 | 186 | printf("%02X %d %d %d\n", ta->E_Main, ta->AX, ta->A1, ta->AV); |
networker | 1:4676e8b9b357 | 187 | ta->ChangeEg = 0; |
networker | 1:4676e8b9b357 | 188 | }*/ |
networker |
0:7da612835693 | 189 | //printf("%02X %d %d %d\r", tax->input.uni[0],tax->input.uni[1],tax->input.uni[2],tax->input.uni[3]); |
networker |
0:7da612835693 | 190 | if (time.read() >= 30) { |
networker |
0:7da612835693 | 191 | state = 3; |
networker |
0:7da612835693 | 192 | printf("\nEnd of main loop\n"); |
networker |
0:7da612835693 | 193 | } |
networker |
0:7da612835693 | 194 | break; |
networker |
0:7da612835693 | 195 | case 3: //finalizing |
networker |
0:7da612835693 | 196 | h->StopFtTransferArea(); |
networker |
0:7da612835693 | 197 | h->CloseFtDevice(); |
networker |
0:7da612835693 | 198 | ftlib::CloseFtLib(); |
networker | 1:4676e8b9b357 | 199 | //neighbors->write(); //succeeds but nothing gets written |
networker |
0:7da612835693 | 200 | state = 4; |
networker |
0:7da612835693 | 201 | break; |
networker |
0:7da612835693 | 202 | case 4: |
networker |
0:7da612835693 | 203 | break; |
networker | 1:4676e8b9b357 | 204 | case 10://init tx emulation |
networker | 1:4676e8b9b357 | 205 | fttxbt = new tx_emul; |
networker | 1:4676e8b9b357 | 206 | state = 11; |
networker | 1:4676e8b9b357 | 207 | break; |
networker | 1:4676e8b9b357 | 208 | case 11: |
networker | 1:4676e8b9b357 | 209 | break; |
networker |
0:7da612835693 | 210 | default: |
networker |
0:7da612835693 | 211 | return 0; |
networker |
0:7da612835693 | 212 | } |
networker |
0:7da612835693 | 213 | USBLoop(); |
networker |
0:7da612835693 | 214 | } |
networker |
0:7da612835693 | 215 | } |
networker |
0:7da612835693 | 216 | |
networker |
0:7da612835693 | 217 | int OnDiskInsert(int device) { |
networker |
0:7da612835693 | 218 | return 0; |
networker |
0:7da612835693 | 219 | } |
networker |
0:7da612835693 | 220 |