Compare commits
27 Commits
f89540dfdc
...
sasha
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
12fbb1fd55 | ||
|
|
fd9cf0317f | ||
|
|
4843d3294a | ||
|
|
b7a5d24de8 | ||
|
|
0c36709b54 | ||
|
|
3eb35faa77 | ||
|
|
167048af54 | ||
|
|
f62dab4e4e | ||
|
|
7e31052148 | ||
|
|
6864b960fb | ||
|
|
5ad837ea3e | ||
|
|
53f555690b | ||
|
|
662bf5cfc5 | ||
|
|
b74976842e | ||
|
|
df69a74411 | ||
|
|
c1762514d6 | ||
|
|
f3a72a9150 | ||
|
|
cfa2911f92 | ||
|
|
ef28b9a4bd | ||
|
|
3c48402f96 | ||
|
|
a9a40f241a | ||
|
|
0354c59128 | ||
|
|
c270d652c3 | ||
|
|
98d1bdcca4 | ||
|
|
46930fa520 | ||
|
|
adf0b62578 | ||
|
|
23412f9d78 |
17
README.md
17
README.md
@@ -1,9 +1,20 @@
|
||||
# Разработка
|
||||
|
||||
- После клонирования запустить скрипт `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)
|
||||
- [Проброс последовательных портов через Ethernet](http://gitea.srez.local:3000/sasha80/uart-forwarder)
|
||||
- [Сборка Godot из исходников](http://gitea.srez.local:3000/sasha80/godot-build)
|
||||
- [Сервер карт](http://gitea.srez.local:3000/sasha80/map-tiles)
|
||||
- [Генераторы PCM файлов для модулей ФС](http://gitea.srez.local:3000/danil_tim/Signals_to_the_MP-550)
|
||||
|
||||
# Ссылки на имитаторы
|
||||
|
||||
@@ -30,9 +41,3 @@
|
||||
необходимые для этого настройки.
|
||||
- Для доступа к последовательным портам расположенным на другом вычислительном модуле,
|
||||
следует использовать [проброс портов](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: 125 B After Width: | Height: | Size: 125 B |
@@ -2,16 +2,16 @@
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://bw3yv3smvaxqn"
|
||||
path="res://.godot/imported/nine-patch.png-798f7950fb3126b4e1ed0c39d9e4beba.ctex"
|
||||
uid="uid://vqajxsh5xamt"
|
||||
path="res://.godot/imported/nine-patch.png-b3022b5c868bc85e271b731e8fa2ec8a.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://table/nine-patch.png"
|
||||
dest_files=["res://.godot/imported/nine-patch.png-798f7950fb3126b4e1ed0c39d9e4beba.ctex"]
|
||||
source_file="res://data/nine-patch.png"
|
||||
dest_files=["res://.godot/imported/nine-patch.png-b3022b5c868bc85e271b731e8fa2ec8a.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
@@ -4,19 +4,6 @@
|
||||
|
||||
[resource]
|
||||
fallbacks = Array[Font]([ExtResource("1_cxid7")])
|
||||
cache/0/16/0/ascent = 0.0
|
||||
cache/0/16/0/descent = 0.0
|
||||
cache/0/16/0/underline_position = 0.0
|
||||
cache/0/16/0/underline_thickness = 0.0
|
||||
cache/0/16/0/scale = 1.0
|
||||
cache/0/16/0/kerning_overrides/17/0 = Vector2(0, 0)
|
||||
cache/0/16/0/kerning_overrides/16/0 = Vector2(0, 0)
|
||||
cache/0/16/0/kerning_overrides/18/0 = Vector2(0, 0)
|
||||
cache/0/16/0/kerning_overrides/14/0 = Vector2(0, 0)
|
||||
cache/0/16/0/kerning_overrides/8/0 = Vector2(0, 0)
|
||||
cache/0/16/0/kerning_overrides/15/0 = Vector2(0, 0)
|
||||
cache/0/16/0/kerning_overrides/13/0 = Vector2(0, 0)
|
||||
cache/0/16/0/kerning_overrides/20/0 = Vector2(0, 0)
|
||||
cache/0/17/0/ascent = 0.0
|
||||
cache/0/17/0/descent = 0.0
|
||||
cache/0/17/0/underline_position = 0.0
|
||||
@@ -30,11 +17,19 @@ cache/0/17/0/kerning_overrides/8/0 = Vector2(0, 0)
|
||||
cache/0/17/0/kerning_overrides/15/0 = Vector2(0, 0)
|
||||
cache/0/17/0/kerning_overrides/13/0 = Vector2(0, 0)
|
||||
cache/0/17/0/kerning_overrides/20/0 = Vector2(0, 0)
|
||||
cache/0/22/0/ascent = 0.0
|
||||
cache/0/22/0/descent = 0.0
|
||||
cache/0/22/0/underline_position = 0.0
|
||||
cache/0/22/0/underline_thickness = 0.0
|
||||
cache/0/22/0/scale = 1.0
|
||||
cache/0/16/0/ascent = 0.0
|
||||
cache/0/16/0/descent = 0.0
|
||||
cache/0/16/0/underline_position = 0.0
|
||||
cache/0/16/0/underline_thickness = 0.0
|
||||
cache/0/16/0/scale = 1.0
|
||||
cache/0/16/0/kerning_overrides/17/0 = Vector2(0, 0)
|
||||
cache/0/16/0/kerning_overrides/16/0 = Vector2(0, 0)
|
||||
cache/0/16/0/kerning_overrides/18/0 = Vector2(0, 0)
|
||||
cache/0/16/0/kerning_overrides/14/0 = Vector2(0, 0)
|
||||
cache/0/16/0/kerning_overrides/8/0 = Vector2(0, 0)
|
||||
cache/0/16/0/kerning_overrides/15/0 = Vector2(0, 0)
|
||||
cache/0/16/0/kerning_overrides/13/0 = Vector2(0, 0)
|
||||
cache/0/16/0/kerning_overrides/20/0 = Vector2(0, 0)
|
||||
cache/0/18/0/ascent = 0.0
|
||||
cache/0/18/0/descent = 0.0
|
||||
cache/0/18/0/underline_position = 0.0
|
||||
@@ -118,3 +113,8 @@ cache/0/19/0/descent = 0.0
|
||||
cache/0/19/0/underline_position = 0.0
|
||||
cache/0/19/0/underline_thickness = 0.0
|
||||
cache/0/19/0/scale = 1.0
|
||||
cache/0/22/0/ascent = 0.0
|
||||
cache/0/22/0/descent = 0.0
|
||||
cache/0/22/0/underline_position = 0.0
|
||||
cache/0/22/0/underline_thickness = 0.0
|
||||
cache/0/22/0/scale = 1.0
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
dot -Tpng "структура.dot" -o "структура.png"
|
||||
pandoc -f markdown_strict --verbose "README.md" > "README.doc"
|
||||
@@ -1,38 +0,0 @@
|
||||
digraph "Прибор УФ"
|
||||
{
|
||||
graph [nodesep=0.5, overlap = false];
|
||||
node [shape=box, overlap = false];
|
||||
eth0 [label="eth0", shape=cds];
|
||||
eth1 [label="eth1", shape=cds];
|
||||
eth2 [label="eth2", shape=cds];
|
||||
tty0 [label="tty0", shape=cds];
|
||||
tty1 [label="tty1", shape=cds];
|
||||
tty2 [label="tty2", shape=cds];
|
||||
proto_capsrpb [label="Протокол КАПС-РПБ"];
|
||||
proto_5p28 [label="Протокол 5П-28"];
|
||||
uarep_uart [label="UART ModBus"];
|
||||
uarep_ctl [label="ПО УАРЭП"];
|
||||
caps_rpb [label="СПО \"КАПС РПБ\""];
|
||||
p16 [label="П16", shape=plaintext, style=filled];
|
||||
spt25left [label="СПТ25 левый борт", shape=plaintext, style=filled];
|
||||
spt25right [label="СПТ25 правый борт", shape=plaintext, style=filled];
|
||||
|
||||
eth0 -> proto_5p28;
|
||||
eth1 -> proto_5p28;
|
||||
eth0 -> proto_capsrpb;
|
||||
eth1 -> proto_capsrpb;
|
||||
eth0 -> uarep_uart;
|
||||
eth1 -> uarep_uart;
|
||||
eth2 -> caps_rpb;
|
||||
proto_5p28 -> uarep_ctl;
|
||||
uarep_uart -> uarep_ctl;
|
||||
uarep_uart -> tty0;
|
||||
uarep_uart -> tty1;
|
||||
uarep_uart -> tty2;
|
||||
uarep_ctl -> caps_rpb;
|
||||
proto_capsrpb -> caps_rpb;
|
||||
p16 -> eth0 [style=invis]
|
||||
p16 -> eth1 [style=invis]
|
||||
spt25left -> tty0 [style=invis]
|
||||
spt25right -> tty1 [style=invis]
|
||||
}
|
||||
@@ -21,8 +21,8 @@ script_export_mode=0
|
||||
[preset.0.options]
|
||||
|
||||
custom_template/debug=""
|
||||
custom_template/release="/home/user/temp/godot.linuxbsd.template_release.x86_64"
|
||||
debug/export_console_wrapper=0
|
||||
custom_template/release=""
|
||||
debug/export_console_wrapper=2
|
||||
binary_format/embed_pck=true
|
||||
texture_format/s3tc_bptc=true
|
||||
texture_format/etc2_astc=false
|
||||
|
||||
@@ -8,7 +8,7 @@ const TableHeader = preload('res://table/header.tscn') ## Ячейка за
|
||||
const TABLE_HEADER = [ TableHeader, TableHeader, TableHeader , TableHeader ] ## Описание ряда заголовка.
|
||||
const TABLE_ROW = [ CellLineEdit, CellLineEdit, CellLineEdit , CellLineEdit ] ## Описание ряда.
|
||||
const TABLE_HEADERS_TEXT = ['№', 'Название', 'Пеленг', 'Состояние' ] ## Заголовки таблицы.
|
||||
const TABLE_COLUMN_SIZE = [ 65, 100, 95, 185 ] ## Ширины колонок.
|
||||
const TABLE_COLUMN_SIZE = [ 65, 100, 90, 170 ] ## Ширины колонок.
|
||||
|
||||
## Состояние выполнения сеанса помехи
|
||||
const INTERFER_STATE = {
|
||||
|
||||
@@ -10,7 +10,7 @@ const EmitLed = preload('res://scenes/frame-threats/emit-led.tscn') ##
|
||||
const TABLE_HEADER = [ TableHeader, TableHeader, TableHeader, TableHeader , TableHeader ] ## Описание ряда заголовка.
|
||||
const TABLE_ROW = [ CellLineEdit, CellLineEdit, CellLineEdit, CellLineEdit, EmitLed ] ## Описание ряда.
|
||||
const TABLE_COLUMN_PARAM = ['id', 'aoa', 'freq', 'proto', 'emit' ] ## Параметры цели отображаемые в таблице.
|
||||
const TABLE_HEADERS_TEXT = ['Номер', 'Пеленг', 'Частота, МГц', 'Протокол', 'Помеха' ] ## Заголовки таблицы.
|
||||
const TABLE_HEADERS_TEXT = ['№', 'Пеленг', 'Частота, МГц', 'Протокол', 'Помеха' ] ## Заголовки таблицы.
|
||||
const TABLE_COLUMN_SIZE = [ 65, 70, 110, 140, 65] ## Ширины колонок.
|
||||
|
||||
const TABLE_TEXT_ROWS = 4
|
||||
|
||||
@@ -21,7 +21,6 @@ func _ready() -> void:
|
||||
signaller.conn(signaller.start_contol_device, Callable(self, '_on_start_control'))
|
||||
unit_prd_k.connect('control_is_over', Callable(self, 'on_press_device'))
|
||||
unit_prd_k.connect('status_updated', Callable(self, '_on_status_updated'))
|
||||
find_labels(self)
|
||||
# Устанавливаем начальный статус
|
||||
_update_status_text(unit_prd_k.get_current_status())
|
||||
on_press_device(unit_prd_k.self_name)
|
||||
@@ -44,6 +43,7 @@ func set_frame(node_frame: Node, val: int): node_frame.set_frame(val)
|
||||
func _on_start_control() -> void:
|
||||
set_default_state(get_tree().get_nodes_in_group('default_reset'))
|
||||
set_default_state(get_tree().get_nodes_in_group('power_amplifier'))
|
||||
find_labels(self)
|
||||
await get_tree().create_timer(1.0).timeout
|
||||
on_press_device(unit_prd_k.self_name)
|
||||
|
||||
|
||||
@@ -21,7 +21,6 @@ func _ready() -> void:
|
||||
signaller.conn(signaller.start_contol_device, Callable(self, '_on_start_control'))
|
||||
unit_prd_n.connect('control_is_over', Callable(self, 'on_press_device'))
|
||||
unit_prd_n.connect('status_updated', Callable(self, '_on_status_updated'))
|
||||
find_labels(self)
|
||||
# Устанавливаем начальный статус
|
||||
_update_status_text(unit_prd_n.get_current_status())
|
||||
on_press_device(unit_prd_n.self_name)
|
||||
@@ -44,6 +43,7 @@ func _on_start_control() -> void:
|
||||
set_default_state(get_tree().get_nodes_in_group('power_amplifier'))
|
||||
for um in get_tree().get_nodes_in_group('power_amplifier'):
|
||||
um.value0 = [0, 0, 0, 0, 0, 0]
|
||||
find_labels(self)
|
||||
await get_tree().create_timer(1.0).timeout
|
||||
on_press_device(unit_prd_n.self_name)
|
||||
|
||||
|
||||
@@ -21,7 +21,6 @@ func _ready() -> void:
|
||||
signaller.conn(signaller.start_contol_device, Callable(self, '_on_start_control'))
|
||||
unit_prd_v.connect('control_is_over', Callable(self, 'on_press_device'))
|
||||
unit_prd_v.connect('status_updated', Callable(self, '_on_status_updated'))
|
||||
find_labels(self)
|
||||
# Устанавливаем начальный статус
|
||||
_update_status_text(unit_prd_v.get_current_status())
|
||||
on_press_device(unit_prd_v.self_name)
|
||||
@@ -44,6 +43,7 @@ func _on_start_control() -> void:
|
||||
set_default_state(get_tree().get_nodes_in_group('power_amplifier'))
|
||||
for um in get_tree().get_nodes_in_group('power_amplifier'):
|
||||
um.value0 = [0, 0, 0, 0, 0, 0]
|
||||
find_labels(self)
|
||||
await get_tree().create_timer(1.0).timeout
|
||||
on_press_device(unit_prd_v.self_name)
|
||||
|
||||
|
||||
@@ -22,7 +22,6 @@ class DeviceObserver:
|
||||
var device_name: String
|
||||
var status: Array = [false, false, false] # [online, operational, control_complete]
|
||||
var last_results: Dictionary = {}
|
||||
var status_uf: bool = false
|
||||
|
||||
func update_online_state(online: bool) -> bool:
|
||||
if status[DEVICE_STATUS.ONLINE] != online:
|
||||
@@ -60,7 +59,6 @@ class DeviceObserver:
|
||||
|
||||
var device_observers: Dictionary = {}
|
||||
var overall_prd_state: PRD_STATE = PRD_STATE.NONE
|
||||
var status_uf: bool = false # Статус УФ (УАРЭП-ЭМС)
|
||||
|
||||
func _ready() -> void:
|
||||
tooltip_text = 'Нет связи с приборами комплекса'
|
||||
@@ -113,17 +111,15 @@ func _on_prd_control_results(results: Dictionary, prd_module: Object) -> void:
|
||||
_recalculate_overall_state()
|
||||
|
||||
|
||||
func _on_uf_status_receive(unit_uf: Object) -> void:
|
||||
if unit_uf:
|
||||
var KEMS_B = ((unit_uf.status[0] >> 0) & 1) and ((unit_uf.status[0] >> 3) & 1)
|
||||
var EMS_B_1 = ((unit_uf.status[0] >> 1) & 1) and ((unit_uf.status[0] >> 4) & 1)
|
||||
var EMS_B_2 = ((unit_uf.status[0] >> 2) & 1) and ((unit_uf.status[0] >> 5) & 1)
|
||||
var IP27B = ((unit_uf.status[2] >> 6) & 1)
|
||||
|
||||
var new_uf_status = KEMS_B and EMS_B_1 and EMS_B_2 and IP27B
|
||||
if status_uf != new_uf_status:
|
||||
status_uf = new_uf_status
|
||||
_recalculate_overall_state()
|
||||
func _on_uf_status_receive(_unit_uf: Object) -> void:
|
||||
# Логика для УФ (раскомментируй если нужно)
|
||||
# var KEMS_B = ((unit_uf.status[0] >> 0) & 1) and ((unit_uf.status[0] >> 3) & 1)
|
||||
# var EMS_B_1 = ((unit_uf.status[0] >> 1) & 1) and ((unit_uf.status[0] >> 4) & 1)
|
||||
# var EMS_B_2 = ((unit_uf.status[0] >> 2) & 1) and ((unit_uf.status[0] >> 5) & 1)
|
||||
# var IP27B = ((unit_uf.status[2] >> 6) & 1)
|
||||
# var uf_operational = KEMS_B and EMS_B_1 and EMS_B_2 and IP27B
|
||||
# signaller.emit_signal('update_uf_serviceability', uf_operational)
|
||||
pass
|
||||
|
||||
|
||||
func _recalculate_overall_state() -> void:
|
||||
@@ -131,7 +127,6 @@ func _recalculate_overall_state() -> void:
|
||||
var has_online_devices := false
|
||||
var all_operational := true
|
||||
|
||||
# Проверяем только если есть онлайн устройства
|
||||
for observer in device_observers.values():
|
||||
if observer.status[DEVICE_STATUS.ONLINE]:
|
||||
has_online_devices = true
|
||||
@@ -148,10 +143,7 @@ func _recalculate_overall_state() -> void:
|
||||
# Не прерываем, чтобы проверить все устройства
|
||||
|
||||
if has_online_devices:
|
||||
if all_operational and status_uf:
|
||||
new_state = PRD_STATE.GOOD
|
||||
else:
|
||||
new_state = PRD_STATE.ERR
|
||||
new_state = PRD_STATE.GOOD if all_operational else PRD_STATE.ERR
|
||||
else:
|
||||
new_state = PRD_STATE.NONE
|
||||
|
||||
@@ -170,40 +162,15 @@ func _update_display() -> void:
|
||||
|
||||
|
||||
func _get_tooltip_text() -> String:
|
||||
var tooltip := ""
|
||||
|
||||
match overall_prd_state:
|
||||
PRD_STATE.NONE:
|
||||
tooltip = "Нет связи с приборами комплекса"
|
||||
return "Нет связи с приборами комплекса"
|
||||
PRD_STATE.GOOD:
|
||||
tooltip = "Все приборы комплекса исправны"
|
||||
return "Все приборы комплекса исправны"
|
||||
PRD_STATE.ERR:
|
||||
tooltip = "Обнаружены неисправности в комплексе"
|
||||
return "Обнаружены неисправности в комплексе"
|
||||
_:
|
||||
tooltip = "Неизвестное состояние"
|
||||
|
||||
# Добавляем информацию о статусе УФ, если есть онлайн устройства
|
||||
if overall_prd_state != PRD_STATE.NONE:
|
||||
tooltip += "\n\n"
|
||||
tooltip += "Статус УФ (УАРЭП-ЭМС): "
|
||||
tooltip += "Исправен" if status_uf else "Неисправен"
|
||||
|
||||
# Добавляем детальную информацию о ПРД устройствах
|
||||
tooltip += "\n\nДетальный статус ПРД:"
|
||||
var online_count := 0
|
||||
var operational_count := 0
|
||||
|
||||
for device_name in device_observers:
|
||||
var observer = device_observers[device_name]
|
||||
if observer.status[DEVICE_STATUS.ONLINE]:
|
||||
online_count += 1
|
||||
if observer.status[DEVICE_STATUS.STATUS]:
|
||||
operational_count += 1
|
||||
|
||||
tooltip += "\nПРД онлайн: %d/%d" % [online_count, device_observers.size()]
|
||||
tooltip += "\nПРД исправны: %d/%d" % [operational_count, online_count]
|
||||
|
||||
return tooltip
|
||||
return "Неизвестное состояние"
|
||||
|
||||
|
||||
# Публичные методы для получения информации
|
||||
@@ -214,8 +181,7 @@ func get_device_status(device_name: String) -> Dictionary:
|
||||
"online": observer.status[DEVICE_STATUS.ONLINE],
|
||||
"operational": observer.status[DEVICE_STATUS.STATUS],
|
||||
"control_complete": observer.status[DEVICE_STATUS.CONTROL],
|
||||
"last_results": observer.last_results.duplicate(),
|
||||
"status_uf": status_uf
|
||||
"last_results": observer.last_results.duplicate()
|
||||
}
|
||||
return {}
|
||||
|
||||
@@ -238,6 +204,5 @@ func get_overall_status() -> Dictionary:
|
||||
"online_devices": online_count,
|
||||
"operational_devices": operational_count,
|
||||
"total_devices": device_observers.size(),
|
||||
"control_complete_devices": control_complete_count,
|
||||
"uf_status": status_uf
|
||||
"control_complete_devices": control_complete_count
|
||||
}
|
||||
|
||||
@@ -373,7 +373,7 @@ func _process(delta) -> void:
|
||||
remove_child(req)
|
||||
req.queue_free()
|
||||
_req_count -= 1
|
||||
push_error('запрос \"%s\" не отправлен' % tile.url) #TODO: For Debug
|
||||
push_error('запрос \"%s\" не отправлен' % tile.url) #TODO: For Deugs
|
||||
if _queue.is_empty():
|
||||
emit_signal('load_completed')
|
||||
|
||||
@@ -727,7 +727,7 @@ func blend_mask(val: bool) -> void:
|
||||
|
||||
|
||||
func update_coordinates_label(lon: float, lat: float) -> void:
|
||||
coordinates_label = 'Координаты: NS: %f, EW: %f' % [lat, lon]
|
||||
coordinates_label = 'Координаты: NS:%f, EW:%f' % [lat, lon]
|
||||
signaller.emit_signal('update_coordinates_map', coordinates_label)
|
||||
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
extends Button
|
||||
|
||||
var base_style: StyleBoxFlat
|
||||
var tween
|
||||
var tween: Tween
|
||||
var pulsing: bool = false
|
||||
var original_text: String
|
||||
var flag_control_is_over: bool = false
|
||||
@@ -14,7 +14,7 @@ func _ready():
|
||||
|
||||
|
||||
func _setup_styles() -> void:
|
||||
if get("theme_override_styles/disabled") == null:
|
||||
if get('theme_override_styles/disabled') == null:
|
||||
base_style = StyleBoxFlat.new()
|
||||
base_style.border_color = Color(1.0, 0.5, 0.0)
|
||||
base_style.border_width_top = 4
|
||||
@@ -22,26 +22,26 @@ func _setup_styles() -> void:
|
||||
base_style.border_width_left = 4
|
||||
base_style.border_width_right = 4
|
||||
base_style.bg_color = Color(0.2, 0.2, 0.2)
|
||||
set("theme_override_styles/disabled", base_style)
|
||||
set('theme_override_styles/disabled', base_style)
|
||||
else:
|
||||
base_style = get("theme_override_styles/disabled")
|
||||
set("theme_override_colors/font_disabled_color", Color(1.0, 1.0, 1.0))
|
||||
base_style = get('theme_override_styles/disabled')
|
||||
set('theme_override_colors/font_disabled_color', Color(1.0, 1.0, 1.0))
|
||||
|
||||
|
||||
func _setup_signals() -> void:
|
||||
connect("pressed", Callable(self, "_on_pressed"))
|
||||
|
||||
connect('pressed', Callable(self, '_on_pressed'))
|
||||
|
||||
if not signaller:
|
||||
return
|
||||
var signals_to_connect := ["режим_работа", "режим_журнал", "режим_эмс", "режим_настройки", "режим_контроль"]
|
||||
var signals_to_connect := ['режим_работа', 'режим_журнал', 'режим_эмс', 'режим_настройки", "режим_контроль']
|
||||
for signal_name in signals_to_connect:
|
||||
if signaller.has_signal(signal_name):
|
||||
signaller.connect(signal_name, Callable(self, "_on_status_change"))
|
||||
signaller.connect(signal_name, Callable(self, '_on_status_change'))
|
||||
|
||||
|
||||
func _on_pressed():
|
||||
disabled = true
|
||||
text = "Идет выполнение контроля"
|
||||
text = 'Идет выполнение контроля'
|
||||
flag_control_is_over = false
|
||||
_start_pulse()
|
||||
|
||||
@@ -50,16 +50,13 @@ func _start_pulse():
|
||||
if pulsing:
|
||||
return
|
||||
pulsing = true
|
||||
tween = create_tween()
|
||||
if not tween:
|
||||
tween = create_tween()
|
||||
tween.set_loops()
|
||||
var color1 = Color(1.0, 0.5, 0.0) # оранжевый
|
||||
var color2 = Color(0.4, 0.4, 0.4) # серый
|
||||
tween.tween_property(base_style, "border_color", color2, 0.5)\
|
||||
.set_trans(Tween.TRANS_SINE)\
|
||||
.set_ease(Tween.EASE_IN_OUT)
|
||||
tween.tween_property(base_style, "border_color", color1, 0.5)\
|
||||
.set_trans(Tween.TRANS_SINE)\
|
||||
.set_ease(Tween.EASE_IN_OUT)
|
||||
tween.tween_property(base_style, 'border_color', color2, 0.5).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT)
|
||||
tween.tween_property(base_style, 'border_color', color1, 0.5).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT)
|
||||
|
||||
|
||||
func _stop_pulse():
|
||||
@@ -80,16 +77,17 @@ func _on_status_change():
|
||||
|
||||
func _on_stop_control():
|
||||
var time_dict = Time.get_datetime_dict_from_system()
|
||||
text = 'Контроль выполнен %02d:%02d/%02d.%02d' % [
|
||||
time_dict.hour,
|
||||
time_dict.minute,
|
||||
time_dict.day,
|
||||
time_dict.month]
|
||||
text = 'Контроль завершён %02d:%02d/%02d.%02d' % [
|
||||
time_dict.hour,
|
||||
time_dict.minute,
|
||||
time_dict.day,
|
||||
time_dict.month ]
|
||||
disabled = false
|
||||
tooltip_text = 'Нажать для повторного контроля '
|
||||
tooltip_text = 'Нажать для запуска контроля '
|
||||
flag_control_is_over = true
|
||||
|
||||
|
||||
func _exit_tree() -> void:
|
||||
if tween:
|
||||
tween.kill()
|
||||
tween = null
|
||||
|
||||
@@ -45,14 +45,6 @@ func enter_press():
|
||||
Input.parse_input_event(enter_event)
|
||||
|
||||
|
||||
func _on_settings_changed():
|
||||
if not is_inside_tree(): return
|
||||
var white_color = ProjectSettings.get_setting('Схема прибора. Белый цвет', Color.LIGHT_GRAY)
|
||||
var black_color = ProjectSettings.get_setting('Схема прибора. Чёрный цвет', Color.BLACK)
|
||||
$pic_functional.material.set('shader_parameter/white', white_color)
|
||||
$pic_functional.material.set('shader_parameter/black', black_color)
|
||||
|
||||
|
||||
@export var state: int:
|
||||
set(v):
|
||||
v = 0 if v < 0 else v % state_colors.size()
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
[gd_scene load_steps=32 format=3 uid="uid://lwmw4egynmd1"]
|
||||
[gd_scene load_steps=30 format=3 uid="uid://lwmw4egynmd1"]
|
||||
|
||||
[ext_resource type="Texture2D" uid="uid://bar8k5qef7kch" path="res://data/УФ.png" id="2_0nvm1"]
|
||||
[ext_resource type="Script" uid="uid://q3gmpsqspjfp" path="res://scenes/контроль/внешний.gd" id="2_8r80x"]
|
||||
@@ -67,7 +67,7 @@ func on_serv_changed(u, pribor_node, _pribor_meta): pribor_node.state = int(u.se
|
||||
func on_mode_changed():
|
||||
clean_pribor_items()
|
||||
reset_pribor_buttons()
|
||||
$chk_show_functional.visible = false
|
||||
$chk_show_functional.disabled = true
|
||||
$chk_show_functional.button_pressed = false
|
||||
|
||||
|
||||
@@ -142,6 +142,7 @@ func clean_pribor_items():
|
||||
func on_pribor_press(pribor_path, header_text, pribor_node):
|
||||
if cur_pribor_node:
|
||||
cur_pribor_node.show_functional = false
|
||||
$chk_show_functional.disabled = false
|
||||
$chk_show_functional.button_pressed = false
|
||||
cur_pribor_node = pribor_node
|
||||
clean_pribor_items()
|
||||
@@ -154,7 +155,7 @@ func on_pribor_press(pribor_path, header_text, pribor_node):
|
||||
push_error('экземпляр не создан: \\\"%s\\\" (%s)' % [pribor_path, header_text])
|
||||
return
|
||||
$lbl_header.text = header_text
|
||||
$chk_show_functional.visible = true
|
||||
$chk_show_functional.disabled = false
|
||||
var meta_list = pribor_node.get_meta_list()
|
||||
if meta_list.find('unit_name') > -1:
|
||||
var unit_name = pribor_node.get_meta('unit_name')
|
||||
@@ -219,8 +220,7 @@ func _on_gui_input(event: InputEvent) -> void:
|
||||
clean_pribor_items()
|
||||
cur_pribor_node = null
|
||||
$chk_show_functional.button_pressed = false
|
||||
$chk_show_functional.visible = false
|
||||
$lbl_header.text = \"\"
|
||||
$chk_show_functional.disabled = true
|
||||
|
||||
|
||||
func on_control_button_pressed(state: bool) -> void:
|
||||
@@ -256,21 +256,6 @@ shader_parameter/white = Vector3(0.14, 0.13, 0.13)
|
||||
shader_parameter/black = Vector3(0.95, 0.55, 0.05)
|
||||
shader_parameter/gamma = 2.0
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_l5wui"]
|
||||
bg_color = Color(0.47451, 0.47451, 0.47451, 1)
|
||||
border_width_left = 2
|
||||
border_width_top = 2
|
||||
border_width_right = 2
|
||||
border_width_bottom = 2
|
||||
border_color = Color(0.890196, 0.486275, 0.196078, 1)
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_j3xqy"]
|
||||
border_width_left = 2
|
||||
border_width_top = 2
|
||||
border_width_right = 2
|
||||
border_width_bottom = 2
|
||||
border_color = Color(0.890196, 0.486275, 0.196078, 1)
|
||||
|
||||
[node name="Контроль" type="Panel"]
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
@@ -471,7 +456,7 @@ texture_normal = ExtResource("6_i1yfn")
|
||||
stretch_mode = 4
|
||||
flip_h = true
|
||||
script = ExtResource("3_4pt7j")
|
||||
state_colors = [Color(1, 1, 1, 1), Color(0, 0.87, 0, 1), Color(100, 0, 0, 1)]
|
||||
state_colors = [Color(1, 1, 1, 1), Color(0, 0.87, 0, 1), Color(0.65, 0.0715, 0.0715, 1)]
|
||||
metadata/online_proc = "on_line_changed"
|
||||
metadata/unit_name = ["уарэп-яу07-1н"]
|
||||
|
||||
@@ -562,6 +547,7 @@ metadata/unit_name = ["уарэп-эмс"]
|
||||
metadata/online_proc = "on_line_changed"
|
||||
|
||||
[node name="label" type="Label" parent="pribor_uf"]
|
||||
self_modulate = Color(0, 1, 0, 1)
|
||||
layout_mode = 0
|
||||
offset_left = 15.0
|
||||
offset_top = -44.0
|
||||
@@ -1439,7 +1425,7 @@ texture_normal = ExtResource("6_i1yfn")
|
||||
stretch_mode = 4
|
||||
flip_h = true
|
||||
script = ExtResource("3_4pt7j")
|
||||
state_colors = [Color(1, 1, 1, 1), Color(0, 0.87, 0, 1), Color(100, 0, 0, 1)]
|
||||
state_colors = [Color(1, 1, 1, 1), Color(0, 0.87, 0, 1), Color(0.65, 0.0715, 0.0715, 1)]
|
||||
metadata/unit_name = ["уарэп-яу07-1в"]
|
||||
metadata/online_proc = "on_line_changed"
|
||||
|
||||
@@ -1526,7 +1512,7 @@ texture_normal = ExtResource("6_i1yfn")
|
||||
stretch_mode = 4
|
||||
flip_h = true
|
||||
script = ExtResource("3_4pt7j")
|
||||
state_colors = [Color(1, 1, 1, 1), Color(0, 0.87, 0, 1), Color(100, 0, 0, 1)]
|
||||
state_colors = [Color(1, 1, 1, 1), Color(0, 0.87, 0, 1), Color(0.65, 0.0715, 0.0715, 1)]
|
||||
metadata/unit_name = ["уарэп-яу07-1к"]
|
||||
metadata/online_proc = "on_line_changed"
|
||||
|
||||
@@ -1926,12 +1912,11 @@ horizontal_alignment = 1
|
||||
vertical_alignment = 1
|
||||
|
||||
[node name="chk_show_functional" type="CheckButton" parent="."]
|
||||
visible = false
|
||||
layout_mode = 0
|
||||
offset_left = 1028.0
|
||||
offset_top = 26.0
|
||||
offset_right = 1407.0
|
||||
offset_bottom = 60.0
|
||||
offset_left = 1029.0
|
||||
offset_top = 15.0
|
||||
offset_right = 1408.0
|
||||
offset_bottom = 49.0
|
||||
theme_override_font_sizes/font_size = 22
|
||||
text = "Показать функциональную схему Э2"
|
||||
flat = true
|
||||
@@ -1997,11 +1982,6 @@ offset_top = 64.0
|
||||
offset_right = 1390.0
|
||||
offset_bottom = 104.0
|
||||
focus_mode = 0
|
||||
theme_override_colors/font_hover_color = Color(1, 1, 1, 1)
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_styles/hover = SubResource("StyleBoxFlat_l5wui")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_l5wui")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_j3xqy")
|
||||
text = "Запуск контроля"
|
||||
script = ExtResource("18_lbx5w")
|
||||
metadata/_edit_lock_ = true
|
||||
|
||||
@@ -1,102 +0,0 @@
|
||||
[gd_scene load_steps=4 format=3 uid="uid://bnptm4rlp60dq"]
|
||||
|
||||
[ext_resource type="Script" path="res://scenes/настройки/настройки.gd" id="1_2l3rd"]
|
||||
[ext_resource type="Script" path="res://table/table.gd" id="2_ts42i"]
|
||||
|
||||
[sub_resource type="GDScript" id="GDScript_anjmx"]
|
||||
script/source = "extends LineEdit
|
||||
|
||||
func _ready() -> void: text = ProjectSettings.get('application/config/map_server_addr')
|
||||
|
||||
|
||||
func _on_text_changed(new_text: String) -> void:
|
||||
ProjectSettings.set('application/config/map_server_addr', new_text)
|
||||
ProjectSettings.save_custom('override.cfg')
|
||||
"
|
||||
|
||||
[node name="Настройки" type="Panel"]
|
||||
script = ExtResource("1_2l3rd")
|
||||
|
||||
[node name="table" type="GridContainer" parent="."]
|
||||
layout_mode = 2
|
||||
offset_left = 32.0
|
||||
offset_top = 96.0
|
||||
offset_right = 241.0
|
||||
offset_bottom = 535.0
|
||||
columns = 2
|
||||
script = ExtResource("2_ts42i")
|
||||
|
||||
[node name="Label1" type="Label" parent="."]
|
||||
layout_mode = 0
|
||||
offset_left = 16.0
|
||||
offset_top = 60.0
|
||||
offset_right = 434.0
|
||||
offset_bottom = 82.0
|
||||
text = "Управление элементами в режиме с ограниченным доступом"
|
||||
|
||||
[node name="Label2" type="Label" parent="."]
|
||||
layout_mode = 0
|
||||
offset_left = 16.0
|
||||
offset_top = 20.0
|
||||
offset_right = 476.0
|
||||
offset_bottom = 50.0
|
||||
text = "Текущий режим доступа: полный"
|
||||
vertical_alignment = 1
|
||||
|
||||
[node name="edt_mapaddr" type="LineEdit" parent="."]
|
||||
layout_mode = 0
|
||||
offset_left = 660.0
|
||||
offset_top = 80.0
|
||||
offset_right = 1032.0
|
||||
offset_bottom = 110.0
|
||||
script = SubResource("GDScript_anjmx")
|
||||
|
||||
[node name="Label" type="Label" parent="edt_mapaddr"]
|
||||
layout_mode = 0
|
||||
offset_left = -180.0
|
||||
offset_right = -20.0
|
||||
offset_bottom = 30.0
|
||||
text = "Адрес сервера карт:"
|
||||
vertical_alignment = 1
|
||||
|
||||
[node name="GridContainer2" type="GridContainer" parent="."]
|
||||
layout_mode = 0
|
||||
offset_left = 478.0
|
||||
offset_top = 154.0
|
||||
offset_right = 784.0
|
||||
offset_bottom = 260.0
|
||||
columns = 2
|
||||
|
||||
[node name="external_cu_lbl" type="Label" parent="GridContainer2"]
|
||||
layout_mode = 2
|
||||
text = "Внешнее целеуказание."
|
||||
vertical_alignment = 1
|
||||
|
||||
[node name="external_cu_btn" type="CheckButton" parent="GridContainer2"]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="Label19" type="Label" parent="GridContainer2"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
text = "Кнопка «Подавление».
|
||||
Отключить отображение этой кнопки,
|
||||
что бы тип помех применялся сразу."
|
||||
|
||||
[node name="CheckButton18" type="CheckButton" parent="GridContainer2"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 6
|
||||
size_flags_vertical = 6
|
||||
button_pressed = true
|
||||
|
||||
[node name="lbl_commit" type="Label" parent="."]
|
||||
layout_mode = 0
|
||||
offset_left = 480.0
|
||||
offset_top = 20.0
|
||||
offset_right = 1040.0
|
||||
offset_bottom = 50.0
|
||||
text = "Текущая версия ПО УАРЭП:"
|
||||
vertical_alignment = 1
|
||||
|
||||
[connection signal="text_changed" from="edt_mapaddr" to="edt_mapaddr" method="_on_text_changed"]
|
||||
[connection signal="pressed" from="GridContainer2/external_cu_btn" to="." method="_on_external_cu_btn_pressed"]
|
||||
298
scenes/настройки/настройки.gd
Normal file
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
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"]
|
||||
|
||||
[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
|
||||
|
||||
@@ -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,7 +38,9 @@ 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
|
||||
|
||||
var course = 0.0 ## Курс корабля
|
||||
|
||||
@@ -90,8 +92,35 @@ const VAL_TO_EVENT = {
|
||||
true: 'full_auto' } ## Выбор целей и установка помех автоматически.
|
||||
|
||||
|
||||
var SIGNALS_CONNECTIONS = [
|
||||
[interfer, 'interfer_update', 'on_interfer_new'],
|
||||
[signaller, 'bip_pressed', 'on_bip_pressed'],
|
||||
[signaller, 'clear_klaster', 'clear_all_klaster'],
|
||||
[signaller, 'fs_selected', 'on_fs_selected'],
|
||||
[signaller, 'fs_update_color', 'set_fs_color'],
|
||||
[signaller, 'fs_update_state', 'on_fs_update_state'],
|
||||
[signaller, 'interfer_new', 'on_interfer_new'],
|
||||
[signaller, 'interfer_off_all', 'on_interfer_off_all'],
|
||||
[signaller, 'interfer_prinuditelno', 'on_chk_interfer_prinuditelno'],
|
||||
[signaller, 'interfer_prinuditelno', 'on_interfer_prinuditelno'],
|
||||
[signaller, 'interfer_selected', 'on_interfer_selected'],
|
||||
[signaller, 'map_user_panning', 'on_user_panning'],
|
||||
[signaller, 'on_prog_ecm_off', 'on_interfer_new'],
|
||||
[signaller, 'rto_threat_sel', 'on_rto_threat_sel'],
|
||||
[signaller, 'rto_threat_unsel', 'on_rto_threat_unsel'],
|
||||
[signaller, 'sector_klaster', 'sector_klaster'],
|
||||
[signaller, 'th_aoa_update', 'on_th_aoa_update'],
|
||||
[signaller, 'threat_selected', 'on_threat_selected'],
|
||||
[signaller, 'update_coordinates_map', 'on_update_coordinates_label'],
|
||||
[signaller, 'update_scale_map', 'on_update_scale_label'],
|
||||
[threats, 'threat_lost', 'on_threat_lost'],
|
||||
[threats, 'threat_new', 'on_threat_new'],
|
||||
[threats, 'threat_update', 'on_threat_update'],
|
||||
[threats, 'threats_resized', 'on_threats_resized'] ]
|
||||
|
||||
|
||||
## Обработчик выбора цели.
|
||||
func on_threat_selected(th, ecm_btns): on_rto_threat_sel(th.id, ecm_btns)
|
||||
func on_threat_selected(th): on_rto_threat_sel(th.id)
|
||||
|
||||
|
||||
## Встроенный обратный вызов.
|
||||
@@ -110,6 +139,8 @@ func on_settings_changed():
|
||||
color_ecm = ProjectSettings.get_setting('application/interfer/interfer_color', Color(0.58, 0.47, 0.51, 1.0))
|
||||
color_select = ProjectSettings.get_setting('application/interfer/select_color', Color(1.0, 1.0, 1.0, 1.0))
|
||||
color_closed = ProjectSettings.get_setting('application/interfer/closed_sectors', Color(0.0, 0.0, 0.0, 1.0))
|
||||
min_zoom = ProjectSettings.get_setting('application/config/map_minimum_zoom', 5)
|
||||
max_zoom = ProjectSettings.get_setting('application/config/map_maximum_zoom', 19)
|
||||
color_emit_sel = color_select
|
||||
color_closed_emit = color_closed
|
||||
|
||||
@@ -119,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)
|
||||
|
||||
|
||||
## Обработчик сигнала изменения списка целей.
|
||||
@@ -160,7 +192,7 @@ func init_fs_failed():
|
||||
var sectors_count = $canvas.fs_default_colors.size()
|
||||
fs_failed.resize(sectors_count)
|
||||
for i in fs_failed.size():
|
||||
fs_failed[i] = AntBandState.ANT_BAND_FAILED
|
||||
fs_failed[i] = AntBandState.ANT_BAND_READY
|
||||
|
||||
|
||||
## Производит инициализацию.
|
||||
@@ -168,43 +200,43 @@ func _ready():
|
||||
ProjectSettings.connect('settings_changed', on_settings_changed)
|
||||
on_settings_changed()
|
||||
init_fs_failed()
|
||||
min_zoom = ProjectSettings.get_setting('application/config/map_minimum_zoom', 5)
|
||||
max_zoom = ProjectSettings.get_setting('application/config/map_maximum_zoom', 19)
|
||||
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', Callable(self, 'on_btn_close').bind($btn_close))
|
||||
$btn_work.button_connect('pressed', Callable(self, 'on_btn_work').bind($btn_work))
|
||||
threats.connect('threat_new', Callable(self, 'on_threat_new'))
|
||||
threats.connect('threat_lost', Callable(self, 'on_threat_lost'))
|
||||
threats.connect('threats_resized', Callable(self, 'on_threats_resized'))
|
||||
threats.connect('threat_update', Callable(self, 'on_threat_update'))
|
||||
signaller.connect('rto_threat_sel', Callable(self, 'on_rto_threat_sel').bind(nodes))
|
||||
signaller.connect('bip_pressed', Callable(self, 'on_bip_pressed').bind(nodes))
|
||||
signaller.connect('rto_threat_unsel', Callable(self, 'on_rto_threat_unsel').bind(nodes))
|
||||
signaller.connect('threat_selected', Callable(self, 'on_threat_selected').bind(nodes))
|
||||
signaller.connect('interfer_selected', Callable(self, 'on_interfer_selected').bind(nodes))
|
||||
signaller.connect('interfer_new', Callable(self, 'on_interfer_new'))
|
||||
signaller.connect('on_prog_ecm_off', Callable(self, 'on_interfer_new'))
|
||||
signaller.connect('interfer_off_all', Callable(self, 'on_interfer_off_all'))
|
||||
signaller.connect('interfer_prinuditelno', Callable(self, 'on_interfer_prinuditelno').bind(nodes))
|
||||
signaller.connect('fs_selected', Callable(self, 'on_fs_selected'))
|
||||
signaller.connect('fs_update_color', Callable(self, 'set_fs_color'))
|
||||
interfer.connect('interfer_update', Callable(self, 'on_interfer_new'))
|
||||
signaller.connect('interfer_prinuditelno', Callable(self, 'on_chk_interfer_prinuditelno'))
|
||||
signaller.connect('fs_update_state', Callable(self, 'on_fs_update_state'))
|
||||
signaller.connect('map_user_panning', Callable(self, 'on_user_panning'))
|
||||
signaller.connect('update_coordinates_map', Callable(self, 'on_update_coordinates_label'))
|
||||
signaller.connect('update_scale_map', Callable(self, 'on_update_scale_label'))
|
||||
signaller.connect('sector_klaster', Callable(self, 'sector_klaster'))
|
||||
signaller.connect('clear_klaster', Callable(self, 'clear_all_klaster'))
|
||||
signaller.connect('th_aoa_update', Callable(self, 'on_th_aoa_update'))
|
||||
$btn_close.button_connect('pressed', on_btn_close)
|
||||
$btn_work.button_connect('pressed', on_btn_work)
|
||||
var unit_nav = network.get_unit_instance('навигация')
|
||||
unit_nav.connect('data_received', on_navi_data_received)
|
||||
on_btn_center_toggled(true)
|
||||
on_btn_activate_toggled(true)
|
||||
signaller.connect('режим_работа', connect_all)
|
||||
signaller.connect('режим_контроль', disconnect_all)
|
||||
signaller.connect('режим_журнал', disconnect_all)
|
||||
signaller.connect('режим_эмс', disconnect_all)
|
||||
signaller.connect('режим_эмс2', disconnect_all)
|
||||
signaller.connect('режим_настройки', disconnect_all)
|
||||
connect_all()
|
||||
|
||||
|
||||
func connect_all() -> void:
|
||||
signal_conections.clear()
|
||||
for item in SIGNALS_CONNECTIONS:
|
||||
var proc = Callable(self, item[2])
|
||||
var rc = item[0].connect(item[1], proc)
|
||||
if rc == Error.OK:
|
||||
signal_conections.append([item[0], item[1], proc])
|
||||
else:
|
||||
var ers = error_string(rc)
|
||||
push_error('%s: %s %s %s' % [ers, item[0], item[1], item[2]])
|
||||
|
||||
|
||||
func disconnect_all() -> void:
|
||||
for item in signal_conections:
|
||||
item[0].disconnect(item[1], item[2])
|
||||
signal_conections.clear()
|
||||
|
||||
|
||||
func sector_klaster(sector_data):
|
||||
@@ -320,13 +352,13 @@ func on_threat_lost(th) -> void:
|
||||
|
||||
|
||||
## обработчик нажатия на цель на экране.
|
||||
func on_bip_pressed(th_id, _ecm_btns):
|
||||
func on_bip_pressed(th_id):
|
||||
if btn_select == BtnSel.THREAT:
|
||||
signaller.emit_signal('rto_threat_sel', th_id)
|
||||
|
||||
|
||||
## Обработчик выбора РТО цели.
|
||||
func on_rto_threat_sel(th_id, ecm_btns):
|
||||
func on_rto_threat_sel(th_id):
|
||||
var bips: Array = get_children().filter(func(item): return item.name.is_valid_int())
|
||||
for item in bips:
|
||||
if th_id == item.name.to_int():
|
||||
@@ -336,6 +368,7 @@ func on_rto_threat_sel(th_id, ecm_btns):
|
||||
item.set_sel_visible(false)
|
||||
var th = thrs_dict[th_id]
|
||||
var krp = interfer.get_krp(th)
|
||||
var ecm_btns: Array = get_tree().get_nodes_in_group('группа-режим-помехи')
|
||||
for btn in ecm_btns:
|
||||
set_btns_disabled(false, btn)
|
||||
var btn_meta = btn.get_meta('rfi_name')
|
||||
@@ -346,13 +379,14 @@ func on_rto_threat_sel(th_id, ecm_btns):
|
||||
|
||||
|
||||
## Обработчик снятия выбора РТО цели.
|
||||
func on_rto_threat_unsel(th_id, ecm_btns):
|
||||
func on_rto_threat_unsel(th_id):
|
||||
var bips: Array = get_children().filter(func(item): return item.name.is_valid_int())
|
||||
for item in bips:
|
||||
if th_id == item.name.to_int():
|
||||
item.set_sel_visible(false)
|
||||
break
|
||||
set_ecm_btns_state(true)
|
||||
var ecm_btns: Array = get_tree().get_nodes_in_group('группа-режим-помехи')
|
||||
for btn in ecm_btns:
|
||||
btn.set_rec_visible(false)
|
||||
|
||||
@@ -377,21 +411,22 @@ 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)
|
||||
|
||||
|
||||
## Управляет состоянием кнопок в радиогруппе при выборе помехи.
|
||||
func on_interfer_selected(ecm, btns) -> void:
|
||||
func on_interfer_selected(ecm) -> void:
|
||||
var ecm_name: String
|
||||
if ecm != null:
|
||||
ecm_name = ecm.krp
|
||||
else:
|
||||
ecm_name = interfer.INTERFER_OFF
|
||||
var btns: Array = get_tree().get_nodes_in_group('группа-режим-помехи')
|
||||
for btn in btns:
|
||||
set_btns_disabled(false, btn)
|
||||
btn.get_meta('rfi_name')
|
||||
@@ -538,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:
|
||||
@@ -578,13 +613,14 @@ func set_btns_disabled(value: bool, btn):
|
||||
btn.set_disabled(value)
|
||||
|
||||
|
||||
func on_interfer_prinuditelno(prenuditelno_sectors, btns):
|
||||
func on_interfer_prinuditelno(prenuditelno_sectors):
|
||||
for key in prenuditelno_sectors:
|
||||
var sectors = []
|
||||
for sector in prenuditelno_sectors[key]:
|
||||
sectors.append(prd.get_fs_param(sector))
|
||||
signaller.emit_signal('interfer_init', key, sectors, interfer.POW_DEFAULT)
|
||||
update_fs_colors()
|
||||
var btns: Array = get_tree().get_nodes_in_group('группа-режим-помехи')
|
||||
for btn in btns:
|
||||
btn.set_pressed(false)
|
||||
set_btns_disabled(true, btn)
|
||||
@@ -593,7 +629,7 @@ func on_interfer_prinuditelno(prenuditelno_sectors, btns):
|
||||
## Вызывается при получении информации о состоянии модулей ФС от КАПС РПБ.
|
||||
func on_fs_update_state(fs_dict: Dictionary):
|
||||
for key in fs_dict.keys():
|
||||
fs_failed[key] = fs_dict[key].ready
|
||||
fs_failed[key] = fs_dict[key].isg
|
||||
|
||||
|
||||
func on_btn_center_toggled(toggled_on: bool) -> void:
|
||||
@@ -616,16 +652,16 @@ func on_update_scale_label(scale_label) -> void:
|
||||
$scale_map.text = str(scale_label)
|
||||
|
||||
|
||||
func on_btn_close(btn):
|
||||
func on_btn_close():
|
||||
await get_tree().create_timer(0.2).timeout
|
||||
btn.pressed = false
|
||||
$btn_close.pressed = false
|
||||
fs_closed.merge(fs_selected)
|
||||
signaller.emit_signal('update_fs_closed', fs_closed)
|
||||
|
||||
|
||||
func on_btn_work(btn):
|
||||
func on_btn_work():
|
||||
await get_tree().create_timer(0.2).timeout
|
||||
btn.pressed = false
|
||||
$btn_work.pressed = false
|
||||
fs_closed.clear()
|
||||
for fs_index in prd.FS_PRD.keys():
|
||||
if fs_index in fs_selected: continue
|
||||
|
||||
@@ -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="."]
|
||||
@@ -306,36 +307,36 @@ vertical_alignment = 1
|
||||
|
||||
[node name="coordinates_map" type="Label" parent="."]
|
||||
layout_mode = 0
|
||||
offset_left = 654.0
|
||||
offset_top = -23.0
|
||||
offset_right = 766.0
|
||||
offset_bottom = -4.0
|
||||
offset_left = 660.0
|
||||
offset_top = -24.0
|
||||
offset_right = 772.0
|
||||
offset_bottom = -5.0
|
||||
text = "Координаты:"
|
||||
|
||||
[node name="scale_map" type="Label" parent="."]
|
||||
layout_mode = 0
|
||||
offset_left = 1009.0
|
||||
offset_top = -23.0
|
||||
offset_right = 1119.0
|
||||
offset_bottom = -2.0
|
||||
offset_left = 1003.0
|
||||
offset_top = -24.0
|
||||
offset_right = 1113.0
|
||||
offset_bottom = -3.0
|
||||
text = "Масштаб:"
|
||||
|
||||
[node name="zoom_plus" type="Button" parent="."]
|
||||
layout_mode = 0
|
||||
offset_left = 952.0
|
||||
offset_top = 43.0
|
||||
offset_right = 984.0
|
||||
offset_bottom = 75.0
|
||||
offset_left = 1056.0
|
||||
offset_top = 230.0
|
||||
offset_right = 1088.0
|
||||
offset_bottom = 262.0
|
||||
theme_override_fonts/font = SubResource("SystemFont_5ffal")
|
||||
theme_override_font_sizes/font_size = 20
|
||||
text = "+"
|
||||
|
||||
[node name="zoom_minus" type="Button" parent="."]
|
||||
layout_mode = 0
|
||||
offset_left = 952.0
|
||||
offset_top = 84.0
|
||||
offset_right = 984.0
|
||||
offset_bottom = 116.0
|
||||
offset_left = 1056.0
|
||||
offset_top = 270.0
|
||||
offset_right = 1088.0
|
||||
offset_bottom = 302.0
|
||||
theme_override_font_sizes/font_size = 20
|
||||
text = "−"
|
||||
|
||||
@@ -383,8 +384,8 @@ texture_normal = ExtResource("14_ggrwd")
|
||||
[connection signal="toggled" from="btn_activate" to="." method="on_btn_activate_toggled"]
|
||||
[connection signal="toggled" from="btn_center" to="." method="on_btn_center_toggled"]
|
||||
[connection signal="button_down" from="zoom_plus" to="tilemap" method="_on_zoom_plus_button_down"]
|
||||
[connection signal="button_up" from="zoom_plus" to="tilemap" method="_on_zoom_button_up"]
|
||||
[connection signal="button_up" from="zoom_plus" to="tilemap" method="_on_zoom_plus_button_up"]
|
||||
[connection signal="button_up" from="zoom_plus" to="tilemap" method="_on_zoom_button_up"]
|
||||
[connection signal="button_down" from="zoom_minus" to="tilemap" method="_on_zoom_minus_button_down"]
|
||||
[connection signal="button_up" from="zoom_minus" to="tilemap" method="_on_zoom_button_up"]
|
||||
[connection signal="pressed" from="btn_all_work" to="." method="_on_btn_all_work_pressed"]
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
[ext_resource type="Texture2D" uid="uid://hkcvl2waf63s" path="res://data/вид сверху.png" id="1_b7vcf"]
|
||||
[ext_resource type="Script" uid="uid://bvlqgv7aapebl" path="res://scenes/эмс2/эмс_тг.gd" id="1_l3ueu"]
|
||||
[ext_resource type="Texture2D" uid="uid://b1dw06ahtftq2" path="res://data/Окно частот0.png" id="3_2spgl"]
|
||||
[ext_resource type="Texture2D" uid="uid://0w6q4vfst0ry" path="res://data/OP-63.png" id="3_8gk36"]
|
||||
[ext_resource type="Texture2D" uid="uid://coxhivvc6uibs" path="res://data/Состояние РЭС 40.png" id="4_b3mus"]
|
||||
[ext_resource type="Texture2D" uid="uid://073el51yholj" path="res://data/454.png" id="4_nqi0i"]
|
||||
@@ -34,7 +33,11 @@
|
||||
[ext_resource type="Texture2D" uid="uid://carr8bw5rwiwj" path="res://data/Кнопка подтверждения01.png" id="32_p41nv"]
|
||||
[ext_resource type="Texture2D" uid="uid://3siondd3feev" path="res://data/Скруглённый прямоугольник белый.png" id="33_5ifkb"]
|
||||
|
||||
[sub_resource type="CompressedTexture2D" id="CompressedTexture2D_5u4bk"]
|
||||
load_path = "res://.godot/imported/Окно частот0.png-6b01791c971bddb01337caf9077bf060.ctex"
|
||||
|
||||
[sub_resource type="CompressedTexture2D" id="CompressedTexture2D_l3ueu"]
|
||||
load_path = "res://.godot/imported/Скруглённый квадрат серый.png-4655829309cca3b1dec2c9ae01376d54.ctex"
|
||||
|
||||
[node name="Panel" type="Panel"]
|
||||
script = ExtResource("1_l3ueu")
|
||||
@@ -53,7 +56,7 @@ offset_top = 240.0
|
||||
offset_right = 1649.0
|
||||
offset_bottom = 813.0
|
||||
scale = Vector2(0.95, 0.95)
|
||||
texture = ExtResource("3_2spgl")
|
||||
texture = SubResource("CompressedTexture2D_5u4bk")
|
||||
expand_mode = 1
|
||||
|
||||
[node name="Op-63" type="TextureRect" parent="."]
|
||||
@@ -66,13 +69,13 @@ scale = Vector2(0.312207, 0.312207)
|
||||
texture = ExtResource("3_8gk36")
|
||||
|
||||
[node name="СостояниеРэс44" type="Sprite2D" parent="Op-63"]
|
||||
position = Vector2(285.067, 253.037)
|
||||
scale = Vector2(2.1, 2.1)
|
||||
position = Vector2(277.772, 259.444)
|
||||
scale = Vector2(1.77945, 1.77945)
|
||||
texture = ExtResource("4_b3mus")
|
||||
|
||||
[node name="СостояниеРэс24" type="Sprite2D" parent="Op-63"]
|
||||
position = Vector2(285.067, 150.541)
|
||||
scale = Vector2(2.1, 2.1)
|
||||
position = Vector2(277.772, 192.18)
|
||||
scale = Vector2(1.77945, 1.77945)
|
||||
texture = ExtResource("5_yqn2y")
|
||||
|
||||
[node name="СостояниеРэс2" type="Sprite2D" parent="Op-63"]
|
||||
@@ -91,18 +94,18 @@ scale = Vector2(0.312, 0.312)
|
||||
texture = ExtResource("4_nqi0i")
|
||||
|
||||
[node name="СостояниеРэс45" type="Sprite2D" parent="454"]
|
||||
position = Vector2(287.571, 253.205)
|
||||
scale = Vector2(2.1, 2.1)
|
||||
position = Vector2(277.956, 259.615)
|
||||
scale = Vector2(1.78063, 1.78063)
|
||||
texture = ExtResource("4_b3mus")
|
||||
|
||||
[node name="СостояниеРэс25" type="Sprite2D" parent="454"]
|
||||
position = Vector2(287.571, 153.847)
|
||||
scale = Vector2(2.1, 2.1)
|
||||
position = Vector2(277.956, 192.308)
|
||||
scale = Vector2(1.78063, 1.78063)
|
||||
texture = ExtResource("5_yqn2y")
|
||||
|
||||
[node name="СостояниеРэс3" type="Sprite2D" parent="454"]
|
||||
position = Vector2(285.256, 41.6667)
|
||||
scale = Vector2(4, 4)
|
||||
position = Vector2(275.641, 38.4615)
|
||||
scale = Vector2(3.20513, 3.20513)
|
||||
texture = ExtResource("6_m57px")
|
||||
|
||||
[node name="lbl_trassa" type="Label" parent="454"]
|
||||
@@ -117,25 +120,25 @@ text = "Трасса"
|
||||
[node name="Го" type="TextureRect" parent="."]
|
||||
layout_mode = 0
|
||||
offset_left = 488.0
|
||||
offset_top = 84.0
|
||||
offset_top = 85.0
|
||||
offset_right = 701.0
|
||||
offset_bottom = 376.0
|
||||
offset_bottom = 377.0
|
||||
scale = Vector2(0.312, 0.312)
|
||||
texture = ExtResource("5_e7tlv")
|
||||
|
||||
[node name="СостояниеРэс40" type="Sprite2D" parent="Го"]
|
||||
position = Vector2(287.66, 253.205)
|
||||
scale = Vector2(2.1, 2.1)
|
||||
position = Vector2(278.045, 253.205)
|
||||
scale = Vector2(1.78063, 1.78063)
|
||||
texture = ExtResource("4_b3mus")
|
||||
|
||||
[node name="СостояниеРэс20" type="Sprite2D" parent="Го"]
|
||||
position = Vector2(287.66, 150.641)
|
||||
scale = Vector2(2.1, 2.1)
|
||||
position = Vector2(278.045, 185.897)
|
||||
scale = Vector2(1.78063, 1.78063)
|
||||
texture = ExtResource("5_yqn2y")
|
||||
|
||||
[node name="СостояниеЭмсСлабыйСигнал" type="Sprite2D" parent="Го"]
|
||||
position = Vector2(284.455, 38.4619)
|
||||
scale = Vector2(4, 3.796)
|
||||
position = Vector2(278.045, 118.59)
|
||||
scale = Vector2(3.37683, 3.20513)
|
||||
texture = ExtResource("9_5u4bk")
|
||||
|
||||
[node name="Рлс1" type="TextureRect" parent="."]
|
||||
@@ -148,18 +151,18 @@ scale = Vector2(0.312, 0.312)
|
||||
texture = ExtResource("6_y58bl")
|
||||
|
||||
[node name="СостояниеРэс41" type="Sprite2D" parent="Рлс1"]
|
||||
position = Vector2(287.661, 253.205)
|
||||
scale = Vector2(2.1, 2.1)
|
||||
position = Vector2(278.045, 259.615)
|
||||
scale = Vector2(1.78063, 1.78063)
|
||||
texture = ExtResource("4_b3mus")
|
||||
|
||||
[node name="СостояниеРэс21" type="Sprite2D" parent="Рлс1"]
|
||||
position = Vector2(287.661, 153.846)
|
||||
scale = Vector2(2.1, 2.1)
|
||||
position = Vector2(278.045, 192.308)
|
||||
scale = Vector2(1.78063, 1.78063)
|
||||
texture = ExtResource("5_yqn2y")
|
||||
|
||||
[node name="СостояниеЭмсСлабыйСигнал2" type="Sprite2D" parent="Рлс1"]
|
||||
position = Vector2(287.66, 38.4615)
|
||||
scale = Vector2(4, 3.796)
|
||||
position = Vector2(278.045, 125)
|
||||
scale = Vector2(3.37683, 3.20513)
|
||||
texture = ExtResource("9_5u4bk")
|
||||
|
||||
[node name="Рлс2" type="TextureRect" parent="."]
|
||||
@@ -172,37 +175,37 @@ scale = Vector2(0.312, 0.312)
|
||||
texture = ExtResource("7_mxw8g")
|
||||
|
||||
[node name="СостояниеРэс42" type="Sprite2D" parent="Рлс2"]
|
||||
position = Vector2(287.661, 253.205)
|
||||
scale = Vector2(2.1, 2.1)
|
||||
position = Vector2(278.045, 259.615)
|
||||
scale = Vector2(1.78063, 1.78063)
|
||||
texture = ExtResource("4_b3mus")
|
||||
|
||||
[node name="СостояниеРэс22" type="Sprite2D" parent="Рлс2"]
|
||||
position = Vector2(287.661, 153.846)
|
||||
scale = Vector2(2.1, 2.1)
|
||||
position = Vector2(278.045, 192.308)
|
||||
scale = Vector2(1.78063, 1.78063)
|
||||
texture = ExtResource("5_yqn2y")
|
||||
|
||||
[node name="СостояниеЭмсСлабыйСигнал3" type="Sprite2D" parent="Рлс2"]
|
||||
position = Vector2(287.66, 38.4615)
|
||||
scale = Vector2(4, 3.796)
|
||||
position = Vector2(278.045, 125)
|
||||
scale = Vector2(3.37683, 3.20513)
|
||||
texture = ExtResource("9_5u4bk")
|
||||
|
||||
[node name="Ннвс" type="TextureRect" parent="."]
|
||||
layout_mode = 0
|
||||
offset_left = 1240.0
|
||||
offset_top = 84.0
|
||||
offset_top = 88.0
|
||||
offset_right = 1453.0
|
||||
offset_bottom = 376.0
|
||||
offset_bottom = 380.0
|
||||
scale = Vector2(0.312, 0.312)
|
||||
texture = ExtResource("8_q16jd")
|
||||
|
||||
[node name="СостояниеРэс43" type="Sprite2D" parent="Ннвс"]
|
||||
position = Vector2(287.571, 253.205)
|
||||
scale = Vector2(2.1, 2.1)
|
||||
position = Vector2(277.956, 253.205)
|
||||
scale = Vector2(1.78063, 1.78063)
|
||||
texture = ExtResource("4_b3mus")
|
||||
|
||||
[node name="СостояниеРэс23" type="Sprite2D" parent="Ннвс"]
|
||||
position = Vector2(287.571, 153.846)
|
||||
scale = Vector2(2.1, 2.1)
|
||||
position = Vector2(277.956, 185.897)
|
||||
scale = Vector2(1.78063, 1.78063)
|
||||
texture = ExtResource("5_yqn2y")
|
||||
|
||||
[node name="УгловойКвадрат2" type="Sprite2D" parent="."]
|
||||
@@ -403,9 +406,9 @@ texture = SubResource("CompressedTexture2D_l3ueu")
|
||||
|
||||
[node name="Label" type="Label" parent="."]
|
||||
layout_mode = 0
|
||||
offset_left = 799.0
|
||||
offset_left = 800.0
|
||||
offset_top = 246.0
|
||||
offset_right = 872.0
|
||||
offset_right = 873.0
|
||||
offset_bottom = 265.0
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_font_sizes/font_size = 16
|
||||
@@ -413,7 +416,7 @@ text = "Излучение"
|
||||
|
||||
[node name="Label2" type="Label" parent="."]
|
||||
layout_mode = 0
|
||||
offset_left = 814.0
|
||||
offset_left = 813.0
|
||||
offset_top = 503.0
|
||||
offset_right = 861.0
|
||||
offset_bottom = 522.0
|
||||
@@ -481,52 +484,52 @@ theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
text = "Изделие"
|
||||
|
||||
[node name="Label" type="Label" parent="СкруглённыйПрямоугСалатный"]
|
||||
offset_left = -33.7501
|
||||
offset_left = -33.0
|
||||
offset_top = -10.2857
|
||||
offset_right = 34.2499
|
||||
offset_bottom = 8.7143
|
||||
offset_right = 35.0
|
||||
offset_bottom = 8.71429
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
text = "Комплекс"
|
||||
|
||||
[node name="Label3" type="Label" parent="СкруглённыйПрямоугСалатный"]
|
||||
offset_left = 132.75
|
||||
offset_top = -11.1428
|
||||
offset_right = 179.75
|
||||
offset_bottom = 11.8572
|
||||
offset_left = 133.0
|
||||
offset_top = -10.0
|
||||
offset_right = 180.0
|
||||
offset_bottom = 9.0
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
text = "Режим"
|
||||
|
||||
[node name="Label4" type="Label" parent="СкруглённыйПрямоугСалатный"]
|
||||
offset_left = 210.751
|
||||
offset_left = 209.25
|
||||
offset_top = -10.2857
|
||||
offset_right = 259.751
|
||||
offset_right = 258.25
|
||||
offset_bottom = 8.7143
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
text = "Азимут"
|
||||
|
||||
[node name="Label5" type="Label" parent="СкруглённыйПрямоугСалатный"]
|
||||
offset_left = 620.252
|
||||
offset_top = -23.1428
|
||||
offset_right = 699.252
|
||||
offset_bottom = 25.8572
|
||||
offset_left = 627.0
|
||||
offset_top = -20.5713
|
||||
offset_right = 693.0
|
||||
offset_bottom = 20.4287
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
text = "Запрет
|
||||
передачи"
|
||||
horizontal_alignment = 1
|
||||
|
||||
[node name="Label6" type="Label" parent="СкруглённыйПрямоугСалатный"]
|
||||
offset_left = 518.251
|
||||
offset_top = -12.0
|
||||
offset_right = 576.251
|
||||
offset_bottom = 11.0
|
||||
offset_left = 516.75
|
||||
offset_top = -10.2857
|
||||
offset_right = 574.75
|
||||
offset_bottom = 8.7143
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
text = "Верхняя"
|
||||
|
||||
[node name="Label7" type="Label" parent="СкруглённыйПрямоугСалатный"]
|
||||
offset_left = 440.0
|
||||
offset_top = -11.0
|
||||
offset_right = 494.0
|
||||
offset_bottom = 12.0
|
||||
offset_left = 441.0
|
||||
offset_top = -10.2857
|
||||
offset_right = 495.0
|
||||
offset_bottom = 8.7143
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
text = "Нижняя"
|
||||
|
||||
@@ -539,14 +542,12 @@ theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
text = "Кластер"
|
||||
|
||||
[node name="Label9" type="Label" parent="СкруглённыйПрямоугСалатный"]
|
||||
offset_left = 276.001
|
||||
offset_top = -20.5714
|
||||
offset_right = 350.001
|
||||
offset_bottom = 20.4286
|
||||
offset_left = 275.25
|
||||
offset_top = -10.2857
|
||||
offset_right = 349.25
|
||||
offset_bottom = 8.7143
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
text = "Угол
|
||||
места"
|
||||
horizontal_alignment = 1
|
||||
text = "Угол места"
|
||||
|
||||
[node name="Label10" type="Label" parent="СкруглённыйПрямоугСалатный"]
|
||||
offset_left = 747.0
|
||||
|
||||
@@ -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):
|
||||
@@ -277,10 +289,10 @@ func on_th_aoa_update(threats: Dictionary, ecms: Dictionary, unit_instance) -> v
|
||||
var ecm_active = true
|
||||
if not gos_flag:
|
||||
if ecm.nmfs in gos_nmfs:
|
||||
signaller.emit_signal('interfer_off', ecm)
|
||||
interfer_off(ecm, unit_instance)
|
||||
ecm_active = false
|
||||
if ecm_active and (prd.fs_caps_id[ecm.nmfs] in fs_closed):
|
||||
signaller.emit_signal('interfer_off', ecm)
|
||||
interfer_off(ecm, unit_instance)
|
||||
|
||||
var th_id = thr.id
|
||||
for ecm_i in thrs.keys():
|
||||
@@ -290,9 +302,9 @@ func on_th_aoa_update(threats: Dictionary, ecms: Dictionary, unit_instance) -> v
|
||||
ecm.kni = fposmod(thr.aoa - course, 360)
|
||||
call_ecm_proc(ecm)
|
||||
if ecm.nmfs in gos_nmfs:
|
||||
signaller.emit_signal('interfer_off', ecm)
|
||||
interfer_off(ecm, unit_instance)
|
||||
elif prd.fs_caps_id[ecm.nmfs] in fs_closed:
|
||||
signaller.emit_signal('interfer_off', ecm)
|
||||
interfer_off(ecm, unit_instance)
|
||||
else:
|
||||
send_ecm(ecm, unit_instance)
|
||||
signaller.emit_signal('fs_update_color', ecms)
|
||||
@@ -382,7 +394,7 @@ func on_interfer_create(interfer_name, sel_threats, fs_arr, power, u, ecms) -> v
|
||||
for ecm in ecms.values():
|
||||
if ecm.nmfs == item.nmfs:
|
||||
if item.priority > ecm.priority:
|
||||
signaller.emit_signal('interfer_off', ecm)
|
||||
interfer_off(ecm, u)
|
||||
elif item.priority < ecm.priority:
|
||||
need_continue = true
|
||||
break
|
||||
@@ -496,6 +508,7 @@ func interfer_create(u, interfer_name, ecms, param, kni, id, dict, source_interf
|
||||
func send_ecm(ecm, unit0) -> void:
|
||||
if ecm.krp != INTERFER_OFF:
|
||||
if not ecm.modulation:
|
||||
ecm.svk = 0
|
||||
call_deferred('emit_signal', 'interfer_update', ecm)
|
||||
return
|
||||
msg6_num += 1
|
||||
@@ -503,17 +516,17 @@ func send_ecm(ecm, unit0) -> void:
|
||||
unit0.tx_stack.append(json_data)
|
||||
|
||||
|
||||
func on_interfer_off_all(_unit0, ecms: Dictionary) -> void:
|
||||
func on_interfer_off_all(unit0, ecms: Dictionary) -> void:
|
||||
for ecm in ecms.values():
|
||||
signaller.emit_signal('interfer_off', ecm)
|
||||
interfer_off(ecm, unit0)
|
||||
|
||||
|
||||
func on_threats_lost(th, ecms, _unit0) -> void:
|
||||
func on_threats_lost(th, ecms, unit0) -> void:
|
||||
for key in interfer.thrs:
|
||||
if interfer.thrs[key] == th.id:
|
||||
var ecm_id = key
|
||||
var ecm = ecms[ecm_id]
|
||||
signaller.emit_signal('interfer_off', ecm)
|
||||
interfer_off(ecm, unit0)
|
||||
|
||||
|
||||
func pop_id() -> int:
|
||||
@@ -646,19 +659,13 @@ func get_krp(threat: threats.Threat):
|
||||
return krp
|
||||
|
||||
|
||||
func on_interfer_off(ecm: Interfer, ecms, unit_caps):
|
||||
func on_interfer_off(ecm: Interfer, _ecms, unit_caps):
|
||||
ecm.krp = INTERFER_OFF
|
||||
send_ecm(ecm, unit_caps)
|
||||
if not unit_caps.online:
|
||||
var sz = ecms.size()
|
||||
signaller.emit_signal('on_prog_ecm_off', ecm)
|
||||
ecms.erase(ecm.ispp)
|
||||
thrs.erase(ecm.ispp)
|
||||
cu.erase(ecm.ispp)
|
||||
fs.erase(ecm.ispp)
|
||||
push_id(ecm.ispp)
|
||||
if sz != ecms.size():
|
||||
interfer.call_deferred('emit_signal', 'interfer_resized', ecms)
|
||||
|
||||
|
||||
func interfer_off(ecm, _unit_caps):
|
||||
signaller.emit_signal('interfer_off', ecm)
|
||||
|
||||
|
||||
func on_interfer_new(ecm, unit_caps):
|
||||
|
||||
@@ -405,7 +405,7 @@ func _process(_delta: float) -> void:
|
||||
var sock: = send_sockets[unit_name]
|
||||
var dst_port: = dst_ports[unit_name]
|
||||
var dst_addr: = dst_addrs[unit_name]
|
||||
while (Error.OK == unit_udptx.process(tick)):
|
||||
while Error.OK == unit_udptx.process(tick):
|
||||
var tx_data: = unit_udptx.tx_data.slice(0, unit_udptx.tx_len)
|
||||
sock.send_to([dst_addr, dst_port], tx_data)
|
||||
for unit_name: StringName in units_udprx:
|
||||
|
||||
@@ -2,8 +2,6 @@ extends Node
|
||||
|
||||
enum PrdState {WORK, CONTROL}
|
||||
|
||||
const TIME_YAU07_SEND = 50
|
||||
|
||||
## Границы секторов блоков ФС по частоте в режиме РТО.
|
||||
const FS_BAND_RTO: Dictionary = {
|
||||
0: [200.0, 250.0],
|
||||
@@ -121,9 +119,6 @@ class Fs:
|
||||
var freq_caps_rx: float = 0.0 ## Частота принятая от КАПС РПБ
|
||||
var width_caps_rx: float = 0.0 ## Ширина полосы принятая от КАПС РПБ
|
||||
var msvk: Array
|
||||
var ready: bool = false ## Готовность сектора к излучению
|
||||
var caps_online: bool = false ## Состояние связи с КАПС РПБ
|
||||
var yau_07_online: bool = false ## Состояние связи ЯУ-07
|
||||
|
||||
signal update_modulation(index)
|
||||
|
||||
@@ -154,9 +149,6 @@ class Fs:
|
||||
data_arr.append(um_port)
|
||||
data_arr.append(val)
|
||||
|
||||
# Установка готовности модуля ФС к излучению
|
||||
func set_ready():
|
||||
ready = isg and caps_online and yau_07_online
|
||||
|
||||
class PRD:
|
||||
enum STATE_DEVICE {
|
||||
@@ -216,6 +208,7 @@ class PRD:
|
||||
if port == fs.um_port:
|
||||
fs.um_code_rx = u.isa_ports[port] & 0x7
|
||||
|
||||
|
||||
func on_line_changed(unit_ems):
|
||||
if not unit_ems.online:
|
||||
yemsg_board.ems_load = yemsg_board.LoadState.NOT_DEFINED
|
||||
@@ -310,13 +303,11 @@ class PRD:
|
||||
break
|
||||
return STATE_DEVICE.NONE if all_online else STATE_DEVICE.ERROR
|
||||
|
||||
|
||||
func execute_cmd():
|
||||
var time_now = Time.get_ticks_msec()
|
||||
if (time_now - unit_yau07.time_tx) < TIME_YAU07_SEND: return
|
||||
if not len(cmd_array): return
|
||||
if unit_yau07.cmd_state != unit_yau07.CmdState.DONE: return
|
||||
var cmd: Array = cmd_array.pop_front()
|
||||
unit_yau07.time_tx = time_now
|
||||
unit_yau07.send_isa(cmd[0], cmd[1])
|
||||
|
||||
func start_load():
|
||||
@@ -347,16 +338,14 @@ class PRD:
|
||||
yemsg_board.set_wait()
|
||||
log.error('Не удалось прочитать файл настроек ячейки ЭМС-Г %s' %abs_dir)
|
||||
|
||||
|
||||
func on_update_modulation(index):
|
||||
yemsg_board.add_cmd(index/4, fs_dic[index].modulation)
|
||||
|
||||
func set_um(data_arr):
|
||||
cmd_array.append([unit_yau07.CmdCode.WRITE_ISA, data_arr])
|
||||
|
||||
func set_fs_caps_online(caps_online: bool):
|
||||
for fs in fs_dic.values():
|
||||
fs.caps_online = caps_online
|
||||
fs.set_ready()
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
check_dir()
|
||||
@@ -364,7 +353,6 @@ func _ready() -> void:
|
||||
var unit_prd = network.get_unit_instance(prd_name)
|
||||
var new_prd = PRD.new(prd_name, unit_prd)
|
||||
prd_dict[prd_name] = new_prd
|
||||
new_prd.unit_yau07.connect('line_changed', on_yau07_line_changed.bind(new_prd))
|
||||
var unit_control = TestPRD.new({'unit_prd': unit_prd}, new_prd.cmd_array)
|
||||
add_child(unit_control)
|
||||
new_prd.unit_control = unit_control
|
||||
@@ -379,7 +367,6 @@ func _ready() -> void:
|
||||
fs_caps_id[FS_PRD[key][1]] = key
|
||||
var unit_caps = network.get_unit_instance('уарэп-капсрпб')
|
||||
unit_caps.connect('data_received', Callable(self, 'on_data_capsrpb_received'))
|
||||
unit_caps.connect('line_changed', Callable(self, 'on_caps_line_changed'))
|
||||
signaller.connect('режим_контроль', Callable(self, 'on_mode_changed').bind(PrdState.CONTROL))
|
||||
signaller.connect('режим_работа', Callable(self, 'on_mode_changed').bind(PrdState.WORK))
|
||||
var unit_nav = network.get_unit_instance('навигация')
|
||||
@@ -420,7 +407,6 @@ func find_fs_index(aoa: float, freq: int, fs_index_arr: Array):
|
||||
|
||||
## Обновление состояния модулей формирователя сигналов
|
||||
func update_fs_state(ecms, trenaz_mode: bool):
|
||||
var time_now = Time.get_ticks_msec()
|
||||
for fs in fs_dict.values(): ## Запрет модуляции для всех ФС
|
||||
fs.set_modulation(false)
|
||||
for ecm in ecms.values(): ## Выставление состояния помехи в ФС
|
||||
@@ -447,6 +433,7 @@ func update_fs_state(ecms, trenaz_mode: bool):
|
||||
prd_module.set_um(um_data_array)
|
||||
|
||||
|
||||
|
||||
## Проверяет ниличие директории, если их нет, создаёт
|
||||
func check_dir():
|
||||
var dir = DirAccess.open(yemsconsts.emsg_files_folder)
|
||||
@@ -474,7 +461,6 @@ func on_data_capsrpb_received(unit0: capsrpb.CapsRpb):
|
||||
var fs_module = fs_dict[ii]
|
||||
if fs.has('isg'):
|
||||
fs_module.isg = int(fs['isg'])
|
||||
fs_module.set_ready()
|
||||
if fs.has('pow'):
|
||||
fs_module.pow_caps_rx = int(fs['pow'])
|
||||
if fs.has('freq'):
|
||||
@@ -493,16 +479,3 @@ func on_mode_changed(changed_mode: int) -> void:
|
||||
|
||||
func on_navi_data_received(data: Dictionary):
|
||||
course = data.get('k', 0.0)
|
||||
|
||||
|
||||
func on_caps_line_changed(unit_caps):
|
||||
for pribor_prd in prd_dict.values():
|
||||
pribor_prd.set_fs_caps_online(unit_caps.online)
|
||||
signaller.emit_signal('fs_update_state', fs_dict)
|
||||
|
||||
|
||||
func on_yau07_line_changed(unit_yau07, prd_pribor):
|
||||
for fs in prd_pribor.fs_dic.values():
|
||||
fs.yau_07_online = unit_yau07.online
|
||||
fs.set_ready()
|
||||
signaller.emit_signal('fs_update_state', fs_dict)
|
||||
|
||||
@@ -14,7 +14,7 @@ const PROGRESS_RAY_STATES: float = 50.0
|
||||
const PROGRESS_COMPLETE: float = 100.0
|
||||
|
||||
## Константы для работы с лучами управления
|
||||
const COUNT_PACK_POWER_RECIEVE = 10
|
||||
const COUNT_PACK_POWER_RECIEVE = 15
|
||||
const RAY_MASK = 0x07
|
||||
const SPECIAL_LITERAS = [3, 5, 7]
|
||||
const RAY_m5: String = 'RAY_m5'
|
||||
@@ -160,7 +160,7 @@ var current_status: String = 'Ожидание запуска контроля'
|
||||
## Сигналы класса
|
||||
signal control_is_over(device_name: String) # Когда контроль завершен
|
||||
signal status_updated(status_text: String) # Сигнал для обновления статуса
|
||||
signal control_results_updated(control_results: Dictionary) # Обновление результатов контроля
|
||||
signal control_results_updated(control_results: Dictionary) # Обновление результатов контроля
|
||||
signal update_progress(progress_value: float) # Обновление статуса выполнения контроля
|
||||
signal update_max_value_progress(max_progress_value: int) # Установка максимального значения для прогресс бара
|
||||
|
||||
|
||||
@@ -41,7 +41,6 @@ class YaU07 extends unit.Unit:
|
||||
var isa_block: = {} ## Результат выполнения команды "читать массив из порта"
|
||||
var flash_data: = PackedByteArray() ## Данные прочитанные из Flash
|
||||
var flash_len: = 0 ## Длинна данных прочитанных из Flash
|
||||
var time_tx: int = 0 ## Время последней отправки команды
|
||||
|
||||
|
||||
func _to_string() -> String: return String('яу07: %s %s' % [self.name, ['отключен', 'на связи'][int(online)]])
|
||||
@@ -304,24 +303,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
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[gd_scene load_steps=2 format=3 uid="uid://pd3fcx55duj2"]
|
||||
|
||||
[ext_resource type="Texture2D" uid="uid://bw3yv3smvaxqn" path="res://table/nine-patch.png" id="1_ik10p"]
|
||||
[ext_resource type="Texture2D" uid="uid://vqajxsh5xamt" path="res://data/nine-patch.png" id="1_ik10p"]
|
||||
|
||||
[node name="NinePatchRect" type="NinePatchRect"]
|
||||
offset_right = 17.0
|
||||
|
||||
@@ -281,7 +281,7 @@ func check_event_pos(event_pos: Vector2, obj: Control):
|
||||
|
||||
|
||||
##
|
||||
func setselector_color_proc(instance: Object, function: String) -> void:
|
||||
func set_selector_color_proc(instance: Object, function: String) -> void:
|
||||
selector_color_proc = Callable(instance, function)
|
||||
_assert(selector_color_proc.is_valid())
|
||||
|
||||
@@ -391,13 +391,17 @@ func add_row(row_types: Array) -> void:
|
||||
add_child(node)
|
||||
if allow_set_size:
|
||||
node.custom_minimum_size.x = columns_min_size[i_col]
|
||||
node.size.x = columns_min_size[i_col]
|
||||
node.set_deferred('size', Vector2(columns_min_size[i_col], node.size.y))
|
||||
nodes[node_key] = node
|
||||
var conn = Callable(self, '_on_focus_entered').bind(node)
|
||||
node.connect('focus_entered', conn)
|
||||
set_node_meta(i_col, i_row, 'callable_focus_entered', conn)
|
||||
|
||||
|
||||
func _set_size_x_defered(node: Control, val: Vector2):
|
||||
node.size = val
|
||||
|
||||
|
||||
##
|
||||
func _on_focus_entered(node):
|
||||
var indexes = get_key_indexes(node.name)
|
||||
|
||||
8
table/ячейка-цвет.tscn
Normal file
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
|
||||
Reference in New Issue
Block a user