/*
 * Copyright (c) 2019 Intel corporation
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#ifndef _TRACE_BACKEND_H
#define _TRACE_BACKEND_H

#include <string.h>
#include <zephyr/sys/util.h>

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @brief Tracing backend
 * @defgroup Tracing_backend Tracing backend
 * @{
 * @}
 */

struct tracing_backend;

/**
 * @brief Tracing backend API.
 */
struct tracing_backend_api {
	void (*init)(void);
	void (*output)(const struct tracing_backend *backend,
		       uint8_t *data, uint32_t length);
};

/**
 * @brief Tracing backend structure.
 */
struct tracing_backend {
	const char *name;
	const struct tracing_backend_api *api;
};

/**
 * @brief Create tracing_backend instance.
 *
 * @param _name Instance name.
 * @param _api  Tracing backend API.
 */
#define TRACING_BACKEND_DEFINE(_name, _api)                              \
	static const STRUCT_SECTION_ITERABLE(tracing_backend, _name) = { \
		.name = STRINGIFY(_name),                                \
		.api = &_api                                             \
	}

/**
 * @brief Initialize tracing backend.
 *
 * @param backend Pointer to tracing_backend instance.
 */
static inline void tracing_backend_init(
		const struct tracing_backend *backend)
{
	if (backend && backend->api && backend->api->init) {
		backend->api->init();
	}
}

/**
 * @brief Output tracing packet with tracing backend.
 *
 * @param backend Pointer to tracing_backend instance.
 * @param data    Address of outputting buffer.
 * @param length  Length of outputting buffer.
 */
static inline void tracing_backend_output(
		const struct tracing_backend *backend,
		uint8_t *data, uint32_t length)
{
	if (backend && backend->api) {
		backend->api->output(backend, data, length);
	}
}

/**
 * @brief Get tracing backend based on the name of
 *        tracing backend in tracing backend section.
 *
 * @param name Name of wanted tracing backend.
 *
 * @return Pointer of the wanted backend or NULL.
 */
static inline struct tracing_backend *tracing_backend_get(char *name)
{
	STRUCT_SECTION_FOREACH(tracing_backend, backend) {
		if (strcmp(backend->name, name) == 0) {
			return backend;
		}
	}

	return NULL;
}

#ifdef __cplusplus
}
#endif

#endif
