A USB/360deg Rotational device, communicating via blue-tooth, test code

Dependencies:   FatFileSystem mbed

Committer:
lolpcc
Date:
Fri Dec 21 11:37:38 2012 +0000
Revision:
0:87da38093be9
Used to test the Lazy Susan at work, hence the A2D code in Utils.cpp

Who changed what in which revision?

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