Compare commits
16 Commits
bd78e1010d
...
6dc31afa15
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6dc31afa15 | ||
|
|
12fbb1fd55 | ||
|
|
fd9cf0317f | ||
|
|
4843d3294a | ||
|
|
b7a5d24de8 | ||
|
|
0c36709b54 | ||
|
|
3eb35faa77 | ||
|
|
167048af54 | ||
|
|
f62dab4e4e | ||
|
|
7e31052148 | ||
|
|
6864b960fb | ||
|
|
5ad837ea3e | ||
|
|
53f555690b | ||
|
|
662bf5cfc5 | ||
|
|
b74976842e | ||
|
|
df69a74411 |
16
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)
|
- [Исполняемые файлы для шаблонов экспорта и редактора](http://gitea.srez.local:3000/sasha80/godot-bin)
|
||||||
@@ -31,9 +41,3 @@
|
|||||||
необходимые для этого настройки.
|
необходимые для этого настройки.
|
||||||
- Для доступа к последовательным портам расположенным на другом вычислительном модуле,
|
- Для доступа к последовательным портам расположенным на другом вычислительном модуле,
|
||||||
следует использовать [проброс портов](http://gitea.srez.local:3000/sasha80/uart-forwarder).
|
следует использовать [проброс портов](http://gitea.srez.local:3000/sasha80/uart-forwarder).
|
||||||
|
|
||||||
# Разработка
|
|
||||||
|
|
||||||
- После клонирования запустить скрипт `git-hooks-config.sh`
|
|
||||||
- В среде **Windows** запуск скрипта `git-hooks-config.sh` производить из оболочки `git bash`
|
|
||||||
- При необходимости обновить `settings.json`
|
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.9 KiB |
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 4.6 KiB |
|
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 4.5 KiB |
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 3.8 KiB |
|
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.9 KiB |
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 4.6 KiB |
|
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 4.5 KiB |
|
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 7.8 KiB After Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 18 KiB |
BIN
data/Приём.png
|
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 3.8 KiB |
|
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 6.1 KiB |
@@ -116,9 +116,8 @@ func _ready():
|
|||||||
var unit_instance: = network.get_unit_instance(unit_name)
|
var unit_instance: = network.get_unit_instance(unit_name)
|
||||||
var conn_node: = pribor_node.get_node('connect_pribor')
|
var conn_node: = pribor_node.get_node('connect_pribor')
|
||||||
unit_instance.connect('line_changed', on_line_changed.bind(conn_node, unit_name))
|
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)
|
signaller.conn(signaller.режим_журнал, on_mode_changed)
|
||||||
signaller.conn(signaller.режим_настройки, on_mode_changed)
|
signaller.conn(signaller.режим_настройки, on_mode_changed)
|
||||||
|
|||||||
298
scenes/настройки/настройки.gd
Normal file
@@ -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()
|
||||||
1
scenes/настройки/настройки.gd.uid
Normal file
@@ -0,0 +1 @@
|
|||||||
|
uid://dabpum5iqxc7y
|
||||||
@@ -1,296 +1,9 @@
|
|||||||
[gd_scene load_steps=7 format=3 uid="uid://bnptm4rlp60dq"]
|
[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="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"]
|
[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"]
|
[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_pyq6h"]
|
||||||
texture = ExtResource("3_dbpks")
|
texture = ExtResource("3_dbpks")
|
||||||
modulate_color = Color(0.8, 0.533333, 0.27451, 1)
|
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")
|
texture = ExtResource("3_dbpks")
|
||||||
|
|
||||||
[node name="Настройки" type="Panel"]
|
[node name="Настройки" type="Panel"]
|
||||||
script = SubResource("GDScript_fc87o")
|
script = ExtResource("1_60bya")
|
||||||
|
|
||||||
[node name="heard_table" type="GridContainer" parent="."]
|
[node name="heard_table" type="GridContainer" parent="."]
|
||||||
layout_mode = 0
|
layout_mode = 0
|
||||||
|
|||||||
@@ -16,13 +16,13 @@ class_name work extends Panel
|
|||||||
@export var strob_max_width: float ## Максимальная ширина строба по углу.
|
@export var strob_max_width: float ## Максимальная ширина строба по углу.
|
||||||
@export var strob_min_band: float ## Минимальная ширина строба по частоте.
|
@export var strob_min_band: float ## Минимальная ширина строба по частоте.
|
||||||
@export var strob_min_width: 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 ## Код состояния выполнения помехи - выполняется
|
const SVK_EMIT = 1 ## Код состояния выполнения помехи - выполняется
|
||||||
|
|
||||||
var drag_button: MouseButton ## Кнопка мыши нажатая при перетаскивании.
|
var drag_button: MouseButton ## Кнопка мыши нажатая при перетаскивании.
|
||||||
var drag_fsm: DragFSM = DragFSM.IDLE ## Текущее состояние перетаскивания.
|
var drag_fsm: DragFSM = DragFSM.IDLE ## Текущее состояние перетаскивания.
|
||||||
var btn_select: BtnSel = BtnSel.THREAT ## Текущее состояние кнопки выбора цели.
|
var btn_select: BtnSel = BtnSel.SECTOR ## Текущее состояние кнопки выбора цели.
|
||||||
var drag_pos_begin: Vector2 ## Точка начала перетаскивания.
|
var drag_pos_begin: Vector2 ## Точка начала перетаскивания.
|
||||||
var max_zoom: int ## Максимальный уровень детализации.
|
var max_zoom: int ## Максимальный уровень детализации.
|
||||||
var min_zoom: int ## Минимальный уровень детализации.
|
var min_zoom: int ## Минимальный уровень детализации.
|
||||||
@@ -38,6 +38,7 @@ var color_select: Color
|
|||||||
var color_emit: Color
|
var color_emit: Color
|
||||||
var color_emit_sel: Color
|
var color_emit_sel: Color
|
||||||
var color_closed: Color
|
var color_closed: Color
|
||||||
|
var col_btn_act: Color = Color.WHITE
|
||||||
var color_closed_emit: Color
|
var color_closed_emit: Color
|
||||||
var signal_conections: Array
|
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 *= Color(1.0, 1.0, 1.0, 0.0)
|
||||||
color_closed_emit *= Color(1.0, 1.0, 1.0, 1.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
|
drag_fsm = DragFSM.OFF
|
||||||
var btns_select: Array = get_tree().get_nodes_in_group('группа-режим-выбора')
|
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)))
|
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('группа-режим-помехи')
|
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)))
|
nodes.any(func(btn): btn.button_connect('pressed', Callable(self, 'on_button_pressed').bind(btn, nodes)))
|
||||||
$btn_close.button_connect('pressed', on_btn_close)
|
$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:
|
func on_button_pressed(btn_this, btn_others) -> void:
|
||||||
$chk_auto.set_pressed_no_signal(false)
|
$chk_auto.set_pressed_no_signal(false)
|
||||||
on_value_changed(false)
|
on_value_changed(false)
|
||||||
var fs_arr: Array = []
|
|
||||||
for btn_other in btn_others: btn_other.set_pressed(btn_this == btn_other)
|
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():
|
for key in fs_selected.keys():
|
||||||
fs_arr.append(prd.get_fs_param(key))
|
fs_arr.append(prd.get_fs_param(key))
|
||||||
signaller.emit_signal('interfer_init', interfer_name, fs_arr, interfer.POW_DEFAULT)
|
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)
|
$canvas.set_band_failures(fs_failed)
|
||||||
if fs_emit.size():
|
if fs_emit.size():
|
||||||
if $btn_activate.pressed:
|
if $btn_activate.pressed:
|
||||||
$btn_activate.self_modulate = Color.RED
|
$btn_activate.self_modulate = col_btn_act
|
||||||
else:
|
else:
|
||||||
$btn_activate.self_modulate = Color.WHITE
|
$btn_activate.self_modulate = Color.WHITE
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -197,6 +197,7 @@ size_flags_vertical = 3
|
|||||||
tooltip_text = "Кнопка для выбора сектора при помощи клика мышкой"
|
tooltip_text = "Кнопка для выбора сектора при помощи клика мышкой"
|
||||||
strips_rotation = 25.0
|
strips_rotation = 25.0
|
||||||
text = "Сектор"
|
text = "Сектор"
|
||||||
|
pressed = true
|
||||||
metadata/state = 2
|
metadata/state = 2
|
||||||
|
|
||||||
[node name="chk_auto" type="CheckBox" parent="."]
|
[node name="chk_auto" type="CheckBox" parent="."]
|
||||||
|
|||||||
@@ -111,6 +111,12 @@ var gos_nmfs: Array ## Список номеров
|
|||||||
var fs_closed: Dictionary ## Словарь секторов запрета
|
var fs_closed: Dictionary ## Словарь секторов запрета
|
||||||
|
|
||||||
|
|
||||||
|
## Режимы работы АФСП и БПО (Протокол ТНИИС-СТЦ, пункт 2.5.10)
|
||||||
|
enum AFSP_BPO_MODE {
|
||||||
|
run = 1,
|
||||||
|
test = 2 }
|
||||||
|
|
||||||
|
|
||||||
## Сеанс помехи.
|
## Сеанс помехи.
|
||||||
class Interfer:
|
class Interfer:
|
||||||
var ispp: int = 0 ## Индекс сеанса.
|
var ispp: int = 0 ## Индекс сеанса.
|
||||||
@@ -127,6 +133,7 @@ class Interfer:
|
|||||||
var um: float ## Угол места для помехи.
|
var um: float ## Угол места для помехи.
|
||||||
var nmfs: int = 0 ## Номер модуля ФС в нумерации СТЦ
|
var nmfs: int = 0 ## Номер модуля ФС в нумерации СТЦ
|
||||||
var priority: int = 0 ## Приоритет помехи
|
var priority: int = 0 ## Приоритет помехи
|
||||||
|
static var afsp_bpo_mode: = AFSP_BPO_MODE.run ## Режим работы АФСП и БПО
|
||||||
|
|
||||||
func _to_string() -> String:
|
func _to_string() -> String:
|
||||||
return 'номер: %d название: %s частота: %0.1f МГц пеленг: %0.1f гр.' % [ispp, ITERFER_MODE[krp][0], params['freq'], kni]
|
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['ispp'] = ispp
|
||||||
data_to_json['krp'] = ITERFER_MODE[krp][0]
|
data_to_json['krp'] = ITERFER_MODE[krp][0]
|
||||||
data_to_json['nmfs'] = nmfs
|
data_to_json['nmfs'] = nmfs
|
||||||
|
data_to_json['sa'] = afsp_bpo_mode
|
||||||
if krp != INTERFER_OFF:
|
if krp != INTERFER_OFF:
|
||||||
data_to_json['kni'] = kni
|
data_to_json['kni'] = kni
|
||||||
data_to_json['powp'] = powp
|
data_to_json['powp'] = powp
|
||||||
@@ -211,6 +219,8 @@ func _ready() -> void:
|
|||||||
signaller.connect('interfer_prinuditelno', Callable(self, 'on_interfer_prinuditelno'))
|
signaller.connect('interfer_prinuditelno', Callable(self, 'on_interfer_prinuditelno'))
|
||||||
signaller.connect('emit_changed', Callable(self, 'on_emit_changed').bind(ecms))
|
signaller.connect('emit_changed', Callable(self, 'on_emit_changed').bind(ecms))
|
||||||
signaller.connect('режим_тренаж', on_trenazh_mode)
|
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'))
|
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('threat_lost', Callable(self, 'on_threats_lost').bind(ecms, unit_caps))
|
||||||
threats.connect('threats_resized', Callable(self, 'on_threats_resized'))
|
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_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):
|
func on_nav_data_received(coords: Dictionary, unit_caps):
|
||||||
|
|||||||
@@ -304,24 +304,24 @@ class YaU07 extends unit.Unit:
|
|||||||
if cmd_result != 1: # Команда не выполнена
|
if cmd_result != 1: # Команда не выполнена
|
||||||
return false
|
return false
|
||||||
|
|
||||||
var cmd_code: CmdCode = rx_data[cmd_code_pos] as CmdCode # "код команды"
|
var cmd_code: int = rx_data[cmd_code_pos] # Код команды
|
||||||
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):
|
if (cmd_state == CmdState.WAIT) and (cmd_num_rx == cmd_num_tx) and (cmd_code == cmd_code_tx):
|
||||||
rc = parse_block(rx_data, status_len)
|
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) \
|
if rc:
|
||||||
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
|
|
||||||
emit_signal('command_done', self)
|
emit_signal('command_done', self)
|
||||||
else:
|
else:
|
||||||
emit_signal('parse_failed', self)
|
emit_signal('parse_failed', self)
|
||||||
|
|
||||||
return true
|
return true
|
||||||
|
|||||||
8
table/ячейка-цвет.tscn
Normal file
@@ -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
|
||||||