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

#include <zephyr.h>
#include <device.h>

#include <ipc/ipc_service.h>

#include <logging/log.h>
LOG_MODULE_REGISTER(host, LOG_LEVEL_INF);

#define MLEN_0 40

struct data_packet {
	unsigned char message;
	unsigned char data[100];
};


K_SEM_DEFINE(bound_sem, 0, 1);

static void ep_bound(void *priv)
{
	k_sem_give(&bound_sem);
	LOG_INF("Ep bounded");
}

static void ep_recv(const void *data, size_t len, void *priv)
{
	char received_data = *((char *)data);
	static char expected_message = 'A';
	static uint16_t expected_len = MLEN_0;

	static unsigned long long cnt;
	static unsigned int stats_every;
	static uint32_t start;
	static unsigned int err;

	if (start == 0) {
		start = k_uptime_get_32();
	}

	if (received_data != expected_message) {
		err++;
	}

	if (len != expected_len) {
		err++;
	}

	expected_message++;
	expected_len++;

	cnt += len;

	if (expected_message > 'Z') {
		if (stats_every++ > 50) {
			/* Print throuhput [Bytes/s]. Use printk not to overload CPU with logger.
			 * Sample never reaches lower priority thread because of high throughput
			 * (100% cpu load) so logging would not be able to handle messages in
			 * deferred mode (immediate mode would be heavier than printk).
			 */
			printk("%llu\n", (1000*cnt)/(k_uptime_get_32() - start));
			stats_every = 0;
		}
		if (err) {
			printk("Unexpected message\n");
		}
		expected_message = 'A';
	}

	if (expected_len > sizeof(struct data_packet)) {
		expected_len = MLEN_0;
	}
}

static struct ipc_ept_cfg ep_cfg = {
	.cb = {
		.bound    = ep_bound,
		.received = ep_recv,
	},
};

int main(void)
{
	const struct device *ipc0_instance;
	struct data_packet msg = {.message = 'a'};
	struct ipc_ept ep;
	int ret;

	LOG_INF("IPC-service HOST demo started");

	ipc0_instance = DEVICE_DT_GET(DT_NODELABEL(ipc0));

	ret = ipc_service_open_instance(ipc0_instance);
	if ((ret < 0) && (ret != -EALREADY)) {
		LOG_INF("ipc_service_open_instance() failure");
		return ret;
	}

	ret = ipc_service_register_endpoint(ipc0_instance, &ep, &ep_cfg);
	if (ret < 0) {
		printf("ipc_service_register_endpoint() failure");
		return ret;
	}

	k_sem_take(&bound_sem, K_FOREVER);

	uint16_t mlen = MLEN_0;

	while (true) {
		ret = ipc_service_send(&ep, &msg, mlen);
		if (ret == -ENOMEM) {
			/* No space in the buffer. Retry. */
			continue;
		} else if (ret < 0) {
			LOG_ERR("send_message(%d) failed with ret %d", msg.message, ret);
			break;
		}

		msg.message++;
		if (msg.message > 'z') {
			msg.message = 'a';
		}

		mlen++;
		if (mlen > sizeof(struct data_packet)) {
			mlen = MLEN_0;
		}

		/* Quasi minimal busy wait time which allows to continuosly send
		 * data without -ENOMEM error code. The purpose is to test max
		 * throughput. Determined experimentally.
		 */
		k_busy_wait(100);
	}

	LOG_INF("IPC-service HOST demo ended.");

	return 0;
}
