Compare commits
123 Commits
sasha
...
83549ec2a3
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
83549ec2a3 | ||
|
|
d198989ad2 | ||
|
|
d2f4c8017c | ||
|
|
e261ada3cd | ||
|
|
98d0ed1457 | ||
|
|
a06df2b832 | ||
|
|
2919b0174f | ||
|
|
7788a664b5 | ||
|
|
f4a6a4d465 | ||
|
|
1a72187683 | ||
|
|
ace3d2abbf | ||
|
|
0ab38309db | ||
|
|
cf89c1b1c9 | ||
|
|
55cfd32f66 | ||
|
|
5e10632fb6 | ||
|
|
44275fe92d | ||
|
|
1e0d10761a | ||
|
|
97b608a306 | ||
|
|
83aa1e3ac0 | ||
|
|
c244fc70ec | ||
|
|
dac0c55204 | ||
|
|
0f15c2f62c | ||
|
|
bbe15797ba | ||
|
|
72975500c7 | ||
|
|
906f01fd7a | ||
|
|
f37578d0bc | ||
|
|
3dc406431b | ||
|
|
3d9ed1a149 | ||
| c160d84ae6 | |||
|
|
964d41b822 | ||
|
|
af90c48694 | ||
|
|
8a06ab5fc9 | ||
|
|
d65dc6d0dc | ||
|
|
57f9494ad4 | ||
|
|
449b3d6e8c | ||
|
|
e7a240bc8a | ||
|
|
a2255610b5 | ||
|
|
57e7e0cc0b | ||
|
|
76a079dd23 | ||
|
|
fa84118149 | ||
|
|
ff85c6f80a | ||
|
|
a680537a1b | ||
|
|
63d6643475 | ||
|
|
cd39124daa | ||
|
|
8d3b80cf4c | ||
|
|
76ef0d4ac6 | ||
|
|
0292d2ef71 | ||
|
|
cda50a0e07 | ||
|
|
3a4a2c1eca | ||
|
|
a48d45d0b5 | ||
|
|
5b69f0f53f | ||
|
|
ea3509ffb0 | ||
|
|
3136fba978 | ||
|
|
40f0ac7ade | ||
|
|
3d161fd37f | ||
|
|
358fd20f53 | ||
|
|
f517066638 | ||
|
|
ffc1cd4c32 | ||
|
|
9b28fe1352 | ||
|
|
0a11dac42a | ||
|
|
f9e00e3976 | ||
|
|
bbb119017c | ||
|
|
2ca8e591e7 | ||
|
|
cd72001881 | ||
|
|
802ac0afd7 | ||
|
|
ef33862d37 | ||
|
|
0d67b086ba | ||
|
|
3b5bf2ce2c | ||
|
|
45c19973af | ||
|
|
7e3f1bfb81 | ||
|
|
f50810a152 | ||
|
|
fb6ea53d3c | ||
|
|
88e0ea58ab | ||
|
|
857d2a9f9d | ||
|
|
814f013da1 | ||
|
|
5d40fc1e1b | ||
|
|
69a72ae993 | ||
|
|
a8e7a1c6aa | ||
|
|
bbd3f9aa7f | ||
|
|
f2034a0edd | ||
|
|
b274a655cd | ||
|
|
36811852fc | ||
|
|
4057da3b75 | ||
|
|
304a8c6453 | ||
|
|
c9304134ca | ||
|
|
94f5159ad9 | ||
|
|
9a8763a9d7 | ||
|
|
788a62505f | ||
|
|
c8e67775a0 | ||
|
|
3073d49715 | ||
|
|
e2237742b4 | ||
|
|
f34984872e | ||
|
|
c0018044a5 | ||
|
|
cdb884f18d | ||
|
|
2f4ee7be3c | ||
|
|
e7076354b4 | ||
|
|
b44b0aafd1 | ||
|
|
cb1637e21c | ||
|
|
115004194b | ||
|
|
9156249e74 | ||
|
|
b3322ee591 | ||
|
|
9be115a535 | ||
|
|
92ff74efef | ||
|
|
4ea8a4c254 | ||
|
|
55253b0915 | ||
|
|
6dc31afa15 | ||
|
|
bd78e1010d | ||
|
|
426da5ff04 | ||
|
|
b69eaa29d9 | ||
|
|
c74d5ccdad | ||
|
|
a7c816e6ca | ||
|
|
f89540dfdc | ||
|
|
723f6535ac | ||
|
|
c45842266a | ||
|
|
64703c46dc | ||
|
|
b022e9e418 | ||
|
|
428831d83f | ||
|
|
021eba8a08 | ||
|
|
3030eac0c9 | ||
|
|
b7fa8cca66 | ||
|
|
5dac4fae5e | ||
|
|
02f8a6a8c5 | ||
|
|
9e74a67e86 |
10
README.md
10
README.md
@@ -1,12 +1,12 @@
|
||||
# Разработка
|
||||
|
||||
- После клонирования запустить скрипт `git-hooks-config.sh`
|
||||
- В среде **Windows** запуск скрипта `git-hooks-config.sh` производить из оболочки `git bash`
|
||||
- При необходимости обновить `settings.json`
|
||||
- После клонирования запустить скрипт [`git-hooks-config.sh`](git-hooks-config.sh)
|
||||
- В среде **Windows** запуск скрипта [`git-hooks-config.sh`](git-hooks-config.sh) производить из оболочки `git bash`
|
||||
- При необходимости обновить [`settings.json`](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/dev-manual).
|
||||
|
||||
# Ссылки на составные части
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
|
||||
# Сборка исполняемого файла из консоли
|
||||
|
||||
- Запустить скрипт `build.sh`
|
||||
- Запустить скрипт [`build.sh`](build.sh)
|
||||
|
||||
# Взаимодействие с 5П-28
|
||||
|
||||
|
||||
84
config/banned_ranges.json
Normal file
84
config/banned_ranges.json
Normal file
@@ -0,0 +1,84 @@
|
||||
{
|
||||
"ranges": [
|
||||
{
|
||||
"max": 404993123,
|
||||
"min": 402777013
|
||||
},
|
||||
{
|
||||
"max": 488584484,
|
||||
"min": 420111389
|
||||
},
|
||||
{
|
||||
"max": 559113065,
|
||||
"min": 549071634
|
||||
},
|
||||
{
|
||||
"max": 590394020,
|
||||
"min": 581828010
|
||||
},
|
||||
{
|
||||
"max": 671113646,
|
||||
"min": 661072214
|
||||
},
|
||||
{
|
||||
"max": 825534007,
|
||||
"min": 784914374
|
||||
},
|
||||
{
|
||||
"max": 964027611,
|
||||
"min": 931531905
|
||||
},
|
||||
{
|
||||
"max": 1097550064,
|
||||
"min": 1076907893
|
||||
},
|
||||
{
|
||||
"max": 1217532686,
|
||||
"min": 1173668071
|
||||
},
|
||||
{
|
||||
"max": 1529745530,
|
||||
"min": 1500072408
|
||||
},
|
||||
{
|
||||
"max": 1790501904,
|
||||
"min": 1703047870
|
||||
},
|
||||
{
|
||||
"max": 1903884888,
|
||||
"min": 1798093759
|
||||
},
|
||||
{
|
||||
"max": 1982005472,
|
||||
"min": 1917112535
|
||||
},
|
||||
{
|
||||
"max": 2174813389,
|
||||
"min": 2103855925
|
||||
},
|
||||
{
|
||||
"max": 2397985516,
|
||||
"min": 2299661838
|
||||
},
|
||||
{
|
||||
"max": 2696028220,
|
||||
"min": 2594107498
|
||||
},
|
||||
{
|
||||
"max": 3627192359,
|
||||
"min": 3576902218
|
||||
},
|
||||
{
|
||||
"max": 5215200272,
|
||||
"min": 5186186730
|
||||
},
|
||||
{
|
||||
"max": 5397018474,
|
||||
"min": 5255819232
|
||||
},
|
||||
{
|
||||
"max": 5967607190,
|
||||
"min": 5944388619
|
||||
}
|
||||
]
|
||||
}
|
||||
3454
config/complex.json
Normal file
3454
config/complex.json
Normal file
File diff suppressed because it is too large
Load Diff
15
config/service_config.ini
Normal file
15
config/service_config.ini
Normal file
@@ -0,0 +1,15 @@
|
||||
[MP550]
|
||||
host=192.168.11.105
|
||||
port=42023
|
||||
transmit_interval_ms=100
|
||||
|
||||
[RDMP]
|
||||
host=127.0.0.1
|
||||
port=55000
|
||||
identity=MP550Service
|
||||
keep_alive_interval_ms=9000
|
||||
|
||||
[Service]
|
||||
autorun=false
|
||||
host=192.168.11.102
|
||||
port=42022
|
||||
34
data/2разъединение.png.import
Normal file
34
data/2разъединение.png.import
Normal file
@@ -0,0 +1,34 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://cwfdur4we51wo"
|
||||
path="res://.godot/imported/2разъединение.png-a5736ca86ce553a4d764d6fc09130f8a.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://data/2разъединение.png"
|
||||
dest_files=["res://.godot/imported/2разъединение.png-a5736ca86ce553a4d764d6fc09130f8a.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
34
data/2соединение.png.import
Normal file
34
data/2соединение.png.import
Normal file
@@ -0,0 +1,34 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://bajrbvv7twq7m"
|
||||
path="res://.godot/imported/2соединение.png-b014241f07700023165f09936094354c.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://data/2соединение.png"
|
||||
dest_files=["res://.godot/imported/2соединение.png-b014241f07700023165f09936094354c.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
@@ -4,19 +4,6 @@
|
||||
|
||||
[resource]
|
||||
fallbacks = Array[Font]([ExtResource("1_cxid7")])
|
||||
cache/0/17/0/ascent = 0.0
|
||||
cache/0/17/0/descent = 0.0
|
||||
cache/0/17/0/underline_position = 0.0
|
||||
cache/0/17/0/underline_thickness = 0.0
|
||||
cache/0/17/0/scale = 1.0
|
||||
cache/0/17/0/kerning_overrides/17/0 = Vector2(0, 0)
|
||||
cache/0/17/0/kerning_overrides/16/0 = Vector2(0, 0)
|
||||
cache/0/17/0/kerning_overrides/18/0 = Vector2(0, 0)
|
||||
cache/0/17/0/kerning_overrides/14/0 = Vector2(0, 0)
|
||||
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/16/0/ascent = 0.0
|
||||
cache/0/16/0/descent = 0.0
|
||||
cache/0/16/0/underline_position = 0.0
|
||||
@@ -30,6 +17,24 @@ 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
|
||||
cache/0/17/0/underline_thickness = 0.0
|
||||
cache/0/17/0/scale = 1.0
|
||||
cache/0/17/0/kerning_overrides/17/0 = Vector2(0, 0)
|
||||
cache/0/17/0/kerning_overrides/16/0 = Vector2(0, 0)
|
||||
cache/0/17/0/kerning_overrides/18/0 = Vector2(0, 0)
|
||||
cache/0/17/0/kerning_overrides/14/0 = Vector2(0, 0)
|
||||
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/18/0/ascent = 0.0
|
||||
cache/0/18/0/descent = 0.0
|
||||
cache/0/18/0/underline_position = 0.0
|
||||
@@ -113,8 +118,3 @@ 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
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://b1dw06ahtftq2"
|
||||
uid="uid://csxruavk0s40l"
|
||||
path="res://.godot/imported/Окно частот0.png-79ada2e7504614b9bdf58bce1aff61fb.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
|
||||
BIN
data/Передатчик.png
Normal file
BIN
data/Передатчик.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.9 KiB |
34
data/Передатчик.png.import
Normal file
34
data/Передатчик.png.import
Normal file
@@ -0,0 +1,34 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://c73tjrn8gr00o"
|
||||
path="res://.godot/imported/Передатчик.png-a9919ed2f6d748be55f63a536bcda2ff.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://data/Передатчик.png"
|
||||
dest_files=["res://.godot/imported/Передатчик.png-a9919ed2f6d748be55f63a536bcda2ff.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
BIN
data/Приёмник.png
Normal file
BIN
data/Приёмник.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.3 KiB |
34
data/Приёмник.png.import
Normal file
34
data/Приёмник.png.import
Normal file
@@ -0,0 +1,34 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://c6etralq2tvxg"
|
||||
path="res://.godot/imported/Приёмник.png-37dec39ffb59b71e3909414fe8f5fd1e.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://data/Приёмник.png"
|
||||
dest_files=["res://.godot/imported/Приёмник.png-37dec39ffb59b71e3909414fe8f5fd1e.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://bymxiptkbufvs"
|
||||
uid="uid://fuhhvsa5um4m"
|
||||
path="res://.godot/imported/Скруглённый квадрат серый.png-2111d7338e52a03a41f05d6ffbbc3eb6.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
|
||||
BIN
data/Состояние РЭС 2.png
Normal file
BIN
data/Состояние РЭС 2.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.8 KiB |
34
data/Состояние РЭС 2.png.import
Normal file
34
data/Состояние РЭС 2.png.import
Normal file
@@ -0,0 +1,34 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://6ar7sux3vcv1"
|
||||
path="res://.godot/imported/Состояние РЭС 2.png-7acd4e8d9bd67ea07a3eadee4b22c22d.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://data/Состояние РЭС 2.png"
|
||||
dest_files=["res://.godot/imported/Состояние РЭС 2.png-7acd4e8d9bd67ea07a3eadee4b22c22d.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
BIN
data/Состояние РЭС 4.png
Normal file
BIN
data/Состояние РЭС 4.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.1 KiB |
34
data/Состояние РЭС 4.png.import
Normal file
34
data/Состояние РЭС 4.png.import
Normal file
@@ -0,0 +1,34 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://b85f1ne2wrwhg"
|
||||
path="res://.godot/imported/Состояние РЭС 4.png-d46f69e8c351fe747cf68bce4af4b8eb.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://data/Состояние РЭС 4.png"
|
||||
dest_files=["res://.godot/imported/Состояние РЭС 4.png-d46f69e8c351fe747cf68bce4af4b8eb.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
BIN
data/Угловой квадрат3.png
Normal file
BIN
data/Угловой квадрат3.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.2 KiB |
34
data/Угловой квадрат3.png.import
Normal file
34
data/Угловой квадрат3.png.import
Normal file
@@ -0,0 +1,34 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://docnrxrm2f022"
|
||||
path="res://.godot/imported/Угловой квадрат3.png-7973b0c96861e98d72e8e1ea32d59204.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://data/Угловой квадрат3.png"
|
||||
dest_files=["res://.godot/imported/Угловой квадрат3.png-7973b0c96861e98d72e8e1ea32d59204.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
34
data/разъединение.png.import
Normal file
34
data/разъединение.png.import
Normal file
@@ -0,0 +1,34 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://b0wa068b6gl1y"
|
||||
path="res://.godot/imported/разъединение.png-285b8ee2e2b500484829beae0ee4e16b.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://data/разъединение.png"
|
||||
dest_files=["res://.godot/imported/разъединение.png-285b8ee2e2b500484829beae0ee4e16b.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
BIN
data/связь.png
Normal file
BIN
data/связь.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.4 KiB |
34
data/связь.png.import
Normal file
34
data/связь.png.import
Normal file
@@ -0,0 +1,34 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://blx6c1o1nogks"
|
||||
path="res://.godot/imported/связь.png-dc3eae4c11f71101d4ba94487cecfaaa.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://data/связь.png"
|
||||
dest_files=["res://.godot/imported/связь.png-dc3eae4c11f71101d4ba94487cecfaaa.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
34
data/соединение.png.import
Normal file
34
data/соединение.png.import
Normal file
@@ -0,0 +1,34 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://bf1e2xlk3x1aw"
|
||||
path="res://.godot/imported/соединение.png-aac09e55b0c5d57ef3c31c34daaf336b.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://data/соединение.png"
|
||||
dest_files=["res://.godot/imported/соединение.png-aac09e55b0c5d57ef3c31c34daaf336b.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
@@ -22,7 +22,7 @@ script_export_mode=0
|
||||
|
||||
custom_template/debug=""
|
||||
custom_template/release=""
|
||||
debug/export_console_wrapper=2
|
||||
debug/export_console_wrapper=0
|
||||
binary_format/embed_pck=true
|
||||
texture_format/s3tc_bptc=true
|
||||
texture_format/etc2_astc=false
|
||||
|
||||
@@ -29,7 +29,6 @@ interfer/default_color0=Color(0.38, 0.47, 0.51, 1)
|
||||
interfer/default_color1=Color(0.39, 0.44, 0.5, 1)
|
||||
interfer/select_color=Color(1, 1, 1, 1)
|
||||
interfer/interfer_color=Color(0.9, 0.1, 0.25, 0.9)
|
||||
interfer/resend_timeout=1000.0
|
||||
config/external_cu=false
|
||||
config/unit_rr_request_period=20.0
|
||||
config/kems_files_path="user://kems/"
|
||||
@@ -38,6 +37,64 @@ config/settings_path="user://settings.json"
|
||||
config/unit_bpo_request_period=20.0
|
||||
interfer/emit_color=Color(0.9, 0.1, 0.25, 0.5)
|
||||
interfer/closed_sectors=Color(0, 0, 0, 1)
|
||||
"config/Адрес АФСП левого борта"=""
|
||||
"config/Адрес АФСП правого борта"=""
|
||||
"config/Адрес БПО левого борта"=""
|
||||
"config/Адрес БПО правого борта"=""
|
||||
"config/Виртуальная клавиатура"=false
|
||||
"config/Включить работу по своим целям"=true
|
||||
"config/Внешнее указание Трасса"=false
|
||||
"config/Внешнее управление"=false
|
||||
"config/Кнопка «JTIDS»"=false
|
||||
"config/Кнопка «К1»"=false
|
||||
"config/Кнопка «КУПД»"=false
|
||||
"config/Кнопка «ЛЧМ-1»"=false
|
||||
"config/Кнопка «МЧМ-1»"=false
|
||||
"config/Кнопка «ОЗП-1»"=false
|
||||
"config/Кнопка «ОРН-И1»"=false
|
||||
"config/Кнопка «ОРН-М2»"=false
|
||||
"config/Кнопка «ОРН»"=false
|
||||
"config/Кнопка «ПД-М2»"=false
|
||||
"config/Кнопка «ПД-М4»"=false
|
||||
"config/Кнопка «ПД-М4С»"=false
|
||||
"config/Кнопка «ПД-ЧМ»"=false
|
||||
"config/Кнопка «Подавление»"=false
|
||||
"config/Кнопка «СВ-И1»"=false
|
||||
"config/Кнопка «СВ-М2»"=false
|
||||
"config/Ограниченный режим"=false
|
||||
"config/Отладка контроля"=false
|
||||
"config/Период опроса состояния АФСП, секунды"=""
|
||||
"config/Период опроса состояния БПО, секунды"=""
|
||||
"config/Скрыть вкладку ЭМС 2"=true
|
||||
"config/Список своих протоколов"=""
|
||||
"config/Текущая версия ПО УАРЭП"="master 3bff1cd Tue Nov 4 15:33:24 2025 +0300"
|
||||
"config/Цвет кнопки \"Подавление\""="[0.972549021244049,0.0117647061124444,0.423529416322708,1.0]"
|
||||
"config/Цвет схемы"="[0.972549021244049,0.0117647061124444,0.0274509806185961,1.0]"
|
||||
"config/Цвет фона схемы"="[0.0941176488995552,0.149019613862038,1.0,1.0]"
|
||||
"config/Шаблон адреса сервера карт"="https://tile.openstreetmap.org/{z}/{x}/{y}.png"
|
||||
"config/навигация"=["*", 60000, true, true]
|
||||
"config/уарэп-5п28"=["127.0.0.1", 50777]
|
||||
"config/уарэп-капсрпб"=["127.0.0.1", "127.0.0.1", 42023, 42022, false, true]
|
||||
"config/уарэп-спт25-1"=["/home/user/tty0", 0, 19200, "N", 8, 1]
|
||||
"config/уарэп-спт25-2"=["/home/user/tty1", 0, 19200, "N", 8, 1]
|
||||
"config/уарэп-трасса"=["192.168.11.34", "192.168.11.105", 50200, 10004, false, true]
|
||||
"config/уарэп-щ3"=["/home/user/tty3", 7, 19200, "N", 8, 1, 50000]
|
||||
"config/уарэп-эмс"=["10.1.1.52", 50052, false, false]
|
||||
"config/уарэп-яу07-1в"=["10.1.1.12", 50012, false, false]
|
||||
"config/уарэп-яу07-1к"=["10.1.1.13", 50013, false, false]
|
||||
"config/уарэп-яу07-1н"=["10.1.1.11", 50011, false, false]
|
||||
"config/уарэп-яу07-2в"=["10.1.1.22", 50022, false, false]
|
||||
"config/уарэп-яу07-2к"=["10.1.1.23", 50023, false, false]
|
||||
"config/уарэп-яу07-2н"=["10.1.1.21", 50021, false, false]
|
||||
"config/уарэп-яу07-3в"=["10.1.1.32", 50032, false, false]
|
||||
"config/уарэп-яу07-3к"=["10.1.1.33", 50033, false, false]
|
||||
"config/уарэп-яу07-3н"=["10.1.1.31", 50031, false, false]
|
||||
"config/уарэп-яу07-4в"=["10.1.1.42", 50042, false, false]
|
||||
"config/уарэп-яу07-4к"=["10.1.1.43", 50043, false, false]
|
||||
"config/уарэп-яу07-4н"=["10.1.1.41", 50041, false, false]
|
||||
"config/уарэп-яу07-общий"=["*", 50000, true, true]
|
||||
"config/уарэп-яу07-частный"=["10.1.1.253", 50253, false, true]
|
||||
config/="[0.215686276555061,0.976470589637756,1.0,1.0]"
|
||||
|
||||
[autoload]
|
||||
|
||||
@@ -74,7 +131,6 @@ gdscript/warnings/unassigned_variable_op_assign=2
|
||||
gdscript/warnings/unused_signal=0
|
||||
gdscript/warnings/shadowed_variable=2
|
||||
gdscript/warnings/shadowed_variable_base_class=2
|
||||
gdscript/warnings/shadowed_global_identifier=2
|
||||
gdscript/warnings/unsafe_cast=1
|
||||
gdscript/warnings/assert_always_true=2
|
||||
gdscript/warnings/assert_always_false=2
|
||||
@@ -90,6 +146,7 @@ window/subwindows/embed_subwindows=false
|
||||
window/frame_pacing/android/enable_frame_pacing=false
|
||||
window/stretch/mode="canvas_items"
|
||||
window/dpi/allow_hidpi=false
|
||||
window/vsync/vsync_mode=0
|
||||
|
||||
[editor]
|
||||
|
||||
@@ -206,9 +263,9 @@ common/enable_object_picking=false
|
||||
|
||||
[rendering]
|
||||
|
||||
renderer/rendering_method="gl_compatibility"
|
||||
renderer/rendering_method.mobile="gl_compatibility"
|
||||
shader_compiler/shader_cache/strip_debug=true
|
||||
textures/default_filters/anisotropic_filtering_level=0
|
||||
anti_aliasing/screen_space_roughness_limiter/enabled=false
|
||||
quality/driver/fallback_to_gles2=true
|
||||
|
||||
[shader_globals]
|
||||
@@ -217,3 +274,7 @@ tick_curent={
|
||||
"type": "int",
|
||||
"value": 0
|
||||
}
|
||||
random_value={
|
||||
"type": "float",
|
||||
"value": 0.0
|
||||
}
|
||||
|
||||
@@ -61,8 +61,8 @@ script = ExtResource("1_ui6sg")
|
||||
visible = false
|
||||
z_as_relative = false
|
||||
layout_mode = 2
|
||||
border_color = Color(0, 0.549509, 0.921779, 1)
|
||||
border_width = 5.0
|
||||
border_color = Color(0.0941176, 0.0941176, 0.698039, 1)
|
||||
border_width = 10.0
|
||||
editor_only = false
|
||||
|
||||
[node name="back" type="Sprite2D" parent="."]
|
||||
|
||||
@@ -37,6 +37,12 @@ var _pressed: = false
|
||||
$button.set_text(val)
|
||||
|
||||
|
||||
@export var btn_tooltip: String = '':
|
||||
set(val):
|
||||
btn_tooltip = val
|
||||
$button.set_tooltip_text(val)
|
||||
|
||||
|
||||
@export var disabled: bool = false:
|
||||
set(val):
|
||||
disabled = val
|
||||
|
||||
@@ -1,44 +1,59 @@
|
||||
class_name Diagram extends Sprite2D
|
||||
class_name Diagram extends ColorRect
|
||||
|
||||
const NUM_OF_RANGE = 7
|
||||
const NUM_OF_DIRECTIONS = 4
|
||||
var fs_default_colors: Array[Color] ## Цвета по умолчанию для блоков ФС.
|
||||
const ANTS_COUNT: = 28
|
||||
const ANT_COLOR: = Color(0.38, 0.47, 0.51, 1.0)
|
||||
|
||||
@export var ant_color: Color = ANT_COLOR
|
||||
@export var SecZap: PackedScene
|
||||
@export var inner_radius_0: = 0.36 ## Внутренний радиус диаграммы в режиме РТО
|
||||
@export var inner_radius_1: = 0.855 ## Внутренний радиус диаграммы в обзора
|
||||
|
||||
var fs_default_colors: PackedColorArray ## Цвета по умолчанию для блоков ФС
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
signaller.connect('map_mode_changed', Callable(self, 'set_view_mode'))
|
||||
set_def_colors()
|
||||
ProjectSettings.connect('settings_changed', _on_settings_changed)
|
||||
_on_settings_changed()
|
||||
_init_def_colors()
|
||||
set_band_colors(fs_default_colors)
|
||||
|
||||
|
||||
func sv(val: float) -> float: return val / ($строб.scale.x / 2.0) * 0.125
|
||||
|
||||
func set_canvas_rotation(val: float) -> void: material.set('shader_parameter/rotation', val)
|
||||
func set_strob_visible(val: bool): $строб.visible = val
|
||||
func set_strob_center(val: Vector2): $строб.position = val
|
||||
func set_strob_dir(val: float): $строб.set_instance_shader_parameter('dir', val)
|
||||
func set_strob_width(val: float): $строб.set_instance_shader_parameter('width', val)
|
||||
func set_strob_band(val: float): $строб.set_instance_shader_parameter('band', val / 125.0)
|
||||
func set_strob_radius(val: float): $строб.set_instance_shader_parameter('radius', sv(val))
|
||||
func set_strob_color(val: Color): $строб.set_instance_shader_parameter('color', val)
|
||||
func set_band_failures(val: PackedInt32Array): material.set('shader_parameter/ant_band_m', val)
|
||||
func set_canvas_rotation(val: float): material.set('shader_parameter/rotation', val)
|
||||
func set_radius_inner_frac(val: float): material.set('shader_parameter/inner_radius', val)
|
||||
func set_strob_band(val: float): $строб.set_instance_shader_parameter('band', val / 125.0)
|
||||
func set_strob_center(val: Vector2): $строб.position = val
|
||||
func set_strob_color(val: Color): $строб.set_instance_shader_parameter('color', val)
|
||||
func set_strob_dir(val: float): $строб.set_instance_shader_parameter('dir', val)
|
||||
func set_strob_radius(val: float): $строб.set_instance_shader_parameter('radius', sv(val))
|
||||
func set_strob_visible(val: bool): $строб.visible = val
|
||||
func set_strob_width(val: float): $строб.set_instance_shader_parameter('width', val)
|
||||
|
||||
func get_strob_center() -> Vector2: return $строб.position
|
||||
func get_strob_visible() -> bool: return $строб.visible
|
||||
func get_strob_dir() -> float: return $строб.get_instance_shader_parameter('dir')
|
||||
func get_strob_width() -> float: return $строб.get_instance_shader_parameter('width')
|
||||
func get_strob_band() -> float: return $строб.get_instance_shader_parameter('band') * 125.0
|
||||
func get_strob_radius() -> float: return $строб.get_instance_shader_parameter('radius') * 125.0
|
||||
func get_strob_color() -> float: return $строб.get_instance_shader_parameter('color')
|
||||
func get_band_colors(_val: Array): return material.get('shader_parameter/ant_band_c')
|
||||
func get_band_failures(_val: Array): return material.get('shader_parameter/ant_band_m')
|
||||
func get_canvas_rotation() -> float: return material.get('shader_parameter/rotation')
|
||||
func get_radius_outter() -> float: return size.x / scale.x
|
||||
func get_radius_inner_frac() -> float: return material.get('shader_parameter/inner_radius')
|
||||
func get_strob_band() -> float: return $строб.get_instance_shader_parameter('band') * 125.0
|
||||
func get_strob_center() -> Vector2: return $строб.position
|
||||
func get_strob_color() -> float: return $строб.get_instance_shader_parameter('color')
|
||||
func get_strob_dir() -> float: return $строб.get_instance_shader_parameter('dir')
|
||||
func get_strob_radius() -> float: return $строб.get_instance_shader_parameter('radius') * 125.0
|
||||
func get_strob_visible() -> bool: return $строб.visible
|
||||
func get_strob_width() -> float: return $строб.get_instance_shader_parameter('width')
|
||||
|
||||
func get_canvas_rotation() -> float: return material.get('shader_parameter/rotation')
|
||||
func get_radius_outter() -> float: return material.get('shader_parameter/radius_outter')
|
||||
func get_radius_inner_0() -> float: return material.get('shader_parameter/radius_inner_0')
|
||||
func get_radius_inner_1() -> float: return material.get('shader_parameter/radius_inner_1')
|
||||
|
||||
func get_band_colors(_val: Array): return material.get('shader_parameter/ant_band_c')
|
||||
func get_band_failures(_val: Array): return material.get('shader_parameter/ant_band_m')
|
||||
func set_band_colors(val: Array): material.set('shader_parameter/ant_band_c', val)
|
||||
func set_band_failures(val: Array): material.set('shader_parameter/ant_band_m', val)
|
||||
## Выставляет цвета для секторов
|
||||
func set_band_colors(val: PackedColorArray):
|
||||
var image: = Image.create(val.size(), 1, false, Image.FORMAT_RGBA8)
|
||||
for x in val.size():
|
||||
image.set_pixel(x, 0, val[x])
|
||||
var tex: = ImageTexture.create_from_image(image)
|
||||
material.set('shader_parameter/sec_colors', tex)
|
||||
|
||||
|
||||
## Добавляет сектор запрета[br]
|
||||
## [param id] - Индекс сектора запрета.[br]
|
||||
@@ -82,35 +97,28 @@ func set_seczap(id: int, szv: Vector4):
|
||||
|
||||
func clear_all_seczap():
|
||||
for child in get_children():
|
||||
if child.name.begins_with("SECZAP"):
|
||||
if child.name.begins_with('SECZAP'):
|
||||
remove_child(child)
|
||||
child.queue_free()
|
||||
|
||||
|
||||
func set_seczap_color(id: int, color: Color):
|
||||
func set_seczap_color(id: int, c: Color):
|
||||
var seczap: = get_node('SECZAP%d' % id)
|
||||
seczap.set_instance_shader_parameter('color', color)
|
||||
seczap.set_instance_shader_parameter('color', c)
|
||||
|
||||
|
||||
func set_view_mode(val: int):
|
||||
if val == 1:
|
||||
$строб.hide()
|
||||
else:
|
||||
$строб.show()
|
||||
material.set('shader_parameter/mode', val)
|
||||
var inner_radius = inner_radius_1 if val == 1 else inner_radius_0
|
||||
material.set('shader_parameter/inner_radius', inner_radius)
|
||||
|
||||
|
||||
func _on_settings_changed():
|
||||
ant_color = ProjectSettings.get_setting('application/interfer/ant_color', ANT_COLOR)
|
||||
ant_color *= Color(1.0, 1.0, 1.0, 0.0)
|
||||
|
||||
|
||||
## Закрашивание по умолчанию блоков ФС цветами из настроек.
|
||||
func set_def_colors():
|
||||
var color0: Color = ProjectSettings.get_setting('application/interfer/default_color0', Color(0.38, 0.47, 0.51, 1.0))
|
||||
var color1: Color = ProjectSettings.get_setting('application/interfer/default_color1', Color(0.39, 0.44, 0.50, 1.0))
|
||||
color0 *= Color(1.0, 1.0, 1.0, 0.0)
|
||||
color1 *= Color(1.0, 1.0, 1.0, 0.0)
|
||||
var col_arr: Array = [color0, color1]
|
||||
var col = false
|
||||
for i in NUM_OF_RANGE:
|
||||
for j in NUM_OF_DIRECTIONS:
|
||||
fs_default_colors.append(col_arr[int(col)])
|
||||
col = not col
|
||||
col = not col
|
||||
set_band_colors(fs_default_colors)
|
||||
func _init_def_colors():
|
||||
fs_default_colors.clear()
|
||||
for i in ANTS_COUNT:
|
||||
fs_default_colors.append(ant_color)
|
||||
|
||||
@@ -1,25 +1,39 @@
|
||||
[gd_scene load_steps=7 format=3 uid="uid://b5kjdyxuwsot5"]
|
||||
|
||||
[ext_resource type="Material" uid="uid://s6xe8igevnv2" path="res://shaders/antenas.tres" id="1_newdt"]
|
||||
[ext_resource type="Shader" uid="uid://dhipoo0ju5ebg" path="res://shaders/antenas.gdshader" id="1_8cjpq"]
|
||||
[ext_resource type="Script" uid="uid://b85scuflwlqom" path="res://scenes/diagram/diagram.gd" id="2_8xjuy"]
|
||||
[ext_resource type="PackedScene" uid="uid://c73ahpv8uiuc7" path="res://scenes/diagram/sector.tscn" id="3_tgnog"]
|
||||
[ext_resource type="Shader" uid="uid://k36g8tww5yo" path="res://shaders/sector.gdshader" id="4_obn6s"]
|
||||
|
||||
[sub_resource type="PlaceholderTexture2D" id="PlaceholderTexture2D_2bft1"]
|
||||
size = Vector2(1600, 1200)
|
||||
[sub_resource type="ShaderMaterial" id="ShaderMaterial_oqtdt"]
|
||||
shader = ExtResource("1_8cjpq")
|
||||
shader_parameter/grid_cells_angle = 4
|
||||
shader_parameter/grid_layers_radius = 7
|
||||
shader_parameter/alpha = 0.5
|
||||
shader_parameter/inner_radius = 0.36
|
||||
shader_parameter/outer_radius = 1.0
|
||||
shader_parameter/grid_line_width = 0.0025
|
||||
shader_parameter/rotation = 0.0
|
||||
shader_parameter/ffr = 0.15
|
||||
shader_parameter/sfr = 0.0
|
||||
shader_parameter/pfr = 0.015
|
||||
shader_parameter/afr = 0.0
|
||||
shader_parameter/ant_band_m = PackedInt32Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
|
||||
|
||||
[sub_resource type="ShaderMaterial" id="ShaderMaterial_lniyv"]
|
||||
resource_local_to_scene = true
|
||||
shader = ExtResource("4_obn6s")
|
||||
|
||||
[node name="canvas" type="Sprite2D"]
|
||||
material = ExtResource("1_newdt")
|
||||
texture = SubResource("PlaceholderTexture2D_2bft1")
|
||||
centered = false
|
||||
[node name="canvas" type="ColorRect"]
|
||||
texture_filter = 1
|
||||
material = SubResource("ShaderMaterial_oqtdt")
|
||||
offset_right = 560.0
|
||||
offset_bottom = 560.0
|
||||
scale = Vector2(2, 2)
|
||||
script = ExtResource("2_8xjuy")
|
||||
SecZap = ExtResource("3_tgnog")
|
||||
|
||||
[node name="строб" parent="." instance=ExtResource("3_tgnog")]
|
||||
material = SubResource("ShaderMaterial_lniyv")
|
||||
position = Vector2(560, 560)
|
||||
scale = Vector2(1100, 1100)
|
||||
position = Vector2(280, 280)
|
||||
scale = Vector2(560, 560)
|
||||
|
||||
@@ -57,6 +57,7 @@ size_flags_vertical = 3
|
||||
tooltip_text = "Включает принудительную помеху"
|
||||
strips_rotation = 15.0
|
||||
text = "СРН"
|
||||
btn_tooltip = "Включает подавление радионавигации"
|
||||
metadata/rfi_name = "srn"
|
||||
|
||||
[node name="btn_jtids" parent="grd_forced" groups=["группа-принудительно"] instance=ExtResource("4_7ys3c")]
|
||||
@@ -64,8 +65,10 @@ editor_description = "Кнопка для принудительного вкл
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
tooltip_text = "Включает подавление каналов связи типа JTIDS"
|
||||
strips_rotation = 15.0
|
||||
text = "JTIDS"
|
||||
btn_tooltip = "Включает подавление радиосвязи типа JTIDS"
|
||||
metadata/rfi_name = "sprs"
|
||||
|
||||
[node name="btn_kupd" parent="grd_forced" groups=["группа-принудительно"] instance=ExtResource("4_7ys3c")]
|
||||
@@ -75,6 +78,7 @@ size_flags_vertical = 3
|
||||
tooltip_text = "Кнопка для принудительного включения группы секторов в режим КУПД"
|
||||
strips_rotation = 15.0
|
||||
text = "КУПД"
|
||||
btn_tooltip = "Включает подавление каналов управления передачи данных"
|
||||
metadata/rfi_name = "kupd"
|
||||
|
||||
[node name="btn_panika" parent="grd_forced" groups=["группа-принудительно"] instance=ExtResource("4_7ys3c")]
|
||||
@@ -84,6 +88,7 @@ size_flags_vertical = 3
|
||||
tooltip_text = "Кнопка для принудительного включения группы секторов в режим КУПД"
|
||||
strips_rotation = 15.0
|
||||
text = "Паника"
|
||||
btn_tooltip = "Включает подавление JTIDS и КУПД"
|
||||
metadata/rfi_name = "<off>"
|
||||
|
||||
[node name="btn_cancel" parent="grd_forced" groups=["прин-секторы-срн"] instance=ExtResource("4_7ys3c")]
|
||||
@@ -92,4 +97,5 @@ size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
strips_rotation = 15.0
|
||||
text = "Очистить"
|
||||
btn_tooltip = "Выключает все сеансы помех"
|
||||
metadata/rfi_name = "<off>"
|
||||
|
||||
@@ -37,7 +37,7 @@ const INTERFER_NAMES = {
|
||||
'k1': 'K1',
|
||||
'svm2': 'СВ-М2',
|
||||
'ozp1': 'ОЗП-1',
|
||||
'eprls': 'ЕПРЛС',}
|
||||
'elrs': 'ЕЛРС' }
|
||||
|
||||
|
||||
## Индексы колонок
|
||||
@@ -119,15 +119,17 @@ func on_interfer_new(ecm, table_index):
|
||||
$table.set_row_editable(i_row, false)
|
||||
$table.set_node_user_data(0, i_row, ecm)
|
||||
table_index[ecm.ispp] = i_row
|
||||
# Будем надеяться, что отложенные вызовы производятся в том же порядке
|
||||
$table.call_deferred('clear_rows_selected')
|
||||
$table.call_deferred('set_row_selected', i_row, true)
|
||||
$table.clear_rows_selected()
|
||||
$table.set_row_selected(i_row, true)
|
||||
if not interfer.auto_enabled:
|
||||
signaller.emit_signal('interfer_selected', ecm)
|
||||
|
||||
|
||||
func on_interfer_off(ecm, table_index):
|
||||
$table.remove_row(table_index[ecm.ispp])
|
||||
if not table_index.has(ecm.ispp):
|
||||
return
|
||||
var i_row = table_index[ecm.ispp]
|
||||
$table.remove_row(i_row)
|
||||
rehash(table_index)
|
||||
var sel_rows: Array
|
||||
$table.get_selected_rows(sel_rows)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -13,6 +13,7 @@ size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
strips_rotation = 30.0
|
||||
text = "Откл."
|
||||
btn_tooltip = "Выключает помеху"
|
||||
disabled = true
|
||||
metadata/rfi_name = "off"
|
||||
|
||||
@@ -22,6 +23,7 @@ size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
strips_rotation = 30.0
|
||||
text = "МЧМ-1"
|
||||
btn_tooltip = "Включает помеху МЧМ-1"
|
||||
disabled = true
|
||||
metadata/rfi_name = "mchm1"
|
||||
|
||||
@@ -31,6 +33,7 @@ size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
strips_rotation = 30.0
|
||||
text = "СРН-И1"
|
||||
btn_tooltip = "Включает помеху СРН-И1"
|
||||
disabled = true
|
||||
metadata/rfi_name = "srni1"
|
||||
|
||||
@@ -40,6 +43,7 @@ size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
strips_rotation = 30.0
|
||||
text = "СРН-М2"
|
||||
btn_tooltip = "Включает помеху СРН-М2"
|
||||
disabled = true
|
||||
metadata/rfi_name = "srnm2"
|
||||
|
||||
@@ -49,6 +53,7 @@ size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
strips_rotation = 30.0
|
||||
text = "СРН-GPS"
|
||||
btn_tooltip = "Включает помеху СРН-GPS"
|
||||
disabled = true
|
||||
metadata/rfi_name = "srngps"
|
||||
|
||||
@@ -58,6 +63,7 @@ size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
strips_rotation = 30.0
|
||||
text = "ПД-М4"
|
||||
btn_tooltip = "Включает помеху МП-М4"
|
||||
disabled = true
|
||||
metadata/rfi_name = "pdm4"
|
||||
|
||||
@@ -67,6 +73,7 @@ size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
strips_rotation = 30.0
|
||||
text = "ПД-М2"
|
||||
btn_tooltip = "Включает помеху МП-М2"
|
||||
disabled = true
|
||||
metadata/rfi_name = "pdm2"
|
||||
|
||||
@@ -76,6 +83,7 @@ size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
strips_rotation = 30.0
|
||||
text = "ЛЧМ-1"
|
||||
btn_tooltip = "Включает помеху ЛЧМ-1"
|
||||
disabled = true
|
||||
metadata/rfi_name = "lchm1"
|
||||
|
||||
@@ -85,6 +93,7 @@ size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
strips_rotation = 30.0
|
||||
text = "ЛЧМ-2"
|
||||
btn_tooltip = "Включает помеху ЛЧМ-2"
|
||||
disabled = true
|
||||
metadata/rfi_name = "lchm2"
|
||||
|
||||
@@ -94,6 +103,7 @@ size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
strips_rotation = 30.0
|
||||
text = "ПД-М4С"
|
||||
btn_tooltip = "Включает помеху ПД-М4C"
|
||||
disabled = true
|
||||
metadata/rfi_name = "pdm4s"
|
||||
|
||||
@@ -103,6 +113,7 @@ size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
strips_rotation = 30.0
|
||||
text = "ПД-ЧМ"
|
||||
btn_tooltip = "Включает помеху ПД-ЧМ"
|
||||
disabled = true
|
||||
metadata/rfi_name = "pdchm"
|
||||
|
||||
@@ -112,6 +123,7 @@ size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
strips_rotation = 30.0
|
||||
text = "СВ-И1"
|
||||
btn_tooltip = "Включает помеху СВ-И1"
|
||||
disabled = true
|
||||
metadata/rfi_name = "svi1"
|
||||
|
||||
@@ -121,6 +133,7 @@ size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
strips_rotation = 30.0
|
||||
text = "K1"
|
||||
btn_tooltip = "Включает помеху К1"
|
||||
disabled = true
|
||||
metadata/rfi_name = "k1"
|
||||
|
||||
@@ -130,6 +143,7 @@ size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
strips_rotation = 30.0
|
||||
text = "СВ-М2"
|
||||
btn_tooltip = "Включает помеху СВ-М2"
|
||||
disabled = true
|
||||
metadata/rfi_name = "svm2"
|
||||
|
||||
@@ -139,6 +153,7 @@ size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
strips_rotation = 30.0
|
||||
text = "ОЗП-1"
|
||||
btn_tooltip = "Включает помеху ОЗП-1"
|
||||
disabled = true
|
||||
metadata/rfi_name = "ozp1"
|
||||
|
||||
@@ -147,6 +162,7 @@ layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
strips_rotation = 30.0
|
||||
text = "ЕРЛС"
|
||||
text = "ЕЛРС"
|
||||
btn_tooltip = "Включает помеху ЕЛРС"
|
||||
disabled = true
|
||||
metadata/rfi_name = "eprls"
|
||||
metadata/rfi_name = "elrs"
|
||||
|
||||
@@ -23,7 +23,6 @@ metadata/DeviceName = &"Устройство РР левого борта"
|
||||
[node name="request" type="HTTPRequest" parent="."]
|
||||
use_threads = true
|
||||
script = ExtResource("2_4vyhj")
|
||||
request_url = null
|
||||
|
||||
[node name="timer" type="Timer" parent="request"]
|
||||
autostart = true
|
||||
|
||||
@@ -23,7 +23,6 @@ metadata/DeviceName = &"Устройство РР правого борта"
|
||||
[node name="request" type="HTTPRequest" parent="."]
|
||||
use_threads = true
|
||||
script = ExtResource("2_miwrd")
|
||||
request_url = null
|
||||
|
||||
[node name="timer" type="Timer" parent="request"]
|
||||
autostart = true
|
||||
|
||||
@@ -10,13 +10,16 @@ class_name pribor_afsp extends 'res://scenes/контроль/прибор.gd'
|
||||
static var json_conv: JSON = JSON.new()
|
||||
static var node_maper = load('res://scenes/контроль/node-maper.gd')
|
||||
var ctrl_pos = 0
|
||||
|
||||
var request_url: Node
|
||||
var time_req: Node
|
||||
# SystemName: "gen" DevList - там состояние связи с генератором по кан шине
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
ProjectSettings.connect('settings_changed', on_settings_chaged)
|
||||
on_settings_chaged()
|
||||
request_url = $request
|
||||
time_req = $request/timer
|
||||
|
||||
|
||||
func on_settings_chaged():
|
||||
|
||||
@@ -202,7 +202,6 @@ fname = "Яч. связи"
|
||||
[node name="request1" type="HTTPRequest" parent="."]
|
||||
use_threads = true
|
||||
script = ExtResource("4_crej3")
|
||||
request_url = null
|
||||
|
||||
[node name="timer" type="Timer" parent="request1"]
|
||||
autostart = true
|
||||
|
||||
@@ -16,11 +16,12 @@ func _ready() -> void:
|
||||
unit_prd_k = prd_k_module.unit_control
|
||||
var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier')
|
||||
for temp in power_amplifier:
|
||||
temp.value1 = -70
|
||||
temp.value1 = -100
|
||||
# Подписываемся на сигналы
|
||||
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)
|
||||
@@ -29,21 +30,17 @@ func _ready() -> void:
|
||||
func _process(_delta: float) -> void:
|
||||
if Engine.is_editor_hint():
|
||||
return
|
||||
set_frame($input_0, unit_prd_k.ems_g_sock_dic.ems_input_1)
|
||||
set_frame($input_1, unit_prd_k.ems_g_sock_dic.ems_input_2)
|
||||
set_frame($input_2, unit_prd_k.ems_g_sock_dic.ems_input_lit_1)
|
||||
set_frame($output_0, unit_prd_k.ems_g_sock_dic.ems_output_1)
|
||||
set_frame($output_1, unit_prd_k.ems_g_sock_dic.ems_output_2)
|
||||
set_frame($output_2, unit_prd_k.ems_g_sock_dic.ems_output_lit_1)
|
||||
|
||||
|
||||
func set_frame(node_frame: Node, val: int): node_frame.set_frame(val)
|
||||
$input_0.set_frame(unit_prd_k.ems_g_sock_dic.ems_input_1)
|
||||
$input_1.set_frame(unit_prd_k.ems_g_sock_dic.ems_input_2)
|
||||
$input_2.set_frame(unit_prd_k.ems_g_sock_dic.ems_input_lit_1)
|
||||
$output_0.set_frame(unit_prd_k.ems_g_sock_dic.ems_output_1)
|
||||
$output_1.set_frame(unit_prd_k.ems_g_sock_dic.ems_output_2)
|
||||
$output_2.set_frame(unit_prd_k.ems_g_sock_dic.ems_output_lit_1)
|
||||
|
||||
|
||||
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)
|
||||
|
||||
@@ -60,12 +57,6 @@ func _enter_tree() -> void:
|
||||
_update_status_text(unit_prd_k.get_current_status())
|
||||
|
||||
|
||||
func _exit_tree() -> void:
|
||||
if Engine.is_editor_hint():
|
||||
return
|
||||
#prd_k_module.cmd_array.append([unit_prd_k.CmdCode.WRITE_ISA, [constants_k.ADDR_UG_LITERA_1, ug_work_1, constants_k.ADDR_UG_LITERA_2, ug_work_2, constants_k.ADDR_UG_LITERA_3, ug_work_3]])
|
||||
|
||||
|
||||
static func temperature_fill(temperature_arr_node: Array, temperature_dic: Dictionary)->void:
|
||||
for i_node_temperature in temperature_arr_node:
|
||||
var temperature_meta: String = i_node_temperature.get_meta('um')
|
||||
@@ -112,31 +103,18 @@ static func power_fill(pow_dic: Dictionary, fs_result: Dictionary, power_amplifi
|
||||
|
||||
|
||||
func on_press_device(_name_davice: String) -> void:
|
||||
var nodes_y5: Array = get_tree().get_nodes_in_group('y-5')
|
||||
var node_ip_power_arr: Array = get_tree().get_nodes_in_group('power_supply')
|
||||
var fs_nodes: Array = get_tree().get_nodes_in_group('fs_group')
|
||||
var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier')
|
||||
var default_reset_array_node: Array = get_tree().get_nodes_in_group('default_reset')
|
||||
var module_fs_1: Node = $kasseta_fs_kd/ref_A2
|
||||
var module_fs_6: Node = $kasseta_fs_kd/ref_A4
|
||||
var dou_6: Node = $dou6_A7
|
||||
var module_fs_7: Node = $kasseta_fs_kd/ref_A7
|
||||
var dou_7: Node = $dou7_A8
|
||||
var control_data: Dictionary = unit_prd_k.get_control_results()
|
||||
var for_control_result: Dictionary = {
|
||||
'nodes_y5': nodes_y5,
|
||||
'node_ip_power_arr': node_ip_power_arr,
|
||||
'fs_nodes': fs_nodes,
|
||||
'power_amplifier': power_amplifier,
|
||||
'default_reset_array_node': default_reset_array_node,
|
||||
'module_fs_1': module_fs_1,
|
||||
'module_fs_6': module_fs_6,
|
||||
'dou_6': dou_6,
|
||||
'module_fs_7': module_fs_7,
|
||||
'dou_7': dou_7,
|
||||
}
|
||||
for_control_result.merge(control_data, true)
|
||||
on_control_result(for_control_result)
|
||||
control_data['nodes_y5'] = get_tree().get_nodes_in_group('y-5')
|
||||
control_data['node_ip_power_arr'] = get_tree().get_nodes_in_group('power_supply')
|
||||
control_data['fs_nodes'] = get_tree().get_nodes_in_group('fs_group')
|
||||
control_data['power_amplifier'] = get_tree().get_nodes_in_group('power_amplifier')
|
||||
control_data['default_reset_array_node'] = get_tree().get_nodes_in_group('default_reset')
|
||||
control_data['module_fs_1'] = $kasseta_fs_kd/ref_A2
|
||||
control_data['module_fs_6'] = $kasseta_fs_kd/ref_A4
|
||||
control_data['dou_6'] = $dou6_A7
|
||||
control_data['module_fs_7'] = $kasseta_fs_kd/ref_A7
|
||||
control_data['dou_7'] = $dou7_A8
|
||||
on_control_result(control_data)
|
||||
|
||||
|
||||
static func on_control_result(for_result_dic: Dictionary) -> void:
|
||||
@@ -160,7 +138,7 @@ static func on_control_result(for_result_dic: Dictionary) -> void:
|
||||
if block_ip_config_k.has(meta_ip) and block_kasseta_y5_prd_config_k.ug and block_kasseta_y5_prd_config_k.yau07:
|
||||
power_supply.state = STATE_VAL.GOOD if block_ip_config_k[meta_ip][1] else STATE_VAL.ERROR
|
||||
else:
|
||||
power_supply.state = STATE_VAL.NONE
|
||||
power_supply.state = STATE_VAL.NONE
|
||||
# Проверяем состояние после установки
|
||||
if power_supply.state == STATE_VAL.ERROR:
|
||||
all_y5_good = false
|
||||
@@ -169,6 +147,7 @@ static func on_control_result(for_result_dic: Dictionary) -> void:
|
||||
set_default_state(for_result_dic.default_reset_array_node)
|
||||
set_default_state(for_result_dic.power_amplifier)
|
||||
return
|
||||
|
||||
var result_dic: Dictionary = for_result_dic.result_dic
|
||||
for f in for_result_dic.fs_nodes:
|
||||
var fs_meta: String = f.get_meta('fs')
|
||||
@@ -196,16 +175,16 @@ static func on_control_result(for_result_dic: Dictionary) -> void:
|
||||
|
||||
func find_labels(node1: Node):
|
||||
if node1 is Label:
|
||||
if node1.name in ["lbl_rname", "rname"]:
|
||||
if not node1.has_meta("tooltip_set"):
|
||||
if node1.name in ['lbl_rname', 'rname']:
|
||||
if not node1.has_meta('tooltip_set'):
|
||||
ctrl_pos += 1
|
||||
var box_number = ceili(float(ctrl_pos) / 10.0)
|
||||
var position_number = ctrl_pos % 10
|
||||
if position_number == 0:
|
||||
position_number = 10
|
||||
node1.tooltip_text = "Ящик - %d, Позиция - %d" % [box_number, position_number]
|
||||
node1.tooltip_text = 'Ящик - %d, Позиция - %d' % [box_number, position_number]
|
||||
node1.mouse_filter = Control.MOUSE_FILTER_STOP
|
||||
node1.set_meta("tooltip_set", true)
|
||||
node1.set_meta('tooltip_set', true)
|
||||
for child in node1.get_children():
|
||||
find_labels(child)
|
||||
|
||||
@@ -217,12 +196,12 @@ func _on_status_updated(status_text: String) -> void:
|
||||
func _update_status_text(text: String) -> void:
|
||||
$control_result.text = text
|
||||
# Можно добавить смену цвета в зависимости от статуса
|
||||
if "Ошибка" in text or "неисправен" in text:
|
||||
if 'Ошибка' in text or 'неисправен' in text:
|
||||
$control_result.add_theme_color_override('font_color', Color.RED)
|
||||
log.message(Logger.INFO, 'Прибор ПРД-%s неисправен' % [unit_prd_k.self_name])
|
||||
elif "Ограничена" in text or "Предупреждение" in text:
|
||||
elif 'Ограничена' in text or 'Предупреждение' in text:
|
||||
$control_result.add_theme_color_override('font_color', Color.YELLOW)
|
||||
elif "исправен" in text or "завершён" in text:
|
||||
elif 'исправен' in text or 'завершён' in text:
|
||||
$control_result.add_theme_color_override('font_color', Color.GREEN)
|
||||
log.message(Logger.INFO, 'Прибор ПРД-%s исправен' % [unit_prd_k.self_name])
|
||||
else:
|
||||
|
||||
@@ -16,11 +16,12 @@ func _ready() -> void:
|
||||
unit_prd_n = prd_n_module.unit_control
|
||||
var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier')
|
||||
for temp in power_amplifier:
|
||||
temp.value1 = -70
|
||||
temp.value1 = -100
|
||||
# Подписываемся на сигналы
|
||||
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)
|
||||
@@ -29,13 +30,10 @@ func _ready() -> void:
|
||||
func _process(_delta: float) -> void:
|
||||
if Engine.is_editor_hint():
|
||||
return
|
||||
set_frame($input_0, unit_prd_n.ems_g_sock_dic.ems_input_1)
|
||||
set_frame($input_1, unit_prd_n.ems_g_sock_dic.ems_input_2)
|
||||
set_frame($output_0, unit_prd_n.ems_g_sock_dic.ems_output_1)
|
||||
set_frame($output_1, unit_prd_n.ems_g_sock_dic.ems_output_2)
|
||||
|
||||
|
||||
func set_frame(node_frame: Node, val: int): node_frame.set_frame(val)
|
||||
$input_0.set_frame(unit_prd_n.ems_g_sock_dic.ems_input_1)
|
||||
$input_1.set_frame(unit_prd_n.ems_g_sock_dic.ems_input_2)
|
||||
$output_0.set_frame(unit_prd_n.ems_g_sock_dic.ems_output_1)
|
||||
$output_1.set_frame(unit_prd_n.ems_g_sock_dic.ems_output_2)
|
||||
|
||||
|
||||
func _on_start_control() -> void:
|
||||
@@ -43,7 +41,6 @@ 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)
|
||||
|
||||
@@ -60,12 +57,6 @@ func _enter_tree() -> void:
|
||||
_update_status_text(unit_prd_n.get_current_status())
|
||||
|
||||
|
||||
func _exit_tree() -> void:
|
||||
if Engine.is_editor_hint():
|
||||
return
|
||||
#prd_n_module.cmd_array.append([unit_prd_n.CmdCode.WRITE_ISA, [constants_n.ADDR_UG_LITERA_1, ug_work_1, constants_n.ADDR_UG_LITERA_2, ug_work_2]])
|
||||
|
||||
|
||||
static func temperature_fill(temperature_arr_node: Array, temperature_dic: Dictionary)->void:
|
||||
for i_node_temperature in temperature_arr_node:
|
||||
var temperature_meta: String = i_node_temperature.get_meta('um')
|
||||
@@ -150,7 +141,7 @@ static func on_control_result(for_result_dic: Dictionary) -> void:
|
||||
if block_ip_config_n.has(meta_ip) and block_kasseta_y5_prd_config_n.ug and block_kasseta_y5_prd_config_n.yau07:
|
||||
power_supply.state = STATE_VAL.GOOD if block_ip_config_n[meta_ip][1] else STATE_VAL.ERROR
|
||||
else:
|
||||
power_supply.state = STATE_VAL.NONE
|
||||
power_supply.state = STATE_VAL.NONE
|
||||
# Проверяем состояние после установки
|
||||
if power_supply.state == STATE_VAL.ERROR:
|
||||
all_y5_good = false
|
||||
@@ -182,16 +173,16 @@ static func on_control_result(for_result_dic: Dictionary) -> void:
|
||||
|
||||
func find_labels(node1: Node):
|
||||
if node1 is Label:
|
||||
if node1.name in ["lbl_rname", "rname"]:
|
||||
if not node1.has_meta("tooltip_set"):
|
||||
if node1.name in ['lbl_rname', 'rname']:
|
||||
if not node1.has_meta('tooltip_set'):
|
||||
ctrl_pos += 1
|
||||
var box_number = ceili(float(ctrl_pos) / 10.0)
|
||||
var position_number = ctrl_pos % 10
|
||||
if position_number == 0:
|
||||
position_number = 10
|
||||
node1.tooltip_text = "Ящик - %d, Позиция - %d" % [box_number, position_number]
|
||||
node1.tooltip_text = 'Ящик - %d, Позиция - %d' % [box_number, position_number]
|
||||
node1.mouse_filter = Control.MOUSE_FILTER_STOP
|
||||
node1.set_meta("tooltip_set", true)
|
||||
node1.set_meta('tooltip_set', true)
|
||||
for child in node1.get_children():
|
||||
find_labels(child)
|
||||
|
||||
@@ -203,12 +194,12 @@ func _on_status_updated(status_text: String) -> void:
|
||||
func _update_status_text(text: String) -> void:
|
||||
$control_result.text = text
|
||||
# Можно добавить смену цвета в зависимости от статуса
|
||||
if "Ошибка" in text or "неисправен" in text:
|
||||
if 'Ошибка' in text or 'неисправен' in text:
|
||||
$control_result.add_theme_color_override('font_color', Color.RED)
|
||||
log.message(Logger.INFO, 'Прибор ПРД-%s неисправен' % [unit_prd_n.self_name])
|
||||
elif "Ограничена" in text or "Предупреждение" in text:
|
||||
elif 'Ограничена' in text or 'Предупреждение' in text:
|
||||
$control_result.add_theme_color_override('font_color', Color.YELLOW)
|
||||
elif "исправен" in text or "завершён" in text:
|
||||
elif 'исправен' in text or 'завершён' in text:
|
||||
$control_result.add_theme_color_override('font_color', Color.GREEN)
|
||||
log.message(Logger.INFO, 'Прибор ПРД-%s исправен' % [unit_prd_n.self_name])
|
||||
else:
|
||||
|
||||
@@ -16,11 +16,12 @@ func _ready() -> void:
|
||||
unit_prd_v = prd_v_module.unit_control
|
||||
var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier')
|
||||
for temp in power_amplifier:
|
||||
temp.value1 = -70
|
||||
temp.value1 = -100
|
||||
# Подписываемся на сигналы
|
||||
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)
|
||||
@@ -29,13 +30,10 @@ func _ready() -> void:
|
||||
func _process(_delta: float) -> void:
|
||||
if Engine.is_editor_hint():
|
||||
return
|
||||
set_frame($input_0, unit_prd_v.ems_g_sock_dic.ems_input_1)
|
||||
set_frame($input_1, unit_prd_v.ems_g_sock_dic.ems_input_2)
|
||||
set_frame($output_0, unit_prd_v.ems_g_sock_dic.ems_output_1)
|
||||
set_frame($output_1, unit_prd_v.ems_g_sock_dic.ems_output_2)
|
||||
|
||||
|
||||
func set_frame(node_frame: Node, val: int): node_frame.set_frame(val)
|
||||
$input_0.set_frame(unit_prd_v.ems_g_sock_dic.ems_input_1)
|
||||
$input_1.set_frame(unit_prd_v.ems_g_sock_dic.ems_input_2)
|
||||
$output_0.set_frame(unit_prd_v.ems_g_sock_dic.ems_output_1)
|
||||
$output_1.set_frame(unit_prd_v.ems_g_sock_dic.ems_output_2)
|
||||
|
||||
|
||||
func _on_start_control() -> void:
|
||||
@@ -43,7 +41,6 @@ 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)
|
||||
|
||||
@@ -60,11 +57,6 @@ func _enter_tree() -> void:
|
||||
_update_status_text(unit_prd_v.get_current_status())
|
||||
|
||||
|
||||
func _exit_tree() -> void:
|
||||
if Engine.is_editor_hint():
|
||||
return
|
||||
|
||||
|
||||
static func temperature_fill(temperature_arr_node: Array, temperature_dic: Dictionary)->void:
|
||||
for i_node_temperature in temperature_arr_node:
|
||||
var temperature_meta: String = i_node_temperature.get_meta('um')
|
||||
@@ -178,16 +170,16 @@ static func on_control_result(for_result_dic: Dictionary) -> void:
|
||||
|
||||
func find_labels(node1: Node):
|
||||
if node1 is Label:
|
||||
if node1.name in ["lbl_rname", "rname"]:
|
||||
if not node1.has_meta("tooltip_set"):
|
||||
if node1.name in ['lbl_rname', 'rname']:
|
||||
if not node1.has_meta('tooltip_set'):
|
||||
ctrl_pos += 1
|
||||
var box_number = ceili(float(ctrl_pos) / 10.0)
|
||||
var position_number = ctrl_pos % 10
|
||||
if position_number == 0:
|
||||
position_number = 10
|
||||
node1.tooltip_text = "Ящик - %d, Позиция - %d" % [box_number, position_number]
|
||||
node1.tooltip_text = 'Ящик - %d, Позиция - %d' % [box_number, position_number]
|
||||
node1.mouse_filter = Control.MOUSE_FILTER_STOP
|
||||
node1.set_meta("tooltip_set", true)
|
||||
node1.set_meta('tooltip_set', true)
|
||||
for child in node1.get_children():
|
||||
find_labels(child)
|
||||
|
||||
@@ -199,12 +191,12 @@ func _on_status_updated(status_text: String) -> void:
|
||||
func _update_status_text(text: String) -> void:
|
||||
$control_result.text = text
|
||||
# Можно добавить смену цвета в зависимости от статуса
|
||||
if "Ошибка" in text or "неисправен" in text:
|
||||
if 'Ошибка' in text or 'неисправен' in text:
|
||||
$control_result.add_theme_color_override('font_color', Color.RED)
|
||||
log.message(Logger.INFO, 'Прибор ПРД-%s неисправен' % [unit_prd_v.self_name])
|
||||
elif "Ограничена" in text or "Предупреждение" in text:
|
||||
elif 'Ограничена' in text or 'Предупреждение' in text:
|
||||
$control_result.add_theme_color_override('font_color', Color.YELLOW)
|
||||
elif "исправен" in text or "завершён" in text:
|
||||
elif 'исправен' in text or 'завершён' in text:
|
||||
$control_result.add_theme_color_override('font_color', Color.GREEN)
|
||||
log.message(Logger.INFO, 'Прибор ПРД-%s исправен' % [unit_prd_v.self_name])
|
||||
else:
|
||||
|
||||
@@ -1,126 +1,116 @@
|
||||
@tool
|
||||
class_name pribor_uf extends 'res://scenes/контроль/прибор.gd'
|
||||
|
||||
signal control_is_over(device_name: String) # Когда контроль завершен
|
||||
enum STATE_VAL {NONE = 0, GOOD = 1, ERROR = 2}
|
||||
const DEV_LIST: Array = ['00:1f.6', '07:00.0', '08:00.0', '0b:00.0']
|
||||
const USB_TRACKERBALL: String = '13ba:0018'
|
||||
const REVFF: String = '(rev ff)'
|
||||
var unit_uf: Object
|
||||
var uf_control: Object
|
||||
var ctrl_pos = 100
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
if Engine.is_editor_hint(): return
|
||||
signaller.conn(signaller.start_contol_device, Callable(self, '_on_start_contol_device'))
|
||||
unit_uf = network.get_unit_instance('уарэп-эмс')
|
||||
unit_uf.connect('line_changed', on_line_changed)
|
||||
on_line_changed()
|
||||
#control_vk()
|
||||
control_ems(unit_uf.status)
|
||||
status_uf()
|
||||
uf_control = get_parent().uf_control
|
||||
signaller.connect('update_uf_serviceability', on_update_uf_serviceability)
|
||||
var uf_status = uf_control.get_current_status()
|
||||
control_ems(uf_status)
|
||||
find_labels(self)
|
||||
|
||||
|
||||
func _on_start_contol_device():
|
||||
on_line_changed()
|
||||
control_ems(unit_uf.status) # проверка ЭМС ячеек
|
||||
status_uf() # отслеживание состояния прибора
|
||||
func on_update_uf_serviceability(_state: int):
|
||||
control_ems(uf_control.get_current_status())
|
||||
|
||||
|
||||
func on_line_changed():
|
||||
if unit_uf.online: # проверка ЯУ, внутреннего коммутатора и ИП-5Б
|
||||
#func control_vk() -> void:
|
||||
#var out_usb_str = ''
|
||||
#var out_pci_str = ''
|
||||
#var out_usb = []
|
||||
#var out_pci = []
|
||||
#
|
||||
#OS.execute('lsusb', [], out_usb) # TODO: Не переносимое, платформозависимое
|
||||
#for element in out_usb:
|
||||
#out_usb_str += element
|
||||
#
|
||||
#OS.execute('lspci', [], out_pci) # TODO: Не переносимое, платформозависимое
|
||||
#for element in out_pci:
|
||||
#out_pci_str += element
|
||||
#
|
||||
#out_usb_str = out_usb_str.split('\n')
|
||||
#out_pci_str = out_pci_str.split('\n')
|
||||
#
|
||||
#var i: int = 0
|
||||
#
|
||||
#for string in out_usb_str:
|
||||
#if USB_TRACKERBALL in string:
|
||||
#i += 1
|
||||
#break
|
||||
#for string in out_pci_str:
|
||||
#for item in DEV_LIST:
|
||||
#if item in string:
|
||||
#i += 1
|
||||
#if REVFF in string:
|
||||
#i -= 1
|
||||
#break
|
||||
#
|
||||
#if i == (DEV_LIST.size() + 1):
|
||||
#$ref_uf/ref_bu1/ref_A8_BU.state = STATE_VAL.GOOD
|
||||
#else:
|
||||
#$ref_uf/ref_bu1/ref_A8_BU.state = STATE_VAL.ERROR
|
||||
|
||||
|
||||
func control_ems(status: Dictionary) -> void:
|
||||
if status['УФ-онлайн']:
|
||||
$ref_uf/ref_kassetav13/ref_A7_YAU07.state = STATE_VAL.GOOD
|
||||
$ref_uf/ref_kassetav13/ref_A3_IP5B.state = STATE_VAL.GOOD
|
||||
$ref_uf/ref_bu1/ref_A8_BU.state = STATE_VAL.GOOD
|
||||
$ref_uf/ref_kassetav13/ref_A9_ESW.state = STATE_VAL.GOOD
|
||||
$ref_uf/ref_bu1/ref_A8_BU.state = STATE_VAL.GOOD ## заглушка для зеленения ВК-110
|
||||
$ref_uf/ref_kassetav13/ref_A4_KEMS.state = STATE_VAL.GOOD if status['КЭМС-Б1'] else STATE_VAL.ERROR
|
||||
$ref_uf/ref_kassetav13/ref_A5_EMS.state = STATE_VAL.GOOD if status['ЭМС-Б1'] else STATE_VAL.ERROR
|
||||
$ref_uf/ref_kassetav13/ref_A6_EMS.state = STATE_VAL.GOOD if status['ЭМС-Б2'] else STATE_VAL.ERROR
|
||||
$ref_uf/ref_kassetav13/ref_A12_IP27B.state = STATE_VAL.GOOD if status['ИП220-27Б'] else STATE_VAL.ERROR
|
||||
else:
|
||||
$ref_uf/ref_kassetav13/ref_A7_YAU07.state = STATE_VAL.ERROR
|
||||
$ref_uf/ref_kassetav13/ref_A3_IP5B.state = STATE_VAL.NONE
|
||||
$ref_uf/ref_bu1/ref_A8_BU.state = STATE_VAL.NONE
|
||||
$ref_uf/ref_kassetav13/ref_A9_ESW.state = STATE_VAL.NONE
|
||||
$ref_uf/ref_kassetav13/ref_A4_KEMS.state = STATE_VAL.NONE
|
||||
$ref_uf/ref_kassetav13/ref_A5_EMS.state = STATE_VAL.NONE
|
||||
$ref_uf/ref_kassetav13/ref_A6_EMS.state = STATE_VAL.NONE
|
||||
$ref_uf/ref_kassetav13/ref_A3_IP5B.state = STATE_VAL.NONE
|
||||
$ref_uf/ref_kassetav13/ref_A9_ESW.state = STATE_VAL.NONE
|
||||
$ref_uf/ref_kassetav13/ref_A12_IP27B.state = STATE_VAL.NONE
|
||||
$ref_uf/ref_bu1/ref_A8_BU.state = STATE_VAL.NONE
|
||||
status_uf(status)
|
||||
|
||||
|
||||
func control_vk() -> void:
|
||||
var out_usb_str = ''
|
||||
var out_pci_str = ''
|
||||
var out_usb = []
|
||||
var out_pci = []
|
||||
|
||||
OS.execute('lsusb', [], out_usb) # TODO: Не переносимое, платформозависимое
|
||||
for element in out_usb:
|
||||
out_usb_str += element
|
||||
|
||||
OS.execute('lspci', [], out_pci) # TODO: Не переносимое, платформозависимое
|
||||
for element in out_pci:
|
||||
out_pci_str += element
|
||||
|
||||
out_usb_str = out_usb_str.split('\n')
|
||||
out_pci_str = out_pci_str.split('\n')
|
||||
|
||||
var i: int = 0
|
||||
|
||||
for string in out_usb_str:
|
||||
if USB_TRACKERBALL in string:
|
||||
i += 1
|
||||
break
|
||||
for string in out_pci_str:
|
||||
for item in DEV_LIST:
|
||||
if item in string:
|
||||
i += 1
|
||||
if REVFF in string:
|
||||
i -= 1
|
||||
break
|
||||
|
||||
if i == (DEV_LIST.size() + 1):
|
||||
$ref_uf/ref_bu1/ref_A8_BU.state = STATE_VAL.GOOD
|
||||
else:
|
||||
$ref_uf/ref_bu1/ref_A8_BU.state = STATE_VAL.ERROR
|
||||
|
||||
|
||||
func control_ems(status: Array) -> void:
|
||||
if status:
|
||||
$ref_uf/ref_kassetav13/ref_A4_KEMS.state = STATE_VAL.GOOD if ((status[0] >> 0) & 1) and ((status[0] >> 3) & 1) else STATE_VAL.ERROR
|
||||
$ref_uf/ref_kassetav13/ref_A5_EMS.state = STATE_VAL.GOOD if ((status[0] >> 1) & 1) and ((status[0] >> 4) & 1) else STATE_VAL.ERROR
|
||||
$ref_uf/ref_kassetav13/ref_A6_EMS.state = STATE_VAL.GOOD if ((status[0] >> 2) & 1) and ((status[0] >> 5) & 1) else STATE_VAL.ERROR
|
||||
$ref_uf/ref_kassetav13/ref_A12_IP27B.state = STATE_VAL.GOOD if ((status[2] >> 6) & 1) else STATE_VAL.ERROR
|
||||
|
||||
|
||||
func status_uf() -> void:
|
||||
var status_bu: int = $ref_uf/ref_bu1/ref_A8_BU.state
|
||||
var status_yau: int = $ref_uf/ref_kassetav13/ref_A7_YAU07.state
|
||||
var status_kyems: int = $ref_uf/ref_kassetav13/ref_A4_KEMS.state
|
||||
var status_yems0: int = $ref_uf/ref_kassetav13/ref_A5_EMS.state
|
||||
var status_yems1: int = $ref_uf/ref_kassetav13/ref_A6_EMS.state
|
||||
var status_ip5: int = $ref_uf/ref_kassetav13/ref_A3_IP5B.state
|
||||
var status_ip27: int = $ref_uf/ref_kassetav13/ref_A12_IP27B.state
|
||||
|
||||
if (status_yau == 1) and (status_bu == 1) and (status_kyems == 1) \
|
||||
and (status_yems0 == 1) and (status_yems1 == 1) and (status_ip5 == 1) and (status_ip27 == 1):
|
||||
$lbl_header2.text = 'Прибор исправен'
|
||||
$lbl_header2.modulate = Color.GREEN
|
||||
else:
|
||||
$lbl_header2.text = 'Прибор неисправен'
|
||||
$lbl_header2.modulate = Color.RED
|
||||
func status_uf(status_uf_dic: Dictionary) -> void:
|
||||
var is_ok: bool = true
|
||||
if not status_uf_dic['УФ-онлайн']:
|
||||
$lbl_header2.text = 'Ожидание связи с ЯУ-07Б'
|
||||
$lbl_header2.modulate = Color.WHITE
|
||||
elif status_uf_dic['УФ-онлайн']:
|
||||
for socket in status_uf_dic:
|
||||
if not status_uf_dic[socket]:
|
||||
is_ok = false
|
||||
if is_ok:
|
||||
$lbl_header2.text = 'Прибор исправен'
|
||||
$lbl_header2.modulate = Color.GREEN
|
||||
elif not is_ok:
|
||||
$lbl_header2.text = 'Прибор неисправен'
|
||||
$lbl_header2.modulate = Color.RED
|
||||
$lbl_header2.visible = true
|
||||
emit_signal('control_is_over', unit_uf.name)
|
||||
|
||||
|
||||
func find_labels(node1: Node):
|
||||
if node1 is Label:
|
||||
if node1.name in ["lbl_rname", "rname"]:
|
||||
if not node1.has_meta("tooltip_set"):
|
||||
if node1.name in ['lbl_rname', 'rname']:
|
||||
if not node1.has_meta('tooltip_set'):
|
||||
ctrl_pos += 1
|
||||
var box_number = ceili(float(ctrl_pos) / 10.0)
|
||||
var position_number = ctrl_pos % 10
|
||||
if position_number == 0:
|
||||
position_number = 10
|
||||
node1.tooltip_text = "Ящик - %d, Позиция - %d" % [box_number, position_number]
|
||||
node1.tooltip_text = 'Ящик - %d, Позиция - %d' % [box_number, position_number]
|
||||
node1.mouse_filter = Control.MOUSE_FILTER_STOP
|
||||
node1.set_meta("tooltip_set", true)
|
||||
node1.set_meta('tooltip_set', true)
|
||||
for child in node1.get_children():
|
||||
find_labels(child)
|
||||
|
||||
93
scenes/pribor-uf/uf-ctl.gd
Normal file
93
scenes/pribor-uf/uf-ctl.gd
Normal file
@@ -0,0 +1,93 @@
|
||||
class_name UFControl extends Node
|
||||
|
||||
signal update_uf_serviceability(status: int)
|
||||
|
||||
#region Константы и переменные
|
||||
enum StatusIndex {SOCKETS = 0, IP_220_27B = 2}
|
||||
enum STATE_VAL {NONE = 0, GOOD = 1, ERROR = 2}
|
||||
var unit_uf: Object
|
||||
var uf_status: Dictionary = {'УФ-онлайн': false, 'КЭМС-Б1': false, 'ЭМС-Б1': false, 'ЭМС-Б2': false, 'ИП220-27Б': false}
|
||||
|
||||
var _self_name: String
|
||||
var _serviceability: int = STATE_VAL.NONE
|
||||
var serviceability_uf: int:
|
||||
get:
|
||||
return _serviceability
|
||||
set(value):
|
||||
if value != _serviceability:
|
||||
_serviceability = value
|
||||
signaller.emit_signal('update_uf_serviceability', value)
|
||||
#endregion
|
||||
|
||||
#region Инициализация
|
||||
func _init(name_uf: String) -> void:
|
||||
_self_name = name_uf
|
||||
unit_uf = network.get_unit_instance(_self_name)
|
||||
unit_uf.connect('line_changed', on_line_changed)
|
||||
unit_uf.connect('data_received', on_data_received)
|
||||
#endregion
|
||||
|
||||
#region Обработчики сигналов
|
||||
func on_line_changed(status: Object) -> void:
|
||||
'''Обработка изменения состояния линии связи'''
|
||||
uf_status['УФ-онлайн'] = status.online
|
||||
update_serviceability()
|
||||
|
||||
func on_data_received(yau: Object) -> void:
|
||||
'''Обработка полученных данных от УФ'''
|
||||
var new_ems_status = control_ems(yau.status)
|
||||
var status_changed = false
|
||||
|
||||
# Обновляем только ключи КЭМС/ЭМС, сохраняя 'УФ-онлайн'
|
||||
for key in ['КЭМС-Б1', 'ЭМС-Б1', 'ЭМС-Б2', 'ИП220-27Б']:
|
||||
var old_value = uf_status.get(key, false)
|
||||
var new_value = new_ems_status.get(key, false)
|
||||
|
||||
if old_value != new_value:
|
||||
uf_status[key] = new_value
|
||||
status_changed = true
|
||||
|
||||
if status_changed:
|
||||
update_serviceability()
|
||||
#endregion
|
||||
|
||||
#region Статус и сервисабельность
|
||||
func get_current_status() -> Dictionary:
|
||||
'''Получение текущего статуса (только для чтения)'''
|
||||
return uf_status.duplicate(true)
|
||||
|
||||
func is_operational() -> bool:
|
||||
'''Проверка, все ли системы работают нормально'''
|
||||
return serviceability_uf and uf_status.get('УФ-онлайн', false)
|
||||
|
||||
|
||||
func update_serviceability() -> void:
|
||||
'''Обновление общего статуса сервисабельности'''
|
||||
var new_serviceability: int = STATE_VAL.GOOD
|
||||
|
||||
# Проверяем онлайн-статус
|
||||
if uf_status.get('УФ-онлайн', false) == false:
|
||||
new_serviceability = STATE_VAL.NONE
|
||||
else:
|
||||
# Проверяем все статусы КЭМС/ЭМС
|
||||
for key in ['КЭМС-Б1', 'ЭМС-Б1', 'ЭМС-Б2', 'ИП220-27Б']:
|
||||
if uf_status.get(key, true) == false:
|
||||
new_serviceability = STATE_VAL.ERROR
|
||||
break
|
||||
# Новое значение через setter
|
||||
self.serviceability_uf = new_serviceability
|
||||
#endregion
|
||||
|
||||
#region Вспомогательные методы
|
||||
static func control_ems(status: Array) -> Dictionary:
|
||||
'''Анализ статусов КЭМС/ЭМС'''
|
||||
var status_dic: Dictionary = {}
|
||||
if status.is_empty() or status.size() < 3:
|
||||
return status_dic
|
||||
|
||||
status_dic['КЭМС-Б1'] = bool((status[StatusIndex.SOCKETS] >> 0) & 1) and bool((status[StatusIndex.SOCKETS] >> 3) & 1)
|
||||
status_dic['ЭМС-Б1'] = bool((status[StatusIndex.SOCKETS] >> 1) & 1) and bool((status[StatusIndex.SOCKETS] >> 4) & 1)
|
||||
status_dic['ЭМС-Б2'] = bool((status[StatusIndex.SOCKETS] >> 2) & 1) and bool((status[StatusIndex.SOCKETS] >> 5) & 1)
|
||||
status_dic['ИП220-27Б'] = bool((status[StatusIndex.IP_220_27B] >> 6) & 1)
|
||||
return status_dic
|
||||
#endregion
|
||||
1
scenes/pribor-uf/uf-ctl.gd.uid
Normal file
1
scenes/pribor-uf/uf-ctl.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://b6avo0uvwrxnj
|
||||
@@ -1,6 +1,6 @@
|
||||
extends Label
|
||||
|
||||
enum PRD_STATE {
|
||||
enum DEVICE_STATE {
|
||||
NONE, # Нет связи
|
||||
GOOD, # Исправно
|
||||
ERR # Отказ
|
||||
@@ -13,9 +13,9 @@ enum DEVICE_STATUS {
|
||||
}
|
||||
|
||||
const STATUS_CONFIG := {
|
||||
PRD_STATE.NONE: {"text": "Нет связи", "color": Color.WHITE, "font_color": Color.BLACK},
|
||||
PRD_STATE.GOOD: {"text": "Исправно", "color": Color.GREEN, "font_color": Color.BLACK},
|
||||
PRD_STATE.ERR: {"text": "Отказ", "color": Color.RED, "font_color": Color.WHITE}
|
||||
DEVICE_STATE.NONE: {'text': 'Нет связи', 'color': Color.WHITE, 'font_color': Color.BLACK},
|
||||
DEVICE_STATE.GOOD: {'text': 'Исправно', 'color': Color.GREEN, 'font_color': Color.BLACK},
|
||||
DEVICE_STATE.ERR: {'text': 'Отказ', 'color': Color.RED, 'font_color': Color.WHITE}
|
||||
}
|
||||
|
||||
class DeviceObserver:
|
||||
@@ -31,7 +31,6 @@ class DeviceObserver:
|
||||
|
||||
func update_control_results(results: Dictionary) -> bool:
|
||||
var changed := false
|
||||
last_results = results.duplicate()
|
||||
|
||||
if results.get('is_over_control', false):
|
||||
# Контроль завершен - проверяем все результаты
|
||||
@@ -58,11 +57,12 @@ class DeviceObserver:
|
||||
return changed
|
||||
|
||||
var device_observers: Dictionary = {}
|
||||
var overall_prd_state: PRD_STATE = PRD_STATE.NONE
|
||||
var overall_prd_state: DEVICE_STATE = DEVICE_STATE.NONE
|
||||
var status_uf: int = DEVICE_STATE.NONE # Статус УФ (УАРЭП-ЭМС)
|
||||
|
||||
func _ready() -> void:
|
||||
tooltip_text = 'Нет связи с приборами комплекса'
|
||||
add_theme_color_override("font_color", Color.BLACK)
|
||||
add_theme_color_override('font_color', Color.BLACK)
|
||||
|
||||
# Инициализация наблюдателей
|
||||
_initialize_observers()
|
||||
@@ -77,9 +77,7 @@ func _ready() -> void:
|
||||
prd_module.unit_yau07.connect('line_changed', Callable(self, '_on_prd_online_changed').bind(prd_module))
|
||||
|
||||
# Подписка на УФ
|
||||
var unit_uf = network.get_unit_instance('уарэп-эмс')
|
||||
if unit_uf:
|
||||
unit_uf.data_received.connect(Callable(self, '_on_uf_status_receive'))
|
||||
signaller.connect('update_uf_serviceability', _on_uf_status_receive)
|
||||
|
||||
# Инициализация начального состояния
|
||||
_recalculate_overall_state()
|
||||
@@ -111,41 +109,51 @@ func _on_prd_control_results(results: Dictionary, prd_module: Object) -> void:
|
||||
_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 _on_uf_status_receive(unit_uf_status: int) -> void:
|
||||
if status_uf != unit_uf_status:
|
||||
status_uf = unit_uf_status
|
||||
_recalculate_overall_state()
|
||||
|
||||
|
||||
func _recalculate_overall_state() -> void:
|
||||
var new_state := PRD_STATE.NONE
|
||||
var has_online_devices := false
|
||||
var all_operational := true
|
||||
var new_state := DEVICE_STATE.NONE
|
||||
|
||||
# Проверяем статус ПРД
|
||||
var prd_state := DEVICE_STATE.NONE
|
||||
var has_online_prd := false
|
||||
var all_prd_operational := true
|
||||
|
||||
for observer in device_observers.values():
|
||||
if observer.status[DEVICE_STATUS.ONLINE]:
|
||||
has_online_devices = true
|
||||
has_online_prd = true
|
||||
|
||||
if observer.status[DEVICE_STATUS.CONTROL]:
|
||||
# Если контроль завершен - строгая проверка
|
||||
if not observer.status[DEVICE_STATUS.STATUS]:
|
||||
all_operational = false
|
||||
all_prd_operational = false
|
||||
break
|
||||
else:
|
||||
# Если контроль в процессе - мягкая проверка
|
||||
if not observer.status[DEVICE_STATUS.STATUS]:
|
||||
all_operational = false
|
||||
# Не прерываем, чтобы проверить все устройства
|
||||
all_prd_operational = false
|
||||
|
||||
if has_online_devices:
|
||||
new_state = PRD_STATE.GOOD if all_operational else PRD_STATE.ERR
|
||||
if has_online_prd:
|
||||
if all_prd_operational:
|
||||
prd_state = DEVICE_STATE.GOOD
|
||||
else:
|
||||
prd_state = DEVICE_STATE.ERR
|
||||
else:
|
||||
new_state = PRD_STATE.NONE
|
||||
prd_state = DEVICE_STATE.NONE
|
||||
|
||||
# Комбинируем статусы по правилу:
|
||||
# 1. Если хоть один ERROR → ERROR
|
||||
# 2. Если нет ERROR и хоть один GOOD → GOOD
|
||||
# 3. Иначе → NONE
|
||||
|
||||
if prd_state == DEVICE_STATE.ERR or status_uf == DEVICE_STATE.ERR:
|
||||
new_state = DEVICE_STATE.ERR
|
||||
elif prd_state == DEVICE_STATE.GOOD or status_uf == DEVICE_STATE.GOOD:
|
||||
new_state = DEVICE_STATE.GOOD
|
||||
else:
|
||||
new_state = DEVICE_STATE.NONE
|
||||
|
||||
if overall_prd_state != new_state:
|
||||
overall_prd_state = new_state
|
||||
@@ -154,23 +162,90 @@ func _recalculate_overall_state() -> void:
|
||||
|
||||
func _update_display() -> void:
|
||||
var config: Dictionary = STATUS_CONFIG[overall_prd_state].duplicate()
|
||||
|
||||
text = config.text
|
||||
modulate = config.color
|
||||
add_theme_color_override("font_color", config.font_color)
|
||||
add_theme_color_override('font_color', config.font_color)
|
||||
tooltip_text = _get_tooltip_text()
|
||||
|
||||
|
||||
func _get_tooltip_text() -> String:
|
||||
var tooltip := ''
|
||||
|
||||
# Получаем статистику по ПРД
|
||||
var prd_summary = _get_prd_summary()
|
||||
var uf_status_str = _get_uf_status_text()
|
||||
|
||||
match overall_prd_state:
|
||||
PRD_STATE.NONE:
|
||||
return "Нет связи с приборами комплекса"
|
||||
PRD_STATE.GOOD:
|
||||
return "Все приборы комплекса исправны"
|
||||
PRD_STATE.ERR:
|
||||
return "Обнаружены неисправности в комплексе"
|
||||
DEVICE_STATE.NONE:
|
||||
tooltip = 'Нет исправных систем в комплексе'
|
||||
DEVICE_STATE.GOOD:
|
||||
tooltip = 'Комплекс исправен'
|
||||
DEVICE_STATE.ERR:
|
||||
tooltip = 'Обнаружены неисправности в комплексе'
|
||||
|
||||
tooltip += '\n\nСтатус ПРД систем: ' + prd_summary
|
||||
tooltip += '\nСтатус УФ: ' + uf_status_str
|
||||
|
||||
# Детализация по источникам статуса
|
||||
tooltip += '\n\nСостояние систем:'
|
||||
|
||||
# ПРД системы
|
||||
var prd_ok_count = 0
|
||||
var prd_total = 0
|
||||
for observer in device_observers.values():
|
||||
if observer.status[DEVICE_STATUS.ONLINE]:
|
||||
prd_total += 1
|
||||
if observer.status[DEVICE_STATUS.STATUS]:
|
||||
prd_ok_count += 1
|
||||
|
||||
tooltip += '\nПРД: %d/%d исправно' % [prd_ok_count, prd_total]
|
||||
|
||||
# УФ система
|
||||
tooltip += '\nУФ: ' + _get_uf_status_text()
|
||||
|
||||
return tooltip
|
||||
|
||||
|
||||
func _get_prd_summary() -> String:
|
||||
var online_count := 0
|
||||
var operational_count := 0
|
||||
|
||||
for observer in device_observers.values():
|
||||
if observer.status[DEVICE_STATUS.ONLINE]:
|
||||
online_count += 1
|
||||
if observer.status[DEVICE_STATUS.STATUS]:
|
||||
operational_count += 1
|
||||
|
||||
if online_count == 0:
|
||||
return 'Нет связи'
|
||||
else:
|
||||
return '%d/%d исправно' % [operational_count, online_count]
|
||||
|
||||
|
||||
func _get_uf_status_text() -> String:
|
||||
match status_uf:
|
||||
DEVICE_STATE.NONE:
|
||||
return 'Нет данных'
|
||||
DEVICE_STATE.GOOD:
|
||||
return 'Исправен'
|
||||
DEVICE_STATE.ERR:
|
||||
return 'Неисправен'
|
||||
_:
|
||||
return "Неизвестное состояние"
|
||||
return 'Неизвестно'
|
||||
|
||||
|
||||
func _has_prd_errors() -> bool:
|
||||
for observer in device_observers.values():
|
||||
if observer.status[DEVICE_STATUS.ONLINE] and not observer.status[DEVICE_STATUS.STATUS]:
|
||||
return true
|
||||
return false
|
||||
|
||||
|
||||
func _has_operational_prd() -> bool:
|
||||
for observer in device_observers.values():
|
||||
if observer.status[DEVICE_STATUS.ONLINE] and observer.status[DEVICE_STATUS.STATUS]:
|
||||
return true
|
||||
return false
|
||||
|
||||
|
||||
# Публичные методы для получения информации
|
||||
@@ -178,10 +253,11 @@ func get_device_status(device_name: String) -> Dictionary:
|
||||
var observer: DeviceObserver = device_observers.get(device_name)
|
||||
if observer:
|
||||
return {
|
||||
"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()
|
||||
'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
|
||||
}
|
||||
return {}
|
||||
|
||||
@@ -200,9 +276,10 @@ func get_overall_status() -> Dictionary:
|
||||
control_complete_count += 1
|
||||
|
||||
return {
|
||||
"overall_state": overall_prd_state,
|
||||
"online_devices": online_count,
|
||||
"operational_devices": operational_count,
|
||||
"total_devices": device_observers.size(),
|
||||
"control_complete_devices": control_complete_count
|
||||
'overall_state': overall_prd_state,
|
||||
'online_devices': online_count,
|
||||
'operational_devices': operational_count,
|
||||
'total_devices': device_observers.size(),
|
||||
'control_complete_devices': control_complete_count,
|
||||
'uf_status': status_uf
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
[gd_scene load_steps=20 format=3 uid="uid://3slb0i3pvowc"]
|
||||
[gd_scene load_steps=19 format=3 uid="uid://3slb0i3pvowc"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://bvo6tcreqyuex" path="res://scenes/tabs-switch/tab-switch.gd" id="1_fg0vd"]
|
||||
[ext_resource type="PackedScene" uid="uid://b276iygic5itk" path="res://scenes/работа/работа.tscn" id="2_u7p16"]
|
||||
@@ -7,7 +7,7 @@
|
||||
[ext_resource type="PackedScene" uid="uid://dab6loryocc73" path="res://scenes/эмс/эмс.tscn" id="5_u71bh"]
|
||||
[ext_resource type="PackedScene" uid="uid://musb21x2u0xs" path="res://scenes/эмс2/эмс2.tscn" id="6_41d34"]
|
||||
[ext_resource type="PackedScene" uid="uid://bnptm4rlp60dq" path="res://scenes/настройки/настройки.tscn" id="6_i8iv3"]
|
||||
[ext_resource type="Script" uid="uid://b5ykwyk5vpi6" path="res://scenes/tabs-switch/lbl_ready.gd" id="8_tidwt"]
|
||||
[ext_resource type="Script" uid="uid://b5ykwyk5vpi6" path="res://scenes/tabs-switch/lbl-ready.gd" id="8_tidwt"]
|
||||
[ext_resource type="Script" uid="uid://roajn6c6wvc1" path="res://scenes/tabs-switch/тренаж_режим.gd" id="9_41d34"]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_tidwt"]
|
||||
@@ -22,16 +22,13 @@
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_o1r22"]
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_nmdfd"]
|
||||
bg_color = Color(0.061, 100, 0.051, 1)
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_cw2ss"]
|
||||
bg_color = Color(0.473976, 0.473976, 0.473976, 1)
|
||||
bg_color = Color(0.47451, 0.47451, 0.47451, 1)
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_nmdfd"]
|
||||
bg_color = Color(0, 100, 0, 1)
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_41d34"]
|
||||
bg_color = Color(0.39, 100, 0.327, 1)
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_imu1q"]
|
||||
|
||||
[node name="panel" type="Panel"]
|
||||
offset_right = 1600.0
|
||||
@@ -102,10 +99,9 @@ focus_mode = 0
|
||||
theme_override_colors/font_hover_pressed_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_pressed_color = Color(0, 0, 0, 1)
|
||||
theme_override_styles/hover_pressed = SubResource("StyleBoxFlat_nmdfd")
|
||||
theme_override_styles/hover = SubResource("StyleBoxFlat_cw2ss")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_41d34")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_imu1q")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_nmdfd")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_41d34")
|
||||
toggle_mode = true
|
||||
text = "Тренаж"
|
||||
script = ExtResource("9_41d34")
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
extends Button
|
||||
|
||||
func _ready():
|
||||
connect("toggled", Callable(self, "_on_button_toggled"))
|
||||
connect('toggled', Callable(self, '_on_button_toggled'))
|
||||
|
||||
|
||||
func _on_button_toggled(mode: bool):
|
||||
if mode:
|
||||
tooltip_text = "Режим \"Тренаж\" задействован\nТекущее состояние: включено"
|
||||
tooltip_text = 'Режим \"Тренаж\" задействован\nТекущее состояние: включено'
|
||||
else:
|
||||
tooltip_text = "Задейстовать режим \"Тренаж\"\nТекущее состояние: отключено"
|
||||
tooltip_text = 'Задейстовать режим \"Тренаж\"\nТекущее состояние: отключено'
|
||||
|
||||
@@ -745,7 +745,7 @@ func _on_threat_new(th) -> void:
|
||||
|
||||
|
||||
func _on_threat_update(th) -> void:
|
||||
var target = get_parent().get_node(str(th.id))
|
||||
var target = get_parent().get_node_or_null(str(th.id))
|
||||
if not target:
|
||||
return
|
||||
var new_position = lonlat_to_world(th.lon, th.lat)
|
||||
@@ -834,5 +834,4 @@ func draw_ship_radius() -> void:
|
||||
var radius_point_world = Vector2(ship_world_pos.x + radius_world, ship_world_pos.y)
|
||||
var radius_point_screen = world_to_screen(radius_point_world)
|
||||
var radius_screen = ship_screen_pos.distance_to(radius_point_screen)
|
||||
#draw_arc(ship_screen_pos, radius_screen, 0, TAU, 64, Color.ORANGE, 2.0) # отрисовка контура
|
||||
draw_circle(ship_screen_pos, radius_screen, Color.ORANGE_RED * Color(1, 1, 1, 0.1)) # отрисовка заливки
|
||||
|
||||
@@ -3,5 +3,7 @@ extends AnimatedSprite2D
|
||||
## Изменяет состояние значка "прибор на связи"
|
||||
func set_val(val: bool):
|
||||
set_frame(val)
|
||||
if val: modulate = Color(0.3, 1.0, 0.3, 1)
|
||||
else: modulate = Color(0.5, 0.5, 0.5, 1)
|
||||
if val:
|
||||
modulate = Color(0.3, 1.0, 0.3, 1)
|
||||
else:
|
||||
modulate = Color(0.5, 0.5, 0.5, 1)
|
||||
|
||||
11
scenes/контроль/panel_container.gd
Normal file
11
scenes/контроль/panel_container.gd
Normal file
@@ -0,0 +1,11 @@
|
||||
extends PanelContainer
|
||||
|
||||
## Изменяет состояние значка "прибор на связи"
|
||||
func set_val(val: bool):
|
||||
$connect_pribor.set_frame(val)
|
||||
if val:
|
||||
$connect_pribor.modulate = Color(0.3, 1.0, 0.3, 1) # зелёный
|
||||
set_tooltip_text("Есть связь")
|
||||
else:
|
||||
$connect_pribor.modulate = modulate # изначальный
|
||||
set_tooltip_text("Нет связи")
|
||||
1
scenes/контроль/panel_container.gd.uid
Normal file
1
scenes/контроль/panel_container.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://j16hg3u2uvu5
|
||||
@@ -21,6 +21,8 @@ const RESULT_STRINGS = {
|
||||
|
||||
@export var request_url: String = ''
|
||||
|
||||
signal sending_request() ## Отправка запроса
|
||||
|
||||
|
||||
func get_result_string(result: Result):
|
||||
return RESULT_STRINGS[result] if RESULT_STRINGS.has(result) else '<неизвестный код результата HTTPRequest - %d>' % result
|
||||
@@ -32,3 +34,4 @@ func _on_request_timer():
|
||||
var rc: = request(request_url)
|
||||
if rc != Error.OK:
|
||||
push_error('%s: \"%s\"' % [error_string(rc), request_url])
|
||||
emit_signal('sending_request')
|
||||
|
||||
@@ -163,8 +163,6 @@ func _enter_tree() -> void:
|
||||
vals[2] = get_theme_constant('margin_bottom')
|
||||
vals[3] = get_theme_constant('margin_right')
|
||||
return vals
|
||||
|
||||
|
||||
"
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_kqhju"]
|
||||
|
||||
@@ -35,7 +35,7 @@ signal pressed(control: PanelContainer)
|
||||
if not is_inside_tree():
|
||||
return
|
||||
$margin/vbox/grid1/level7.value = v
|
||||
$margin/vbox/grid1/level7.tint_progress = Color.RED if v >= 50 else Color.GOLD if v >= 40 else Color.WHITE
|
||||
$margin/vbox/grid1/level7.tint_progress = Color.RED if v >= 70 else Color.GOLD if v >= 55 else Color.WHITE
|
||||
on_level_changed(v, $margin/vbox/grid1/level7, value1_info)
|
||||
|
||||
|
||||
@@ -273,9 +273,9 @@ theme_override_styles/panel = SubResource("StyleBoxEmpty_3nd2u")
|
||||
script = SubResource("GDScript_oj3k3")
|
||||
textures = [ExtResource("1_n1aqt"), ExtResource("2_rim3u"), ExtResource("3_3w8fg")]
|
||||
value0 = [20.0, 30.0, 40.0, 50.0, 60.0, 70.0]
|
||||
min_value1 = -40.0
|
||||
min_value1 = -60.0
|
||||
max_value0 = 1400.0
|
||||
max_value1 = 55.0
|
||||
max_value1 = 75.0
|
||||
step0 = 1.0
|
||||
step1 = 1.0
|
||||
value_name0 = "P,%"
|
||||
@@ -478,8 +478,8 @@ tooltip_text = "
|
||||
Текущее: 0.00
|
||||
Диапазон: -40.00…55.00"
|
||||
mouse_filter = 0
|
||||
min_value = -40.0
|
||||
max_value = 55.0
|
||||
min_value = -60.0
|
||||
max_value = 75.0
|
||||
fill_mode = 3
|
||||
nine_patch_stretch = true
|
||||
stretch_margin_left = 8
|
||||
|
||||
@@ -35,7 +35,7 @@ signal pressed(control: PanelContainer)
|
||||
if not is_inside_tree():
|
||||
return
|
||||
$margin/vbox/grid1/level7.value = v
|
||||
$margin/vbox/grid1/level7.tint_progress = Color.RED if v >= 50 else Color.GOLD if v >= 40 else Color.WHITE
|
||||
$margin/vbox/grid1/level7.tint_progress = Color.RED if v >= 70 else Color.GOLD if v >= 55 else Color.WHITE
|
||||
on_level_changed(v, $margin/vbox/grid1/level7, value1_info)
|
||||
|
||||
|
||||
@@ -259,10 +259,10 @@ theme_override_styles/panel = SubResource("StyleBoxEmpty_3nd2u")
|
||||
script = SubResource("GDScript_oj3k3")
|
||||
textures = [ExtResource("1_uojqc"), ExtResource("2_a8ar3"), ExtResource("3_xwd13")]
|
||||
value0 = [20.0, 30.0, 40.0, 50.0, 60.0, 70.0]
|
||||
value1 = -40.0
|
||||
min_value1 = -40.0
|
||||
value1 = -100.0
|
||||
min_value1 = -60.0
|
||||
max_value0 = 1400.0
|
||||
max_value1 = 55.0
|
||||
max_value1 = 75.0
|
||||
step0 = 1.0
|
||||
step1 = 1.0
|
||||
value_name0 = "P,%"
|
||||
@@ -365,12 +365,12 @@ layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
tooltip_text = "
|
||||
Текущее: -40.00
|
||||
Диапазон: -40.00…55.00"
|
||||
Текущее: -100.00
|
||||
Диапазон: -60.00…75.00"
|
||||
mouse_filter = 0
|
||||
min_value = -40.0
|
||||
max_value = 55.0
|
||||
value = -40.0
|
||||
min_value = -60.0
|
||||
max_value = 75.0
|
||||
value = -60.0
|
||||
fill_mode = 3
|
||||
nine_patch_stretch = true
|
||||
stretch_margin_left = 8
|
||||
|
||||
@@ -9,4 +9,4 @@ func _ready() -> void:
|
||||
|
||||
|
||||
func on_line_changed(unit_instance: unit.Unit):
|
||||
$connect_pribor.set_val(unit_instance.online)
|
||||
$panel_pribor.set_val(unit_instance.online)
|
||||
|
||||
@@ -8,12 +8,14 @@ extends TextureButton
|
||||
func _ready():
|
||||
toggle_mode = true
|
||||
focus_mode = Control.FOCUS_ALL
|
||||
connect("focus_entered", _on_focus_entered)
|
||||
connect("focus_exited", _on_focus_exited)
|
||||
connect('focus_entered', _on_focus_entered)
|
||||
connect('focus_exited', _on_focus_exited)
|
||||
ProjectSettings.connect("settings_changed", Callable(self, "_on_settings_changed"))
|
||||
_on_settings_changed()
|
||||
|
||||
|
||||
func _enter_tree() -> void:
|
||||
if has_node("label"):
|
||||
if is_inside_tree():
|
||||
$label.self_modulate = state_colors[state]
|
||||
|
||||
|
||||
@@ -21,11 +23,11 @@ func update_progress_bar(target_value) -> void:
|
||||
if tween:
|
||||
tween.kill()
|
||||
tween = create_tween()
|
||||
tween.tween_property($control_progress, "value", target_value, 0.3)
|
||||
tween.tween_property($control_progress, 'value', target_value, 0.3)
|
||||
|
||||
|
||||
func _on_toggled(toggled_on):
|
||||
if has_node("frame"):
|
||||
if has_node('frame'):
|
||||
$frame.visible = toggled_on
|
||||
|
||||
|
||||
@@ -40,23 +42,39 @@ func _on_focus_exited():
|
||||
|
||||
func enter_press():
|
||||
var enter_event = InputEventAction.new()
|
||||
enter_event.action = "ui_accept"
|
||||
enter_event.action = 'ui_accept'
|
||||
enter_event.pressed = true
|
||||
Input.parse_input_event(enter_event)
|
||||
|
||||
|
||||
func _on_settings_changed():
|
||||
if not is_inside_tree(): return
|
||||
|
||||
var white_color = ProjectSettings.get_setting('application/config/%s' % 'Цвет фона схемы', Color.DIM_GRAY)
|
||||
var json_col_w = ProjectSettings.get_setting('application/config/%s' % 'Цвет фона схемы', '[0.0, 0.0, 0.0, 0.0]')
|
||||
var arr_col_w = JSON.parse_string(json_col_w)
|
||||
white_color = Color(arr_col_w[0], arr_col_w[1], arr_col_w[2], arr_col_w[3]) if arr_col_w else Color.DIM_GRAY
|
||||
|
||||
var black_color = ProjectSettings.get_setting('application/config/%s' % 'Цвет схемы', Color.WHITE_SMOKE)
|
||||
var json_col_b = ProjectSettings.get_setting('application/config/%s' % 'Цвет схемы', '[1.0, 1.0, 1.0, 1.0]')
|
||||
var arr_col_b = JSON.parse_string(json_col_b)
|
||||
black_color = Color(arr_col_b[0], arr_col_b[1], arr_col_b[2], arr_col_b[3]) if arr_col_b else Color.WHITE_SMOKE
|
||||
|
||||
$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()
|
||||
state = v
|
||||
if is_inside_tree() and has_node("label"):
|
||||
if is_inside_tree():
|
||||
$label.self_modulate = state_colors[v]
|
||||
|
||||
|
||||
@export var progress_value: float = 0.0:
|
||||
set(v):
|
||||
progress_value = v
|
||||
|
||||
if is_inside_tree():
|
||||
update_progress_bar(v)
|
||||
var max_val = $control_progress.get('max_value')
|
||||
@@ -90,3 +108,16 @@ func enter_press():
|
||||
show_functional = v
|
||||
if is_inside_tree():
|
||||
$pic_functional.visible = v
|
||||
|
||||
|
||||
@export var timeout_tween: float:
|
||||
# Создаем твин для анимации с плавным началом и концом
|
||||
set(v):
|
||||
$control_progress.value = 0.0
|
||||
var local_tween = create_tween()
|
||||
local_tween.tween_property($control_progress, "value", v, v)\
|
||||
.set_trans(Tween.TRANS_SINE)\
|
||||
.set_ease(Tween.EASE_IN_OUT)
|
||||
|
||||
local_tween.tween_callback(func():
|
||||
$control_progress.visible = false)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -54,7 +54,7 @@ func _on_resized() -> void:
|
||||
|
||||
func _enter_tree() -> void:
|
||||
if Engine.is_editor_hint(): return
|
||||
var unit_any = network.get_unit_instance(unit_name)
|
||||
var unit_any: = network.get_unit_instance(unit_name)
|
||||
unit_any.connect('data_received', Callable(self, 'on_data_received'))
|
||||
unit_any.connect('line_changed', Callable(self, 'on_line_changed'))
|
||||
$margin/vbox.alignment = alignment
|
||||
@@ -65,6 +65,6 @@ func _enter_tree() -> void:
|
||||
|
||||
func _exit_tree() -> void:
|
||||
if Engine.is_editor_hint(): return
|
||||
var unit_any = network.get_unit_instance(unit_name)
|
||||
var unit_any: = network.get_unit_instance(unit_name)
|
||||
unit_any.disconnect('data_received', Callable(self, 'on_data_received'))
|
||||
unit_any.disconnect('line_changed', Callable(self, 'on_line_changed'))
|
||||
|
||||
@@ -9,61 +9,66 @@ 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, 'Цвет кнопки. Введено по требованию ПЗ' ] ]
|
||||
['Ограниченный режим', TableEdit, TableToggle, 'Ограничть возможности по постановке помех'], # 0
|
||||
['Кнопка «ПД-М4»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], # 1
|
||||
['Кнопка «ПД-М2»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], # 2
|
||||
['Кнопка «ОЗП-1»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], # 3
|
||||
['Кнопка «МЧМ-1»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], # 4
|
||||
['Кнопка «ОРН-И1»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], # 5
|
||||
['Кнопка «ОРН-М2»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], # 6
|
||||
['Кнопка «ЛЧМ-1»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], # 7
|
||||
['Кнопка «ПД-М4С»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], # 8
|
||||
['Кнопка «ПД-ЧМ»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], # 9
|
||||
['Кнопка «СВ-И1»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], # 10
|
||||
['Кнопка «К1»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], # 11
|
||||
['Кнопка «СВ-М2»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], # 12
|
||||
['Кнопка «ОРН»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], # 13
|
||||
['Кнопка «JTIDS»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], # 14
|
||||
['Кнопка «КУПД»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], # 15
|
||||
['Внешнее управление', TableEdit, TableToggle, 'Передать управление в 5П28'], # 16
|
||||
['Внешнее указание Трасса', TableEdit, TableToggle, 'Разрешить постановку помех от Трасса'], # 17
|
||||
['Кнопка «Подавление»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], # 18
|
||||
['Виртуальная клавиатура', TableEdit, TableToggle, 'Включить отображение экранной клавиатуры'], # 19
|
||||
['Скрыть вкладку ЭМС 2', TableEdit, TableToggle, 'Отображать вкладку \"ЭМС-2\"'], # 20
|
||||
['Отладка контроля', TableEdit, TableToggle, 'Отображать отладку контроля'], # 21
|
||||
['Текущая версия ПО УАРЭП', TableEdit, TableEdit, 'Время сборки, версия и номер фиксации'], # 22
|
||||
['уарэп-яу07-частный', TableEdit, TableEdit, 'IP-адрес для получения частных сообщений от ЯУ-07'], # 23
|
||||
['уарэп-яу07-общий', TableEdit, TableEdit, 'IP-адрес для получения широковещательных сообщений от ЯУ-07'], # 24
|
||||
['уарэп-капсрпб', TableEdit, TableEdit, 'IP-адрес для связи с КАПС-РПБ [<адрес этого узла>, <адрес удалённого узла>, <порт этого узла>, <порт удалённого узла>]'], # 25
|
||||
['уарэп-эмс', TableEdit, TableEdit, 'IP-адрес для связи с ЭМС'], # 26
|
||||
['уарэп-яу07-2в', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-В 2'], # 27
|
||||
['уарэп-яу07-2н', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-Н 2'], # 28
|
||||
['уарэп-яу07-2к', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-К 2'], # 29
|
||||
['уарэп-яу07-4в', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-В 4'], # 30
|
||||
['уарэп-яу07-4н', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-Н 4'], # 31
|
||||
['уарэп-яу07-4к', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-К 4'], # 32
|
||||
['уарэп-яу07-1в', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-В 1'], # 33
|
||||
['уарэп-яу07-1н', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-Н 1'], # 34
|
||||
['уарэп-яу07-1к', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-К 1'], # 35
|
||||
['уарэп-яу07-3в', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-В 3'], # 36
|
||||
['уарэп-яу07-3н', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-Н 3'], # 37
|
||||
['уарэп-яу07-3к', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-К 3'], # 38
|
||||
['уарэп-5п28', TableEdit, TableEdit, 'IP-адрес для связи с 5П28'], # 39
|
||||
['навигация', TableEdit, TableEdit, 'Порт назначения для получения данных от АКНГ'], # 40
|
||||
['уарэп-щ3', TableEdit, TableEdit, 'Путь к UART-устройству для связи с прибором Щ3'], # 41
|
||||
['уарэп-спт25-1', TableEdit, TableEdit, 'Путь к UART-устройству для связи с прибором СПТ-25 1'], # 42
|
||||
['уарэп-спт25-2', TableEdit, TableEdit, 'Путь к UART-устройству для связи с прибором СПТ-25 2'], # 43
|
||||
['Шаблон адреса сервера карт', TableEdit, TableEdit, 'Шаблон URL-адреса сервера карт, должен содержать поля \"{x}\", \"{y}\", \"{z}\" для подстановки индекса плитки'], # 44
|
||||
['Адрес АФСП левого борта', TableEdit, TableEdit, 'http-адрес для запроса состояния прибора АФСП'], # 45
|
||||
['Адрес АФСП правого борта', TableEdit, TableEdit, 'http-адрес для запроса состояния прибора АФСП'], # 46
|
||||
['Адрес БПО левого борта', TableEdit, TableEdit, 'http-адрес для запроса состояния прибора БПО'], # 47
|
||||
['Адрес БПО правого борта', TableEdit, TableEdit, 'http-адрес для запроса состояния прибора БПО'], # 48
|
||||
['Период опроса состояния БПО, секунды', TableEdit, TableEdit, 'Время в секундах' ], # 49
|
||||
['Период опроса состояния АФСП, секунды', TableEdit, TableEdit, 'Время в секундах' ], # 50
|
||||
['уарэп-трасса', TableEdit, TableEdit, 'IP-адрес для связи с Трассой [<адрес этого узла>, <адрес удалённого узла>, <порт этого узла>, <порт удалённого узла>]'], # 51
|
||||
['Включить работу по своим целям', TableEdit, TableToggle, 'Разрешает работу в секторе со своей целью'], # 52
|
||||
['Список своих протоколов', TableEdit, TableEdit, 'Список протоколов целей, по которым запрещено работать' ], # 53
|
||||
['Цвет кнопки \"Подавление\"', TableEdit, TableColorPick, 'Цвет кнопки. Введено по требованию ПЗ' ], # 54
|
||||
['Цвет фона схемы', TableEdit, TableColorPick, 'Схема прибора Э2. Изменение цвет фона'], # 55
|
||||
['Цвет схемы', TableEdit, TableColorPick, 'Схема прибора Э2. Изменение цвет схемы '], # 56
|
||||
['Коэффициент ширины полосы излучения', TableEdit, TableEdit, 'Изменение ширины полосы излучения помехи в зависимости от цели'], # 57
|
||||
['Время повторной отправки помехи', TableEdit, TableEdit, 'Изменение времени повторной отправки помехи'] ] # 58
|
||||
|
||||
|
||||
## TODO: Придумать как избавиться от индексов
|
||||
## Индексы строк таблицы.
|
||||
@@ -76,9 +81,12 @@ const DEBAG_CONTROL = 21 ## Строка - Отладка контроля
|
||||
const COMMIT = 22 ## Строка - Версия УАРЭП
|
||||
const GOS_BTN = 52 ## Разрешить работу по своим целям
|
||||
const COLOR_BTN_ACT = 54 ## Цвет кнопки "Подавление"
|
||||
const COLOR_WHITE = 55 ## Цвет фона схемы
|
||||
const COLOR_BLACK = 56 ## Цвет схемы
|
||||
|
||||
|
||||
var name_to_line_index: = {} ## Для преобразования названия параметра в номер строки
|
||||
var name_to_line_index: = {} ## Для преобразования названия параметра в номер строки
|
||||
var table_color_instance: Node ## Нода цвета кнопки подавления
|
||||
|
||||
func on_checkbutton_pressed(i_row: int): on_row_pressed(i_row)
|
||||
|
||||
@@ -244,11 +252,47 @@ func button_settings():
|
||||
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))
|
||||
var json_col = ProjectSettings.get_setting('application/config/%s' % 'Цвет кнопки \"Подавление\"', '[1.0, 1.0, 1.0, 1.0]')
|
||||
var arr_col = JSON.parse_string(json_col)
|
||||
color_btn_act.color = Color(arr_col[0], arr_col[1], arr_col[2], arr_col[3]) if arr_col else Color.WHITE
|
||||
color_btn_act.text = JSON.stringify(arr_col)
|
||||
var color_white = $scroll_set/table.get_node2(1, COLOR_WHITE)
|
||||
color_white.connect('popup_closed', on_color_closed_w.bind(color_white))
|
||||
var json_col_w = ProjectSettings.get_setting('application/config/%s' % 'Цвет фона схемы', '[0.0, 0.0, 0.0, 0.0]')
|
||||
var arr_col_w = JSON.parse_string(json_col_w)
|
||||
color_white.color = Color(arr_col_w[0], arr_col_w[1], arr_col_w[2], arr_col_w[3]) if arr_col_w else Color.DIM_GRAY
|
||||
color_white.text = JSON.stringify(arr_col_w)
|
||||
var color_black = $scroll_set/table.get_node2(1, COLOR_BLACK)
|
||||
color_black.connect('popup_closed', on_color_closed_b.bind(color_black))
|
||||
var json_col_b = ProjectSettings.get_setting('application/config/%s' % 'Цвет схемы', '[1.0, 1.0, 1.0, 1.0]')
|
||||
var arr_col_b = JSON.parse_string(json_col_b)
|
||||
color_black.color = Color(arr_col_b[0], arr_col_b[1], arr_col_b[2], arr_col_b[3]) if arr_col_b else Color.WHITE_SMOKE
|
||||
color_black.text = JSON.stringify(arr_col_b)
|
||||
|
||||
|
||||
func _update_theme_colors():
|
||||
var color_white = $scroll_set/table.get_node2(1, COLOR_WHITE)
|
||||
var color_black = $scroll_set/table.get_node2(1, COLOR_BLACK)
|
||||
on_color_closed_w(color_white)
|
||||
on_color_closed_b(color_black)
|
||||
|
||||
|
||||
func on_color_closed_w(color_white: ColorPickerButton):
|
||||
var col_w = [color_white.color.r, color_white.color.g, color_white.color.b, color_white.color.a]
|
||||
color_white.text = JSON.stringify(col_w)
|
||||
ProjectSettings.set_setting('application/config/%s' % 'Цвет фона схемы', color_white.text)
|
||||
|
||||
|
||||
func on_color_closed_b(color_black: ColorPickerButton):
|
||||
var col_b = [color_black.color.r, color_black.color.g, color_black.color.b, color_black.color.a]
|
||||
color_black.text = JSON.stringify(col_b)
|
||||
ProjectSettings.set_setting('application/config/%s' % 'Цвет схемы', color_black.text)
|
||||
|
||||
|
||||
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)
|
||||
var col = [color_btn_act.color.r, color_btn_act.color.g, color_btn_act.color.b, color_btn_act.color.a]
|
||||
color_btn_act.text = JSON.stringify(col)
|
||||
ProjectSettings.set_setting('application/config/%s' % 'Цвет кнопки \"Подавление\"', color_btn_act.text)
|
||||
|
||||
|
||||
func _on_btn_save_settings_pressed():
|
||||
|
||||
@@ -53,12 +53,12 @@ signal drag_end ## Вызывается в момент завершени
|
||||
const map_sizes = [
|
||||
Rect2i(360, 360, 400, 400),
|
||||
Rect2i(82, 82, 955, 955)]
|
||||
var fs_band = prd.FS_BAND_RTO ## Текущий режим блоков ФС по частоте
|
||||
var fs_selected: Dictionary ## Словарь выбранных секторов
|
||||
var fs_active: Dictionary ## Словарь секторов назначенных на подавление
|
||||
var fs_emit: Dictionary ## Словарь секторов назначенных на подавление
|
||||
var fs_closed: Dictionary ## Словарь для секторов запрета
|
||||
var fs_failed: Array ## Индикация сломанных секторов (модули ФС). AntBandState.ANT_BAND_READY - исправен, AntBandState.ANT_BAND_FAILURE - сломан.
|
||||
var fs_band = prd.FS_BAND_RTO ## Текущий режим блоков ФС по частоте
|
||||
var fs_selected: Dictionary ## Словарь выбранных секторов
|
||||
var fs_active: Dictionary ## Словарь секторов назначенных на подавление
|
||||
var fs_emit: Dictionary ## Словарь секторов назначенных на подавление
|
||||
var fs_closed: Dictionary ## Словарь для секторов запрета
|
||||
var fs_failed: PackedInt32Array ## Индикация сломанных секторов (модули ФС). AntBandState.ANT_BAND_READY - исправен, AntBandState.ANT_BAND_FAILURE - сломан.
|
||||
|
||||
## Состояние перетаскивания.
|
||||
enum DragFSM {
|
||||
@@ -83,8 +83,9 @@ enum MapViewMode {
|
||||
|
||||
|
||||
enum AntBandState {
|
||||
ANT_BAND_FAILED = 0,
|
||||
ANT_BAND_READY = 1,
|
||||
ANT_BAND_FAILED = 0
|
||||
ANT_BAND_ASSIGNED = 2
|
||||
}
|
||||
|
||||
const VAL_TO_EVENT = {
|
||||
@@ -105,7 +106,7 @@ var SIGNALS_CONNECTIONS = [
|
||||
[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, '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'],
|
||||
@@ -150,7 +151,9 @@ 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)
|
||||
var json_col = ProjectSettings.get_setting('application/config/%s' % 'Цвет кнопки \"Подавление\"', '[1.0, 1.0, 1.0, 1.0]')
|
||||
var arr_col = JSON.parse_string(json_col)
|
||||
col_btn_act = Color(arr_col[0], arr_col[1], arr_col[2], arr_col[3]) if arr_col else Color.WHITE
|
||||
|
||||
|
||||
## Обработчик сигнала изменения списка целей.
|
||||
@@ -169,6 +172,9 @@ func on_button_view_toggled(toggled: bool):
|
||||
view_mode = MapViewMode.RLS if toggled else MapViewMode.RTO
|
||||
if view_mode != MapViewMode.RTO:
|
||||
fs_selected.clear()
|
||||
$btns_select/btn_strob.disabled = toggled
|
||||
$btns_select/btn_fs_sector.disabled = toggled
|
||||
$'canvas/строб'.visible = $btns_select/btn_strob.pressed and (not toggled)
|
||||
|
||||
|
||||
## Встроенный обратный вызов.
|
||||
@@ -192,7 +198,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_READY
|
||||
fs_failed[i] = AntBandState.ANT_BAND_FAILED
|
||||
|
||||
|
||||
## Производит инициализацию.
|
||||
@@ -231,12 +237,22 @@ func connect_all() -> void:
|
||||
else:
|
||||
var ers = error_string(rc)
|
||||
push_error('%s: %s %s %s' % [ers, item[0], item[1], item[2]])
|
||||
signaller.emit_signal('connect_work_signal')
|
||||
for th in thrs_dict.values():
|
||||
var bip = Bip.instantiate()
|
||||
bip.name = '%d' % th.id
|
||||
map_threat_to_bip(th, bip)
|
||||
add_child(bip)
|
||||
|
||||
|
||||
func disconnect_all() -> void:
|
||||
for item in signal_conections:
|
||||
item[0].disconnect(item[1], item[2])
|
||||
signal_conections.clear()
|
||||
var bips: Array = get_children().filter(func(item): return item.name.is_valid_int())
|
||||
for bip in bips:
|
||||
remove_child(bip)
|
||||
bip.free()
|
||||
|
||||
|
||||
func sector_klaster(sector_data):
|
||||
@@ -302,7 +318,10 @@ func map_threat_to_bip(th: threats.Threat, bip: Control) -> bool:
|
||||
func on_threat_update(th: threats.Threat):
|
||||
var bip = get_node('%d' % th.id)
|
||||
bip.update(th.tick_rx)
|
||||
bip.set_bip_color(Color.CORAL if th.proto else Color.WHITE)
|
||||
if th.gos:
|
||||
bip.set_bip_color(Color.GREEN)
|
||||
else:
|
||||
bip.set_bip_color(Color.CORAL if th.proto else Color.WHITE)
|
||||
bip.visible = map_threat_to_bip(th, bip)
|
||||
|
||||
|
||||
@@ -452,7 +471,7 @@ func get_strob_band(pos: Vector2, prev: float) -> float:
|
||||
|
||||
## Устанавливает центр строба по частоте и направлению.
|
||||
func set_strob(pos: Vector2) -> void:
|
||||
var radp: Vector2 = tools.map_dec_to_rad(radius_center, pos)
|
||||
var radp: Vector2 = tools.map_dec_to_rad(radius_center / 2.0, pos / 2.0)
|
||||
if radp.y < $canvas.get_radius_outter():
|
||||
$canvas.set_strob_dir(radp.x)
|
||||
$canvas.set_strob_radius(radp.y)
|
||||
@@ -629,7 +648,7 @@ func on_interfer_prinuditelno(prenuditelno_sectors):
|
||||
## Вызывается при получении информации о состоянии модулей ФС от КАПС РПБ.
|
||||
func on_fs_update_state(fs_dict: Dictionary):
|
||||
for key in fs_dict.keys():
|
||||
fs_failed[key] = fs_dict[key].isg
|
||||
fs_failed[key] = AntBandState.ANT_BAND_READY if fs_dict[key].ready else AntBandState.ANT_BAND_FAILED
|
||||
|
||||
|
||||
func on_btn_center_toggled(toggled_on: bool) -> void:
|
||||
|
||||
@@ -74,18 +74,24 @@ strob_min_band = 0.1
|
||||
strob_min_width = 5.0
|
||||
metadata/_edit_vertical_guides_ = []
|
||||
|
||||
[node name="btn_view" type="CheckBox" parent="."]
|
||||
[node name="canvas" parent="." instance=ExtResource("11_b6su4")]
|
||||
layout_mode = 0
|
||||
offset_left = 835.0
|
||||
offset_top = 5.0
|
||||
offset_right = 994.0
|
||||
offset_bottom = 32.0
|
||||
offset_left = 280.0
|
||||
offset_top = 280.0
|
||||
offset_right = 840.0
|
||||
offset_bottom = 840.0
|
||||
pivot_offset = Vector2(280, 280)
|
||||
|
||||
[node name="btn_view" type="CheckBox" parent="canvas"]
|
||||
layout_mode = 0
|
||||
offset_left = 417.5
|
||||
offset_top = 2.5
|
||||
offset_right = 576.5
|
||||
offset_bottom = 29.5
|
||||
scale = Vector2(0.5, 0.5)
|
||||
action_mode = 0
|
||||
text = "Обзорная карта"
|
||||
|
||||
[node name="canvas" parent="." instance=ExtResource("11_b6su4")]
|
||||
metadata/_edit_lock_ = true
|
||||
|
||||
[node name="tilemap" parent="." instance=ExtResource("10_gtwyg")]
|
||||
self_modulate = Color(1, 1, 1, 0.415686)
|
||||
position = Vector2(360, 360)
|
||||
@@ -378,9 +384,8 @@ texture_normal = ExtResource("14_ggrwd")
|
||||
|
||||
[connection signal="drag_begin" from="." to="." method="_on_drag_begin"]
|
||||
[connection signal="drag_continue" from="." to="." method="_on_drag_continue"]
|
||||
[connection signal="toggled" from="btn_view" to="." method="on_button_view_toggled"]
|
||||
[connection signal="toggled" from="canvas/btn_view" to="." method="on_button_view_toggled"]
|
||||
[connection signal="toggled" from="chk_auto" to="." method="on_value_changed"]
|
||||
[connection signal="toggled" from="btn_activate" to="." method="on_btn_activate"]
|
||||
[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"]
|
||||
|
||||
@@ -16,9 +16,9 @@ class EmsBoard:
|
||||
6 : 52, }
|
||||
|
||||
var id_board: int ## id платы
|
||||
var in_devs: Dictionary ## Словарь с входными устройствами.
|
||||
var out_devs: Dictionary ## Словарь с выходными устройствами.
|
||||
var base_addr_isa: int ## Базовый адрес ячейки isa.
|
||||
var in_devs: Dictionary ## Словарь с входными устройствами.
|
||||
var out_devs: Dictionary ## Словарь с выходными устройствами.
|
||||
var base_addr_isa: int ## Базовый адрес ячейки isa.
|
||||
var ports_to_wr: Array ## Порты для записи
|
||||
var in_tbl: Array
|
||||
var out_tbl: Array
|
||||
@@ -54,9 +54,6 @@ class EmsBoard:
|
||||
|
||||
## Устанавливает состояние входов и выходов платы
|
||||
func set_status(status: PackedByteArray):
|
||||
if not status.size():
|
||||
push_error('status.size():%d' % status.size())
|
||||
return
|
||||
var offset = 0
|
||||
if id_board < 3:
|
||||
offset = yemsconsts.STATUS_OFFSET[id_board]
|
||||
@@ -310,10 +307,12 @@ class EmsBoard:
|
||||
return true
|
||||
|
||||
func set_load_done():
|
||||
if unit_ems.cmd_state != unit_ems.CmdState.DONE: return
|
||||
state_board = LOADING
|
||||
unit_ems.send_load_ems_done(unit_ems.CmdCode.LOAD_EMS_DONE)
|
||||
|
||||
func execute_cmd():
|
||||
if unit_ems.cmd_state != unit_ems.CmdState.DONE: return
|
||||
if len(cmd_array):
|
||||
state_board = WRITE
|
||||
var cmd: Array = cmd_array.pop_front()
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
[ext_resource type="PackedScene" uid="uid://da7w3vkhadfwe" path="res://scenes/button-flat/button-flat.tscn" id="2_eju8r"]
|
||||
[ext_resource type="Texture2D" uid="uid://csnts8f155sf7" path="res://data/save1.png" id="3_onafb"]
|
||||
[ext_resource type="Texture2D" uid="uid://o8mam0a060d8" path="res://data/load1.png" id="4_afjfs"]
|
||||
[ext_resource type="Texture2D" uid="uid://bdlbqs88bki8x" path="res://data/connect-a.png" id="5_2nrut"]
|
||||
[ext_resource type="Texture2D" uid="uid://u3tnejvpm8it" path="res://data/disconnect-a.png" id="6_g3q7m"]
|
||||
[ext_resource type="Texture2D" uid="uid://bdlbqs88bki8x" path="res://data/connect-a.png" id="5_wk8og"]
|
||||
[ext_resource type="Texture2D" uid="uid://u3tnejvpm8it" path="res://data/disconnect-a.png" id="6_1fbmy"]
|
||||
[ext_resource type="Script" uid="uid://c5pq0hbrij34d" path="res://table/table.gd" id="8_qcl30"]
|
||||
|
||||
[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_mu34x"]
|
||||
@@ -35,30 +35,30 @@ modulate_color = Color(0.8, 0.533333, 0.27451, 1)
|
||||
texture = ExtResource("4_afjfs")
|
||||
|
||||
[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_o7qii"]
|
||||
texture = ExtResource("5_2nrut")
|
||||
texture = ExtResource("5_wk8og")
|
||||
modulate_color = Color(0.8, 0.533333, 0.27451, 1)
|
||||
|
||||
[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_mgr7r"]
|
||||
texture = ExtResource("5_2nrut")
|
||||
texture = ExtResource("5_wk8og")
|
||||
expand_margin_left = 3.0
|
||||
expand_margin_top = 3.0
|
||||
modulate_color = Color(0.8, 0.533333, 0.27451, 1)
|
||||
|
||||
[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_hxhyh"]
|
||||
texture = ExtResource("5_2nrut")
|
||||
texture = ExtResource("5_wk8og")
|
||||
|
||||
[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_tnihm"]
|
||||
texture = ExtResource("6_g3q7m")
|
||||
texture = ExtResource("6_1fbmy")
|
||||
modulate_color = Color(0.8, 0.533333, 0.27451, 1)
|
||||
|
||||
[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_k1qbi"]
|
||||
texture = ExtResource("6_g3q7m")
|
||||
texture = ExtResource("6_1fbmy")
|
||||
expand_margin_left = 3.0
|
||||
expand_margin_top = 3.0
|
||||
modulate_color = Color(0.8, 0.533333, 0.27451, 1)
|
||||
|
||||
[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_pe5pe"]
|
||||
texture = ExtResource("6_g3q7m")
|
||||
texture = ExtResource("6_1fbmy")
|
||||
|
||||
[node name="ЭМС" type="Panel"]
|
||||
offset_right = 1598.0
|
||||
@@ -126,10 +126,10 @@ theme_override_styles/normal = SubResource("StyleBoxTexture_3ytmi")
|
||||
|
||||
[node name="btn_connect" type="Button" parent="."]
|
||||
layout_mode = 0
|
||||
offset_left = 627.0
|
||||
offset_top = 55.0
|
||||
offset_right = 679.0
|
||||
offset_bottom = 87.0
|
||||
offset_left = 716.0
|
||||
offset_top = 40.0
|
||||
offset_right = 763.0
|
||||
offset_bottom = 73.0
|
||||
focus_mode = 0
|
||||
theme_override_colors/icon_normal_color = Color(1, 1, 1, 1)
|
||||
theme_override_styles/focus = SubResource("StyleBoxTexture_o7qii")
|
||||
@@ -141,10 +141,10 @@ theme_override_styles/normal = SubResource("StyleBoxTexture_hxhyh")
|
||||
|
||||
[node name="btn_disconnect" type="Button" parent="."]
|
||||
layout_mode = 0
|
||||
offset_left = 714.0
|
||||
offset_top = 741.0
|
||||
offset_right = 766.0
|
||||
offset_bottom = 775.0
|
||||
offset_left = 718.0
|
||||
offset_top = 735.0
|
||||
offset_right = 764.0
|
||||
offset_bottom = 764.0
|
||||
focus_mode = 0
|
||||
theme_override_colors/icon_normal_color = Color(1, 1, 1, 1)
|
||||
theme_override_styles/focus = SubResource("StyleBoxTexture_tnihm")
|
||||
|
||||
15
scenes/эмс2/эмс-тг.gd
Normal file
15
scenes/эмс2/эмс-тг.gd
Normal file
@@ -0,0 +1,15 @@
|
||||
extends Panel
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
var unit_trassa = network.get_unit_instance('уарэп-трасса')
|
||||
unit_trassa.connect('line_changed', Callable(self, 'on_trassa_line_changed'))
|
||||
signaller.connect('sector_klaster', Callable(self, 'on_sector_klaster').bind(unit_trassa))
|
||||
|
||||
|
||||
func on_trassa_line_changed(unit_trassa):
|
||||
pass
|
||||
|
||||
|
||||
func on_sector_klaster(_data, unit_trassa):
|
||||
pass
|
||||
@@ -6,15 +6,13 @@
|
||||
[ext_resource type="Texture2D" uid="uid://cckk3jk5r32bh" path="res://data/ГО.png" id="5_qxr47"]
|
||||
[ext_resource type="Texture2D" uid="uid://kyrnn1mqpc08" path="res://data/РЛС1.png" id="6_8sxps"]
|
||||
[ext_resource type="Texture2D" uid="uid://cx0f3wcx76u1k" path="res://data/РЛС2.png" id="7_0bfmy"]
|
||||
[ext_resource type="Texture2D" uid="uid://csxruavk0s40l" path="res://data/Окно частот0.png" id="8_4em3i"]
|
||||
[ext_resource type="Texture2D" uid="uid://duu8q7sv0jwfh" path="res://data/ННВС.png" id="8_aiy4x"]
|
||||
|
||||
[sub_resource type="CompressedTexture2D" id="CompressedTexture2D_5u4bk"]
|
||||
load_path = "res://.godot/imported/Окно частот0.png-6b01791c971bddb01337caf9077bf060.ctex"
|
||||
|
||||
[sub_resource type="CompressedTexture2D" id="CompressedTexture2D_pd85g"]
|
||||
|
||||
[sub_resource type="CompressedTexture2D" id="CompressedTexture2D_4em3i"]
|
||||
|
||||
[node name="Control" type="Panel"]
|
||||
|
||||
[node name="Sprite2D" type="Sprite2D" parent="."]
|
||||
@@ -94,6 +92,5 @@ scale = Vector2(0.911215, 0.911215)
|
||||
texture = SubResource("CompressedTexture2D_pd85g")
|
||||
|
||||
[node name="ТаблицаЧастот" type="Sprite2D" parent="."]
|
||||
position = Vector2(808.166, 537.125)
|
||||
scale = Vector2(0.956689, 0.95669)
|
||||
texture = SubResource("CompressedTexture2D_4em3i")
|
||||
position = Vector2(794, 569)
|
||||
texture = ExtResource("8_4em3i")
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,38 +0,0 @@
|
||||
extends Panel
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
var unit_trassa = network.get_unit_instance('уарэп-трасса')
|
||||
unit_trassa.connect('line_changed', Callable(self, 'on_trassa_line_changed'))
|
||||
signaller.connect('sector_klaster', Callable(self, 'on_sector_klaster').bind(unit_trassa))
|
||||
|
||||
|
||||
func on_trassa_line_changed(unit_trassa):
|
||||
if unit_trassa.online:
|
||||
$'454/СостояниеРэс3'.self_modulate = Color.WEB_GREEN
|
||||
$'СкруглённыйПрямоугольникБелый/Label3'.text = 'Трасса'
|
||||
$'СкруглённыйПрямоугольникБелый/Label4'.text = 'Трасса'
|
||||
$'СкруглённыйПрямоугольникБелый/Label5'.text = 'Активный'
|
||||
$'СкруглённыйПрямоугольникБелый/Label6'.text = str(unit_trassa.daa)
|
||||
$'СкруглённыйПрямоугольникБелый/Label7'.text = str(unit_trassa.dap)
|
||||
$'СкруглённыйПрямоугольникБелый/Label8'.text = '1'
|
||||
$'СкруглённыйПрямоугольникБелый/Label9'.text = str(unit_trassa.lfb)
|
||||
$'СкруглённыйПрямоугольникБелый/Label10'.text = str(unit_trassa.lfb)
|
||||
else:
|
||||
$'454/СостояниеРэс3'.self_modulate = Color.WHITE
|
||||
$'СкруглённыйПрямоугольникБелый/Label3'.text = '-'
|
||||
$'СкруглённыйПрямоугольникБелый/Label4'.text = '-'
|
||||
$'СкруглённыйПрямоугольникБелый/Label5'.text = '-'
|
||||
$'СкруглённыйПрямоугольникБелый/Label6'.text = '-'
|
||||
$'СкруглённыйПрямоугольникБелый/Label7'.text = '-'
|
||||
$'СкруглённыйПрямоугольникБелый/Label8'.text = '-'
|
||||
$'СкруглённыйПрямоугольникБелый/Label9'.text = '-'
|
||||
$'СкруглённыйПрямоугольникБелый/Label10'.text = '-'
|
||||
|
||||
|
||||
func on_sector_klaster(_data, unit_trassa):
|
||||
$'СкруглённыйПрямоугольникБелый/Label6'.text = str(unit_trassa.dap)
|
||||
$'СкруглённыйПрямоугольникБелый/Label7'.text = str(unit_trassa.daa)
|
||||
$'СкруглённыйПрямоугольникБелый/Label8'.text = '1'
|
||||
$'СкруглённыйПрямоугольникБелый/Label9'.text = str(unit_trassa.lfb)
|
||||
$'СкруглённыйПрямоугольникБелый/Label10'.text = str(unit_trassa.hfb)
|
||||
@@ -19,7 +19,7 @@ const ITERFER_MODE = {
|
||||
'svm2': [INTERFER_IQFILE, SVM2_PARAMS, 21],
|
||||
'k1': [INTERFER_IQFILE, K1_PARAMS, 50],
|
||||
'ozp1': [INTERFER_IQFILE, OZP1_PARAMS, 51],
|
||||
'eprls': [INTERFER_IQFILE, EPRLS_PARAMS, 52] }
|
||||
'elrs': [INTERFER_IQFILE, ELRS_PARAMS, 52] }
|
||||
|
||||
const RECOMMEND_INTERFER = {
|
||||
'ПСП + ФМ-2': 'srni1',
|
||||
@@ -75,7 +75,7 @@ const SVM2_PARAMS = {'files': {1: ['SVM2_LIT2.pcm', 1017],
|
||||
2: ['SVM2_LIT3.pcm', 1156]},
|
||||
'call_proc': 'call_diap',
|
||||
'par_names' : ['freq', 'filename']}
|
||||
const EPRLS_PARAMS = {'files' : 'ERLS.pcm',
|
||||
const ELRS_PARAMS = {'files' : 'ELRS.pcm',
|
||||
'call_proc' : 'call_all_diap',
|
||||
'par_names' : ['freq', 'filename']}
|
||||
# Файл : Ключ (ширина): ['имя файла']
|
||||
@@ -94,6 +94,9 @@ const INTERFER_OFF = 'off'
|
||||
const INTERFER_IQFILE = 'IQ-файл'
|
||||
const POW_DEFAULT: float = 50.0
|
||||
const PERIOD_DEFAULT = 7.5
|
||||
const MIN_WIDTH_COEF = 1.0
|
||||
const MIN_RESEND_TIMEOUT = 0.05
|
||||
|
||||
var msg6_num: int = 0 ## Счётчик сообщений "тип 6"
|
||||
var msg8_num: int = 0 ## Счётчик сообщений "тип 8"
|
||||
var id_array: Array ## Массив id воздействий.
|
||||
@@ -109,12 +112,11 @@ var gos_flag = true ## Флаг работать п
|
||||
var gos_protocols: PackedStringArray ## Список протоколов своих целей
|
||||
var gos_nmfs: Array ## Список номеров блоков ФС для которых запрещена работа
|
||||
var fs_closed: Dictionary ## Словарь секторов запрета
|
||||
var width_coef: float = 1.5 ## Коэффициент расширения полосы
|
||||
var now: = 0.0 ## Время с момента запуска
|
||||
var resend_timeout: float = 1.0 ## Время повторной отправки команды
|
||||
|
||||
|
||||
## Режимы работы АФСП и БПО (Протокол ТНИИС-СТЦ, пункт 2.5.10)
|
||||
enum AFSP_BPO_MODE {
|
||||
run = 1,
|
||||
test = 2 }
|
||||
signal send_ecms(time_now) ## Сигнал отправки помех, если настало время
|
||||
|
||||
|
||||
## Сеанс помехи.
|
||||
@@ -127,13 +129,12 @@ class Interfer:
|
||||
var params: = {} ## Параметры помехи.
|
||||
var get_params: Array[String] ## Запрос массива параметров (список запрошенных параметров).
|
||||
var retss: int ## Значение счётчика сообщения в котором был произведён запрос массива параметров.
|
||||
var tick_tx: int ## Тик время обновления цели, мс.
|
||||
var tick_tx: float ## Тик время обновления цели, мс.
|
||||
var source_interfer: String = '' ## Тип объекта по которой поставлена помеха.
|
||||
var modulation: bool ## Модуляция для включения усилителей
|
||||
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]
|
||||
@@ -145,7 +146,6 @@ 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
|
||||
@@ -199,41 +199,33 @@ func _ready() -> void:
|
||||
id_array.append(i + 1)
|
||||
var unit_caps = network.get_unit_instance('уарэп-капсрпб')
|
||||
var unit_5p28 = network.get_unit_instance('уарэп-5п28')
|
||||
var timer_check_state: = Timer.new()
|
||||
add_child(timer_check_state)
|
||||
var resend_timeout = ProjectSettings.get_setting('application/interfer/resend_timeout', 1000.0)
|
||||
var ecms: Dictionary = {} ## Словарь помех.
|
||||
var seczaps: Dictionary = {} ## Словарь секторов запрета
|
||||
timer_check_state.connect('timeout', Callable(self, 'on_timer_check_state').bind(unit_caps, ecms, resend_timeout))
|
||||
timer_check_state.start(resend_timeout / 1000.0)
|
||||
unit_caps.connect('data_received', Callable(self, 'on_data_capsrpb_received').bind(ecms, seczaps))
|
||||
unit_5p28.connect('get_interfers', Callable(self, 'on_get_interfers').bind(unit_5p28, ecms))
|
||||
signaller.connect('interfer_create', Callable(self, 'on_interfer_create').bind(unit_caps, ecms))
|
||||
signaller.connect('interfer_rcv', Callable(self, 'on_interfer_rcv').bind(unit_5p28, unit_caps, ecms))
|
||||
signaller.connect('interfer_new', Callable(self, 'on_interfer_new').bind(unit_caps))
|
||||
signaller.connect('interfer_new', Callable(self, 'on_interfer_new'))
|
||||
signaller.connect('interfer_off_all', Callable(self, 'on_interfer_off_all').bind(unit_caps, ecms))
|
||||
signaller.connect('th_aoa_update', Callable(self, 'on_th_aoa_update').bind(ecms, unit_caps))
|
||||
signaller.connect('th_aoa_update', Callable(self, 'on_th_aoa_update').bind(ecms))
|
||||
signaller.connect('interfer_off', Callable(self, 'on_interfer_off').bind(ecms, unit_caps))
|
||||
signaller.connect('manual_control', Callable(self, 'on_manual_control'))
|
||||
signaller.connect('full_auto', Callable(self, 'on_full_auto'))
|
||||
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'))
|
||||
threats.connect('threat_update', Callable(self, 'on_threats_update').bind(ecms, unit_caps))
|
||||
threats.connect('threat_update', Callable(self, 'on_threats_update').bind(ecms))
|
||||
ProjectSettings.connect('settings_changed', on_settings_changed)
|
||||
var unit_nav: = network.get_unit_instance('навигация')
|
||||
unit_nav.connect('data_received', on_nav_data_received.bind(unit_caps))
|
||||
connect('send_ecms', Callable(self, 'on_send_ecms').bind(ecms, unit_caps))
|
||||
call_deferred('emit_signal', 'interfer_resized', ecms)
|
||||
|
||||
|
||||
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):
|
||||
@@ -260,20 +252,11 @@ func on_nav_data_received(coords: Dictionary, unit_caps):
|
||||
msg8_num %= 0xffffffff
|
||||
|
||||
|
||||
## Проверяет состояние отправки пакета и если не доставлен, повторяет отправку.
|
||||
func on_timer_check_state(unit_instance, ecms, resend_timeout) -> void:
|
||||
var tick = Time.get_ticks_msec()
|
||||
for ecm in ecms.values():
|
||||
if (tick - ecm.tick_tx) >= resend_timeout:
|
||||
send_ecm(ecm, unit_instance)
|
||||
ecm.tick_tx = tick
|
||||
|
||||
|
||||
func on_th_aoa_update(threats: Dictionary, ecms: Dictionary, unit_instance) -> void:
|
||||
func on_th_aoa_update(threats: Dictionary, ecms: Dictionary) -> void:
|
||||
gos_nmfs.clear()
|
||||
for thr in threats.values():
|
||||
var fs_arr: Array = []
|
||||
var th_aoa = fposmod(thr.aoa - course, 360)
|
||||
var th_aoa: = fposmod(thr.aoa - course, 360)
|
||||
prd.find_fs_index(th_aoa, thr.freq, fs_arr)
|
||||
if fs_arr.size():
|
||||
for item in fs_arr:
|
||||
@@ -289,10 +272,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:
|
||||
interfer_off(ecm, unit_instance)
|
||||
signaller.emit_signal('interfer_off', ecm)
|
||||
ecm_active = false
|
||||
if ecm_active and (prd.fs_caps_id[ecm.nmfs] in fs_closed):
|
||||
interfer_off(ecm, unit_instance)
|
||||
signaller.emit_signal('interfer_off', ecm)
|
||||
|
||||
var th_id = thr.id
|
||||
for ecm_i in thrs.keys():
|
||||
@@ -301,12 +284,8 @@ func on_th_aoa_update(threats: Dictionary, ecms: Dictionary, unit_instance) -> v
|
||||
ecm.params['freq'] = thr.freq
|
||||
ecm.kni = fposmod(thr.aoa - course, 360)
|
||||
call_ecm_proc(ecm)
|
||||
if ecm.nmfs in gos_nmfs:
|
||||
interfer_off(ecm, unit_instance)
|
||||
elif prd.fs_caps_id[ecm.nmfs] in fs_closed:
|
||||
interfer_off(ecm, unit_instance)
|
||||
else:
|
||||
send_ecm(ecm, unit_instance)
|
||||
if ecm.nmfs in gos_nmfs or prd.fs_caps_id[ecm.nmfs] in fs_closed:
|
||||
signaller.emit_signal('interfer_off', ecm)
|
||||
signaller.emit_signal('fs_update_color', ecms)
|
||||
prd.update_fs_state(ecms, trenazh_mode)
|
||||
|
||||
@@ -363,7 +342,7 @@ func map_msvk_to_ecms(unit_instance: unit.Unit, ecms: Dictionary):
|
||||
for ecm in ecms.values():
|
||||
if (ecm.ispp not in ispp_arr) and (ecm.krp == INTERFER_OFF):
|
||||
var sz = ecms.size()
|
||||
signaller.emit_signal('on_prog_ecm_off', ecm)
|
||||
signaller.emit_signal('prog_ecm_off', ecm)
|
||||
ecms.erase(ecm.ispp)
|
||||
thrs.erase(ecm.ispp)
|
||||
cu.erase(ecm.ispp)
|
||||
@@ -394,7 +373,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:
|
||||
interfer_off(ecm, u)
|
||||
signaller.emit_signal('interfer_off', ecm)
|
||||
elif item.priority < ecm.priority:
|
||||
need_continue = true
|
||||
break
|
||||
@@ -405,7 +384,7 @@ func on_interfer_create(interfer_name, sel_threats, fs_arr, power, u, ecms) -> v
|
||||
kni += 360.0
|
||||
var id = item.id
|
||||
param['freq'] = item.freq
|
||||
param['width'] = item.width * 1.5
|
||||
param['width'] = item.width * width_coef
|
||||
if (item.rkrp != '') and item.fflags.rkrp and auto_enabled:
|
||||
var krp = get_krp(item)
|
||||
if krp != '':
|
||||
@@ -456,7 +435,7 @@ func on_interfer_rcv(interfer_params: Array, unit0, unit_caps, ecms) -> void:
|
||||
unit0.on_interfer_accept(err)
|
||||
|
||||
|
||||
func interfer_create(u, interfer_name, ecms, param, kni, id, dict, source_interfer, power) -> void:
|
||||
func interfer_create(_u, interfer_name, ecms, param, kni, id, dict, source_interfer, power) -> void:
|
||||
var sz = ecms.size()
|
||||
var ispp: int = 0
|
||||
param['dur'] = 1.0 # Необходимо добавить параметры управления
|
||||
@@ -495,12 +474,13 @@ func interfer_create(u, interfer_name, ecms, param, kni, id, dict, source_interf
|
||||
var set_nmfs_ok = set_nmfs(ecm)
|
||||
if set_nmfs_ok != Error.OK:
|
||||
log.error('Ошибка выбора модуля ФС для помехи: %s' %[ecm.ispp])
|
||||
ecms.erase(ispp)
|
||||
dict.erase(ispp)
|
||||
return
|
||||
signaller.emit_signal('interfer_new', ecm)
|
||||
if interfer_name == 'off':
|
||||
signaller.emit_signal('interfer_off', ecm)
|
||||
thrs.erase(ispp)
|
||||
ecm.tick_tx = Time.get_ticks_msec()
|
||||
send_ecm(ecm, u)
|
||||
if sz != ecms.size():
|
||||
call_deferred('emit_signal', 'interfer_resized', ecms)
|
||||
|
||||
@@ -508,7 +488,6 @@ 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
|
||||
@@ -516,17 +495,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():
|
||||
interfer_off(ecm, unit0)
|
||||
signaller.emit_signal('interfer_off', ecm)
|
||||
|
||||
|
||||
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]
|
||||
interfer_off(ecm, unit0)
|
||||
signaller.emit_signal('interfer_off', ecm)
|
||||
|
||||
|
||||
func pop_id() -> int:
|
||||
@@ -587,7 +566,7 @@ func on_threats_resized(th_dic):
|
||||
thrs_dict = th_dic
|
||||
|
||||
|
||||
func on_threats_update(threat, ecms, unit_caps):
|
||||
func on_threats_update(threat, ecms):
|
||||
var th_id = threat.id
|
||||
var ecm = null
|
||||
for ecm_i in thrs.keys():
|
||||
@@ -595,7 +574,7 @@ func on_threats_update(threat, ecms, unit_caps):
|
||||
ecm = ecms[ecm_i]
|
||||
ecm.priority = threat.priority
|
||||
ecm.params['freq'] = threat.freq
|
||||
var width = threat.width * 1.5
|
||||
var width = threat.width * width_coef
|
||||
ecm.params['width'] = width
|
||||
check_width(ecm.params)
|
||||
if (threat.rkrp != '') and threat.fflags.rkrp and auto_enabled:
|
||||
@@ -611,8 +590,6 @@ func on_threats_update(threat, ecms, unit_caps):
|
||||
if ecm.kni < 0:
|
||||
ecm.kni += 360
|
||||
set_nmfs(ecm)
|
||||
if ecm != null:
|
||||
send_ecm(ecm, unit_caps)
|
||||
|
||||
|
||||
func find_threat(freq: int, aoa: float):
|
||||
@@ -635,9 +612,9 @@ func set_rparams(threat: threats.Threat, params: Dictionary):
|
||||
else:
|
||||
params['freq'] = threat.freq
|
||||
if threat.rparams.has('width'):
|
||||
params['width'] = threat.rparams['width'] * 1.5
|
||||
params['width'] = threat.rparams['width'] * width_coef
|
||||
else:
|
||||
params['width'] = threat.width * 1.5
|
||||
params['width'] = threat.width * width_coef
|
||||
check_width(params)
|
||||
if threat.rparams.has('filename'):
|
||||
params['filename'] = threat.rparams['filename']
|
||||
@@ -653,30 +630,50 @@ func get_krp(threat: threats.Threat):
|
||||
for key in ITERFER_MODE.keys():
|
||||
var ecm_params = ITERFER_MODE[key][1]
|
||||
if not ecm_params.has('files'): continue
|
||||
if ecm_params['files'] == threat.rparams['filename']:
|
||||
krp = key
|
||||
return krp
|
||||
if typeof(ecm_params['files']) == TYPE_DICTIONARY:
|
||||
for value in ecm_params['files'].values():
|
||||
if typeof(value) == TYPE_STRING:
|
||||
if value == threat.rparams['filename']:
|
||||
krp = key
|
||||
return krp
|
||||
elif typeof(value) == TYPE_ARRAY:
|
||||
if value[0] == threat.rparams['filename']:
|
||||
krp = key
|
||||
return krp
|
||||
elif typeof(ecm_params['files']) == TYPE_STRING:
|
||||
if ecm_params['files'] == threat.rparams['filename']:
|
||||
krp = key
|
||||
return krp
|
||||
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('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):
|
||||
func on_interfer_new(ecm):
|
||||
call_ecm_proc(ecm)
|
||||
send_ecm(ecm, unit_caps)
|
||||
|
||||
|
||||
func on_settings_changed():
|
||||
gos_flag = ProjectSettings.get_setting('application/config/Включить работу по своим целям', true)
|
||||
var protocols: String = ProjectSettings.get_setting('application/config/Список своих протоколов', '')
|
||||
gos_protocols = protocols.split(",", true)
|
||||
width_coef = float(ProjectSettings.get_setting('application/config/Коэффициент ширины полосы излучения', 1.5))
|
||||
if width_coef < MIN_WIDTH_COEF: width_coef = MIN_WIDTH_COEF
|
||||
resend_timeout = float(ProjectSettings.get_setting('application/config/Время повторной отправки помехи', 1.0))
|
||||
if resend_timeout < MIN_RESEND_TIMEOUT: resend_timeout = MIN_RESEND_TIMEOUT
|
||||
|
||||
|
||||
func call_ecm_proc(ecm):
|
||||
@@ -705,3 +702,15 @@ func set_th_emit(th: threats.Threat, ecm: Interfer):
|
||||
func check_width(param: Dictionary):
|
||||
if (param['width'] < settings.WIDTH_MIN): param['width'] = settings.WIDTH_MIN
|
||||
elif (param['width'] > settings.WIDTH_MAX): param['width'] = settings.WIDTH_MAX
|
||||
|
||||
|
||||
func on_send_ecms(time_now, ecms, unit_caps):
|
||||
for ecm in ecms.values():
|
||||
if (time_now - ecm.tick_tx) >= resend_timeout:
|
||||
send_ecm(ecm, unit_caps)
|
||||
ecm.tick_tx = time_now
|
||||
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
now += delta
|
||||
emit_signal('send_ecms', now)
|
||||
|
||||
@@ -400,6 +400,7 @@ func _process(_delta: float) -> void:
|
||||
if Engine.is_editor_hint(): return
|
||||
tick = Time.get_ticks_msec()
|
||||
RenderingServer.global_shader_parameter_set('tick_curent', tick)
|
||||
RenderingServer.global_shader_parameter_set('random_value', randf())
|
||||
for unit_name: StringName in units_udptx:
|
||||
var unit_udptx: = units_udptx[unit_name]
|
||||
var sock: = send_sockets[unit_name]
|
||||
|
||||
@@ -2,6 +2,8 @@ extends Node
|
||||
|
||||
enum PrdState {WORK, CONTROL}
|
||||
|
||||
const TIME_YAU07_SEND = 50
|
||||
|
||||
## Границы секторов блоков ФС по частоте в режиме РТО.
|
||||
const FS_BAND_RTO: Dictionary = {
|
||||
0: [200.0, 250.0],
|
||||
@@ -119,6 +121,9 @@ 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)
|
||||
|
||||
@@ -149,6 +154,9 @@ 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 {
|
||||
@@ -208,7 +216,6 @@ 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
|
||||
@@ -303,7 +310,6 @@ class PRD:
|
||||
break
|
||||
return STATE_DEVICE.NONE if all_online else STATE_DEVICE.ERROR
|
||||
|
||||
|
||||
func execute_cmd():
|
||||
if not len(cmd_array): return
|
||||
if unit_yau07.cmd_state != unit_yau07.CmdState.DONE: return
|
||||
@@ -338,14 +344,16 @@ 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()
|
||||
@@ -353,6 +361,7 @@ 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
|
||||
@@ -367,6 +376,7 @@ 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('навигация')
|
||||
@@ -433,7 +443,6 @@ 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)
|
||||
@@ -461,6 +470,7 @@ 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'):
|
||||
@@ -479,3 +489,16 @@ 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 = 15
|
||||
const COUNT_PACK_POWER_RECIEVE = 10
|
||||
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) # Установка максимального значения для прогресс бара
|
||||
|
||||
@@ -289,6 +289,8 @@ func _process(_delta: float) -> void:
|
||||
## Обработка данных от ЯУ-07
|
||||
func on_data_received(unit_pribor: Object) -> void:
|
||||
var status: PackedByteArray = unit_pribor.status
|
||||
if status.size() < 100: push_error('Принимаемые значения от ЯУ-07б:%s не коррентны. (размер пакета: %d)' % [self_name, status.size()]); return
|
||||
|
||||
temperature_um = check_temperature_um(status)
|
||||
flags.temperature_ok = check_overheating(temperature_um)
|
||||
block_ip_config = check_block_ip(status, block_ip_config)
|
||||
@@ -390,7 +392,6 @@ func _handle_init_state() -> void:
|
||||
if _get_current_ecm(): return
|
||||
state = STATE_MACHINE.CHEK_KASSETA_Y5
|
||||
else:
|
||||
if _get_current_ecm(): return
|
||||
# Завершение контроля если литеры закончились
|
||||
flags.control_is_over = true
|
||||
power_result = prep_power(power_for_litera, self_name)
|
||||
@@ -996,18 +997,17 @@ static func on_y5_control_result(block_kasseta: Dictionary) -> bool:
|
||||
## Установка угла и аттенюации для УМ
|
||||
static func on_ug_setting(prd_unit: Object, settings_ug: Dictionary, prd_cmd_array: Array, cur_litera: int) -> bool:
|
||||
var result_1: int
|
||||
var result_2: int
|
||||
if cur_litera == 1:
|
||||
result_1 = ((settings_ug.ATT_UM_1 & 0x07) << 3) | (settings_ug.RAY_DOU_NUM & 0x07)
|
||||
prd_cmd_array.append([prd_unit.CmdCode.WRITE_ISA, [settings_ug.ADDR_UG_LITERA_1, result_1]])
|
||||
prd_cmd_array.append([prd_unit.CmdCode.WRITE_ISA, [settings_ug.ADDR_UG_LITERA_3, settings_ug.ATT_UM_3]])
|
||||
else:
|
||||
#if cur_litera in [2, 4, 6]:
|
||||
result_1 = ((settings_ug.ATT_UM_1 & 0x07) << 3) | (settings_ug.RAY_DOU_NUM & 0x07)
|
||||
prd_cmd_array.append([prd_unit.CmdCode.WRITE_ISA, [settings_ug.ADDR_UG_LITERA_1, result_1]])
|
||||
#elif cur_litera in [3, 5, 7]:
|
||||
result_2 = ((settings_ug.ATT_UM_2 & 0x07) << 3) | (settings_ug.RAY_DOU_NUM & 0x07)
|
||||
prd_cmd_array.append([prd_unit.CmdCode.WRITE_ISA, [settings_ug.ADDR_UG_LITERA_2, result_2]])
|
||||
if cur_litera in [2, 4, 6]:
|
||||
result_1 = ((settings_ug.ATT_UM_1 & 0x07) << 3) | (settings_ug.RAY_DOU_NUM & 0x07)
|
||||
prd_cmd_array.append([prd_unit.CmdCode.WRITE_ISA, [settings_ug.ADDR_UG_LITERA_1, result_1]])
|
||||
elif cur_litera in [3, 5, 7]:
|
||||
result_1 = ((settings_ug.ATT_UM_2 & 0x07) << 3) | (settings_ug.RAY_DOU_NUM & 0x07)
|
||||
prd_cmd_array.append([prd_unit.CmdCode.WRITE_ISA, [settings_ug.ADDR_UG_LITERA_2, result_1]])
|
||||
return true
|
||||
|
||||
|
||||
@@ -1288,7 +1288,7 @@ static func check_dou_result(control_dic: Dictionary, power_dic: Dictionary, pri
|
||||
|
||||
var ray_dic: Dictionary = power_dic[litera]
|
||||
# Проверка наличия данных
|
||||
if ray_dic[RAY_m5].size() == 0 or \
|
||||
if ray_dic[RAY_m5].size() == 0 or \
|
||||
ray_dic[RAY_5 ].size() == 0 or \
|
||||
ray_dic[RAY_15].size() == 0 or \
|
||||
ray_dic[RAY_25].size() == 0 or \
|
||||
@@ -1301,7 +1301,7 @@ static func check_dou_result(control_dic: Dictionary, power_dic: Dictionary, pri
|
||||
var low_power_by_position: Array = [0, 0, 0, 0, 0, 0] # Счетчики для 6 позиций
|
||||
for ray_key in [RAY_m5, RAY_5, RAY_15, RAY_25, RAY_35, RAY_45]:
|
||||
var power_array: Array = ray_dic[ray_key]
|
||||
for i in range(power_array.size()):
|
||||
for i in power_array.size():
|
||||
if power_array[i] < cnst.POWER_THRESHOLD:
|
||||
low_power_by_position[i] += 1
|
||||
|
||||
@@ -1358,6 +1358,7 @@ func restore_default_states() -> void:
|
||||
|
||||
_set_status('Состояния сброшены к значениям по умолчанию')
|
||||
|
||||
|
||||
## Получение текущих состояний для отладки
|
||||
func get_current_states() -> Dictionary:
|
||||
return {
|
||||
|
||||
@@ -30,12 +30,15 @@ signal режим_журнал()
|
||||
## Вызывается при переходе в режим [b]ЭМС[/b].
|
||||
signal режим_эмс()
|
||||
|
||||
|
||||
## Вызывается при переходе в режим [b]ЭМС ТГ[/b].
|
||||
signal режим_эмс2()
|
||||
|
||||
|
||||
## Вызывается при переходе в режим [b]Настройка[/b].
|
||||
signal режим_настройки()
|
||||
|
||||
|
||||
## Вызывается при включении/отключении режима [b]Тренаж[/b].[br]
|
||||
## [param val] - [b]true[/b] тренаж включён.
|
||||
signal режим_тренаж(val: bool)
|
||||
@@ -204,7 +207,7 @@ signal update_coordinates_map(new_coordinates)
|
||||
|
||||
## Вызывается при изменении исправности прибора УФ.[br]
|
||||
## [param uf_serviceaability] - обновленное значение состояния исправности ([b]true[/b]
|
||||
signal update_uf_serviceability(uf_serviceaability: bool)
|
||||
signal update_uf_serviceability(uf_serviceaability: int)
|
||||
|
||||
|
||||
signal tool_tip(new_ctrl_pos)
|
||||
@@ -215,10 +218,10 @@ signal tool_tip(new_ctrl_pos)
|
||||
signal update_fs_closed(fs_closed: Dictionary)
|
||||
|
||||
|
||||
signal sector_klaster (new_sector_data)
|
||||
signal sector_klaster(new_sector_data)
|
||||
|
||||
|
||||
signal clear_klaster ()
|
||||
signal clear_klaster()
|
||||
|
||||
|
||||
## Вызывается при нажатии на кнопку "Запуск контроля".[br]
|
||||
@@ -227,4 +230,8 @@ signal start_contol_device()
|
||||
|
||||
## Вызывается при программном отключении помехи.[br]
|
||||
## [param ecm] - выключаемая помеха ([b]true[/b]
|
||||
signal on_prog_ecm_off(ecm: interfer.Interfer)
|
||||
signal prog_ecm_off(ecm: interfer.Interfer)
|
||||
|
||||
|
||||
## Вызывается при подключении обработчиков в режиме работа.[br]
|
||||
signal connect_work_signal()
|
||||
|
||||
@@ -160,7 +160,7 @@ class TCP5P28 extends unit.Unit:
|
||||
flags |= 0 << 8 # Флаг рекомендуемой помехи
|
||||
flags |= int(th.fflags['aoa']) << 9 # Флаг доставерности пеленга
|
||||
flags |= int(th.fflags['alt']) << 10 # Флаг доставерности высоты
|
||||
flags |= int(th.fflags['power']) << 11 # Флаг доставерности мощности
|
||||
flags |= int(th.fflags['pow']) << 11 # Флаг доставерности мощности
|
||||
flags |= int(th.fflags['baud']) << 12 # Флаг доставерности ск. мод.
|
||||
flags |= int(th.fflags['slon']) << 13 # Флаг доставерности долготы ст. позиции
|
||||
flags |= int(th.fflags['slat']) << 14 # Флаг доставерности широты ст. позиции
|
||||
@@ -174,7 +174,7 @@ class TCP5P28 extends unit.Unit:
|
||||
th_data.encode_u16(16, int(th.alt)) # Высота объекта
|
||||
th_data.encode_u16(18, int(th.freq)) # Частота объекта
|
||||
th_data.encode_u16(20, int(th.width)) # Ширина частотной полосы объекта
|
||||
th_data.encode_u8(22, int(th.power)) # Мощность излучения объекта
|
||||
th_data.encode_u8(22, int(th.pow)) # Мощность излучения объекта
|
||||
var mod = MOD_TYPES.find(th.tmod)
|
||||
if mod == -1: mod = 0
|
||||
th_data.encode_u8(23, int(mod)) # Тип модуляции
|
||||
|
||||
@@ -1,36 +1,48 @@
|
||||
extends Node
|
||||
|
||||
## Работа с целями.
|
||||
|
||||
const MSG9_RESEND_TIMEOUT = 1.0 ## Время повторной отправки пакета 9
|
||||
|
||||
## Режимы работы АФСП и БПО (Протокол ТНИИС-СТЦ, пункт 2.5.10)
|
||||
enum AFSP_BPO_MODE {
|
||||
run = 1,
|
||||
test = 2 }
|
||||
|
||||
var msg9_num: int = 0 ## Счётчик сообщений "тип 9"
|
||||
var gos_flag = true ## Флаг работать по своим целям
|
||||
var gos_protocols: PackedStringArray ## Список протоколов своих целей
|
||||
var bpo_mode: = AFSP_BPO_MODE.run ## Режим работы АФСП и БПО
|
||||
var bpo_mode_rx: = AFSP_BPO_MODE.run ## Режим работы БПО полученный от
|
||||
|
||||
## Цель
|
||||
class Threat:
|
||||
var alt: float ## Текущая высота, метры.
|
||||
var aoa: float ## Курсовой угол на источник сигнала, градусы.
|
||||
var atick: float ## Тик обнаружения.
|
||||
var baud: float ## Модуляционная скорость.
|
||||
var fflags: Dictionary ## Флаги достоверности полей.
|
||||
var freq: float ## Частота несущей или центральная частота, МГц.
|
||||
var freqm: String ## Режим смены частоты.
|
||||
var id: int ## Идентификатор цели.
|
||||
var lat: float ## Текущие координаты, широта в градусах.
|
||||
var lon: float ## Текущие координаты, долгота в градусах.
|
||||
var power: float ## Уровень принимаемого сигнала, дБм.
|
||||
var proto: String ## Тип протокола источника сигнала.
|
||||
var rkrp: String ## Рекомендуемый режим помехи.
|
||||
var rparams: Dictionary ## Рекомендуемые параметры помехи.
|
||||
var salt: float ## Координаты старта, высота от уровня моря, м.
|
||||
var slat: float ## Координаты старта, широта в градусах.
|
||||
var slon: float ## Координаты старта, долгота в градусах.
|
||||
var tick: int ## Тик время приёма сигнала, мс.
|
||||
var tick_rx: int ## Тик время обновления цели, мс.
|
||||
var tmod: String ## Тип модуляции.
|
||||
var width: float ## Ширина занимаемого диапазона частот, МГц.
|
||||
var selected: bool ## Флаг, что цель выбрана.
|
||||
var auto_selected: bool = false ## Флаг автомата для целей
|
||||
var emit_state: int = 0 ## 0 - подавление не назначено, 1 - назначено, 2 - выполняется
|
||||
var nmfs: int ## Индекс модуля ФС, в зону действия которого попала цель
|
||||
var priority: int ## Приоритет опасности цели
|
||||
var alt: float ## Текущая высота, метры.
|
||||
var aoa: float ## Курсовой угол на источник сигнала, градусы.
|
||||
var atick: float ## Тик обнаружения.
|
||||
var baud: float ## Модуляционная скорость.
|
||||
var fflags: Dictionary ## Флаги достоверности полей.
|
||||
var freq: float ## Частота несущей или центральная частота, МГц.
|
||||
var freqm: String ## Режим смены частоты.
|
||||
var id: int ## Идентификатор цели.
|
||||
var lat: float ## Текущие координаты, широта в градусах.
|
||||
var lon: float ## Текущие координаты, долгота в градусах.
|
||||
var pow: float ## Уровень принимаемого сигнала, дБм.
|
||||
var proto: String ## Тип протокола источника сигнала.
|
||||
var rkrp: String ## Рекомендуемый режим помехи.
|
||||
var rparams: Dictionary ## Рекомендуемые параметры помехи.
|
||||
var salt: float ## Координаты старта, высота от уровня моря, м.
|
||||
var slat: float ## Координаты старта, широта в градусах.
|
||||
var slon: float ## Координаты старта, долгота в градусах.
|
||||
var tick: int ## Тик время приёма сигнала, мс.
|
||||
var tick_rx: int ## Тик время обновления цели, мс.
|
||||
var tmod: String ## Тип модуляции.
|
||||
var width: float ## Ширина занимаемого диапазона частот, МГц.
|
||||
var selected: bool ## Флаг, что цель выбрана.
|
||||
var auto_selected: bool = false ## Флаг автомата для целей
|
||||
var emit_state: int = 0 ## 0 - подавление не назначено, 1 - назначено, 2 - выполняется
|
||||
var nmfs: int ## Индекс модуля ФС, в зону действия которого попала цель
|
||||
var priority: int ## Приоритет опасности цели
|
||||
var gos: bool = false ## Своя или чужая цель
|
||||
|
||||
func _init(): clear_fflags()
|
||||
func _to_string() -> String: return 'номер: %d пеленг: %0.1f частота: %0.1f МГц' % [id, aoa, freq]
|
||||
@@ -51,24 +63,32 @@ func _ready() -> void:
|
||||
var unit_caps = network.get_unit_instance('уарэп-капсрпб')
|
||||
var unit_5p28 = network.get_unit_instance('уарэп-5п28')
|
||||
var timer_check_lost: = Timer.new()
|
||||
var timer_msg9: = Timer.new()
|
||||
var timer_aoa_update: = Timer.new()
|
||||
add_child(timer_check_lost)
|
||||
add_child(timer_aoa_update)
|
||||
add_child(timer_msg9)
|
||||
var threats = {} ## Список целей. Индекс - <номер цели>
|
||||
unit_caps.connect('data_received', Callable(self, 'on_data_capsrpb_received').bind(threats))
|
||||
unit_caps.connect('line_changed', Callable(self, 'on_caps_line_changed').bind(timer_msg9))
|
||||
unit_5p28.connect('get_threats', Callable(self, 'on_get_threats').bind(unit_5p28, threats))
|
||||
timer_check_lost.connect('timeout', Callable(self, 'on_timer_check_lost').bind(settings.ThreatParams.time_lost, threats))
|
||||
timer_check_lost.start(settings.ThreatParams.time_lost / 1000.0)
|
||||
timer_aoa_update.connect('timeout', Callable(self, 'on_timer_aoa_update').bind(threats, timer_aoa_update))
|
||||
timer_aoa_update.start(3.0)
|
||||
timer_aoa_update.one_shot = true
|
||||
timer_msg9.connect('timeout', Callable(self, 'on_timer_msg9').bind(unit_caps, timer_msg9))
|
||||
|
||||
signaller.connect('rto_threat_sel', Callable(self, 'on_rto_threat_sel').bind(threats))
|
||||
signaller.connect('rto_threat_unsel', Callable(self, 'on_rto_threat_unsel').bind(threats))
|
||||
signaller.connect('rto_threat_unsel_all', Callable(self, 'on_rto_threat_unsel_all').bind(threats))
|
||||
signaller.connect('threat_selected', Callable(self, 'on_threat_selected').bind(threats))
|
||||
signaller.connect('interfer_init', Callable(self, 'on_interfer_init').bind(threats))
|
||||
signaller.connect('connect_work_signal', Callable(self, 'on_connect_work_signal').bind(threats))
|
||||
signaller.connect('режим_контроль', Callable(self, 'on_mode_change').bind(unit_caps, timer_msg9, AFSP_BPO_MODE.test))
|
||||
signaller.connect('режим_работа', Callable(self, 'on_mode_change').bind(unit_caps, timer_msg9, AFSP_BPO_MODE.run))
|
||||
|
||||
ProjectSettings.connect('settings_changed', on_settings_changed.bind(threats))
|
||||
|
||||
## Периодически удаляет устаревшие цели.
|
||||
func on_timer_check_lost(time_lost: int, threats: Dictionary):
|
||||
@@ -129,8 +149,10 @@ func on_data_capsrpb_received(unit: capsrpb.CapsRpb, threats: Dictionary):
|
||||
if not unit.json_dic.has('ts'): return
|
||||
if unit.json_dic['ts'] != 5: return
|
||||
if not unit.json_dic.has('mis'): return
|
||||
if not unit.json_dic.has('sa'): return
|
||||
|
||||
var mis = unit.json_dic['mis']
|
||||
bpo_mode_rx = int(unit.json_dic['sa']) as AFSP_BPO_MODE
|
||||
var sz: = threats.size()
|
||||
for dic_th in mis:
|
||||
if dic_th is not Dictionary:
|
||||
@@ -147,12 +169,61 @@ func on_data_capsrpb_received(unit: capsrpb.CapsRpb, threats: Dictionary):
|
||||
th.priority = 1
|
||||
else:
|
||||
th.priority = 0
|
||||
set_gos(th)
|
||||
call_deferred('emit_signal', 'threat_update', th)
|
||||
|
||||
else:
|
||||
var th: = Threat.new()
|
||||
th.set_from_dic(dic_th)
|
||||
threats[id] = th
|
||||
th.tick_rx = unit.tick
|
||||
set_gos(th)
|
||||
call_deferred('emit_signal', 'threat_new', th)
|
||||
if sz != threats.size():
|
||||
call_deferred('emit_signal', 'threats_resized', threats)
|
||||
|
||||
|
||||
func on_settings_changed(ths: Dictionary):
|
||||
gos_flag = ProjectSettings.get_setting('application/config/Включить работу по своим целям', true)
|
||||
var protocols: String = ProjectSettings.get_setting('application/config/Список своих протоколов', '')
|
||||
gos_protocols = protocols.split(",", true)
|
||||
for th in ths.values():
|
||||
set_gos(th)
|
||||
|
||||
|
||||
func set_gos(th: Threat):
|
||||
if gos_flag: th.gos = false
|
||||
elif (th.proto in gos_protocols) and th.fflags.proto: th.gos = true
|
||||
|
||||
|
||||
func on_connect_work_signal(ths: Dictionary):
|
||||
emit_signal('threats_resized', ths)
|
||||
|
||||
|
||||
func on_mode_change(unit_caps, timer_msg9, state):
|
||||
bpo_mode = state
|
||||
send_msg9(unit_caps)
|
||||
timer_msg9.start(MSG9_RESEND_TIMEOUT)
|
||||
|
||||
|
||||
func send_msg9(unit_caps):
|
||||
msg9_num += 1
|
||||
var json_data : Dictionary = {}
|
||||
json_data['ts'] = 9
|
||||
json_data['ss'] = msg9_num
|
||||
json_data['sa'] = bpo_mode
|
||||
var pac = JSON.stringify(json_data).to_utf8_buffer()
|
||||
unit_caps.tx_stack.append(pac)
|
||||
|
||||
|
||||
func on_timer_msg9(unit_caps, timer_msg9):
|
||||
if bpo_mode != bpo_mode_rx:
|
||||
send_msg9(unit_caps)
|
||||
else:
|
||||
timer_msg9.stop()
|
||||
|
||||
|
||||
func on_caps_line_changed(unit_caps, timer_msg9):
|
||||
if unit_caps.online:
|
||||
send_msg9(unit_caps)
|
||||
timer_msg9.start(MSG9_RESEND_TIMEOUT)
|
||||
|
||||
@@ -56,9 +56,9 @@ class Trassa extends unit.Unit:
|
||||
online = true
|
||||
emit_signal('line_changed', self)
|
||||
data_type = detect_data(rx_data)
|
||||
if data_type == "json":
|
||||
if data_type == 'json':
|
||||
parse_json(rx_data)
|
||||
elif data_type == "binary":
|
||||
elif data_type == 'binary':
|
||||
parse_byte(rx_data)
|
||||
else:
|
||||
emit_signal('parse_failed', self)
|
||||
|
||||
@@ -9,7 +9,7 @@ class Unit extends Object:
|
||||
SEND, ## Буфер готов для отправки.
|
||||
WAIT, ## Ожидание выполнения.
|
||||
DONE, ## Команда выполнена.
|
||||
FAIL, ## Команда не выполнена.
|
||||
FAIL ## Команда не выполнена.
|
||||
}
|
||||
|
||||
signal line_changed(unit) ## Вызывается при изменении состояния связи
|
||||
@@ -18,7 +18,7 @@ class Unit extends Object:
|
||||
signal parse_failed(unit) ## Вызывается при обнаружении ошибки во входных данных
|
||||
signal data_received(data) ## Вызывается по приёму данных
|
||||
|
||||
var cmd_state = CmdState.UNCK ## Состояние выполнения команды
|
||||
var cmd_state: = CmdState.UNCK ## Состояние выполнения команды
|
||||
var tx_data: = PackedByteArray() ## Буфер для отправки.
|
||||
var tx_len: int = 0 ## Длина последнего отправленного пакета.
|
||||
var tx_tick: int = 0 ## Тик-время отправки буфера
|
||||
|
||||
@@ -72,20 +72,22 @@ class YaU07 extends unit.Unit:
|
||||
rc = Error.OK
|
||||
cmd_tick_tx = tick
|
||||
cmd_retry -= 1
|
||||
cmd_num_tx = (cmd_num_rx + 1) % 0xffff
|
||||
tx_data.encode_u16(2, cmd_num_tx)
|
||||
else:
|
||||
cmd_state = CmdState.FAIL
|
||||
emit_signal('command_fail', self)
|
||||
rc = Error.FAILED
|
||||
return rc
|
||||
|
||||
func send_flash(cmd_code: int, fl_data: Array, num_byte_rd: int, id_sector: int = 0) -> bool:
|
||||
func send_flash(cmd_code: CmdCode, fl_data: Array, num_byte_rd: int, id_sector: int = 0) -> bool:
|
||||
if (cmd_state == CmdState.WAIT) \
|
||||
or (cmd_state == CmdState.SEND) \
|
||||
or (cmd_state == CmdState.UNCK):
|
||||
return false
|
||||
if not ((cmd_code == CmdCode.ERASE_FLASH) or (cmd_code == CmdCode.WRITE_FLASH) \
|
||||
or (cmd_code == CmdCode.READ_FLASH) or (cmd_code == CmdCode.LOAD_FLASH)
|
||||
or (cmd_code == CmdCode.READ_FLASH_MP550) or (cmd_code == CmdCode.WRITE_FLASH_MP550)):
|
||||
if not cmd_code in [CmdCode.ERASE_FLASH,
|
||||
CmdCode.WRITE_FLASH, CmdCode.READ_FLASH, CmdCode.LOAD_FLASH,
|
||||
CmdCode.READ_FLASH_MP550, CmdCode.WRITE_FLASH_MP550]:
|
||||
return false
|
||||
cmd_num_tx = (cmd_num_rx + 1) % 0xffff
|
||||
tx_data.encode_u16(0, cmd_retry)
|
||||
@@ -120,7 +122,7 @@ class YaU07 extends unit.Unit:
|
||||
cmd_code_tx = cmd_code
|
||||
return true
|
||||
|
||||
func send_isa(cmd_code: int, ports_data: Array) -> bool:
|
||||
func send_isa(cmd_code: CmdCode, ports_data: Array) -> bool:
|
||||
if (cmd_state == CmdState.WAIT) \
|
||||
or (cmd_state == CmdState.SEND) \
|
||||
or (cmd_state == CmdState.UNCK):
|
||||
@@ -148,7 +150,7 @@ class YaU07 extends unit.Unit:
|
||||
cmd_code_tx = cmd_code
|
||||
return true
|
||||
|
||||
func send_block(cmd_code: int, block_len: int, port: Array) -> bool:
|
||||
func send_block(cmd_code: CmdCode, block_len: int, port: Array) -> bool:
|
||||
if (cmd_state == CmdState.WAIT) \
|
||||
or (cmd_state == CmdState.SEND) \
|
||||
or (cmd_state == CmdState.UNCK):
|
||||
@@ -171,7 +173,7 @@ class YaU07 extends unit.Unit:
|
||||
cmd_code_tx = cmd_code
|
||||
return true
|
||||
|
||||
func send_load_ems_done(cmd_code: int):
|
||||
func send_load_ems_done(cmd_code: CmdCode) -> bool:
|
||||
if (cmd_state == CmdState.WAIT) \
|
||||
or (cmd_state == CmdState.SEND) \
|
||||
or (cmd_state == CmdState.UNCK):
|
||||
@@ -185,6 +187,7 @@ class YaU07 extends unit.Unit:
|
||||
tx_len = 7
|
||||
cmd_state = CmdState.SEND
|
||||
cmd_code_tx = cmd_code
|
||||
return true
|
||||
|
||||
## Возвращает код команды ЯУ-07.
|
||||
## rx_data - Принятые данные.
|
||||
@@ -305,9 +308,8 @@ class YaU07 extends unit.Unit:
|
||||
|
||||
var cmd_code: int = rx_data[cmd_code_pos] # Код команды
|
||||
|
||||
cmd_code_rx = cmd_code
|
||||
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)
|
||||
@@ -319,6 +321,7 @@ class YaU07 extends unit.Unit:
|
||||
rc = parse_flash(rx_data, status_len, cmd_code)
|
||||
|
||||
if rc:
|
||||
cmd_state = CmdState.DONE
|
||||
emit_signal('command_done', self)
|
||||
else:
|
||||
emit_signal('parse_failed', self)
|
||||
|
||||
101
shaders/antenas.gdshader
Normal file
101
shaders/antenas.gdshader
Normal file
@@ -0,0 +1,101 @@
|
||||
shader_type canvas_item;
|
||||
|
||||
#include "tools.gdshaderinc"
|
||||
|
||||
#define ANT_BAND_FAILED 0U /* Антенна (модуль ФС) не исправно (или нет данных) */
|
||||
#define ANT_BAND_READY 1U /* Антенна (модуль ФС) готова или исправна */
|
||||
#define ANT_BAND_ASSIGNED 2U /* Антенна (модуль ФС) назначена на излучение */
|
||||
#define ANT_BAND_SELECTED 4U /* Антенна (модуль ФС) выбрана оператором */
|
||||
#define ANT_BAND_ACTIVE 8U /* Антенна (модуль ФС) излучает */
|
||||
#define ANT_BAND_DENIED 16U /* Антенна (модуль ФС) запрет работы */
|
||||
|
||||
#define PI2 (PI * 2.0)
|
||||
|
||||
// Конфигурация сетки
|
||||
uniform int grid_cells_angle = 4; /* Количество секторов (90° каждый) */
|
||||
uniform int grid_layers_radius = 7; /* Количество слоёв по радиусу */
|
||||
uniform float alpha: hint_range(0.0, 1.0) = 0.5;
|
||||
uniform float inner_radius = 0.36; /* Внутренняя незакрашенная окружность. Относительное значение */
|
||||
uniform float outer_radius = 1.0; /* Внешний радиус. Относительное значение */
|
||||
uniform float grid_line_width = 0.0025; /* Сетка, ширина линий. Относительное значение */
|
||||
uniform float rotation: hint_range(0, 360) = 0.0;
|
||||
uniform float ffr: hint_range(0.0, 1.0) = 0.15; /* Индикация неисправности модулей ФС. Заметность штриховки. Индикация неисправности модулей ФС */
|
||||
uniform float sfr: hint_range(0.0, 10.0) = 0.0; /* Индикация неисправности модулей ФС. Скорость движения штрховки */
|
||||
uniform float pfr: hint_range(0.01, 1.0) = 0.025; /* Индикация неисправности модулей ФС. Частота штриховки */
|
||||
uniform float afr: hint_range(0.0, 180.0) = 0.0; /* Индикация неисправности модулей ФС. Угол наклона штриховки */
|
||||
|
||||
uniform sampler2D sec_colors; /* Цвета для секторов */
|
||||
uniform uint ant_band_m[28];
|
||||
varying vec2 centered_uv;
|
||||
|
||||
|
||||
void vertex()
|
||||
{
|
||||
// 1. Переводим UV в координаты относительно центра (-1..1)
|
||||
centered_uv = (UV - 0.5) * 2.0;
|
||||
rotate_vec2(centered_uv, radians(rotation + 315.0), vec2(0, 0));
|
||||
}
|
||||
|
||||
|
||||
void fragment()
|
||||
{
|
||||
float dist = length(centered_uv);
|
||||
|
||||
// 4. Вычисляем полярные координаты
|
||||
float angle = PI2 - atan(centered_uv.y, centered_uv.x);
|
||||
// Приводим к диапазону 0..2π
|
||||
angle = mod(angle + PI2, PI2);
|
||||
|
||||
// 5. Определяем индексы ячейки
|
||||
// Сектор (0..3)
|
||||
float sector_width = PI2 / float(grid_cells_angle);
|
||||
int sector_idx = int(angle / sector_width);
|
||||
|
||||
// Слой (0..6)
|
||||
float available_radius = outer_radius - inner_radius;
|
||||
float normalized_radius = (dist - inner_radius) / available_radius;
|
||||
float layer_height = 1.0 / float(grid_layers_radius);
|
||||
int layer_idx = int(normalized_radius / layer_height);
|
||||
|
||||
// 7. Рассчитываем глобальный индекс ячейки (0..27)
|
||||
int cell_index = layer_idx * grid_cells_angle + sector_idx;
|
||||
|
||||
// 8. Получаем цвет ячейки из массива цветов
|
||||
ivec2 sz = textureSize(sec_colors, 0);
|
||||
vec4 cell_color = texture(sec_colors, vec2((float(cell_index) + 0.5) / float(sz.x), 4));
|
||||
|
||||
// Границы по углу
|
||||
float angle_in_sector = mod(angle, sector_width);
|
||||
float v0 = sector_width - 0.01;
|
||||
float v1 = sector_width + 0.0001;
|
||||
cell_color.rgb *= 1.0 - sqrt(smoothstep(v0, v1, angle_in_sector) * smoothstep(v1, v0, angle_in_sector));
|
||||
|
||||
// Границы по радиусу
|
||||
float radius_in_layer = mod(normalized_radius, layer_height);
|
||||
v0 = layer_height - 0.01;
|
||||
v1 = layer_height + 0.0001;
|
||||
cell_color.rgb *= 1.0 - sqrt(smoothstep(v0, v1, radius_in_layer) * smoothstep(v1, v0, radius_in_layer));
|
||||
|
||||
// Подмешивание шума для включённых
|
||||
cell_color.a = alpha + random_timed(centered_uv) * cell_color.a;
|
||||
|
||||
// Индикация неисправности
|
||||
if (ant_band_m[cell_index] == ANT_BAND_FAILED)
|
||||
{
|
||||
vec2 uvr = UV;
|
||||
rotate_vec2(uvr, radians(afr), vec2(0, 0));
|
||||
cell_color.a *= (1.0 - ffr) + tanh(10.0 * sin(TIME * sfr + 2.0 * PI * uvr.x / pfr)) * ffr;
|
||||
}
|
||||
|
||||
// 2. Отсекаем за пределами внешнего радиуса
|
||||
v0 = outer_radius - 0.002;
|
||||
v1 = outer_radius + 0.0001;
|
||||
cell_color.a *= smoothstep(v1, v0, dist);
|
||||
|
||||
// 3. Отсекаем внутри внутреннего радиуса
|
||||
v0 = inner_radius - 0.0001;
|
||||
v1 = inner_radius + 0.002;
|
||||
cell_color.a *= smoothstep(v0, v1, dist);
|
||||
|
||||
COLOR = cell_color;
|
||||
}
|
||||
1
shaders/antenas.gdshader.uid
Normal file
1
shaders/antenas.gdshader.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://dhipoo0ju5ebg
|
||||
@@ -1,142 +0,0 @@
|
||||
[gd_resource type="ShaderMaterial" load_steps=2 format=4 uid="uid://s6xe8igevnv2"]
|
||||
|
||||
[sub_resource type="Shader" id="1"]
|
||||
code = "shader_type canvas_item;
|
||||
|
||||
#include \"tools.gdshaderinc\"
|
||||
|
||||
#define RADIUS_INNER_0 200.0 /* Радиус внутренний для режима приоритет РТО */
|
||||
#define RADIUS_INNER_1 480.0 /* Радиус внутренний для режима приоритет РЛС */
|
||||
#define ANTENAS_COUNT 28 /* Количество антенн */
|
||||
#define ANT_BAND_READY 1U /* Антенна (модуль ФС) готова или исправна */
|
||||
#define ANT_BAND_FAILED 0U /* Антенна (модуль ФС) не исправно */
|
||||
|
||||
uniform vec2 pc0 = vec2(560, 560); /* Центр сетки антенн */
|
||||
uniform float rotation: hint_range(0.0, 360.0) = 0.0; /* */
|
||||
uniform vec4 color0: source_color = vec4(0.38, 0.47, 0.51, 0.4);
|
||||
uniform vec4 color1: source_color = vec4(0.39, 0.44, 0.50, 0.4);
|
||||
uniform float radius_inner_0 = RADIUS_INNER_0;
|
||||
uniform float radius_inner_1 = RADIUS_INNER_1;
|
||||
uniform float radius_outter = 550.0; /* Радиус внешний. Должно быть равно ant_band_r1_6 */
|
||||
uniform float alpha: hint_range(0.0, 1.0) = 0.5;
|
||||
uniform int mode = 0; /* Режим отображения. Приоритет РТО - 0, приоритет РЛС - 1 */
|
||||
uniform float ffr: hint_range(0.0, 1.0) = 0.2; /* Индикация неисправности модулей ФС. Заметность штриховки. */
|
||||
uniform float sfr: hint_range(0.0, 10.0) = 0.0; /* Индикация неисправности модулей ФС. Скорость движения штрховки */
|
||||
uniform float afr: hint_range(0.0, 180.0) = 0.0; /* Индикация неисправности модулей ФС. Наклон штрховки */
|
||||
uniform float pfr: hint_range(1.0, 20.0) = 10.0; /* Индикация неисправности модулей ФС. Частота штриховки */
|
||||
|
||||
const int ant_band_count_0 = 2;
|
||||
const int ant_band_count_1 = 2;
|
||||
const int ant_band_count_2 = 2;
|
||||
const int ant_band_count_3 = 2;
|
||||
const int ant_band_count_4 = 2;
|
||||
const int ant_band_count_5 = 2;
|
||||
const int ant_band_count_6 = 2;
|
||||
|
||||
const float ant_band_r0_0[] = {RADIUS_INNER_0, RADIUS_INNER_1};
|
||||
const float ant_band_r0_1[] = {250.0, 490.0};
|
||||
const float ant_band_r0_2[] = {300.0, 500.0};
|
||||
const float ant_band_r0_3[] = {350.0, 510.0};
|
||||
const float ant_band_r0_4[] = {400.0, 520.0};
|
||||
const float ant_band_r0_5[] = {450.0, 530.0};
|
||||
const float ant_band_r0_6[] = {500.0, 540.0};
|
||||
|
||||
const float ant_band_r1_0[] = {250.0, 490.0};
|
||||
const float ant_band_r1_1[] = {300.0, 500.0};
|
||||
const float ant_band_r1_2[] = {350.0, 510.0};
|
||||
const float ant_band_r1_3[] = {400.0, 520.0};
|
||||
const float ant_band_r1_4[] = {450.0, 530.0};
|
||||
const float ant_band_r1_5[] = {500.0, 540.0};
|
||||
const float ant_band_r1_6[] = {550.0, 550.0};
|
||||
|
||||
uniform vec4 ant_band_c[ANTENAS_COUNT];
|
||||
uniform uint ant_band_m[ANTENAS_COUNT];
|
||||
const float d4 = 90.0;
|
||||
const float ds = 1.0;
|
||||
|
||||
|
||||
void sector(inout vec4 c, vec2 uv, vec2 center, float a, float da, float r0, float r1, vec4 color)
|
||||
{
|
||||
float l = distance(center, uv);
|
||||
vec2 d = uv - center;
|
||||
float sf = 500.0;
|
||||
float theta = atan(d.x, d.y) * sf;
|
||||
da /= 2.0;
|
||||
float a0 = radians(a - da);
|
||||
float a1 = radians(a + da);
|
||||
float va = smooth_px(a0 * sf, theta, ds) - smooth_px(a1 * sf, theta, ds);
|
||||
float vr = smooth_px(r0, l, ds) - smooth_px(r1, l, ds);
|
||||
float rgb = sqrt(va * vr);
|
||||
c.rgb += color.rgb * rgb * color.a;
|
||||
c.a += rgb * color.a;
|
||||
}
|
||||
|
||||
|
||||
void antenas(inout vec4 c, vec2 uv, vec2 p0, int cnt, float r0, float r1, inout int index)
|
||||
{
|
||||
float da = 180.0 / float(cnt);
|
||||
for (int i = -cnt; i <= cnt; i ++)
|
||||
{
|
||||
vec4 col;
|
||||
int j = index;
|
||||
if (i == 2)
|
||||
{
|
||||
index--;
|
||||
j = index - 3;
|
||||
}
|
||||
col.rgb = ant_band_c[j].rgb;
|
||||
index++;
|
||||
col.a = alpha + (random_timed(uv) - 0.5f) * ant_band_c[j].a;
|
||||
if (ant_band_m[j] == ANT_BAND_FAILED)
|
||||
{
|
||||
vec2 uvr = uv;
|
||||
rotate_vec2(uvr, radians(afr), pc0);
|
||||
col.a *= (1.0 - ffr) + tanh(10.0 * sin(TIME * sfr + 2.0 * PI * uvr.x / pfr)) * ffr;
|
||||
}
|
||||
float v = float(i & 1);
|
||||
vec4 color = v * col + (1.0f - v) * col;
|
||||
sector(c, uv, p0, float(i) * da, da, r0, r1, color);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void vertex()
|
||||
{
|
||||
rotate_vec2(VERTEX, radians(360.0 - rotation), pc0);
|
||||
}
|
||||
|
||||
|
||||
void fragment()
|
||||
{
|
||||
ivec2 isz = textureSize(TEXTURE, 0);
|
||||
vec2 uv = UV * vec2(float(isz.x), float(isz.y)); // координаты текущей точки в пикселях
|
||||
COLOR = vec4(0, 0, 0, 0);
|
||||
int index = 0;
|
||||
// Сетка антенн
|
||||
antenas(COLOR, uv, pc0, ant_band_count_0, ant_band_r0_0[mode], ant_band_r1_0[mode], index);
|
||||
antenas(COLOR, uv, pc0, ant_band_count_1, ant_band_r0_1[mode], ant_band_r1_1[mode], index);
|
||||
antenas(COLOR, uv, pc0, ant_band_count_2, ant_band_r0_2[mode], ant_band_r1_2[mode], index);
|
||||
antenas(COLOR, uv, pc0, ant_band_count_3, ant_band_r0_3[mode], ant_band_r1_3[mode], index);
|
||||
antenas(COLOR, uv, pc0, ant_band_count_4, ant_band_r0_4[mode], ant_band_r1_4[mode], index);
|
||||
antenas(COLOR, uv, pc0, ant_band_count_5, ant_band_r0_5[mode], ant_band_r1_5[mode], index);
|
||||
antenas(COLOR, uv, pc0, ant_band_count_6, ant_band_r0_6[mode], ant_band_r1_6[mode], index);
|
||||
}
|
||||
"
|
||||
|
||||
[resource]
|
||||
shader = SubResource("1")
|
||||
shader_parameter/pc0 = Vector2(560, 560)
|
||||
shader_parameter/rotation = 0.0
|
||||
shader_parameter/color0 = Color(0.380392, 0.470588, 0.509804, 0.537255)
|
||||
shader_parameter/color1 = Color(0.3315, 0.45645, 0.51, 0.537255)
|
||||
shader_parameter/radius_inner_0 = 200.0
|
||||
shader_parameter/radius_inner_1 = 480.0
|
||||
shader_parameter/radius_outter = 550.0
|
||||
shader_parameter/alpha = 0.5
|
||||
shader_parameter/mode = 0
|
||||
shader_parameter/ffr = 0.2
|
||||
shader_parameter/sfr = 0.0
|
||||
shader_parameter/afr = 0.0
|
||||
shader_parameter/pfr = 10.0
|
||||
shader_parameter/ant_band_c = PackedVector4Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
|
||||
shader_parameter/ant_band_m = PackedInt32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
|
||||
@@ -2,5 +2,5 @@ shader_type canvas_item;
|
||||
|
||||
void fragment()
|
||||
{
|
||||
COLOR.rgb = vec3(1.0, 1.0, 1.0) - log(COLOR.rgb);
|
||||
COLOR.rgb = vec3(1.0, 1.0, 1.0) - log(COLOR.rgb);
|
||||
}
|
||||
|
||||
@@ -16,42 +16,40 @@ uniform float ant_band_r1_0 = 0.4;
|
||||
|
||||
float smooth_px(float r, float R, float dss)
|
||||
{
|
||||
return 1.0 - smoothstep(R - dss, R + dss, r);
|
||||
return 1.0 - smoothstep(R - dss, R + dss, r);
|
||||
}
|
||||
|
||||
void sector(inout vec4 c, vec2 uv, vec2 cnt, float a, float da, float r0, float r1, vec4 col)
|
||||
{
|
||||
float l = distance(cnt, uv);
|
||||
vec2 d = uv - cnt;
|
||||
float sf = 500.0;
|
||||
float theta = atan(d.x, d.y) * sf;
|
||||
da /= 2.0;
|
||||
float a0 = radians(a - da);
|
||||
float a1 = radians(a + da);
|
||||
float va = smooth_px(a0 * sf, theta, dsr) - smooth_px(a1 * sf, theta, dsr);
|
||||
float vr = smooth_px(r0, l, ds) - smooth_px(r1, l, ds);
|
||||
float l = distance(cnt, uv);
|
||||
vec2 d = uv - cnt;
|
||||
float sf = 500.0;
|
||||
float theta = atan(d.x, d.y) * sf;
|
||||
da /= 2.0;
|
||||
float a0 = radians(a - da);
|
||||
float a1 = radians(a + da);
|
||||
float va = smooth_px(a0 * sf, theta, dsr) - smooth_px(a1 * sf, theta, dsr);
|
||||
float vr = smooth_px(r0, l, ds) - smooth_px(r1, l, ds);
|
||||
float rgb = sqrt(va * vr);
|
||||
c.rgb += col.rgb * rgb * col.a;
|
||||
c.rgb += col.rgb * rgb * col.a;
|
||||
c.a += rgb * col.a;
|
||||
}
|
||||
|
||||
|
||||
void antenas(inout vec4 c, vec2 uv, vec2 p0, int cnt, float r0, float r1, vec4 c0, vec4 c1)
|
||||
{
|
||||
float da = 180.0f / float(cnt);
|
||||
float da = 180.0f / float(cnt);
|
||||
for (int i = -cnt; i <= cnt; i ++)
|
||||
{
|
||||
float v = float(i & 1);
|
||||
vec4 col = v * c0 + (1.0f - v) * c1;
|
||||
sector(c, uv, p0, float(i) * da, da, r0, r1, col);
|
||||
}
|
||||
{
|
||||
float v = float(i & 1);
|
||||
vec4 col = v * c0 + (1.0f - v) * c1;
|
||||
sector(c, uv, p0, float(i) * da, da, r0, r1, col);
|
||||
}
|
||||
}
|
||||
|
||||
vec2 rotateUVmatrinx(vec2 uv, vec2 pivot, float rotation)
|
||||
{
|
||||
mat2 rotation_matrix=mat2( vec2(sin(rotation),-cos(rotation)),
|
||||
vec2(cos(rotation),sin(rotation))
|
||||
);
|
||||
mat2 rotation_matrix=mat2(vec2(sin(rotation), -cos(rotation)), vec2(cos(rotation),sin(rotation)));
|
||||
uv -= pivot;
|
||||
uv *= rotation_matrix;
|
||||
uv += pivot;
|
||||
|
||||
@@ -21,7 +21,7 @@ void vertex()
|
||||
|
||||
void fragment()
|
||||
{
|
||||
COLOR = color;
|
||||
COLOR = color;
|
||||
if (disabled)
|
||||
{
|
||||
float ds = 1.0 / sharpness;
|
||||
|
||||
@@ -1,23 +1,24 @@
|
||||
const float DS = 0.004; /* Относительное расстояние на котором выполняется сглаживание краёв */
|
||||
|
||||
global uniform float random_value;
|
||||
|
||||
float random_timed(vec2 uv)
|
||||
{
|
||||
return fract(sin(dot(uv + TIME, vec2(12.9898, 78.233))) * 43758.5453);
|
||||
return fract(sin(dot(uv + TIME * random_value, vec2(12.9898, 78.233))) * 43758.5453);
|
||||
}
|
||||
|
||||
float smooth_px(float r, float R, float ds)
|
||||
{
|
||||
return 1.0 - smoothstep(R - ds, R + ds, r);
|
||||
return smoothstep(R + ds, R - ds, r);
|
||||
}
|
||||
|
||||
|
||||
void circle_thin(inout vec3 color, vec2 uv, vec2 p, float r, float w, vec3 c, float a)
|
||||
{
|
||||
float d = distance(uv, p);
|
||||
float v0 = r - w;
|
||||
float v1 = r + w;
|
||||
color += a * sqrt(smoothstep(v1, v0, d) * smoothstep(v0, v1, d) * c);
|
||||
float d = distance(uv, p);
|
||||
float v0 = r - w;
|
||||
float v1 = r + w;
|
||||
color += a * sqrt(smoothstep(v1, v0, d) * smoothstep(v0, v1, d) * c);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -19,9 +19,9 @@ uniform float speed: hint_range(0.0, 1024.0) = 0.0;
|
||||
|
||||
float line(vec2 p1, vec2 p2, float width, vec2 uv)
|
||||
{
|
||||
float dist = distance(p1, p2); // Дистанция между точками
|
||||
float dist_uv = distance(p1, uv); // Дистанция между точкой и текущим пикселем
|
||||
return 1.0 - floor(1.0 - (0.001 * width) + distance (mix(p1, p2, clamp(dist_uv / dist, 0.0, 1.0)), uv));
|
||||
float dist = distance(p1, p2); // Дистанция между точками
|
||||
float dist_uv = distance(p1, uv); // Дистанция между точкой и текущим пикселем
|
||||
return 1.0 - floor(1.0 - (0.001 * width) + distance (mix(p1, p2, clamp(dist_uv / dist, 0.0, 1.0)), uv));
|
||||
}
|
||||
|
||||
|
||||
@@ -65,12 +65,12 @@ void fragment()
|
||||
float px1 = 0.0;
|
||||
float py0 = 0.0;
|
||||
float py1 = 0.0;
|
||||
COLOR = vec4(1.0, 0.0, 0.0, 0.0); //texture(TEXTURE, UV); // Цвет текущей точки
|
||||
COLOR = vec4(1.0, 0.0, 0.0, 0.0); // Цвет текущей точки
|
||||
get_line_points(px0, px1, py0, py1, 330.0);
|
||||
COLOR.a += line(vec2(px0, py0), vec2(px1, py1), 15.0, UV);
|
||||
get_line_points(px0, px1, py0, py1, 90.0);
|
||||
COLOR.a += line(vec2(px0, py0), vec2(px1, py1), 15.0, UV);
|
||||
get_line_points(px0, px1, py0, py1, 210.0);
|
||||
COLOR.a += line(vec2(px0, py0), vec2(px1, py1), 15.0, UV);
|
||||
COLOR *= smooth_px(length(UV-center), radius, DSS);
|
||||
COLOR *= smooth_px(length(UV - center), radius, DSS);
|
||||
}
|
||||
|
||||
@@ -13,5 +13,5 @@ vec3 bw_to_2color(vec3 c, vec3 dark, vec3 light)
|
||||
|
||||
void fragment()
|
||||
{
|
||||
COLOR.rgb = bw_to_2color(texture(TEXTURE, UV).rgb, white, black);
|
||||
COLOR.rgb = bw_to_2color(texture(TEXTURE, UV).rgb, white, black);
|
||||
}
|
||||
|
||||
@@ -333,10 +333,7 @@ func _set_row_selected(i_row: int, selected: bool = true) -> void:
|
||||
push_warning('обращение к удалённому элементу \"%s\"' % selector_key)
|
||||
elif (not nodes.has(selector_key)) and selected:
|
||||
var selector = ScnSelector.instantiate()
|
||||
var rect: = [0, 0, 0, 0]
|
||||
selector_size_proc.call(i_row, rect)
|
||||
selector.size.x = rect[2]
|
||||
selector.size.y = rect[3]
|
||||
call_deferred('_set_selector_size', selector, i_row)
|
||||
selector.modulate = selector_color_proc.call(i_row)
|
||||
selector.z_index = z_index + 1
|
||||
nodes[selector_key] = selector
|
||||
@@ -344,6 +341,13 @@ func _set_row_selected(i_row: int, selected: bool = true) -> void:
|
||||
node.add_child(selector)
|
||||
|
||||
|
||||
func _set_selector_size(selector, i_row):
|
||||
var rect: = [0, 0, 0, 0]
|
||||
selector_size_proc.call(i_row, rect)
|
||||
selector.size.x = rect[2]
|
||||
selector.size.y = rect[3]
|
||||
|
||||
|
||||
## [param i_row] - Индекс ряда.
|
||||
func is_row_selected(i_row: int) -> bool:
|
||||
var key: = SELECTOR_KEY_FORMAT % [i_row, 0]
|
||||
|
||||
Reference in New Issue
Block a user