1a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton/****************************************************************************** 2a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton * 3a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton * Copyright (C) 2014 Google, Inc. 4a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton * 5a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton * Licensed under the Apache License, Version 2.0 (the "License"); 6a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton * you may not use this file except in compliance with the License. 7a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton * You may obtain a copy of the License at: 8a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton * 9a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton * http://www.apache.org/licenses/LICENSE-2.0 10a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton * 11a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton * Unless required by applicable law or agreed to in writing, software 12a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton * distributed under the License is distributed on an "AS IS" BASIS, 13a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton * See the License for the specific language governing permissions and 15a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton * limitations under the License. 16a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton * 17a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton ******************************************************************************/ 18a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton 19911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "support/adapter.h" 20a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton#include "base.h" 21a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton#include "btcore/include/property.h" 22a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton#include "support/callbacks.h" 23a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton 24a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Mantonstatic bt_state_t state; 25a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Mantonstatic int property_count = 0; 26911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic bt_property_t* properties = NULL; 27a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Mantonstatic bt_discovery_state_t discovery_state; 28a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Mantonstatic bt_acl_state_t acl_state; 29a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Mantonstatic bt_bond_state_t bond_state; 30a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton 31911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void parse_properties(int num_properties, bt_property_t* property); 32a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton 33a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton// Returns the current adapter state. 34911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbt_state_t adapter_get_state() { return state; } 35a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton 36a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton// Returns the number of adapter properties. 37911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonint adapter_get_property_count() { return property_count; } 38a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton 39a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton// Returns the specified property. 40911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbt_property_t* adapter_get_property(bt_property_type_t type) { 41a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton for (int i = 0; i < property_count; ++i) { 42a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton if (properties[i].type == type) { 43a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton return &properties[i]; 44a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton } 45a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton } 46a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton 47a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton return NULL; 48a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton} 49a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton 50a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton// Returns the device discovery state. 51911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbt_discovery_state_t adapter_get_discovery_state() { return discovery_state; } 52a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton 53a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton// Returns the device acl state. 54911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbt_acl_state_t adapter_get_acl_state() { return acl_state; } 55a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton 56a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton// Returns the device bond state. 57911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbt_bond_state_t adapter_get_bond_state() { return bond_state; } 58a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton 59a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton// callback 609e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskivoid acl_state_changed(bt_status_t status, RawAddress* remote_bd_addr, 61911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bt_acl_state_t state) { 62a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton acl_state = state; 63a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton CALLBACK_RET(); 64a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton} 65a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton 66a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton// callback 67911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid adapter_properties(bt_status_t status, int num_properties, 68911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bt_property_t* new_properties) { 69a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton property_free_array(properties, property_count); 70a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton properties = property_copy_array(new_properties, num_properties); 71a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton property_count = num_properties; 72a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton 73a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton CALLBACK_RET(); 74a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton} 75a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton 76a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton// callback 77a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Mantonvoid adapter_state_changed(bt_state_t new_state) { 78a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton state = new_state; 79a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton CALLBACK_RET(); 80a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton} 81a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton 82a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton// callback 839e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskivoid bond_state_changed(bt_status_t status, RawAddress* bdaddr, 84911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bt_bond_state_t state) { 85a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton char buf[18]; 86a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton bond_state = state; 87a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton 88911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson const char* state_name = "Bond state unknown"; 89a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton switch (bond_state) { 90a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton case BT_BOND_STATE_NONE: 91a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton state_name = "Bond state none"; 92a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton break; 93a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton 94a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton case BT_BOND_STATE_BONDING: 95a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton state_name = "Bond state bonding"; 96a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton break; 97a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton 98a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton case BT_BOND_STATE_BONDED: 99a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton state_name = "Bond state bonded"; 100a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton break; 101a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton 102a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton // default none 103a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton } 104911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson fprintf(stdout, "Bond state changed callback addr:%s state:%s\n", 105911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bdaddr_to_string(bdaddr, buf, sizeof(buf)), state_name); 106a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton 107a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton CALLBACK_RET(); 108a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton} 109a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton 110a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton// callback 111911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid device_found(int num_properties, bt_property_t* property) { 112a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton fprintf(stdout, "Device found num_properties:%d\n", num_properties); 113a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton parse_properties(num_properties, property); 114a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton 115a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton CALLBACK_RET(); 116a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton} 117a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton 118a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton// callback 119a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Mantonvoid discovery_state_changed(bt_discovery_state_t state) { 120911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson const char* state_name = "Unknown"; 121a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton discovery_state = state; 122a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton 123a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton switch (discovery_state) { 124a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton case BT_DISCOVERY_STOPPED: 125a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton state_name = "Discovery stopped"; 126a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton break; 127a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton 128a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton case BT_DISCOVERY_STARTED: 129a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton state_name = "Discovery started"; 130a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton break; 131a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton 132a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton // default omitted 133a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton } 134a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton fprintf(stdout, "Discover state %s\n", state_name); 135a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton 136a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton CALLBACK_RET(); 137a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton} 138a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton 139a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton// callback 1409e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskivoid remote_device_properties(bt_status_t status, RawAddress* bdaddr, 141911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int num_properties, bt_property_t* properties) { 142a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton char buf[18]; 143a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton fprintf(stdout, "Device found bdaddr:%s num_properties:%d\n", 144911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bdaddr_to_string(bdaddr, buf, sizeof(buf)), num_properties); 145a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton 146a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton parse_properties(num_properties, properties); 147a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton 148a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton CALLBACK_RET(); 149a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton} 150a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton 151a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton// callback 1529e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskivoid ssp_request(RawAddress* remote_bd_addr, bt_bdname_t* bd_name, uint32_t cod, 1539e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowski bt_ssp_variant_t pairing_variant, uint32_t pass_key) { 154911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson char* pairing_variant_name = "Unknown"; 155a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton 156a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton switch (pairing_variant) { 157a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton case BT_SSP_VARIANT_PASSKEY_CONFIRMATION: 158a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton pairing_variant_name = "Passkey confirmation"; 159a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton break; 160a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton case BT_SSP_VARIANT_PASSKEY_ENTRY: 161a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton pairing_variant_name = "Passkey entry"; 162a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton break; 163a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton 164a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton case BT_SSP_VARIANT_CONSENT: 165a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton pairing_variant_name = "Passkey consent"; 166a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton break; 167a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton 168a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton case BT_SSP_VARIANT_PASSKEY_NOTIFICATION: 169a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton pairing_variant_name = "Passkey notification"; 170a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton break; 171a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton } 172a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton 173911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson fprintf(stdout, 174911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "Got ssp request device_class:%u passkey:%x pairing_variant:%s\n", 175911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cod, pass_key, pairing_variant_name); 176a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton char buf[18]; 177911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson fprintf(stdout, "Device found:%s %s\n", 178911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bdaddr_to_string(remote_bd_addr, buf, sizeof(buf)), bd_name->name); 179a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton 180a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton fprintf(stdout, "auto-accepting bond\n"); 181a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton bool accept = true; 182a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton int rc = bt_interface->ssp_reply(remote_bd_addr, pairing_variant, 183911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (uint8_t)accept, pass_key); 184a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton CALLBACK_RET(); 185a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton} 186a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton 187a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton// callback 188911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid thread_evt(bt_cb_thread_evt evt) { CALLBACK_RET(); } 189a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton 190911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void parse_properties(int num_properties, bt_property_t* property) { 191a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton while (num_properties-- > 0) { 192911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson switch (property->type) { 193911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BT_PROPERTY_BDNAME: { 194911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson const bt_bdname_t* name = property_as_name(property); 195911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (name) fprintf(stdout, " name:%s\n", name->name); 196911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } break; 197911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 198911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BT_PROPERTY_BDADDR: { 199911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson char buf[18]; 2009e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowski const RawAddress* addr = property_as_addr(property); 201911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (addr) 202911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson fprintf(stdout, " addr:%s\n", 203911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bdaddr_to_string(addr, buf, sizeof(buf))); 204911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } break; 205911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 206911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BT_PROPERTY_UUIDS: { 207911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson size_t num_uuid; 208911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson const bt_uuid_t* uuid = property_as_uuids(property, &num_uuid); 209911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (uuid) { 210911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (size_t i = 0; i < num_uuid; i++) { 211911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson fprintf(stdout, " uuid:%zd: ", i); 212911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (size_t j = 0; j < sizeof(uuid); j++) { 213911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson fprintf(stdout, "%02x", uuid->uu[j]); 214a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton } 215911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson fprintf(stdout, "\n"); 216a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton } 217a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton } 218911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } break; 219911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 220911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BT_PROPERTY_TYPE_OF_DEVICE: { 221911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bt_device_type_t device_type = property_as_device_type(property); 222911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (device_type) { 223911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson const struct { 224911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson const char* device_type; 225911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } device_type_lookup[] = { 226911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson {"Unknown"}, 227911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson {"Classic Only"}, 228911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson {"BLE Only"}, 229911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson {"Both Classic and BLE"}, 230911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson }; 231911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int idx = (int)device_type; 232911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (idx > BT_DEVICE_DEVTYPE_DUAL) idx = 0; 233911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson fprintf(stdout, " device_type:%s\n", 234911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson device_type_lookup[idx].device_type); 235a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton } 236911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } break; 237a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton 238911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BT_PROPERTY_CLASS_OF_DEVICE: { 239911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson const bt_device_class_t* dc = property_as_device_class(property); 240911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int dc_int = device_class_to_int(dc); 241911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson fprintf(stdout, " device_class:0x%x\n", dc_int); 242911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } break; 243a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton 244911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BT_PROPERTY_REMOTE_RSSI: { 245911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int8_t rssi = property_as_rssi(property); 246911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson fprintf(stdout, " rssi:%d\n", rssi); 247911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } break; 248a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton 249911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BT_PROPERTY_REMOTE_FRIENDLY_NAME: { 250911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson const bt_bdname_t* name = property_as_name(property); 251911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (name) fprintf(stdout, " remote_name:%s\n", name->name); 252911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } break; 253a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton 254a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton case BT_PROPERTY_SERVICE_RECORD: 255a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton case BT_PROPERTY_ADAPTER_SCAN_MODE: 256a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton case BT_PROPERTY_ADAPTER_BONDED_DEVICES: 257a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton case BT_PROPERTY_ADAPTER_DISCOVERY_TIMEOUT: 258a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton case BT_PROPERTY_REMOTE_VERSION_INFO: 259a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton case BT_PROPERTY_LOCAL_LE_FEATURES: 260a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton case BT_PROPERTY_REMOTE_DEVICE_TIMESTAMP: 261911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson default: { 262911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson fprintf(stderr, "Unhandled property type:%d len:%d\n", property->type, 263911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson property->len); 264911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p = (uint8_t*)property->val; 265911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (int i = 0; i < property->len; ++i, p++) { 266911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson fprintf(stderr, " %02x", *p); 267a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton } 268911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (property->len != 0) fprintf(stderr, "\n"); 269911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 270a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton } 271a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton property++; 272a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton } 273a6cee15a4757c1bdda99fa9491a2eec5421de722Chris Manton} 274