ORTP-L_WiiRemoteTest

Dependencies:   Motordriver mbed FatFileSystem

Fork of WallbotTypeN by Junichi Katsu

Committer:
passionvirus
Date:
Fri Mar 29 09:05:28 2013 +0000
Revision:
1:df4118878dc4
Parent:
0:425791fe4b42
init

Who changed what in which revision?

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