text: /** @file
   *  @brief Bluetooth subsystem logging helpers.
   */
  
  /*
   * Copyright (c) 2017 Nordic Semiconductor ASA
   * Copyright (c) 2015-2016 Intel Corporation
   *
   * SPDX-License-Identifier: Apache-2.0
   */
  #ifndef __BT_LOG_H
  #define __BT_LOG_H
  
  #include <linker/sections.h>
  #include <offsets.h>
  #include <zephyr.h>
  #include <logging/log.h>
  #include <sys/__assert.h>
  
  #include <bluetooth/bluetooth.h>
  #include <bluetooth/uuid.h>
  #include <bluetooth/hci.h>
  
  #ifdef __cplusplus
  extern "C" {
  #endif
  
  #if !defined(BT_DBG_ENABLED)
  #define BT_DBG_ENABLED 1
  #endif
  
  #if BT_DBG_ENABLED
  #define LOG_LEVEL LOG_LEVEL_DBG
  #else
  #define LOG_LEVEL CONFIG_BT_LOG_LEVEL
  #endif
  
  LOG_MODULE_REGISTER(LOG_MODULE_NAME, LOG_LEVEL);
  
  #define BT_DBG(fmt, ...) LOG_DBG(fmt, ##__VA_ARGS__)
  #define BT_ERR(fmt, ...) LOG_ERR(fmt, ##__VA_ARGS__)
  #define BT_WARN(fmt, ...) LOG_WRN(fmt, ##__VA_ARGS__)
  #define BT_INFO(fmt, ...) LOG_INF(fmt, ##__VA_ARGS__)
  
  #if defined(CONFIG_BT_ASSERT_VERBOSE)
  #define BT_ASSERT_PRINT(test) __ASSERT_LOC(test)
  #define BT_ASSERT_PRINT_MSG(fmt, ...) __ASSERT_MSG_INFO(fmt, ##__VA_ARGS__)
  #else
  #define BT_ASSERT_PRINT(test)
  #define BT_ASSERT_PRINT_MSG(fmt, ...)
  #endif /* CONFIG_BT_ASSERT_VERBOSE */
  
  #if defined(CONFIG_BT_ASSERT_PANIC)
  #define BT_ASSERT_DIE k_panic
  #else
  #define BT_ASSERT_DIE k_oops
  #endif /* CONFIG_BT_ASSERT_PANIC */
  
  #if defined(CONFIG_BT_ASSERT)
  #define BT_ASSERT(cond)                          \
  	do {                                     \
  		if (!(cond)) {                   \
  			BT_ASSERT_PRINT(cond);   \
  			BT_ASSERT_DIE();         \
  		}                                \
  	} while (0)
  
  #define BT_ASSERT_MSG(cond, fmt, ...)                              \
  	do {                                                       \
  		if (!(cond)) {                                     \
  			BT_ASSERT_PRINT(cond);                     \
  			BT_ASSERT_PRINT_MSG(fmt, ##__VA_ARGS__);   \
  			BT_ASSERT_DIE();                           \
  		}                                                  \
  	} while (0)
  #else
  #define BT_ASSERT(cond) __ASSERT_NO_MSG(cond)
  #define BT_ASSERT_MSG(cond, msg, ...) __ASSERT(cond, msg, ##__VA_ARGS__)
  #endif/* CONFIG_BT_ASSERT*/
  
  #define BT_HEXDUMP_DBG(_data, _length, _str) \
  		LOG_HEXDUMP_DBG((const u8_t *)_data, _length, _str)
  
  /* NOTE: These helper functions always encodes into the same buffer storage.
   * It is the responsibility of the user of this function to copy the information
   * in this string if needed.
   *
   * NOTE: These functions are not thread-safe!
   */
  const char *bt_hex_real(const void *buf, size_t len);
  const char *bt_addr_str_real(const bt_addr_t *addr);
  const char *bt_addr_le_str_real(const bt_addr_le_t *addr);
  const char *bt_uuid_str_real(const struct bt_uuid *uuid);
  
  /* NOTE: log_strdup does not guarantee a duplication of the string.
   * It is therefore still the responsibility of the user to handle the
   * restrictions in the underlying function call.
   */
  #define bt_hex(buf, len) log_strdup(bt_hex_real(buf, len))
  #define bt_addr_str(addr) log_strdup(bt_addr_str_real(addr))
  #define bt_addr_le_str(addr) log_strdup(bt_addr_le_str_real(addr))
  #define bt_uuid_str(uuid) log_strdup(bt_uuid_str_real(uuid))
  
  #ifdef __cplusplus
  }
  #endif
  
  #endif /* __BT_LOG_H */
  