Dependents:   Test_Wiimote

Committer:
bediyap
Date:
Sat Dec 17 06:53:39 2011 +0000
Revision:
2:5c2bfbd63297
Parent:
0:f6f434d9a03a
Child:
3:37e5ebd509ea
Add Wii rumble, led on/off support

Who changed what in which revision?

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