/*
 * 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
 */

#ifndef TASK_INC_TASK_BUTTONS_ATTRIBUTE_H_
#define TASK_INC_TASK_BUTTONS_ATTRIBUTE_H_

#ifdef __cplusplus
extern "C" {
#endif

// TODO: Move every button related code to a separate generic button module 

/* 
 * Sensor Statechart - State Transition Table
 *
 * +-------------------+----------------+-------------+-------------------+-----------------------+
 * | Current           | Event          |             | Next              |                       |
 * | State             | (Parameters)   | [Guard]     | State             | Actions               |
 * |===================+================+=============+===================+=======================|
 * | INICIAL           |                |             | ST_BTN_XX_UP      |                       |
 * |-------------------+----------------+-------------+-------------------+-----------------------|
 * | ST_BTN_XX_UP      | EV_BTN_XX_UP   |             | ST_BTN_XX_UP      |                       |
 * |                   +----------------+-------------+-------------------+-----------------------|
 * |                   | EV_BTN_XX_DOWN |             | ST_BTN_XX_FALLING | tick = TICK_MAX       |
 * |-------------------+----------------+-------------+-------------------+-----------------------|
 * | ST_BTN_XX_FALLING | EV_BTN_XX_UP   | [tick == 0] | ST_BTN_XX_UP      |                       |
 * |                   |                +-------------+-------------------+-----------------------|
 * |                   |                | [tick >  0] | ST_BTN_XX_FALLING | tick--                |
 * |                   +----------------+-------------+-------------------+-----------------------|
 * |                   | EV_BTN_XX_DOWN | [tick == 0] | ST_BTN_XX_DOWN    | put_event_task_system |
 * |                   |                |             |                   |  (event)              |
 * |                   |                +-------------+-------------------+-----------------------|
 * |                   |                | [tick >  0] | ST_BTN_XX_FALLING | tick--                |
 * |-------------------+----------------+-------------+-------------------+-----------------------|
 * | ST_BTN_XX_DOWN    | EV_BTN_XX_UP   |             | ST_BTN_XX_RISING  | tick = TICK_MAX       |
 * |                   +----------------+-------------+-------------------+-----------------------|
 * |                   | EV_BTN_XX_DOWN |             | ST_BTN_XX_DOWN    |                       |
 * |-------------------+----------------+-------------+-------------------+-----------------------|
 * | ST_BTN_XX_RISING  | EV_BTN_XX_UP   | [tick == 0] | ST_BTN_XX_UP      | put_event_task_system |
 * |                   |                |             |                   |  (event)              |
 * |                   |                +-------------+-------------------+-----------------------|
 * |                   |                | [tick >  0] | ST_BTN_XX_RISING  | tick--                |
 * |                   +----------------+-------------+-------------------+-----------------------|
 * |                   | EV_BTN_XX_DOWN | [tick == 0] | ST_BTN_XX_DOWN    |                       |
 * |                   |                +-------------+-------------------+-----------------------|
 * |                   |                | [tick >  0] | ST_BTN_XX_RISING  | tick--                |
 * +-------------------+----------------+-------------+-------------------+-----------------------+
 *
 */

/* Events to excite Task Sensor */
typedef enum {
    EV_BTN_XX_UP,
    EV_BTN_XX_DOWN
} task_buttons_ev_t;

/* States of Task Sensor */
typedef enum {
    ST_BTN_XX_UP,
    ST_BTN_XX_FALLING,
    ST_BTN_XX_DOWN,
    ST_BTN_XX_RISING,
    ST_SEN_READY
} task_buttons_st_t;

/* Identifier of Task Sensor */
typedef enum {
    ID_BTN_A,
    ID_BTN_B,
    ID_BTN_C,
    ID_BTN_D,
} task_buttons_id_t;

typedef struct {
    task_buttons_id_t identifier;
    GPIO_TypeDef *gpio_port;
    uint16_t pin;
    GPIO_PinState pressed;
    uint32_t tick_max;
    task_buttons_ev_t signal_up;
    task_buttons_ev_t signal_down;
} task_buttons_cfg_t;

typedef struct {
    uint32_t tick;
    task_buttons_st_t state;
    task_buttons_ev_t event;
} task_buttons_dta_t;

#ifdef __cplusplus
}
#endif

#endif /* TASK_INC_TASK_SENSOR_ATTRIBUTE_H_ */
