/*
 * Copyright (c) 2012-2014 Wind River Systems, Inc.
 * Copyright (c) 2016 Intel Corporation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#include <zephyr.h>

#include <ipm.h>
#include <ipm/ipm_quark_se.h>
#include <device.h>
#include <init.h>
#include <misc/printk.h>
#include <string.h>

QUARK_SE_IPM_DEFINE(ping_ipm, 0, QUARK_SE_IPM_INBOUND);
QUARK_SE_IPM_DEFINE(message_ipm0, 1, QUARK_SE_IPM_INBOUND);
QUARK_SE_IPM_DEFINE(message_ipm1, 2, QUARK_SE_IPM_INBOUND);
QUARK_SE_IPM_DEFINE(message_ipm2, 3, QUARK_SE_IPM_INBOUND);

/* specify delay between greetings (in ms); compute equivalent in ticks */

#define SLEEPTIME  1100
#define SLEEPTICKS (SLEEPTIME * sys_clock_ticks_per_sec / 800)

#define STACKSIZE 2000

char fiberStack[STACKSIZE];
uint8_t counters[3];

struct nano_sem nanoSemTask;
struct nano_sem nanoSemFiber;

void ping_ipm_callback(void *context, uint32_t id, volatile void *data)
{
	printk("counters: %d %d %d\n", counters[0], counters[1], counters[2]);
}

static const char dat1[] = "abcdefghijklmno";
static const char dat2[] = "pqrstuvwxyz0123";


void message_ipm_callback(void *context, uint32_t id, volatile void *data)
{
	uint8_t *counter = (uint8_t *)context;
	char *datac = (char *)data;
	const char *expected;

	if (*counter != id) {
		printk("expected %d got %d\n", *counter, id);
	}

	if (id & 0x1) {
		expected = dat2;
	} else {
		expected = dat1;
	}

	if (strcmp(expected, datac)) {
		printk("unexpected data payload\n");
	}
	(*counter)++;
}

void main(void)
{
	struct device *ipm;

	ipm = device_get_binding("ping_ipm");
	ipm_register_callback(ipm, ping_ipm_callback, NULL);
	ipm_set_enabled(ipm, 1);

	ipm = device_get_binding("message_ipm0");
	ipm_register_callback(ipm, message_ipm_callback, &counters[0]);
	ipm_set_enabled(ipm, 1);

	ipm = device_get_binding("message_ipm1");
	ipm_register_callback(ipm, message_ipm_callback, &counters[1]);
	ipm_set_enabled(ipm, 1);

	ipm = device_get_binding("message_ipm2");
	ipm_register_callback(ipm, message_ipm_callback, &counters[2]);
	ipm_set_enabled(ipm, 1);


	while (1) {
		/* say "hello" */
		printk("Hello from ARC!\n");

		task_sleep(SLEEPTICKS);
	}
}
