2 * Copyright (C) 2013 Intel Corporation
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
23 #include <cutils/properties.h>
26 #include "hal-utils.h"
29 * converts uuid to string
30 * buf should be at least 39 bytes
32 * returns string representation of uuid
34 const char *bt_uuid_t2str(const uint8_t *uuid, char *buf)
41 return strcpy(buf, "NULL");
43 is_bt = !memcmp(&uuid[4], &BT_BASE_UUID[4], HAL_UUID_LEN - 4);
45 for (i = 0; i < HAL_UUID_LEN; i++) {
49 if (i == 4 || i == 6 || i == 8 || i == 10) {
50 buf[i * 2 + shift] = '-';
53 sprintf(buf + i * 2 + shift, "%02x", uuid[i]);
59 const char *btuuid2str(const uint8_t *uuid)
61 static char buf[MAX_UUID_STR_LEN];
63 return bt_uuid_t2str(uuid, buf);
66 INTMAP(bt_status_t, -1, "(unknown)")
67 DELEMENT(BT_STATUS_SUCCESS),
68 DELEMENT(BT_STATUS_FAIL),
69 DELEMENT(BT_STATUS_NOT_READY),
70 DELEMENT(BT_STATUS_NOMEM),
71 DELEMENT(BT_STATUS_BUSY),
72 DELEMENT(BT_STATUS_DONE),
73 DELEMENT(BT_STATUS_UNSUPPORTED),
74 DELEMENT(BT_STATUS_PARM_INVALID),
75 DELEMENT(BT_STATUS_UNHANDLED),
76 DELEMENT(BT_STATUS_AUTH_FAILURE),
77 DELEMENT(BT_STATUS_RMT_DEV_DOWN),
80 INTMAP(bt_state_t, -1, "(unknown)")
81 DELEMENT(BT_STATE_OFF),
82 DELEMENT(BT_STATE_ON),
85 INTMAP(bt_device_type_t, -1, "(unknown)")
86 DELEMENT(BT_DEVICE_DEVTYPE_BREDR),
87 DELEMENT(BT_DEVICE_DEVTYPE_BLE),
88 DELEMENT(BT_DEVICE_DEVTYPE_DUAL),
91 INTMAP(bt_scan_mode_t, -1, "(unknown)")
92 DELEMENT(BT_SCAN_MODE_NONE),
93 DELEMENT(BT_SCAN_MODE_CONNECTABLE),
94 DELEMENT(BT_SCAN_MODE_CONNECTABLE_DISCOVERABLE),
97 INTMAP(bt_discovery_state_t, -1, "(unknown)")
98 DELEMENT(BT_DISCOVERY_STOPPED),
99 DELEMENT(BT_DISCOVERY_STARTED),
102 INTMAP(bt_acl_state_t, -1, "(unknown)")
103 DELEMENT(BT_ACL_STATE_CONNECTED),
104 DELEMENT(BT_ACL_STATE_DISCONNECTED),
107 INTMAP(bt_bond_state_t, -1, "(unknown)")
108 DELEMENT(BT_BOND_STATE_NONE),
109 DELEMENT(BT_BOND_STATE_BONDING),
110 DELEMENT(BT_BOND_STATE_BONDED),
113 INTMAP(bt_ssp_variant_t, -1, "(unknown)")
114 DELEMENT(BT_SSP_VARIANT_PASSKEY_CONFIRMATION),
115 DELEMENT(BT_SSP_VARIANT_PASSKEY_ENTRY),
116 DELEMENT(BT_SSP_VARIANT_CONSENT),
117 DELEMENT(BT_SSP_VARIANT_PASSKEY_NOTIFICATION),
120 #if ANDROID_VERSION >= PLATFORM_VER(5, 0, 0)
121 INTMAP(bt_property_type_t, -1, "(unknown)")
122 DELEMENT(BT_PROPERTY_BDNAME),
123 DELEMENT(BT_PROPERTY_BDADDR),
124 DELEMENT(BT_PROPERTY_UUIDS),
125 DELEMENT(BT_PROPERTY_CLASS_OF_DEVICE),
126 DELEMENT(BT_PROPERTY_TYPE_OF_DEVICE),
127 DELEMENT(BT_PROPERTY_SERVICE_RECORD),
128 DELEMENT(BT_PROPERTY_ADAPTER_SCAN_MODE),
129 DELEMENT(BT_PROPERTY_ADAPTER_BONDED_DEVICES),
130 DELEMENT(BT_PROPERTY_ADAPTER_DISCOVERY_TIMEOUT),
131 DELEMENT(BT_PROPERTY_REMOTE_FRIENDLY_NAME),
132 DELEMENT(BT_PROPERTY_REMOTE_RSSI),
133 DELEMENT(BT_PROPERTY_REMOTE_VERSION_INFO),
134 DELEMENT(BT_PROPERTY_LOCAL_LE_FEATURES),
135 DELEMENT(BT_PROPERTY_REMOTE_DEVICE_TIMESTAMP),
138 INTMAP(bt_property_type_t, -1, "(unknown)")
139 DELEMENT(BT_PROPERTY_BDNAME),
140 DELEMENT(BT_PROPERTY_BDADDR),
141 DELEMENT(BT_PROPERTY_UUIDS),
142 DELEMENT(BT_PROPERTY_CLASS_OF_DEVICE),
143 DELEMENT(BT_PROPERTY_TYPE_OF_DEVICE),
144 DELEMENT(BT_PROPERTY_SERVICE_RECORD),
145 DELEMENT(BT_PROPERTY_ADAPTER_SCAN_MODE),
146 DELEMENT(BT_PROPERTY_ADAPTER_BONDED_DEVICES),
147 DELEMENT(BT_PROPERTY_ADAPTER_DISCOVERY_TIMEOUT),
148 DELEMENT(BT_PROPERTY_REMOTE_FRIENDLY_NAME),
149 DELEMENT(BT_PROPERTY_REMOTE_RSSI),
150 DELEMENT(BT_PROPERTY_REMOTE_VERSION_INFO),
151 DELEMENT(BT_PROPERTY_REMOTE_DEVICE_TIMESTAMP),
155 INTMAP(bt_cb_thread_evt, -1, "(unknown)")
156 DELEMENT(ASSOCIATE_JVM),
157 DELEMENT(DISASSOCIATE_JVM),
160 /* Find first index of given value in table m */
161 int int2str_findint(int v, const struct int2str m[])
165 for (i = 0; m[i].str; ++i) {
172 /* Find first index of given string in table m */
173 int int2str_findstr(const char *str, const struct int2str m[])
177 for (i = 0; m[i].str; ++i) {
178 if (strcmp(m[i].str, str) == 0)
185 * convert bd_addr to string
186 * buf must be at least 18 char long
190 const char *bt_bdaddr_t2str(const bt_bdaddr_t *bd_addr, char *buf)
195 return strcpy(buf, "NULL");
197 p = bd_addr->address;
199 snprintf(buf, MAX_ADDR_STR_LEN, "%02x:%02x:%02x:%02x:%02x:%02x",
200 p[0], p[1], p[2], p[3], p[4], p[5]);
205 /* converts string to bt_bdaddr_t */
206 void str2bt_bdaddr_t(const char *str, bt_bdaddr_t *bd_addr)
208 uint8_t *p = bd_addr->address;
210 sscanf(str, "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
211 &p[0], &p[1], &p[2], &p[3], &p[4], &p[5]);
214 /* converts string to uuid */
215 void str2bt_uuid_t(const char *str, bt_uuid_t *uuid)
219 memcpy(uuid, BT_BASE_UUID, sizeof(bt_uuid_t));
221 while (*str && i < (int) sizeof(bt_uuid_t)) {
225 if (sscanf(str, "%02hhx", &uuid->uu[i]) != 1)
233 const char *enum_defines(void *v, int i)
235 const struct int2str *m = v;
237 return m[i].str != NULL ? m[i].str : NULL;
240 const char *enum_strings(void *v, int i)
244 return m[i] != NULL ? m[i] : NULL;
247 const char *enum_one_string(void *v, int i)
251 return (i == 0) && (m[0] != 0) ? m : NULL;
254 const char *bdaddr2str(const bt_bdaddr_t *bd_addr)
256 static char buf[MAX_ADDR_STR_LEN];
258 return bt_bdaddr_t2str(bd_addr, buf);
261 static void bonded_devices2string(char *str, void *prop, int prop_len)
263 int count = prop_len / sizeof(bt_bdaddr_t);
264 bt_bdaddr_t *addr = prop;
269 strcat(str, bdaddr2str(addr));
278 static void uuids2string(char *str, void *prop, int prop_len)
280 int count = prop_len / sizeof(bt_uuid_t);
281 bt_uuid_t *uuid = prop;
286 strcat(str, btuuid2str(uuid->uu));
295 #if ANDROID_VERSION >= PLATFORM_VER(5, 0, 0)
296 static void local_le_feat2string(char *str, const bt_local_le_features_t *f)
300 str += sprintf(str, "{\n");
302 str += sprintf(str, "Privacy supported: %s,\n",
303 f->local_privacy_enabled ? "TRUE" : "FALSE");
305 str += sprintf(str, "Num of advertising instances: %u,\n",
306 f->max_adv_instance);
308 str += sprintf(str, "PRA offloading support: %s,\n",
309 f->rpa_offload_supported ? "TRUE" : "FALSE");
311 str += sprintf(str, "Num of offloaded IRKs: %u,\n",
312 f->max_irk_list_size);
314 str += sprintf(str, "Num of offloaded scan filters: %u,\n",
315 f->max_adv_filter_supported);
317 scan_num = (f->scan_result_storage_size_hibyte << 8) +
318 f->scan_result_storage_size_lobyte;
320 str += sprintf(str, "Num of offloaded scan results: %u,\n", scan_num);
322 str += sprintf(str, "Activity & energy report support: %s\n",
323 f->activity_energy_info_supported ? "TRUE" : "FALSE");
329 const char *btproperty2str(const bt_property_t *property)
331 bt_service_record_t *rec;
332 static char buf[4096];
335 p = buf + sprintf(buf, "type=%s len=%d val=",
336 bt_property_type_t2str(property->type),
339 switch (property->type) {
340 case BT_PROPERTY_BDNAME:
341 case BT_PROPERTY_REMOTE_FRIENDLY_NAME:
342 snprintf(p, property->len + 1, "%s",
343 ((bt_bdname_t *) property->val)->name);
345 case BT_PROPERTY_BDADDR:
346 sprintf(p, "%s", bdaddr2str((bt_bdaddr_t *) property->val));
348 case BT_PROPERTY_CLASS_OF_DEVICE:
349 sprintf(p, "%06x", *((int *) property->val));
351 case BT_PROPERTY_TYPE_OF_DEVICE:
352 sprintf(p, "%s", bt_device_type_t2str(
353 *((bt_device_type_t *) property->val)));
355 case BT_PROPERTY_REMOTE_RSSI:
356 sprintf(p, "%d", *((char *) property->val));
358 case BT_PROPERTY_ADAPTER_SCAN_MODE:
360 bt_scan_mode_t2str(*((bt_scan_mode_t *) property->val)));
362 case BT_PROPERTY_ADAPTER_DISCOVERY_TIMEOUT:
363 sprintf(p, "%d", *((int *) property->val));
365 case BT_PROPERTY_ADAPTER_BONDED_DEVICES:
366 bonded_devices2string(p, property->val, property->len);
368 case BT_PROPERTY_UUIDS:
369 uuids2string(p, property->val, property->len);
371 case BT_PROPERTY_SERVICE_RECORD:
373 sprintf(p, "{%s, %d, %s}", btuuid2str(rec->uuid.uu),
374 rec->channel, rec->name);
376 #if ANDROID_VERSION >= PLATFORM_VER(5, 0, 0)
377 case BT_PROPERTY_LOCAL_LE_FEATURES:
378 local_le_feat2string(p, property->val);
381 case BT_PROPERTY_REMOTE_VERSION_INFO:
382 case BT_PROPERTY_REMOTE_DEVICE_TIMESTAMP:
384 sprintf(p, "%p", property->val);
391 #define PROP_PREFIX "persist.sys.bluetooth."
392 #define PROP_PREFIX_RO "ro.bluetooth."
394 int get_config(const char *config_key, char *value, const char *fallback)
396 char key[PROPERTY_KEY_MAX];
399 if (strlen(config_key) + sizeof(PROP_PREFIX) > sizeof(key))
402 snprintf(key, sizeof(key), PROP_PREFIX"%s", config_key);
404 ret = property_get(key, value, "");
408 snprintf(key, sizeof(key), PROP_PREFIX_RO"%s", config_key);
410 ret = property_get(key, value, "");
417 return property_get(fallback, value, "");