From d8cea4e1c6cabd74dae328a5f07335b5d12769b9 Mon Sep 17 00:00:00 2001 From: sd Date: Mon, 24 Nov 2025 12:42:56 +0300 Subject: [PATCH] Initial all get params --- .gitignore | 3 +- CMakeLists.txt | 9 ++ inc/jlv135_cli/jl_block.h | 28 +++++ inc/jlv135_cli/jl_block_datatime.h | 10 ++ inc/jlv135_cli/jl_block_display.h | 10 ++ inc/jlv135_cli/jl_block_feature.h | 10 ++ inc/jlv135_cli/jl_block_modbus.h | 10 ++ inc/jlv135_cli/jl_block_secure.h | 10 ++ inc/jlv135_cli/jl_block_sensor.h | 10 ++ inc/jlv135_cli/jl_block_service.h | 10 ++ inc/jlv135_cli/jl_block_wifi.h | 10 ++ readme.md | 95 ++++++++++----- src/jlv135_cli/jl_block.c | 48 ++++++++ src/jlv135_cli/jl_block_datatime.c | 44 +++++++ src/jlv135_cli/jl_block_display.c | 144 ++++++++++++++++++++++ src/jlv135_cli/jl_block_feature.c | 62 ++++++++++ src/jlv135_cli/jl_block_modbus.c | 175 +++++++++++++++++++++++++++ src/jlv135_cli/jl_block_secure.c | 45 +++++++ src/jlv135_cli/jl_block_sensor.c | 44 +++++++ src/jlv135_cli/jl_block_service.c | 75 ++++++++++++ src/jlv135_cli/jl_block_wifi.c | 44 +++++++ src/jlv135_cli/main.c | 186 +++++++++++------------------ 22 files changed, 939 insertions(+), 143 deletions(-) create mode 100644 inc/jlv135_cli/jl_block.h create mode 100644 inc/jlv135_cli/jl_block_datatime.h create mode 100644 inc/jlv135_cli/jl_block_display.h create mode 100644 inc/jlv135_cli/jl_block_feature.h create mode 100644 inc/jlv135_cli/jl_block_modbus.h create mode 100644 inc/jlv135_cli/jl_block_secure.h create mode 100644 inc/jlv135_cli/jl_block_sensor.h create mode 100644 inc/jlv135_cli/jl_block_service.h create mode 100644 inc/jlv135_cli/jl_block_wifi.h create mode 100644 src/jlv135_cli/jl_block.c create mode 100644 src/jlv135_cli/jl_block_datatime.c create mode 100644 src/jlv135_cli/jl_block_display.c create mode 100644 src/jlv135_cli/jl_block_feature.c create mode 100644 src/jlv135_cli/jl_block_modbus.c create mode 100644 src/jlv135_cli/jl_block_secure.c create mode 100644 src/jlv135_cli/jl_block_sensor.c create mode 100644 src/jlv135_cli/jl_block_service.c create mode 100644 src/jlv135_cli/jl_block_wifi.c diff --git a/.gitignore b/.gitignore index 6733131..a22006d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .vscode .idea cache -build \ No newline at end of file +build +lib \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 9691da0..d7ca86c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,6 +18,15 @@ endif() add_executable(${PROJECT_NAME} src/jl_modbus/jl_modbus_config.c src/jl_modbus/jl_config.c + src/jlv135_cli/jl_block.c + src/jlv135_cli/jl_block_modbus.c + src/jlv135_cli/jl_block_wifi.c + src/jlv135_cli/jl_block_display.c + src/jlv135_cli/jl_block_feature.c + src/jlv135_cli/jl_block_datatime.c + src/jlv135_cli/jl_block_sensor.c + src/jlv135_cli/jl_block_secure.c + src/jlv135_cli/jl_block_service.c src/jlv135_cli/main.c) # Настройка библиотек diff --git a/inc/jlv135_cli/jl_block.h b/inc/jlv135_cli/jl_block.h new file mode 100644 index 0000000..0f89473 --- /dev/null +++ b/inc/jlv135_cli/jl_block.h @@ -0,0 +1,28 @@ +#ifndef JLV135_CLI_BLOCK_H +#define JLV135_CLI_BLOCK_H + +#include + +// Структура блока конфигурации (модуля) +typedef struct jl_block +{ + const char *name; // Имя блока (wifi, modbus, display, и т.д.) + + // Метод get: отображает все параметры блока с текущими значениями + // Возвращает 0 при успехе, != 0 при ошибке + int (*get)(void); + + // Метод set: изменяет параметры блока + // argc - количество аргументов после "set " + // argv - массив аргументов + // Возвращает 0 при успехе, != 0 при ошибке + int (*set)(int argc, const char *argv[]); +} jl_block_t; + +// Получить список всех доступных блоков +const jl_block_t *jl_block_get_all(void); + +// Найти блок по имени +const jl_block_t *jl_block_find(const char *name); + +#endif // JLV135_CLI_BLOCK_H diff --git a/inc/jlv135_cli/jl_block_datatime.h b/inc/jlv135_cli/jl_block_datatime.h new file mode 100644 index 0000000..92cd7b3 --- /dev/null +++ b/inc/jlv135_cli/jl_block_datatime.h @@ -0,0 +1,10 @@ +#ifndef JLV135_CLI_BLOCK_DATATIME_H +#define JLV135_CLI_BLOCK_DATATIME_H + +// Метод get для модуля datatime +int jl_block_datatime_get(void); + +// Метод set для модуля datatime +int jl_block_datatime_set(int argc, const char *argv[]); + +#endif // JLV135_CLI_BLOCK_DATATIME_H diff --git a/inc/jlv135_cli/jl_block_display.h b/inc/jlv135_cli/jl_block_display.h new file mode 100644 index 0000000..873e84d --- /dev/null +++ b/inc/jlv135_cli/jl_block_display.h @@ -0,0 +1,10 @@ +#ifndef JLV135_CLI_BLOCK_DISPLAY_H +#define JLV135_CLI_BLOCK_DISPLAY_H + +// Метод get для модуля display +int jl_block_display_get(void); + +// Метод set для модуля display +int jl_block_display_set(int argc, const char *argv[]); + +#endif // JLV135_CLI_BLOCK_DISPLAY_H diff --git a/inc/jlv135_cli/jl_block_feature.h b/inc/jlv135_cli/jl_block_feature.h new file mode 100644 index 0000000..9d2d9f9 --- /dev/null +++ b/inc/jlv135_cli/jl_block_feature.h @@ -0,0 +1,10 @@ +#ifndef JLV135_CLI_BLOCK_FEATURE_H +#define JLV135_CLI_BLOCK_FEATURE_H + +// Метод get для модуля feature +int jl_block_feature_get(void); + +// Метод set для модуля feature +int jl_block_feature_set(int argc, const char *argv[]); + +#endif // JLV135_CLI_BLOCK_FEATURE_H diff --git a/inc/jlv135_cli/jl_block_modbus.h b/inc/jlv135_cli/jl_block_modbus.h new file mode 100644 index 0000000..ffcb801 --- /dev/null +++ b/inc/jlv135_cli/jl_block_modbus.h @@ -0,0 +1,10 @@ +#ifndef JLV135_CLI_BLOCK_MODBUS_H +#define JLV135_CLI_BLOCK_MODBUS_H + +// Метод get для модуля modbus +int jl_block_modbus_get(void); + +// Метод set для модуля modbus +int jl_block_modbus_set(int argc, const char *argv[]); + +#endif // JLV135_CLI_BLOCK_MODBUS_H diff --git a/inc/jlv135_cli/jl_block_secure.h b/inc/jlv135_cli/jl_block_secure.h new file mode 100644 index 0000000..728f168 --- /dev/null +++ b/inc/jlv135_cli/jl_block_secure.h @@ -0,0 +1,10 @@ +#ifndef JLV135_CLI_BLOCK_SECURE_H +#define JLV135_CLI_BLOCK_SECURE_H + +// Метод get для модуля secure +int jl_block_secure_get(void); + +// Метод set для модуля secure +int jl_block_secure_set(int argc, const char *argv[]); + +#endif // JLV135_CLI_BLOCK_SECURE_H diff --git a/inc/jlv135_cli/jl_block_sensor.h b/inc/jlv135_cli/jl_block_sensor.h new file mode 100644 index 0000000..d95d001 --- /dev/null +++ b/inc/jlv135_cli/jl_block_sensor.h @@ -0,0 +1,10 @@ +#ifndef JLV135_CLI_BLOCK_SENSOR_H +#define JLV135_CLI_BLOCK_SENSOR_H + +// Метод get для модуля sensor +int jl_block_sensor_get(void); + +// Метод set для модуля sensor +int jl_block_sensor_set(int argc, const char *argv[]); + +#endif // JLV135_CLI_BLOCK_SENSOR_H diff --git a/inc/jlv135_cli/jl_block_service.h b/inc/jlv135_cli/jl_block_service.h new file mode 100644 index 0000000..13955a2 --- /dev/null +++ b/inc/jlv135_cli/jl_block_service.h @@ -0,0 +1,10 @@ +#ifndef JLV135_CLI_BLOCK_SERVICE_H +#define JLV135_CLI_BLOCK_SERVICE_H + +// Метод get для модуля service +int jl_block_service_get(void); + +// Метод set для модуля service +int jl_block_service_set(int argc, const char *argv[]); + +#endif // JLV135_CLI_BLOCK_SERVICE_H diff --git a/inc/jlv135_cli/jl_block_wifi.h b/inc/jlv135_cli/jl_block_wifi.h new file mode 100644 index 0000000..ca1234f --- /dev/null +++ b/inc/jlv135_cli/jl_block_wifi.h @@ -0,0 +1,10 @@ +#ifndef JLV135_CLI_BLOCK_WIFI_H +#define JLV135_CLI_BLOCK_WIFI_H + +// Метод get для модуля wifi +int jl_block_wifi_get(void); + +// Метод set для модуля wifi +int jl_block_wifi_set(int argc, const char *argv[]); + +#endif // JLV135_CLI_BLOCK_WIFI_H diff --git a/readme.md b/readme.md index e5cdf0f..e6d2cd2 100644 --- a/readme.md +++ b/readme.md @@ -1,48 +1,89 @@ # Руководство по использованию команды `jlv135_cli` ## Описание -Команда `jlv135_cli` представляет собой интерфейс командной строки для работы с устройством JLV135. +Команда `jlv135_cli` представляет собой интерфейс командной строки для работы с устройством JLV135. Программа работает с блоками конфигурации как модулями расширения, каждый из которых имеет методы `get` (просмотр параметров) и `set` (изменение параметров). -## Вывод текущих настроек +## Основные команды -Вызов без параметров позволяет отобразить текущие настройки пульта без изменения текущих. - -### Синтаксис +### Справка +Вызов без параметров отображает справку по использованию и список доступных блоков: ```bash jlv135_cli ``` -## Изменение скорости - -### Синтаксис +### Просмотр параметров блока (get) +Просмотр всех параметров блока с текущими значениями и расшифровкой: ```bash -jlv135_cli --modbus --rs485 --speed <значение> +jlv135_cli get <блок> ``` -### Параметры +### Изменение параметров блока (set) +Изменение параметров указанного блока: +```bash +jlv135_cli set <блок> <параметры...> +``` -| Параметр | Описание | -|------------|-------------------------------------------------------------------------| -| `--modbus` | Активирует работу с протоколом Modbus | -| `--rs485` | Указывает на использование RS-485 | -| `--speed` | Задает скорость передачи данных (бодрейт) для RS-485 | +## Доступные блоки конфигурации -### Примеры использования +Список блоков определяется в `src/jl_modbus/jl_config.c` (массив `backup_blocks`): +- `modbus` - настройки протокола Modbus +- `wifi` - настройки WiFi (не реализован) +- `display` - настройки дисплея (не реализован) +- `feature` - функциональные возможности (не реализован) +- `datatime` - дата и время (не реализован) +- `sensor` - датчики (не реализован) +- `secure` - безопасность (не реализован) +- `service` - служебные параметры (не реализован) -1. Запуск с типичной скоростью 9600 бод: - ```bash - jlv135_cli --modbus --rs485 --speed 9600 - ``` +## Примеры использования -2. Использование высокой скорости 115200 бод: - ```bash - jlv135_cli --modbus --rs485 --speed 115200 - ``` +### Блок Modbus -### Поддерживаемые скорости -Программа может поддерживать различные стандартные скорости передачи данных: +#### Просмотр всех параметров Modbus: +```bash +jlv135_cli get modbus +``` + +Пример вывода: +``` +Modbus Config: + num_port: 1 + addr: 1 + tcycle: 100 + +Modbus RS485 Port: + speed: 9600 + prop_p: 0 + prop_s: 0 + repeate: 3 + timeout: 500 + +Modbus TCP Port: + addr: 192.168.1.100 + port: 502 + repeate: 3 + timeout: 1000 +``` + +#### Изменение скорости RS485: +```bash +jlv135_cli set modbus rs485 speed 9600 +jlv135_cli set modbus rs485 speed 115200 +``` + +### Поддерживаемые скорости RS485 - 9600 бод (наиболее распространенная) - 19200 бод - 38400 бод - 57600 бод -- 115200 бод \ No newline at end of file +- 115200 бод + +## Архитектура + +Программа построена на модульной архитектуре: +- Каждый блок конфигурации - это отдельный модуль с методами `get` и `set` +- Добавление нового блока требует: + 1. Создания заголовочного файла `inc/jlv135_cli/jl_block_.h` + 2. Создания файла реализации `src/jlv135_cli/jl_block_.c` + 3. Регистрации блока в `src/jlv135_cli/jl_block.c` + 4. Добавления файлов в `CMakeLists.txt` \ No newline at end of file diff --git a/src/jlv135_cli/jl_block.c b/src/jlv135_cli/jl_block.c new file mode 100644 index 0000000..d52af4e --- /dev/null +++ b/src/jlv135_cli/jl_block.c @@ -0,0 +1,48 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Список всех доступных блоков конфигурации +static const jl_block_t blocks[] = { + {.name = "wifi", .get = jl_block_wifi_get, .set = jl_block_wifi_set}, + {.name = "modbus", .get = jl_block_modbus_get, .set = jl_block_modbus_set}, + {.name = "display", .get = jl_block_display_get, .set = jl_block_display_set}, + {.name = "feature", .get = jl_block_feature_get, .set = jl_block_feature_set}, + {.name = "datatime", .get = jl_block_datatime_get, .set = jl_block_datatime_set}, + {.name = "sensor", .get = jl_block_sensor_get, .set = jl_block_sensor_set}, + {.name = "secure", .get = jl_block_secure_get, .set = jl_block_secure_set}, + {.name = "service", .get = jl_block_service_get, .set = jl_block_service_set}, + {.name = NULL, .get = NULL, .set = NULL} // Терминатор списка +}; + +// Получить список всех доступных блоков +const jl_block_t * +jl_block_get_all(void) +{ + return blocks; +} + +// Найти блок по имени +const jl_block_t * +jl_block_find(const char *name) +{ + const jl_block_t *block = blocks; + + while (block->name != NULL) + { + if (strcmp(block->name, name) == 0) + { + return block; + } + block++; + } + + return NULL; +} diff --git a/src/jlv135_cli/jl_block_datatime.c b/src/jlv135_cli/jl_block_datatime.c new file mode 100644 index 0000000..119b5d1 --- /dev/null +++ b/src/jlv135_cli/jl_block_datatime.c @@ -0,0 +1,44 @@ +#include +#include +#include +#include + +typedef struct _jl_datatime_config_t +{ + uint8_t ntp_en; // автоматически обновлять время с сервера NTP + uint8_t settime_en; // разрешено пульту устанавливать время в контроллер + int8_t correction; // корректировка времени за сутки + int8_t gmt; // часовой пояс от -12 до +12 +} jl_datatime_config_t; + +// Метод get: отображает все параметры блока datatime +int +jl_block_datatime_get(void) +{ + jl_datatime_config_t conf = {}; + jl_config_load("datatime", &conf, sizeof(jl_datatime_config_t)); + + printf("Date/Time Configuration:\n"); + printf(" NTP Sync: %s\n", conf.ntp_en ? "Enabled" : "Disabled"); + printf(" Set Time: %s\n", conf.settime_en ? "Allowed" : "Not allowed"); + printf(" Time Correction: %d sec/day\n", conf.correction); + printf(" GMT Offset: %+d hours\n", conf.gmt); + + return 0; +} + +// Метод set: заглушка (TODO) +int +jl_block_datatime_set(int argc, const char *argv[]) +{ + (void)argc; + (void)argv; + + fprintf(stderr, "TODO: Date/Time configuration modification is not yet implemented\n"); + fprintf(stderr, "Future usage examples:\n"); + fprintf(stderr, " jlv135_cli set datatime ntp \n"); + fprintf(stderr, " jlv135_cli set datatime gmt <-12..+12>\n"); + fprintf(stderr, " jlv135_cli set datatime correction \n"); + + return 1; +} diff --git a/src/jlv135_cli/jl_block_display.c b/src/jlv135_cli/jl_block_display.c new file mode 100644 index 0000000..57cd202 --- /dev/null +++ b/src/jlv135_cli/jl_block_display.c @@ -0,0 +1,144 @@ +#include +#include +#include +#include +#include + +typedef enum +{ + JLV_SSAVER_TYPE_NONE, + JLV_SSAVER_TYPE_DISABLE, + JLV_SSAVER_TYPE_TIME, + JLV_SSAVER_TYPE_SENSOR, + JLV_SSAVER_TYPE_METEO, + JLV_SSAVER_TYPE_MAX, +} jlv_ssaver_type_t; + +typedef enum +{ + JLV_SSAVER_METEO_LIGHT, + JLV_SSAVER_METEO_DARK, + JLV_SSAVER_METEO_AUTO, + JLV_SSAVER_METEO_MAX, +} jlv_ssaver_meteo_type_t; + +typedef struct _jlv_time_t +{ + uint8_t hour; + uint8_t min; +} jlv_time_t; + +typedef struct _jlv_color_t +{ + uint8_t r; + uint8_t g; + uint8_t b; +} jlv_color_t; + +typedef struct _jlv_ssaver_t +{ + jlv_ssaver_type_t type; + uint8_t min; + bool night_backlight : 1; + bool power_indicator : 1; + jlv_color_t color_bg; + jlv_color_t color_text; + jlv_ssaver_meteo_type_t meteo_type; +} jlv_ssaver_t; + +typedef struct _jlv_display_t +{ + uint8_t backlight; + uint8_t night_backlight; + jlv_time_t night_begin; + jlv_time_t night_end; + bool night : 1; + bool led_disable : 1; + jlv_ssaver_t ssaver; + uint8_t pu_temper; + uint8_t pu_hum; +} jlv_display_t; + +static const char * +ssaver_type_to_string(jlv_ssaver_type_t type) +{ + switch (type) + { + case JLV_SSAVER_TYPE_NONE: + return "None"; + case JLV_SSAVER_TYPE_DISABLE: + return "Disabled"; + case JLV_SSAVER_TYPE_TIME: + return "Time"; + case JLV_SSAVER_TYPE_SENSOR: + return "Sensor"; + case JLV_SSAVER_TYPE_METEO: + return "Meteo"; + default: + return "Unknown"; + } +} + +static const char * +ssaver_meteo_type_to_string(jlv_ssaver_meteo_type_t type) +{ + switch (type) + { + case JLV_SSAVER_METEO_LIGHT: + return "Light"; + case JLV_SSAVER_METEO_DARK: + return "Dark"; + case JLV_SSAVER_METEO_AUTO: + return "Auto"; + default: + return "Unknown"; + } +} + +// Метод get: отображает все параметры блока display +int +jl_block_display_get(void) +{ + jlv_display_t conf = {}; + jl_config_load("display", &conf, sizeof(jlv_display_t)); + + printf("Display Configuration:\n"); + printf(" Backlight: %u%%\n", conf.backlight); + printf(" Night backlight: %u%%\n", conf.night_backlight); + printf(" Night mode: %s\n", conf.night ? "On" : "Off"); + printf(" Night begin: %02u:%02u\n", conf.night_begin.hour, conf.night_begin.min); + printf(" Night end: %02u:%02u\n", conf.night_end.hour, conf.night_end.min); + printf(" LED: %s\n", conf.led_disable ? "Disabled" : "Enabled"); + printf(" PU Temperature: %s\n", conf.pu_temper ? "From controller" : "Local sensor"); + printf(" PU Humidity: %s\n", conf.pu_hum ? "From controller" : "Local sensor"); + printf("\n"); + + printf("Screensaver:\n"); + printf(" Type: %s\n", ssaver_type_to_string(conf.ssaver.type)); + printf(" Timeout: %u min\n", conf.ssaver.min); + printf(" Night backlight: %s\n", conf.ssaver.night_backlight ? "On" : "Off"); + printf(" Power indicator: %s\n", conf.ssaver.power_indicator ? "On" : "Off"); + printf(" BG Color: RGB(%u, %u, %u)\n", conf.ssaver.color_bg.r, + conf.ssaver.color_bg.g, conf.ssaver.color_bg.b); + printf(" Text Color: RGB(%u, %u, %u)\n", conf.ssaver.color_text.r, + conf.ssaver.color_text.g, conf.ssaver.color_text.b); + printf(" Meteo Type: %s\n", ssaver_meteo_type_to_string(conf.ssaver.meteo_type)); + + return 0; +} + +// Метод set: заглушка (TODO) +int +jl_block_display_set(int argc, const char *argv[]) +{ + (void)argc; + (void)argv; + + fprintf(stderr, "TODO: Display configuration modification is not yet implemented\n"); + fprintf(stderr, "Future usage examples:\n"); + fprintf(stderr, " jlv135_cli set display backlight <0-100>\n"); + fprintf(stderr, " jlv135_cli set display night_backlight <0-100>\n"); + fprintf(stderr, " jlv135_cli set display night \n"); + + return 1; +} diff --git a/src/jlv135_cli/jl_block_feature.c b/src/jlv135_cli/jl_block_feature.c new file mode 100644 index 0000000..a97a5d8 --- /dev/null +++ b/src/jlv135_cli/jl_block_feature.c @@ -0,0 +1,62 @@ +#include +#include +#include +#include +#include +#include + +typedef struct _jl_feature_t +{ + bool sound : 1; + bool wifi : 1; + bool remote : 1; + bool socket1 : 1; + bool socket2 : 1; + bool mb_server : 1; + bool socket1_auto_disable : 1; + bool socket1_mb_disable : 1; + int extra_sensor; + int socket1_server; + int socket2_server; + time_t socket1_disable; +} jl_feature_t; + +// Метод get: отображает все параметры блока feature +int +jl_block_feature_get(void) +{ + jl_feature_t conf = {}; + jl_config_load("feature", &conf, sizeof(jl_feature_t)); + + printf("Feature Configuration:\n"); + printf(" Sound: %s\n", conf.sound ? "Enabled" : "Disabled"); + printf(" WiFi: %s\n", conf.wifi ? "Enabled" : "Disabled"); + printf(" Remote: %s\n", conf.remote ? "Enabled" : "Disabled"); + printf(" Socket1: %s\n", conf.socket1 ? "Enabled" : "Disabled"); + printf(" Socket2: %s\n", conf.socket2 ? "Enabled" : "Disabled"); + printf(" Modbus Server: %s\n", conf.mb_server ? "Enabled" : "Disabled"); + printf(" Socket1 Auto Disable: %s\n", conf.socket1_auto_disable ? "Yes" : "No"); + printf(" Socket1 MB Disable: %s\n", conf.socket1_mb_disable ? "Yes" : "No"); + printf(" Extra Sensor: %d\n", conf.extra_sensor); + printf(" Socket1 Server: %d\n", conf.socket1_server); + printf(" Socket2 Server: %d\n", conf.socket2_server); + printf(" Socket1 Disable Time: %ld\n", conf.socket1_disable); + + return 0; +} + +// Метод set: заглушка (TODO) +int +jl_block_feature_set(int argc, const char *argv[]) +{ + (void)argc; + (void)argv; + + fprintf(stderr, "TODO: Feature configuration modification is not yet implemented\n"); + fprintf(stderr, "Future usage examples:\n"); + fprintf(stderr, " jlv135_cli set feature sound \n"); + fprintf(stderr, " jlv135_cli set feature wifi \n"); + fprintf(stderr, " jlv135_cli set feature socket1 \n"); + + return 1; +} diff --git a/src/jlv135_cli/jl_block_modbus.c b/src/jlv135_cli/jl_block_modbus.c new file mode 100644 index 0000000..3f6d559 --- /dev/null +++ b/src/jlv135_cli/jl_block_modbus.c @@ -0,0 +1,175 @@ +#include +#include +#include +#include +#include +#include + +// Вспомогательные функции для печати +static void +print_rs485_baud_rates(uint16_t speed_index) +{ + if (jl_modbus_rs485_baud_rate_is_index_valid(speed_index)) + { + printf(" Speed: %u baud\n", jl_modbus_rs485_baud_rates[speed_index]); + } + else + { + printf(" Speed: %s\n", "unknown"); + } +} + +static void +print_rs485_port(jl_modbus_rs485_port_t *rs485) +{ + printf("\nModbus RS485 (RTU) Port:\n"); + print_rs485_baud_rates(rs485->speed); + printf(" Parity P: %u\n", rs485->prop_p); + printf(" Parity S: %u\n", rs485->prop_s); + printf(" Repeat Count: %u\n", rs485->repeate); + printf(" Timeout: %u ms\n", rs485->timeout); +} + +static void +print_tcp_port(jl_modbus_tcp_port_t *tcp) +{ + // Преобразуем IP адрес из uint32_t в читаемый формат + uint8_t *ip = (uint8_t *)&tcp->addr; + + printf("\nModbus TCP Port:\n"); + printf(" IP Address: %u.%u.%u.%u\n", ip[0], ip[1], ip[2], ip[3]); + printf(" Port: %u\n", tcp->port); + printf(" Repeat Count: %u\n", tcp->repeate); + printf(" Timeout: %u ms\n", tcp->timeout); +} + +static void +print_modbus_config(jl_modbus_config_t *config) +{ + printf("Modbus Configuration:\n"); + printf(" Active Port: %u (0=RS485, 1=TCP)\n", config->num_port); + printf(" Device Address: %u\n", config->addr); + printf(" Polling Cycle: %u ms\n", config->tcycle); + + print_rs485_port(&config->port_rtu); + print_tcp_port(&config->port_tcp); +} + +// Метод get: отображает все параметры блока modbus +int +jl_block_modbus_get(void) +{ + jl_modbus_config_t conf = {}; + jl_config_load("modbus", &conf, sizeof(jl_modbus_config_t)); + print_modbus_config(&conf); + return 0; +} + +// Метод set: изменяет параметры блока modbus +int +jl_block_modbus_set(int argc, const char *argv[]) +{ + if (argc < 1) + { + fprintf(stderr, "Error: insufficient arguments for 'set modbus'\n"); + fprintf(stderr, "Usage examples:\n"); + fprintf(stderr, " jlv135_cli set modbus rs485 speed \n"); + fprintf(stderr, " jlv135_cli set modbus rs485 timeout \n"); + fprintf(stderr, " jlv135_cli set modbus tcp ip
\n"); + fprintf(stderr, " jlv135_cli set modbus tcp port \n"); + fprintf(stderr, " jlv135_cli set modbus addr <1-247>\n"); + fprintf(stderr, " jlv135_cli set modbus active_port <0|1>\n"); + return 1; + } + + // RS485 параметры + if (strcmp(argv[0], "rs485") == 0) + { + if (argc < 3) + { + fprintf(stderr, "Error: insufficient arguments for 'set modbus rs485'\n"); + fprintf(stderr, "Usage: jlv135_cli set modbus rs485 \n"); + return 1; + } + + // RS485 speed - реализовано + if (strcmp(argv[1], "speed") == 0) + { + jl_modbus_config_t conf = {}; + jl_config_load("modbus", &conf, sizeof(jl_modbus_config_t)); + + long val = strtol(argv[2], NULL, 10); + int idx = jl_modbus_rs485_baud_rate_get_index_by_baud(val); + + if (idx == -1) + { + fprintf(stderr, "Error: invalid speed value '%s'\n", argv[2]); + fprintf(stderr, "Supported speeds: "); + for (size_t i = 0; i < sizeof(jl_modbus_rs485_baud_rates) / sizeof(uint32_t); i++) + { + printf("%u ", jl_modbus_rs485_baud_rates[i]); + } + printf("\n"); + return 1; + } + + conf.port_rtu.speed = idx; + jl_config_save("modbus", &conf, sizeof(jl_modbus_config_t)); + printf("RS485 speed set to %u baud\n", jl_modbus_rs485_baud_rates[idx]); + return 0; + } + // RS485 timeout - TODO + else if (strcmp(argv[1], "timeout") == 0) + { + fprintf(stderr, "TODO: RS485 timeout modification is not yet implemented\n"); + return 1; + } + // RS485 repeat - TODO + else if (strcmp(argv[1], "repeat") == 0) + { + fprintf(stderr, "TODO: RS485 repeat count modification is not yet implemented\n"); + return 1; + } + else + { + fprintf(stderr, "Error: unknown RS485 parameter '%s'\n", argv[1]); + return 1; + } + } + // TCP параметры - TODO + else if (strcmp(argv[0], "tcp") == 0) + { + fprintf(stderr, "TODO: TCP configuration modification is not yet implemented\n"); + fprintf(stderr, "Future usage:\n"); + fprintf(stderr, " jlv135_cli set modbus tcp ip \n"); + fprintf(stderr, " jlv135_cli set modbus tcp port \n"); + fprintf(stderr, " jlv135_cli set modbus tcp timeout \n"); + return 1; + } + // Device address - TODO + else if (strcmp(argv[0], "addr") == 0) + { + fprintf(stderr, "TODO: Device address modification is not yet implemented\n"); + return 1; + } + // Active port - TODO + else if (strcmp(argv[0], "active_port") == 0) + { + fprintf(stderr, "TODO: Active port switching is not yet implemented\n"); + return 1; + } + // Polling cycle - TODO + else if (strcmp(argv[0], "tcycle") == 0) + { + fprintf(stderr, "TODO: Polling cycle modification is not yet implemented\n"); + return 1; + } + else + { + fprintf(stderr, "Error: unknown parameter '%s'\n", argv[0]); + fprintf(stderr, "Use 'jlv135_cli set modbus' without arguments to see usage\n"); + return 1; + } + + return 0; +} diff --git a/src/jlv135_cli/jl_block_secure.c b/src/jlv135_cli/jl_block_secure.c new file mode 100644 index 0000000..90df1d1 --- /dev/null +++ b/src/jlv135_cli/jl_block_secure.c @@ -0,0 +1,45 @@ +#include +#include +#include +#include +#include + +typedef struct _jlv_secure_t +{ + uint32_t user_pass; + uint32_t service_pass; + bool user_block : 1; + bool service_block : 1; +} jlv_secure_t; + +// Метод get: отображает все параметры блока secure +int +jl_block_secure_get(void) +{ + jlv_secure_t conf = {}; + jl_config_load("secure", &conf, sizeof(jlv_secure_t)); + + printf("Security Configuration:\n"); + printf(" User Password: %s\n", conf.user_pass ? "Set" : "Not set"); + printf(" Service Password: %s\n", conf.service_pass ? "Set" : "Not set"); + printf(" User Lock: %s\n", conf.user_block ? "Enabled" : "Disabled"); + printf(" Service Lock: %s\n", conf.service_block ? "Enabled" : "Disabled"); + + return 0; +} + +// Метод set: заглушка (TODO) +int +jl_block_secure_set(int argc, const char *argv[]) +{ + (void)argc; + (void)argv; + + fprintf(stderr, "TODO: Security configuration modification is not yet implemented\n"); + fprintf(stderr, "Future usage examples:\n"); + fprintf(stderr, " jlv135_cli set secure user_pass \n"); + fprintf(stderr, " jlv135_cli set secure service_pass \n"); + fprintf(stderr, " jlv135_cli set secure user_lock \n"); + + return 1; +} diff --git a/src/jlv135_cli/jl_block_sensor.c b/src/jlv135_cli/jl_block_sensor.c new file mode 100644 index 0000000..d8dfb90 --- /dev/null +++ b/src/jlv135_cli/jl_block_sensor.c @@ -0,0 +1,44 @@ +#include +#include +#include +#include + +typedef struct _jlv_sensor_t +{ + uint8_t send_TH; // 1 - отправлять в ПУ температуру и влажность + uint8_t send_P; // 1 - отправлять в ПУ давление + float TK_delta; // температурный коэффициент разницы "гор"-"хол" + float TNot_lin; // температурный коэффициент нелинейности +} jlv_sensor_t; + +// Метод get: отображает все параметры блока sensor +int +jl_block_sensor_get(void) +{ + jlv_sensor_t conf = {}; + jl_config_load("sensor", &conf, sizeof(jlv_sensor_t)); + + printf("Sensor Configuration:\n"); + printf(" Send T/H: %s\n", conf.send_TH ? "Enabled" : "Disabled"); + printf(" Send Pressure: %s\n", conf.send_P ? "Enabled" : "Disabled"); + printf(" TK Delta: %.3f\n", conf.TK_delta); + printf(" TNot Linear: %.3f\n", conf.TNot_lin); + + return 0; +} + +// Метод set: заглушка (TODO) +int +jl_block_sensor_set(int argc, const char *argv[]) +{ + (void)argc; + (void)argv; + + fprintf(stderr, "TODO: Sensor configuration modification is not yet implemented\n"); + fprintf(stderr, "Future usage examples:\n"); + fprintf(stderr, " jlv135_cli set sensor send_th \n"); + fprintf(stderr, " jlv135_cli set sensor send_p \n"); + fprintf(stderr, " jlv135_cli set sensor tk_delta \n"); + + return 1; +} diff --git a/src/jlv135_cli/jl_block_service.c b/src/jlv135_cli/jl_block_service.c new file mode 100644 index 0000000..1095b5d --- /dev/null +++ b/src/jlv135_cli/jl_block_service.c @@ -0,0 +1,75 @@ +#include +#include +#include +#include +#include + +#define JL_FILTER_MAX 4 + +typedef struct _jlv_filter_state_t +{ + uint16_t min_p; + uint16_t max_p; +} jlv_filter_state_t; + +typedef struct _jlv_filter_t +{ + jlv_filter_state_t single; + jlv_filter_state_t duplex; + bool duplex_filter : 1; + bool checkbox_duplex_filter : 1; +} jlv_filter_t; + +typedef struct _jlv_service_t +{ + jlv_filter_t filters[JL_FILTER_MAX]; +} jlv_service_t; + +// Метод get: отображает все параметры блока service +int +jl_block_service_get(void) +{ + jlv_service_t conf = {}; + jl_config_load("service", &conf, sizeof(jlv_service_t)); + + printf("Service Configuration:\n"); + + for (int i = 0; i < JL_FILTER_MAX; i++) + { + printf("\nFilter %d:\n", i + 1); + printf(" Duplex Mode: %s\n", conf.filters[i].duplex_filter ? "Yes" : "No"); + printf(" Checkbox Duplex: %s\n", + conf.filters[i].checkbox_duplex_filter ? "Yes" : "No"); + + if (conf.filters[i].duplex_filter) + { + printf(" Single Min/Max: %u / %u\n", conf.filters[i].single.min_p, + conf.filters[i].single.max_p); + printf(" Duplex Min/Max: %u / %u\n", conf.filters[i].duplex.min_p, + conf.filters[i].duplex.max_p); + } + else + { + printf(" Min/Max: %u / %u\n", conf.filters[i].single.min_p, + conf.filters[i].single.max_p); + } + } + + return 0; +} + +// Метод set: заглушка (TODO) +int +jl_block_service_set(int argc, const char *argv[]) +{ + (void)argc; + (void)argv; + + fprintf(stderr, "TODO: Service configuration modification is not yet implemented\n"); + fprintf(stderr, "Future usage examples:\n"); + fprintf(stderr, " jlv135_cli set service filter <1-4> min \n"); + fprintf(stderr, " jlv135_cli set service filter <1-4> max \n"); + fprintf(stderr, " jlv135_cli set service filter <1-4> duplex \n"); + + return 1; +} diff --git a/src/jlv135_cli/jl_block_wifi.c b/src/jlv135_cli/jl_block_wifi.c new file mode 100644 index 0000000..e740af2 --- /dev/null +++ b/src/jlv135_cli/jl_block_wifi.c @@ -0,0 +1,44 @@ +#include +#include +#include +#include + +#define JLV_WIFI_SSID_BYTES 32 + +typedef struct _jlv_wifi_t +{ + char ssid[JLV_WIFI_SSID_BYTES]; + char password[64]; + bool enable : 1; +} jlv_wifi_t; + +// Метод get: отображает все параметры блока wifi +int +jl_block_wifi_get(void) +{ + jlv_wifi_t conf = {}; + jl_config_load("wifi", &conf, sizeof(jlv_wifi_t)); + + printf("WiFi Configuration:\n"); + printf(" SSID: %s\n", conf.ssid); + printf(" Password: %s\n", conf.password[0] ? "********" : "(empty)"); + printf(" Enabled: %s\n", conf.enable ? "Yes" : "No"); + + return 0; +} + +// Метод set: заглушка (TODO) +int +jl_block_wifi_set(int argc, const char *argv[]) +{ + (void)argc; + (void)argv; + + fprintf(stderr, "TODO: WiFi configuration modification is not yet implemented\n"); + fprintf(stderr, "Future usage examples:\n"); + fprintf(stderr, " jlv135_cli set wifi ssid \n"); + fprintf(stderr, " jlv135_cli set wifi password \n"); + fprintf(stderr, " jlv135_cli set wifi enable \n"); + + return 1; +} diff --git a/src/jlv135_cli/main.c b/src/jlv135_cli/main.c index afdc9c6..bae4f74 100644 --- a/src/jlv135_cli/main.c +++ b/src/jlv135_cli/main.c @@ -1,139 +1,95 @@ -#include -#include +#include #include -#include #include #define JLV135_CLI_OK 0 #define JLV135_CLI_ERROR 1 -void -print_version(jl_version_t *ver) +// Печать справки +static void +print_help(const char *program_name) { - printf("Version:\n"); - printf(" major: %u\n", ver->major); - printf(" minor: %u\n", ver->minor); - printf(" path: %u\n\n", ver->path); -} + printf("Usage: %s [COMMAND] [BLOCK] [PARAMETERS...]\n\n", program_name); + printf("Commands:\n"); + printf(" get Display all parameters of the specified block\n"); + printf(" set ... Modify parameters of the specified block\n\n"); + printf("Available blocks:\n"); -// Функция для печати TCP порта -void -print_tcp_port(jl_modbus_tcp_port_t *tcp) -{ - printf("Modbus TCP Port:\n"); - printf(" addr: %u\n", tcp->addr); - printf(" port: %u\n", tcp->port); - printf(" repeate: %u\n", tcp->repeate); - printf(" timeout: %u\n\n", tcp->timeout); -} - -void -print_rs485_baud_rates(uint16_t speed_index) -{ - if (jl_modbus_rs485_baud_rate_is_index_valid(speed_index)) + const jl_block_t *block = jl_block_get_all(); + while (block->name != NULL) { - printf(" speed: %u\n", jl_modbus_rs485_baud_rates[speed_index]); + printf(" - %s\n", block->name); + block++; } - else - { - printf(" speed: %s\n", "unknown"); - } -} -// Функция для печати RS485 порта -void -print_rs485_port(jl_modbus_rs485_port_t *rs485) -{ - printf("Modbus RS485 Port:\n"); - print_rs485_baud_rates(rs485->speed); - - printf(" prop_p: %u\n", rs485->prop_p); - printf(" prop_s: %u\n", rs485->prop_s); - printf(" repeate: %u\n", rs485->repeate); - printf(" timeout: %u\n\n", rs485->timeout); -} - -// Функция для печати конфигурации Modbus -void -print_modbus_config(jl_modbus_config_t *config) -{ - printf("Modbus Config:\n"); - printf(" num_port: %u\n", config->num_port); - printf(" addr: %u\n", config->addr); - printf(" tcycle: %u\n", config->tcycle); - printf("\n"); - - // Печатаем вложенные структуры - print_rs485_port(&config->port_rtu); - print_tcp_port(&config->port_tcp); + printf("\nExamples:\n"); + printf(" %s get modbus\n", program_name); + printf(" %s set modbus rs485 speed 9600\n", program_name); } int main(int argc, const char *argv[]) { - jl_modbus_config_t conf = {}; - jl_config_load("modbus", &conf, sizeof(jl_modbus_config_t)); - + // Вызов без аргументов - показываем справку if (argc == 1) { - print_modbus_config(&conf); + print_help(argv[0]); + return JLV135_CLI_OK; + } + + const char *command = argv[1]; + + // Команда get + if (strcmp(command, "get") == 0) + { + if (argc < 3) + { + fprintf(stderr, "Error: 'get' command requires a block name\n"); + fprintf(stderr, "Usage: %s get \n", argv[0]); + return JLV135_CLI_ERROR; + } + + const char *block_name = argv[2]; + const jl_block_t *block = jl_block_find(block_name); + + if (block == NULL) + { + fprintf(stderr, "Error: unknown block '%s'\n", block_name); + fprintf(stderr, "Run '%s' to see available blocks\n", argv[0]); + return JLV135_CLI_ERROR; + } + + return block->get(); + } + // Команда set + else if (strcmp(command, "set") == 0) + { + if (argc < 3) + { + fprintf(stderr, "Error: 'set' command requires a block name\n"); + fprintf(stderr, "Usage: %s set \n", argv[0]); + return JLV135_CLI_ERROR; + } + + const char *block_name = argv[2]; + const jl_block_t *block = jl_block_find(block_name); + + if (block == NULL) + { + fprintf(stderr, "Error: unknown block '%s'\n", block_name); + fprintf(stderr, "Run '%s' to see available blocks\n", argv[0]); + return JLV135_CLI_ERROR; + } + + // Передаем оставшиеся аргументы в метод set блока + return block->set(argc - 3, &argv[3]); } else { - bool modbus_mode = false; // Флаг, что был передан --modbus - bool modbus_rs485_mode = true; // Флаг, что был передан --rs485 - - for (int i = 1; i < argc; i++) - { - if (strcmp(argv[i], "--modbus") == 0) - { - modbus_mode = true; - continue; - } - else if (modbus_mode) - { - // Эти параметры обрабатываются только если был --modbus - if (modbus_mode && strcmp(argv[i], "--rs485") == 0) - { - modbus_rs485_mode = true; - continue; - } - else if (modbus_rs485_mode && strcmp(argv[i], "--speed") == 0) - { - if (i + 1 < argc) - { - long val = strtol(argv[i + 1], NULL, 10); - int idx = jl_modbus_rs485_baud_rate_get_index_by_baud(val); - if (idx == -1) - { - fprintf(stderr, "Error: invalid speed value\n"); - return JLV135_CLI_ERROR; - } - else - { - conf.port_rtu.speed = idx; - jl_config_save("modbus", &conf, sizeof(jl_modbus_config_t)); - } - break; - } - else - { - fprintf(stderr, "Error: --speed requires a value\n"); - return JLV135_CLI_ERROR; - } - } - else - { - fprintf(stderr, "Unknown parameter for --modbus: %s\n", argv[i]); - return JLV135_CLI_ERROR; - } - } - else - { - fprintf(stderr, "Unknown parameter: %s (did you forget --modbus?)\n", argv[i]); - return JLV135_CLI_ERROR; - } - } + fprintf(stderr, "Error: unknown command '%s'\n", command); + fprintf(stderr, "Run '%s' to see usage\n", argv[0]); + return JLV135_CLI_ERROR; } + return JLV135_CLI_OK; } \ No newline at end of file