/*
 * Copyright (c) 2019 Manivannan Sadhasivam
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <zephyr.h>

#include <timer.h>

static void timer_work_handler(struct k_work *work);
K_WORK_DEFINE(timer_work, timer_work_handler);

static uint32_t saved_time;
/* TODO: Use Non-volatile memory for backup */
static volatile uint32_t backup_reg[2];

static void timer_work_handler(struct k_work *work)
{
	TimerIrqHandler();
}

static void timer_callback(struct k_timer *_timer)
{
	ARG_UNUSED(_timer);

	k_work_submit(&timer_work);
}

K_TIMER_DEFINE(lora_timer, timer_callback, NULL);

void RtcBkupWrite(uint32_t data0, uint32_t data1)
{
	backup_reg[0] = data0;
	backup_reg[1] = data1;
}

void RtcBkupRead(uint32_t *data0, uint32_t *data1)
{
	*data0 = backup_reg[0];
	*data1 = backup_reg[1];
}

uint32_t RtcGetCalendarTime(uint16_t *milliseconds)
{
	uint32_t now = k_uptime_get_32();

	*milliseconds = now;

	/* Return in seconds */
	return now / MSEC_PER_SEC;
}

uint32_t RtcGetTimerValue(void)
{
	return k_uptime_get_32();
}

uint32_t RtcGetTimerElapsedTime(void)
{
	return (k_uptime_get_32() - saved_time);
}

uint32_t RtcGetMinimumTimeout(void)
{
	return 1;
}

void RtcStopAlarm(void)
{
	k_timer_stop(&lora_timer);
}

void RtcSetAlarm(uint32_t timeout)
{
	k_timer_start(&lora_timer, K_MSEC(timeout), K_NO_WAIT);
}

uint32_t RtcSetTimerContext(void)
{
	saved_time = k_uptime_get_32();

	return saved_time;
}

/* For us, 1 tick = 1 milli second. So no need to do any conversion here */
uint32_t RtcGetTimerContext(void)
{
	return saved_time;
}

void DelayMsMcu(uint32_t ms)
{
	k_sleep(K_MSEC(ms));
}

uint32_t RtcMs2Tick(uint32_t milliseconds)
{
	return milliseconds;
}

uint32_t RtcTick2Ms(uint32_t tick)
{
	return tick;
}

void BoardCriticalSectionBegin(uint32_t *mask)
{
	*mask = irq_lock();
}

void BoardCriticalSectionEnd(uint32_t *mask)
{
	irq_unlock(*mask);
}
