うおーるぼっと用プログラム Wiiリモコンからのダイレクト操作モードのみ BlueUSBをベースに使用しています。

Dependencies:   BD6211F mbed SimpleFilter

Committer:
jksoft
Date:
Fri Apr 29 15:50:23 2011 +0000
Revision:
0:4f749f62c6d7

        

Who changed what in which revision?

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