takayuki ikai / Mbed 2 deprecated BlueWii

Dependencies:   mbed

Committer:
ikaii
Date:
Mon Dec 06 17:02:12 2010 +0000
Revision:
0:010465683d59

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ikaii 0:010465683d59 1
ikaii 0:010465683d59 2 /*
ikaii 0:010465683d59 3 Copyright (c) 2010 Peter Barrett
ikaii 0:010465683d59 4
ikaii 0:010465683d59 5 Permission is hereby granted, free of charge, to any person obtaining a copy
ikaii 0:010465683d59 6 of this software and associated documentation files (the "Software"), to deal
ikaii 0:010465683d59 7 in the Software without restriction, including without limitation the rights
ikaii 0:010465683d59 8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
ikaii 0:010465683d59 9 copies of the Software, and to permit persons to whom the Software is
ikaii 0:010465683d59 10 furnished to do so, subject to the following conditions:
ikaii 0:010465683d59 11
ikaii 0:010465683d59 12 The above copyright notice and this permission notice shall be included in
ikaii 0:010465683d59 13 all copies or substantial portions of the Software.
ikaii 0:010465683d59 14
ikaii 0:010465683d59 15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
ikaii 0:010465683d59 16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
ikaii 0:010465683d59 17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
ikaii 0:010465683d59 18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
ikaii 0:010465683d59 19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
ikaii 0:010465683d59 20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
ikaii 0:010465683d59 21 THE SOFTWARE.
ikaii 0:010465683d59 22 */
ikaii 0:010465683d59 23
ikaii 0:010465683d59 24 #include <stdio.h>
ikaii 0:010465683d59 25 #include <stdlib.h>
ikaii 0:010465683d59 26 #include <stdio.h>
ikaii 0:010465683d59 27 #include <string.h>
ikaii 0:010465683d59 28
ikaii 0:010465683d59 29 #include "Utils.h"
ikaii 0:010465683d59 30 #include "USBHost.h"
ikaii 0:010465683d59 31 #include "hci.h"
ikaii 0:010465683d59 32 #include "m3pi.h"
ikaii 0:010465683d59 33
ikaii 0:010465683d59 34 /*
ikaii 0:010465683d59 35 3pi configure
ikaii 0:010465683d59 36 */
ikaii 0:010465683d59 37 m3pi m3pi(p8,p9,p10);
ikaii 0:010465683d59 38
ikaii 0:010465683d59 39 float sokudo = 0;
ikaii 0:010465683d59 40
ikaii 0:010465683d59 41
ikaii 0:010465683d59 42 void printf(const BD_ADDR* addr)
ikaii 0:010465683d59 43 {
ikaii 0:010465683d59 44 const u8* a = addr->addr;
ikaii 0:010465683d59 45 printf("%02X:%02X:%02X:%02X:%02X:%02X",a[5],a[4],a[3],a[2],a[1],a[0]);
ikaii 0:010465683d59 46 }
ikaii 0:010465683d59 47
ikaii 0:010465683d59 48 #define MAX_HCL_SIZE 260
ikaii 0:010465683d59 49 #define MAX_ACL_SIZE 400
ikaii 0:010465683d59 50
ikaii 0:010465683d59 51 class HCITransportUSB : public HCITransport
ikaii 0:010465683d59 52 {
ikaii 0:010465683d59 53 int _device;
ikaii 0:010465683d59 54 u8* _hciBuffer;
ikaii 0:010465683d59 55 u8* _aclBuffer;
ikaii 0:010465683d59 56
ikaii 0:010465683d59 57 public:
ikaii 0:010465683d59 58 void Open(int device, u8* hciBuffer, u8* aclBuffer)
ikaii 0:010465683d59 59 {
ikaii 0:010465683d59 60 _device = device;
ikaii 0:010465683d59 61 _hciBuffer = hciBuffer;
ikaii 0:010465683d59 62 _aclBuffer = aclBuffer;
ikaii 0:010465683d59 63 USBInterruptTransfer(_device,0x81,_hciBuffer,MAX_HCL_SIZE,HciCallback,this);
ikaii 0:010465683d59 64 USBBulkTransfer(_device,0x82,_aclBuffer,MAX_ACL_SIZE,AclCallback,this);
ikaii 0:010465683d59 65 }
ikaii 0:010465683d59 66
ikaii 0:010465683d59 67 static void HciCallback(int device, int endpoint, int status, u8* data, int len, void* userData)
ikaii 0:010465683d59 68 {
ikaii 0:010465683d59 69 HCI* t = ((HCITransportUSB*)userData)->_target;
ikaii 0:010465683d59 70 if (t)
ikaii 0:010465683d59 71 t->HCIRecv(data,len);
ikaii 0:010465683d59 72 USBInterruptTransfer(device,0x81,data,MAX_HCL_SIZE,HciCallback,userData);
ikaii 0:010465683d59 73 }
ikaii 0:010465683d59 74
ikaii 0:010465683d59 75 static void AclCallback(int device, int endpoint, int status, u8* data, int len, void* userData)
ikaii 0:010465683d59 76 {
ikaii 0:010465683d59 77 HCI* t = ((HCITransportUSB*)userData)->_target;
ikaii 0:010465683d59 78 if (t)
ikaii 0:010465683d59 79 t->ACLRecv(data,len);
ikaii 0:010465683d59 80 USBBulkTransfer(device,0x82,data,MAX_ACL_SIZE,AclCallback,userData);
ikaii 0:010465683d59 81 }
ikaii 0:010465683d59 82
ikaii 0:010465683d59 83 virtual void HCISend(const u8* data, int len)
ikaii 0:010465683d59 84 {
ikaii 0:010465683d59 85 USBControlTransfer(_device,REQUEST_TYPE_CLASS, 0, 0, 0,(u8*)data,len);
ikaii 0:010465683d59 86 }
ikaii 0:010465683d59 87
ikaii 0:010465683d59 88 virtual void ACLSend(const u8* data, int len)
ikaii 0:010465683d59 89 {
ikaii 0:010465683d59 90 USBBulkTransfer(_device,0x02,(u8*)data,len);
ikaii 0:010465683d59 91 }
ikaii 0:010465683d59 92 };
ikaii 0:010465683d59 93
ikaii 0:010465683d59 94
ikaii 0:010465683d59 95 #define WII_REMOTE 0x042500
ikaii 0:010465683d59 96
ikaii 0:010465683d59 97 class HIDBluetooth
ikaii 0:010465683d59 98 {
ikaii 0:010465683d59 99 int _control; // Sockets for control (out) and interrupt (in)
ikaii 0:010465683d59 100 int _interrupt;
ikaii 0:010465683d59 101 int _devClass;
ikaii 0:010465683d59 102 BD_ADDR _addr;
ikaii 0:010465683d59 103 u8 _pad[2]; // Struct align
ikaii 0:010465683d59 104
ikaii 0:010465683d59 105 public:
ikaii 0:010465683d59 106 HIDBluetooth() : _control(0),_interrupt(0),_devClass(0) {};
ikaii 0:010465683d59 107
ikaii 0:010465683d59 108 bool InUse()
ikaii 0:010465683d59 109 {
ikaii 0:010465683d59 110 return _control != 0;
ikaii 0:010465683d59 111 }
ikaii 0:010465683d59 112
ikaii 0:010465683d59 113 static void OnHidInterrupt(int socket, SocketState state, const u8* data, int len, void* userData)
ikaii 0:010465683d59 114 {
ikaii 0:010465683d59 115 HIDBluetooth* t = (HIDBluetooth*)userData;
ikaii 0:010465683d59 116 if (data)
ikaii 0:010465683d59 117 {
ikaii 0:010465683d59 118 if (t->_devClass == WII_REMOTE && data[1] == 0x30)
ikaii 0:010465683d59 119 {
ikaii 0:010465683d59 120 //printf("================wii====================\n");
ikaii 0:010465683d59 121 t->Led();
ikaii 0:010465683d59 122 t->Hid(); // ask for accelerometer
ikaii 0:010465683d59 123 t->_devClass = 0;
ikaii 0:010465683d59 124 }
ikaii 0:010465683d59 125
ikaii 0:010465683d59 126 const u8* d = data;
ikaii 0:010465683d59 127 switch (d[1])
ikaii 0:010465683d59 128 {
ikaii 0:010465683d59 129 case 0x02:
ikaii 0:010465683d59 130 {
ikaii 0:010465683d59 131 //int x = (signed char)d[3];
ikaii 0:010465683d59 132 //int y = (signed char)d[4];
ikaii 0:010465683d59 133 //printf("Mouse %2X dx:%d dy:%d\n",d[2],x,y);
ikaii 0:010465683d59 134 }
ikaii 0:010465683d59 135 break;
ikaii 0:010465683d59 136
ikaii 0:010465683d59 137 case 0x37: // Accelerometer http://wiki.wiimoteproject.com/Reports
ikaii 0:010465683d59 138 {
ikaii 0:010465683d59 139 int pad = (d[2] & 0x9F) | ((d[3] & 0x9F) << 8);
ikaii 0:010465683d59 140 //int x = (d[2] & 0x60) >> 5 | d[4] << 2;
ikaii 0:010465683d59 141 //int y = (d[3] & 0x20) >> 4 | d[5] << 2;
ikaii 0:010465683d59 142 //int z = (d[3] & 0x40) >> 5 | d[6] << 2;
ikaii 0:010465683d59 143
ikaii 0:010465683d59 144 //printf("%d,%d,%d\n",d[4],d[5],d[6]);
ikaii 0:010465683d59 145 //printf("WII %04X %d %d %d\n",pad,x,y,z);
ikaii 0:010465683d59 146
ikaii 0:010465683d59 147 //int buttonUp = (pad & 8);
ikaii 0:010465683d59 148 //int buttonDown = (pad & 4);
ikaii 0:010465683d59 149 int buttonLeft = (pad & 1);
ikaii 0:010465683d59 150 int buttonRight = (pad & 2);
ikaii 0:010465683d59 151 int buttonA = (pad & 2048);
ikaii 0:010465683d59 152 int buttonHome = (pad & 32768);
ikaii 0:010465683d59 153 int buttonPlus = (pad & 16);
ikaii 0:010465683d59 154 //int buttonMinus = (pad & 4096);
ikaii 0:010465683d59 155 int button1= (pad & 512);
ikaii 0:010465683d59 156 int button2= (pad & 256);
ikaii 0:010465683d59 157
ikaii 0:010465683d59 158 float handle = ((float)d[5]-(float)128)/(float)92;
ikaii 0:010465683d59 159 if(handle > 0.5){
ikaii 0:010465683d59 160 handle = 0.5;
ikaii 0:010465683d59 161 }
ikaii 0:010465683d59 162 if(handle < -0.5){
ikaii 0:010465683d59 163 handle = -0.5;
ikaii 0:010465683d59 164 }
ikaii 0:010465683d59 165
ikaii 0:010465683d59 166 if(button1){
ikaii 0:010465683d59 167 sokudo = 0;
ikaii 0:010465683d59 168 m3pi.left(0.3);
ikaii 0:010465683d59 169 }
ikaii 0:010465683d59 170 else if(button2){
ikaii 0:010465683d59 171 sokudo = 0;
ikaii 0:010465683d59 172 m3pi.right(0.3);
ikaii 0:010465683d59 173 }
ikaii 0:010465683d59 174 else if(buttonA){
ikaii 0:010465683d59 175 m3pi.stop();
ikaii 0:010465683d59 176 sokudo = 0;
ikaii 0:010465683d59 177 }
ikaii 0:010465683d59 178 else if((buttonHome)||(buttonPlus)){
ikaii 0:010465683d59 179 m3pi.locate(0,1);
ikaii 0:010465683d59 180 m3pi.printf("%f\n",m3pi.battery());
ikaii 0:010465683d59 181 }
ikaii 0:010465683d59 182 else if(buttonRight){
ikaii 0:010465683d59 183 sokudo = sokudo + (float)0.008;
ikaii 0:010465683d59 184 if(sokudo > 0.7){
ikaii 0:010465683d59 185 sokudo = 0.7;
ikaii 0:010465683d59 186 }
ikaii 0:010465683d59 187 if(sokudo > 0){
ikaii 0:010465683d59 188 m3pi.forward(sokudo);
ikaii 0:010465683d59 189 }
ikaii 0:010465683d59 190 else{
ikaii 0:010465683d59 191 m3pi.backward(abs(sokudo));
ikaii 0:010465683d59 192 }
ikaii 0:010465683d59 193 }
ikaii 0:010465683d59 194 else if(buttonLeft){
ikaii 0:010465683d59 195 sokudo = sokudo - (float)0.008;
ikaii 0:010465683d59 196 if(sokudo < -0.7){
ikaii 0:010465683d59 197 sokudo = -0.7;
ikaii 0:010465683d59 198 }
ikaii 0:010465683d59 199 if(sokudo > 0){
ikaii 0:010465683d59 200 m3pi.forward(sokudo);
ikaii 0:010465683d59 201 }
ikaii 0:010465683d59 202 else{
ikaii 0:010465683d59 203 m3pi.backward(abs(sokudo));
ikaii 0:010465683d59 204 }
ikaii 0:010465683d59 205 }
ikaii 0:010465683d59 206 if(handle > 0){
ikaii 0:010465683d59 207 if(sokudo > 0){
ikaii 0:010465683d59 208 m3pi.left_motor(sokudo + handle);
ikaii 0:010465683d59 209 }
ikaii 0:010465683d59 210 else if(sokudo < 0){
ikaii 0:010465683d59 211 m3pi.left_motor(sokudo - handle);
ikaii 0:010465683d59 212 }
ikaii 0:010465683d59 213 }
ikaii 0:010465683d59 214 else if(handle < 0){
ikaii 0:010465683d59 215 if(sokudo > 0){
ikaii 0:010465683d59 216 m3pi.right_motor(sokudo - handle);
ikaii 0:010465683d59 217 }
ikaii 0:010465683d59 218 else if(sokudo < 0){
ikaii 0:010465683d59 219 m3pi.right_motor(sokudo + handle);
ikaii 0:010465683d59 220 }
ikaii 0:010465683d59 221 }
ikaii 0:010465683d59 222
ikaii 0:010465683d59 223 /* for key
ikaii 0:010465683d59 224 if(buttonRight){
ikaii 0:010465683d59 225 m3pi.forward(0.5);
ikaii 0:010465683d59 226 }
ikaii 0:010465683d59 227 else if(buttonLeft){
ikaii 0:010465683d59 228 m3pi.backward(0.5);
ikaii 0:010465683d59 229 }
ikaii 0:010465683d59 230 else if(buttonDown){
ikaii 0:010465683d59 231 m3pi.left_motor(0.3);
ikaii 0:010465683d59 232 m3pi.right_motor(0.5);
ikaii 0:010465683d59 233 }
ikaii 0:010465683d59 234 else if(buttonUp){
ikaii 0:010465683d59 235 m3pi.left_motor(0.5);
ikaii 0:010465683d59 236 m3pi.right_motor(0.3);
ikaii 0:010465683d59 237 }
ikaii 0:010465683d59 238 else if(button1){
ikaii 0:010465683d59 239 m3pi.left(0.3);
ikaii 0:010465683d59 240 }
ikaii 0:010465683d59 241 else if(button2){
ikaii 0:010465683d59 242 m3pi.right(0.3);
ikaii 0:010465683d59 243 }
ikaii 0:010465683d59 244 */
ikaii 0:010465683d59 245
ikaii 0:010465683d59 246 if(buttonA){
ikaii 0:010465683d59 247 m3pi.stop();
ikaii 0:010465683d59 248 }
ikaii 0:010465683d59 249
ikaii 0:010465683d59 250 }
ikaii 0:010465683d59 251 break;
ikaii 0:010465683d59 252 default:
ikaii 0:010465683d59 253 printHex(data,len);
ikaii 0:010465683d59 254 }
ikaii 0:010465683d59 255 }
ikaii 0:010465683d59 256 }
ikaii 0:010465683d59 257
ikaii 0:010465683d59 258 static void OnHidControl(int socket, SocketState state, const u8* data, int len, void* userData)
ikaii 0:010465683d59 259 {
ikaii 0:010465683d59 260 printf("OnHidControl\n");
ikaii 0:010465683d59 261 if (data)
ikaii 0:010465683d59 262 printHex(data,len);
ikaii 0:010465683d59 263 }
ikaii 0:010465683d59 264
ikaii 0:010465683d59 265 void Open(BD_ADDR* bdAddr, inquiry_info* info)
ikaii 0:010465683d59 266 {
ikaii 0:010465683d59 267 printf("L2CAPAddr size %d\n",sizeof(L2CAPAddr));
ikaii 0:010465683d59 268 _addr = *bdAddr;
ikaii 0:010465683d59 269 L2CAPAddr sockAddr;
ikaii 0:010465683d59 270 sockAddr.bdaddr = _addr;
ikaii 0:010465683d59 271 sockAddr.psm = L2CAP_PSM_HID_INTR;
ikaii 0:010465683d59 272 printf("Socket_Open size %d\n",sizeof(L2CAPAddr));
ikaii 0:010465683d59 273 _interrupt = Socket_Open(SOCKET_L2CAP,&sockAddr.hdr,OnHidInterrupt,this);
ikaii 0:010465683d59 274 sockAddr.psm = L2CAP_PSM_HID_CNTL;
ikaii 0:010465683d59 275 _control = Socket_Open(SOCKET_L2CAP,&sockAddr.hdr,OnHidControl,this);
ikaii 0:010465683d59 276
ikaii 0:010465683d59 277 printfBytes("OPEN DEVICE CLASS",info->dev_class,3);
ikaii 0:010465683d59 278 _devClass = (info->dev_class[0] << 16) | (info->dev_class[1] << 8) | info->dev_class[2];
ikaii 0:010465683d59 279 }
ikaii 0:010465683d59 280
ikaii 0:010465683d59 281 void Close()
ikaii 0:010465683d59 282 {
ikaii 0:010465683d59 283 if (_control)
ikaii 0:010465683d59 284 Socket_Close(_control);
ikaii 0:010465683d59 285 if (_interrupt)
ikaii 0:010465683d59 286 Socket_Close(_interrupt);
ikaii 0:010465683d59 287 _control = _interrupt = 0;
ikaii 0:010465683d59 288 }
ikaii 0:010465683d59 289
ikaii 0:010465683d59 290 void Led(int id = 0x10)
ikaii 0:010465683d59 291 {
ikaii 0:010465683d59 292 u8 led[3] = {0x52, 0x11, id};
ikaii 0:010465683d59 293 if (_control)
ikaii 0:010465683d59 294 Socket_Send(_control,led,3);
ikaii 0:010465683d59 295 }
ikaii 0:010465683d59 296
ikaii 0:010465683d59 297 void Hid(int report = 0x37)
ikaii 0:010465683d59 298 {
ikaii 0:010465683d59 299 u8 hid[4] = { 0x52, 0x12, 0x00, report };
ikaii 0:010465683d59 300 if (_control != -1)
ikaii 0:010465683d59 301 Socket_Send(_control,hid,4);
ikaii 0:010465683d59 302 }
ikaii 0:010465683d59 303 };
ikaii 0:010465683d59 304
ikaii 0:010465683d59 305
ikaii 0:010465683d59 306 HCI* gHCI = 0;
ikaii 0:010465683d59 307
ikaii 0:010465683d59 308 #define MAX_HID_DEVICES 8
ikaii 0:010465683d59 309
ikaii 0:010465683d59 310 int GetConsoleChar();
ikaii 0:010465683d59 311 class ShellApp
ikaii 0:010465683d59 312 {
ikaii 0:010465683d59 313 char _line[64];
ikaii 0:010465683d59 314 HIDBluetooth _hids[MAX_HID_DEVICES];
ikaii 0:010465683d59 315
ikaii 0:010465683d59 316 public:
ikaii 0:010465683d59 317 void Ready()
ikaii 0:010465683d59 318 {
ikaii 0:010465683d59 319 printf("HIDBluetooth %d\n",sizeof(HIDBluetooth));
ikaii 0:010465683d59 320 memset(_hids,0,sizeof(_hids));
ikaii 0:010465683d59 321 Inquiry();
ikaii 0:010465683d59 322
ikaii 0:010465683d59 323 }
ikaii 0:010465683d59 324
ikaii 0:010465683d59 325 // We have connected to a device
ikaii 0:010465683d59 326 void ConnectionComplete(HCI* hci, connection_info* info)
ikaii 0:010465683d59 327 {
ikaii 0:010465683d59 328 printf("ConnectionComplete ");
ikaii 0:010465683d59 329 BD_ADDR* a = &info->bdaddr;
ikaii 0:010465683d59 330 printf(a);
ikaii 0:010465683d59 331 BTDevice* bt = hci->Find(a);
ikaii 0:010465683d59 332 HIDBluetooth* hid = NewHIDBluetooth();
ikaii 0:010465683d59 333 printf("%08x %08x\n",bt,hid);
ikaii 0:010465683d59 334 if (hid)
ikaii 0:010465683d59 335 hid->Open(a,&bt->_info);
ikaii 0:010465683d59 336 }
ikaii 0:010465683d59 337
ikaii 0:010465683d59 338 HIDBluetooth* NewHIDBluetooth()
ikaii 0:010465683d59 339 {
ikaii 0:010465683d59 340 for (int i = 0; i < MAX_HID_DEVICES; i++)
ikaii 0:010465683d59 341 if (!_hids[i].InUse())
ikaii 0:010465683d59 342 return _hids+i;
ikaii 0:010465683d59 343 return 0;
ikaii 0:010465683d59 344 }
ikaii 0:010465683d59 345
ikaii 0:010465683d59 346 void ConnectDevices()
ikaii 0:010465683d59 347 {
ikaii 0:010465683d59 348 BTDevice* devs[8];
ikaii 0:010465683d59 349 int count = gHCI->GetDevices(devs,8);
ikaii 0:010465683d59 350 for (int i = 0; i < count; i++)
ikaii 0:010465683d59 351 {
ikaii 0:010465683d59 352 printfBytes("DEVICE CLASS",devs[i]->_info.dev_class,3);
ikaii 0:010465683d59 353 if (devs[i]->_handle == 0)
ikaii 0:010465683d59 354 {
ikaii 0:010465683d59 355 BD_ADDR* bd = &devs[i]->_info.bdaddr;
ikaii 0:010465683d59 356 printf("Connecting to ");
ikaii 0:010465683d59 357 printf(bd);
ikaii 0:010465683d59 358 printf("\n");
ikaii 0:010465683d59 359 gHCI->CreateConnection(bd);
ikaii 0:010465683d59 360 }
ikaii 0:010465683d59 361 }
ikaii 0:010465683d59 362 }
ikaii 0:010465683d59 363
ikaii 0:010465683d59 364 const char* ReadLine()
ikaii 0:010465683d59 365 {
ikaii 0:010465683d59 366 int i;
ikaii 0:010465683d59 367 for (i = 0; i < 255; )
ikaii 0:010465683d59 368 {
ikaii 0:010465683d59 369 USBLoop();
ikaii 0:010465683d59 370 int c = GetConsoleChar();
ikaii 0:010465683d59 371 if (c == -1)
ikaii 0:010465683d59 372 continue;
ikaii 0:010465683d59 373 if (c == '\n' || c == 13)
ikaii 0:010465683d59 374 break;
ikaii 0:010465683d59 375 _line[i++] = c;
ikaii 0:010465683d59 376 }
ikaii 0:010465683d59 377 _line[i] = 0;
ikaii 0:010465683d59 378 return _line;
ikaii 0:010465683d59 379 }
ikaii 0:010465683d59 380
ikaii 0:010465683d59 381 void Inquiry()
ikaii 0:010465683d59 382 {
ikaii 0:010465683d59 383 printf("Inquiry..\n");
ikaii 0:010465683d59 384 gHCI->Inquiry();
ikaii 0:010465683d59 385 }
ikaii 0:010465683d59 386
ikaii 0:010465683d59 387 void List()
ikaii 0:010465683d59 388 {
ikaii 0:010465683d59 389 #if 0
ikaii 0:010465683d59 390 printf("%d devices\n",_deviceCount);
ikaii 0:010465683d59 391 for (int i = 0; i < _deviceCount; i++)
ikaii 0:010465683d59 392 {
ikaii 0:010465683d59 393 printf(&_devices[i].info.bdaddr);
ikaii 0:010465683d59 394 printf("\n");
ikaii 0:010465683d59 395 }
ikaii 0:010465683d59 396 #endif
ikaii 0:010465683d59 397 }
ikaii 0:010465683d59 398
ikaii 0:010465683d59 399 void Connect()
ikaii 0:010465683d59 400 {
ikaii 0:010465683d59 401 ConnectDevices();
ikaii 0:010465683d59 402 }
ikaii 0:010465683d59 403
ikaii 0:010465683d59 404 void Disconnect()
ikaii 0:010465683d59 405 {
ikaii 0:010465683d59 406 gHCI->DisconnectAll();
ikaii 0:010465683d59 407 }
ikaii 0:010465683d59 408
ikaii 0:010465683d59 409 void CloseMouse()
ikaii 0:010465683d59 410 {
ikaii 0:010465683d59 411 }
ikaii 0:010465683d59 412
ikaii 0:010465683d59 413 void Quit()
ikaii 0:010465683d59 414 {
ikaii 0:010465683d59 415 CloseMouse();
ikaii 0:010465683d59 416 }
ikaii 0:010465683d59 417
ikaii 0:010465683d59 418 void Run()
ikaii 0:010465683d59 419 {
ikaii 0:010465683d59 420 for(;;)
ikaii 0:010465683d59 421 {
ikaii 0:010465683d59 422 const char* cmd = ReadLine();
ikaii 0:010465683d59 423 if (strcmp(cmd,"scan") == 0 || strcmp(cmd,"inquiry") == 0)
ikaii 0:010465683d59 424 Inquiry();
ikaii 0:010465683d59 425 else if (strcmp(cmd,"ls") == 0)
ikaii 0:010465683d59 426 List();
ikaii 0:010465683d59 427 else if (strcmp(cmd,"connect") == 0)
ikaii 0:010465683d59 428 Connect();
ikaii 0:010465683d59 429 else if (strcmp(cmd,"disconnect") == 0)
ikaii 0:010465683d59 430 Disconnect();
ikaii 0:010465683d59 431 else if (strcmp(cmd,"q")== 0)
ikaii 0:010465683d59 432 {
ikaii 0:010465683d59 433 Quit();
ikaii 0:010465683d59 434 break;
ikaii 0:010465683d59 435 } else {
ikaii 0:010465683d59 436 printf("eh? %s\n",cmd);
ikaii 0:010465683d59 437 }
ikaii 0:010465683d59 438 }
ikaii 0:010465683d59 439 }
ikaii 0:010465683d59 440 };
ikaii 0:010465683d59 441
ikaii 0:010465683d59 442 // Instance
ikaii 0:010465683d59 443 ShellApp gApp;
ikaii 0:010465683d59 444
ikaii 0:010465683d59 445 static int HciCallback(HCI* hci, HCI_CALLBACK_EVENT evt, const u8* data, int len)
ikaii 0:010465683d59 446 {
ikaii 0:010465683d59 447 switch (evt)
ikaii 0:010465683d59 448 {
ikaii 0:010465683d59 449 case CALLBACK_READY:
ikaii 0:010465683d59 450 printf("CALLBACK_READY\n");
ikaii 0:010465683d59 451 gApp.Ready();
ikaii 0:010465683d59 452 break;
ikaii 0:010465683d59 453
ikaii 0:010465683d59 454 case CALLBACK_INQUIRY_RESULT:
ikaii 0:010465683d59 455 printf("CALLBACK_INQUIRY_RESULT ");
ikaii 0:010465683d59 456 printf((BD_ADDR*)data);
ikaii 0:010465683d59 457 printf("\n");
ikaii 0:010465683d59 458 break;
ikaii 0:010465683d59 459
ikaii 0:010465683d59 460 case CALLBACK_INQUIRY_DONE:
ikaii 0:010465683d59 461 printf("CALLBACK_INQUIRY_DONE\n");
ikaii 0:010465683d59 462 gApp.ConnectDevices();
ikaii 0:010465683d59 463 break;
ikaii 0:010465683d59 464
ikaii 0:010465683d59 465 case CALLBACK_REMOTE_NAME:
ikaii 0:010465683d59 466 {
ikaii 0:010465683d59 467 BD_ADDR* addr = (BD_ADDR*)data;
ikaii 0:010465683d59 468 const char* name = (const char*)(data + 6);
ikaii 0:010465683d59 469 printf(addr);
ikaii 0:010465683d59 470 printf(" % s\n",name);
ikaii 0:010465683d59 471 }
ikaii 0:010465683d59 472 break;
ikaii 0:010465683d59 473
ikaii 0:010465683d59 474 case CALLBACK_CONNECTION_COMPLETE:
ikaii 0:010465683d59 475 gApp.ConnectionComplete(hci,(connection_info*)data);
ikaii 0:010465683d59 476 break;
ikaii 0:010465683d59 477 };
ikaii 0:010465683d59 478 return 0;
ikaii 0:010465683d59 479 }
ikaii 0:010465683d59 480
ikaii 0:010465683d59 481 // these should be placed in the DMA SRAM
ikaii 0:010465683d59 482 typedef struct
ikaii 0:010465683d59 483 {
ikaii 0:010465683d59 484 u8 _hciBuffer[MAX_HCL_SIZE];
ikaii 0:010465683d59 485 u8 _aclBuffer[MAX_ACL_SIZE];
ikaii 0:010465683d59 486 } SRAMPlacement;
ikaii 0:010465683d59 487
ikaii 0:010465683d59 488 HCITransportUSB _HCITransportUSB;
ikaii 0:010465683d59 489 HCI _HCI;
ikaii 0:010465683d59 490
ikaii 0:010465683d59 491 u8* USBGetBuffer(u32* len);
ikaii 0:010465683d59 492 int OnBluetoothInsert(int device)
ikaii 0:010465683d59 493 {
ikaii 0:010465683d59 494 printf("Bluetooth inserted of %d\n",device);
ikaii 0:010465683d59 495 u32 sramLen;
ikaii 0:010465683d59 496 u8* sram = USBGetBuffer(&sramLen);
ikaii 0:010465683d59 497 sram = (u8*)(((u32)sram + 1023) & ~1023);
ikaii 0:010465683d59 498 SRAMPlacement* s = (SRAMPlacement*)sram;
ikaii 0:010465683d59 499 _HCITransportUSB.Open(device,s->_hciBuffer,s->_aclBuffer);
ikaii 0:010465683d59 500 _HCI.Open(&_HCITransportUSB,HciCallback);
ikaii 0:010465683d59 501 RegisterSocketHandler(SOCKET_L2CAP,&_HCI);
ikaii 0:010465683d59 502 gHCI = &_HCI;
ikaii 0:010465683d59 503 gApp.Inquiry();
ikaii 0:010465683d59 504 return 0;
ikaii 0:010465683d59 505 }
ikaii 0:010465683d59 506
ikaii 0:010465683d59 507 void TestShell()
ikaii 0:010465683d59 508 {
ikaii 0:010465683d59 509 USBInit();
ikaii 0:010465683d59 510 gApp.Run();
ikaii 0:010465683d59 511 }