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