Merge remote-tracking branch 'origin/dev_maxim' into dev_danil

# Conflicts:
#	scripts/PRD.gd
This commit is contained in:
danil_tim
2025-02-12 08:30:41 +03:00
11 changed files with 339 additions and 88 deletions

View File

@@ -1,4 +1,4 @@
[gd_scene load_steps=49 format=3 uid="uid://cvor2jm4xk3ha"]
[gd_scene load_steps=53 format=3 uid="uid://cvor2jm4xk3ha"]
[ext_resource type="Script" path="res://scripts/PRD.gd" id="1_v273n"]
[ext_resource type="Texture2D" uid="uid://cdxdluvyb5uei" path="res://table/on.png" id="2_dv7xx"]
@@ -7,14 +7,15 @@
[ext_resource type="Texture2D" uid="uid://cfktmk2rowmul" path="res://table/off.png" id="3_qvuyu"]
[ext_resource type="Shader" path="res://Shaders/ray.gdshader" id="4_uy5o2"]
[ext_resource type="Texture2D" uid="uid://co8dxcd8eckjs" path="res://Web.png" id="5_i3nvb"]
[ext_resource type="Shader" path="res://ray_2.gdshader" id="8_12mng"]
[ext_resource type="Shader" path="res://Shaders/ray_2.gdshader" id="8_12mng"]
[ext_resource type="Texture2D" uid="uid://cgtg4gbqnuxrc" path="res://nine-patch-round.png" id="9_0r2qk"]
[ext_resource type="Script" path="res://scripts/control_panel.gd" id="9_akagi"]
[ext_resource type="Script" path="res://scripts/ems_g.gd" id="9_g1wia"]
[ext_resource type="Shader" path="res://load.gdshader" id="10_lf1xh"]
[ext_resource type="Shader" path="res://Shaders/load.gdshader" id="10_lf1xh"]
[ext_resource type="PackedScene" uid="uid://bdb0bhfu7366l" path="res://kasseta-fs-kd.tscn" id="10_tdh2s"]
[ext_resource type="PackedScene" uid="uid://p2suppildvq0" path="res://table/элемент-в.tscn" id="11_fg7ul"]
[ext_resource type="Script" path="res://scripts/modul_fs.gd" id="15_b4pr1"]
[ext_resource type="Shader" path="res://Shaders/loadead.gdshader" id="16_4osrw"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_eib3t"]
bg_color = Color(0.223529, 0.168627, 0.223529, 1)
@@ -129,6 +130,35 @@ shader_parameter/inner_radius = 0.32
[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_ooo4i"]
[sub_resource type="ShaderMaterial" id="ShaderMaterial_cm644"]
shader = ExtResource("16_4osrw")
shader_parameter/dot_scale = 0.5
shader_parameter/ring_radius = 0.2
shader_parameter/num_points = 8
shader_parameter/gap_ratio = 0.102
shader_parameter/all_dots_same_size = false
shader_parameter/dot_color_start = Color(0.5, 0, 0.5, 1)
shader_parameter/dot_color_end = Color(0.8, 0.5, 1, 1)
shader_parameter/enable_shadow = true
shader_parameter/shadow_color = Color(0, 0, 0, 0.35)
shader_parameter/shadow_offset = Vector2(0.03, 0.01)
shader_parameter/rotation_speed = 1.5
shader_parameter/icon_size = 0.15
shader_parameter/enable_icon_rotation = false
shader_parameter/reverse_icon_rotation = false
shader_parameter/icon_rotation_speed = 1.0
shader_parameter/show_icon = false
[sub_resource type="Gradient" id="Gradient_kvhy4"]
colors = PackedColorArray(1, 1, 1, 1, 0, 0, 0, 1)
[sub_resource type="GradientTexture2D" id="GradientTexture2D_2sr0p"]
gradient = SubResource("Gradient_kvhy4")
width = 100
height = 150
fill = 1
fill_from = Vector2(0.521368, 0.512821)
[sub_resource type="ShaderMaterial" id="ShaderMaterial_slcfo"]
shader = ExtResource("10_lf1xh")
shader_parameter/frequency = 5.0
@@ -739,6 +769,15 @@ offset_bottom = 782.0
color = Color(0, 0, 0, 0.596078)
metadata/_edit_lock_ = true
[node name="win_load" type="TextureButton" parent="TabContainer/EMS_G/load_boadr"]
material = SubResource("ShaderMaterial_cm644")
layout_mode = 0
offset_left = 730.0
offset_top = 311.0
offset_right = 830.0
offset_bottom = 461.0
texture_normal = SubResource("GradientTexture2D_2sr0p")
[node name="load" type="Sprite2D" parent="TabContainer/EMS_G/load_boadr"]
material = SubResource("ShaderMaterial_slcfo")
position = Vector2(785.001, 361.5)
@@ -747,6 +786,7 @@ texture = SubResource("GradientTexture2D_0pk2o")
metadata/_edit_lock_ = true
[node name="Load_text" type="Label" parent="TabContainer/EMS_G/load_boadr"]
visible = false
layout_mode = 0
offset_left = 693.0
offset_top = 341.0
@@ -909,6 +949,18 @@ offset_bottom = 827.0
theme = SubResource("Theme_yblys")
text = "Сохранить все настройки"
[node name="can_macro" type="Label" parent="."]
offset_left = 226.0
offset_top = 876.0
offset_right = 1055.0
offset_bottom = 916.0
[node name="can" type="Label" parent="."]
offset_left = 224.0
offset_top = 844.0
offset_right = 959.0
offset_bottom = 889.0
[connection signal="pressed" from="Background/side_panel/select_prd" to="." method="_on_prd_select"]
[connection signal="pressed" from="Background/side_panel/select_control" to="." method="_on_control_button"]
[connection signal="pressed" from="Background/side_panel/select_ems_g" to="." method="_on_emsg_select"]

118
Shaders/loadead.gdshader Normal file
View File

@@ -0,0 +1,118 @@
shader_type canvas_item;
// Конфигурационные униформы для кольца.
uniform float dot_scale : hint_range(0.1, 9.1) = 0.5; // Масштаб точек кольца.
uniform float ring_radius : hint_range(0.1, 1.0) = 0.2; // Радиус кольца.
uniform int num_points : hint_range(3, 10) = 8; // Количество точек на кольце.
uniform float gap_ratio : hint_range(0.0, 0.9) = 0.22; // Отношение пробелов между точками.
uniform bool all_dots_same_size = false; // Флаг, указывающий, должны ли все точки быть одинакового размера.
// Визуальные свойства точек кольца.
uniform vec4 dot_color_start : source_color = vec4(0.5, 0.0, 0.5, 1.0); // Начальный цвет точек.
uniform vec4 dot_color_end : source_color = vec4(0.8, 0.5, 1.0, 1.0); // Конечный цвет точек.
uniform bool enable_shadow = true; // Флаг для включения/выключения теней.
uniform vec4 shadow_color : source_color = vec4(0.0, 0.0, 0.0, 0.35); // Цвет теней.
uniform vec2 shadow_offset = vec2(0.03, 0.01); // Смещение теней от точек.
// Контроль анимации кольца.
uniform float rotation_speed : hint_range(0.0, 10.0) = 1.5; // Скорость вращения кольца.
// Новые униформы для текстуры иконки и её внешнего вида.
uniform sampler2D icon_texture; // Текстура иконки.
uniform float icon_size : hint_range(0.0, 1.0) = 0.15; // Контроль радиуса иконки.
// Новые униформы для контроля вращения иконки.
uniform bool enable_icon_rotation = false; // Флаг для включения вращения иконки.
uniform bool reverse_icon_rotation = false; // Флаг для инверсии вращения иконки.
uniform float icon_rotation_speed : hint_range(-10.0, 10.0) = 1.0; // Скорость вращения иконки.
// Униформ для контроля отрисовки иконки.
uniform bool show_icon = false; // Если false, текстура иконки игнорируется.
void fragment() {
// Преобразование UV-координат для центрирования начала координат и корректировки в зависимости от аспекта экрана.
float aspect_ratio = SCREEN_PIXEL_SIZE.x / SCREEN_PIXEL_SIZE.y;
vec2 uv = (UV * 2.0 - 1.0) * vec2(0.3, aspect_ratio); // Нормализация UV координат.
// Подсчет кольца (точек и опциональной тени).
vec4 ring_color = vec4(0.0); // Начальный цвет кольца.
float dot_accum = 0.0; // Накапливаемый вклад от точек.
float shadow_accum = 0.0; // Накапливаемый вклад от теней.
float total_angle = 6.283185307; // Полный круг в радианах (2π).
float gap = total_angle * gap_ratio; // Вычисление ширины пробела между точками.
float spacing = (total_angle - gap) / float(num_points); // Вычисление интервала между точками.
// Определение направления вращения кольца.
float direction = 1.0; // Вращение по часовой стрелке или против.
float rotation = TIME * rotation_speed * direction; // Вычисление текущего угла поворота.
for (int i = 0; i < num_points; i++) { // Проход по каждой точке кольца.
float angle = rotation + spacing * float(i); // Вычисление угла для данной точки.
vec2 pos = vec2(cos(angle), sin(angle)) * ring_radius; // Вычисление позиции точки по окружности.
// Вычисление размера точки:
float size_factor = 0.5 + (float(i) / float(num_points)); // Фактор уменьшения размера.
float radius = all_dots_same_size ? 0.1 * dot_scale : 0.1 * size_factor * dot_scale; // Радиус точки.
// Интерполяция цвета точки вдоль кольца от начала к концу.
float gradient_factor = float(i) / float(num_points - 1); // Фактор градиента для цветовой интерполяции.
vec4 dot_color = mix(dot_color_start, dot_color_end, gradient_factor); // Цвет точки.
// Вычисление вклада точки на основе расстояния.
float distance = length(uv - pos); // Расстояние до текущей точки.
float contribution = smoothstep(radius + 0.01, radius, distance); // Плавный вклад на основе расстояния.
if (contribution > 0.0) { // Если вклад точки больше нуля,
ring_color = mix(ring_color, dot_color, contribution); // Смешивание с цветом кольца.
dot_accum += contribution; // Накопление вклада от точки.
}
// Опциональная тень за каждой точкой.
if (enable_shadow) {
vec2 shadow_pos = pos + shadow_offset; // Позиция для тени.
float shadow_dist = length(uv - shadow_pos); // Расстояние до тени.
float shadow_contrib = smoothstep(radius * 1.2 + 0.005, radius * 1.2, shadow_dist); // Вклад от тени.
shadow_accum += shadow_contrib; // Накопление вклада от теней.
}
}
// Определение базового цвета для кольца или тени.
vec4 base_color = vec4(0.0); // Начальный цвет.
if (dot_accum > 0.0) { // Если есть вклад от точек,
base_color = ring_color; // Установка базового цвета на цвет кольца.
} else if (enable_shadow && shadow_accum > 0.0) { // Если тени включены и есть вклад от теней,
base_color = shadow_color; // Установка базового цвета на цвет тени.
}
// Отрисовка иконки - приступаем только если show_icon истинно.
if (show_icon) {
// Создание радиальной маски, чтобы иконка была видимой внутри радиуса icon_size.
float icon_mask = smoothstep(icon_size, icon_size - 0.005, length(uv)); // Маска для иконки.
// Нормализация UV-координат для иконки.
vec2 icon_uv = (uv / icon_size + vec2(1.0)) / 2.0; // Превращение из диапазона (-icon_size ... +icon_size) в (0 ... 1).
// Применение вращения иконки, если оно включено.
if (enable_icon_rotation) {
float icon_angle = TIME * icon_rotation_speed; // Угол вращения на основе времени и скорости вращения.
if (reverse_icon_rotation) {
icon_angle = -icon_angle; // Инверсия угла, если требуется.
}
// Вращение вокруг центра (0.5, 0.5) текстуры иконки.
vec2 centered_uv = icon_uv - vec2(0.5); // Смещение UV координат.
float s = sin(icon_angle); // Синус угла.
float c = cos(icon_angle); // Косинус угла.
centered_uv = vec2(centered_uv.x * c - centered_uv.y * s,
centered_uv.x * s + centered_uv.y * c); // Применение матрицы вращения.
icon_uv = centered_uv + vec2(0.5); // Смещение обратно к нормализованным координатам.
}
vec4 icon_sample = texture(icon_texture, icon_uv); // Получение цвета из текстуры иконки.
// Смешивание текстуры иконки с базовым цветом кольца с учетом маски и альфа-канала текстуры.
base_color = mix(base_color, icon_sample, icon_mask * icon_sample.a);
}
COLOR = base_color; // Установка финального цвета для текущего пикселя.
}

View File

@@ -1,6 +1,6 @@
[gd_scene load_steps=11 format=3 uid="uid://c7ft3pxeufffh"]
[ext_resource type="Shader" path="res://opt_btn.gdshader" id="1_sq6hl"]
[ext_resource type="Shader" path="res://Shaders/opt_btn.gdshader" id="1_sq6hl"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_0dcn8"]
bg_color = Color(0, 0, 0, 1)

View File

@@ -8,14 +8,16 @@ const RETRY_COUNT = 5 ## Количество повторных отпр
class FGOS:
## Коды выполняемых команд
enum CmdCode {
START_SESSION = 0x0,
READ_CARRIER = 0x1F,
SET_CARRIER = 0x1E,
READ_ATT = 0x1A,
SET_ATT = 0x1B,
READ_GEN_STATUS = 0x05,
SET_GEN_STATUS = 0x06,
BASE_GET_CURRENT_TEMP = 0x36,
START_SESSION = 0x0, ## Команда начала сессии
READ_CARRIER = 0x1F, ## Команда получение несущей частоты
SET_CARRIER = 0x1E, ## Команда установки несущей частоты
READ_ATT = 0x1A, ## Команда чтения аттенюации
SET_ATT = 0x1B, ## Команда установки аттенюации
READ_GEN_STATUS = 0x05, ## Команда получения статуса генератора
SET_GEN_STATUS = 0x06, ## Команда установки статуса генератора
BASE_GET_CURRENT_TEMP = 0x36, ## Команда получения температуры
BASE_CAN_MACRO_WRITE = 0x30, ## Команда для записи последовательности CAN-команд
BASE_CAN_MACRO_READ = 0x33, ## Команда для чтения последовательности CAN-команд
}
enum GROUP {
@@ -164,10 +166,23 @@ class FGOS:
var index_size = 0x1C
var packet = _form_packet(GROUP.RF, CmdCode.SET_ATT, index_size, counter)
packet.encode_u16(0x8, 0x10)
packet.encode_float(0x18, attenuation)
packet.encode_float(0x14, attenuation)
send_packet_to(packet, client)
func set_base_can_macro(installation_can_frequency: int, counter: int, client: StreamPeer):
var index_size = 0x34
var packet = _form_packet(GROUP.BASE, CmdCode.BASE_CAN_MACRO_WRITE, index_size, counter)
packet.encode_u16(0x08, 0x28)
packet.encode_u8(0x1C, 0x01)
packet.encode_u8(0x1D, 0x42)
packet.encode_u8(0x1F, 0x04)
packet.encode_u16(0x20, installation_can_frequency)
packet.encode_u16(0x28, 0x2aff)
packet.encode_u8(0x2B, 0x04)
send_packet_to(packet, client)
func get_carrier(counter: int, client: StreamPeer):
var packet = _form_packet(GROUP.BASE, CmdCode.READ_CARRIER, INDEX_SIZE, counter)
send_packet_to(packet, client)
@@ -183,6 +198,12 @@ class FGOS:
send_packet_to(packet, client)
func base_get_current_temp(counter: int, client: StreamPeer):
func get_base_current_temp(counter: int, client: StreamPeer):
var packet = _form_packet(GROUP.BASE, CmdCode.BASE_GET_CURRENT_TEMP, INDEX_SIZE, counter)
send_packet_to(packet, client)
func get_base_can_macro(counter: int, client: StreamPeer):
var packet = _form_packet(GROUP.BASE, CmdCode.BASE_CAN_MACRO_READ, INDEX_SIZE, counter)
send_packet_to(packet, client)

View File

@@ -28,6 +28,7 @@ func _ready() -> void:
if args[i] == "testsave-path" and i + 1 < args.size():
save_path = args[i + 1]
break
# Таблица УКП_1
node_select1 = $TabContainer/PRD/body_grid/litera_2_4_6/table_ukp_1
draw_tabl(node_select1, Constants.ROWS_REGS_DATA, Constants.ROWS_REGS_DATA.size())
@@ -82,6 +83,9 @@ func _ready() -> void:
node_select_fs_1.set_node_text(0, 4, 'Генератор')
node_select_fs_1.set_node_text(0, 5, 'fpga')
node_select_fs_1.set_node_text(0, 6, 'СИ 2 от ФС')
node_select_fs_1.set_node_text(0, 7, 'Фильтр CAN')
node_select_fs_1.get_node2(1, 7).placeholder_text = 'в МГц'
node_select_fs_1.get_node2(1, 7).editable = true
var node_select_fs_2 = $TabContainer/PRD/body_grid/litera_3_5_7/fs_control
draw_tabl(node_select_fs_2, Constants.ROWS_FS, Constants.ROWS_FS.size())
@@ -98,6 +102,9 @@ func _ready() -> void:
node_select_fs_2.set_node_text(0, 4, 'Генератор')
node_select_fs_2.set_node_text(0, 5, 'fpga')
node_select_fs_2.set_node_text(0, 6, 'СИ 3 от ФС')
node_select_fs_2.set_node_text(0, 7, 'Фильтр CAN')
node_select_fs_2.get_node2(1, 7).placeholder_text = 'в МГц'
node_select_fs_2.get_node2(1, 7).editable = true
# Выбор прибора для подключения
var node_select_device = $TabContainer/PRD/select_dev
@@ -112,8 +119,8 @@ func _ready() -> void:
get_select_device.connect('item_selected', Callable(self, 'on_btn_select'))
node_select_device.get_node2(0,0).text = 'ПРИБОР'
node_select_device.set_columns_min_size([100, 100])
# Получаем имя выбранного прибора
# Получение выбранного прибора при загрузке
if Constants.ADDRESSES.size() > 0:
get_select_device.select(0)
status_pribor = get_select_device.get_item_text(0).strip_edges().substr(4)
@@ -144,24 +151,27 @@ func _ready() -> void:
Network.connect('data_from_fs_1', _on_data_fs_1)
Network.connect('data_from_fs_2', _on_data_fs_2)
## Yau-07b 1
node_select_yau_07b.get_node2(1, 1).get_child(1, false).connect('toggled', Callable(self, '_on_zapret1'))
node_select_yau_07b.get_node2(1, 2).connect('item_selected', Callable(self, '_on_modul_um_1'))
node_select_yau_07b.get_node2(1, 3).connect('item_selected', Callable(self, '_on_btn_ray_1'))
node_select_yau_07b.get_node2(1, 4).connect('item_selected', Callable(self, '_on_attenuator_1'))
## Yau-07b 2
node_select_yau_07b_2.get_node2(1, 1).get_child(1, false).connect('toggled', Callable(self, '_on_zapret2'))
node_select_yau_07b_2.get_node2(1, 2).connect('item_selected', Callable(self, '_on_modul_um_2'))
node_select_yau_07b_2.get_node2(1, 3).connect('item_selected', Callable(self, '_on_btn_ray_2'))
node_select_yau_07b_2.get_node2(1, 4).connect('item_selected', Callable(self, '_on_attenuator_2'))
node_select_yau_07b_2.get_node2(1, 5).get_child(1, false).connect('toggled', Callable(self, '_on_fgos_2'))
## FS 1
node_select_fs_1.get_node2(1, 4).get_child(1, false).connect('toggled', Callable(self, '_on_get_status_1'))
node_select_fs_1.get_node2(1, 3).connect('text_submitted', Callable(self, '_on_set_att_1'))
node_select_fs_1.get_node2(1, 2).connect('text_submitted', Callable(self, '_on_set_ferq_1'))
node_select_fs_1.get_node2(1, 3).connect('text_submitted', Callable(self, '_on_set_att_1'))
node_select_fs_1.get_node2(1, 7).connect('text_submitted', Callable(self, '_on_set_base_can_macro'))
## FS 2
node_select_fs_2.get_node2(1, 4).get_child(1, false).connect('toggled', Callable(self, '_on_get_status_2'))
node_select_fs_2.get_node2(1, 3).connect('text_submitted', Callable(self, '_on_set_att_2'))
node_select_fs_2.get_node2(1, 2).connect('text_submitted', Callable(self, '_on_set_ferq_2'))
node_select_fs_2.get_node2(1, 3).connect('text_submitted', Callable(self, '_on_set_att_2'))
node_select_fs_2.get_node2(1, 7).connect('text_submitted', Callable(self, '_on_set_base_can_macro_2'))
func on_device_selected(selected_index: int) -> void:
@@ -197,15 +207,24 @@ func _on_read_isa(unit_isa_ports: Dictionary) -> void:
$ISA.text = 'ISA: ' + str(len(Constants.EMS_G_PORT_DATA_HOLDER))
if isa_data.has(Constants.BASE_PORTS.UG+6):
$TabContainer/PRD/body_grid/litera_2_4_6/yau07b_control.get_node2(1, 3).select(isa_data[0x106] & 0x7)
$TabContainer/PRD/body_grid/litera_2_4_6/yau07b_control.get_node2(1, 4).select((isa_data[0x106] & 0x38)>> 3)
$TabContainer/PRD/body_grid/litera_2_4_6/PSK/ray_1.material.set('shader_parameter/turn', 0.735 + 0.025 * (isa_data[0x106] & 0x7))
$TabContainer/PRD/body_grid/litera_2_4_6/PSK/ray_1.material.set('shader_parameter/inner_radius', 0.8 - 0.01 * (isa_data[0x106] & 0x38))
$TabContainer/PRD/body_grid/litera_2_4_6/yau07b_control.get_node2(1, 3).select(isa_data[Constants.BASE_PORTS.UG+6] & 0x7)
$TabContainer/PRD/body_grid/litera_2_4_6/yau07b_control.get_node2(1, 4).select((isa_data[Constants.BASE_PORTS.UG+6] & 0x38)>> 3)
$TabContainer/PRD/body_grid/litera_2_4_6/PSK/ray_1.material.set('shader_parameter/turn', 0.735 + 0.025 * (isa_data[Constants.BASE_PORTS.UG+6] & 0x7))
$TabContainer/PRD/body_grid/litera_2_4_6/PSK/ray_1.material.set('shader_parameter/inner_radius', 0.8 - 0.01 * (isa_data[Constants.BASE_PORTS.UG+6] & 0x38))
if isa_data.has(Constants.BASE_PORTS.UG+8):
$TabContainer/PRD/body_grid/litera_3_5_7/yau07b_control.get_node2(1, 3).select(isa_data[0x108] & 0x7)
$TabContainer/PRD/body_grid/litera_3_5_7/yau07b_control.get_node2(1, 4).select((isa_data[0x108] & 0x38)>>3)
$TabContainer/PRD/body_grid/litera_3_5_7/PSK2/ray_2.material.set('shader_parameter/turn', 0.735 + 0.025 * (isa_data[0x108] & 0x7))
$TabContainer/PRD/body_grid/litera_3_5_7/PSK2/ray_2.material.set('shader_parameter/inner_radius', 0.8 - 0.01 * (isa_data[0x108] & 0x38))
$TabContainer/PRD/body_grid/litera_3_5_7/yau07b_control.get_node2(1, 3).select(isa_data[Constants.BASE_PORTS.UG+8] & 0x7)
$TabContainer/PRD/body_grid/litera_3_5_7/yau07b_control.get_node2(1, 4).select((isa_data[Constants.BASE_PORTS.UG+8] & 0x38)>>3)
$TabContainer/PRD/body_grid/litera_3_5_7/PSK2/ray_2.material.set('shader_parameter/turn', 0.735 + 0.025 * (isa_data[Constants.BASE_PORTS.UG+8] & 0x7))
$TabContainer/PRD/body_grid/litera_3_5_7/PSK2/ray_2.material.set('shader_parameter/inner_radius', 0.8 - 0.01 * (isa_data[Constants.BASE_PORTS.UG+8] & 0x38))
if isa_data.has(Constants.BASE_PORTS.EMS_G+2):
print(isa_data[Constants.BASE_PORTS.EMS_G+2])
if (isa_data[Constants.BASE_PORTS.EMS_G+2]== 48):
if (isa_data[Constants.BASE_PORTS.EMS_G+8]>>14):
print(isa_data)
$TabContainer/PRD/body_grid/litera_2_4_6/yau07b_control.get_node2(1,1).get_child(1).button_pressed = true
else:
$TabContainer/PRD/body_grid/litera_2_4_6/yau07b_control.get_node2(1,1).get_child(1).button_pressed = false
func _on_data_fs_1(fs_1_data):
@@ -215,22 +234,26 @@ func _on_data_fs_1(fs_1_data):
match CMD:
Constants.CMD.READ_CARRIER:
if GRP == Constants.GROUP.BASE:
node_select_fs_1.set_node_text(2, 2, str(fs_1_data.decode_u64(0xC)) + ' Гц')
node_select_fs_1.set_node_text(2, 2, str(fs_1_data.decode_u64(0xC) / 1_000_000) + ' МГц')
Constants.CMD.READ_ATT:
if GRP == Constants.GROUP.RF:
node_select_fs_1.set_node_text(2, 3, '-' + str(fs_1_data.decode_float(0x18)) + ' dB')
node_select_fs_1.set_node_text(2, 3, '-' + str(fs_1_data.decode_float(0x14)) + ' dB')
Constants.CMD.READ_GEN_STATUS:
if GRP == Constants.GROUP.GENERATOR:
if fs_1_data.decode_u32(0xC) == 0:
node_select_fs_1.set_node_text(2, 4, 'Включен')
node_select_fs_1.get_node2(2, 4).modulate = Color.AQUAMARINE
else:
node_select_fs_1.set_node_text(2, 4, 'Выключен')
node_select_fs_1.set_node_text(2, 4, 'Отключен')
node_select_fs_1.get_node2(2, 4).modulate = Color.CRIMSON
Constants.CMD.BASE_GET_CURRENT_TEMP:
if GRP == Constants.GROUP.BASE:
node_select_fs_1.set_node_text(1, 5, '%.2f' % fs_1_data.decode_float(0xC) + ' °C')
#$read.text = str(fs_1_data.hex_encode())
Constants.CMD.BASE_CAN_MACRO_READ:
if GRP == Constants.GROUP.BASE:
node_select_fs_1.set_node_text(2, 7, str(fs_1_data.decode_u16(0x20)) + ' МГц')
$can.text = str(fs_1_data)
$can_macro.text = str(fs_1_data.decode_u32(0x04))
func _on_data_fs_2(fs_2_data):
@@ -240,7 +263,7 @@ func _on_data_fs_2(fs_2_data):
match CMD:
Constants.CMD.READ_CARRIER:
if GRP == Constants.GROUP.BASE:
node_select_fs_2.set_node_text(2, 2, str(fs_2_data.decode_u64(0xC)) + ' Гц')
node_select_fs_2.set_node_text(2, 2, str(fs_2_data.decode_u64(0xC) / 1_000_000) + ' МГц')
Constants.CMD.READ_ATT:
if GRP == Constants.GROUP.RF:
node_select_fs_2.set_node_text(2, 3, '-' + str(fs_2_data.decode_float(0x18)) + ' dB')
@@ -250,11 +273,14 @@ func _on_data_fs_2(fs_2_data):
node_select_fs_2.set_node_text(2, 4, 'Включен')
node_select_fs_2.get_node2(2, 4).modulate = Color.AQUAMARINE
else:
node_select_fs_2.set_node_text(2, 4, 'Выключен')
node_select_fs_2.set_node_text(2, 4, 'Отключен')
node_select_fs_2.get_node2(2, 4).modulate = Color.CRIMSON
Constants.CMD.BASE_GET_CURRENT_TEMP:
if GRP == Constants.GROUP.BASE:
node_select_fs_2.set_node_text(1, 5, '%.2f' % fs_2_data.decode_float(0xC) + ' °C')
Constants.CMD.BASE_CAN_MACRO_READ:
if GRP == Constants.GROUP.BASE:
node_select_fs_2.set_node_text(2, 7, str(fs_2_data.decode_u16(0x20)) + ' МГц')
## Рисует таблицу
@@ -407,7 +433,7 @@ func _on_load_config():
func set_tab_and_buttons(tab_index: int, button_name: String) -> void:
$TabContainer.current_tab = tab_index
var side_panel = $Background/side_panel
for button in side_panel.get_children():
if button is Button:
button.button_pressed = (button.name == button_name)
@@ -545,6 +571,10 @@ func _on_set_att_1(att: String):
Network.set_fs_attenuation(float(att))
func _on_set_base_can_macro(can_freq: String):
Network.set_can_macro(int(can_freq))
## 2 ФС
func _on_port_changed_fs_2(port_name: String, color: Color) -> void:
$TabContainer/PRD/body_grid/litera_3_5_7/fs_control.set_node_text(1, 1, port_name)
@@ -566,3 +596,7 @@ func _on_set_ferq_2(freq: String):
func _on_set_att_2(att: String):
Network.set_fs_attenuation_2(float(att))
func _on_set_base_can_macro_2(can_freq: String):
Network.set_can_macro_2(int(can_freq))

View File

@@ -45,7 +45,8 @@ const ROWS_FS: Array = [
[TableNode, TableNode, TableNode],
[TableNode, Switch, TableNode],
[TableNode, TableNode, TableNode],
[TableNode, SocketStatus, TableNode]]
[TableNode, SocketStatus, TableNode],
[TableNode, TableNode, TableNode],]
const ADDRESSES: Array = [
['ПРД-Н1', '10.1.1.11', 50011, MODE.PRD_H, '10.1.2.18', '10.1.2.19', ''],
['ПРД-Н2', '10.1.1.21', 50021, MODE.PRD_H, '10.1.2.34', '10.1.2.35', ''],
@@ -100,9 +101,9 @@ const OUT_x128: Array = [
'Р',
'К',
'Откл.',
'1',]
'1'
]
const RAY_DICT: Array = [
' Контроль',
' -5°',
'',
' 15°',
@@ -110,7 +111,7 @@ const RAY_DICT: Array = [
' 35°',
' 45°',
' Контроль',
]
]
const ATT_DICT: Array = [
' 0 dB',
' 0.5 dB',
@@ -120,20 +121,18 @@ const ATT_DICT: Array = [
' 8.5 dB',
' 10 dB',
' 10.5 dB',
]
]
enum BASE_PORTS {
UG = 0x100,
EMS_G = 0x120,
UKP_1 = 0x130,
UKP_2 = 0x140,
}
enum MODE {
PRD_K,
PRD_B,
PRD_H,
}
}
enum Frame {
WORK, ## В работе
CONSTANT, ## Постоянный сигнал
@@ -152,7 +151,7 @@ enum DataIndices {
TEMPERATURE_UKP_1 = 47,
POWER_UKP_2 = 63,
TEMPERATURE_UKP_2 = 79,
}
}
enum STATE {
WAIT,
READ_ISA,
@@ -160,13 +159,12 @@ enum STATE {
DONE,
IDLE,
SEND,
}
}
enum STATE_VAL {
NONE = 0,
GOOD = 1,
ERROR = 2 }
ERROR = 2
}
var EMS_G_PORT_DATA_HOLDER: Array = []
const PORT_FS = 1201
@@ -175,7 +173,7 @@ enum GROUP {
BASE = 0x00,
GENERATOR = 0x03,
RF = 0x06,
}
}
enum CMD {
START_SESSION = 0x0,
@@ -186,4 +184,5 @@ enum CMD {
READ_GEN_STATUS = 0x05,
SET_GEN_STATUS = 0x06,
BASE_GET_CURRENT_TEMP = 0x36,
BASE_CAN_MACRO_READ = 0x33,
}

View File

@@ -2,8 +2,7 @@ extends Node
# ЯУ-07 Блок
var unit = Yau07.YaU07.new('ЯУ-07Б')
var unit_fs_1 = Fs.FGOS.new()
#var unit_fs_2 = Fs.FGOS.new()
var unit_fs = Fs.FGOS.new()
var soc_unicast: Socket
var soc_brodcast: Socket
var ip_address_yau: String = Constants.ADDRESSES[0][1]
@@ -116,7 +115,7 @@ func _ready() -> void:
unit.connect('command_fail', Callable(self, 'on_command_fail'))
connect_fs_1()
connect_fs_2()
read_port_isa([0x106, 0x108])
read_port_isa([Constants.BASE_PORTS.UG+6, Constants.BASE_PORTS.UG+8, Constants.BASE_PORTS.EMS_G+8])
func _process(delta: float) -> void:
@@ -203,13 +202,13 @@ func state_machine_fs(client_fs):
if (state_fs == Constants.STATE.IDLE) or (state_fs == Constants.STATE.DONE):
if command_stack:
var pack: Array = command_stack.pop_front()
unit_fs_1.send_fs_data(pack, client_fs_1, peerstream_fs_1)
unit_fs.send_fs_data(pack, client_fs_1, peerstream_fs_1)
state_fs = Constants.STATE.SEND
if client_fs == client_fs_2:
if (state_fs_2 == Constants.STATE.IDLE) or (state_fs_2 == Constants.STATE.DONE):
if command_stack_2:
var pack: Array = command_stack_2.pop_front()
unit_fs_1.send_fs_data(pack, client_fs_2, peerstream_fs_2)
unit_fs.send_fs_data(pack, client_fs_2, peerstream_fs_2)
state_fs_2 = Constants.STATE.SEND
@@ -236,42 +235,53 @@ func disconnect_fs(client_for_leave):
func start_work_fs():
counter_fs_1 = 0
unit_fs_1.start_session(counter_fs_1, client_fs_1)
unit_fs.start_session(counter_fs_1, client_fs_1)
counter_fs_1 += 1
unit_fs_1.get_gen_state(counter_fs_1, client_fs_1)
unit_fs.get_gen_state(counter_fs_1, client_fs_1)
counter_fs_1 += 1
unit_fs_1.get_att_batch(counter_fs_1, client_fs_1)
unit_fs.get_att_batch(counter_fs_1, client_fs_1)
counter_fs_1 += 1
unit_fs_1.get_carrier(counter_fs_1, client_fs_1)
unit_fs.get_carrier(counter_fs_1, client_fs_1)
counter_fs_1 += 1
unit_fs_1.base_get_current_temp(counter_fs_1, client_fs_1)
unit_fs.get_base_current_temp(counter_fs_1, client_fs_1)
counter_fs_1 += 1
unit_fs.get_base_can_macro(counter_fs_1, client_fs_1)
counter_fs_1 += 1
func get_fs_gen_status(state_gen):
unit_fs_1.set_gen_state(state_gen, counter_fs_1, client_fs_1)
unit_fs.set_gen_state(state_gen, counter_fs_1, client_fs_1)
counter_fs_1 += 1
unit_fs_1.get_gen_state(counter_fs_1, client_fs_1)
unit_fs.get_gen_state(counter_fs_1, client_fs_1)
counter_fs_1 += 1
unit_fs_1.base_get_current_temp(counter_fs_1, client_fs_1)
unit_fs.get_base_current_temp(counter_fs_1, client_fs_1)
counter_fs_1 += 1
func set_fs_ferq_carrier(freq: int):
unit_fs_1.set_carrier(freq, counter_fs_1, client_fs_1)
unit_fs.set_carrier(freq, counter_fs_1, client_fs_1)
counter_fs_1 += 1
unit_fs_1.base_get_current_temp(counter_fs_1, client_fs_1)
unit_fs.get_base_current_temp(counter_fs_1, client_fs_1)
counter_fs_1 += 1
unit_fs_1.get_carrier(counter_fs_1, client_fs_1)
unit_fs.get_carrier(counter_fs_1, client_fs_1)
counter_fs_1 += 1
func set_fs_attenuation(attenuation: float):
unit_fs_1.set_att_batch(attenuation, counter_fs_1, client_fs_1)
unit_fs.set_att_batch(attenuation, counter_fs_1, client_fs_1)
counter_fs_1 += 1
unit_fs_1.get_att_batch(counter_fs_1, client_fs_1)
unit_fs.get_att_batch(counter_fs_1, client_fs_1)
counter_fs_1 += 1
unit_fs_1.base_get_current_temp(counter_fs_1, client_fs_1)
unit_fs.get_base_current_temp(counter_fs_1, client_fs_1)
counter_fs_1 += 1
func set_can_macro(can_frequency: int):
unit_fs.set_base_can_macro(can_frequency, counter_fs_1, client_fs_1)
counter_fs_1 += 1
unit_fs.get_base_current_temp(counter_fs_1, client_fs_1)
counter_fs_1 += 1
unit_fs.get_base_can_macro(counter_fs_1, client_fs_1)
counter_fs_1 += 1
@@ -291,7 +301,7 @@ func connect_fs_2():
# Разорвать соединение с ФС
func disconnect_fs_2(client_for_leave):
func disconnect_fs_2(client_for_leave: StreamPeer):
client_for_leave.disconnect_from_host()
state_fs_2 = Constants.STATE.IDLE
command_stack_2 = []
@@ -299,39 +309,56 @@ func disconnect_fs_2(client_for_leave):
func start_work_fs_2():
counter_fs_2 = 0
unit_fs_1.start_session(counter_fs_2, client_fs_2)
unit_fs.start_session(counter_fs_2, client_fs_2)
counter_fs_2 += 1
unit_fs_1.get_gen_state(counter_fs_2, client_fs_2)
unit_fs.get_gen_state(counter_fs_2, client_fs_2)
counter_fs_2 += 1
unit_fs_1.get_att_batch(counter_fs_2, client_fs_2)
unit_fs.get_att_batch(counter_fs_2, client_fs_2)
counter_fs_2 += 1
unit_fs_1.get_carrier(counter_fs_2, client_fs_2)
unit_fs.get_carrier(counter_fs_2, client_fs_2)
counter_fs_2 += 1
unit_fs_1.base_get_current_temp(counter_fs_2, client_fs_2)
unit_fs.get_base_current_temp(counter_fs_2, client_fs_2)
counter_fs_2 += 1
#
func get_fs_gen_status_2(state_gen):
unit_fs_1.set_gen_state(state_gen, counter_fs_2, client_fs_2)
unit_fs.get_base_can_macro(counter_fs_2, client_fs_2)
counter_fs_2 += 1
unit_fs_1.get_gen_state(counter_fs_2, client_fs_2)
func get_fs_gen_status_2(state_gen: bool):
unit_fs.set_gen_state(state_gen, counter_fs_2, client_fs_2)
counter_fs_2 += 1
unit_fs_1.base_get_current_temp(counter_fs_2, client_fs_2)
unit_fs.get_gen_state(counter_fs_2, client_fs_2)
counter_fs_2 += 1
unit_fs.get_base_current_temp(counter_fs_2, client_fs_2)
counter_fs_2 += 1
func set_fs_ferq_carrier_2(freq: int):
unit_fs_1.set_carrier(freq, counter_fs_2, client_fs_2)
unit_fs.set_carrier(freq, counter_fs_2, client_fs_2)
counter_fs_2 += 1
unit_fs_1.base_get_current_temp(counter_fs_2, client_fs_2)
unit_fs.get_base_current_temp(counter_fs_2, client_fs_2)
counter_fs_2 += 1
unit_fs_1.get_carrier(counter_fs_2, client_fs_2)
unit_fs.get_carrier(counter_fs_2, client_fs_2)
counter_fs_2 += 1
func set_fs_attenuation_2(attenuation: float):
unit_fs_1.set_att_batch(attenuation, counter_fs_2, client_fs_2)
unit_fs.set_att_batch(attenuation, counter_fs_2, client_fs_2)
counter_fs_2 += 1
unit_fs_1.get_att_batch(counter_fs_2, client_fs_2)
unit_fs.get_att_batch(counter_fs_2, client_fs_2)
counter_fs_2 += 1
unit_fs_1.base_get_current_temp(counter_fs_2, client_fs_2)
unit_fs.get_base_current_temp(counter_fs_2, client_fs_2)
counter_fs_2 += 1
func set_can_macro_2(can_frequency: int):
unit_fs.set_base_can_macro(can_frequency, counter_fs_2, client_fs_2)
counter_fs_2 += 1
unit_fs.get_base_current_temp(counter_fs_2, client_fs_2)
counter_fs_2 += 1
unit_fs.get_base_can_macro(counter_fs_2, client_fs_2)
counter_fs_2 += 1
func can_macro_exec_2(state_can: bool):
unit_fs.set_state_base_can_macro(state_can, counter_fs_2, client_fs_2)
counter_fs_2 += 1

View File

@@ -3,7 +3,7 @@
[ext_resource type="Texture2D" uid="uid://ce3qpf070wgd2" path="res://состояние-исправности-0.png" id="1_2n7he"]
[ext_resource type="Texture2D" uid="uid://cgtg4gbqnuxrc" path="res://nine-patch-round.png" id="2_4b43i"]
[ext_resource type="Texture2D" uid="uid://byweg7pgt8o4h" path="res://состояние-исправности-1.png" id="2_38t58"]
[ext_resource type="Shader" path="res://opt_btn.gdshader" id="2_ecsml"]
[ext_resource type="Shader" path="res://Shaders/opt_btn.gdshader" id="2_ecsml"]
[ext_resource type="Texture2D" uid="uid://dkef6xwxwdxi8" path="res://эмс-бланк.png" id="3_4kmgr"]
[ext_resource type="Texture2D" uid="uid://bvikuv0lbvou8" path="res://состояние-исправности-2.png" id="3_i2t3v"]
[ext_resource type="Texture2D" uid="uid://b15flrfytxkop" path="res://эмс-бланк-пост.png" id="4_omove"]