BlueUSB and Waveplayer merged

Dependencies:   SDFileSystem mbed-rtos mbed wave_player

Fork of z_test_BlueUSBv1 by Stuart Kent

Committer:
ballaw
Date:
Tue Nov 18 22:26:33 2014 +0000
Revision:
3:146802bc7bb8
Parent:
1:12422708d6c8
h

Who changed what in which revision?

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