class library to access fischertechnik interfaces via USB

Dependencies:   FatFileSystem mbed myBlueUSB neigbourhood rfcomm sdp

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?

UserRevisionLine numberNew 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