/*
 * Copyright (c) 2017 - 2020, Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#ifndef NRFX_LOG_H__
#define NRFX_LOG_H__

#include <zephyr/logging/log.h>

#ifdef __cplusplus
extern "C" {
#endif

#define NRFX_MODULE_PREFIX  _CONCAT(NRFX_, NRFX_LOG_MODULE)
/*
 * The following macros from nrfx_config control the log messages coming from
 * a given module:
 * - NRFX_<module>_CONFIG_LOG_ENABLED enables the messages (when set to 1)
 * - NRFX_<module>_CONFIG_LOG_LEVEL specifies the severity level of the messages
 *   that are to be output.
 */
#if !IS_ENABLED(_CONCAT(NRFX_MODULE_PREFIX, _CONFIG_LOG_ENABLED))
#define NRFX_MODULE_CONFIG_LOG_LEVEL 0
#else
#define NRFX_MODULE_CONFIG_LOG_LEVEL \
	_CONCAT(NRFX_MODULE_PREFIX, _CONFIG_LOG_LEVEL)
#endif

#if	NRFX_MODULE_CONFIG_LOG_LEVEL == 0
#define NRFX_MODULE_LOG_LEVEL		LOG_LEVEL_NONE
#elif	NRFX_MODULE_CONFIG_LOG_LEVEL == 1
#define NRFX_MODULE_LOG_LEVEL		LOG_LEVEL_ERR
#elif	NRFX_MODULE_CONFIG_LOG_LEVEL == 2
#define NRFX_MODULE_LOG_LEVEL		LOG_LEVEL_WRN
#elif	NRFX_MODULE_CONFIG_LOG_LEVEL == 3
#define NRFX_MODULE_LOG_LEVEL		LOG_LEVEL_INF
#elif	NRFX_MODULE_CONFIG_LOG_LEVEL == 4
#define NRFX_MODULE_LOG_LEVEL		LOG_LEVEL_DBG
#endif
LOG_MODULE_REGISTER(NRFX_MODULE_PREFIX, NRFX_MODULE_LOG_LEVEL);

/**
 * @defgroup nrfx_log nrfx_log.h
 * @{
 * @ingroup nrfx
 *
 * @brief This file contains macros that should be implemented according to
 *        the needs of the host environment into which @em nrfx is integrated.
 */

/**
 * @brief Macro for logging a message with the severity level ERROR.
 *
 * @param ... printf-style format string, optionally followed by arguments
 *            to be formatted and inserted in the resulting string.
 */
#define NRFX_LOG_ERROR(...)  LOG_ERR(__VA_ARGS__)

/**
 * @brief Macro for logging a message with the severity level WARNING.
 *
 * @param ... printf-style format string, optionally followed by arguments
 *            to be formatted and inserted in the resulting string.
 */
#define NRFX_LOG_WARNING(...)  LOG_WRN(__VA_ARGS__)

/**
 * @brief Macro for logging a message with the severity level INFO.
 *
 * @param ... printf-style format string, optionally followed by arguments
 *            to be formatted and inserted in the resulting string.
 */
#define NRFX_LOG_INFO(...)  LOG_INF(__VA_ARGS__)

/**
 * @brief Macro for logging a message with the severity level DEBUG.
 *
 * @param ... printf-style format string, optionally followed by arguments
 *            to be formatted and inserted in the resulting string.
 */
#define NRFX_LOG_DEBUG(...)  LOG_DBG(__VA_ARGS__)

/**
 * @brief Macro for logging a memory dump with the severity level ERROR.
 *
 * @param[in] p_memory Pointer to the memory region to be dumped.
 * @param[in] length   Length of the memory region in bytes.
 */
#define NRFX_LOG_HEXDUMP_ERROR(p_memory, length) \
	LOG_HEXDUMP_ERR(p_memory, length, "")

/**
 * @brief Macro for logging a memory dump with the severity level WARNING.
 *
 * @param[in] p_memory Pointer to the memory region to be dumped.
 * @param[in] length   Length of the memory region in bytes.
 */
#define NRFX_LOG_HEXDUMP_WARNING(p_memory, length) \
	LOG_HEXDUMP_WRN(p_memory, length, "")

/**
 * @brief Macro for logging a memory dump with the severity level INFO.
 *
 * @param[in] p_memory Pointer to the memory region to be dumped.
 * @param[in] length   Length of the memory region in bytes.
 */
#define NRFX_LOG_HEXDUMP_INFO(p_memory, length) \
	LOG_HEXDUMP_INF(p_memory, length, "")

/**
 * @brief Macro for logging a memory dump with the severity level DEBUG.
 *
 * @param[in] p_memory Pointer to the memory region to be dumped.
 * @param[in] length   Length of the memory region in bytes.
 */
#define NRFX_LOG_HEXDUMP_DEBUG(p_memory, length) \
	LOG_HEXDUMP_DBG(p_memory, length, "")

/**
 * @brief Macro for getting the textual representation of a given error code.
 *
 * @param[in] error_code Error code.
 *
 * @return String containing the textual representation of the error code.
 */
#define NRFX_LOG_ERROR_STRING_GET(error_code)  nrfx_error_string_get(error_code)
extern char const *nrfx_error_string_get(nrfx_err_t code);

/** @} */

#ifdef __cplusplus
}
#endif

#endif // NRFX_LOG_H__
