Using at Craft Club

Dependencies:   FatFileSystem mbed

Committer:
Quoli
Date:
Tue Jan 27 17:06:52 2015 +0000
Revision:
1:f0b59bec1d9b
Parent:
0:606b230e5b4a
Using at Craft Club

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