diff --git a/README.md b/README.md index 03896213..bdc8ad58 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,13 @@ +# Разработка + +- После клонирования запустить скрипт `git-hooks-config.sh` + - В среде **Windows** запуск скрипта `git-hooks-config.sh` производить из оболочки `git bash` +- При необходимости обновить `settings.json` +- Использовать выражения вида `ProjectSettings.set_setting('application/config/%s' % key_name` +и `ProjectSettings.get_setting('application/config/%s % key_name)` для доступа к настройкам. + - `key_name` брать из таблицы `res://scenes/настройки/настройки.gd/SETTING_TABLE` +- Следовать [общим правилам](http://gitea.srez.local:3000/sasha80/gitea-tniis). + # Ссылки на составные части - [Исполняемые файлы для шаблонов экспорта и редактора](http://gitea.srez.local:3000/sasha80/godot-bin) @@ -31,9 +41,3 @@ необходимые для этого настройки. - Для доступа к последовательным портам расположенным на другом вычислительном модуле, следует использовать [проброс портов](http://gitea.srez.local:3000/sasha80/uart-forwarder). - -# Разработка - -- После клонирования запустить скрипт `git-hooks-config.sh` -- В среде **Windows** запуск скрипта `git-hooks-config.sh` производить из оболочки `git bash` -- При необходимости обновить `settings.json` diff --git a/data/Излучение.png b/data/Излучение.png index 8758f6f3..6290bbf3 100644 Binary files a/data/Излучение.png and b/data/Излучение.png differ diff --git a/data/Квадрат марс 454.png b/data/Квадрат марс 454.png index 670d2dec..31b21a33 100644 Binary files a/data/Квадрат марс 454.png and b/data/Квадрат марс 454.png differ diff --git a/data/Квадрат марс ГО.png b/data/Квадрат марс ГО.png index 2bf79149..cce427a7 100644 Binary files a/data/Квадрат марс ГО.png and b/data/Квадрат марс ГО.png differ diff --git a/data/Квадрат марс ОР-63.png b/data/Квадрат марс ОР-63.png index 821dad95..4d13f1d9 100644 Binary files a/data/Квадрат марс ОР-63.png and b/data/Квадрат марс ОР-63.png differ diff --git a/data/Квадрат марс РЛС1.png b/data/Квадрат марс РЛС1.png index 4be19b5f..6e835b46 100644 Binary files a/data/Квадрат марс РЛС1.png and b/data/Квадрат марс РЛС1.png differ diff --git a/data/Квадрат марс РЛС2.png b/data/Квадрат марс РЛС2.png index 7f6c0be0..8a538ce3 100644 Binary files a/data/Квадрат марс РЛС2.png and b/data/Квадрат марс РЛС2.png differ diff --git a/data/Квадрат марс с трубкой.png b/data/Квадрат марс с трубкой.png index 06466be2..1025c0ef 100644 Binary files a/data/Квадрат марс с трубкой.png and b/data/Квадрат марс с трубкой.png differ diff --git a/data/Квадрат салатный 454.png b/data/Квадрат салатный 454.png index fda1e654..6ad8a291 100644 Binary files a/data/Квадрат салатный 454.png and b/data/Квадрат салатный 454.png differ diff --git a/data/Квадрат салатный ГО.png b/data/Квадрат салатный ГО.png index 46f2795d..5589812a 100644 Binary files a/data/Квадрат салатный ГО.png and b/data/Квадрат салатный ГО.png differ diff --git a/data/Квадрат салатный ОР-63.png b/data/Квадрат салатный ОР-63.png index 1e9e6c98..6f2e7a58 100644 Binary files a/data/Квадрат салатный ОР-63.png and b/data/Квадрат салатный ОР-63.png differ diff --git a/data/Квадрат салатный РЛС1.png b/data/Квадрат салатный РЛС1.png index f57560f3..e4c8f0cf 100644 Binary files a/data/Квадрат салатный РЛС1.png and b/data/Квадрат салатный РЛС1.png differ diff --git a/data/Квадрат салатный РЛС2.png b/data/Квадрат салатный РЛС2.png index 119b3c8d..c7f33d66 100644 Binary files a/data/Квадрат салатный РЛС2.png and b/data/Квадрат салатный РЛС2.png differ diff --git a/data/Квадрат салатный с трубкой.png b/data/Квадрат салатный с трубкой.png index 4509564f..c32ec861 100644 Binary files a/data/Квадрат салатный с трубкой.png and b/data/Квадрат салатный с трубкой.png differ diff --git a/data/Кнопка подтверждения01.png b/data/Кнопка подтверждения01.png index 8449777f..f2d71a93 100644 Binary files a/data/Кнопка подтверждения01.png and b/data/Кнопка подтверждения01.png differ diff --git a/data/Окно частот0.png b/data/Окно частот0.png index 18d7d280..37c9874a 100644 Binary files a/data/Окно частот0.png and b/data/Окно частот0.png differ diff --git a/data/Приём.png b/data/Приём.png index 776df102..bc17234b 100644 Binary files a/data/Приём.png and b/data/Приём.png differ diff --git a/data/Скруглённый квадрат белый.png b/data/Скруглённый квадрат белый.png index d0959be3..c470bd35 100644 Binary files a/data/Скруглённый квадрат белый.png and b/data/Скруглённый квадрат белый.png differ diff --git a/data/Скруглённый квадрат серый.png b/data/Скруглённый квадрат серый.png index 35d08ee1..d4779b41 100644 Binary files a/data/Скруглённый квадрат серый.png and b/data/Скруглённый квадрат серый.png differ diff --git a/data/Скруглённый прямоуг салатный.png b/data/Скруглённый прямоуг салатный.png index f2ba3418..38f308c3 100644 Binary files a/data/Скруглённый прямоуг салатный.png and b/data/Скруглённый прямоуг салатный.png differ diff --git a/data/Скруглённый прямоугольник белый.png b/data/Скруглённый прямоугольник белый.png index f734b978..c17d762d 100644 Binary files a/data/Скруглённый прямоугольник белый.png and b/data/Скруглённый прямоугольник белый.png differ diff --git a/data/Скруглённый прямоугольник серый.png b/data/Скруглённый прямоугольник серый.png index c1684d86..6b6dfbe6 100644 Binary files a/data/Скруглённый прямоугольник серый.png and b/data/Скруглённый прямоугольник серый.png differ diff --git a/data/Угловой квадрат2.png b/data/Угловой квадрат2.png index ca73f105..4208f4c5 100644 Binary files a/data/Угловой квадрат2.png and b/data/Угловой квадрат2.png differ diff --git a/scenes/контроль/контроль.tscn b/scenes/контроль/контроль.tscn index 7e4ad11f..7260fc28 100644 --- a/scenes/контроль/контроль.tscn +++ b/scenes/контроль/контроль.tscn @@ -116,9 +116,8 @@ func _ready(): var unit_instance: = network.get_unit_instance(unit_name) var conn_node: = pribor_node.get_node('connect_pribor') unit_instance.connect('line_changed', on_line_changed.bind(conn_node, unit_name)) - - - + + signaller.conn(signaller.режим_работа, on_mode_changed) signaller.conn(signaller.режим_журнал, on_mode_changed) signaller.conn(signaller.режим_настройки, on_mode_changed) diff --git a/scenes/настройки/настройки.gd b/scenes/настройки/настройки.gd new file mode 100644 index 00000000..8b6d2eb3 --- /dev/null +++ b/scenes/настройки/настройки.gd @@ -0,0 +1,298 @@ +class_name configure extends Panel + +const TableHeader = preload('res://table/header.tscn') +const TableToggle = preload('res://table/settings-toggle.tscn') +const TableEdit = preload('res://table/ячейка-2.tscn') +const TableColorPick = preload('res://table/ячейка-цвет.tscn') + +const ALIGNMENT = [HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER] +const HEADER_ROW = [TableHeader, TableHeader] +const HEADER_ROW_TEXT = ['Параметр', 'Значение'] +const SETTING_TABLE = [ + ['Ограниченный режим', TableEdit, TableToggle, 'Ограничть возможности по постановке помех'], + ['Кнопка «ПД-М4»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], + ['Кнопка «ПД-М2»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], + ['Кнопка «ОЗП-1»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], + ['Кнопка «МЧМ-1»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], + ['Кнопка «ОРН-И1»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], + ['Кнопка «ОРН-М2»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], + ['Кнопка «ЛЧМ-1»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], + ['Кнопка «ПД-М4С»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], + ['Кнопка «ПД-ЧМ»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], + ['Кнопка «СВ-И1»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], + ['Кнопка «К1»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], + ['Кнопка «СВ-М2»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], + ['Кнопка «ОРН»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], + ['Кнопка «JTIDS»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], + ['Кнопка «КУПД»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], + ['Внешнее управление', TableEdit, TableToggle, 'Передать управление в 5П28'], + ['Внешнее указание Трасса', TableEdit, TableToggle, 'Разрешить постановку помех от Трасса'], + ['Кнопка «Подавление»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], + ['Виртуальная клавиатура', TableEdit, TableToggle, 'Включить отображение экранной клавиатуры'], + ['Скрыть вкладку ЭМС 2', TableEdit, TableToggle, 'Отображать вкладку \"ЭМС-2\"'], + ['Отладка контроля', TableEdit, TableToggle, 'Отображать отладку контроля'], + ['Текущая версия ПО УАРЭП', TableEdit, TableEdit, 'Время сборки, версия и номер фиксации'], + ['уарэп-яу07-частный', TableEdit, TableEdit, 'IP-адрес для получения частных сообщений от ЯУ-07'], + ['уарэп-яу07-общий', TableEdit, TableEdit, 'IP-адрес для получения широковещательных сообщений от ЯУ-07'], + ['уарэп-капсрпб', TableEdit, TableEdit, 'IP-адрес для связи с КАПС-РПБ [<адрес этого узла>, <адрес удалённого узла>, <порт этого узла>, <порт удалённого узла>]'], + ['уарэп-эмс', TableEdit, TableEdit, 'IP-адрес для связи с ЭМС'], + ['уарэп-яу07-2в', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-В 2'], + ['уарэп-яу07-2н', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-Н 2'], + ['уарэп-яу07-2к', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-К 2'], + ['уарэп-яу07-4в', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-В 4'], + ['уарэп-яу07-4н', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-Н 4'], + ['уарэп-яу07-4к', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-К 4'], + ['уарэп-яу07-1в', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-В 1'], + ['уарэп-яу07-1н', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-Н 1'], + ['уарэп-яу07-1к', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-К 1'], + ['уарэп-яу07-3в', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-В 3'], + ['уарэп-яу07-3н', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-Н 3'], + ['уарэп-яу07-3к', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-К 3'], + ['уарэп-5п28', TableEdit, TableEdit, 'IP-адрес для связи с 5П28'], + ['навигация', TableEdit, TableEdit, 'Порт назначения для получения данных от АКНГ'], + ['уарэп-щ3', TableEdit, TableEdit, 'Путь к UART-устройству для связи с прибором Щ3'], + ['уарэп-спт25-1', TableEdit, TableEdit, 'Путь к UART-устройству для связи с прибором СПТ-25 1'], + ['уарэп-спт25-2', TableEdit, TableEdit, 'Путь к UART-устройству для связи с прибором СПТ-25 2'], + ['Шаблон адреса сервера карт', TableEdit, TableEdit, 'Шаблон URL-адреса сервера карт, должен содержать поля \"{x}\", \"{y}\", \"{z}\" для подстановки индекса плитки'], + ['Адрес АФСП левого борта', TableEdit, TableEdit, 'http-адрес для запроса состояния прибора АФСП'], + ['Адрес АФСП правого борта', TableEdit, TableEdit, 'http-адрес для запроса состояния прибора АФСП'], + ['Адрес БПО левого борта', TableEdit, TableEdit, 'http-адрес для запроса состояния прибора БПО'], + ['Адрес БПО правого борта', TableEdit, TableEdit, 'http-адрес для запроса состояния прибора БПО'], + ['Период опроса состояния БПО, секунды', TableEdit, TableEdit, 'Время в секундах' ], + ['Период опроса состояния АФСП, секунды', TableEdit, TableEdit, 'Время в секундах' ], + ['уарэп-трасса', TableEdit, TableEdit, 'IP-адрес для связи с Трассой [<адрес этого узла>, <адрес удалённого узла>, <порт этого узла>, <порт удалённого узла>]'], + ['Включить работу по своим целям', TableEdit, TableToggle, 'Разрешает работу в секторе со своей целью'], + ['Список своих протоколов', TableEdit, TableEdit, 'Список протоколов целей, по которым запрещено работать' ], + ['Цвет кнопки \"Подавление\"', TableEdit, TableColorPick, 'Цвет кнопки. Введено по требованию ПЗ' ] ] + +## TODO: Придумать как избавиться от индексов +## Индексы строк таблицы. +const EXTERNAL_CU = 16 ## Внешнее целеуказание +const TRASSA = 17 ## Строка - Трасса +const SUPPRESS = 18 ## Строка - Подавление +const KEYBOARD = 19 ## Строка - Виртуальная клавиатура +const HIDE_EMS2 = 20 ## Строка - Скрыть вкладку ЭМС 2 +const DEBAG_CONTROL = 21 ## Строка - Отладка контроля +const COMMIT = 22 ## Строка - Версия УАРЭП +const GOS_BTN = 52 ## Разрешить работу по своим целям +const COLOR_BTN_ACT = 54 ## Цвет кнопки "Подавление" + + +var name_to_line_index: = {} ## Для преобразования названия параметра в номер строки + +func on_checkbutton_pressed(i_row: int): on_row_pressed(i_row) + + +## Вызывается, когда узел впервые попадает в дерево сцены. +func _ready() -> void: + setting_tab() + if not OS.get_cmdline_args().has('++ограниченный'): + return + $Label2.text = 'Текущий режим доступа: ограниченный' + for node in $GridContainer.get_children().filter(func(b): return b is Button): + node.disabled = true + + +func on_external_cu_btn_pressed(btn) -> void: + ProjectSettings.set_setting('application/config/Внешнее управление', btn.button_pressed) + if btn.button_pressed: + signaller.emit_signal('interfer_off_all') + + +func on_trassa_btn_pressed(btn) -> void: + ProjectSettings.set_setting('application/config/Внешнее указание Трасса', btn.button_pressed) + + +func on_vk_pressed(btn) -> void: + signaller.emit_signal('kb_pressed', btn.button_pressed) + + +func on_gos_pressed(btn) -> void: + ProjectSettings.set_setting('application/config/Включить работу по своим целям', btn.button_pressed) + + +func on_ems2_pressed(btn) -> void: + var state = btn.button_pressed + signaller.emit_signal('ems2_hide_pressed', state) + + +func on_debag_control_pressed(btn) -> void: + var state = btn.button_pressed + signaller.emit_signal("debag_control_pressed", state) + + +func on_row_pressed(i_row: int): + $scroll_set/table.clear_rows_selected() + $scroll_set/table.set_row_selected(i_row, true) + + +func parse_cmd_line_args(settings_data: Dictionary): + var args = OS.get_cmdline_args() + for i in range(0, args.size(), 2): + var key: String = args[i] + key = key.lstrip('\'\" ').rstrip('\'\" ').strip_edges().strip_escapes() + if not settings_data.has(key): + continue + if not ((i + 1) < args.size()): + push_error('для аргумента \"%s\" не указано значение.' % key) + break + var val0 = args[i + 1] + var val1 = settings_data[key] + val0 = val0.lstrip('\'\" ').rstrip('\'\" ').strip_edges().strip_escapes() + if typeof(val1) == TYPE_BOOL: + if val0 not in ['yes', 'true', 'да', 'no', 'false', 'нет']: + push_error('для аргумента \"%s\" указано неверное значение \"%s\".' % [key, val0]) + break + settings_data[key] = true if val0 in ['yes', 'true', 'да'] else false + elif typeof(val1) == TYPE_ARRAY: + var val0s = val0.split(',') + if val0s.size() != val1.size(): + push_error('для аргумента \"%s\" указано неверное значение \"%s\" (исходное: \"%s\").' % [key, val0, val1]) + break + for j in val0s.size(): + var val: String = val0s[j] + val = val.lstrip('\'\" ').rstrip('\'\" ').strip_edges().strip_escapes() + if tools.type_is_num(val): + val0s[j] = int(val) + elif val in ['true', 'false']: + val0s[j] = true if val == 'true' else false + else: + val0s[j] = val + elif typeof(val1) == TYPE_STRING: + settings_data[key] = val0 + + +func setting_tab(): + $heard_table.set_header(HEADER_ROW) + $heard_table.set_header_text(HEADER_ROW_TEXT) + $heard_table.set_columns_min_size([600, 950]) + $heard_table.set_columns_alignments(ALIGNMENT) + var settings_data = {} + parse_cmd_line_args(settings_data) + for key in settings_data: + ProjectSettings.set_setting('application/config/%s' % key, settings_data[key]) + for i in SETTING_TABLE.size(): + var tbl_row = SETTING_TABLE[i] + var param_name = tbl_row[0] + var node_label = tbl_row[1] + var node_value = tbl_row[2] + var tootip_text = tbl_row[3] + name_to_line_index[param_name] = i + $scroll_set/table.add_row([node_label, node_value]) + var label_instance = $scroll_set/table.get_node2(0, i) + label_instance.text = param_name + label_instance.tooltip_text = tootip_text + $scroll_set/table.set_node_editable(0, i, false) + var node_values = $scroll_set/table.get_node2(1, i).get_children() + var edit_node = $scroll_set/table.get_node2(1, i) + if node_values.size(): + var child = node_values[0] + if child is CheckButton: + child.connect('pressed', Callable(self, 'on_checkbutton_pressed').bind(i)) + var val = ProjectSettings.get_setting('application/config/%s' % param_name, true) + child.set_pressed(val) + else: + if settings_data.has(param_name): + var val = settings_data[param_name] + if typeof(val) == TYPE_STRING: + $scroll_set/table.get_node2(1, i).text = settings_data[param_name] + if edit_node: + if edit_node is LineEdit: + $scroll_set/table.set_node_control(1, i, true) + $scroll_set/table.set_node_editable(1, COMMIT, false) + $scroll_set/table.set_columns_min_size([600, 950]) + $scroll_set/table.set_columns_alignments(ALIGNMENT) + $scroll_set/table.connect('row_pressed', Callable(self, 'on_row_pressed')) + var commit_instance = $scroll_set/table.get_node2(1, COMMIT) + commit_instance.text = '%s' % commit.VCS_HEAD + for i in SETTING_TABLE.size(): + var param_name = SETTING_TABLE[i][0] + var profile = $scroll_set/table.get_node2(1, i) + if settings.UnitProfiles.has(param_name): + var unit_data = settings.UnitProfiles[param_name][1] + profile.text = '' + for val in unit_data: + profile.text += str(val) + ',' + profile.text = profile.text.trim_suffix(',') + continue + var psk = 'application/config/%s' % param_name + if ProjectSettings.has_setting(psk): + var unit_data = ProjectSettings.get_setting(psk) + if is_instance_of(unit_data, TYPE_STRING): + profile.text = unit_data + button_settings() + + +func button_settings(): + var extern_cu_node = $scroll_set/table.get_node2(1, EXTERNAL_CU).get_children()[0] + extern_cu_node.connect('pressed', on_external_cu_btn_pressed.bind(extern_cu_node)) + on_external_cu_btn_pressed(extern_cu_node) + var trassa_node = $scroll_set/table.get_node2(1, TRASSA).get_children() + trassa_node = trassa_node[0] + trassa_node.connect('pressed', on_trassa_btn_pressed.bind(trassa_node)) + var vk_node = $scroll_set/table.get_node2(1, KEYBOARD).get_children()[0] + vk_node.connect('pressed', on_vk_pressed.bind(vk_node)) + var ems2_hide_node = $scroll_set/table.get_node2(1, HIDE_EMS2).get_children()[0] + ems2_hide_node.connect('pressed', on_ems2_pressed.bind(ems2_hide_node)) + ems2_hide_node.set_pressed(true) + on_ems2_pressed(ems2_hide_node) + var gos_node = $scroll_set/table.get_node2(1, GOS_BTN).get_children()[0] + gos_node.connect('pressed', on_gos_pressed.bind(gos_node)) + var debag_control = $scroll_set/table.get_node2(1, DEBAG_CONTROL).get_children()[0] + debag_control.connect('pressed', on_debag_control_pressed.bind(debag_control)) + debag_control.set_pressed(false) + on_debag_control_pressed(debag_control) + var color_btn_act = $scroll_set/table.get_node2(1, COLOR_BTN_ACT) + color_btn_act.connect('popup_closed', on_color_closed.bind(color_btn_act)) + + +func on_color_closed(color_btn_act: ColorPickerButton): + var col = [color_btn_act.color.r, color_btn_act.color.g, color_btn_act.color.b, 1.0] + ProjectSettings.set_setting('application/config/%s' % 'Цвет кнопки \"Подавление\"', col) + + +func _on_btn_save_settings_pressed(): + var json_data = {} + for i in SETTING_TABLE.size(): + var parameter = SETTING_TABLE[i][0] + if parameter in settings.UnitProfiles: + var ref_profile = settings.UnitProfiles[parameter][1] + var profiles = $scroll_set/table.get_node2(1, i) + var value = profiles.get_text() + if parameter not in json_data: + var row: = [] + for token in value.split(','): + var j: = row.size() + if token.is_valid_int(): + token = int(token) + elif token == 'false': + token = false + elif token == 'true': + token = true + if typeof(ref_profile[j]) == typeof(token): + row.append(token) + else: + # TODO: Это надо вывести на экран пользователю + push_error([parameter, j, type_string(typeof(ref_profile[j])), type_string(typeof(token))]) + row.append(ref_profile[j]) + json_data[parameter] = row + else: + var children = $scroll_set/table.get_node2(1, i).get_children() + if len(children): + var child = children[0] + json_data[parameter] = child.is_pressed() + else: + var row = $scroll_set/table.get_row(i) + json_data[parameter] = row[1].text + for key in json_data: + ProjectSettings.set_setting('application/config/%s' % key, json_data[key]) + var settings_file: = settings.get_settings_file_path() + var file: = FileAccess.open(settings_file, FileAccess.WRITE) + var abs_path: = ProjectSettings.globalize_path(settings_file) + if not file: + log.error('Не удалось открыть файл для записи \"%s\"' % abs_path) + return + var json_string: = JSON.stringify(json_data, ' ', true) + if file.store_string(json_string): + log.info('Настройки сохранены в файл \"%s\"' % abs_path) + file.close() diff --git a/scenes/настройки/настройки.gd.uid b/scenes/настройки/настройки.gd.uid new file mode 100644 index 00000000..88fb51c0 --- /dev/null +++ b/scenes/настройки/настройки.gd.uid @@ -0,0 +1 @@ +uid://dabpum5iqxc7y diff --git a/scenes/настройки/настройки.tscn b/scenes/настройки/настройки.tscn index d115368b..950d3e74 100644 --- a/scenes/настройки/настройки.tscn +++ b/scenes/настройки/настройки.tscn @@ -1,296 +1,9 @@ [gd_scene load_steps=7 format=3 uid="uid://bnptm4rlp60dq"] +[ext_resource type="Script" uid="uid://dabpum5iqxc7y" path="res://scenes/настройки/настройки.gd" id="1_60bya"] [ext_resource type="Script" uid="uid://c5pq0hbrij34d" path="res://table/table.gd" id="2_6sx73"] [ext_resource type="Texture2D" uid="uid://csnts8f155sf7" path="res://data/save1.png" id="3_dbpks"] -[sub_resource type="GDScript" id="GDScript_fc87o"] -script/source = "class_name configure extends Panel - -const TableHeader = preload('res://table/header.tscn') -const TableToggle = preload('res://table/settings-toggle.tscn') -const TableEdit = preload('res://table/ячейка-2.tscn') - -const ALIGNMENT = [HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER] -const HEADER_ROW = [TableHeader, TableHeader] -const HEADER_ROW_TEXT = ['Параметр', 'Значение'] -const SETTING_TABLE = [ - ['Ограниченный режим', TableEdit, TableToggle, 'Ограничть возможности по постановке помех'], - ['Кнопка «ПД-М4»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], - ['Кнопка «ПД-М2»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], - ['Кнопка «ОЗП-1»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], - ['Кнопка «МЧМ-1»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], - ['Кнопка «ОРН-И1»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], - ['Кнопка «ОРН-М2»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], - ['Кнопка «ЛЧМ-1»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], - ['Кнопка «ПД-М4С»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], - ['Кнопка «ПД-ЧМ»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], - ['Кнопка «СВ-И1»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], - ['Кнопка «К1»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], - ['Кнопка «СВ-М2»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], - ['Кнопка «ОРН»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], - ['Кнопка «JTIDS»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], - ['Кнопка «КУПД»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], - ['Внешнее управление', TableEdit, TableToggle, 'Передать управление в 5П28'], - ['Внешнее указание Трасса', TableEdit, TableToggle, 'Разрешить постановку помех от Трасса'], - ['Кнопка «Подавление»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], - ['Виртуальная клавиатура', TableEdit, TableToggle, 'Включить отображение экранной клавиатуры'], - ['Скрыть вкладку ЭМС 2', TableEdit, TableToggle, 'Отображать вкладку \\\"ЭМС-2\\\"'], - ['Отладка контроля', TableEdit, TableToggle, 'Отображать отладку контроля'], - ['Текущая версия ПО УАРЭП', TableEdit, TableEdit, 'Время сборки, версия и номер фиксации'], - ['уарэп-яу07-частный', TableEdit, TableEdit, 'IP-адрес для получения частных сообщений от ЯУ-07'], - ['уарэп-яу07-общий', TableEdit, TableEdit, 'IP-адрес для получения широковещательных сообщений от ЯУ-07'], - ['уарэп-капсрпб', TableEdit, TableEdit, 'IP-адрес для связи с КАПС-РПБ [<адрес этого узла>, <адрес удалённого узла>, <порт этого узла>, <порт удалённого узла>]'], - ['уарэп-эмс', TableEdit, TableEdit, 'IP-адрес для связи с ЭМС'], - ['уарэп-яу07-2в', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-В 2'], - ['уарэп-яу07-2н', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-Н 2'], - ['уарэп-яу07-2к', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-К 2'], - ['уарэп-яу07-4в', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-В 4'], - ['уарэп-яу07-4н', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-Н 4'], - ['уарэп-яу07-4к', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-К 4'], - ['уарэп-яу07-1в', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-В 1'], - ['уарэп-яу07-1н', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-Н 1'], - ['уарэп-яу07-1к', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-К 1'], - ['уарэп-яу07-3в', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-В 3'], - ['уарэп-яу07-3н', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-Н 3'], - ['уарэп-яу07-3к', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-К 3'], - ['уарэп-5п28', TableEdit, TableEdit, 'IP-адрес для связи с 5П28'], - ['навигация', TableEdit, TableEdit, 'Порт назначения для получения данных от АКНГ'], - ['уарэп-щ3', TableEdit, TableEdit, 'Путь к UART-устройству для связи с прибором Щ3'], - ['уарэп-спт25-1', TableEdit, TableEdit, 'Путь к UART-устройству для связи с прибором СПТ-25 1'], - ['уарэп-спт25-2', TableEdit, TableEdit, 'Путь к UART-устройству для связи с прибором СПТ-25 2'], - ['Шаблон адреса сервера карт', TableEdit, TableEdit, 'Шаблон URL-адреса сервера карт, должен содержать поля \\\"{x}\\\", \\\"{y}\\\", \\\"{z}\\\" для подстановки индекса плитки'], - ['Адрес АФСП левого борта', TableEdit, TableEdit, 'http-адрес для запроса состояния прибора АФСП'], - ['Адрес АФСП правого борта', TableEdit, TableEdit, 'http-адрес для запроса состояния прибора АФСП'], - ['Адрес БПО левого борта', TableEdit, TableEdit, 'http-адрес для запроса состояния прибора БПО'], - ['Адрес БПО правого борта', TableEdit, TableEdit, 'http-адрес для запроса состояния прибора БПО'], - ['Период опроса состояния БПО, секунды', TableEdit, TableEdit, 'Время в секундах' ], - ['Период опроса состояния АФСП, секунды', TableEdit, TableEdit, 'Время в секундах' ], - ['уарэп-трасса', TableEdit, TableEdit, 'IP-адрес для связи с Трассой [<адрес этого узла>, <адрес удалённого узла>, <порт этого узла>, <порт удалённого узла>]'], - ['Включить работу по своим целям', TableEdit, TableToggle, 'Разрешает работу в секторе со своей целью'], - ['Список своих протоколов', TableEdit, TableEdit, 'Список протоколов целей, по которым запрещено работать' ], ] - -const EXTERNAL_CU = 16 ## Внешнее целеуказание -const TRASSA = 17 -const SUPPRESS = 18 ## Строка - Подавление -const KEYBOARD = 19 ## Строка - Виртуальная клавиатура -const HIDE_EMS2 = 20 ## Строка - Скрыть вкладку ЭМС 2 -const DEBAG_CONTROL = 21## Строка - Отладка контроля -const COMMIT = 22 ## Строка - Версия УАРЭП -const GOS_BTN = 52 ## Разрешить работу по своим целям - -var name_to_line_index: = {} ## Для преобразования названия параметра в номер строки - -func on_checkbutton_pressed(i_row: int): on_row_pressed(i_row) - - -## Вызывается, когда узел впервые попадает в дерево сцены. -func _ready() -> void: - setting_tab() - if not OS.get_cmdline_args().has('++ограниченный'): - return - $Label2.text = 'Текущий режим доступа: ограниченный' - for node in $GridContainer.get_children().filter(func(b): return b is Button): - node.disabled = true - - -func on_external_cu_btn_pressed(btn) -> void: - ProjectSettings.set_setting('application/config/Внешнее управление', btn.button_pressed) - if btn.button_pressed: - signaller.emit_signal('interfer_off_all') - - -func on_trassa_btn_pressed(btn) -> void: - ProjectSettings.set_setting('application/config/Внешнее указание Трасса', btn.button_pressed) - - -func on_vk_pressed(btn) -> void: - signaller.emit_signal('kb_pressed', btn.button_pressed) - - -func on_gos_pressed(btn) -> void: - ProjectSettings.set_setting('application/config/Включить работу по своим целям', btn.button_pressed) - - -func on_ems2_pressed(btn) -> void: - var state = btn.button_pressed - signaller.emit_signal('ems2_hide_pressed', state) - - -func on_debag_control_pressed(btn) -> void: - var state = btn.button_pressed - signaller.emit_signal(\"debag_control_pressed\", state) - - -func on_row_pressed(i_row: int): - $scroll_set/table.clear_rows_selected() - $scroll_set/table.set_row_selected(i_row, true) - - -func parse_cmd_line_args(settings_data: Dictionary): - var args = OS.get_cmdline_args() - for i in range(0, args.size(), 2): - var key: String = args[i] - key = key.lstrip('\\'\\\" ').rstrip('\\'\\\" ').strip_edges().strip_escapes() - if not settings_data.has(key): - continue - if not ((i + 1) < args.size()): - push_error('для аргумента \\\"%s\\\" не указано значение.' % key) - break - var val0 = args[i + 1] - var val1 = settings_data[key] - val0 = val0.lstrip('\\'\\\" ').rstrip('\\'\\\" ').strip_edges().strip_escapes() - if typeof(val1) == TYPE_BOOL: - if val0 not in ['yes', 'true', 'да', 'no', 'false', 'нет']: - push_error('для аргумента \\\"%s\\\" указано неверное значение \\\"%s\\\".' % [key, val0]) - break - settings_data[key] = true if val0 in ['yes', 'true', 'да'] else false - elif typeof(val1) == TYPE_ARRAY: - var val0s = val0.split(',') - if val0s.size() != val1.size(): - push_error('для аргумента \\\"%s\\\" указано неверное значение \\\"%s\\\" (исходное: \\\"%s\\\").' % [key, val0, val1]) - break - for j in val0s.size(): - var val: String = val0s[j] - val = val.lstrip('\\'\\\" ').rstrip('\\'\\\" ').strip_edges().strip_escapes() - if tools.type_is_num(val): - val0s[j] = int(val) - elif val in ['true', 'false']: - val0s[j] = true if val == 'true' else false - else: - val0s[j] = val - elif typeof(val1) == TYPE_STRING: - settings_data[key] = val0 - - -func setting_tab(): - $heard_table.set_header(HEADER_ROW) - $heard_table.set_header_text(HEADER_ROW_TEXT) - $heard_table.set_columns_min_size([600, 950]) - $heard_table.set_columns_alignments(ALIGNMENT) - var settings_data = {} - parse_cmd_line_args(settings_data) - for key in settings_data: - ProjectSettings.set_setting('application/config/%s' % key, settings_data[key]) - for i in SETTING_TABLE.size(): - var tbl_row = SETTING_TABLE[i] - var param_name = tbl_row[0] - var node_label = tbl_row[1] - var node_value = tbl_row[2] - var tootip_text = tbl_row[3] - name_to_line_index[param_name] = i - $scroll_set/table.add_row([node_label, node_value]) - var label_instance = $scroll_set/table.get_node2(0, i) - label_instance.text = param_name - label_instance.tooltip_text = tootip_text - $scroll_set/table.set_node_editable(0, i, false) - var node_values = $scroll_set/table.get_node2(1, i).get_children() - var edit_node = $scroll_set/table.get_node2(1, i) - if node_values.size(): - var child = node_values[0] - if child is CheckButton: - child.connect('pressed', Callable(self, 'on_checkbutton_pressed').bind(i)) - var val = ProjectSettings.get_setting('application/config/%s' % param_name, true) - child.set_pressed(val) - else: - if settings_data.has(param_name): - var val = settings_data[param_name] - if typeof(val) == TYPE_STRING: - $scroll_set/table.get_node2(1, i).text = settings_data[param_name] - if edit_node: - if edit_node is LineEdit: - $scroll_set/table.set_node_control(1, i, true) - $scroll_set/table.set_node_editable(1, COMMIT, false) - $scroll_set/table.set_columns_min_size([600, 950]) - $scroll_set/table.set_columns_alignments(ALIGNMENT) - $scroll_set/table.connect('row_pressed', Callable(self, 'on_row_pressed')) - var commit_instance = $scroll_set/table.get_node2(1, COMMIT) - commit_instance.text = '%s' % commit.VCS_HEAD - for i in SETTING_TABLE.size(): - var param_name = SETTING_TABLE[i][0] - var profile = $scroll_set/table.get_node2(1, i) - if settings.UnitProfiles.has(param_name): - var unit_data = settings.UnitProfiles[param_name][1] - profile.text = '' - for val in unit_data: - profile.text += str(val) + ',' - profile.text = profile.text.trim_suffix(',') - continue - var psk = 'application/config/%s' % param_name - if ProjectSettings.has_setting(psk): - var unit_data = ProjectSettings.get_setting(psk) - if is_instance_of(unit_data, TYPE_STRING): - profile.text = unit_data - button_settings() - - -func button_settings(): - var extern_cu_node = $scroll_set/table.get_node2(1, EXTERNAL_CU).get_children()[0] - extern_cu_node.connect('pressed', on_external_cu_btn_pressed.bind(extern_cu_node)) - on_external_cu_btn_pressed(extern_cu_node) - var trassa_node = $scroll_set/table.get_node2(1, TRASSA).get_children() - trassa_node = trassa_node[0] - trassa_node.connect('pressed', on_trassa_btn_pressed.bind(trassa_node)) - var vk_node = $scroll_set/table.get_node2(1, KEYBOARD).get_children()[0] - vk_node.connect('pressed', on_vk_pressed.bind(vk_node)) - var ems2_hide_node = $scroll_set/table.get_node2(1, HIDE_EMS2).get_children()[0] - ems2_hide_node.connect('pressed', on_ems2_pressed.bind(ems2_hide_node)) - ems2_hide_node.set_pressed(true) - on_ems2_pressed(ems2_hide_node) - var gos_node = $scroll_set/table.get_node2(1, GOS_BTN).get_children()[0] - gos_node.connect('pressed', on_gos_pressed.bind(gos_node)) - var debag_control = $scroll_set/table.get_node2(1, DEBAG_CONTROL).get_children()[0] - debag_control.connect('pressed', on_debag_control_pressed.bind(debag_control)) - debag_control.set_pressed(false) - on_debag_control_pressed(debag_control) - - -func _on_btn_save_settings_pressed(): - var json_data = {} - for i in SETTING_TABLE.size(): - var parameter = SETTING_TABLE[i][0] - if parameter in settings.UnitProfiles: - var ref_profile = settings.UnitProfiles[parameter][1] - var profiles = $scroll_set/table.get_node2(1, i) - var value = profiles.get_text() - if parameter not in json_data: - var row: = [] - for token in value.split(','): - var j: = row.size() - if token.is_valid_int(): - token = int(token) - elif token == 'false': - token = false - elif token == 'true': - token = true - if typeof(ref_profile[j]) == typeof(token): - row.append(token) - else: - # TODO: Это надо вывести на экран пользователю - push_error([parameter, j, type_string(typeof(ref_profile[j])), type_string(typeof(token))]) - row.append(ref_profile[j]) - json_data[parameter] = row - else: - var children = $scroll_set/table.get_node2(1, i).get_children() - if len(children): - var child = children[0] - json_data[parameter] = child.is_pressed() - else: - var row = $scroll_set/table.get_row(i) - json_data[parameter] = row[1].text - for key in json_data: - ProjectSettings.set_setting('application/config/%s' % key, json_data[key]) - var settings_file: = settings.get_settings_file_path() - var file: = FileAccess.open(settings_file, FileAccess.WRITE) - var abs_path: = ProjectSettings.globalize_path(settings_file) - if not file: - log.error('Не удалось открыть файл для записи \\\"%s\\\"' % abs_path) - return - var json_string: = JSON.stringify(json_data, ' ', true) - if file.store_string(json_string): - log.info('Настройки сохранены в файл \\\"%s\\\"' % abs_path) - file.close() -" - [sub_resource type="StyleBoxTexture" id="StyleBoxTexture_pyq6h"] texture = ExtResource("3_dbpks") modulate_color = Color(0.8, 0.533333, 0.27451, 1) @@ -305,7 +18,7 @@ modulate_color = Color(0.8, 0.533333, 0.27451, 1) texture = ExtResource("3_dbpks") [node name="Настройки" type="Panel"] -script = SubResource("GDScript_fc87o") +script = ExtResource("1_60bya") [node name="heard_table" type="GridContainer" parent="."] layout_mode = 0 diff --git a/scenes/работа/работа.gd b/scenes/работа/работа.gd index df17dfd1..527ed7db 100644 --- a/scenes/работа/работа.gd +++ b/scenes/работа/работа.gd @@ -16,13 +16,13 @@ class_name work extends Panel @export var strob_max_width: float ## Максимальная ширина строба по углу. @export var strob_min_band: float ## Минимальная ширина строба по частоте. @export var strob_min_width: float ## Минимальная ширина строба по углу. -@export var window_0_id: int ## Идетификатор окна. Присваивается godot от 0 до количества созданных окон. +@export var window_0_id: int ## Идентификатор окна. Присваивается godot от 0 до количества созданных окон. const SVK_EMIT = 1 ## Код состояния выполнения помехи - выполняется var drag_button: MouseButton ## Кнопка мыши нажатая при перетаскивании. var drag_fsm: DragFSM = DragFSM.IDLE ## Текущее состояние перетаскивания. -var btn_select: BtnSel = BtnSel.THREAT ## Текущее состояние кнопки выбора цели. +var btn_select: BtnSel = BtnSel.SECTOR ## Текущее состояние кнопки выбора цели. var drag_pos_begin: Vector2 ## Точка начала перетаскивания. var max_zoom: int ## Максимальный уровень детализации. var min_zoom: int ## Минимальный уровень детализации. @@ -38,6 +38,7 @@ var color_select: Color var color_emit: Color var color_emit_sel: Color var color_closed: Color +var col_btn_act: Color = Color.WHITE var color_closed_emit: Color var signal_conections: Array @@ -149,6 +150,7 @@ func on_settings_changed(): color_closed *= Color(1.0, 1.0, 1.0, 0.0) color_closed_emit *= Color(1.0, 1.0, 1.0, 1.0) + col_btn_act = ProjectSettings.get_setting('application/config/%s' % 'Цвет кнопки \"Подавление\"', Color.WHITE) ## Обработчик сигнала изменения списка целей. @@ -201,6 +203,7 @@ func _ready(): drag_fsm = DragFSM.OFF var btns_select: Array = get_tree().get_nodes_in_group('группа-режим-выбора') btns_select.any(func(btn): btn.button_connect('pressed', Callable(self, 'on_button_select').bind(btn, btns_select))) + on_button_select($btns_select/btn_fs_sector, btns_select) var nodes: Array = get_tree().get_nodes_in_group('группа-режим-помехи') nodes.any(func(btn): btn.button_connect('pressed', Callable(self, 'on_button_pressed').bind(btn, nodes))) $btn_close.button_connect('pressed', on_btn_close) @@ -408,9 +411,9 @@ func on_button_select(btn_this, btn_others) -> void: func on_button_pressed(btn_this, btn_others) -> void: $chk_auto.set_pressed_no_signal(false) on_value_changed(false) - var fs_arr: Array = [] for btn_other in btn_others: btn_other.set_pressed(btn_this == btn_other) - var interfer_name: String = btn_this.get_meta('rfi_name') + var interfer_name: String = btn_this.get_meta('rfi_name', 'off') + var fs_arr: Array = [] for key in fs_selected.keys(): fs_arr.append(prd.get_fs_param(key)) signaller.emit_signal('interfer_init', interfer_name, fs_arr, interfer.POW_DEFAULT) @@ -570,7 +573,7 @@ func update_fs_colors(): $canvas.set_band_failures(fs_failed) if fs_emit.size(): if $btn_activate.pressed: - $btn_activate.self_modulate = Color.RED + $btn_activate.self_modulate = col_btn_act else: $btn_activate.self_modulate = Color.WHITE else: diff --git a/scenes/работа/работа.tscn b/scenes/работа/работа.tscn index c1eb2df2..368e95d4 100644 --- a/scenes/работа/работа.tscn +++ b/scenes/работа/работа.tscn @@ -197,6 +197,7 @@ size_flags_vertical = 3 tooltip_text = "Кнопка для выбора сектора при помощи клика мышкой" strips_rotation = 25.0 text = "Сектор" +pressed = true metadata/state = 2 [node name="chk_auto" type="CheckBox" parent="."] diff --git a/scripts/interfer.gd b/scripts/interfer.gd index 94859343..c9410a2a 100644 --- a/scripts/interfer.gd +++ b/scripts/interfer.gd @@ -111,6 +111,12 @@ var gos_nmfs: Array ## Список номеров var fs_closed: Dictionary ## Словарь секторов запрета +## Режимы работы АФСП и БПО (Протокол ТНИИС-СТЦ, пункт 2.5.10) +enum AFSP_BPO_MODE { + run = 1, + test = 2 } + + ## Сеанс помехи. class Interfer: var ispp: int = 0 ## Индекс сеанса. @@ -127,6 +133,7 @@ class Interfer: var um: float ## Угол места для помехи. var nmfs: int = 0 ## Номер модуля ФС в нумерации СТЦ var priority: int = 0 ## Приоритет помехи + static var afsp_bpo_mode: = AFSP_BPO_MODE.run ## Режим работы АФСП и БПО func _to_string() -> String: return 'номер: %d название: %s частота: %0.1f МГц пеленг: %0.1f гр.' % [ispp, ITERFER_MODE[krp][0], params['freq'], kni] @@ -138,6 +145,7 @@ class Interfer: data_to_json['ispp'] = ispp data_to_json['krp'] = ITERFER_MODE[krp][0] data_to_json['nmfs'] = nmfs + data_to_json['sa'] = afsp_bpo_mode if krp != INTERFER_OFF: data_to_json['kni'] = kni data_to_json['powp'] = powp @@ -211,6 +219,8 @@ func _ready() -> void: signaller.connect('interfer_prinuditelno', Callable(self, 'on_interfer_prinuditelno')) signaller.connect('emit_changed', Callable(self, 'on_emit_changed').bind(ecms)) signaller.connect('режим_тренаж', on_trenazh_mode) + signaller.connect('режим_контроль', on_kontrol_mode) + signaller.connect('режим_работа', on_rabota_mode) signaller.connect('update_fs_closed', Callable(self, 'on_update_fs_closed')) threats.connect('threat_lost', Callable(self, 'on_threats_lost').bind(ecms, unit_caps)) threats.connect('threats_resized', Callable(self, 'on_threats_resized')) @@ -222,6 +232,8 @@ func _ready() -> void: func on_trenazh_mode(val: bool): trenazh_mode = val +func on_kontrol_mode(): Interfer.afsp_bpo_mode = AFSP_BPO_MODE.test +func on_rabota_mode(): Interfer.afsp_bpo_mode = AFSP_BPO_MODE.run func on_nav_data_received(coords: Dictionary, unit_caps): diff --git a/scripts/yau07.gd b/scripts/yau07.gd index 78861bd3..ca6e1514 100644 --- a/scripts/yau07.gd +++ b/scripts/yau07.gd @@ -304,24 +304,24 @@ class YaU07 extends unit.Unit: if cmd_result != 1: # Команда не выполнена return false - var cmd_code: CmdCode = rx_data[cmd_code_pos] as CmdCode # "код команды" - var rc: = true - if (cmd_code == CmdCode.READ_ISA) or (cmd_code == CmdCode.WRITE_ISA): - rc = parse_isa(rx_data, status_len) + var cmd_code: int = rx_data[cmd_code_pos] # Код команды - elif (cmd_code == CmdCode.READ_BLOCK) or (cmd_code == CmdCode.WRITE_BLOCK): - rc = parse_block(rx_data, status_len) + if (cmd_state == CmdState.WAIT) and (cmd_num_rx == cmd_num_tx) and (cmd_code == cmd_code_tx): + cmd_code_rx = cmd_code + cmd_state = CmdState.DONE + var rc: = true + if (cmd_code == CmdCode.READ_ISA) or (cmd_code == CmdCode.WRITE_ISA): + rc = parse_isa(rx_data, status_len) + elif (cmd_code == CmdCode.READ_BLOCK) or (cmd_code == CmdCode.WRITE_BLOCK): + rc = parse_block(rx_data, status_len) + elif (cmd_code == CmdCode.ERASE_FLASH) or (cmd_code == CmdCode.WRITE_FLASH) \ + or (cmd_code == CmdCode.READ_FLASH_MP550) or (cmd_code == CmdCode.WRITE_FLASH_MP550) \ + or (cmd_code == CmdCode.READ_FLASH) or (cmd_code == CmdCode.LOAD_FLASH): + rc = parse_flash(rx_data, status_len, cmd_code) - elif (cmd_code == CmdCode.ERASE_FLASH) or (cmd_code == CmdCode.WRITE_FLASH) \ - or (cmd_code == CmdCode.READ_FLASH_MP550) or (cmd_code == CmdCode.WRITE_FLASH_MP550) \ - or (cmd_code == CmdCode.READ_FLASH) or (cmd_code == CmdCode.LOAD_FLASH): - rc = parse_flash(rx_data, status_len, cmd_code) - - if rc: - if (cmd_state == CmdState.WAIT) and (cmd_num_rx == cmd_num_tx): - cmd_state = CmdState.DONE - cmd_code_rx = cmd_code + if rc: emit_signal('command_done', self) - else: - emit_signal('parse_failed', self) + else: + emit_signal('parse_failed', self) + return true diff --git a/table/ячейка-цвет.tscn b/table/ячейка-цвет.tscn new file mode 100644 index 00000000..e239b982 --- /dev/null +++ b/table/ячейка-цвет.tscn @@ -0,0 +1,8 @@ +[gd_scene format=3 uid="uid://cug5xjbfdm7x7"] + +[node name="ячейка-цвет" type="ColorPickerButton"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2