/*
 * Copyright (c) 2023 Juan Manuel Cruz <jcruz@fi.uba.ar> <jcruz@frba.utn.edu.ar>.
 * Copyright (c) 2026 Martin Javier Klöckner <mklockner@fi.uba.ar>
 *
 * See file `LICENSE` for full details
 */

#include "main.h"

#include "logger.h"
#include "dwt.h"

#include "app.h"
#include "task_system_attribute.h"

#define EVENT_UNDEFINED (255)
#define MAX_EVENTS      (16)

static struct {
    uint32_t head;
    uint32_t tail;
    uint32_t count;
    task_system_ev_t queue[MAX_EVENTS];
} task_system_event_queue;

void task_system_interface_init_event_queue(void)
{
    uint32_t i;

    task_system_event_queue.head = 0;
    task_system_event_queue.tail = 0;
    task_system_event_queue.count = 0;

    for (i = 0; i < MAX_EVENTS; i++)
    {
        task_system_event_queue.queue[i] = EVENT_UNDEFINED;
    }
}

void task_system_interface_put_event(task_system_ev_t event)
{
    task_system_event_queue.count++;
    task_system_event_queue.queue[task_system_event_queue.head++] = event;

    if (MAX_EVENTS == task_system_event_queue.head)
    {
        task_system_event_queue.head = 0;
    }
}

task_system_ev_t task_system_interface_get_event(void)
{
    task_system_ev_t event;

    task_system_event_queue.count--;
    event = task_system_event_queue.queue[task_system_event_queue.tail];
    task_system_event_queue.queue[task_system_event_queue.tail++] = EVENT_UNDEFINED;

    if (MAX_EVENTS == task_system_event_queue.tail)
    {
        task_system_event_queue.tail = 0;
    }

    return event;
}

bool task_system_interface_any_event(void)
{
    return (task_system_event_queue.head != task_system_event_queue.tail);
}
