A USB/360deg Rotational device, communicating via blue-tooth, test code

Dependencies:   FatFileSystem mbed

Committer:
lolpcc
Date:
Fri Dec 21 11:37:38 2012 +0000
Revision:
0:87da38093be9
Used to test the Lazy Susan at work, hence the A2D code in Utils.cpp

Who changed what in which revision?

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