Fork BlueUSB lib for NHK robot contest 2014 TEU JAPAN

Dependencies:   C12832_lcd FatFileSystem TextLCD mbed

Fork of PS3_BlueUSB by Bart Janssens

Committer:
ppr2013G2
Date:
Fri Apr 11 15:56:07 2014 +0000
Revision:
2:2c4daaf8b15c
Parent:
1:335bce3448c3
final commit;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
BartJanssens 0:99a111b75cb4 1
BartJanssens 0:99a111b75cb4 2 /*
BartJanssens 0:99a111b75cb4 3 Copyright (c) 2010 Peter Barrett
BartJanssens 0:99a111b75cb4 4
BartJanssens 0:99a111b75cb4 5 Permission is hereby granted, free of charge, to any person obtaining a copy
BartJanssens 0:99a111b75cb4 6 of this software and associated documentation files (the "Software"), to deal
BartJanssens 0:99a111b75cb4 7 in the Software without restriction, including without limitation the rights
BartJanssens 0:99a111b75cb4 8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
BartJanssens 0:99a111b75cb4 9 copies of the Software, and to permit persons to whom the Software is
BartJanssens 0:99a111b75cb4 10 furnished to do so, subject to the following conditions:
BartJanssens 0:99a111b75cb4 11
BartJanssens 0:99a111b75cb4 12 The above copyright notice and this permission notice shall be included in
BartJanssens 0:99a111b75cb4 13 all copies or substantial portions of the Software.
BartJanssens 0:99a111b75cb4 14
BartJanssens 0:99a111b75cb4 15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
BartJanssens 0:99a111b75cb4 16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
BartJanssens 0:99a111b75cb4 17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
BartJanssens 0:99a111b75cb4 18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
BartJanssens 0:99a111b75cb4 19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
BartJanssens 0:99a111b75cb4 20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
BartJanssens 0:99a111b75cb4 21 THE SOFTWARE.
BartJanssens 0:99a111b75cb4 22 */
BartJanssens 0:99a111b75cb4 23
BartJanssens 0:99a111b75cb4 24 /*
BartJanssens 0:99a111b75cb4 25 Tue Apr 26 2011 Bart Janssens: added PS3 Bluetooth support
BartJanssens 0:99a111b75cb4 26 */
BartJanssens 0:99a111b75cb4 27
BartJanssens 0:99a111b75cb4 28 #include <stdio.h>
BartJanssens 0:99a111b75cb4 29 #include <stdlib.h>
BartJanssens 0:99a111b75cb4 30 #include <string.h>
BartJanssens 0:99a111b75cb4 31
BartJanssens 0:99a111b75cb4 32 #include "Utils.h"
BartJanssens 0:99a111b75cb4 33 #include "USBHost.h"
BartJanssens 0:99a111b75cb4 34 #include "hci.h"
BartJanssens 0:99a111b75cb4 35 #include "ps3.h"
ppr2013G2 1:335bce3448c3 36 #include "TextLCD.h"
BartJanssens 0:99a111b75cb4 37 #include "mbed.h"
BartJanssens 0:99a111b75cb4 38
ppr2013G2 1:335bce3448c3 39 //Serial sabertooth(p13,p14);
ppr2013G2 1:335bce3448c3 40 //TextLCD lcd(p24,p26,p27,p28,p29,p30);
ppr2013G2 1:335bce3448c3 41 //
ppr2013G2 1:335bce3448c3 42 //u8 map(u8 val, u8 b_min, u8 b_max, u8 a_min, u8 a_max)
ppr2013G2 1:335bce3448c3 43 //{
ppr2013G2 1:335bce3448c3 44 // return (val - b_max) * (a_min - a_max) / (b_min - b_max) + a_max;
ppr2013G2 1:335bce3448c3 45 //}
BartJanssens 0:99a111b75cb4 46
BartJanssens 0:99a111b75cb4 47 void printf(const BD_ADDR* addr)
BartJanssens 0:99a111b75cb4 48 {
BartJanssens 0:99a111b75cb4 49 const u8* a = addr->addr;
BartJanssens 0:99a111b75cb4 50 printf("%02X:%02X:%02X:%02X:%02X:%02X",a[5],a[4],a[3],a[2],a[1],a[0]);
BartJanssens 0:99a111b75cb4 51 }
BartJanssens 0:99a111b75cb4 52
BartJanssens 0:99a111b75cb4 53 #define MAX_HCL_SIZE 260
BartJanssens 0:99a111b75cb4 54 #define MAX_ACL_SIZE 400
BartJanssens 0:99a111b75cb4 55
BartJanssens 0:99a111b75cb4 56 class HCITransportUSB : public HCITransport
BartJanssens 0:99a111b75cb4 57 {
BartJanssens 0:99a111b75cb4 58 int _device;
BartJanssens 0:99a111b75cb4 59 u8* _hciBuffer;
BartJanssens 0:99a111b75cb4 60 u8* _aclBuffer;
BartJanssens 0:99a111b75cb4 61
BartJanssens 0:99a111b75cb4 62 public:
BartJanssens 0:99a111b75cb4 63 void Open(int device, u8* hciBuffer, u8* aclBuffer)
BartJanssens 0:99a111b75cb4 64 {
BartJanssens 0:99a111b75cb4 65 _device = device;
BartJanssens 0:99a111b75cb4 66 _hciBuffer = hciBuffer;
BartJanssens 0:99a111b75cb4 67 _aclBuffer = aclBuffer;
BartJanssens 0:99a111b75cb4 68 USBInterruptTransfer(_device,0x81,_hciBuffer,MAX_HCL_SIZE,HciCallback,this);
BartJanssens 0:99a111b75cb4 69 USBBulkTransfer(_device,0x82,_aclBuffer,MAX_ACL_SIZE,AclCallback,this);
BartJanssens 0:99a111b75cb4 70 }
BartJanssens 0:99a111b75cb4 71
BartJanssens 0:99a111b75cb4 72 static void HciCallback(int device, int endpoint, int status, u8* data, int len, void* userData)
BartJanssens 0:99a111b75cb4 73 {
BartJanssens 0:99a111b75cb4 74 HCI* t = ((HCITransportUSB*)userData)->_target;
BartJanssens 0:99a111b75cb4 75 if (t)
BartJanssens 0:99a111b75cb4 76 t->HCIRecv(data,len);
BartJanssens 0:99a111b75cb4 77 USBInterruptTransfer(device,0x81,data,MAX_HCL_SIZE,HciCallback,userData);
BartJanssens 0:99a111b75cb4 78 }
BartJanssens 0:99a111b75cb4 79
BartJanssens 0:99a111b75cb4 80 static void AclCallback(int device, int endpoint, int status, u8* data, int len, void* userData)
BartJanssens 0:99a111b75cb4 81 {
BartJanssens 0:99a111b75cb4 82 HCI* t = ((HCITransportUSB*)userData)->_target;
BartJanssens 0:99a111b75cb4 83 if (t)
BartJanssens 0:99a111b75cb4 84 t->ACLRecv(data,len);
BartJanssens 0:99a111b75cb4 85 USBBulkTransfer(device,0x82,data,MAX_ACL_SIZE,AclCallback,userData);
BartJanssens 0:99a111b75cb4 86 }
BartJanssens 0:99a111b75cb4 87
BartJanssens 0:99a111b75cb4 88 virtual void HCISend(const u8* data, int len)
BartJanssens 0:99a111b75cb4 89 {
BartJanssens 0:99a111b75cb4 90 USBControlTransfer(_device,REQUEST_TYPE_CLASS, 0, 0, 0,(u8*)data,len);
BartJanssens 0:99a111b75cb4 91 }
BartJanssens 0:99a111b75cb4 92
BartJanssens 0:99a111b75cb4 93 virtual void ACLSend(const u8* data, int len)
BartJanssens 0:99a111b75cb4 94 {
BartJanssens 0:99a111b75cb4 95 USBBulkTransfer(_device,0x02,(u8*)data,len);
BartJanssens 0:99a111b75cb4 96 }
BartJanssens 0:99a111b75cb4 97 };
BartJanssens 0:99a111b75cb4 98
BartJanssens 0:99a111b75cb4 99
BartJanssens 0:99a111b75cb4 100 #define WII_REMOTE 0x042500
BartJanssens 0:99a111b75cb4 101 #define PS3_REMOTE 0x080500
BartJanssens 0:99a111b75cb4 102
BartJanssens 0:99a111b75cb4 103 class HIDBluetooth
BartJanssens 0:99a111b75cb4 104 {
BartJanssens 0:99a111b75cb4 105 int _control; // Sockets for control (out) and interrupt (in)
BartJanssens 0:99a111b75cb4 106 int _interrupt;
BartJanssens 0:99a111b75cb4 107 int _devClass;
BartJanssens 0:99a111b75cb4 108 BD_ADDR _addr;
BartJanssens 0:99a111b75cb4 109 u8 _pad[2]; // Struct align
BartJanssens 0:99a111b75cb4 110 int _ready;
BartJanssens 0:99a111b75cb4 111 Timeout _timeout;
BartJanssens 0:99a111b75cb4 112 int _count;
BartJanssens 0:99a111b75cb4 113
BartJanssens 0:99a111b75cb4 114 public:
BartJanssens 0:99a111b75cb4 115 HIDBluetooth() : _control(0),_interrupt(0),_devClass(0), _ready(1) {};
BartJanssens 0:99a111b75cb4 116
BartJanssens 0:99a111b75cb4 117
BartJanssens 0:99a111b75cb4 118 bool InUse()
BartJanssens 0:99a111b75cb4 119 {
BartJanssens 0:99a111b75cb4 120 return _control != 0;
BartJanssens 0:99a111b75cb4 121 }
BartJanssens 0:99a111b75cb4 122
BartJanssens 0:99a111b75cb4 123 void attimeout()
BartJanssens 0:99a111b75cb4 124 {
BartJanssens 0:99a111b75cb4 125 printf("Timeout reached\r\n");
BartJanssens 0:99a111b75cb4 126 }
BartJanssens 0:99a111b75cb4 127
BartJanssens 0:99a111b75cb4 128 static void OnHidInterrupt(int socket, SocketState state,const u8* data, int len, void* userData)
BartJanssens 0:99a111b75cb4 129 {
BartJanssens 0:99a111b75cb4 130 HIDBluetooth* t = (HIDBluetooth*)userData;
BartJanssens 0:99a111b75cb4 131 t->_ready = 0;
BartJanssens 0:99a111b75cb4 132 if (data)
BartJanssens 0:99a111b75cb4 133 {
BartJanssens 0:99a111b75cb4 134 //printf("devClass = %06X \r\n",t->_devClass);
BartJanssens 0:99a111b75cb4 135 if (t->_devClass == WII_REMOTE && data[1] == 0x30)
BartJanssens 0:99a111b75cb4 136 {
BartJanssens 0:99a111b75cb4 137 printf("================wii====================\r\n");
BartJanssens 0:99a111b75cb4 138 t->WIILed();
BartJanssens 0:99a111b75cb4 139 t->WIIHid(); // ask for accelerometer
BartJanssens 0:99a111b75cb4 140 t->_devClass = 0;
BartJanssens 0:99a111b75cb4 141
BartJanssens 0:99a111b75cb4 142
BartJanssens 0:99a111b75cb4 143 const u8* d = data;
BartJanssens 0:99a111b75cb4 144 switch (d[1])
BartJanssens 0:99a111b75cb4 145 {
BartJanssens 0:99a111b75cb4 146 case 0x02:
BartJanssens 0:99a111b75cb4 147 {
BartJanssens 0:99a111b75cb4 148 int x = (signed char)d[3];
BartJanssens 0:99a111b75cb4 149 int y = (signed char)d[4];
BartJanssens 0:99a111b75cb4 150 printf("Mouse %2X dx:%d dy:%d\r\n",d[2],x,y);
BartJanssens 0:99a111b75cb4 151 }
BartJanssens 0:99a111b75cb4 152 break;
BartJanssens 0:99a111b75cb4 153
BartJanssens 0:99a111b75cb4 154 case 0x37: // Accelerometer http://wiki.wiimoteproject.com/Reports
BartJanssens 0:99a111b75cb4 155 {
BartJanssens 0:99a111b75cb4 156 int pad = (d[2] & 0x9F) | ((d[3] & 0x9F) << 8);
BartJanssens 0:99a111b75cb4 157 int x = (d[2] & 0x60) >> 5 | d[4] << 2;
BartJanssens 0:99a111b75cb4 158 int y = (d[3] & 0x20) >> 4 | d[5] << 2;
BartJanssens 0:99a111b75cb4 159 int z = (d[3] & 0x40) >> 5 | d[6] << 2;
BartJanssens 0:99a111b75cb4 160 printf("WII %04X %d %d %d\r\n",pad,x,y,z);
BartJanssens 0:99a111b75cb4 161 }
BartJanssens 0:99a111b75cb4 162 break;
BartJanssens 0:99a111b75cb4 163 default:
BartJanssens 0:99a111b75cb4 164 printHex(data,len);
BartJanssens 0:99a111b75cb4 165 }
BartJanssens 0:99a111b75cb4 166 }
BartJanssens 0:99a111b75cb4 167 if (t->_devClass == PS3_REMOTE)
BartJanssens 0:99a111b75cb4 168 {
ppr2013G2 1:335bce3448c3 169 // t->_count ++;
ppr2013G2 1:335bce3448c3 170 // if (t->_count == 25) t->_count = 1;
ppr2013G2 1:335bce3448c3 171 // ParsePs3Result((data + 1), sizeof(ps3report),t->_count);
ppr2013G2 1:335bce3448c3 172 //0-> both stop
ppr2013G2 1:335bce3448c3 173 //1~63 -> left back max->min
ppr2013G2 1:335bce3448c3 174 //64-> left stop
ppr2013G2 1:335bce3448c3 175 //65~127->left forward min->max
ppr2013G2 1:335bce3448c3 176
ppr2013G2 1:335bce3448c3 177 //128~191->right back max=>min
ppr2013G2 1:335bce3448c3 178 //193~254->right forword min=>max
ppr2013G2 1:335bce3448c3 179 //192 ->right stop
ppr2013G2 1:335bce3448c3 180 // LeftStickY
ppr2013G2 1:335bce3448c3 181
ppr2013G2 1:335bce3448c3 182 // sabertooth.baud(19200);
ppr2013G2 1:335bce3448c3 183 // sabertooth.putc(64+20);
ppr2013G2 1:335bce3448c3 184 // sabertooth.putc(192+20);
ppr2013G2 1:335bce3448c3 185
ppr2013G2 1:335bce3448c3 186 // sabertooth.putc(map(((ps3report*)(data+1))->LeftStickY, 0, 255, 0, 127));
ppr2013G2 1:335bce3448c3 187 // sabertooth.putc(map(((ps3report*)(data+1))->LeftStickY, 0, 255, 193,254));
ppr2013G2 1:335bce3448c3 188 // printf("motor 1 %u \n motor 2 %u",map(((ps3report*)(data+1))->LeftStickY, 0, 255, 0, 127),
ppr2013G2 1:335bce3448c3 189 // map(((ps3report*)(data+1))->LeftStickY, 0, 255, 0, 127));
ppr2013G2 1:335bce3448c3 190 // lcd.cls();
ppr2013G2 1:335bce3448c3 191 // lcd.printf("motor 1 %u \n motor 2 %u",map(((ps3report*)(data+1))->LeftStickY, 0, 255, 0, 127),
ppr2013G2 1:335bce3448c3 192 // map(((ps3report*)(data+1))->LeftStickY, 0, 255, 0, 127));
ppr2013G2 1:335bce3448c3 193 // ParsePs3Result((data + 1), sizeof(ps3report),t->_count);
BartJanssens 0:99a111b75cb4 194 }
BartJanssens 0:99a111b75cb4 195 else {
BartJanssens 0:99a111b75cb4 196 printf("Not yet implemented \r\n");
BartJanssens 0:99a111b75cb4 197
BartJanssens 0:99a111b75cb4 198 }
BartJanssens 0:99a111b75cb4 199 }
BartJanssens 0:99a111b75cb4 200
BartJanssens 0:99a111b75cb4 201 }
BartJanssens 0:99a111b75cb4 202
BartJanssens 0:99a111b75cb4 203 static void OnHidControl(int socket, SocketState state, const u8* data, int len, void* userData)
BartJanssens 0:99a111b75cb4 204 {
BartJanssens 0:99a111b75cb4 205 //HIDBluetooth* t = (HIDBluetooth*)userData;
BartJanssens 0:99a111b75cb4 206
BartJanssens 0:99a111b75cb4 207 //printf("OnHidControl\r\n");
BartJanssens 0:99a111b75cb4 208
BartJanssens 0:99a111b75cb4 209 }
BartJanssens 0:99a111b75cb4 210
BartJanssens 0:99a111b75cb4 211 static void OnAcceptCtrlSocket(int socket, SocketState state, const u8* data, int len, void* userData)
BartJanssens 0:99a111b75cb4 212 {
BartJanssens 0:99a111b75cb4 213 HIDBluetooth* t = (HIDBluetooth*)userData;
BartJanssens 0:99a111b75cb4 214
BartJanssens 0:99a111b75cb4 215 t->_control = socket;
BartJanssens 0:99a111b75cb4 216
BartJanssens 0:99a111b75cb4 217 //printf("Ctrl Socket number = %d \r\n", socket);
BartJanssens 0:99a111b75cb4 218
BartJanssens 0:99a111b75cb4 219 Socket_Accept(socket,OnHidControl,userData);
BartJanssens 0:99a111b75cb4 220 u8 enable[6] = {
BartJanssens 0:99a111b75cb4 221 0x53, /* HIDP_TRANS_SET_REPORT | HIDP_DATA_RTYPE_FEATURE */
BartJanssens 0:99a111b75cb4 222 0xf4, 0x42, 0x03, 0x00, 0x00 };
BartJanssens 0:99a111b75cb4 223 Socket_Send(socket,enable,6);
BartJanssens 0:99a111b75cb4 224
BartJanssens 0:99a111b75cb4 225
BartJanssens 0:99a111b75cb4 226 }
BartJanssens 0:99a111b75cb4 227
BartJanssens 0:99a111b75cb4 228 static void OnAcceptDataSocket(int socket, SocketState state, const u8* data, int len, void* userData)
BartJanssens 0:99a111b75cb4 229 {
BartJanssens 0:99a111b75cb4 230 HIDBluetooth* t = (HIDBluetooth*)userData;
BartJanssens 0:99a111b75cb4 231 t->_interrupt = socket;
BartJanssens 0:99a111b75cb4 232
BartJanssens 0:99a111b75cb4 233 printf("OnAcceptDataSocket: Data Socket accept here \r\n");
BartJanssens 0:99a111b75cb4 234 printf("OnAcceptDataSocket: Data Socket number = %d \r\n", socket);
BartJanssens 0:99a111b75cb4 235
BartJanssens 0:99a111b75cb4 236 //printf("OnAcceptDataSocket: Ctrl Socket = %d Data Socket accept = %d \r\n", t->_control, t->_interrupt);
BartJanssens 0:99a111b75cb4 237
BartJanssens 0:99a111b75cb4 238 Socket_Accept(socket,OnHidInterrupt,userData);
BartJanssens 0:99a111b75cb4 239
BartJanssens 0:99a111b75cb4 240 //if (data)
BartJanssens 0:99a111b75cb4 241 // printHex(data,len);
BartJanssens 0:99a111b75cb4 242 }
BartJanssens 0:99a111b75cb4 243
BartJanssens 0:99a111b75cb4 244 void Open(BD_ADDR* bdAddr, inquiry_info* info)
BartJanssens 0:99a111b75cb4 245 {
BartJanssens 0:99a111b75cb4 246 printf("L2CAPAddr size %d\r\n",sizeof(L2CAPAddr));
BartJanssens 0:99a111b75cb4 247 _addr = *bdAddr;
BartJanssens 0:99a111b75cb4 248 L2CAPAddr sockAddr;
BartJanssens 0:99a111b75cb4 249 sockAddr.bdaddr = _addr;
BartJanssens 0:99a111b75cb4 250 sockAddr.psm = L2CAP_PSM_HID_INTR;
BartJanssens 0:99a111b75cb4 251 printf("Socket_Open size %d\r\n",sizeof(L2CAPAddr));
BartJanssens 0:99a111b75cb4 252 _interrupt = Socket_Open(SOCKET_L2CAP,&sockAddr.hdr,OnHidInterrupt,this);
BartJanssens 0:99a111b75cb4 253 sockAddr.psm = L2CAP_PSM_HID_CNTL;
BartJanssens 0:99a111b75cb4 254 _control = Socket_Open(SOCKET_L2CAP,&sockAddr.hdr,OnHidControl,this);
BartJanssens 0:99a111b75cb4 255
BartJanssens 0:99a111b75cb4 256 printfBytes("OPEN DEVICE CLASS",info->dev_class,3);
BartJanssens 0:99a111b75cb4 257 _devClass = (info->dev_class[0] << 16) | (info->dev_class[1] << 8) | info->dev_class[2];
BartJanssens 0:99a111b75cb4 258 }
BartJanssens 0:99a111b75cb4 259
BartJanssens 0:99a111b75cb4 260 void Listen(BD_ADDR* bdAddr, inquiry_info* info)
BartJanssens 0:99a111b75cb4 261 {
BartJanssens 0:99a111b75cb4 262 int result;
BartJanssens 0:99a111b75cb4 263 //printf("L2CAPAddr size %d\r\n",sizeof(L2CAPAddr));
BartJanssens 0:99a111b75cb4 264 _addr = *bdAddr;
BartJanssens 0:99a111b75cb4 265 L2CAPAddr sockAddr;
BartJanssens 0:99a111b75cb4 266 sockAddr.bdaddr = _addr;
BartJanssens 0:99a111b75cb4 267
BartJanssens 0:99a111b75cb4 268 _count = 1;
BartJanssens 0:99a111b75cb4 269 _ready = 1;
BartJanssens 0:99a111b75cb4 270
BartJanssens 0:99a111b75cb4 271 // set a buffer for the led&rumble report
BartJanssens 0:99a111b75cb4 272 u8 abuffer[37] = {
BartJanssens 0:99a111b75cb4 273 0x52, /* HIDP_TRANS_SET_REPORT | HIDP_DATA_RTYPE_OUTPUT */
BartJanssens 0:99a111b75cb4 274 0x01,
BartJanssens 0:99a111b75cb4 275 0x00, 0x00, 0x00, 0x00, 0x00,
BartJanssens 0:99a111b75cb4 276 0x00, 0x00, 0x00, 0x00, 0x1E,
BartJanssens 0:99a111b75cb4 277 0xff, 0x27, 0x10, 0x00, 0x32,
BartJanssens 0:99a111b75cb4 278 0xff, 0x27, 0x10, 0x00, 0x32,
BartJanssens 0:99a111b75cb4 279 0xff, 0x27, 0x10, 0x00, 0x32,
BartJanssens 0:99a111b75cb4 280 0xff, 0x27, 0x10, 0x00, 0x32,
BartJanssens 0:99a111b75cb4 281 0x00, 0x00, 0x00, 0x00, 0x00,
BartJanssens 0:99a111b75cb4 282 };
BartJanssens 0:99a111b75cb4 283 memcpy(_ledrumble,abuffer,37);
BartJanssens 0:99a111b75cb4 284
BartJanssens 0:99a111b75cb4 285 result = Socket_Listen(SOCKET_L2CAP,L2CAP_PSM_HID_CNTL,OnAcceptCtrlSocket,this);
BartJanssens 0:99a111b75cb4 286 printf("listen return code ctrl socket = %d \r\n", result);
BartJanssens 0:99a111b75cb4 287
BartJanssens 0:99a111b75cb4 288
BartJanssens 0:99a111b75cb4 289 result = Socket_Listen(SOCKET_L2CAP,L2CAP_PSM_HID_INTR,OnAcceptDataSocket,this);
BartJanssens 0:99a111b75cb4 290 printf("listen return code data socket = %d \r\n", result);
BartJanssens 0:99a111b75cb4 291
BartJanssens 0:99a111b75cb4 292 printfBytes("OPEN DEVICE CLASS",info->dev_class,3);
BartJanssens 0:99a111b75cb4 293 _devClass = (info->dev_class[0] << 16) | (info->dev_class[1] << 8) | info->dev_class[2];
BartJanssens 0:99a111b75cb4 294
BartJanssens 0:99a111b75cb4 295 while (_ready){ // wait till we receive data from PS3Hid
BartJanssens 0:99a111b75cb4 296 USBLoop();
BartJanssens 0:99a111b75cb4 297 }
BartJanssens 0:99a111b75cb4 298 USBLoop();
BartJanssens 0:99a111b75cb4 299
BartJanssens 0:99a111b75cb4 300
BartJanssens 0:99a111b75cb4 301
BartJanssens 0:99a111b75cb4 302 }
BartJanssens 0:99a111b75cb4 303
BartJanssens 0:99a111b75cb4 304 void Close()
BartJanssens 0:99a111b75cb4 305 {
BartJanssens 0:99a111b75cb4 306 if (_control)
BartJanssens 0:99a111b75cb4 307 Socket_Close(_control);
BartJanssens 0:99a111b75cb4 308 if (_interrupt)
BartJanssens 0:99a111b75cb4 309 Socket_Close(_interrupt);
BartJanssens 0:99a111b75cb4 310 _control = _interrupt = 0;
BartJanssens 0:99a111b75cb4 311 }
BartJanssens 0:99a111b75cb4 312
BartJanssens 0:99a111b75cb4 313 void WIILed(int id = 0x10)
BartJanssens 0:99a111b75cb4 314 {
BartJanssens 0:99a111b75cb4 315 u8 led[3] = {0x52, 0x11, id};
BartJanssens 0:99a111b75cb4 316 if (_control)
BartJanssens 0:99a111b75cb4 317 Socket_Send(_control,led,3);
BartJanssens 0:99a111b75cb4 318 }
BartJanssens 0:99a111b75cb4 319
BartJanssens 0:99a111b75cb4 320 void WIIHid(int report = 0x37)
BartJanssens 0:99a111b75cb4 321 {
BartJanssens 0:99a111b75cb4 322 u8 hid[4] = { 0x52, 0x12, 0x00, report };
BartJanssens 0:99a111b75cb4 323 if (_control != -1)
BartJanssens 0:99a111b75cb4 324 Socket_Send(_control,hid,4);
BartJanssens 0:99a111b75cb4 325 }
BartJanssens 0:99a111b75cb4 326
BartJanssens 0:99a111b75cb4 327
BartJanssens 0:99a111b75cb4 328
BartJanssens 0:99a111b75cb4 329 void Ps3Hid_Led(int i)
BartJanssens 0:99a111b75cb4 330 {
BartJanssens 0:99a111b75cb4 331 printf("Ps3Hid led %d\r\n",i);
BartJanssens 0:99a111b75cb4 332 u8 ledpattern[7] = {0x02, 0x04, 0x08, 0x10, 0x12, 0x14, 0x18 };
BartJanssens 0:99a111b75cb4 333 u8 buf[37];
BartJanssens 0:99a111b75cb4 334
BartJanssens 0:99a111b75cb4 335 if (i < 7) _ledrumble[11] = ledpattern[i];
BartJanssens 0:99a111b75cb4 336 memcpy(buf, _ledrumble, 37);
BartJanssens 0:99a111b75cb4 337
BartJanssens 0:99a111b75cb4 338 if (_control != -1)
BartJanssens 0:99a111b75cb4 339 Socket_Send(_control,buf,37);
BartJanssens 0:99a111b75cb4 340 wait_ms(4);
BartJanssens 0:99a111b75cb4 341 }
BartJanssens 0:99a111b75cb4 342
BartJanssens 0:99a111b75cb4 343 void Ps3Hid_Rumble(u8 duration_right, u8 power_right, u8 duration_left, u8 power_left )
BartJanssens 0:99a111b75cb4 344 {
BartJanssens 0:99a111b75cb4 345 printf("Ps3Hid rumble \r\n");
BartJanssens 0:99a111b75cb4 346 u8 buf[37];
BartJanssens 0:99a111b75cb4 347
BartJanssens 0:99a111b75cb4 348 memcpy(buf, _ledrumble, 37);
BartJanssens 0:99a111b75cb4 349 buf[3] = duration_right;
BartJanssens 0:99a111b75cb4 350 buf[4] = power_right;
BartJanssens 0:99a111b75cb4 351 buf[5] = duration_left;
BartJanssens 0:99a111b75cb4 352 buf[6] = power_left;
BartJanssens 0:99a111b75cb4 353
BartJanssens 0:99a111b75cb4 354 if (_control != -1)
BartJanssens 0:99a111b75cb4 355 Socket_Send(_control,buf,37);
BartJanssens 0:99a111b75cb4 356 wait_ms(4);
BartJanssens 0:99a111b75cb4 357 }
BartJanssens 0:99a111b75cb4 358
BartJanssens 0:99a111b75cb4 359 int CheckHID()
BartJanssens 0:99a111b75cb4 360 {
BartJanssens 0:99a111b75cb4 361 printf("CheckHID \r\n");
BartJanssens 0:99a111b75cb4 362 printf("Ctrl = %d Intr = %d \r\n", _control, _interrupt);
BartJanssens 0:99a111b75cb4 363 if (_control < 1) {
BartJanssens 0:99a111b75cb4 364 printf("Ps3 not ready \r\n");
BartJanssens 0:99a111b75cb4 365 return 1;
BartJanssens 0:99a111b75cb4 366 } else {
BartJanssens 0:99a111b75cb4 367 printf("Ps3 ready %d \r\n",_control);
BartJanssens 0:99a111b75cb4 368 return 0;
BartJanssens 0:99a111b75cb4 369 }
BartJanssens 0:99a111b75cb4 370 }
BartJanssens 0:99a111b75cb4 371 private:
BartJanssens 0:99a111b75cb4 372 u8 _ledrumble[37] ;
BartJanssens 0:99a111b75cb4 373 };
BartJanssens 0:99a111b75cb4 374
BartJanssens 0:99a111b75cb4 375
BartJanssens 0:99a111b75cb4 376 HCI* gHCI = 0;
BartJanssens 0:99a111b75cb4 377
BartJanssens 0:99a111b75cb4 378 #define MAX_HID_DEVICES 8
BartJanssens 0:99a111b75cb4 379
BartJanssens 0:99a111b75cb4 380 int GetConsoleChar();
BartJanssens 0:99a111b75cb4 381 class ShellApp
BartJanssens 0:99a111b75cb4 382 {
BartJanssens 0:99a111b75cb4 383 char _line[64];
BartJanssens 0:99a111b75cb4 384 HIDBluetooth _hids[MAX_HID_DEVICES];
BartJanssens 0:99a111b75cb4 385
BartJanssens 0:99a111b75cb4 386 public:
BartJanssens 0:99a111b75cb4 387 void Ready()
BartJanssens 0:99a111b75cb4 388 {
BartJanssens 0:99a111b75cb4 389 printf("HIDBluetooth %d\r\n",sizeof(HIDBluetooth));
BartJanssens 0:99a111b75cb4 390 memset(_hids,0,sizeof(_hids));
BartJanssens 0:99a111b75cb4 391 //Inquiry();
BartJanssens 0:99a111b75cb4 392 Scan();
BartJanssens 0:99a111b75cb4 393 }
BartJanssens 0:99a111b75cb4 394
BartJanssens 0:99a111b75cb4 395 // We have connected to a device
BartJanssens 0:99a111b75cb4 396 void ConnectionComplete(HCI* hci, connection_info* info)
BartJanssens 0:99a111b75cb4 397 {
BartJanssens 0:99a111b75cb4 398 printf("ConnectionComplete ");
BartJanssens 0:99a111b75cb4 399 BD_ADDR* a = &info->bdaddr;
BartJanssens 0:99a111b75cb4 400 printf(a);
BartJanssens 0:99a111b75cb4 401 BTDevice* bt = hci->Find(a);
BartJanssens 0:99a111b75cb4 402 HIDBluetooth* hid = NewHIDBluetooth();
BartJanssens 0:99a111b75cb4 403 printf("%08x %08x\r\n",bt,hid);
BartJanssens 0:99a111b75cb4 404 if (hid)
BartJanssens 0:99a111b75cb4 405 hid->Listen(a,&bt->_info); // use Listen for PS3, Open for WII
BartJanssens 0:99a111b75cb4 406 hid->Ps3Hid_Led(0); // set led 1
BartJanssens 0:99a111b75cb4 407 hid->Ps3Hid_Rumble(0x20,0xff,0x20,0xff); // rumble
BartJanssens 0:99a111b75cb4 408
BartJanssens 0:99a111b75cb4 409 }
BartJanssens 0:99a111b75cb4 410
BartJanssens 0:99a111b75cb4 411 HIDBluetooth* NewHIDBluetooth()
BartJanssens 0:99a111b75cb4 412 {
BartJanssens 0:99a111b75cb4 413 for (int i = 0; i < MAX_HID_DEVICES; i++)
BartJanssens 0:99a111b75cb4 414 if (!_hids[i].InUse())
BartJanssens 0:99a111b75cb4 415 return _hids+i;
BartJanssens 0:99a111b75cb4 416 return 0;
BartJanssens 0:99a111b75cb4 417 }
BartJanssens 0:99a111b75cb4 418
BartJanssens 0:99a111b75cb4 419 void ConnectDevices()
BartJanssens 0:99a111b75cb4 420 {
BartJanssens 0:99a111b75cb4 421 BTDevice* devs[8];
BartJanssens 0:99a111b75cb4 422 int count = gHCI->GetDevices(devs,8);
BartJanssens 0:99a111b75cb4 423 for (int i = 0; i < count; i++)
BartJanssens 0:99a111b75cb4 424 {
BartJanssens 0:99a111b75cb4 425 printfBytes("DEVICE CLASS",devs[i]->_info.dev_class,3);
BartJanssens 0:99a111b75cb4 426 if (devs[i]->_handle == 0)
BartJanssens 0:99a111b75cb4 427 {
BartJanssens 0:99a111b75cb4 428 BD_ADDR* bd = &devs[i]->_info.bdaddr;
BartJanssens 0:99a111b75cb4 429 printf("Connecting to ");
BartJanssens 0:99a111b75cb4 430 printf(bd);
BartJanssens 0:99a111b75cb4 431 printf("\r\n");
BartJanssens 0:99a111b75cb4 432 gHCI->CreateConnection(bd);
BartJanssens 0:99a111b75cb4 433 }
BartJanssens 0:99a111b75cb4 434 }
BartJanssens 0:99a111b75cb4 435 }
BartJanssens 0:99a111b75cb4 436
BartJanssens 0:99a111b75cb4 437 const char* ReadLine()
BartJanssens 0:99a111b75cb4 438 {
BartJanssens 0:99a111b75cb4 439 int i;
BartJanssens 0:99a111b75cb4 440 for (i = 0; i < 255; )
BartJanssens 0:99a111b75cb4 441 {
BartJanssens 0:99a111b75cb4 442 USBLoop();
BartJanssens 0:99a111b75cb4 443 int c = GetConsoleChar();
BartJanssens 0:99a111b75cb4 444 if (c == -1)
BartJanssens 0:99a111b75cb4 445 continue;
BartJanssens 0:99a111b75cb4 446 if (c == '\n' || c == 13)
BartJanssens 0:99a111b75cb4 447 break;
BartJanssens 0:99a111b75cb4 448 _line[i++] = c;
BartJanssens 0:99a111b75cb4 449 }
BartJanssens 0:99a111b75cb4 450 _line[i] = 0;
BartJanssens 0:99a111b75cb4 451 return _line;
BartJanssens 0:99a111b75cb4 452 }
BartJanssens 0:99a111b75cb4 453
BartJanssens 0:99a111b75cb4 454 void Inquiry()
BartJanssens 0:99a111b75cb4 455 {
BartJanssens 0:99a111b75cb4 456 printf("Inquiry..\r\n");
BartJanssens 0:99a111b75cb4 457 gHCI->Inquiry();
BartJanssens 0:99a111b75cb4 458 }
BartJanssens 0:99a111b75cb4 459
BartJanssens 0:99a111b75cb4 460 void List()
BartJanssens 0:99a111b75cb4 461 {
BartJanssens 0:99a111b75cb4 462 #if 0
BartJanssens 0:99a111b75cb4 463 printf("%d devices\r\n",_deviceCount);
BartJanssens 0:99a111b75cb4 464 for (int i = 0; i < _deviceCount; i++)
BartJanssens 0:99a111b75cb4 465 {
BartJanssens 0:99a111b75cb4 466 printf(&_devices[i].info.bdaddr);
BartJanssens 0:99a111b75cb4 467 printf("\r\n");
BartJanssens 0:99a111b75cb4 468 }
BartJanssens 0:99a111b75cb4 469 #endif
BartJanssens 0:99a111b75cb4 470 }
BartJanssens 0:99a111b75cb4 471
BartJanssens 0:99a111b75cb4 472 void Scan()
BartJanssens 0:99a111b75cb4 473 {
BartJanssens 0:99a111b75cb4 474 printf("Scanning...\r\n");
BartJanssens 0:99a111b75cb4 475 gHCI->WriteScanEnable();
BartJanssens 0:99a111b75cb4 476 }
BartJanssens 0:99a111b75cb4 477
BartJanssens 0:99a111b75cb4 478 void Connect()
BartJanssens 0:99a111b75cb4 479 {
BartJanssens 0:99a111b75cb4 480 ConnectDevices();
BartJanssens 0:99a111b75cb4 481 }
BartJanssens 0:99a111b75cb4 482
BartJanssens 0:99a111b75cb4 483
BartJanssens 0:99a111b75cb4 484 void Disconnect()
BartJanssens 0:99a111b75cb4 485 {
BartJanssens 0:99a111b75cb4 486 gHCI->DisconnectAll();
BartJanssens 0:99a111b75cb4 487 }
BartJanssens 0:99a111b75cb4 488
BartJanssens 0:99a111b75cb4 489 void CloseMouse()
BartJanssens 0:99a111b75cb4 490 {
BartJanssens 0:99a111b75cb4 491 }
BartJanssens 0:99a111b75cb4 492
BartJanssens 0:99a111b75cb4 493 void Quit()
BartJanssens 0:99a111b75cb4 494 {
BartJanssens 0:99a111b75cb4 495 CloseMouse();
BartJanssens 0:99a111b75cb4 496 }
BartJanssens 0:99a111b75cb4 497
BartJanssens 0:99a111b75cb4 498 void Run()
BartJanssens 0:99a111b75cb4 499 {
BartJanssens 0:99a111b75cb4 500 for(;;)
BartJanssens 0:99a111b75cb4 501 {
BartJanssens 0:99a111b75cb4 502 const char* cmd = ReadLine();
BartJanssens 0:99a111b75cb4 503 if (strcmp(cmd,"scan") == 0 || strcmp(cmd,"inquiry") == 0)
BartJanssens 0:99a111b75cb4 504 Inquiry();
BartJanssens 0:99a111b75cb4 505 else if (strcmp(cmd,"ls") == 0)
BartJanssens 0:99a111b75cb4 506 List();
BartJanssens 0:99a111b75cb4 507 else if (strcmp(cmd,"connect") == 0)
BartJanssens 0:99a111b75cb4 508 Connect();
BartJanssens 0:99a111b75cb4 509 else if (strcmp(cmd,"disconnect") == 0)
BartJanssens 0:99a111b75cb4 510 Disconnect();
BartJanssens 0:99a111b75cb4 511 else if (strcmp(cmd,"q")== 0)
BartJanssens 0:99a111b75cb4 512 {
BartJanssens 0:99a111b75cb4 513 Quit();
BartJanssens 0:99a111b75cb4 514 break;
BartJanssens 0:99a111b75cb4 515 } else {
BartJanssens 0:99a111b75cb4 516 printf("eh? %s\r\n",cmd);
BartJanssens 0:99a111b75cb4 517 }
BartJanssens 0:99a111b75cb4 518 }
BartJanssens 0:99a111b75cb4 519 }
BartJanssens 0:99a111b75cb4 520 };
BartJanssens 0:99a111b75cb4 521
BartJanssens 0:99a111b75cb4 522 // Instance
BartJanssens 0:99a111b75cb4 523 ShellApp gApp;
BartJanssens 0:99a111b75cb4 524
BartJanssens 0:99a111b75cb4 525 static int HciCallback(HCI* hci, HCI_CALLBACK_EVENT evt, const u8* data, int len)
BartJanssens 0:99a111b75cb4 526 {
BartJanssens 0:99a111b75cb4 527 switch (evt)
BartJanssens 0:99a111b75cb4 528 {
BartJanssens 0:99a111b75cb4 529 case CALLBACK_READY:
BartJanssens 0:99a111b75cb4 530 printf("CALLBACK_READY\r\n");
BartJanssens 0:99a111b75cb4 531 gApp.Ready();
BartJanssens 0:99a111b75cb4 532 break;
BartJanssens 0:99a111b75cb4 533
BartJanssens 0:99a111b75cb4 534 case CALLBACK_INQUIRY_RESULT:
BartJanssens 0:99a111b75cb4 535 printf("CALLBACK_INQUIRY_RESULT ");
BartJanssens 0:99a111b75cb4 536 printf((BD_ADDR*)data);
BartJanssens 0:99a111b75cb4 537 printf("\r\n");
BartJanssens 0:99a111b75cb4 538 break;
BartJanssens 0:99a111b75cb4 539
BartJanssens 0:99a111b75cb4 540 case CALLBACK_INQUIRY_DONE:
BartJanssens 0:99a111b75cb4 541 printf("CALLBACK_INQUIRY_DONE\r\n");
BartJanssens 0:99a111b75cb4 542 gApp.ConnectDevices();
BartJanssens 0:99a111b75cb4 543 break;
BartJanssens 0:99a111b75cb4 544
BartJanssens 0:99a111b75cb4 545 case CALLBACK_REMOTE_NAME:
BartJanssens 0:99a111b75cb4 546 {
BartJanssens 0:99a111b75cb4 547 BD_ADDR* addr = (BD_ADDR*)data;
BartJanssens 0:99a111b75cb4 548 const char* name = (const char*)(data + 6);
BartJanssens 0:99a111b75cb4 549 printf(addr);
BartJanssens 0:99a111b75cb4 550 printf(" % s\r\n",name);
BartJanssens 0:99a111b75cb4 551 }
BartJanssens 0:99a111b75cb4 552 break;
BartJanssens 0:99a111b75cb4 553
BartJanssens 0:99a111b75cb4 554 case CALLBACK_CONNECTION_COMPLETE:
BartJanssens 0:99a111b75cb4 555 gApp.ConnectionComplete(hci,(connection_info*)data);
BartJanssens 0:99a111b75cb4 556 break;
BartJanssens 0:99a111b75cb4 557 };
BartJanssens 0:99a111b75cb4 558 return 0;
BartJanssens 0:99a111b75cb4 559 }
BartJanssens 0:99a111b75cb4 560
BartJanssens 0:99a111b75cb4 561 // these should be placed in the DMA SRAM
BartJanssens 0:99a111b75cb4 562 typedef struct
BartJanssens 0:99a111b75cb4 563 {
BartJanssens 0:99a111b75cb4 564 u8 _hciBuffer[MAX_HCL_SIZE];
BartJanssens 0:99a111b75cb4 565 u8 _aclBuffer[MAX_ACL_SIZE];
BartJanssens 0:99a111b75cb4 566 } SRAMPlacement;
BartJanssens 0:99a111b75cb4 567
BartJanssens 0:99a111b75cb4 568 HCITransportUSB _HCITransportUSB;
BartJanssens 0:99a111b75cb4 569 HCI _HCI;
BartJanssens 0:99a111b75cb4 570
BartJanssens 0:99a111b75cb4 571 u8* USBGetBuffer(u32* len);
BartJanssens 0:99a111b75cb4 572 int OnBluetoothInsert(int device)
BartJanssens 0:99a111b75cb4 573 {
BartJanssens 0:99a111b75cb4 574 printf("Bluetooth inserted of %d\r\n",device);
BartJanssens 0:99a111b75cb4 575 u32 sramLen;
BartJanssens 0:99a111b75cb4 576 u8* sram = USBGetBuffer(&sramLen);
BartJanssens 0:99a111b75cb4 577 sram = (u8*)(((u32)sram + 1023) & ~1023);
BartJanssens 0:99a111b75cb4 578 SRAMPlacement* s = (SRAMPlacement*)sram;
BartJanssens 0:99a111b75cb4 579 _HCITransportUSB.Open(device,s->_hciBuffer,s->_aclBuffer);
BartJanssens 0:99a111b75cb4 580 _HCI.Open(&_HCITransportUSB,HciCallback);
BartJanssens 0:99a111b75cb4 581 RegisterSocketHandler(SOCKET_L2CAP,&_HCI);
BartJanssens 0:99a111b75cb4 582 gHCI = &_HCI;
BartJanssens 0:99a111b75cb4 583 //gApp.Inquiry();
BartJanssens 0:99a111b75cb4 584 //gApp.Scan();
BartJanssens 0:99a111b75cb4 585 gApp.Connect();
BartJanssens 0:99a111b75cb4 586 return 0;
BartJanssens 0:99a111b75cb4 587 }
BartJanssens 0:99a111b75cb4 588
BartJanssens 0:99a111b75cb4 589 void TestShell()
BartJanssens 0:99a111b75cb4 590 {
BartJanssens 0:99a111b75cb4 591 USBInit();
BartJanssens 0:99a111b75cb4 592 gApp.Run();
BartJanssens 0:99a111b75cb4 593 }