This is the project for the Old Model Robots for OU's Dr. Davis's Configurable Robots Research. This is being published so future robots can be set up easily.

Dependencies:   FatFileSystem MCP3008 Motor PinDetect QTR_8A SRF05 SSD1308_128x64_I2C mbed

Committer:
DrewSchaef
Date:
Wed Nov 01 15:57:59 2017 +0000
Revision:
0:bcad524c1856
Published the project to allow access for future work on the Configurable Robots Research Project(s).

Who changed what in which revision?

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