/*
 * Copyright (c) 2016 Intel Corporation
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#define SYS_LOG_DOMAIN "sample-unified"

#include <zephyr.h>
#include <misc/printk.h>
#include <logging/sys_log.h>
#include <stdio.h>
#include <misc/ring_buffer.h>

#define LOG_BUF_SIZE (512)

/**
 * @file
 * @brief using logger hook demo
 * unified version of logger hook usage demo
 */

uint32_t logger_buffer[LOG_BUF_SIZE];

struct log_cbuffer {
	struct ring_buf ring_buffer;
} log_cbuffer;

static inline void ring_buf_print(struct ring_buf *buf);

int logger_put(struct log_cbuffer *logger, char *data, uint32_t data_size)
{
	int ret;
	uint8_t size32;
	int key;

	size32 = (data_size + 3) / 4;

	key = irq_lock();
	ret = sys_ring_buf_put(&logger->ring_buffer, 0, 0,
			       (uint32_t *)data, size32);
	irq_unlock(key);

	return ret;
}

void vlog_cbuf_put(const char *format, va_list args)
{
	char buf[512];
	int buf_size = 0;

	buf_size += vsnprintf(&buf[buf_size], sizeof(buf), format, args);
	logger_put(&log_cbuffer, buf, buf_size);
}

void log_cbuf_put(const char *format, ...)
{
	va_list args;

	va_start(args, format);
	vlog_cbuf_put(format, args);
	va_end(args);
}

void main(void)
{
#ifndef CONFIG_SYS_LOG
	printk("syslog hook sample configuration is not set correctly %s\n",
	       CONFIG_ARCH);
#else
	sys_ring_buf_init(&log_cbuffer.ring_buffer, LOG_BUF_SIZE,
			  logger_buffer);
	syslog_hook_install(log_cbuf_put);
	SYS_LOG_ERR("SYS LOG ERR is ACTIVE");
	ring_buf_print(&log_cbuffer.ring_buffer);
	SYS_LOG_WRN("SYS LOG WRN is ACTIVE");
	ring_buf_print(&log_cbuffer.ring_buffer);
	SYS_LOG_INF("SYS LOG INF is ACTIVE");
	ring_buf_print(&log_cbuffer.ring_buffer);
#endif
}

static inline void ring_buf_print(struct ring_buf *buf)
{
	uint8_t data[512];
	int ret, key;
	uint8_t size32 = sizeof(data) / 4;
	uint16_t type;
	uint8_t val;

	key = irq_lock();
	ret = sys_ring_buf_get(&log_cbuffer.ring_buffer, &type, &val,
			       (uint32_t *)data, &size32);
	irq_unlock(key);

	if (ret == 0) {
		printk("%s", data);
	} else {
		printk("Error when reading ring buffer (%d)\n", ret);
	}
}
