Simons Wii controlled m3pi program

Dependencies:   mbed m3pi ID12RFIDIRQ

Committer:
chris
Date:
Wed May 18 14:50:46 2011 +0000
Revision:
0:0ab65a1aef12
Added some printing to the m3pi screen

Who changed what in which revision?

UserRevisionLine numberNew contents of line
chris 0:0ab65a1aef12 1 /*
chris 0:0ab65a1aef12 2 Copyright (c) 2010 Peter Barrett
chris 0:0ab65a1aef12 3
chris 0:0ab65a1aef12 4 Permission is hereby granted, free of charge, to any person obtaining a copy
chris 0:0ab65a1aef12 5 of this software and associated documentation files (the "Software"), to deal
chris 0:0ab65a1aef12 6 in the Software without restriction, including without limitation the rights
chris 0:0ab65a1aef12 7 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
chris 0:0ab65a1aef12 8 copies of the Software, and to permit persons to whom the Software is
chris 0:0ab65a1aef12 9 furnished to do so, subject to the following conditions:
chris 0:0ab65a1aef12 10
chris 0:0ab65a1aef12 11 The above copyright notice and this permission notice shall be included in
chris 0:0ab65a1aef12 12 all copies or substantial portions of the Software.
chris 0:0ab65a1aef12 13
chris 0:0ab65a1aef12 14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
chris 0:0ab65a1aef12 15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
chris 0:0ab65a1aef12 16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
chris 0:0ab65a1aef12 17 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
chris 0:0ab65a1aef12 18 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
chris 0:0ab65a1aef12 19 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
chris 0:0ab65a1aef12 20 THE SOFTWARE.
chris 0:0ab65a1aef12 21 */
chris 0:0ab65a1aef12 22
chris 0:0ab65a1aef12 23 #include "mbed.h"
chris 0:0ab65a1aef12 24 #include "USBHost.h"
chris 0:0ab65a1aef12 25 #include "Utils.h"
chris 0:0ab65a1aef12 26
chris 0:0ab65a1aef12 27 #include <stdio.h>
chris 0:0ab65a1aef12 28 #include <stdlib.h>
chris 0:0ab65a1aef12 29 #include <stdio.h>
chris 0:0ab65a1aef12 30 #include <string.h>
chris 0:0ab65a1aef12 31
chris 0:0ab65a1aef12 32 #include "Utils.h"
chris 0:0ab65a1aef12 33 #include "USBHost.h"
chris 0:0ab65a1aef12 34 #include "hci.h"
chris 0:0ab65a1aef12 35
chris 0:0ab65a1aef12 36 extern void wii_data(char *data);
chris 0:0ab65a1aef12 37
chris 0:0ab65a1aef12 38 void printf(const BD_ADDR* addr) {
chris 0:0ab65a1aef12 39 const u8* a = addr->addr;
chris 0:0ab65a1aef12 40 printf("%02X:%02X:%02X:%02X:%02X:%02X",a[5],a[4],a[3],a[2],a[1],a[0]);
chris 0:0ab65a1aef12 41 }
chris 0:0ab65a1aef12 42
chris 0:0ab65a1aef12 43 #define MAX_HCL_SIZE 260
chris 0:0ab65a1aef12 44 #define MAX_ACL_SIZE 400
chris 0:0ab65a1aef12 45
chris 0:0ab65a1aef12 46 class HCITransportUSB : public HCITransport {
chris 0:0ab65a1aef12 47 int _device;
chris 0:0ab65a1aef12 48 u8* _hciBuffer;
chris 0:0ab65a1aef12 49 u8* _aclBuffer;
chris 0:0ab65a1aef12 50
chris 0:0ab65a1aef12 51 public:
chris 0:0ab65a1aef12 52 void Open(int device, u8* hciBuffer, u8* aclBuffer) {
chris 0:0ab65a1aef12 53 _device = device;
chris 0:0ab65a1aef12 54 _hciBuffer = hciBuffer;
chris 0:0ab65a1aef12 55 _aclBuffer = aclBuffer;
chris 0:0ab65a1aef12 56 USBInterruptTransfer(_device,0x81,_hciBuffer,MAX_HCL_SIZE,HciCallback,this);
chris 0:0ab65a1aef12 57 USBBulkTransfer(_device,0x82,_aclBuffer,MAX_ACL_SIZE,AclCallback,this);
chris 0:0ab65a1aef12 58 }
chris 0:0ab65a1aef12 59
chris 0:0ab65a1aef12 60 static void HciCallback(int device, int endpoint, int status, u8* data, int len, void* userData) {
chris 0:0ab65a1aef12 61 HCI* t = ((HCITransportUSB*)userData)->_target;
chris 0:0ab65a1aef12 62 if (t)
chris 0:0ab65a1aef12 63 t->HCIRecv(data,len);
chris 0:0ab65a1aef12 64 USBInterruptTransfer(device,0x81,data,MAX_HCL_SIZE,HciCallback,userData);
chris 0:0ab65a1aef12 65 }
chris 0:0ab65a1aef12 66
chris 0:0ab65a1aef12 67 static void AclCallback(int device, int endpoint, int status, u8* data, int len, void* userData) {
chris 0:0ab65a1aef12 68 HCI* t = ((HCITransportUSB*)userData)->_target;
chris 0:0ab65a1aef12 69 if (t)
chris 0:0ab65a1aef12 70 t->ACLRecv(data,len);
chris 0:0ab65a1aef12 71 USBBulkTransfer(device,0x82,data,MAX_ACL_SIZE,AclCallback,userData);
chris 0:0ab65a1aef12 72 }
chris 0:0ab65a1aef12 73
chris 0:0ab65a1aef12 74 virtual void HCISend(const u8* data, int len) {
chris 0:0ab65a1aef12 75 USBControlTransfer(_device,REQUEST_TYPE_CLASS, 0, 0, 0,(u8*)data,len);
chris 0:0ab65a1aef12 76 }
chris 0:0ab65a1aef12 77
chris 0:0ab65a1aef12 78 virtual void ACLSend(const u8* data, int len) {
chris 0:0ab65a1aef12 79 USBBulkTransfer(_device,0x02,(u8*)data,len);
chris 0:0ab65a1aef12 80 }
chris 0:0ab65a1aef12 81 };
chris 0:0ab65a1aef12 82
chris 0:0ab65a1aef12 83
chris 0:0ab65a1aef12 84 #define WII_REMOTE 0x042500
chris 0:0ab65a1aef12 85
chris 0:0ab65a1aef12 86 class HIDBluetooth {
chris 0:0ab65a1aef12 87 int _control; // Sockets for control (out) and interrupt (in)
chris 0:0ab65a1aef12 88 int _interrupt;
chris 0:0ab65a1aef12 89 int _devClass;
chris 0:0ab65a1aef12 90 BD_ADDR _addr;
chris 0:0ab65a1aef12 91 u8 _pad[2]; // Struct align
chris 0:0ab65a1aef12 92
chris 0:0ab65a1aef12 93 public:
chris 0:0ab65a1aef12 94 HIDBluetooth() : _control(0),_interrupt(0),_devClass(0) {};
chris 0:0ab65a1aef12 95
chris 0:0ab65a1aef12 96 bool InUse() {
chris 0:0ab65a1aef12 97 return _control != 0;
chris 0:0ab65a1aef12 98 }
chris 0:0ab65a1aef12 99
chris 0:0ab65a1aef12 100 static void OnHidInterrupt(int socket, SocketState state, const u8* data, int len, void* userData) {
chris 0:0ab65a1aef12 101 HIDBluetooth* t = (HIDBluetooth*)userData;
chris 0:0ab65a1aef12 102 if (data) {
chris 0:0ab65a1aef12 103 if (t->_devClass == WII_REMOTE && data[1] == 0x30) {
chris 0:0ab65a1aef12 104 //printf("================wii====================\n");
chris 0:0ab65a1aef12 105 t->Led();
chris 0:0ab65a1aef12 106 t->Hid(); // ask for accelerometer
chris 0:0ab65a1aef12 107 t->_devClass = 0;
chris 0:0ab65a1aef12 108 }
chris 0:0ab65a1aef12 109
chris 0:0ab65a1aef12 110 const u8* d = data;
chris 0:0ab65a1aef12 111 switch (d[1]) {
chris 0:0ab65a1aef12 112
chris 0:0ab65a1aef12 113 case 0x02: {
chris 0:0ab65a1aef12 114 int x = (signed char)d[3];
chris 0:0ab65a1aef12 115 int y = (signed char)d[4];
chris 0:0ab65a1aef12 116 printf("Mouse %2X dx:%d dy:%d\n",d[2],x,y);
chris 0:0ab65a1aef12 117 }
chris 0:0ab65a1aef12 118 break;
chris 0:0ab65a1aef12 119
chris 0:0ab65a1aef12 120 case 0x37: {
chris 0:0ab65a1aef12 121 wii_data((char*)&d[2]);
chris 0:0ab65a1aef12 122 /*
chris 0:0ab65a1aef12 123 char *dd = (char*)&d[2];
chris 0:0ab65a1aef12 124
chris 0:0ab65a1aef12 125 Wiimote wii;
chris 0:0ab65a1aef12 126 wii.decode(dd);
chris 0:0ab65a1aef12 127 wii.dump();
chris 0:0ab65a1aef12 128
chris 0:0ab65a1aef12 129 float dir = 0;
chris 0:0ab65a1aef12 130 if(wii.one) {
chris 0:0ab65a1aef12 131 dir = -1;
chris 0:0ab65a1aef12 132 }
chris 0:0ab65a1aef12 133 if(wii.two) {
chris 0:0ab65a1aef12 134 dir = 1;
chris 0:0ab65a1aef12 135 }
chris 0:0ab65a1aef12 136
chris 0:0ab65a1aef12 137 if (dir != 0) {
chris 0:0ab65a1aef12 138 float f = wii.wheel / 200.0f;
chris 0:0ab65a1aef12 139
chris 0:0ab65a1aef12 140 if(f < 0) {
chris 0:0ab65a1aef12 141 m3pi.left_motor(dir * (0.6 + abs(f)));
chris 0:0ab65a1aef12 142 m3pi.right_motor(dir * (0.6 - (abs(f) / 2)));
chris 0:0ab65a1aef12 143 } else {
chris 0:0ab65a1aef12 144 m3pi.right_motor(dir * (0.6 + abs(f)));
chris 0:0ab65a1aef12 145 m3pi.left_motor(dir * (0.6 - (abs(f) / 2)));
chris 0:0ab65a1aef12 146 }
chris 0:0ab65a1aef12 147 } else {
chris 0:0ab65a1aef12 148 m3pi.left_motor(0);
chris 0:0ab65a1aef12 149 m3pi.right_motor(0);
chris 0:0ab65a1aef12 150 }
chris 0:0ab65a1aef12 151
chris 0:0ab65a1aef12 152 */
chris 0:0ab65a1aef12 153 }
chris 0:0ab65a1aef12 154 }
chris 0:0ab65a1aef12 155 }
chris 0:0ab65a1aef12 156 }
chris 0:0ab65a1aef12 157
chris 0:0ab65a1aef12 158 static void OnHidControl(int socket, SocketState state, const u8* data, int len, void* userData) {
chris 0:0ab65a1aef12 159 printf("OnHidControl\n");
chris 0:0ab65a1aef12 160 if (data)
chris 0:0ab65a1aef12 161 printHex(data,len);
chris 0:0ab65a1aef12 162 }
chris 0:0ab65a1aef12 163
chris 0:0ab65a1aef12 164 void Open(BD_ADDR* bdAddr, inquiry_info* info) {
chris 0:0ab65a1aef12 165 printf("L2CAPAddr size %d\n",sizeof(L2CAPAddr));
chris 0:0ab65a1aef12 166 _addr = *bdAddr;
chris 0:0ab65a1aef12 167 L2CAPAddr sockAddr;
chris 0:0ab65a1aef12 168 sockAddr.bdaddr = _addr;
chris 0:0ab65a1aef12 169 sockAddr.psm = L2CAP_PSM_HID_INTR;
chris 0:0ab65a1aef12 170 printf("Socket_Open size %d\n",sizeof(L2CAPAddr));
chris 0:0ab65a1aef12 171 _interrupt = Socket_Open(SOCKET_L2CAP,&sockAddr.hdr,OnHidInterrupt,this);
chris 0:0ab65a1aef12 172 sockAddr.psm = L2CAP_PSM_HID_CNTL;
chris 0:0ab65a1aef12 173 _control = Socket_Open(SOCKET_L2CAP,&sockAddr.hdr,OnHidControl,this);
chris 0:0ab65a1aef12 174
chris 0:0ab65a1aef12 175 printfBytes("OPEN DEVICE CLASS",info->dev_class,3);
chris 0:0ab65a1aef12 176 _devClass = (info->dev_class[0] << 16) | (info->dev_class[1] << 8) | info->dev_class[2];
chris 0:0ab65a1aef12 177 }
chris 0:0ab65a1aef12 178
chris 0:0ab65a1aef12 179 void Close() {
chris 0:0ab65a1aef12 180 if (_control)
chris 0:0ab65a1aef12 181 Socket_Close(_control);
chris 0:0ab65a1aef12 182 if (_interrupt)
chris 0:0ab65a1aef12 183 Socket_Close(_interrupt);
chris 0:0ab65a1aef12 184 _control = _interrupt = 0;
chris 0:0ab65a1aef12 185 }
chris 0:0ab65a1aef12 186
chris 0:0ab65a1aef12 187 void Led(int id = 0x10) {
chris 0:0ab65a1aef12 188 u8 led[3] = {0x52, 0x11, id};
chris 0:0ab65a1aef12 189 if (_control)
chris 0:0ab65a1aef12 190 Socket_Send(_control,led,3);
chris 0:0ab65a1aef12 191 }
chris 0:0ab65a1aef12 192
chris 0:0ab65a1aef12 193 void Hid(int report = 0x37) {
chris 0:0ab65a1aef12 194 u8 hid[4] = { 0x52, 0x12, 0x00, report };
chris 0:0ab65a1aef12 195 if (_control != -1)
chris 0:0ab65a1aef12 196 Socket_Send(_control,hid,4);
chris 0:0ab65a1aef12 197 }
chris 0:0ab65a1aef12 198 };
chris 0:0ab65a1aef12 199
chris 0:0ab65a1aef12 200
chris 0:0ab65a1aef12 201 HCI* gHCI = 0;
chris 0:0ab65a1aef12 202
chris 0:0ab65a1aef12 203 #define MAX_HID_DEVICES 8
chris 0:0ab65a1aef12 204
chris 0:0ab65a1aef12 205 class ShellApp {
chris 0:0ab65a1aef12 206 char _line[64];
chris 0:0ab65a1aef12 207 HIDBluetooth _hids[MAX_HID_DEVICES];
chris 0:0ab65a1aef12 208
chris 0:0ab65a1aef12 209 public:
chris 0:0ab65a1aef12 210 void Ready() {
chris 0:0ab65a1aef12 211 printf("HIDBluetooth %d\n",sizeof(HIDBluetooth));
chris 0:0ab65a1aef12 212 memset(_hids,0,sizeof(_hids));
chris 0:0ab65a1aef12 213 Inquiry();
chris 0:0ab65a1aef12 214
chris 0:0ab65a1aef12 215 }
chris 0:0ab65a1aef12 216
chris 0:0ab65a1aef12 217 // We have connected to a device
chris 0:0ab65a1aef12 218 void ConnectionComplete(HCI* hci, connection_info* info) {
chris 0:0ab65a1aef12 219 printf("ConnectionComplete ");
chris 0:0ab65a1aef12 220 BD_ADDR* a = &info->bdaddr;
chris 0:0ab65a1aef12 221 //printf(a);
chris 0:0ab65a1aef12 222 BTDevice* bt = hci->Find(a);
chris 0:0ab65a1aef12 223 HIDBluetooth* hid = NewHIDBluetooth();
chris 0:0ab65a1aef12 224 printf("%08x %08x\n",bt,hid);
chris 0:0ab65a1aef12 225 if (hid)
chris 0:0ab65a1aef12 226 hid->Open(a,&bt->_info);
chris 0:0ab65a1aef12 227 }
chris 0:0ab65a1aef12 228
chris 0:0ab65a1aef12 229 HIDBluetooth* NewHIDBluetooth() {
chris 0:0ab65a1aef12 230 for (int i = 0; i < MAX_HID_DEVICES; i++)
chris 0:0ab65a1aef12 231 if (!_hids[i].InUse())
chris 0:0ab65a1aef12 232 return _hids+i;
chris 0:0ab65a1aef12 233 return 0;
chris 0:0ab65a1aef12 234 }
chris 0:0ab65a1aef12 235
chris 0:0ab65a1aef12 236 void ConnectDevices() {
chris 0:0ab65a1aef12 237 BTDevice* devs[8];
chris 0:0ab65a1aef12 238 int count = gHCI->GetDevices(devs,8);
chris 0:0ab65a1aef12 239 for (int i = 0; i < count; i++) {
chris 0:0ab65a1aef12 240 printfBytes("DEVICE CLASS",devs[i]->_info.dev_class,3);
chris 0:0ab65a1aef12 241 if (devs[i]->_handle == 0) {
chris 0:0ab65a1aef12 242 BD_ADDR* bd = &devs[i]->_info.bdaddr;
chris 0:0ab65a1aef12 243 printf("Connecting to ");
chris 0:0ab65a1aef12 244 //printf(bd);
chris 0:0ab65a1aef12 245 printf("\n");
chris 0:0ab65a1aef12 246 gHCI->CreateConnection(bd);
chris 0:0ab65a1aef12 247 }
chris 0:0ab65a1aef12 248 }
chris 0:0ab65a1aef12 249 }
chris 0:0ab65a1aef12 250 /*
chris 0:0ab65a1aef12 251 const char* ReadLine() {
chris 0:0ab65a1aef12 252 int i;
chris 0:0ab65a1aef12 253 for (i = 0; i < 255; ) {
chris 0:0ab65a1aef12 254 USBLoop();
chris 0:0ab65a1aef12 255 int c = GetConsoleChar();
chris 0:0ab65a1aef12 256 if (c == -1)
chris 0:0ab65a1aef12 257 continue;
chris 0:0ab65a1aef12 258 if (c == '\n' || c == 13)
chris 0:0ab65a1aef12 259 break;
chris 0:0ab65a1aef12 260 _line[i++] = c;
chris 0:0ab65a1aef12 261 }
chris 0:0ab65a1aef12 262 _line[i] = 0;
chris 0:0ab65a1aef12 263 return _line;
chris 0:0ab65a1aef12 264 }
chris 0:0ab65a1aef12 265 */
chris 0:0ab65a1aef12 266 void Inquiry() {
chris 0:0ab65a1aef12 267 printf("Inquiry..\n");
chris 0:0ab65a1aef12 268 gHCI->Inquiry();
chris 0:0ab65a1aef12 269 }
chris 0:0ab65a1aef12 270
chris 0:0ab65a1aef12 271 void List() {
chris 0:0ab65a1aef12 272 #if 0
chris 0:0ab65a1aef12 273 printf("%d devices\n",_deviceCount);
chris 0:0ab65a1aef12 274 for (int i = 0; i < _deviceCount; i++) {
chris 0:0ab65a1aef12 275 printf(&_devices[i].info.bdaddr);
chris 0:0ab65a1aef12 276 printf("\n");
chris 0:0ab65a1aef12 277 }
chris 0:0ab65a1aef12 278 #endif
chris 0:0ab65a1aef12 279 }
chris 0:0ab65a1aef12 280
chris 0:0ab65a1aef12 281 void Connect() {
chris 0:0ab65a1aef12 282 ConnectDevices();
chris 0:0ab65a1aef12 283 }
chris 0:0ab65a1aef12 284
chris 0:0ab65a1aef12 285 void Disconnect() {
chris 0:0ab65a1aef12 286 gHCI->DisconnectAll();
chris 0:0ab65a1aef12 287 }
chris 0:0ab65a1aef12 288
chris 0:0ab65a1aef12 289 void CloseMouse() {
chris 0:0ab65a1aef12 290 }
chris 0:0ab65a1aef12 291
chris 0:0ab65a1aef12 292 void Quit() {
chris 0:0ab65a1aef12 293 CloseMouse();
chris 0:0ab65a1aef12 294 }
chris 0:0ab65a1aef12 295
chris 0:0ab65a1aef12 296 };
chris 0:0ab65a1aef12 297
chris 0:0ab65a1aef12 298 // Instance
chris 0:0ab65a1aef12 299 ShellApp gApp;
chris 0:0ab65a1aef12 300
chris 0:0ab65a1aef12 301 static int HciCallback(HCI* hci, HCI_CALLBACK_EVENT evt, const u8* data, int len) {
chris 0:0ab65a1aef12 302 switch (evt) {
chris 0:0ab65a1aef12 303 case CALLBACK_READY:
chris 0:0ab65a1aef12 304 printf("CALLBACK_READY\n");
chris 0:0ab65a1aef12 305 gApp.Ready();
chris 0:0ab65a1aef12 306 break;
chris 0:0ab65a1aef12 307
chris 0:0ab65a1aef12 308 case CALLBACK_INQUIRY_RESULT:
chris 0:0ab65a1aef12 309 printf("CALLBACK_INQUIRY_RESULT ");
chris 0:0ab65a1aef12 310 //printf((BD_ADDR*)data);
chris 0:0ab65a1aef12 311 printf("\n");
chris 0:0ab65a1aef12 312 break;
chris 0:0ab65a1aef12 313
chris 0:0ab65a1aef12 314 case CALLBACK_INQUIRY_DONE:
chris 0:0ab65a1aef12 315 printf("CALLBACK_INQUIRY_DONE\n");
chris 0:0ab65a1aef12 316 gApp.ConnectDevices();
chris 0:0ab65a1aef12 317 break;
chris 0:0ab65a1aef12 318
chris 0:0ab65a1aef12 319 case CALLBACK_REMOTE_NAME: {
chris 0:0ab65a1aef12 320 BD_ADDR* addr = (BD_ADDR*)data;
chris 0:0ab65a1aef12 321 const char* name = (const char*)(data + 6);
chris 0:0ab65a1aef12 322 //printf(addr);
chris 0:0ab65a1aef12 323 printf(" % s\n",name);
chris 0:0ab65a1aef12 324 }
chris 0:0ab65a1aef12 325 break;
chris 0:0ab65a1aef12 326
chris 0:0ab65a1aef12 327 case CALLBACK_CONNECTION_COMPLETE:
chris 0:0ab65a1aef12 328 gApp.ConnectionComplete(hci,(connection_info*)data);
chris 0:0ab65a1aef12 329 break;
chris 0:0ab65a1aef12 330 };
chris 0:0ab65a1aef12 331 return 0;
chris 0:0ab65a1aef12 332 }
chris 0:0ab65a1aef12 333
chris 0:0ab65a1aef12 334 // these should be placed in the DMA SRAM
chris 0:0ab65a1aef12 335 typedef struct {
chris 0:0ab65a1aef12 336 u8 _hciBuffer[MAX_HCL_SIZE];
chris 0:0ab65a1aef12 337 u8 _aclBuffer[MAX_ACL_SIZE];
chris 0:0ab65a1aef12 338 } SRAMPlacement;
chris 0:0ab65a1aef12 339
chris 0:0ab65a1aef12 340 HCITransportUSB _HCITransportUSB;
chris 0:0ab65a1aef12 341 HCI _HCI;
chris 0:0ab65a1aef12 342
chris 0:0ab65a1aef12 343 u8* USBGetBuffer(u32* len);
chris 0:0ab65a1aef12 344 int OnBluetoothInsert(int device) {
chris 0:0ab65a1aef12 345 printf("Bluetooth inserted of %d\n",device);
chris 0:0ab65a1aef12 346 u32 sramLen;
chris 0:0ab65a1aef12 347 u8* sram = USBGetBuffer(&sramLen);
chris 0:0ab65a1aef12 348 sram = (u8*)(((u32)sram + 1023) & ~1023);
chris 0:0ab65a1aef12 349 SRAMPlacement* s = (SRAMPlacement*)sram;
chris 0:0ab65a1aef12 350 _HCITransportUSB.Open(device,s->_hciBuffer,s->_aclBuffer);
chris 0:0ab65a1aef12 351 _HCI.Open(&_HCITransportUSB,HciCallback);
chris 0:0ab65a1aef12 352 RegisterSocketHandler(SOCKET_L2CAP,&_HCI);
chris 0:0ab65a1aef12 353 gHCI = &_HCI;
chris 0:0ab65a1aef12 354 gApp.Inquiry();
chris 0:0ab65a1aef12 355 return 0;
chris 0:0ab65a1aef12 356 }
chris 0:0ab65a1aef12 357