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

/*
 * @addtogroup t_rtc_basic_api
 * @{
 * @defgroup t_rtc_alarm test_rtc_alarm
 * @brief TestPurpose: verify RTC alarm work and pending interrupt detected
 * @details
 * - Test Steps
 *   -# Enable RTC internal counter
 *   -# Configure RTC with init_val, alarm_val, cb_fn and enable RTC alarm
 *   -# Sleep for while waiting for RTC alarm
 *   -# Reconfigure RTC to alarm 1 second later using rtc_set_alarm()
 *   -# Sleep for while waiting for RTC alarm
 *   -# Disable RTC internal counter and repeat previous operations
 * - Expected Results
 *   -# When RTC internal counter is enabled, RTC alarm can be invoked using
 *      both rtc_set_config() and rtc_set_alarm()
 *   -# When RTC internal counter is disabled, RTC alarm won't be invoked.
 * @}
 */

#include "test_rtc.h"

static bool rtc_alarm_up;

static void rtc_alarm_callback(struct device *rtc_dev)
{

	TC_PRINT("%s: Invoked\n", __func__);
	TC_PRINT("RTC counter: %u\n", rtc_read(rtc_dev));

	/* Verify rtc_get_pending_int() */
	if (rtc_get_pending_int(rtc_dev)) {
		TC_PRINT("Catch pending RTC interrupt\n");
	} else {
		TC_PRINT("Fail to catch pending RTC interrupt\n");
	}

	rtc_alarm_up = true;
}

static int test_alarm(void)
{
	struct rtc_config config;
	struct device *rtc = device_get_binding(RTC_DEVICE_NAME);

	if (!rtc) {
		TC_PRINT("Cannot get RTC device\n");
		return TC_FAIL;
	}

	config.init_val = 0;
	config.alarm_enable = 1;
	config.alarm_val = RTC_ALARM_SECOND;
	config.cb_fn = rtc_alarm_callback;

	rtc_enable(rtc);

	/* 1. Verify rtc_set_config() */
	rtc_alarm_up = false;
	if (rtc_set_config(rtc, &config)) {
		TC_ERROR("Failed to config RTC alarm\n");
		return TC_FAIL;
	}

	k_sleep(1500);

	if (!rtc_alarm_up) {
		TC_PRINT("RTC alarm doesn't work well\n");
		return TC_FAIL;
	}

	/* 2. Verify rtc_set_alarm() */
	rtc_alarm_up = false;
	if (rtc_set_alarm(rtc, rtc_read(rtc) + RTC_ALARM_SECOND)) {
		TC_PRINT("Failed to set RTC Alarm\n");
		return TC_FAIL;
	}

	k_sleep(1500);

	if (!rtc_alarm_up) {
		TC_PRINT("RTC alarm doesn't work well\n");
		return TC_FAIL;
	}

	/* 3. Verify RTC Alarm disabled after disable internal counter */
	rtc_disable(rtc);
	rtc_alarm_up = false;

	if (rtc_set_alarm(rtc, rtc_read(rtc) + RTC_ALARM_SECOND)) {
		TC_PRINT("Failed to set RTC Alarm\n");
		return TC_FAIL;
	}

	k_sleep(1500);

	if (rtc_alarm_up) {
		TC_PRINT("Failed to disable RTC Alarm\n");
		return TC_FAIL;
	}

	TC_PRINT("RTC alarm works well\n");

	return TC_PASS;
}

void test_rtc_alarm(void)
{
	zassert_true(test_alarm() == TC_PASS, NULL);
}
