blob: 9c5994855ab79d6b73fcfd97767c09b91decb151 [file] [log] [blame]
/*
* Copyright (C) 2013 Intel Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
#include <endian.h>
#include <hardware/bluetooth.h>
#define MAX_UUID_STR_LEN 37
#define HAL_UUID_LEN 16
#define MAX_ADDR_STR_LEN 18
static const char BT_BASE_UUID[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb
};
const char *bt_uuid_t2str(const uint8_t *uuid, char *buf);
const char *btuuid2str(const uint8_t *uuid);
const char *bt_bdaddr_t2str(const bt_bdaddr_t *bd_addr, char *buf);
void str2bt_bdaddr_t(const char *str, bt_bdaddr_t *bd_addr);
void str2bt_uuid_t(const char *str, bt_uuid_t *uuid);
const char *btproperty2str(const bt_property_t *property);
const char *bdaddr2str(const bt_bdaddr_t *bd_addr);
int get_config(const char *config_key, char *value, const char *fallback);
/*
* Begin mapping section
*
* There are some mappings between integer values (enums) and strings
* to be presented to user. To make it easier to convert between those two
* set of macros is given. It is specially useful when we want to have
* strings that match constants from header files like:
* BT_STATUS_SUCCESS (0) and corresponding "BT_STATUS_SUCCESS"
* Example of usage:
*
* INTMAP(int, -1, "invalid")
* DELEMENT(BT_STATUS_SUCCESS)
* DELEMENT(BT_STATUS_FAIL)
* MELEMENT(123, "Some strange value")
* ENDMAP
*
* Just by doing this we have mapping table plus two functions:
* int str2int(const char *str);
* const char *int2str(int v);
*
* second argument to INTMAP specifies value to be returned from
* str2int function when there is not mapping for such number
* third argument specifies default value to be returned from int2str
*
* If same mapping is to be used in several source files put
* INTMAP in c file and DECINTMAP in h file.
*
* For mappings that are to be used in single file only
* use SINTMAP which will create the same but everything will be marked
* as static.
*/
struct int2str {
int val; /* int value */
const char *str; /* corresponding string */
};
int int2str_findint(int v, const struct int2str m[]);
int int2str_findstr(const char *str, const struct int2str m[]);
const char *enum_defines(void *v, int i);
const char *enum_strings(void *v, int i);
const char *enum_one_string(void *v, int i);
#define TYPE_ENUM(type) ((void *) &__##type##2str[0])
#define DECINTMAP(type) \
extern struct int2str __##type##2str[]; \
const char *type##2##str(type v); \
type str##2##type(const char *str); \
#define INTMAP(type, deft, defs) \
const char *type##2##str(type v) \
{ \
int i = int2str_findint((int) v, __##type##2str); \
return (i < 0) ? defs : __##type##2str[i].str; \
} \
type str##2##type(const char *str) \
{ \
int i = int2str_findstr(str, __##type##2str); \
return (i < 0) ? (type) deft : (type) (__##type##2str[i].val); \
} \
struct int2str __##type##2str[] = {
#define SINTMAP(type, deft, defs) \
static struct int2str __##type##2str[]; \
static inline const char *type##2##str(type v) \
{ \
int i = int2str_findint((int) v, __##type##2str); \
return (i < 0) ? defs : __##type##2str[i].str; \
} \
static inline type str##2##type(const char *str) \
{ \
int i = int2str_findstr(str, __##type##2str); \
return (i < 0) ? (type) deft : (type) (__##type##2str[i].val); \
} \
static struct int2str __##type##2str[] = {
#define ENDMAP {0, NULL} };
/* use this to generate string from header file constant */
#define MELEMENT(v, s) {v, s}
/* use this to have arbitrary mapping from int to string */
#define DELEMENT(s) {s, #s}
/* End of mapping section */
DECINTMAP(bt_status_t);
DECINTMAP(bt_state_t);
DECINTMAP(bt_device_type_t);
DECINTMAP(bt_scan_mode_t);
DECINTMAP(bt_discovery_state_t);
DECINTMAP(bt_acl_state_t);
DECINTMAP(bt_bond_state_t);
DECINTMAP(bt_ssp_variant_t);
DECINTMAP(bt_property_type_t);
DECINTMAP(bt_cb_thread_evt);
static inline uint16_t get_le16(const void *src)
{
const struct __attribute__((packed)) {
uint16_t le16;
} *p = src;
return le16toh(p->le16);
}
static inline void put_le16(uint16_t val, void *dst)
{
struct __attribute__((packed)) {
uint16_t le16;
} *p = dst;
p->le16 = htole16(val);
}