20151030 部活のドングル

Dependencies:   FatFileSystem mbed

Fork of PS3_BlueUSB_Shibutsu by 2015 robotic contest arakawa A

Committer:
nodoame
Date:
Tue May 10 09:27:56 2016 +0000
Revision:
8:19566d41352c
Parent:
5:ac875050e1bd
20160510;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
BartJanssens 0:99a111b75cb4 1 /*
BartJanssens 0:99a111b75cb4 2 Copyright (c) 2010 Peter Barrett
BartJanssens 0:99a111b75cb4 3
BartJanssens 0:99a111b75cb4 4 Permission is hereby granted, free of charge, to any person obtaining a copy
BartJanssens 0:99a111b75cb4 5 of this software and associated documentation files (the "Software"), to deal
BartJanssens 0:99a111b75cb4 6 in the Software without restriction, including without limitation the rights
BartJanssens 0:99a111b75cb4 7 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
BartJanssens 0:99a111b75cb4 8 copies of the Software, and to permit persons to whom the Software is
BartJanssens 0:99a111b75cb4 9 furnished to do so, subject to the following conditions:
BartJanssens 0:99a111b75cb4 10
BartJanssens 0:99a111b75cb4 11 The above copyright notice and this permission notice shall be included in
BartJanssens 0:99a111b75cb4 12 all copies or substantial portions of the Software.
BartJanssens 0:99a111b75cb4 13
BartJanssens 0:99a111b75cb4 14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
BartJanssens 0:99a111b75cb4 15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
BartJanssens 0:99a111b75cb4 16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
BartJanssens 0:99a111b75cb4 17 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
BartJanssens 0:99a111b75cb4 18 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
BartJanssens 0:99a111b75cb4 19 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
BartJanssens 0:99a111b75cb4 20 THE SOFTWARE.
BartJanssens 0:99a111b75cb4 21 */
BartJanssens 0:99a111b75cb4 22
BartJanssens 0:99a111b75cb4 23 /*
BartJanssens 0:99a111b75cb4 24 Tue Apr 26 2011 Bart Janssens: added PS3 Bluetooth support
BartJanssens 0:99a111b75cb4 25 */
BartJanssens 0:99a111b75cb4 26
BartJanssens 0:99a111b75cb4 27 #include <stdio.h>
BartJanssens 0:99a111b75cb4 28 #include <stdlib.h>
BartJanssens 0:99a111b75cb4 29 #include <string.h>
BartJanssens 0:99a111b75cb4 30
BartJanssens 0:99a111b75cb4 31 #include "Utils.h"
BartJanssens 0:99a111b75cb4 32 #include "USBHost.h"
BartJanssens 0:99a111b75cb4 33 #include "hci.h"
BartJanssens 0:99a111b75cb4 34 #include "ps3.h"
BartJanssens 0:99a111b75cb4 35
BartJanssens 0:99a111b75cb4 36 #include "mbed.h"
kikoaac 1:7b5dfa9668df 37 DigitalOut LEDa(LED1);
kikoaac 1:7b5dfa9668df 38 PwmOut LEDb(LED2);
kikoaac 1:7b5dfa9668df 39 PwmOut LEDc(LED3);
nodoame 4:3d912e4eef8e 40 PwmOut LEDd(LED4);
nodoame 2:98fc1e2f13f4 41 Serial Dev(p28,p27);
nodoame 2:98fc1e2f13f4 42 BusIn LB(p24,p23,p22,p21);
BartJanssens 0:99a111b75cb4 43
BartJanssens 0:99a111b75cb4 44
BartJanssens 0:99a111b75cb4 45 void printf(const BD_ADDR* addr)
BartJanssens 0:99a111b75cb4 46 {
BartJanssens 0:99a111b75cb4 47 const u8* a = addr->addr;
BartJanssens 0:99a111b75cb4 48 printf("%02X:%02X:%02X:%02X:%02X:%02X",a[5],a[4],a[3],a[2],a[1],a[0]);
BartJanssens 0:99a111b75cb4 49 }
BartJanssens 0:99a111b75cb4 50
BartJanssens 0:99a111b75cb4 51 #define MAX_HCL_SIZE 260
BartJanssens 0:99a111b75cb4 52 #define MAX_ACL_SIZE 400
BartJanssens 0:99a111b75cb4 53
BartJanssens 0:99a111b75cb4 54 class HCITransportUSB : public HCITransport
BartJanssens 0:99a111b75cb4 55 {
BartJanssens 0:99a111b75cb4 56 int _device;
BartJanssens 0:99a111b75cb4 57 u8* _hciBuffer;
BartJanssens 0:99a111b75cb4 58 u8* _aclBuffer;
BartJanssens 0:99a111b75cb4 59
BartJanssens 0:99a111b75cb4 60 public:
BartJanssens 0:99a111b75cb4 61 void Open(int device, u8* hciBuffer, u8* aclBuffer)
BartJanssens 0:99a111b75cb4 62 {
BartJanssens 0:99a111b75cb4 63 _device = device;
BartJanssens 0:99a111b75cb4 64 _hciBuffer = hciBuffer;
BartJanssens 0:99a111b75cb4 65 _aclBuffer = aclBuffer;
BartJanssens 0:99a111b75cb4 66 USBInterruptTransfer(_device,0x81,_hciBuffer,MAX_HCL_SIZE,HciCallback,this);
BartJanssens 0:99a111b75cb4 67 USBBulkTransfer(_device,0x82,_aclBuffer,MAX_ACL_SIZE,AclCallback,this);
kikoaac 1:7b5dfa9668df 68 //Dev.baud(115200);
kikoaac 1:7b5dfa9668df 69
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
kikoaac 1:7b5dfa9668df 102 char DATA[30];
nodoame 5:ac875050e1bd 103 char tmpDATA[30];
nodoame 5:ac875050e1bd 104 int dcount=0,count=0;
nodoame 4:3d912e4eef8e 105
BartJanssens 0:99a111b75cb4 106 class HIDBluetooth
BartJanssens 0:99a111b75cb4 107 {
BartJanssens 0:99a111b75cb4 108 int _control; // Sockets for control (out) and interrupt (in)
BartJanssens 0:99a111b75cb4 109 int _interrupt;
BartJanssens 0:99a111b75cb4 110 int _devClass;
BartJanssens 0:99a111b75cb4 111 BD_ADDR _addr;
BartJanssens 0:99a111b75cb4 112 u8 _pad[2]; // Struct align
BartJanssens 0:99a111b75cb4 113 int _ready;
BartJanssens 0:99a111b75cb4 114 Timeout _timeout;
BartJanssens 0:99a111b75cb4 115 int _count;
nodoame 3:8733d7b59027 116 static bool leaveF;
BartJanssens 0:99a111b75cb4 117
BartJanssens 0:99a111b75cb4 118 public:
nodoame 3:8733d7b59027 119 HIDBluetooth() : _control(0),_interrupt(0),_devClass(0), _ready(1){
nodoame 3:8733d7b59027 120 Dev.baud(921600);
nodoame 4:3d912e4eef8e 121 LEDd.period(3.0);
nodoame 4:3d912e4eef8e 122 LEDd.write(0.5);
nodoame 3:8733d7b59027 123 };
BartJanssens 0:99a111b75cb4 124
BartJanssens 0:99a111b75cb4 125 bool InUse()
BartJanssens 0:99a111b75cb4 126 {
BartJanssens 0:99a111b75cb4 127 return _control != 0;
BartJanssens 0:99a111b75cb4 128 }
BartJanssens 0:99a111b75cb4 129
BartJanssens 0:99a111b75cb4 130 void attimeout()
BartJanssens 0:99a111b75cb4 131 {
BartJanssens 0:99a111b75cb4 132 printf("Timeout reached\r\n");
BartJanssens 0:99a111b75cb4 133 }
BartJanssens 0:99a111b75cb4 134
BartJanssens 0:99a111b75cb4 135 static void OnHidInterrupt(int socket, SocketState state,const u8* data, int len, void* userData)
BartJanssens 0:99a111b75cb4 136 {
BartJanssens 0:99a111b75cb4 137 HIDBluetooth* t = (HIDBluetooth*)userData;
BartJanssens 0:99a111b75cb4 138 t->_ready = 0;
BartJanssens 0:99a111b75cb4 139 if (data)
BartJanssens 0:99a111b75cb4 140 {
BartJanssens 0:99a111b75cb4 141 //printf("devClass = %06X \r\n",t->_devClass);
BartJanssens 0:99a111b75cb4 142 if (t->_devClass == WII_REMOTE && data[1] == 0x30)
BartJanssens 0:99a111b75cb4 143 {
BartJanssens 0:99a111b75cb4 144 printf("================wii====================\r\n");
BartJanssens 0:99a111b75cb4 145 t->WIILed();
BartJanssens 0:99a111b75cb4 146 t->WIIHid(); // ask for accelerometer
BartJanssens 0:99a111b75cb4 147 t->_devClass = 0;
BartJanssens 0:99a111b75cb4 148
BartJanssens 0:99a111b75cb4 149
BartJanssens 0:99a111b75cb4 150 const u8* d = data;
BartJanssens 0:99a111b75cb4 151 switch (d[1])
BartJanssens 0:99a111b75cb4 152 {
BartJanssens 0:99a111b75cb4 153 case 0x02:
BartJanssens 0:99a111b75cb4 154 {
BartJanssens 0:99a111b75cb4 155 int x = (signed char)d[3];
BartJanssens 0:99a111b75cb4 156 int y = (signed char)d[4];
BartJanssens 0:99a111b75cb4 157 printf("Mouse %2X dx:%d dy:%d\r\n",d[2],x,y);
BartJanssens 0:99a111b75cb4 158 }
BartJanssens 0:99a111b75cb4 159 break;
BartJanssens 0:99a111b75cb4 160
BartJanssens 0:99a111b75cb4 161 case 0x37: // Accelerometer http://wiki.wiimoteproject.com/Reports
BartJanssens 0:99a111b75cb4 162 {
BartJanssens 0:99a111b75cb4 163 int pad = (d[2] & 0x9F) | ((d[3] & 0x9F) << 8);
BartJanssens 0:99a111b75cb4 164 int x = (d[2] & 0x60) >> 5 | d[4] << 2;
BartJanssens 0:99a111b75cb4 165 int y = (d[3] & 0x20) >> 4 | d[5] << 2;
BartJanssens 0:99a111b75cb4 166 int z = (d[3] & 0x40) >> 5 | d[6] << 2;
BartJanssens 0:99a111b75cb4 167 printf("WII %04X %d %d %d\r\n",pad,x,y,z);
BartJanssens 0:99a111b75cb4 168 }
BartJanssens 0:99a111b75cb4 169 break;
BartJanssens 0:99a111b75cb4 170 default:
BartJanssens 0:99a111b75cb4 171 printHex(data,len);
BartJanssens 0:99a111b75cb4 172 }
BartJanssens 0:99a111b75cb4 173 }
nodoame 8:19566d41352c 174 //コントローラーの値の取得
BartJanssens 0:99a111b75cb4 175 if (t->_devClass == PS3_REMOTE)
BartJanssens 0:99a111b75cb4 176 {
kikoaac 1:7b5dfa9668df 177
kikoaac 1:7b5dfa9668df 178 u16 ButtonState = ((ps3report*)(data + 1))->ButtonState;
nodoame 2:98fc1e2f13f4 179 u8 x = (ButtonState&0xff00)>>8, x1 = (ButtonState & 0xff);
kikoaac 1:7b5dfa9668df 180 DATA[0] = x ;
nodoame 2:98fc1e2f13f4 181 DATA[1] = LB;
kikoaac 1:7b5dfa9668df 182 DATA[2] = ((ps3report*)(data+1))->LeftStickX;
kikoaac 1:7b5dfa9668df 183 DATA[3] = ((ps3report*)(data+1))->LeftStickY;
kikoaac 1:7b5dfa9668df 184 DATA[4] = ((ps3report*)(data+1))->RightStickX;
kikoaac 1:7b5dfa9668df 185 DATA[5] = ((ps3report*)(data+1))->RightStickY;
nodoame 2:98fc1e2f13f4 186 DATA[6]=x1;
nodoame 2:98fc1e2f13f4 187 //DATA[6] = ((ps3report*)(data+1))->PressureUp;
kikoaac 1:7b5dfa9668df 188 DATA[7] = ((ps3report*)(data+1))->PressureRight;
kikoaac 1:7b5dfa9668df 189 DATA[8] = ((ps3report*)(data+1))->PressureDown;
nodoame 2:98fc1e2f13f4 190 DATA[9] = ((ps3report*)(data+1))->PressureLeft;
kikoaac 1:7b5dfa9668df 191 DATA[10] = ((ps3report*)(data+1))->PressureL2;
kikoaac 1:7b5dfa9668df 192 DATA[11] = ((ps3report*)(data+1))->PressureR2;
kikoaac 1:7b5dfa9668df 193 DATA[12] = ((ps3report*)(data+1))->PressureL1;
kikoaac 1:7b5dfa9668df 194 DATA[13] = ((ps3report*)(data+1))->PressureR1;
kikoaac 1:7b5dfa9668df 195 DATA[14] = ((ps3report*)(data+1))->PressureTriangle;
kikoaac 1:7b5dfa9668df 196 DATA[15] = ((ps3report*)(data+1))->PressureCircle;
kikoaac 1:7b5dfa9668df 197 DATA[16] = ((ps3report*)(data+1))->PressureCross;
kikoaac 1:7b5dfa9668df 198 DATA[17] = ((ps3report*)(data+1))->PressureSquare;
kikoaac 1:7b5dfa9668df 199 DATA[18] = ((ps3report*)(data+1))->PSButtonState;
kikoaac 1:7b5dfa9668df 200 DATA[19] = (((ps3report*)(data+1))->AccelX&0xff00)>>8;
kikoaac 1:7b5dfa9668df 201 DATA[20] = ((ps3report*)(data+1))->AccelX & 0xff;
kikoaac 1:7b5dfa9668df 202 DATA[21] = (((ps3report*)(data+1))->AccelY&0xff00)>>8;
kikoaac 1:7b5dfa9668df 203 DATA[22] = ((ps3report*)(data+1))->AccelY & 0xff;
kikoaac 1:7b5dfa9668df 204 DATA[23] = (((ps3report*)(data+1))->AccelZ&0xff00)>>8;
kikoaac 1:7b5dfa9668df 205 DATA[24] = ((ps3report*)(data+1))->AccelZ & 0xff;
kikoaac 1:7b5dfa9668df 206 DATA[25] = (((ps3report*)(data+1))->GyroZ&0xff00)>>8;
kikoaac 1:7b5dfa9668df 207 DATA[26] = ((ps3report*)(data+1))->GyroZ & 0xff;
kikoaac 1:7b5dfa9668df 208 DATA[27] = ((ps3report*)(data+1))->Charge;
kikoaac 1:7b5dfa9668df 209 DATA[28] = ((ps3report*)(data+1))->Power;
nodoame 4:3d912e4eef8e 210 DATA[29] = ((ps3report*)(data+1))->Connection;
kikoaac 1:7b5dfa9668df 211 //Dev.putc(0xff);
kikoaac 1:7b5dfa9668df 212 //wait(0.003);
nodoame 8:19566d41352c 213
nodoame 8:19566d41352c 214 //長い間データを取得できない場合はリセット
nodoame 5:ac875050e1bd 215 for(int i=0;i<30;i++){
nodoame 5:ac875050e1bd 216 if(tmpDATA[i]==DATA[i])
nodoame 5:ac875050e1bd 217 dcount++;
nodoame 5:ac875050e1bd 218 tmpDATA[i]=DATA[i];
nodoame 5:ac875050e1bd 219 }
nodoame 5:ac875050e1bd 220 if(dcount>29)
nodoame 5:ac875050e1bd 221 count++;
nodoame 5:ac875050e1bd 222 else
nodoame 5:ac875050e1bd 223 count=0;
nodoame 5:ac875050e1bd 224 if(count>600)
nodoame 5:ac875050e1bd 225 NVIC_SystemReset();
nodoame 5:ac875050e1bd 226 dcount=0;
nodoame 8:19566d41352c 227 //UART通信でNucleoへ値を送る
nodoame 2:98fc1e2f13f4 228 Dev.putc(114);
nodoame 2:98fc1e2f13f4 229 wait(0.0003);
nodoame 2:98fc1e2f13f4 230 for(int i = 0;i<7;i++)
kikoaac 1:7b5dfa9668df 231 {
kikoaac 1:7b5dfa9668df 232 //if(i%2 == 1)
kikoaac 1:7b5dfa9668df 233 wait(0.0003);
kikoaac 1:7b5dfa9668df 234 Dev.putc(DATA[i]);
nodoame 5:ac875050e1bd 235 printf(": %3d\r\n " , count);
kikoaac 1:7b5dfa9668df 236 }
nodoame 8:19566d41352c 237 //タッチセンサが反応したらコントローラーへ振動フィードバック
nodoame 3:8733d7b59027 238 if(((int)DATA[1]&12)==12&&leaveF){
nodoame 3:8733d7b59027 239 leaveF=false;
nodoame 3:8733d7b59027 240 t->Ps3Hid_Rumble(10, 255, 10, 10);
nodoame 4:3d912e4eef8e 241 //t->Ps3Hid_Led(4);
nodoame 3:8733d7b59027 242 }
nodoame 4:3d912e4eef8e 243 else if(!(((int)DATA[1]&12)==12)){
nodoame 3:8733d7b59027 244 leaveF=true;
nodoame 4:3d912e4eef8e 245 //t->Ps3Hid_Led(0);
nodoame 4:3d912e4eef8e 246 }
kikoaac 1:7b5dfa9668df 247 wait(0.001);
kikoaac 1:7b5dfa9668df 248 printf("\n");
kikoaac 1:7b5dfa9668df 249 char flag=0;
kikoaac 1:7b5dfa9668df 250 char Cis = ((ps3report*)(data+1))->RightStickY;
kikoaac 1:7b5dfa9668df 251 float cis = LEDb = (float)(Cis)/255;
kikoaac 1:7b5dfa9668df 252 char Cross = ((ps3report*)(data+1))->RightStickX;
kikoaac 1:7b5dfa9668df 253 float cross = LEDc = (float)(Cross)/255;
kikoaac 1:7b5dfa9668df 254 //printf("Cis , %f , %f\n", cis,cross);
kikoaac 1:7b5dfa9668df 255 /*if (Cis >= 180) flag=1;
kikoaac 1:7b5dfa9668df 256 else if (Cis <= 80) flag=2;
kikoaac 1:7b5dfa9668df 257 else if (Cross >= 180) flag=11;
kikoaac 1:7b5dfa9668df 258 else if (Cross <= 80) flag=12;
kikoaac 1:7b5dfa9668df 259 else if (((ps3report*)(data+1))->LeftStickX >= 180) flag=21;
kikoaac 1:7b5dfa9668df 260 else if (((ps3report*)(data+1))->LeftStickX <= 80) flag=22;
kikoaac 1:7b5dfa9668df 261 else if (((ps3report*)(data+1))->LeftStickY >= 180) flag=23;
kikoaac 1:7b5dfa9668df 262 else if (((ps3report*)(data+1))->LeftStickY <= 80) flag=24;
kikoaac 1:7b5dfa9668df 263 else if (x & 0x01) flag=3;
kikoaac 1:7b5dfa9668df 264 else if (x & 0x02) flag=4;
kikoaac 1:7b5dfa9668df 265 else if (x & 0x04) flag=5;
kikoaac 1:7b5dfa9668df 266 else if (x & 0x08) flag=6;
kikoaac 1:7b5dfa9668df 267 else if (x & 16) flag=7;
kikoaac 1:7b5dfa9668df 268 else if (x & 32) flag=8;
kikoaac 1:7b5dfa9668df 269 else if (x & 64) flag=9;
kikoaac 1:7b5dfa9668df 270 else if (x & 128) flag=10;
kikoaac 1:7b5dfa9668df 271 else if (x1 & 0x01) flag=13;
kikoaac 1:7b5dfa9668df 272 else if (x1 & 0x02) flag=14;
kikoaac 1:7b5dfa9668df 273 else if (x1 & 0x04) flag=15;
kikoaac 1:7b5dfa9668df 274 else if (x1 & 0x08) flag=16;
kikoaac 1:7b5dfa9668df 275 else if (x1 & 16) flag=17;
kikoaac 1:7b5dfa9668df 276 else if (x1 & 32) flag=18;
kikoaac 1:7b5dfa9668df 277 else if (x1 & 64) flag=19;
kikoaac 1:7b5dfa9668df 278 else if (x1 & 128) flag=20;
kikoaac 1:7b5dfa9668df 279 Dev.putc(flag);*/
kikoaac 1:7b5dfa9668df 280 if(ButtonState & 0x0002) { //L3
kikoaac 1:7b5dfa9668df 281 //L3が押された時の処理
kikoaac 1:7b5dfa9668df 282 LEDa=1;
kikoaac 1:7b5dfa9668df 283 } else {
kikoaac 1:7b5dfa9668df 284 LEDa=0;
kikoaac 1:7b5dfa9668df 285 //L3が離された時の処理
kikoaac 1:7b5dfa9668df 286 }
kikoaac 1:7b5dfa9668df 287 if(ButtonState & 0x0004) { //R3
kikoaac 1:7b5dfa9668df 288 //R3が押された時の処理
kikoaac 1:7b5dfa9668df 289 } else {
kikoaac 1:7b5dfa9668df 290 //R3が離された時の処理
kikoaac 1:7b5dfa9668df 291 }
BartJanssens 0:99a111b75cb4 292 t->_count ++;
BartJanssens 0:99a111b75cb4 293 if (t->_count == 25) t->_count = 1;
kikoaac 1:7b5dfa9668df 294 //ParsePs3Result((data + 1), sizeof(ps3report),t->_count);
BartJanssens 0:99a111b75cb4 295 }
BartJanssens 0:99a111b75cb4 296 else {
BartJanssens 0:99a111b75cb4 297 printf("Not yet implemented \r\n");
BartJanssens 0:99a111b75cb4 298
BartJanssens 0:99a111b75cb4 299 }
BartJanssens 0:99a111b75cb4 300 }
BartJanssens 0:99a111b75cb4 301
BartJanssens 0:99a111b75cb4 302 }
BartJanssens 0:99a111b75cb4 303
BartJanssens 0:99a111b75cb4 304 static void OnHidControl(int socket, SocketState state, const u8* data, int len, void* userData)
BartJanssens 0:99a111b75cb4 305 {
BartJanssens 0:99a111b75cb4 306 //HIDBluetooth* t = (HIDBluetooth*)userData;
BartJanssens 0:99a111b75cb4 307
BartJanssens 0:99a111b75cb4 308 //printf("OnHidControl\r\n");
BartJanssens 0:99a111b75cb4 309
BartJanssens 0:99a111b75cb4 310 }
BartJanssens 0:99a111b75cb4 311
BartJanssens 0:99a111b75cb4 312 static void OnAcceptCtrlSocket(int socket, SocketState state, const u8* data, int len, void* userData)
BartJanssens 0:99a111b75cb4 313 {
BartJanssens 0:99a111b75cb4 314 HIDBluetooth* t = (HIDBluetooth*)userData;
BartJanssens 0:99a111b75cb4 315
BartJanssens 0:99a111b75cb4 316 t->_control = socket;
BartJanssens 0:99a111b75cb4 317
BartJanssens 0:99a111b75cb4 318 //printf("Ctrl Socket number = %d \r\n", socket);
BartJanssens 0:99a111b75cb4 319
BartJanssens 0:99a111b75cb4 320 Socket_Accept(socket,OnHidControl,userData);
BartJanssens 0:99a111b75cb4 321 u8 enable[6] = {
BartJanssens 0:99a111b75cb4 322 0x53, /* HIDP_TRANS_SET_REPORT | HIDP_DATA_RTYPE_FEATURE */
BartJanssens 0:99a111b75cb4 323 0xf4, 0x42, 0x03, 0x00, 0x00 };
BartJanssens 0:99a111b75cb4 324 Socket_Send(socket,enable,6);
BartJanssens 0:99a111b75cb4 325
BartJanssens 0:99a111b75cb4 326
BartJanssens 0:99a111b75cb4 327 }
BartJanssens 0:99a111b75cb4 328
BartJanssens 0:99a111b75cb4 329 static void OnAcceptDataSocket(int socket, SocketState state, const u8* data, int len, void* userData)
BartJanssens 0:99a111b75cb4 330 {
BartJanssens 0:99a111b75cb4 331 HIDBluetooth* t = (HIDBluetooth*)userData;
BartJanssens 0:99a111b75cb4 332 t->_interrupt = socket;
BartJanssens 0:99a111b75cb4 333
BartJanssens 0:99a111b75cb4 334 printf("OnAcceptDataSocket: Data Socket accept here \r\n");
BartJanssens 0:99a111b75cb4 335 printf("OnAcceptDataSocket: Data Socket number = %d \r\n", socket);
BartJanssens 0:99a111b75cb4 336
BartJanssens 0:99a111b75cb4 337 //printf("OnAcceptDataSocket: Ctrl Socket = %d Data Socket accept = %d \r\n", t->_control, t->_interrupt);
BartJanssens 0:99a111b75cb4 338
BartJanssens 0:99a111b75cb4 339 Socket_Accept(socket,OnHidInterrupt,userData);
BartJanssens 0:99a111b75cb4 340
BartJanssens 0:99a111b75cb4 341 //if (data)
BartJanssens 0:99a111b75cb4 342 // printHex(data,len);
BartJanssens 0:99a111b75cb4 343 }
BartJanssens 0:99a111b75cb4 344
BartJanssens 0:99a111b75cb4 345 void Open(BD_ADDR* bdAddr, inquiry_info* info)
BartJanssens 0:99a111b75cb4 346 {
BartJanssens 0:99a111b75cb4 347 printf("L2CAPAddr size %d\r\n",sizeof(L2CAPAddr));
BartJanssens 0:99a111b75cb4 348 _addr = *bdAddr;
BartJanssens 0:99a111b75cb4 349 L2CAPAddr sockAddr;
BartJanssens 0:99a111b75cb4 350 sockAddr.bdaddr = _addr;
BartJanssens 0:99a111b75cb4 351 sockAddr.psm = L2CAP_PSM_HID_INTR;
BartJanssens 0:99a111b75cb4 352 printf("Socket_Open size %d\r\n",sizeof(L2CAPAddr));
BartJanssens 0:99a111b75cb4 353 _interrupt = Socket_Open(SOCKET_L2CAP,&sockAddr.hdr,OnHidInterrupt,this);
BartJanssens 0:99a111b75cb4 354 sockAddr.psm = L2CAP_PSM_HID_CNTL;
BartJanssens 0:99a111b75cb4 355 _control = Socket_Open(SOCKET_L2CAP,&sockAddr.hdr,OnHidControl,this);
BartJanssens 0:99a111b75cb4 356
BartJanssens 0:99a111b75cb4 357 printfBytes("OPEN DEVICE CLASS",info->dev_class,3);
BartJanssens 0:99a111b75cb4 358 _devClass = (info->dev_class[0] << 16) | (info->dev_class[1] << 8) | info->dev_class[2];
BartJanssens 0:99a111b75cb4 359 }
BartJanssens 0:99a111b75cb4 360
BartJanssens 0:99a111b75cb4 361 void Listen(BD_ADDR* bdAddr, inquiry_info* info)
BartJanssens 0:99a111b75cb4 362 {
BartJanssens 0:99a111b75cb4 363 int result;
BartJanssens 0:99a111b75cb4 364 //printf("L2CAPAddr size %d\r\n",sizeof(L2CAPAddr));
BartJanssens 0:99a111b75cb4 365 _addr = *bdAddr;
BartJanssens 0:99a111b75cb4 366 L2CAPAddr sockAddr;
BartJanssens 0:99a111b75cb4 367 sockAddr.bdaddr = _addr;
BartJanssens 0:99a111b75cb4 368
BartJanssens 0:99a111b75cb4 369 _count = 1;
BartJanssens 0:99a111b75cb4 370 _ready = 1;
BartJanssens 0:99a111b75cb4 371
BartJanssens 0:99a111b75cb4 372 // set a buffer for the led&rumble report
BartJanssens 0:99a111b75cb4 373 u8 abuffer[37] = {
BartJanssens 0:99a111b75cb4 374 0x52, /* HIDP_TRANS_SET_REPORT | HIDP_DATA_RTYPE_OUTPUT */
BartJanssens 0:99a111b75cb4 375 0x01,
BartJanssens 0:99a111b75cb4 376 0x00, 0x00, 0x00, 0x00, 0x00,
BartJanssens 0:99a111b75cb4 377 0x00, 0x00, 0x00, 0x00, 0x1E,
BartJanssens 0:99a111b75cb4 378 0xff, 0x27, 0x10, 0x00, 0x32,
BartJanssens 0:99a111b75cb4 379 0xff, 0x27, 0x10, 0x00, 0x32,
BartJanssens 0:99a111b75cb4 380 0xff, 0x27, 0x10, 0x00, 0x32,
BartJanssens 0:99a111b75cb4 381 0xff, 0x27, 0x10, 0x00, 0x32,
BartJanssens 0:99a111b75cb4 382 0x00, 0x00, 0x00, 0x00, 0x00,
BartJanssens 0:99a111b75cb4 383 };
BartJanssens 0:99a111b75cb4 384 memcpy(_ledrumble,abuffer,37);
BartJanssens 0:99a111b75cb4 385
BartJanssens 0:99a111b75cb4 386 result = Socket_Listen(SOCKET_L2CAP,L2CAP_PSM_HID_CNTL,OnAcceptCtrlSocket,this);
BartJanssens 0:99a111b75cb4 387 printf("listen return code ctrl socket = %d \r\n", result);
BartJanssens 0:99a111b75cb4 388
BartJanssens 0:99a111b75cb4 389
BartJanssens 0:99a111b75cb4 390 result = Socket_Listen(SOCKET_L2CAP,L2CAP_PSM_HID_INTR,OnAcceptDataSocket,this);
BartJanssens 0:99a111b75cb4 391 printf("listen return code data socket = %d \r\n", result);
BartJanssens 0:99a111b75cb4 392
BartJanssens 0:99a111b75cb4 393 printfBytes("OPEN DEVICE CLASS",info->dev_class,3);
BartJanssens 0:99a111b75cb4 394 _devClass = (info->dev_class[0] << 16) | (info->dev_class[1] << 8) | info->dev_class[2];
BartJanssens 0:99a111b75cb4 395
BartJanssens 0:99a111b75cb4 396 while (_ready){ // wait till we receive data from PS3Hid
BartJanssens 0:99a111b75cb4 397 USBLoop();
BartJanssens 0:99a111b75cb4 398 }
BartJanssens 0:99a111b75cb4 399 USBLoop();
BartJanssens 0:99a111b75cb4 400
BartJanssens 0:99a111b75cb4 401
BartJanssens 0:99a111b75cb4 402
BartJanssens 0:99a111b75cb4 403 }
BartJanssens 0:99a111b75cb4 404
BartJanssens 0:99a111b75cb4 405 void Close()
BartJanssens 0:99a111b75cb4 406 {
BartJanssens 0:99a111b75cb4 407 if (_control)
BartJanssens 0:99a111b75cb4 408 Socket_Close(_control);
BartJanssens 0:99a111b75cb4 409 if (_interrupt)
BartJanssens 0:99a111b75cb4 410 Socket_Close(_interrupt);
BartJanssens 0:99a111b75cb4 411 _control = _interrupt = 0;
BartJanssens 0:99a111b75cb4 412 }
BartJanssens 0:99a111b75cb4 413
BartJanssens 0:99a111b75cb4 414 void WIILed(int id = 0x10)
BartJanssens 0:99a111b75cb4 415 {
BartJanssens 0:99a111b75cb4 416 u8 led[3] = {0x52, 0x11, id};
BartJanssens 0:99a111b75cb4 417 if (_control)
BartJanssens 0:99a111b75cb4 418 Socket_Send(_control,led,3);
BartJanssens 0:99a111b75cb4 419 }
BartJanssens 0:99a111b75cb4 420
BartJanssens 0:99a111b75cb4 421 void WIIHid(int report = 0x37)
BartJanssens 0:99a111b75cb4 422 {
BartJanssens 0:99a111b75cb4 423 u8 hid[4] = { 0x52, 0x12, 0x00, report };
BartJanssens 0:99a111b75cb4 424 if (_control != -1)
BartJanssens 0:99a111b75cb4 425 Socket_Send(_control,hid,4);
BartJanssens 0:99a111b75cb4 426 }
BartJanssens 0:99a111b75cb4 427
BartJanssens 0:99a111b75cb4 428
BartJanssens 0:99a111b75cb4 429
BartJanssens 0:99a111b75cb4 430 void Ps3Hid_Led(int i)
BartJanssens 0:99a111b75cb4 431 {
BartJanssens 0:99a111b75cb4 432 printf("Ps3Hid led %d\r\n",i);
BartJanssens 0:99a111b75cb4 433 u8 ledpattern[7] = {0x02, 0x04, 0x08, 0x10, 0x12, 0x14, 0x18 };
BartJanssens 0:99a111b75cb4 434 u8 buf[37];
BartJanssens 0:99a111b75cb4 435
BartJanssens 0:99a111b75cb4 436 if (i < 7) _ledrumble[11] = ledpattern[i];
BartJanssens 0:99a111b75cb4 437 memcpy(buf, _ledrumble, 37);
BartJanssens 0:99a111b75cb4 438
BartJanssens 0:99a111b75cb4 439 if (_control != -1)
BartJanssens 0:99a111b75cb4 440 Socket_Send(_control,buf,37);
kikoaac 1:7b5dfa9668df 441 wait_ms(0.1);
BartJanssens 0:99a111b75cb4 442 }
BartJanssens 0:99a111b75cb4 443
BartJanssens 0:99a111b75cb4 444 void Ps3Hid_Rumble(u8 duration_right, u8 power_right, u8 duration_left, u8 power_left )
BartJanssens 0:99a111b75cb4 445 {
BartJanssens 0:99a111b75cb4 446 printf("Ps3Hid rumble \r\n");
BartJanssens 0:99a111b75cb4 447 u8 buf[37];
BartJanssens 0:99a111b75cb4 448
BartJanssens 0:99a111b75cb4 449 memcpy(buf, _ledrumble, 37);
BartJanssens 0:99a111b75cb4 450 buf[3] = duration_right;
BartJanssens 0:99a111b75cb4 451 buf[4] = power_right;
BartJanssens 0:99a111b75cb4 452 buf[5] = duration_left;
BartJanssens 0:99a111b75cb4 453 buf[6] = power_left;
BartJanssens 0:99a111b75cb4 454
BartJanssens 0:99a111b75cb4 455 if (_control != -1)
BartJanssens 0:99a111b75cb4 456 Socket_Send(_control,buf,37);
kikoaac 1:7b5dfa9668df 457 wait_ms(0.1);
BartJanssens 0:99a111b75cb4 458 }
BartJanssens 0:99a111b75cb4 459
BartJanssens 0:99a111b75cb4 460 int CheckHID()
BartJanssens 0:99a111b75cb4 461 {
BartJanssens 0:99a111b75cb4 462 printf("CheckHID \r\n");
BartJanssens 0:99a111b75cb4 463 printf("Ctrl = %d Intr = %d \r\n", _control, _interrupt);
BartJanssens 0:99a111b75cb4 464 if (_control < 1) {
BartJanssens 0:99a111b75cb4 465 printf("Ps3 not ready \r\n");
BartJanssens 0:99a111b75cb4 466 return 1;
BartJanssens 0:99a111b75cb4 467 } else {
BartJanssens 0:99a111b75cb4 468 printf("Ps3 ready %d \r\n",_control);
BartJanssens 0:99a111b75cb4 469 return 0;
BartJanssens 0:99a111b75cb4 470 }
BartJanssens 0:99a111b75cb4 471 }
BartJanssens 0:99a111b75cb4 472 private:
BartJanssens 0:99a111b75cb4 473 u8 _ledrumble[37] ;
BartJanssens 0:99a111b75cb4 474 };
BartJanssens 0:99a111b75cb4 475
nodoame 3:8733d7b59027 476 bool HIDBluetooth::leaveF=true;
nodoame 3:8733d7b59027 477
BartJanssens 0:99a111b75cb4 478
BartJanssens 0:99a111b75cb4 479 HCI* gHCI = 0;
BartJanssens 0:99a111b75cb4 480
BartJanssens 0:99a111b75cb4 481 #define MAX_HID_DEVICES 8
BartJanssens 0:99a111b75cb4 482
BartJanssens 0:99a111b75cb4 483 int GetConsoleChar();
BartJanssens 0:99a111b75cb4 484 class ShellApp
BartJanssens 0:99a111b75cb4 485 {
BartJanssens 0:99a111b75cb4 486 char _line[64];
BartJanssens 0:99a111b75cb4 487 HIDBluetooth _hids[MAX_HID_DEVICES];
BartJanssens 0:99a111b75cb4 488
BartJanssens 0:99a111b75cb4 489 public:
BartJanssens 0:99a111b75cb4 490 void Ready()
BartJanssens 0:99a111b75cb4 491 {
BartJanssens 0:99a111b75cb4 492 printf("HIDBluetooth %d\r\n",sizeof(HIDBluetooth));
BartJanssens 0:99a111b75cb4 493 memset(_hids,0,sizeof(_hids));
BartJanssens 0:99a111b75cb4 494 //Inquiry();
BartJanssens 0:99a111b75cb4 495 Scan();
BartJanssens 0:99a111b75cb4 496 }
BartJanssens 0:99a111b75cb4 497
BartJanssens 0:99a111b75cb4 498 // We have connected to a device
BartJanssens 0:99a111b75cb4 499 void ConnectionComplete(HCI* hci, connection_info* info)
BartJanssens 0:99a111b75cb4 500 {
BartJanssens 0:99a111b75cb4 501 printf("ConnectionComplete ");
BartJanssens 0:99a111b75cb4 502 BD_ADDR* a = &info->bdaddr;
BartJanssens 0:99a111b75cb4 503 printf(a);
BartJanssens 0:99a111b75cb4 504 BTDevice* bt = hci->Find(a);
BartJanssens 0:99a111b75cb4 505 HIDBluetooth* hid = NewHIDBluetooth();
BartJanssens 0:99a111b75cb4 506 printf("%08x %08x\r\n",bt,hid);
BartJanssens 0:99a111b75cb4 507 if (hid)
BartJanssens 0:99a111b75cb4 508 hid->Listen(a,&bt->_info); // use Listen for PS3, Open for WII
BartJanssens 0:99a111b75cb4 509 hid->Ps3Hid_Led(0); // set led 1
BartJanssens 0:99a111b75cb4 510 hid->Ps3Hid_Rumble(0x20,0xff,0x20,0xff); // rumble
BartJanssens 0:99a111b75cb4 511
BartJanssens 0:99a111b75cb4 512 }
BartJanssens 0:99a111b75cb4 513
BartJanssens 0:99a111b75cb4 514 HIDBluetooth* NewHIDBluetooth()
BartJanssens 0:99a111b75cb4 515 {
BartJanssens 0:99a111b75cb4 516 for (int i = 0; i < MAX_HID_DEVICES; i++)
BartJanssens 0:99a111b75cb4 517 if (!_hids[i].InUse())
BartJanssens 0:99a111b75cb4 518 return _hids+i;
BartJanssens 0:99a111b75cb4 519 return 0;
BartJanssens 0:99a111b75cb4 520 }
BartJanssens 0:99a111b75cb4 521
BartJanssens 0:99a111b75cb4 522 void ConnectDevices()
BartJanssens 0:99a111b75cb4 523 {
BartJanssens 0:99a111b75cb4 524 BTDevice* devs[8];
BartJanssens 0:99a111b75cb4 525 int count = gHCI->GetDevices(devs,8);
BartJanssens 0:99a111b75cb4 526 for (int i = 0; i < count; i++)
BartJanssens 0:99a111b75cb4 527 {
BartJanssens 0:99a111b75cb4 528 printfBytes("DEVICE CLASS",devs[i]->_info.dev_class,3);
BartJanssens 0:99a111b75cb4 529 if (devs[i]->_handle == 0)
BartJanssens 0:99a111b75cb4 530 {
BartJanssens 0:99a111b75cb4 531 BD_ADDR* bd = &devs[i]->_info.bdaddr;
BartJanssens 0:99a111b75cb4 532 printf("Connecting to ");
BartJanssens 0:99a111b75cb4 533 printf(bd);
BartJanssens 0:99a111b75cb4 534 printf("\r\n");
BartJanssens 0:99a111b75cb4 535 gHCI->CreateConnection(bd);
BartJanssens 0:99a111b75cb4 536 }
BartJanssens 0:99a111b75cb4 537 }
BartJanssens 0:99a111b75cb4 538 }
BartJanssens 0:99a111b75cb4 539
BartJanssens 0:99a111b75cb4 540 const char* ReadLine()
BartJanssens 0:99a111b75cb4 541 {
BartJanssens 0:99a111b75cb4 542 int i;
BartJanssens 0:99a111b75cb4 543 for (i = 0; i < 255; )
BartJanssens 0:99a111b75cb4 544 {
BartJanssens 0:99a111b75cb4 545 USBLoop();
BartJanssens 0:99a111b75cb4 546 int c = GetConsoleChar();
BartJanssens 0:99a111b75cb4 547 if (c == -1)
BartJanssens 0:99a111b75cb4 548 continue;
BartJanssens 0:99a111b75cb4 549 if (c == '\n' || c == 13)
BartJanssens 0:99a111b75cb4 550 break;
BartJanssens 0:99a111b75cb4 551 _line[i++] = c;
BartJanssens 0:99a111b75cb4 552 }
BartJanssens 0:99a111b75cb4 553 _line[i] = 0;
BartJanssens 0:99a111b75cb4 554 return _line;
BartJanssens 0:99a111b75cb4 555 }
BartJanssens 0:99a111b75cb4 556
BartJanssens 0:99a111b75cb4 557 void Inquiry()
BartJanssens 0:99a111b75cb4 558 {
BartJanssens 0:99a111b75cb4 559 printf("Inquiry..\r\n");
BartJanssens 0:99a111b75cb4 560 gHCI->Inquiry();
BartJanssens 0:99a111b75cb4 561 }
BartJanssens 0:99a111b75cb4 562
BartJanssens 0:99a111b75cb4 563 void List()
BartJanssens 0:99a111b75cb4 564 {
BartJanssens 0:99a111b75cb4 565 #if 0
BartJanssens 0:99a111b75cb4 566 printf("%d devices\r\n",_deviceCount);
BartJanssens 0:99a111b75cb4 567 for (int i = 0; i < _deviceCount; i++)
BartJanssens 0:99a111b75cb4 568 {
BartJanssens 0:99a111b75cb4 569 printf(&_devices[i].info.bdaddr);
BartJanssens 0:99a111b75cb4 570 printf("\r\n");
BartJanssens 0:99a111b75cb4 571 }
BartJanssens 0:99a111b75cb4 572 #endif
BartJanssens 0:99a111b75cb4 573 }
BartJanssens 0:99a111b75cb4 574
BartJanssens 0:99a111b75cb4 575 void Scan()
BartJanssens 0:99a111b75cb4 576 {
BartJanssens 0:99a111b75cb4 577 printf("Scanning...\r\n");
BartJanssens 0:99a111b75cb4 578 gHCI->WriteScanEnable();
BartJanssens 0:99a111b75cb4 579 }
BartJanssens 0:99a111b75cb4 580
BartJanssens 0:99a111b75cb4 581 void Connect()
BartJanssens 0:99a111b75cb4 582 {
BartJanssens 0:99a111b75cb4 583 ConnectDevices();
BartJanssens 0:99a111b75cb4 584 }
BartJanssens 0:99a111b75cb4 585
BartJanssens 0:99a111b75cb4 586
BartJanssens 0:99a111b75cb4 587 void Disconnect()
BartJanssens 0:99a111b75cb4 588 {
BartJanssens 0:99a111b75cb4 589 gHCI->DisconnectAll();
BartJanssens 0:99a111b75cb4 590 }
BartJanssens 0:99a111b75cb4 591
BartJanssens 0:99a111b75cb4 592 void CloseMouse()
BartJanssens 0:99a111b75cb4 593 {
BartJanssens 0:99a111b75cb4 594 }
BartJanssens 0:99a111b75cb4 595
BartJanssens 0:99a111b75cb4 596 void Quit()
BartJanssens 0:99a111b75cb4 597 {
BartJanssens 0:99a111b75cb4 598 CloseMouse();
BartJanssens 0:99a111b75cb4 599 }
BartJanssens 0:99a111b75cb4 600
BartJanssens 0:99a111b75cb4 601 void Run()
BartJanssens 0:99a111b75cb4 602 {
BartJanssens 0:99a111b75cb4 603 for(;;)
BartJanssens 0:99a111b75cb4 604 {
BartJanssens 0:99a111b75cb4 605 const char* cmd = ReadLine();
BartJanssens 0:99a111b75cb4 606 if (strcmp(cmd,"scan") == 0 || strcmp(cmd,"inquiry") == 0)
BartJanssens 0:99a111b75cb4 607 Inquiry();
BartJanssens 0:99a111b75cb4 608 else if (strcmp(cmd,"ls") == 0)
BartJanssens 0:99a111b75cb4 609 List();
BartJanssens 0:99a111b75cb4 610 else if (strcmp(cmd,"connect") == 0)
BartJanssens 0:99a111b75cb4 611 Connect();
BartJanssens 0:99a111b75cb4 612 else if (strcmp(cmd,"disconnect") == 0)
BartJanssens 0:99a111b75cb4 613 Disconnect();
BartJanssens 0:99a111b75cb4 614 else if (strcmp(cmd,"q")== 0)
BartJanssens 0:99a111b75cb4 615 {
BartJanssens 0:99a111b75cb4 616 Quit();
BartJanssens 0:99a111b75cb4 617 break;
BartJanssens 0:99a111b75cb4 618 } else {
BartJanssens 0:99a111b75cb4 619 printf("eh? %s\r\n",cmd);
BartJanssens 0:99a111b75cb4 620 }
BartJanssens 0:99a111b75cb4 621 }
BartJanssens 0:99a111b75cb4 622 }
BartJanssens 0:99a111b75cb4 623 };
BartJanssens 0:99a111b75cb4 624
BartJanssens 0:99a111b75cb4 625 // Instance
BartJanssens 0:99a111b75cb4 626 ShellApp gApp;
BartJanssens 0:99a111b75cb4 627
BartJanssens 0:99a111b75cb4 628 static int HciCallback(HCI* hci, HCI_CALLBACK_EVENT evt, const u8* data, int len)
BartJanssens 0:99a111b75cb4 629 {
BartJanssens 0:99a111b75cb4 630 switch (evt)
BartJanssens 0:99a111b75cb4 631 {
BartJanssens 0:99a111b75cb4 632 case CALLBACK_READY:
BartJanssens 0:99a111b75cb4 633 printf("CALLBACK_READY\r\n");
BartJanssens 0:99a111b75cb4 634 gApp.Ready();
BartJanssens 0:99a111b75cb4 635 break;
BartJanssens 0:99a111b75cb4 636
BartJanssens 0:99a111b75cb4 637 case CALLBACK_INQUIRY_RESULT:
BartJanssens 0:99a111b75cb4 638 printf("CALLBACK_INQUIRY_RESULT ");
BartJanssens 0:99a111b75cb4 639 printf((BD_ADDR*)data);
BartJanssens 0:99a111b75cb4 640 printf("\r\n");
BartJanssens 0:99a111b75cb4 641 break;
BartJanssens 0:99a111b75cb4 642
BartJanssens 0:99a111b75cb4 643 case CALLBACK_INQUIRY_DONE:
BartJanssens 0:99a111b75cb4 644 printf("CALLBACK_INQUIRY_DONE\r\n");
BartJanssens 0:99a111b75cb4 645 gApp.ConnectDevices();
BartJanssens 0:99a111b75cb4 646 break;
BartJanssens 0:99a111b75cb4 647
BartJanssens 0:99a111b75cb4 648 case CALLBACK_REMOTE_NAME:
BartJanssens 0:99a111b75cb4 649 {
BartJanssens 0:99a111b75cb4 650 BD_ADDR* addr = (BD_ADDR*)data;
BartJanssens 0:99a111b75cb4 651 const char* name = (const char*)(data + 6);
BartJanssens 0:99a111b75cb4 652 printf(addr);
BartJanssens 0:99a111b75cb4 653 printf(" % s\r\n",name);
BartJanssens 0:99a111b75cb4 654 }
BartJanssens 0:99a111b75cb4 655 break;
BartJanssens 0:99a111b75cb4 656
BartJanssens 0:99a111b75cb4 657 case CALLBACK_CONNECTION_COMPLETE:
BartJanssens 0:99a111b75cb4 658 gApp.ConnectionComplete(hci,(connection_info*)data);
BartJanssens 0:99a111b75cb4 659 break;
BartJanssens 0:99a111b75cb4 660 };
BartJanssens 0:99a111b75cb4 661 return 0;
BartJanssens 0:99a111b75cb4 662 }
BartJanssens 0:99a111b75cb4 663
BartJanssens 0:99a111b75cb4 664 // these should be placed in the DMA SRAM
BartJanssens 0:99a111b75cb4 665 typedef struct
BartJanssens 0:99a111b75cb4 666 {
BartJanssens 0:99a111b75cb4 667 u8 _hciBuffer[MAX_HCL_SIZE];
BartJanssens 0:99a111b75cb4 668 u8 _aclBuffer[MAX_ACL_SIZE];
BartJanssens 0:99a111b75cb4 669 } SRAMPlacement;
BartJanssens 0:99a111b75cb4 670
BartJanssens 0:99a111b75cb4 671 HCITransportUSB _HCITransportUSB;
BartJanssens 0:99a111b75cb4 672 HCI _HCI;
BartJanssens 0:99a111b75cb4 673
BartJanssens 0:99a111b75cb4 674 u8* USBGetBuffer(u32* len);
BartJanssens 0:99a111b75cb4 675 int OnBluetoothInsert(int device)
BartJanssens 0:99a111b75cb4 676 {
BartJanssens 0:99a111b75cb4 677 printf("Bluetooth inserted of %d\r\n",device);
BartJanssens 0:99a111b75cb4 678 u32 sramLen;
BartJanssens 0:99a111b75cb4 679 u8* sram = USBGetBuffer(&sramLen);
BartJanssens 0:99a111b75cb4 680 sram = (u8*)(((u32)sram + 1023) & ~1023);
BartJanssens 0:99a111b75cb4 681 SRAMPlacement* s = (SRAMPlacement*)sram;
BartJanssens 0:99a111b75cb4 682 _HCITransportUSB.Open(device,s->_hciBuffer,s->_aclBuffer);
BartJanssens 0:99a111b75cb4 683 _HCI.Open(&_HCITransportUSB,HciCallback);
BartJanssens 0:99a111b75cb4 684 RegisterSocketHandler(SOCKET_L2CAP,&_HCI);
BartJanssens 0:99a111b75cb4 685 gHCI = &_HCI;
BartJanssens 0:99a111b75cb4 686 //gApp.Inquiry();
BartJanssens 0:99a111b75cb4 687 //gApp.Scan();
BartJanssens 0:99a111b75cb4 688 gApp.Connect();
BartJanssens 0:99a111b75cb4 689 return 0;
BartJanssens 0:99a111b75cb4 690 }
BartJanssens 0:99a111b75cb4 691
BartJanssens 0:99a111b75cb4 692 void TestShell()
BartJanssens 0:99a111b75cb4 693 {
BartJanssens 0:99a111b75cb4 694 USBInit();
BartJanssens 0:99a111b75cb4 695 gApp.Run();
BartJanssens 0:99a111b75cb4 696 }