обновление: пароль в hex, защита от перебора пароля, функция регистрации...

обновление: пароль в hex, защита от перебора пароля, функция регистрации команд, иправление проверки границ памяти, ожидание завершения передачи uart, сброс блокировки пароля.
parent 3da7bf37
This diff is collapsed.
// // cli.h
// #ifndef CLI_H
// #define CLI_H
// //******************************************** Включаемые файлы *********************************************
// #include "cli_cfg.h"
// #include "l_macro_types.h"
// #include "tcp.h"
// #include "fpga_cmn.h"
// #include "submodule.h"
// #include "submodule_cfg.h"
// #include "lta_private.h"
// //******************************************* Определения типов *********************************************
// /**
// * @brief Тип функции-обработчика команды CLI
// */
// typedef fun_res_t (*cli_cmd_handler_t)(int argc, char** argv);
// /**
// * @brief Структура команды CLI
// */
// typedef struct {
// const char* name; // Имя команды
// cli_cmd_handler_t handler; // Обработчик команды
// const char* description; // Описание команды
// } cli_command_t;
// /**
// * @brief Состояния CLI модуля
// */
// typedef enum {
// CLI_STATE_DISABLED, // Модуль инициализирован, но выключен
// CLI_STATE_IDLE, // Ожидание команды (включен)
// CLI_STATE_RECEIVING, // Прием команды
// CLI_STATE_PROCESSING, // Обработка команды
// } cli_state_t;
// //******************************** Объявления глобальных (публичных) функций ********************************
// //-----------------------------------------------------------------------------------------------------------
// //! @brief Отправка строки через UART с буферизацией
// //! @param[in] str Указатель на строку для отправки
// //! @retval -
// //-----------------------------------------------------------------------------------------------------------
// void cli_send_string(const char* str);
// //-----------------------------------------------------------------------------------------------------------
// //! @brief Проверка активности модуля CLI
// //! @param Возвращает true если CLI инициализирован и включен
// //! @retval bool true - активен, false - не активен
// //-----------------------------------------------------------------------------------------------------------
// bool cli_is_active(void);
// //-----------------------------------------------------------------------------------------------------------
// //! @brief Инициализация модуля CLI
// //! @param Инициализирует буферы, регистрирует встроенные команды и настраивает UART
// //! @retval fun_res_t ERR_OK - успех, код ошибки - failure
// //-----------------------------------------------------------------------------------------------------------
// fun_res_t cli_init(void);
// //-----------------------------------------------------------------------------------------------------------
// //! @brief Деинициализация модуля CLI
// //! @param Отключает колбеки, очищает буферы и сбрасывает состояние модуля
// //! @retval fun_res_t ERR_OK - успех, код ошибки - failure
// //-----------------------------------------------------------------------------------------------------------
// fun_res_t cli_deinit(void);
// //-----------------------------------------------------------------------------------------------------------
// //! @brief Включение модуля CLI с проверкой пароля
// //! @param Переводит CLI в режим ожидания пароля для активации
// //! @retval fun_res_t ERR_OK - успех, код ошибки - failure
// //-----------------------------------------------------------------------------------------------------------
// fun_res_t cli_on(void);
// //-----------------------------------------------------------------------------------------------------------
// //! @brief Выключение модуля CLI
// //! @param Деактивирует CLI, оставляя возможность повторного включения через cli_on()
// //! @retval fun_res_t ERR_OK - успех, код ошибки - failure
// //-----------------------------------------------------------------------------------------------------------
// fun_res_t cli_off(void);
// //-----------------------------------------------------------------------------------------------------------
// //! @brief Получение текущего состояния CLI модуля
// //! @param -
// //! @retval cli_state_t Текущее состояние модуля
// //-----------------------------------------------------------------------------------------------------------
// cli_state_t cli_get_state(void);
// //-----------------------------------------------------------------------------------------------------------
// //! @brief Регистрация новой команды
// //! @param[in] cmd - указатель на структуру команды
// //! @retval fun_res_t ERR_OK - успех, ERR_INVALID_ARGUMENT - неверные параметры,
// //! ERR_RUNTIME_ERROR - достигнут лимит команд
// //-----------------------------------------------------------------------------------------------------------
// fun_res_t cli_register_command(const cli_command_t* cmd);
// //-----------------------------------------------------------------------------------------------------------
// //! @brief Основная функция обработки CLI
// //! @param Должна вызываться в основном цикле программы. Обрабатывает ввод пользователя,
// //! проверяет пароль, выполняет команды и управляет состоянием модуля.
// //! @retval -
// //-----------------------------------------------------------------------------------------------------------
// void cli_process(void);
// //-----------------------------------------------------------------------------------------------------------
// //! @brief Получение количества зарегистрированных команд
// //! @param
// //! @retval u8 Количество зарегистрированных команд
// //-----------------------------------------------------------------------------------------------------------
// u8 cli_get_command_count(void);
// #endif // CLI_H
\ No newline at end of file
// #ifndef CLI_CFG_H
// #define CLI_CFG_H
// //******************************************** Включаемые файлы *********************************************
// #include "lmcal_uart.h"
// //************************************ Глобальные (публичные) константы *************************************
// // Максимальная длина команды (включая аргументы)
// #define CLI_MAX_CMD_LENGTH (128)
// // Максимальная длина команды (включая аргументы)
// #define CLI_MAX_LENGTH (3072)
// // Максимальное количество аргументов в команде
// #define CLI_MAX_ARGS (8)
// // Максимальное количество зарегистрированных команд
// #define CLI_MAX_COMMANDS (16)
// // Символ, обозначающий конец команды
// #define CLI_END_OF_CMD ('\n')
// // Канал UART для CLI (должен соответствовать настройкам в lmcal_uart_cfg.h)
// #define CLI_UART_CHANNEL (LMCAL_UART_CHANNEL1)
// //******************************************* Проверка параметров *******************************************
// #endif // CLI_CFG_H
\ No newline at end of file
This diff is collapsed.
...@@ -10,53 +10,108 @@ ...@@ -10,53 +10,108 @@
//************************************ Коды команд (по протоколу 1.1) ************************************* //************************************ Коды команд (по протоколу 1.1) *************************************
typedef enum { typedef enum {
CLI_CMD_OPEN = 0x00U, // T00 - открыть соединение CLI_CMD_OPEN = 0x00U, // T00 - открыть соединение (опционально с паролем)
CLI_CMD_CLOSE = 0x01U, // T01 - закрыть соединение CLI_CMD_CLOSE = 0x01U, // T01 - закрыть соединение
CLI_CMD_PING = 0x02U, // T02 - проверка соединения (ping) CLI_CMD_PING = 0x02U, // T02 - проверка соединения (ping) – эхо переданных данных
CLI_CMD_GET_INFO = 0x0AU, // T0A - информация об устройстве CLI_CMD_GET_INFO = 0x0AU, // T0A - получить информацию об устройстве (имя, серийный, версия)
CLI_CMD_READ_MEM = 0x14U, // T14 - чтение памяти CLI_CMD_READ_MEM = 0x14U, // T14 - чтение памяти (адрес 4 байта + размер 1 байт)
CLI_CMD_WRITE_MEM = 0x15U, // T15 - запись памяти CLI_CMD_WRITE_MEM = 0x15U, // T15 - запись памяти (адрес 4 байта + данные, только SRAM)
} cli_cmd_t; } cli_cmd_t;
//************************************ Коды ошибок (только 00-03 по протоколу) **************************** //************************************ Коды ошибок (только 00-03 по протоколу) ****************************
typedef enum { typedef enum {
CLI_ERR_NONE = 0x00U, CLI_ERR_NONE = 0x00U, // Нет ошибки
CLI_ERR_UNKNOWN_CMD = 0x01U, CLI_ERR_UNKNOWN_CMD = 0x01U, // Неизвестная команда
CLI_ERR_INVALID_ARG = 0x02U, CLI_ERR_INVALID_ARG = 0x02U, // Неверный формат или значение аргумента
CLI_ERR_INTERNAL = 0x03U, CLI_ERR_INTERNAL = 0x03U, // Внутренняя ошибка устройства
} cli_error_t; } cli_error_t;
//************************************ Информация об устройстве ********************************************** //************************************ Информация об устройстве **********************************************
//! @brief Структура с информацией об устройстве, возвращаемая командой T0A
typedef struct { typedef struct {
char name[32]; char name[32]; // Имя устройства (ASCII, до 31 символа + \\0)
char serial[16]; char serial[16]; // Серийный номер (ASCII, до 15 символов + \\0)
char version[16]; char version[16]; // Версия ПО (ASCII, до 15 символов + \\0)
u8 board_id; // Уникальный идентификатор платы (0-254) u8 board_id; // Уникальный идентификатор платы (0–254)
} cli_device_info_t; } cli_device_info_t;
//************************************ Тип обработчика команды **********************************************
//! @brief Прототип функции-обработчика команды
//! @param data Указатель на сырые данные команды (после board_id)
//! @param len Длина данных в байтах
typedef void (*cli_cmd_handler_t)(const u8* data, u8 len);
//************************************ Структура регистрируемой команды **************************************
//! @brief Структура для регистрации пользовательской команды
typedef struct {
u8 code; // Код команды (0x00–0xFF)
cli_cmd_handler_t handler; // Указатель на функцию-обработчик
} cli_command_t;
//************************************ Публичные функции **************************************************** //************************************ Публичные функции ****************************************************
// Инициализация протокола //---------------------------------------------------------------------
//! @brief Инициализация протокола CLI
//! @return ERR_OK при успехе, иначе код ошибки
fun_res_t cli_protocol_init(void); fun_res_t cli_protocol_init(void);
// Деинициализация протокола //---------------------------------------------------------------------
//! @brief Деинициализация протокола CLI
//! @return ERR_OK при успехе, иначе код ошибки
fun_res_t cli_protocol_deinit(void); fun_res_t cli_protocol_deinit(void);
// Основной цикл обработки (вызывать в while(1)) //---------------------------------------------------------------------
//! @brief Основной цикл обработки (вызывать в главном цикле программы)
void cli_protocol_process(void); void cli_protocol_process(void);
// Отправка строки через UART //---------------------------------------------------------------------
//! @brief Отправка строки через UART (с ожиданием завершения передачи)
//! @param str Указатель на нуль-терминированную строку
void cli_send_string(const char* str); void cli_send_string(const char* str);
// Установка информации об устройстве //---------------------------------------------------------------------
//! @brief Установка информации об устройстве
//! @param name Имя устройства (до 31 символа)
//! @param serial Серийный номер (до 15 символов)
//! @param ver Версия ПО (до 15 символов)
//! @param board_id Идентификатор платы (0–254)
//! @return ERR_OK при успехе
fun_res_t cli_protocol_set_device_info(const char* name, const char* serial, const char* ver, u8 board_id); fun_res_t cli_protocol_set_device_info(const char* name, const char* serial, const char* ver, u8 board_id);
// Управление board_id //---------------------------------------------------------------------
//! @brief Установка board_id устройства
//! @param board_id Идентификатор платы (0–254)
//! @return ERR_OK при успехе
fun_res_t cli_protocol_set_board_id(u8 board_id); fun_res_t cli_protocol_set_board_id(u8 board_id);
//---------------------------------------------------------------------
//! @brief Получение текущего board_id устройства
//! @return Идентификатор платы
u8 cli_protocol_get_board_id(void); u8 cli_protocol_get_board_id(void);
// Управление паролем //---------------------------------------------------------------------
void cli_protocol_set_password(const char* pass); //! @brief Установка пароля для открытия соединения
bool cli_protocol_verify_password(const char* pass); //! @param pass Указатель на массив байт пароля (до 15 байт)
//! @param len Длина пароля в байтах
void cli_protocol_set_password(const u8* pass, u8 len);
//---------------------------------------------------------------------
//! @brief Проверка пароля
//! @param pass Указатель на массив байт пароля
//! @param len Длина пароля в байтах
//! @return true – пароль верен, false – неверен
bool cli_protocol_verify_password(const u8* pass, u8 len);
//---------------------------------------------------------------------
//! @brief Сброс блокировки после превышения попыток ввода пароля
void cli_protocol_reset_block(void);
//---------------------------------------------------------------------
//! @brief Регистрация новой команды
//! @param cmd Указатель на структуру с кодом и обработчиком
//! @return ERR_OK при успехе, ERR_INVALID_ARGUMENT – неверные параметры,
//! ERR_RUNTIME_ERROR – команда уже зарегистрирована
fun_res_t cli_register_command(const cli_command_t* cmd);
#endif #endif
\ No newline at end of file
...@@ -14,6 +14,12 @@ ...@@ -14,6 +14,12 @@
#define CLI_CONNECTION_TIMEOUT_MS (20000U) // Таймаут соединения 20 секунд #define CLI_CONNECTION_TIMEOUT_MS (20000U) // Таймаут соединения 20 секунд
//************************************ Пароль по умолчанию ************************************************** //************************************ Пароль по умолчанию **************************************************
#define CLI_DEFAULT_PASSWORD "1357" // Пароль по умолчанию "1357"
#define CLI_DEFAULT_PASSWORD_BYTES {0x31, 0x33, 0x35, 0x37}
#define CLI_DEFAULT_PASSWORD_LEN 4
#define CLI_MAX_COMMANDS 256 // Максимальное количество регистрируемых команд (0x00..0xFF)
#define CLI_PASSWORD_MAX_LEN 15 // Максимальная длина пароля в байтах
#define CLI_MAX_PASSWORD_ATTEMPTS 3 // Количество попыток ввода пароля до блокировки
#define CLI_ACTIVITY_TIMEOUT_TICKS 20000U // ~20 сек при вызове каждые 1 мс
#endif #endif
\ No newline at end of file
...@@ -11,11 +11,6 @@ ...@@ -11,11 +11,6 @@
//************************************* Локальные (приватные) переменные ************************************ //************************************* Локальные (приватные) переменные ************************************
static uint32_t get_time_ms(void)
{
static uint32_t ms = 0;
return ++ms;
}
//*********************************************************************************************************** //***********************************************************************************************************
//******************************* Определения глобальных (публичных) функций ******************************** //******************************* Определения глобальных (публичных) функций ********************************
...@@ -27,7 +22,6 @@ void main(void) ...@@ -27,7 +22,6 @@ void main(void)
lmcal_init(); lmcal_init();
subm_init(); subm_init();
streams_init(); streams_init();
//cli_init();
// Инициализация LTA протокола // Инициализация LTA протокола
cli_protocol_init(); cli_protocol_init();
...@@ -36,7 +30,6 @@ void main(void) ...@@ -36,7 +30,6 @@ void main(void)
while(1) while(1)
{ {
streams_loop(); streams_loop();
//cli_process();
tcp_loop(); tcp_loop();
// Обработка команд // Обработка команд
...@@ -45,7 +38,6 @@ void main(void) ...@@ -45,7 +38,6 @@ void main(void)
if (bsp_loop()) break; if (bsp_loop()) break;
} }
//cli_deinit();
cli_protocol_deinit(); cli_protocol_deinit();
streams_deinit(); streams_deinit();
bsp_deinit(); bsp_deinit();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment