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

#include "test_aio.h"

static int cb_cnt;

static void callback(void *param)
{
	cb_cnt++;
}

static void set_aio_callback(int polarity, int disable)
{
	struct device *aio_dev = device_get_binding(AIO_CMP_DEV_NAME);

	struct device *gpio_dev = device_get_binding(GPIO_DEV_NAME);

	gpio_pin_configure(gpio_dev, PIN_OUT, GPIO_DIR_OUT);

	/* config AIN callback */
	zassert_true(aio_cmp_configure(aio_dev, PIN_IN,
				      polarity, AIO_CMP_REF_A,
				      callback, (void *)aio_dev) == 0,
		    "ERROR registering callback");
	if (disable == 1) {
		aio_cmp_disable(aio_dev, PIN_IN);
	}

	/* update the AIN input to trigger state */
	gpio_pin_write(gpio_dev, PIN_OUT,
		       (polarity == AIO_CMP_POL_RISE) ? 0 : 1);
	k_sleep(100);
	cb_cnt = 0;
	gpio_pin_write(gpio_dev, PIN_OUT,
		       (polarity == AIO_CMP_POL_RISE) ? 1 : 0);

	k_sleep(1000);
	TC_PRINT("... cb_cnt = %d\n", cb_cnt);
}

/* export test cases */
void test_aio_callback_rise(void)
{
	set_aio_callback(AIO_CMP_POL_RISE, 0);
	zassert_true(cb_cnt == 1, "callback is not invoked correctly");
}

void test_aio_callback_rise_disable(void)
{
	set_aio_callback(AIO_CMP_POL_RISE, 1);
	zassert_true(cb_cnt == 0, "callback is not invoked correctly");
}
