Simon Ford / Mbed 2 deprecated WiiRacing

Dependencies:   mbed m3pi ID12RFIDIRQ

Committer:
simon
Date:
Mon Apr 11 23:03:22 2011 +0000
Revision:
0:e2ef12467862

        

Who changed what in which revision?

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