Compare commits
14 Commits
0f15c2f62c
...
7788a664b5
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7788a664b5 | ||
|
|
1a72187683 | ||
|
|
ace3d2abbf | ||
|
|
0ab38309db | ||
|
|
cf89c1b1c9 | ||
|
|
55cfd32f66 | ||
|
|
5e10632fb6 | ||
|
|
44275fe92d | ||
|
|
1e0d10761a | ||
|
|
97b608a306 | ||
|
|
83aa1e3ac0 | ||
|
|
c244fc70ec | ||
|
|
dac0c55204 | ||
|
|
3d9ed1a149 |
@@ -7,14 +7,16 @@ const color1_default: Color = Color(0.39, 0.44, 0.50, 1.0)
|
||||
var color0: Color = color0_default
|
||||
var color1: Color = color1_default
|
||||
|
||||
var fs_default_colors: PackedColorArray ## Цвета по умолчанию для блоков ФС.
|
||||
var fs_default_colors: PackedColorArray ## Цвета по умолчанию для блоков ФС
|
||||
var image: Image
|
||||
|
||||
@export var SecZap: PackedScene
|
||||
@export var inner_radius_0: = 0.36 ## Внутренний радиус диаграммы в режиме РТО
|
||||
@export var inner_radius_0: = 0.36 ## Внутренний радиус диаграммы в режиме РТО
|
||||
@export var inner_radius_1: = 0.855 ## Внутренний радиус диаграммы в обзора
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
image = Image.create(NUM_OF_RANGE * NUM_OF_DIRECTIONS, 1, false, Image.FORMAT_RGBA8)
|
||||
signaller.connect('map_mode_changed', Callable(self, 'set_view_mode'))
|
||||
ProjectSettings.connect('settings_changed', _on_settings_changed)
|
||||
_on_settings_changed()
|
||||
@@ -23,7 +25,6 @@ func _ready() -> void:
|
||||
|
||||
func sv(val: float) -> float: return val / ($строб.scale.x / 2.0) * 0.125
|
||||
|
||||
func set_band_colors(val: PackedColorArray): material.set('shader_parameter/ant_band_c', 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)
|
||||
@@ -49,6 +50,14 @@ func get_strob_visible() -> bool: return $строб.visible
|
||||
func get_strob_width() -> float: return $строб.get_instance_shader_parameter('width')
|
||||
|
||||
|
||||
## Выставляет цвета для секторов
|
||||
func set_band_colors(val: PackedColorArray):
|
||||
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]
|
||||
## [param szv.x] - Центральная частота (198...546).[br]
|
||||
@@ -102,12 +111,8 @@ func set_seczap_color(id: int, c: Color):
|
||||
|
||||
|
||||
func set_view_mode(val: int):
|
||||
if val == 1:
|
||||
material.set('shader_parameter/inner_radius', inner_radius_1)
|
||||
$строб.hide()
|
||||
else:
|
||||
material.set('shader_parameter/inner_radius', inner_radius_0)
|
||||
$строб.show()
|
||||
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():
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[gd_scene load_steps=7 format=3 uid="uid://b5kjdyxuwsot5"]
|
||||
|
||||
[ext_resource type="Shader" path="res://shaders/antenas.gdshader" id="1_8cjpq"]
|
||||
[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"]
|
||||
@@ -16,8 +16,8 @@ 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.025
|
||||
shader_parameter/ant_band_c = PackedColorArray(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/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"]
|
||||
@@ -36,4 +36,4 @@ SecZap = ExtResource("3_tgnog")
|
||||
[node name="строб" parent="." instance=ExtResource("3_tgnog")]
|
||||
material = SubResource("ShaderMaterial_lniyv")
|
||||
position = Vector2(280, 280)
|
||||
scale = Vector2(550, 550)
|
||||
scale = Vector2(560, 560)
|
||||
|
||||
@@ -141,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
|
||||
|
||||
@@ -13,9 +13,9 @@ enum DEVICE_STATUS {
|
||||
}
|
||||
|
||||
const STATUS_CONFIG := {
|
||||
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}
|
||||
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:
|
||||
@@ -62,7 +62,7 @@ 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()
|
||||
@@ -161,15 +161,15 @@ func _recalculate_overall_state() -> void:
|
||||
|
||||
|
||||
func _update_display() -> void:
|
||||
var config: Dictionary
|
||||
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 tooltip := ''
|
||||
|
||||
# Получаем статистику по ПРД
|
||||
var prd_summary = _get_prd_summary()
|
||||
@@ -177,17 +177,17 @@ func _get_tooltip_text() -> String:
|
||||
|
||||
match overall_prd_state:
|
||||
DEVICE_STATE.NONE:
|
||||
tooltip = "Нет исправных систем в комплексе"
|
||||
tooltip = 'Нет исправных систем в комплексе'
|
||||
DEVICE_STATE.GOOD:
|
||||
tooltip = "Комплекс исправен"
|
||||
tooltip = 'Комплекс исправен'
|
||||
DEVICE_STATE.ERR:
|
||||
tooltip = "Обнаружены неисправности в комплексе"
|
||||
tooltip = 'Обнаружены неисправности в комплексе'
|
||||
|
||||
tooltip += "\n\nСтатус ПРД систем: " + prd_summary
|
||||
tooltip += "\nСтатус УФ: " + uf_status_str
|
||||
tooltip += '\n\nСтатус ПРД систем: ' + prd_summary
|
||||
tooltip += '\nСтатус УФ: ' + uf_status_str
|
||||
|
||||
# Детализация по источникам статуса
|
||||
tooltip += "\n\nСостояние систем:"
|
||||
tooltip += '\n\nСостояние систем:'
|
||||
|
||||
# ПРД системы
|
||||
var prd_ok_count = 0
|
||||
@@ -198,10 +198,10 @@ func _get_tooltip_text() -> String:
|
||||
if observer.status[DEVICE_STATUS.STATUS]:
|
||||
prd_ok_count += 1
|
||||
|
||||
tooltip += "\nПРД: %d/%d исправно" % [prd_ok_count, prd_total]
|
||||
tooltip += '\nПРД: %d/%d исправно' % [prd_ok_count, prd_total]
|
||||
|
||||
# УФ система
|
||||
tooltip += "\nУФ: " + _get_uf_status_text()
|
||||
tooltip += '\nУФ: ' + _get_uf_status_text()
|
||||
|
||||
return tooltip
|
||||
|
||||
@@ -217,21 +217,21 @@ func _get_prd_summary() -> String:
|
||||
operational_count += 1
|
||||
|
||||
if online_count == 0:
|
||||
return "Нет связи"
|
||||
return 'Нет связи'
|
||||
else:
|
||||
return "%d/%d исправно" % [operational_count, online_count]
|
||||
return '%d/%d исправно' % [operational_count, online_count]
|
||||
|
||||
|
||||
func _get_uf_status_text() -> String:
|
||||
match status_uf:
|
||||
DEVICE_STATE.NONE:
|
||||
return "Нет данных"
|
||||
return 'Нет данных'
|
||||
DEVICE_STATE.GOOD:
|
||||
return "Исправен"
|
||||
return 'Исправен'
|
||||
DEVICE_STATE.ERR:
|
||||
return "Неисправен"
|
||||
return 'Неисправен'
|
||||
_:
|
||||
return "Неизвестно"
|
||||
return 'Неизвестно'
|
||||
|
||||
|
||||
func _has_prd_errors() -> bool:
|
||||
@@ -253,11 +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,
|
||||
"status_uf": status_uf
|
||||
'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 {}
|
||||
|
||||
@@ -276,10 +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,
|
||||
"uf_status": status_uf
|
||||
'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
|
||||
}
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
[ext_resource type="Texture2D" uid="uid://c3cyog3gy24ft" path="res://data/У-ЭП.png" id="16_gjf0t"]
|
||||
[ext_resource type="Script" uid="uid://xjs7owe2iexn" path="res://scenes/контроль/control_prd.gd" id="18_lbx5w"]
|
||||
[ext_resource type="Texture2D" uid="uid://b2vf7en1jj8dv" path="res://data/У-РЭП-РПД-В.png" id="20_l5wui"]
|
||||
[ext_resource type="Script" path="res://scenes/контроль/panel_container.gd" id="21_l5wui"]
|
||||
[ext_resource type="Script" uid="uid://j16hg3u2uvu5" path="res://scenes/контроль/panel_container.gd" id="21_l5wui"]
|
||||
[ext_resource type="Texture2D" uid="uid://cllxcfa130vqu" path="res://data/УА-РЭП.png" id="22_1s34a"]
|
||||
|
||||
[sub_resource type="GDScript" id="GDScript_iqgf5"]
|
||||
|
||||
@@ -66,7 +66,8 @@ const SETTING_TABLE = [
|
||||
['Цвет кнопки \"Подавление\"', TableEdit, TableColorPick, 'Цвет кнопки. Введено по требованию ПЗ' ], # 54
|
||||
['Цвет фона схемы', TableEdit, TableColorPick, 'Схема прибора Э2. Изменение цвет фона'], # 55
|
||||
['Цвет схемы', TableEdit, TableColorPick, 'Схема прибора Э2. Изменение цвет схемы '], # 56
|
||||
['Коэффициент ширины полосы излучения', TableEdit, TableEdit, 'Изменение ширины полосы излучения помехи в зависимости от цели'] ] # 57
|
||||
['Коэффициент ширины полосы излучения', TableEdit, TableEdit, 'Изменение ширины полосы излучения помехи в зависимости от цели'], # 57
|
||||
['Время повторной отправки помехи', TableEdit, TableEdit, 'Изменение времени повторной отправки помехи'] ] # 58
|
||||
|
||||
|
||||
## TODO: Придумать как избавиться от индексов
|
||||
|
||||
@@ -172,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)
|
||||
|
||||
|
||||
## Встроенный обратный вызов.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1140,7 +1140,7 @@ static func _create_fs_mapping(s_name: String) -> Dictionary:
|
||||
|
||||
## Получение статуса ФС
|
||||
static func on_fs_state(packet_type_7: Dictionary, fs_mapping: Dictionary, fs_results: Dictionary, fs_rules_config: Array) -> Dictionary:
|
||||
var updated_results := fs_results
|
||||
var updated_results := fs_results.duplicate()
|
||||
for fs_num in packet_type_7:
|
||||
if not (fs_num in fs_mapping and fs_mapping[fs_num]['condition']):
|
||||
continue
|
||||
@@ -1209,19 +1209,19 @@ static func power_um_ukp(status: PackedByteArray, litera: int, pwr_result: Array
|
||||
static func update_max_power_values(power_data: Array, max_power_values: Array) -> Array:
|
||||
if power_data.size() != 6:
|
||||
if max_power_values.is_empty():
|
||||
max_power_values = power_data
|
||||
max_power_values = power_data.duplicate()
|
||||
elif power_data[0] > max_power_values[0]:
|
||||
max_power_values = power_data
|
||||
max_power_values = power_data.duplicate()
|
||||
return max_power_values
|
||||
|
||||
if max_power_values.is_empty():
|
||||
max_power_values = power_data
|
||||
max_power_values = power_data.duplicate()
|
||||
else:
|
||||
for i in 6:
|
||||
if power_data[i] > max_power_values[i]:
|
||||
max_power_values[i] = power_data[i]
|
||||
|
||||
return max_power_values
|
||||
return max_power_values.duplicate()
|
||||
|
||||
|
||||
## Подготовка принятых данных по контролю для передачи в сцену
|
||||
@@ -1322,7 +1322,7 @@ func _deep_copy_power_structure() -> Dictionary:
|
||||
for litera in power_for_litera:
|
||||
copy[litera] = {}
|
||||
for ray_type in power_for_litera[litera]:
|
||||
copy[litera][ray_type] = power_for_litera[litera][ray_type]
|
||||
copy[litera][ray_type] = power_for_litera[litera][ray_type].duplicate()
|
||||
return copy
|
||||
|
||||
## Восстановление состояний по умолчанию
|
||||
|
||||
@@ -1,45 +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 afsp_bpo_mode: = AFSP_BPO_MODE.run ## Режим работы АФСП и БПО
|
||||
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 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 ## Своя или чужая цель
|
||||
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]
|
||||
@@ -60,17 +63,21 @@ 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))
|
||||
@@ -78,12 +85,11 @@ func _ready() -> void:
|
||||
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('режим_контроль', on_kontrol_mode)
|
||||
signaller.connect('режим_работа', on_rabota_mode)
|
||||
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):
|
||||
var tick: = Time.get_ticks_msec()
|
||||
@@ -143,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'])
|
||||
var sz: = threats.size()
|
||||
for dic_th in mis:
|
||||
if dic_th is not Dictionary:
|
||||
@@ -183,17 +191,39 @@ func on_settings_changed(ths: Dictionary):
|
||||
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
|
||||
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_kontrol_mode(): afsp_bpo_mode = AFSP_BPO_MODE.test
|
||||
func on_rabota_mode(): afsp_bpo_mode = AFSP_BPO_MODE.run
|
||||
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)
|
||||
|
||||
@@ -7,7 +7,9 @@ shader_type canvas_item;
|
||||
#define ANT_BAND_ASSIGNED 2U /* Антенна (модуль ФС) назначена на излучение */
|
||||
#define ANT_BAND_SELECTED 4U /* Антенна (модуль ФС) выбрана оператором */
|
||||
#define ANT_BAND_ACTIVE 8U /* Антенна (модуль ФС) излучает */
|
||||
#define ANT_BAND_DENIED 16U /* Антенна (модуль ФС) излучает */
|
||||
#define ANT_BAND_DENIED 16U /* Антенна (модуль ФС) запрет работы */
|
||||
|
||||
#define PI2 (PI * 2.0)
|
||||
|
||||
// Конфигурация сетки
|
||||
uniform int grid_cells_angle = 4; /* Количество секторов (90° каждый) */
|
||||
@@ -20,9 +22,9 @@ 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; /* Индикация неисправности модулей ФС. Угол наклона штриховки */
|
||||
|
||||
// Вариант 1: Массив цветов для каждой ячейки (4×7 = 28)
|
||||
uniform vec4 ant_band_c[28]: source_color;
|
||||
uniform sampler2D sec_colors; /* Цвета для секторов */
|
||||
uniform uint ant_band_m[28];
|
||||
varying vec2 centered_uv;
|
||||
|
||||
@@ -39,26 +41,14 @@ void fragment()
|
||||
{
|
||||
float dist = length(centered_uv);
|
||||
|
||||
// 2. Отсекаем за пределами внешнего радиуса
|
||||
if (dist > outer_radius) {
|
||||
COLOR = vec4(0.0);
|
||||
discard;
|
||||
}
|
||||
|
||||
// 3. Отсекаем внутри внутреннего радиуса
|
||||
if (dist < inner_radius) {
|
||||
COLOR = vec4(0.0);
|
||||
discard;
|
||||
}
|
||||
|
||||
// 4. Вычисляем полярные координаты
|
||||
float angle = 6.28318530718 - atan(centered_uv.y, centered_uv.x);
|
||||
float angle = PI2 - atan(centered_uv.y, centered_uv.x);
|
||||
// Приводим к диапазону 0..2π
|
||||
angle = mod(angle + 6.28318530718, 6.28318530718);
|
||||
angle = mod(angle + PI2, PI2);
|
||||
|
||||
// 5. Определяем индексы ячейки
|
||||
// Сектор (0..3)
|
||||
float sector_width = 6.28318530718 / float(grid_cells_angle);
|
||||
float sector_width = PI2 / float(grid_cells_angle);
|
||||
int sector_idx = int(angle / sector_width);
|
||||
|
||||
// Слой (0..6)
|
||||
@@ -67,39 +57,45 @@ void fragment()
|
||||
float layer_height = 1.0 / float(grid_layers_radius);
|
||||
int layer_idx = int(normalized_radius / layer_height);
|
||||
|
||||
// 6. Проверяем границы (чтобы не выйти за пределы)
|
||||
if (layer_idx >= grid_layers_radius) {
|
||||
COLOR = vec4(0.0);
|
||||
discard;
|
||||
}
|
||||
|
||||
// 7. Рассчитываем глобальный индекс ячейки (0..27)
|
||||
int cell_index = layer_idx * grid_cells_angle + sector_idx;
|
||||
|
||||
// 8. Получаем цвет ячейки (два варианта) из массива цветов
|
||||
vec4 cell_color = ant_band_c[cell_index];
|
||||
// 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);
|
||||
if (angle_in_sector < grid_line_width ||
|
||||
sector_width - angle_in_sector < grid_line_width) {
|
||||
cell_color.rgb *= 0.7; // Затемняем границы
|
||||
}
|
||||
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);
|
||||
if (radius_in_layer < grid_line_width ||
|
||||
layer_height - radius_in_layer < grid_line_width) {
|
||||
cell_color.rgb *= 0.7; // Затемняем границы
|
||||
}
|
||||
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)
|
||||
{
|
||||
cell_color.a *= (1.0 - ffr) + tanh(10.0 * sin(TIME * sfr + 2.0 * PI * centered_uv.x / pfr)) * ffr;
|
||||
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,9 +1,10 @@
|
||||
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)
|
||||
|
||||
Reference in New Issue
Block a user