#ifndef CLI_PROTOCOL_H
#define CLI_PROTOCOL_H

#include "cli_protocol_cfg.h"
#include "l_macro_types.h"
#include <stdbool.h>

//************************************ Константы протокола *************************************************
#define CLI_BROADCAST_ID            0xFFU    // Широковещательный адрес (команды для всех плат без ответа)

//************************************ Коды команд (по протоколу 1.1) *************************************
typedef enum {
    CLI_CMD_OPEN        = 0x00U,    // T00 - открыть соединение
    CLI_CMD_CLOSE       = 0x01U,    // T01 - закрыть соединение
    CLI_CMD_PING        = 0x02U,    // T02 - проверка соединения (ping)
    CLI_CMD_GET_INFO    = 0x0AU,    // T0A - информация об устройстве
    CLI_CMD_READ_MEM    = 0x14U,    // T14 - чтение памяти
    CLI_CMD_WRITE_MEM   = 0x15U,    // T15 - запись памяти
} cli_cmd_t;

//************************************ Коды ошибок (только 00-03 по протоколу) ****************************
typedef enum {
    CLI_ERR_NONE         = 0x00U,
    CLI_ERR_UNKNOWN_CMD  = 0x01U,
    CLI_ERR_INVALID_ARG  = 0x02U,
    CLI_ERR_INTERNAL     = 0x03U,
} cli_error_t;

//************************************ Информация об устройстве **********************************************
typedef struct {
    char name[32];
    char serial[16];
    char version[16];
    u8  board_id;                       // Уникальный идентификатор платы (0-254)
} cli_device_info_t;

//************************************ Публичные функции ****************************************************

// Инициализация протокола
fun_res_t cli_protocol_init(void);

// Деинициализация протокола
fun_res_t cli_protocol_deinit(void);

// Основной цикл обработки (вызывать в while(1))
void cli_protocol_process(void);

// Отправка строки через UART
void cli_send_string(const char* str);

// Установка информации об устройстве
fun_res_t cli_protocol_set_device_info(const char* name, const char* serial, const char* ver, u8 board_id);

// Управление board_id
fun_res_t cli_protocol_set_board_id(u8 board_id);
u8 cli_protocol_get_board_id(void);

// Управление паролем
void cli_protocol_set_password(const char* pass);
bool cli_protocol_verify_password(const char* pass);

#endif
