class library to access fischertechnik interfaces via USB

Dependencies:   FatFileSystem mbed myBlueUSB neigbourhood rfcomm sdp

Committer:
networker
Date:
Wed Jun 15 19:12:25 2011 +0000
Revision:
0:7da612835693
Child:
1:4676e8b9b357
initial version
; Bluetooth support incomplete

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 0:7da612835693 30
networker 0:7da612835693 31 Serial pc(USBTX, USBRX);
networker 0:7da612835693 32
networker 0:7da612835693 33 FT_TRANSFER_AREA *ta = 0;
networker 0:7da612835693 34 TA *tax = 0;
networker 0:7da612835693 35 NOTIFICATION_EVENTS ne;
networker 0:7da612835693 36
networker 0:7da612835693 37 int main() {
networker 0:7da612835693 38 pc.baud(460800);
networker 0:7da612835693 39 printf("USBShell\nNow get a bunch of usb things and plug them in\n");
networker 0:7da612835693 40 USBInit();
networker 0:7da612835693 41 int state = 0;
networker 0:7da612835693 42 Timer time;
networker 0:7da612835693 43 time.start();
networker 0:7da612835693 44 int n, r0, r1, r2, r3=0;
networker 0:7da612835693 45 // ftusbdev* h = 0;
networker 0:7da612835693 46 ftusbdevtxbt* h = 0;
networker 0:7da612835693 47 printf("Start enumeration\n");
networker 0:7da612835693 48 for (;;) {
networker 0:7da612835693 49 switch (state) {
networker 0:7da612835693 50 case 0: //enumeration, allow 3 seconds
networker 0:7da612835693 51 if (time.read() >= 20) {
networker 0:7da612835693 52 state = 1;
networker 0:7da612835693 53 printf("Start initialisation\n");
networker 0:7da612835693 54 }
networker 0:7da612835693 55 break;
networker 0:7da612835693 56 case 1: //init program
networker 0:7da612835693 57 r0 = ftlib::InitFtLib();
networker 0:7da612835693 58 printf("InitFtLib() returns %d\n", r0);
networker 0:7da612835693 59 r1 = ftusbdevtxbt::InitFtUsbDeviceList();
networker 0:7da612835693 60 printf("InitFtUsbDeviceList() returns %d\n", r1);
networker 0:7da612835693 61 n = ftusbdev::GetNumFtUsbDevice();
networker 0:7da612835693 62 printf("GetNumFtUsbDevice() returns %d\n", n);
networker 0:7da612835693 63 for (int i = 0; i < n; i++) {
networker 0:7da612835693 64 ftdev* h = ftusbdev::GetFtUsbDeviceHandle(i);
networker 0:7da612835693 65 printf("handle = %p\n", h);
networker 0:7da612835693 66 unsigned sn = h->GetFtSerialNr();
networker 0:7da612835693 67 printf("S/N=%d\n", sn);
networker 0:7da612835693 68 char *name = h->GetFtLongNameStrg();
networker 0:7da612835693 69 printf("%d: %s SN=%08d\n", i, name, sn);
networker 0:7da612835693 70 delete[] name;
networker 0:7da612835693 71 //USBLoop();
networker 0:7da612835693 72 }
networker 0:7da612835693 73 h = dynamic_cast<ftusbdevtxbt*>(ftusbdev::GetFtUsbDeviceHandle(0));
networker 0:7da612835693 74 if (h==0) {
networker 0:7da612835693 75 printf("Cast failed\n");
networker 0:7da612835693 76 state = 4;
networker 0:7da612835693 77 break;
networker 0:7da612835693 78 }
networker 0:7da612835693 79 r2 = h->OpenFtUsbDevice();
networker 0:7da612835693 80 printf("OpenFtUsbDevice() returns %08x\n", r2);
networker 0:7da612835693 81 // ta = h->GetFtTransferAreaAddress();
networker 0:7da612835693 82 tax = h->GetFtTransferAreaAddress(0);
networker 0:7da612835693 83 r3 = h->StartFtTransferArea(&ne);
networker 0:7da612835693 84 if (r3) {
networker 0:7da612835693 85 printf("Could not start thread %08X\n", r3);
networker 0:7da612835693 86 state = 3;
networker 0:7da612835693 87 break;
networker 0:7da612835693 88 }
networker 0:7da612835693 89 state = 2;
networker 0:7da612835693 90 printf("Start main loop\n");
networker 0:7da612835693 91 break;
networker 0:7da612835693 92 case 2: //main loop
networker 0:7da612835693 93 ftlib::poll();
networker 0:7da612835693 94 /* if (ta->ChangeEg) {
networker 0:7da612835693 95 printf("%02X %d %d %d\n", ta->E_Main, ta->AX, ta->A1, ta->AV);
networker 0:7da612835693 96 ta->ChangeEg = 0;
networker 0:7da612835693 97 }*/
networker 0:7da612835693 98 //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 99 if (time.read() >= 30) {
networker 0:7da612835693 100 state = 3;
networker 0:7da612835693 101 printf("\nEnd of main loop\n");
networker 0:7da612835693 102 }
networker 0:7da612835693 103 break;
networker 0:7da612835693 104 case 3: //finalizing
networker 0:7da612835693 105 h->StopFtTransferArea();
networker 0:7da612835693 106 h->CloseFtDevice();
networker 0:7da612835693 107 ftlib::CloseFtLib();
networker 0:7da612835693 108 state = 4;
networker 0:7da612835693 109 break;
networker 0:7da612835693 110 case 4:
networker 0:7da612835693 111 break;
networker 0:7da612835693 112 default:
networker 0:7da612835693 113 return 0;
networker 0:7da612835693 114 }
networker 0:7da612835693 115 USBLoop();
networker 0:7da612835693 116 }
networker 0:7da612835693 117 }
networker 0:7da612835693 118
networker 0:7da612835693 119 int OnDiskInsert(int device) {
networker 0:7da612835693 120 return 0;
networker 0:7da612835693 121 }
networker 0:7da612835693 122
networker 0:7da612835693 123
networker 0:7da612835693 124 #if 0
networker 0:7da612835693 125 #include "FATFileSystem.h"
networker 0:7da612835693 126
networker 0:7da612835693 127 int MassStorage_ReadCapacity(int device, u32* blockCount, u32* blockSize);
networker 0:7da612835693 128 int MassStorage_Read(int device, u32 blockAddr, u32 blockCount, u8* dst, u32 blockSize);
networker 0:7da612835693 129 int MassStorage_Write(int device, u32 blockAddr, u32 blockCount, u8* dst, u32 blockSize);
networker 0:7da612835693 130
networker 0:7da612835693 131 class USBFileSystem : public FATFileSystem {
networker 0:7da612835693 132 int _device;
networker 0:7da612835693 133 u32 _blockSize;
networker 0:7da612835693 134 u32 _blockCount;
networker 0:7da612835693 135
networker 0:7da612835693 136 public:
networker 0:7da612835693 137 USBFileSystem() : FATFileSystem("usb"),_device(0),_blockSize(0),_blockCount(0) {
networker 0:7da612835693 138 }
networker 0:7da612835693 139
networker 0:7da612835693 140 void SetDevice(int device) {
networker 0:7da612835693 141 _device = device;
networker 0:7da612835693 142 }
networker 0:7da612835693 143
networker 0:7da612835693 144 virtual int disk_initialize() {
networker 0:7da612835693 145 return MassStorage_ReadCapacity(_device,&_blockCount,&_blockSize);
networker 0:7da612835693 146 }
networker 0:7da612835693 147
networker 0:7da612835693 148 virtual int disk_write(const char *buffer, int block_number) {
networker 0:7da612835693 149 return MassStorage_Write(_device,block_number,1,(u8*)buffer,_blockSize);
networker 0:7da612835693 150 }
networker 0:7da612835693 151
networker 0:7da612835693 152 virtual int disk_read(char *buffer, int block_number) {
networker 0:7da612835693 153 return MassStorage_Read(_device,block_number,1,(u8*)buffer,_blockSize);
networker 0:7da612835693 154 }
networker 0:7da612835693 155
networker 0:7da612835693 156 virtual int disk_sectors() {
networker 0:7da612835693 157 return _blockCount;
networker 0:7da612835693 158 }
networker 0:7da612835693 159 };
networker 0:7da612835693 160
networker 0:7da612835693 161
networker 0:7da612835693 162 void DumpFS(int depth, int count) {
networker 0:7da612835693 163 DIR *d = opendir("/usb");
networker 0:7da612835693 164 if (!d) {
networker 0:7da612835693 165 printf("USB file system borked\n");
networker 0:7da612835693 166 return;
networker 0:7da612835693 167 }
networker 0:7da612835693 168
networker 0:7da612835693 169 printf("\nDumping root dir\n");
networker 0:7da612835693 170 struct dirent *p;
networker 0:7da612835693 171 while ((p = readdir(d))) {
networker 0:7da612835693 172 int len = sizeof( dirent);
networker 0:7da612835693 173 printf("%s %d\n", p->d_name, len);
networker 0:7da612835693 174 }
networker 0:7da612835693 175 closedir(d);
networker 0:7da612835693 176 }
networker 0:7da612835693 177
networker 0:7da612835693 178 int OnDiskInsert(int device) {
networker 0:7da612835693 179 USBFileSystem fs;
networker 0:7da612835693 180 fs.SetDevice(device);
networker 0:7da612835693 181 DumpFS(0,0);
networker 0:7da612835693 182 return 0;
networker 0:7da612835693 183 }
networker 0:7da612835693 184
networker 0:7da612835693 185 /*
networker 0:7da612835693 186 Simple test shell to exercise mouse,keyboard,mass storage and hubs.
networker 0:7da612835693 187 Add 2 15k pulldown resistors between D+/D- and ground, attach a usb socket and have at it.
networker 0:7da612835693 188 */
networker 0:7da612835693 189
networker 0:7da612835693 190 #endif