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

/**
 * @file Synchronization demo using CMSIS RTOS V1 APIs.
 */

#include <zephyr/kernel.h>
#include <cmsis_os.h>

/* specify delay between greetings (in ms); compute equivalent in ticks */
#define TIMER_TICKS  50
#define STACKSIZE  512
#define MSGLEN 12
#define Q_LEN 1
#define INITIAL_DATA_VALUE 5

uint32_t data;

void read_msg_callback(void const *arg);

osTimerDef(myTimer, read_msg_callback);

osMessageQDef(messageq, Q_LEN, uint32_t);
osMessageQId message_id;

void read_msg_callback(void const *arg)
{
	osEvent evt;
	uint32_t read_msg = 0U;

	evt = osMessageGet(message_id, 0);
	read_msg = evt.value.v;
	if (read_msg == 0U) {
		printk("\n**Error reading message from message queue**\n");
	} else {
		printk("Read from message queue: %d\n\n", read_msg);
	}
}

int send_msg_thread(void)
{
	osStatus status;

	status = osMessagePut(message_id, data, osWaitForever);
	if (status != osOK) {
		printk("\n**Error sending message to message queue**\n");
		return 1;
	}
	printk("Wrote to message queue: %d\n", data);
	return 0;
}

int main(void)
{
	osTimerId timer_id;
	uint32_t counter = 10U;

	data = INITIAL_DATA_VALUE;
	timer_id = osTimerCreate(osTimer(myTimer), osTimerPeriodic, NULL);

	message_id = osMessageCreate(osMessageQ(messageq), NULL);

	/* Send first message */
	if (send_msg_thread()) {
		/* Writing to message queue failed */
		goto exit;
	}
	osTimerStart(timer_id, TIMER_TICKS);

	while (--counter) {
		data++;
		if (send_msg_thread()) {
			/* Writing to message queue failed */
			break;
		}
	}
	osDelay(TIMER_TICKS);

	osTimerStop(timer_id);

exit:
	osTimerDelete(timer_id);

	if (counter == 0U) {
		printk("Sample execution successful\n");
	} else {
		printk("Error in execution\n");
	}
	return 0;
}
