ORTP-L_WiiRemoteTest

Dependencies:   Motordriver mbed FatFileSystem

Fork of WallbotTypeN by Junichi Katsu

Committer:
passionvirus
Date:
Fri Mar 29 09:05:28 2013 +0000
Revision:
1:df4118878dc4
Parent:
0:425791fe4b42
init

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jksoft 0:425791fe4b42 1
jksoft 0:425791fe4b42 2 /*
jksoft 0:425791fe4b42 3 Copyright (c) 2010 Peter Barrett
jksoft 0:425791fe4b42 4
jksoft 0:425791fe4b42 5 Permission is hereby granted, free of charge, to any person obtaining a copy
jksoft 0:425791fe4b42 6 of this software and associated documentation files (the "Software"), to deal
jksoft 0:425791fe4b42 7 in the Software without restriction, including without limitation the rights
jksoft 0:425791fe4b42 8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
jksoft 0:425791fe4b42 9 copies of the Software, and to permit persons to whom the Software is
jksoft 0:425791fe4b42 10 furnished to do so, subject to the following conditions:
jksoft 0:425791fe4b42 11
jksoft 0:425791fe4b42 12 The above copyright notice and this permission notice shall be included in
jksoft 0:425791fe4b42 13 all copies or substantial portions of the Software.
jksoft 0:425791fe4b42 14
jksoft 0:425791fe4b42 15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
jksoft 0:425791fe4b42 16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
jksoft 0:425791fe4b42 17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
jksoft 0:425791fe4b42 18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
jksoft 0:425791fe4b42 19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
jksoft 0:425791fe4b42 20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
jksoft 0:425791fe4b42 21 THE SOFTWARE.
jksoft 0:425791fe4b42 22 */
jksoft 0:425791fe4b42 23
jksoft 0:425791fe4b42 24 #include <stdio.h>
jksoft 0:425791fe4b42 25 #include <stdlib.h>
jksoft 0:425791fe4b42 26 #include <stdio.h>
jksoft 0:425791fe4b42 27 #include <string.h>
jksoft 0:425791fe4b42 28
jksoft 0:425791fe4b42 29 #include "Utils.h"
jksoft 0:425791fe4b42 30 #include "hci.h"
jksoft 0:425791fe4b42 31 #include "hci_private.h"
jksoft 0:425791fe4b42 32
jksoft 0:425791fe4b42 33 enum hci_callback_evt
jksoft 0:425791fe4b42 34 {
jksoft 0:425791fe4b42 35 NONE,
jksoft 0:425791fe4b42 36 CONNECT,
jksoft 0:425791fe4b42 37 DISCONECT,
jksoft 0:425791fe4b42 38 INQUIRYRESULT
jksoft 0:425791fe4b42 39 };
jksoft 0:425791fe4b42 40
jksoft 0:425791fe4b42 41 #define MAX_BLUETOOTH_ADAPTERS 1
jksoft 0:425791fe4b42 42
jksoft 0:425791fe4b42 43 enum StateMask {
jksoft 0:425791fe4b42 44 MASK_RESET = 1,
jksoft 0:425791fe4b42 45 MASK_READ_BUFFER_SIZE = 2,
jksoft 0:425791fe4b42 46 MASK_READ_BD_ADDR = 4,
jksoft 0:425791fe4b42 47 MASK_INITED = 8,
jksoft 0:425791fe4b42 48 MASK_INQUIRY = 16,
jksoft 0:425791fe4b42 49 MASK_REMOTE_NAME = 32,
jksoft 0:425791fe4b42 50 MASK_CREATE_CONNECTION = 64
jksoft 0:425791fe4b42 51 };
jksoft 0:425791fe4b42 52
jksoft 0:425791fe4b42 53 int HCI::Open(HCITransport* transport, HCICallback callback)
jksoft 0:425791fe4b42 54 {
jksoft 0:425791fe4b42 55 _transport = transport;
jksoft 0:425791fe4b42 56 _transport->Set(this);
jksoft 0:425791fe4b42 57 _callback = callback;
jksoft 0:425791fe4b42 58 _state = 0;
jksoft 0:425791fe4b42 59 for (int i = 0; i < MAX_BTDEVICES; i++)
jksoft 0:425791fe4b42 60 {
jksoft 0:425791fe4b42 61 _devices[i].Init();
jksoft 0:425791fe4b42 62 _devices[i]._transport = transport;
jksoft 0:425791fe4b42 63 }
jksoft 0:425791fe4b42 64 return SendCmd(HCI_OP_RESET);
jksoft 0:425791fe4b42 65 }
jksoft 0:425791fe4b42 66
jksoft 0:425791fe4b42 67 void printf(const BD_ADDR* addr);
jksoft 0:425791fe4b42 68
jksoft 0:425791fe4b42 69 BTDevice* HCI::Find(const BD_ADDR* addr)
jksoft 0:425791fe4b42 70 {
jksoft 0:425791fe4b42 71 for (int i = 0; i < MAX_BTDEVICES; i++)
jksoft 0:425791fe4b42 72 if (_devices[i]._state != 0 && memcmp(addr,&_devices[i]._info.bdaddr,6) == 0)
jksoft 0:425791fe4b42 73 return &_devices[i];
jksoft 0:425791fe4b42 74 return 0;
jksoft 0:425791fe4b42 75 }
jksoft 0:425791fe4b42 76
jksoft 0:425791fe4b42 77 BTDevice* HCI::Find(int handle)
jksoft 0:425791fe4b42 78 {
jksoft 0:425791fe4b42 79 for (int i = 0; i < MAX_BTDEVICES; i++)
jksoft 0:425791fe4b42 80 if (_devices[i]._state != 0 && handle == _devices[i]._handle)
jksoft 0:425791fe4b42 81 return &_devices[i];
jksoft 0:425791fe4b42 82 return 0;
jksoft 0:425791fe4b42 83 }
jksoft 0:425791fe4b42 84 //
jksoft 0:425791fe4b42 85 bool HCI::Busy()
jksoft 0:425791fe4b42 86 {
jksoft 0:425791fe4b42 87 return (_state & (MASK_INQUIRY | MASK_REMOTE_NAME | MASK_CREATE_CONNECTION)) != 0;
jksoft 0:425791fe4b42 88 }
jksoft 0:425791fe4b42 89
jksoft 0:425791fe4b42 90 int HCI::Inquiry(int duration)
jksoft 0:425791fe4b42 91 {
jksoft 0:425791fe4b42 92 _state |= MASK_INQUIRY;
jksoft 0:425791fe4b42 93 u8 buf[5];
jksoft 0:425791fe4b42 94 buf[0] = 0x33;
jksoft 0:425791fe4b42 95 buf[1] = 0x8B;
jksoft 0:425791fe4b42 96 buf[2] = 0x9E;
jksoft 0:425791fe4b42 97 buf[3] = duration;
jksoft 0:425791fe4b42 98 buf[4] = 5; // 5 results
jksoft 0:425791fe4b42 99 SendCmd(HCI_OP_INQUIRY,buf,sizeof(buf));
jksoft 0:425791fe4b42 100 return 0;
jksoft 0:425791fe4b42 101 }
jksoft 0:425791fe4b42 102
jksoft 0:425791fe4b42 103 int HCI::SendCmd(int cmd, const u8* params, int len)
jksoft 0:425791fe4b42 104 {
jksoft 0:425791fe4b42 105 u8 b[32];
jksoft 0:425791fe4b42 106 b[0] = cmd;
jksoft 0:425791fe4b42 107 b[1] = (cmd >> 8);
jksoft 0:425791fe4b42 108 b[2] = len;
jksoft 0:425791fe4b42 109 if (params)
jksoft 0:425791fe4b42 110 memcpy(b+3,params,len);
jksoft 0:425791fe4b42 111 _transport->HCISend(b,len+3);
jksoft 0:425791fe4b42 112 return 0;
jksoft 0:425791fe4b42 113 }
jksoft 0:425791fe4b42 114
jksoft 0:425791fe4b42 115 void HCI::OnCommandComplete(int cmd, const u8* data, int len)
jksoft 0:425791fe4b42 116 {
jksoft 0:425791fe4b42 117 // printf("%04X %s",cmd,CmdStr(cmd));
jksoft 0:425791fe4b42 118 if (len < 0)
jksoft 0:425791fe4b42 119 return;
jksoft 0:425791fe4b42 120 //printfBytes(" complete",data,min(16,len));
jksoft 0:425791fe4b42 121
jksoft 0:425791fe4b42 122 switch (cmd)
jksoft 0:425791fe4b42 123 {
jksoft 0:425791fe4b42 124 // Init phase 0
jksoft 0:425791fe4b42 125 case HCI_OP_RESET: // Reset done, init chain to HCI_OP_READ_LOCAL_NAME
jksoft 0:425791fe4b42 126 SendCmd(HCI_OP_READ_BUFFER_SIZE);
jksoft 0:425791fe4b42 127 _state |= MASK_RESET;
jksoft 0:425791fe4b42 128 break;
jksoft 0:425791fe4b42 129
jksoft 0:425791fe4b42 130 // Init phase 1
jksoft 0:425791fe4b42 131 case HCI_OP_READ_BUFFER_SIZE:
jksoft 0:425791fe4b42 132 _acl_mtu = LE16(data);
jksoft 0:425791fe4b42 133 _sco_mtu = data[2];
jksoft 0:425791fe4b42 134 _acl_max_pkt = LE16(data+3);
jksoft 0:425791fe4b42 135 _sco_max_pkt = LE16(data+5);
jksoft 0:425791fe4b42 136 SendCmd(HCI_OP_READ_BD_ADDR);
jksoft 0:425791fe4b42 137 _state |= MASK_READ_BUFFER_SIZE;
jksoft 0:425791fe4b42 138 break;
jksoft 0:425791fe4b42 139
jksoft 0:425791fe4b42 140 // Init phase 2
jksoft 0:425791fe4b42 141 case HCI_OP_READ_BD_ADDR:
jksoft 0:425791fe4b42 142 _localAddr = *((BD_ADDR*)data); // Local Address
jksoft 0:425791fe4b42 143 _state |= MASK_READ_BD_ADDR;
jksoft 0:425791fe4b42 144 _state |= MASK_INITED;
jksoft 0:425791fe4b42 145 Callback(CALLBACK_READY,data,6);
jksoft 0:425791fe4b42 146 break;
jksoft 0:425791fe4b42 147
jksoft 0:425791fe4b42 148 // 0CXX
jksoft 0:425791fe4b42 149 case HCI_OP_READ_LOCAL_NAME:
jksoft 0:425791fe4b42 150 break;
jksoft 0:425791fe4b42 151
jksoft 0:425791fe4b42 152 case HCI_OP_READ_LOCAL_VERSION:
jksoft 0:425791fe4b42 153 // params
jksoft 0:425791fe4b42 154 //SendCmd(HCI_OP_READ_LOCAL_NAME);
jksoft 0:425791fe4b42 155 break;
jksoft 0:425791fe4b42 156
jksoft 0:425791fe4b42 157 case HCI_OP_READ_LOCAL_COMMANDS:
jksoft 0:425791fe4b42 158 break;
jksoft 0:425791fe4b42 159
jksoft 0:425791fe4b42 160 case HCI_OP_READ_LOCAL_FEATURES:
jksoft 0:425791fe4b42 161 //SendCmd(HCI_OP_READ_LOCAL_VERSION);
jksoft 0:425791fe4b42 162 break;
jksoft 0:425791fe4b42 163
jksoft 0:425791fe4b42 164 case HCI_OP_READ_LOCAL_EXT_FEATURES:
jksoft 0:425791fe4b42 165 break;
jksoft 0:425791fe4b42 166
jksoft 0:425791fe4b42 167 case HCI_OP_PIN_CODE_REPLY:
jksoft 0:425791fe4b42 168 printf("Got pin reply\n");
jksoft 0:425791fe4b42 169 break;
jksoft 0:425791fe4b42 170
jksoft 0:425791fe4b42 171 default:
jksoft 0:425791fe4b42 172 printf("Unrecognized Command %04X\n",cmd);
jksoft 0:425791fe4b42 173 break;
jksoft 0:425791fe4b42 174 }
jksoft 0:425791fe4b42 175 }
jksoft 0:425791fe4b42 176
jksoft 0:425791fe4b42 177 void HCI::Callback(HCI_CALLBACK_EVENT c, const u8* data, int len)
jksoft 0:425791fe4b42 178 {
jksoft 0:425791fe4b42 179 _callback(this,c,data,len);
jksoft 0:425791fe4b42 180 }
jksoft 0:425791fe4b42 181
jksoft 0:425791fe4b42 182 int HCI::RemoteNameRequest(const BD_ADDR* addr)
jksoft 0:425791fe4b42 183 {
jksoft 0:425791fe4b42 184 _state |= MASK_REMOTE_NAME;
jksoft 0:425791fe4b42 185 u8 buf[6+4];
jksoft 0:425791fe4b42 186 memset(buf,0,sizeof(buf));
jksoft 0:425791fe4b42 187 memcpy(buf,addr,6);
jksoft 0:425791fe4b42 188 buf[7] = 1;
jksoft 0:425791fe4b42 189 return SendCmd(HCI_OP_REMOTE_NAME_REQ,buf,sizeof(buf));
jksoft 0:425791fe4b42 190 }
jksoft 0:425791fe4b42 191
jksoft 0:425791fe4b42 192 int HCI::CreateConnection(const BD_ADDR* remoteAddr)
jksoft 0:425791fe4b42 193 {
jksoft 0:425791fe4b42 194 _state |= MASK_CREATE_CONNECTION;
jksoft 0:425791fe4b42 195 u8 buf[6+7];
jksoft 0:425791fe4b42 196 memset(buf,0,sizeof(buf));
jksoft 0:425791fe4b42 197 memcpy(buf,remoteAddr,6);
jksoft 0:425791fe4b42 198 buf[6] = 0x18; // DM1,DH1
jksoft 0:425791fe4b42 199 buf[7] = 0xCC; // DM3, DH3, DM5, DH5
jksoft 0:425791fe4b42 200 buf[8] = 1; // Page Repetition R1
jksoft 0:425791fe4b42 201 return SendCmd(HCI_OP_CREATE_CONN,buf,sizeof(buf));
jksoft 0:425791fe4b42 202 }
jksoft 0:425791fe4b42 203
jksoft 0:425791fe4b42 204 int HCI::Disconnect(const BD_ADDR* bdaddr)
jksoft 0:425791fe4b42 205 {
jksoft 0:425791fe4b42 206 BTDevice* d = Find(bdaddr);
jksoft 0:425791fe4b42 207 if (!d)
jksoft 0:425791fe4b42 208 return ERR_HCI_DEVICE_NOT_FOUND;
jksoft 0:425791fe4b42 209 int handle = d->_handle;
jksoft 0:425791fe4b42 210 printf("Disconnect from %d\n",handle);
jksoft 0:425791fe4b42 211 _state |= MASK_CREATE_CONNECTION;
jksoft 0:425791fe4b42 212 u8 buf[3];
jksoft 0:425791fe4b42 213 buf[0] = handle;
jksoft 0:425791fe4b42 214 buf[1] = (handle >> 8);
jksoft 0:425791fe4b42 215 buf[2] = 0x13;
jksoft 0:425791fe4b42 216 return SendCmd(HCI_OP_DISCONNECT,buf,sizeof(buf));
jksoft 0:425791fe4b42 217 }
jksoft 0:425791fe4b42 218
jksoft 0:425791fe4b42 219 void HCI::DisconnectComplete(int handle)
jksoft 0:425791fe4b42 220 {
jksoft 0:425791fe4b42 221 BTDevice* d = Find(handle);
jksoft 0:425791fe4b42 222 if (!d)
jksoft 0:425791fe4b42 223 return;
jksoft 0:425791fe4b42 224 d->_handle = 0;
jksoft 0:425791fe4b42 225 }
jksoft 0:425791fe4b42 226
jksoft 0:425791fe4b42 227 int HCI::DisconnectAll()
jksoft 0:425791fe4b42 228 {
jksoft 0:425791fe4b42 229 BTDevice* devs[8];
jksoft 0:425791fe4b42 230 int count = GetDevices(devs,8);
jksoft 0:425791fe4b42 231 for (int i = 0; i < count; i++)
jksoft 0:425791fe4b42 232 Disconnect(&devs[i]->_info.bdaddr);
jksoft 0:425791fe4b42 233 return 0;
jksoft 0:425791fe4b42 234 }
jksoft 0:425791fe4b42 235
jksoft 0:425791fe4b42 236 int HCI::PinCodeReply(const u8* data)
jksoft 0:425791fe4b42 237 {
jksoft 0:425791fe4b42 238 u8 b[6+1+16];
jksoft 0:425791fe4b42 239 memset(b,0,sizeof(b));
jksoft 0:425791fe4b42 240 memcpy(b,data,6);
jksoft 0:425791fe4b42 241 b[6] = 4;
jksoft 0:425791fe4b42 242 b[7] = '0';
jksoft 0:425791fe4b42 243 b[8] = '0';
jksoft 0:425791fe4b42 244 b[9] = '0';
jksoft 0:425791fe4b42 245 b[10] = '0';
jksoft 0:425791fe4b42 246 return SendCmd(HCI_OP_PIN_CODE_REPLY,b,sizeof(b));
jksoft 0:425791fe4b42 247 }
jksoft 0:425791fe4b42 248
jksoft 0:425791fe4b42 249 void HCI::InquiryResult(const inquiry_info* info)
jksoft 0:425791fe4b42 250 {
jksoft 0:425791fe4b42 251 BTDevice* bt = Find(&info->bdaddr);
jksoft 0:425791fe4b42 252 if (!bt) // new device
jksoft 0:425791fe4b42 253 {
jksoft 0:425791fe4b42 254 for (int i = 0; i < MAX_BTDEVICES; i++)
jksoft 0:425791fe4b42 255 {
jksoft 0:425791fe4b42 256 if (_devices[i]._state == 0)
jksoft 0:425791fe4b42 257 {
jksoft 0:425791fe4b42 258 bt = _devices + i;
jksoft 0:425791fe4b42 259 bt->_state = 1;
jksoft 0:425791fe4b42 260 break;
jksoft 0:425791fe4b42 261 }
jksoft 0:425791fe4b42 262 }
jksoft 0:425791fe4b42 263 if (!bt)
jksoft 0:425791fe4b42 264 {
jksoft 0:425791fe4b42 265 printf("HCI::InquiryResult too many devices\n");
jksoft 0:425791fe4b42 266 return; // Too many devices!
jksoft 0:425791fe4b42 267 }
jksoft 0:425791fe4b42 268 }
jksoft 0:425791fe4b42 269
jksoft 0:425791fe4b42 270 bt->_info = *info;
jksoft 0:425791fe4b42 271 }
jksoft 0:425791fe4b42 272
jksoft 0:425791fe4b42 273 int HCI::GetDevices(BTDevice** devices, int maxDevices)
jksoft 0:425791fe4b42 274 {
jksoft 0:425791fe4b42 275 int j = 0;
jksoft 0:425791fe4b42 276 for (int i = 0; i < MAX_BTDEVICES; i++)
jksoft 0:425791fe4b42 277 {
jksoft 0:425791fe4b42 278 if (_devices[i]._state != 0)
jksoft 0:425791fe4b42 279 {
jksoft 0:425791fe4b42 280 devices[j++] = _devices + i;
jksoft 0:425791fe4b42 281 if (j == maxDevices)
jksoft 0:425791fe4b42 282 break;
jksoft 0:425791fe4b42 283 }
jksoft 0:425791fe4b42 284 }
jksoft 0:425791fe4b42 285 return j;
jksoft 0:425791fe4b42 286 }
jksoft 0:425791fe4b42 287
jksoft 0:425791fe4b42 288 void HCI::RemoteName(const BD_ADDR* addr, const char* name)
jksoft 0:425791fe4b42 289 {
jksoft 0:425791fe4b42 290 BTDevice* d = Find(addr);
jksoft 0:425791fe4b42 291 if (d)
jksoft 0:425791fe4b42 292 {
jksoft 0:425791fe4b42 293 strncpy(d->_name,name,sizeof(d->_name)-1);
jksoft 0:425791fe4b42 294 d->_name[sizeof(d->_name)-1] = 0;
jksoft 0:425791fe4b42 295 }
jksoft 0:425791fe4b42 296 }
jksoft 0:425791fe4b42 297
jksoft 0:425791fe4b42 298 void HCI::ConnectComplete(const connection_info* info)
jksoft 0:425791fe4b42 299 {
jksoft 0:425791fe4b42 300 BTDevice* d = Find(&info->bdaddr);
jksoft 0:425791fe4b42 301 if (!d)
jksoft 0:425791fe4b42 302 return;
jksoft 0:425791fe4b42 303 if (info->status == 0)
jksoft 0:425791fe4b42 304 {
jksoft 0:425791fe4b42 305 d->_handle = info->handle;
jksoft 0:425791fe4b42 306 printf("Connected on %04X\n",info->handle);
jksoft 0:425791fe4b42 307 } else
jksoft 0:425791fe4b42 308 printf("Connection failed with %d\n",info->status);
jksoft 0:425791fe4b42 309 }
jksoft 0:425791fe4b42 310
jksoft 0:425791fe4b42 311 void HCI::HCIRecv(const u8* data, int len)
jksoft 0:425791fe4b42 312 {
jksoft 0:425791fe4b42 313 // printfBytes(EvtStr(data[0]),data,min(len,16));
jksoft 0:425791fe4b42 314 switch (data[0])
jksoft 0:425791fe4b42 315 {
jksoft 0:425791fe4b42 316 case HCI_EV_INQUIRY_COMPLETE:
jksoft 0:425791fe4b42 317 printfBytes("Inquiry Complete",data,data[1]);
jksoft 0:425791fe4b42 318 _state &= ~MASK_INQUIRY;
jksoft 0:425791fe4b42 319 Callback(CALLBACK_INQUIRY_DONE,0,0);
jksoft 0:425791fe4b42 320 break;
jksoft 0:425791fe4b42 321
jksoft 0:425791fe4b42 322 case HCI_EV_INQUIRY_RESULT:
jksoft 0:425791fe4b42 323 {
jksoft 0:425791fe4b42 324 const u8* end = data[1] + data + 2;
jksoft 0:425791fe4b42 325 data += 3;
jksoft 0:425791fe4b42 326 while (data < end)
jksoft 0:425791fe4b42 327 {
jksoft 0:425791fe4b42 328 inquiry_info align;
jksoft 0:425791fe4b42 329 memcpy(&align,data,sizeof(inquiry_info));
jksoft 0:425791fe4b42 330 InquiryResult(&align);
jksoft 0:425791fe4b42 331 Callback(CALLBACK_INQUIRY_RESULT,(u8*)&align,sizeof(inquiry_info));
jksoft 0:425791fe4b42 332 data += 14;
jksoft 0:425791fe4b42 333 }
jksoft 0:425791fe4b42 334 }
jksoft 0:425791fe4b42 335 break;
jksoft 0:425791fe4b42 336
jksoft 0:425791fe4b42 337 case HCI_EV_CONN_COMPLETE:
jksoft 0:425791fe4b42 338 _state &= ~MASK_CREATE_CONNECTION;
jksoft 0:425791fe4b42 339 {
jksoft 0:425791fe4b42 340 connection_info align;
jksoft 0:425791fe4b42 341 memcpy(&align,data+2,sizeof(connection_info));
jksoft 0:425791fe4b42 342 ConnectComplete(&align);
jksoft 0:425791fe4b42 343 Callback(CALLBACK_CONNECTION_COMPLETE,(u8*)&align,sizeof(connection_info));
jksoft 0:425791fe4b42 344 }
jksoft 0:425791fe4b42 345 break;
jksoft 0:425791fe4b42 346
jksoft 0:425791fe4b42 347 case HCI_EV_CONN_REQUEST:
jksoft 0:425791fe4b42 348 break;
jksoft 0:425791fe4b42 349
jksoft 0:425791fe4b42 350 case HCI_EV_DISCONN_COMPLETE:
jksoft 0:425791fe4b42 351 DisconnectComplete(LE16(data+3));
jksoft 0:425791fe4b42 352 break;
jksoft 0:425791fe4b42 353
jksoft 0:425791fe4b42 354 case HCI_EV_REMOTE_NAME:
jksoft 0:425791fe4b42 355 {
jksoft 0:425791fe4b42 356 BD_ADDR* addr = (BD_ADDR*)(data+3);
jksoft 0:425791fe4b42 357 const char* name = (const char*)(data + 9);
jksoft 0:425791fe4b42 358 RemoteName(addr,name);
jksoft 0:425791fe4b42 359 }
jksoft 0:425791fe4b42 360 Callback(CALLBACK_REMOTE_NAME,data+3,LE16(data+1)); // addr is in here too
jksoft 0:425791fe4b42 361 _state &= ~MASK_REMOTE_NAME;
jksoft 0:425791fe4b42 362 break;
jksoft 0:425791fe4b42 363
jksoft 0:425791fe4b42 364 case HCI_EV_CMD_STATUS:
jksoft 0:425791fe4b42 365 {
jksoft 0:425791fe4b42 366 const char* errs = HCIErrStr(data[2]);
jksoft 0:425791fe4b42 367 printf("Status %s %s\n",CmdStr(LE16(data+4)),errs);
jksoft 0:425791fe4b42 368 }
jksoft 0:425791fe4b42 369 break;
jksoft 0:425791fe4b42 370
jksoft 0:425791fe4b42 371 case HCI_EV_CMD_COMPLETE:
jksoft 0:425791fe4b42 372 OnCommandComplete(data[3] | (data[4] << 8),data+6,data[1]-4);
jksoft 0:425791fe4b42 373 break;
jksoft 0:425791fe4b42 374
jksoft 0:425791fe4b42 375 case HCI_EV_PIN_CODE_REQ:
jksoft 0:425791fe4b42 376 PinCodeReply(data+2);
jksoft 0:425791fe4b42 377 break;
jksoft 0:425791fe4b42 378
jksoft 0:425791fe4b42 379 case HCI_EV_LINK_KEY_REQ:
jksoft 0:425791fe4b42 380 SendCmd(HCI_OP_LINK_KEY_NEG_REPLY,data+2,6);
jksoft 0:425791fe4b42 381 break;
jksoft 0:425791fe4b42 382
jksoft 0:425791fe4b42 383 default:
jksoft 0:425791fe4b42 384 ;
jksoft 0:425791fe4b42 385 // printfBytes(":",data,data[1]+2);
jksoft 0:425791fe4b42 386 }
jksoft 0:425791fe4b42 387 }
jksoft 0:425791fe4b42 388
jksoft 0:425791fe4b42 389 int HCI::Open(SocketInternal* sock, SocketAddrHdr* addr)
jksoft 0:425791fe4b42 390 {
jksoft 0:425791fe4b42 391 L2CAPSocket* l2capsock = (L2CAPSocket*)sock;
jksoft 0:425791fe4b42 392 L2CAPAddr* l2capaddr = (L2CAPAddr*)addr;
jksoft 0:425791fe4b42 393 BTDevice* bt = Find(&l2capaddr->bdaddr);
jksoft 0:425791fe4b42 394 if (!bt)
jksoft 0:425791fe4b42 395 {
jksoft 0:425791fe4b42 396 printf("Can't open l2cap %d on ",l2capaddr->psm);
jksoft 0:425791fe4b42 397 printf(&l2capaddr->bdaddr);
jksoft 0:425791fe4b42 398 printf("\n");
jksoft 0:425791fe4b42 399 return ERR_HCI_DEVICE_NOT_FOUND;
jksoft 0:425791fe4b42 400 }
jksoft 0:425791fe4b42 401 l2capsock->btdevice = bt;
jksoft 0:425791fe4b42 402 return bt->Open(sock,addr);
jksoft 0:425791fe4b42 403 }
jksoft 0:425791fe4b42 404
jksoft 0:425791fe4b42 405 int HCI::Send(SocketInternal* sock, const u8* data, int len)
jksoft 0:425791fe4b42 406 {
jksoft 0:425791fe4b42 407 L2CAPSocket* l2capsock = (L2CAPSocket*)sock;
jksoft 0:425791fe4b42 408 return l2capsock->btdevice->Send(sock,data,len); // Pointless double dispatch
jksoft 0:425791fe4b42 409 }
jksoft 0:425791fe4b42 410
jksoft 0:425791fe4b42 411 int HCI::Close(SocketInternal* sock)
jksoft 0:425791fe4b42 412 {
jksoft 0:425791fe4b42 413 L2CAPSocket* l2capsock = (L2CAPSocket*)sock;
jksoft 0:425791fe4b42 414 return l2capsock->btdevice->Close(sock); // Pointless double dispatch
jksoft 0:425791fe4b42 415 }
jksoft 0:425791fe4b42 416
jksoft 0:425791fe4b42 417 void HCI::ACLRecv(const u8* data, int len)
jksoft 0:425791fe4b42 418 {
jksoft 0:425791fe4b42 419 int handle = LE16(data);
jksoft 0:425791fe4b42 420 BTDevice* d = Find(handle & 0x0FFF);
jksoft 0:425791fe4b42 421 if (d)
jksoft 0:425791fe4b42 422 d->ACLRecv(data,len);
jksoft 0:425791fe4b42 423 }
jksoft 0:425791fe4b42 424
jksoft 0:425791fe4b42 425 //===================================================================
jksoft 0:425791fe4b42 426 //===================================================================