Simons Wii controlled m3pi program

Dependencies:   mbed m3pi ID12RFIDIRQ

Committer:
chris
Date:
Wed May 18 14:50:46 2011 +0000
Revision:
0:0ab65a1aef12
Added some printing to the m3pi screen

Who changed what in which revision?

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