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 #include "mbed.h"
networker 0:7da612835693 2 #include "USBHost.h"
networker 0:7da612835693 3 #include "ftusb.h"
networker 0:7da612835693 4 #include <vector>
networker 0:7da612835693 5 #include "HCITransportUSB.h"
networker 0:7da612835693 6 #include "Socket.h"
networker 0:7da612835693 7 #include "RFCOMM.h"
networker 0:7da612835693 8 #include "sdp.h"
networker 0:7da612835693 9
networker 0:7da612835693 10 // these should be placed in the DMA SRAM
networker 0:7da612835693 11 typedef struct {
networker 0:7da612835693 12 u8 _hciBuffer[MAX_HCL_SIZE];
networker 0:7da612835693 13 u8 _aclBuffer[MAX_ACL_SIZE];
networker 0:7da612835693 14 } SRAMPlacement;
networker 0:7da612835693 15
networker 0:7da612835693 16 const char FtDevClass[3] = {0x00, 0x1F, 0x82 };
networker 0:7da612835693 17 const char SerDevClass[3] = {4, 1, 0x00};
networker 0:7da612835693 18
networker 0:7da612835693 19 HCITransportUSB _HCITransportUSB; //use USB as the transport to the radio
networker 0:7da612835693 20 BTApp Bluetooth;
networker 0:7da612835693 21 vector<_ftdev> devs;
networker 0:7da612835693 22
networker 0:7da612835693 23 void OnLoadFtDevice(int device, DeviceDescriptor* deviceDesc, InterfaceDescriptor* interfaceDesc) {
networker 0:7da612835693 24 for (int i = 0; i < devs.size(); i++)
networker 0:7da612835693 25 if (devs[i].device == device) {
networker 0:7da612835693 26 printf("device %d was already in the list\n", device);
networker 0:7da612835693 27 return;
networker 0:7da612835693 28 }
networker 0:7da612835693 29 switch (deviceDesc->idProduct) {
networker 0:7da612835693 30 case 1:
networker 0:7da612835693 31 devs.push_back(*new _ftdev(device, deviceDesc->idProduct, deviceDesc->iSerialNumber));
networker 0:7da612835693 32 printf("RoboInterface\n");
networker 0:7da612835693 33 break;
networker 0:7da612835693 34 case 2:
networker 0:7da612835693 35 devs.push_back(*new _ftdev(device, deviceDesc->idProduct, deviceDesc->iSerialNumber));
networker 0:7da612835693 36 printf("RoboExtension\n");
networker 0:7da612835693 37 break;
networker 0:7da612835693 38 case 3:
networker 0:7da612835693 39 devs.push_back(*new _ftdev(device, deviceDesc->idProduct, deviceDesc->iSerialNumber, 0));
networker 0:7da612835693 40 printf("Robo RF Interface\n");
networker 0:7da612835693 41 break;
networker 0:7da612835693 42 case 4:
networker 0:7da612835693 43 printf("Sound\n");
networker 0:7da612835693 44 break;
networker 0:7da612835693 45 case 4096:
networker 0:7da612835693 46 devs.push_back(*new _ftdev(device, deviceDesc->idProduct, deviceDesc->iSerialNumber));
networker 0:7da612835693 47 printf("TX Controller\n");
networker 0:7da612835693 48 break;
networker 0:7da612835693 49 default:
networker 0:7da612835693 50 printf("fischertechnik product %d\n", deviceDesc->idProduct);
networker 0:7da612835693 51 break;
networker 0:7da612835693 52 }
networker 0:7da612835693 53 }
networker 0:7da612835693 54
networker 0:7da612835693 55
networker 0:7da612835693 56 int OnBluetoothInsert(int device) {//install the HCI and start discovery, user callbacks are made to HciCalback
networker 0:7da612835693 57 printf("Bluetooth inserted of %d\n",device);
networker 0:7da612835693 58 u32 sramLen;
networker 0:7da612835693 59 u8* sram = USBGetBuffer(&sramLen);
networker 0:7da612835693 60 sram = (u8*)(((u32)sram + 1023) & ~1023);
networker 0:7da612835693 61 SRAMPlacement* s = (SRAMPlacement*)sram;
networker 0:7da612835693 62 _HCITransportUSB.Open(device,s->_hciBuffer,s->_aclBuffer);//setup buffers for USB host, incoming data goes first to HCIRecv and ACLRecv
networker 0:7da612835693 63 RegisterSocketHandler(SOCKET_L2CAP,&Bluetooth); //register the application::hci as handler for L2CAP events
networker 0:7da612835693 64 RegisterSocketHandler(SOCKET_RFCOM, &rfcomm_manager);//set the RFCOMMManager as the RFCOM socket handler
networker 0:7da612835693 65 if (RegisterSocketHandler(SOCKET_SDP, &SDP))
networker 0:7da612835693 66 printf("Could not register SDP socket type\n");
networker 0:7da612835693 67 Bluetooth.Open(&_HCITransportUSB);//the callback is virtual, calls BTApp::Callback
networker 0:7da612835693 68 Bluetooth.Inquiry();//start discovery of BT devices phase 0
networker 0:7da612835693 69 return 0;
networker 0:7da612835693 70 }
networker 0:7da612835693 71
networker 0:7da612835693 72 void printf(const BD_ADDR* addr) {
networker 0:7da612835693 73 const u8* a = addr->addr;
networker 0:7da612835693 74 printf("%02X:%02X:%02X:%02X:%02X:%02X",a[5],a[4],a[3],a[2],a[1],a[0]);
networker 0:7da612835693 75 }
networker 0:7da612835693 76
networker 0:7da612835693 77 // We have connected to a device
networker 0:7da612835693 78 void BTApp::ConnectionComplete(connection_info* info) {
networker 0:7da612835693 79 printf("ConnectionComplete ");
networker 0:7da612835693 80 BD_ADDR* a = &info->bdaddr;
networker 0:7da612835693 81 printf(a);
networker 0:7da612835693 82 printf("\n");
networker 0:7da612835693 83 RemoteNameRequest(a);
networker 0:7da612835693 84 for (i++; i < count; i++) {//find the next ft device to open
networker 0:7da612835693 85 //printfBytes("DEVICE CLASS",devs[i]->_info.dev_class,3);
networker 0:7da612835693 86 if (devs[i]->_handle == 0 && memcmp(devs[i]->_info.dev_class, FtDevClass, 3)==0) {//or some other way to connect to RFCOMM devices
networker 0:7da612835693 87 BD_ADDR* bd = &devs[i]->_info.bdaddr;
networker 0:7da612835693 88 printf("Connecting to ");
networker 0:7da612835693 89 printf(bd);
networker 0:7da612835693 90 printf("\n");
networker 0:7da612835693 91 pending++;
networker 0:7da612835693 92 CreateConnection(bd); //some low level connect, just let it happen for now (sets pin, mtu etc.)
networker 0:7da612835693 93 printf("connection cmd was sent\n");
networker 0:7da612835693 94 return;
networker 0:7da612835693 95 }
networker 0:7da612835693 96 }
networker 0:7da612835693 97 }
networker 0:7da612835693 98
networker 0:7da612835693 99 void BTApp::ConnectDevices() {
networker 0:7da612835693 100 count = GetDevices(devs,8);//get pointers to all bluetooth devices
networker 0:7da612835693 101 pending = 0;
networker 0:7da612835693 102 for (i = 0; i < count; i++) {//find first ft device (when filter works, all devices are ft devices)
networker 0:7da612835693 103 //printfBytes("DEVICE CLASS",devs[i]->_info.dev_class,3);
networker 0:7da612835693 104 if (devs[i]->_handle == 0 && memcmp(devs[i]->_info.dev_class, FtDevClass, 3)==0) {//or some other way to connect to RFCOMM devices
networker 0:7da612835693 105 BD_ADDR* bd = &devs[i]->_info.bdaddr;
networker 0:7da612835693 106 printf("Connecting to ");
networker 0:7da612835693 107 printf(bd);
networker 0:7da612835693 108 printf("\n");
networker 0:7da612835693 109 pending++;
networker 0:7da612835693 110 CreateConnection(bd); //some low level connect, just let it happen for now (sets pin, mtu etc.)
networker 0:7da612835693 111 printf("connection cmd was sent\n");
networker 0:7da612835693 112 return;
networker 0:7da612835693 113 }
networker 0:7da612835693 114 }
networker 0:7da612835693 115 }
networker 0:7da612835693 116
networker 0:7da612835693 117 void BTApp::Callback(HCI_CALLBACK_EVENT evt, const u8* data, int len) {//these events are forwarded (in)directly from HCIRecv
networker 0:7da612835693 118 unsigned char pin[] = "1234";
networker 0:7da612835693 119 u8 filter[] = {0x00, 0x1F, 0x82, 0xFF, 0xFF, 0xFF };
networker 0:7da612835693 120 printf("\x1b[%dm", 33);
networker 0:7da612835693 121 switch (evt) {
networker 0:7da612835693 122 case CALLBACK_READY:
networker 0:7da612835693 123 printf("CALLBACK_READY\n");
networker 0:7da612835693 124 printf("my address = ");
networker 0:7da612835693 125 printf((BD_ADDR*)data);
networker 0:7da612835693 126 SetEventFilter(1, 1, filter);
networker 0:7da612835693 127 Inquiry();//start the second phase of the discovery
networker 0:7da612835693 128 break;
networker 0:7da612835693 129
networker 0:7da612835693 130 case CALLBACK_INQUIRY_RESULT: //optionally build the list of FT devices here
networker 0:7da612835693 131 printf("CALLBACK_INQUIRY_RESULT ");
networker 0:7da612835693 132 printf((BD_ADDR*)data);
networker 0:7da612835693 133 printf("\n");//data points to inquiry_info struct
networker 0:7da612835693 134 break;
networker 0:7da612835693 135
networker 0:7da612835693 136 case CALLBACK_INQUIRY_DONE:
networker 0:7da612835693 137 printf("CALLBACK_INQUIRY_DONE\n");
networker 0:7da612835693 138 ConnectDevices();
networker 0:7da612835693 139 break;
networker 0:7da612835693 140
networker 0:7da612835693 141 case CALLBACK_REMOTE_NAME: {
networker 0:7da612835693 142 BD_ADDR* addr = (BD_ADDR*)data;
networker 0:7da612835693 143 const char* name = (const char*)(data + 6);
networker 0:7da612835693 144 printf(addr);
networker 0:7da612835693 145 printf(" = % s\n",name);
networker 0:7da612835693 146 pending--;
networker 0:7da612835693 147 }
networker 0:7da612835693 148 break;
networker 0:7da612835693 149
networker 0:7da612835693 150 case CALLBACK_CONNECTION_COMPLETE: {
networker 0:7da612835693 151 connection_info *ci = (connection_info*)data;
networker 0:7da612835693 152 if (ci->status>0) {
networker 0:7da612835693 153 printf("Connection failed, status=0x%02X\n", ci->status);
networker 0:7da612835693 154 break;
networker 0:7da612835693 155 }
networker 0:7da612835693 156 ConnectionComplete(ci);
networker 0:7da612835693 157 /*
networker 0:7da612835693 158 printf("Going to open sdp socket\n");
networker 0:7da612835693 159 L2CAPAddr addr;
networker 0:7da612835693 160 memcpy(&addr.bdaddr, &ci->bdaddr, 6);
networker 0:7da612835693 161 int s = SDP.Open(&addr.hdr);
networker 0:7da612835693 162 */
networker 0:7da612835693 163 }
networker 0:7da612835693 164 break;
networker 0:7da612835693 165 case CALLBACK_PIN_REQ:
networker 0:7da612835693 166 printf("Enter PIN for ");
networker 0:7da612835693 167 printf((BD_ADDR*)data);
networker 0:7da612835693 168 printf(" : submitting %s\n", pin);
networker 0:7da612835693 169 PinCodeReply(data, pin);
networker 0:7da612835693 170 break;
networker 0:7da612835693 171 default:
networker 0:7da612835693 172 printf("Unhandled HCI Callback %d\n", evt);
networker 0:7da612835693 173 };
networker 0:7da612835693 174 printf("\x1b[%dm", 0);
networker 0:7da612835693 175 }
networker 0:7da612835693 176
networker 0:7da612835693 177