/*
 * Copyright (c) 2026 Martin Javier Klöckner <mklockner@fi.uba.ar>
 *
 * See file `LICENSE` for full details
 */

#ifndef TASK_INC_TASK_SYSTEM_ATTRIBUTE_H_
#define TASK_INC_TASK_SYSTEM_ATTRIBUTE_H_

#ifdef __cplusplus
extern "C" {
#endif

/* System Statechart - State Transition Table
 *
 * +----------------+-------+---------------------------+----------------+-----------------------------+
 * | Current state  | Event | [Guard]                   | Next state     | Actions                     |
 * |                |       |                           |                |                             |
 * +================+=======+===========================+================+=============================+
 * | ST_SYS_LED_ON  |       | [tick < LED_PERIOD_MS*    | ST_SYS_LED_OFF | put_event_actuator(LED_OFF) |
 * |                |       |          LED_PERCENT_ON]  |                |                             |
 * +----------------+-------+---------------------------+----------------+-----------------------------+
 * | ST_SYS_LED_OFF |       | [tick > 0]                | ST_SYS_LED_ON  | tick = TICK_MAX             |
 * |                |       |                           |                | put_event_actuator(LED_ON)  |
 * +----------------+-------+---------------------------+----------------+-----------------------------+
 *
 */

typedef enum task_system_ev {
    EV_SYS_IDLE,
    EV_SYS_BTN_A_IDLE,
    EV_SYS_BTN_A_ACTIVE,
    EV_SYS_BTN_B_IDLE,
    EV_SYS_BTN_B_ACTIVE,
    EV_SYS_BTN_C_IDLE,
    EV_SYS_BTN_C_ACTIVE,
    EV_SYS_BTN_D_IDLE,
    EV_SYS_BTN_D_ACTIVE,

    EV_SYS_REM_TEMP_CTRL_ENABLED,
    EV_SYS_REM_TIMER_TOGGLE,
    EV_SYS_REM_TEMP_SET,
} task_system_ev_t;

typedef enum task_system_st {
    ST_SYS_IDLE,
    ST_SYS_CLOCK_SET,
    ST_SYS_TEMP_SET,
    ST_SYS_TIMER_SET_STATUS,
    ST_SYS_TIMER_SET_START,
    ST_SYS_TIMER_SET_END,
} task_system_st_t;

typedef struct {
    uint32_t         tick;
    task_system_st_t state;
    task_system_ev_t event;
    bool             event_flag;
} task_system_dta_t;

#ifdef __cplusplus
}
#endif

#endif /* TASK_INC_TASK_SYSTEM_ATTRIBUTE_H_ */
