/*
 * Copyright (c) 2022  The Chromium OS Authors
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include "usbc_timer.h"

/** Timer flag to track if timer was started */
#define TIMER_STARTED   0
/** Timer flag to track if timer has expired */
#define TIMER_EXPIRED   1

/**
 * @brief The timer function that's executed when the timer expires
 */
static void usbc_timer_handler(struct k_timer *timer)
{
	struct usbc_timer_t *usbc_timer = k_timer_user_data_get(timer);

	atomic_set_bit(&usbc_timer->flags, TIMER_EXPIRED);
}

void usbc_timer_init(struct usbc_timer_t *usbc_timer,
		     uint32_t timeout_ms)
{
	k_timer_init(&usbc_timer->timer, usbc_timer_handler, NULL);
	k_timer_user_data_set(&usbc_timer->timer, usbc_timer);
	usbc_timer->timeout_ms = timeout_ms;
}

void usbc_timer_start(struct usbc_timer_t *usbc_timer)
{
	atomic_clear_bit(&usbc_timer->flags, TIMER_EXPIRED);
	atomic_set_bit(&usbc_timer->flags, TIMER_STARTED);
	k_timer_start(&usbc_timer->timer, K_MSEC(usbc_timer->timeout_ms), K_NO_WAIT);
}

bool usbc_timer_expired(struct usbc_timer_t *usbc_timer)
{
	bool started = atomic_test_bit(&usbc_timer->flags, TIMER_STARTED);
	bool expired = atomic_test_bit(&usbc_timer->flags, TIMER_EXPIRED);

	if (started & expired) {
		atomic_clear_bit(&usbc_timer->flags, TIMER_STARTED);
		return true;
	}

	return false;
}

bool usbc_timer_running(struct usbc_timer_t *usbc_timer)
{
	return atomic_test_bit(&usbc_timer->flags, TIMER_STARTED);
}

void usbc_timer_stop(struct usbc_timer_t *usbc_timer)
{
	atomic_clear_bit(&usbc_timer->flags, TIMER_STARTED);
	k_timer_stop(&usbc_timer->timer);
}
