Compare commits
2 Commits
fe95902a1d
...
d5261f4788
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d5261f4788 | ||
|
|
e2fbe19d84 |
7
main.gd
7
main.gd
@@ -170,7 +170,12 @@ func _exit_tree():
|
||||
|
||||
func on_modify_device(toggled: bool, name_device: String) -> void:
|
||||
if toggled:
|
||||
udp_broadcast = UDPBroadcast.new(name_device)
|
||||
var logger_node: Node
|
||||
for node in get_tree().get_nodes_in_group('logger'):
|
||||
if node.get_meta('device') == name_device:
|
||||
logger_node = node
|
||||
break
|
||||
udp_broadcast = UDPBroadcast.new(name_device, logger_node)
|
||||
udp_broadcast.add_timers_to_scene(self)
|
||||
udp_broadcast.start_broadcast()
|
||||
dictionary_yau07[name_device] = udp_broadcast
|
||||
|
||||
137
main.tscn
137
main.tscn
@@ -1,23 +1,30 @@
|
||||
[gd_scene load_steps=14 format=3 uid="uid://bxorauom63ib6"]
|
||||
[gd_scene load_steps=16 format=3 uid="uid://bxorauom63ib6"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://d1qwoxkckvdbc" path="res://main.gd" id="1_ig7tw"]
|
||||
[ext_resource type="PackedScene" uid="uid://2rjgbflmbi7e" path="res://sockets/ems_g/емс-г-Н.tscn" id="2_0xm2m"]
|
||||
[ext_resource type="Shader" uid="uid://cp2p2g3mgxm8o" path="res://main_ragial_gradient.gdshader" id="2_272bh"]
|
||||
[ext_resource type="Shader" uid="uid://cp2p2g3mgxm8o" path="res://main_radial_gradient.gdshader" id="2_272bh"]
|
||||
[ext_resource type="Script" uid="uid://b3hcliukdo2wm" path="res://sockets/ems_g/емс_г_н.gd" id="3_1bvp3"]
|
||||
[ext_resource type="PackedScene" uid="uid://bhh0m5tbxjfmy" path="res://sockets/ems_g/емс-г-В.tscn" id="3_lquwl"]
|
||||
[ext_resource type="PackedScene" uid="uid://pq47qp2lye4o" path="res://sockets/ems_g/емс-г-К.tscn" id="4_1bvp3"]
|
||||
[ext_resource type="Script" uid="uid://bwll70u61ocw6" path="res://журнал.gd" id="5_5vw27"]
|
||||
[ext_resource type="Script" uid="uid://cgtvbvw1xfqay" path="res://sockets/ems_g/емс_г_в.gd" id="5_lquwl"]
|
||||
|
||||
[sub_resource type="ShaderMaterial" id="ShaderMaterial_5vw27"]
|
||||
shader = ExtResource("2_272bh")
|
||||
shader_parameter/outerRadius = 4.405
|
||||
shader_parameter/MainAlpha = 0.88
|
||||
shader_parameter/circle_color = Color(0.900141, 0.363478, 0.296518, 1)
|
||||
shader_parameter/circle_color2 = Color(0.192389, 0.0130258, 0.00462306, 1)
|
||||
shader_parameter/circle_color = Color(0.890196, 0.94902, 0.992157, 1)
|
||||
shader_parameter/circle_color2 = Color(0.733333, 0.870588, 0.984314, 1)
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_kek77"]
|
||||
bg_color = Color(0.678977, 0.102543, 0.388891, 1)
|
||||
|
||||
[sub_resource type="Theme" id="Theme_272bh"]
|
||||
CheckButton/colors/font_focus_color = Color(0, 0, 0, 1)
|
||||
CheckButton/colors/font_hover_color = Color(0, 0, 0, 1)
|
||||
CheckButton/colors/font_hover_pressed_color = Color(0, 0, 0, 1)
|
||||
CheckButton/colors/font_pressed_color = Color(0, 0, 0, 1)
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_0xm2m"]
|
||||
bg_color = Color(0.1167, 0.351514, 0.35159, 1)
|
||||
|
||||
@@ -37,6 +44,8 @@ anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
script = ExtResource("1_ig7tw")
|
||||
metadata/_edit_vertical_guides_ = [136.0, 440.0]
|
||||
metadata/_edit_horizontal_guides_ = [48.0, 768.0]
|
||||
|
||||
[node name="Panel" type="Panel" parent="."]
|
||||
material = SubResource("ShaderMaterial_5vw27")
|
||||
@@ -51,126 +60,168 @@ offset_left = 32.0
|
||||
offset_top = 24.0
|
||||
offset_right = 140.0
|
||||
offset_bottom = 440.0
|
||||
theme = SubResource("Theme_272bh")
|
||||
columns = 2
|
||||
|
||||
[node name="CheckButton" type="CheckButton" parent="Yau-07-addr" groups=["device-addr"]]
|
||||
layout_mode = 2
|
||||
focus_mode = 0
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
text = "ПРД-Н1"
|
||||
metadata/device = "ПРД-Н1"
|
||||
|
||||
[node name="Label" type="Label" parent="Yau-07-addr"]
|
||||
layout_mode = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
text = "10.1.1.11"
|
||||
|
||||
[node name="CheckButton2" type="CheckButton" parent="Yau-07-addr" groups=["device-addr"]]
|
||||
layout_mode = 2
|
||||
focus_mode = 0
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
text = "ПРД-В1"
|
||||
metadata/device = "ПРД-В1"
|
||||
|
||||
[node name="Label2" type="Label" parent="Yau-07-addr"]
|
||||
layout_mode = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
text = "10.1.1.12"
|
||||
|
||||
[node name="CheckButton3" type="CheckButton" parent="Yau-07-addr" groups=["device-addr"]]
|
||||
layout_mode = 2
|
||||
focus_mode = 0
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
text = "ПРД-К1"
|
||||
metadata/device = "ПРД-К1"
|
||||
|
||||
[node name="Label3" type="Label" parent="Yau-07-addr"]
|
||||
layout_mode = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
text = "10.1.1.13"
|
||||
|
||||
[node name="CheckButton4" type="CheckButton" parent="Yau-07-addr" groups=["device-addr"]]
|
||||
layout_mode = 2
|
||||
focus_mode = 0
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
text = "ПРД-Н2"
|
||||
metadata/device = "ПРД-Н2"
|
||||
|
||||
[node name="Label4" type="Label" parent="Yau-07-addr"]
|
||||
layout_mode = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
text = "10.1.1.21"
|
||||
|
||||
[node name="CheckButton5" type="CheckButton" parent="Yau-07-addr" groups=["device-addr"]]
|
||||
layout_mode = 2
|
||||
focus_mode = 0
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
text = "ПРД-В2"
|
||||
metadata/device = "ПРД-В2"
|
||||
|
||||
[node name="Label5" type="Label" parent="Yau-07-addr"]
|
||||
layout_mode = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
text = "10.1.1.22"
|
||||
|
||||
[node name="CheckButton6" type="CheckButton" parent="Yau-07-addr" groups=["device-addr"]]
|
||||
layout_mode = 2
|
||||
focus_mode = 0
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
text = "ПРД-К2"
|
||||
metadata/device = "ПРД-К2"
|
||||
|
||||
[node name="Label6" type="Label" parent="Yau-07-addr"]
|
||||
layout_mode = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
text = "10.1.1.23"
|
||||
|
||||
[node name="CheckButton7" type="CheckButton" parent="Yau-07-addr" groups=["device-addr"]]
|
||||
layout_mode = 2
|
||||
focus_mode = 0
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
text = "ПРД-Н3"
|
||||
metadata/device = "ПРД-Н3"
|
||||
|
||||
[node name="Label7" type="Label" parent="Yau-07-addr"]
|
||||
layout_mode = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
text = "10.1.1.31"
|
||||
|
||||
[node name="CheckButton8" type="CheckButton" parent="Yau-07-addr" groups=["device-addr"]]
|
||||
layout_mode = 2
|
||||
focus_mode = 0
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
text = "ПРД-В3"
|
||||
metadata/device = "ПРД-В3"
|
||||
|
||||
[node name="Label8" type="Label" parent="Yau-07-addr"]
|
||||
layout_mode = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
text = "10.1.1.32"
|
||||
|
||||
[node name="CheckButton9" type="CheckButton" parent="Yau-07-addr" groups=["device-addr"]]
|
||||
layout_mode = 2
|
||||
focus_mode = 0
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
text = "ПРД-К3"
|
||||
metadata/device = "ПРД-К3"
|
||||
|
||||
[node name="Label9" type="Label" parent="Yau-07-addr"]
|
||||
layout_mode = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
text = "10.1.1.33"
|
||||
|
||||
[node name="CheckButton10" type="CheckButton" parent="Yau-07-addr" groups=["device-addr"]]
|
||||
layout_mode = 2
|
||||
focus_mode = 0
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
text = "ПРД-Н4"
|
||||
metadata/device = "ПРД-Н4"
|
||||
|
||||
[node name="Label10" type="Label" parent="Yau-07-addr"]
|
||||
layout_mode = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
text = "10.1.1.41"
|
||||
|
||||
[node name="CheckButton11" type="CheckButton" parent="Yau-07-addr" groups=["device-addr"]]
|
||||
layout_mode = 2
|
||||
focus_mode = 0
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
text = "ПРД-В4"
|
||||
metadata/device = "ПРД-В4"
|
||||
|
||||
[node name="Label11" type="Label" parent="Yau-07-addr"]
|
||||
layout_mode = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
text = "10.1.1.42"
|
||||
|
||||
[node name="CheckButton12" type="CheckButton" parent="Yau-07-addr" groups=["device-addr"]]
|
||||
layout_mode = 2
|
||||
focus_mode = 0
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
text = "ПРД-К4"
|
||||
metadata/device = "ПРД-К4"
|
||||
|
||||
[node name="Label12" type="Label" parent="Yau-07-addr"]
|
||||
layout_mode = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
text = "10.1.1.43"
|
||||
|
||||
[node name="TabContainer" type="TabContainer" parent="."]
|
||||
layout_mode = 0
|
||||
offset_left = 240.0
|
||||
offset_top = 17.0
|
||||
offset_right = 1536.0
|
||||
offset_bottom = 768.0
|
||||
layout_mode = 1
|
||||
anchors_preset = -1
|
||||
anchor_left = 0.16
|
||||
anchor_top = 0.02
|
||||
anchor_right = 1.024
|
||||
anchor_bottom = 0.904
|
||||
offset_left = -1.52588e-05
|
||||
offset_right = -0.00012207
|
||||
offset_bottom = -0.400024
|
||||
tooltip_text = "Выбор прибора"
|
||||
current_tab = 0
|
||||
use_hidden_tabs_for_min_size = true
|
||||
tab_focus_mode = 0
|
||||
metadata/_edit_use_anchors_ = true
|
||||
|
||||
[node name="ПРД-Н1" type="Panel" parent="TabContainer" groups=["prd"]]
|
||||
layout_mode = 2
|
||||
@@ -215,14 +266,38 @@ text = "Загрузка ЭМС"
|
||||
metadata/bit = 4
|
||||
metadata/device = "ПРД-Н1"
|
||||
|
||||
[node name="SocketsBar" type="TabContainer" parent="TabContainer/ПРД-Н1"]
|
||||
[node name="dkm" type="GridContainer" parent="TabContainer/ПРД-Н1"]
|
||||
layout_mode = 0
|
||||
offset_left = 19.0
|
||||
offset_top = 206.0
|
||||
offset_right = 97.0
|
||||
offset_bottom = 272.0
|
||||
|
||||
[node name="CheckBox" type="CheckBox" parent="TabContainer/ПРД-Н1/dkm" groups=["dkm"]]
|
||||
layout_mode = 2
|
||||
text = "ДКМ 2"
|
||||
metadata/bit = 1
|
||||
metadata/device = "ПРД-Н1"
|
||||
|
||||
[node name="CheckBox2" type="CheckBox" parent="TabContainer/ПРД-Н1/dkm" groups=["dkm"]]
|
||||
layout_mode = 2
|
||||
text = "ДКМ 3"
|
||||
metadata/bit = 2
|
||||
metadata/device = "ПРД-Н1"
|
||||
|
||||
[node name="SocketsBar" type="TabContainer" parent="TabContainer/ПРД-Н1"]
|
||||
layout_mode = 1
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
offset_left = 199.0
|
||||
offset_right = 1296.0
|
||||
offset_bottom = 752.0
|
||||
current_tab = 2
|
||||
offset_bottom = 32.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
current_tab = 4
|
||||
tabs_position = 1
|
||||
tab_focus_mode = 0
|
||||
metadata/_edit_lock_ = true
|
||||
|
||||
[node name="УКП-1" type="GridContainer" parent="TabContainer/ПРД-Н1/SocketsBar"]
|
||||
visible = false
|
||||
@@ -433,6 +508,7 @@ metadata/device = "ПРД-Н1"
|
||||
metadata/place = 13
|
||||
|
||||
[node name="УГ" type="GridContainer" parent="TabContainer/ПРД-Н1/SocketsBar"]
|
||||
visible = false
|
||||
layout_mode = 2
|
||||
columns = 5
|
||||
metadata/_tab_index = 2
|
||||
@@ -674,24 +750,13 @@ layout_mode = 2
|
||||
script = ExtResource("3_1bvp3")
|
||||
metadata/device = "ПРД-Н1"
|
||||
|
||||
[node name="dkm" type="GridContainer" parent="TabContainer/ПРД-Н1"]
|
||||
layout_mode = 0
|
||||
offset_left = 19.0
|
||||
offset_top = 206.0
|
||||
offset_right = 97.0
|
||||
offset_bottom = 272.0
|
||||
|
||||
[node name="CheckBox" type="CheckBox" parent="TabContainer/ПРД-Н1/dkm" groups=["dkm"]]
|
||||
[node name="Журнал" type="RichTextLabel" parent="TabContainer/ПРД-Н1/SocketsBar" groups=["logger"]]
|
||||
layout_mode = 2
|
||||
text = "ДКМ 2"
|
||||
metadata/bit = 1
|
||||
metadata/device = "ПРД-Н1"
|
||||
|
||||
[node name="CheckBox2" type="CheckBox" parent="TabContainer/ПРД-Н1/dkm" groups=["dkm"]]
|
||||
layout_mode = 2
|
||||
text = "ДКМ 3"
|
||||
metadata/bit = 2
|
||||
bbcode_enabled = true
|
||||
text = "Fish text"
|
||||
script = ExtResource("5_5vw27")
|
||||
metadata/device = "ПРД-Н1"
|
||||
metadata/_tab_index = 4
|
||||
|
||||
[node name="ПРД-В1" type="Panel" parent="TabContainer" groups=["prd"]]
|
||||
visible = false
|
||||
@@ -2224,6 +2289,12 @@ offset_left = 64.0
|
||||
offset_top = 480.0
|
||||
offset_right = 140.0
|
||||
offset_bottom = 511.0
|
||||
focus_mode = 0
|
||||
theme_override_colors/font_hover_pressed_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_hover_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_focus_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_pressed_color = Color(0, 0, 0, 1)
|
||||
text = "УФ "
|
||||
metadata/device = "УФ"
|
||||
|
||||
@@ -2233,6 +2304,7 @@ offset_left = 80.0
|
||||
offset_top = 3.0
|
||||
offset_right = 149.0
|
||||
offset_bottom = 26.0
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
text = "10.1.1.52"
|
||||
|
||||
[node name="GridContainer" type="GridContainer" parent="."]
|
||||
@@ -2244,35 +2316,42 @@ offset_bottom = 761.0
|
||||
|
||||
[node name="CheckBox" type="CheckBox" parent="GridContainer" groups=["uf_status"]]
|
||||
layout_mode = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
text = "КЭМС-Б1"
|
||||
metadata/bit = 0
|
||||
|
||||
[node name="CheckBox2" type="CheckBox" parent="GridContainer" groups=["uf_status"]]
|
||||
layout_mode = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
text = "ЭМС-Б"
|
||||
metadata/bit = 1
|
||||
|
||||
[node name="CheckBox3" type="CheckBox" parent="GridContainer" groups=["uf_status"]]
|
||||
layout_mode = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
text = "ЭМС-Б"
|
||||
metadata/bit = 2
|
||||
|
||||
[node name="CheckBox4" type="CheckBox" parent="GridContainer" groups=["uf_status"]]
|
||||
layout_mode = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
text = "КЭМС-Б1 load"
|
||||
metadata/bit = 3
|
||||
|
||||
[node name="CheckBox5" type="CheckBox" parent="GridContainer" groups=["uf_status"]]
|
||||
layout_mode = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
text = "ЭМС-Б load"
|
||||
metadata/bit = 4
|
||||
|
||||
[node name="CheckBox6" type="CheckBox" parent="GridContainer" groups=["uf_status"]]
|
||||
layout_mode = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
text = "ЭМС-Б load"
|
||||
metadata/bit = 5
|
||||
|
||||
[node name="CheckBox7" type="CheckBox" parent="GridContainer" groups=["uf_status"]]
|
||||
layout_mode = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
text = "ИП220-27Б"
|
||||
metadata/bit = 6
|
||||
|
||||
@@ -19,8 +19,3 @@ config/icon="res://icon.svg"
|
||||
|
||||
window/size/viewport_width=1500
|
||||
window/size/viewport_height=850
|
||||
|
||||
[rendering]
|
||||
|
||||
renderer/rendering_method="gl_compatibility"
|
||||
renderer/rendering_method.mobile="gl_compatibility"
|
||||
|
||||
@@ -19,7 +19,6 @@ signal bits_changed(input_impulse: int, input_const: int, output_impulse: int, o
|
||||
#endregion
|
||||
|
||||
func _ready():
|
||||
print(get_meta('device'))
|
||||
_setup_connections()
|
||||
|
||||
|
||||
|
||||
@@ -19,7 +19,6 @@ signal bits_changed(input_impulse: int, input_const: int, output_impulse: int, o
|
||||
#endregion
|
||||
|
||||
func _ready():
|
||||
print(get_meta('device'))
|
||||
_setup_connections()
|
||||
|
||||
|
||||
|
||||
@@ -19,7 +19,6 @@ signal bits_changed(input_impulse: int, input_const: int, output_impulse: int, o
|
||||
#endregion
|
||||
|
||||
func _ready():
|
||||
print(get_meta('device'))
|
||||
_setup_connections()
|
||||
|
||||
|
||||
|
||||
104
udp_broadcast.gd
104
udp_broadcast.gd
@@ -39,6 +39,7 @@ const BROADCAST_ADDR: Array = [50000, '10.1.1.255']
|
||||
|
||||
# Приватные свойства
|
||||
var status_manager: StatusManager
|
||||
var logs_manager: LogsRich
|
||||
var _socket: SocketUDP
|
||||
var _self_name: String
|
||||
var _isa_ports: Dictionary = {}
|
||||
@@ -60,22 +61,31 @@ signal update_isa_ports(_isa_ports: Dictionary)
|
||||
signal update_socket_status(_sockets_status_bit: int)
|
||||
|
||||
|
||||
func _init(name: String):
|
||||
func _init(name: String, logs_node: RichTextLabel):
|
||||
'''Инициализация UDP broadcast клиента'''
|
||||
status_manager = StatusManager.new(self)
|
||||
_self_name = name
|
||||
initialize_logs_manager(logs_node)
|
||||
_initialize_socket()
|
||||
_initialize_ukp_data()
|
||||
_initialize_timers()
|
||||
_initialize_isa_ports()
|
||||
_initialize_isa_ports()
|
||||
|
||||
if not _bind_to_device_address(name):
|
||||
push_error('Не удалось инициализировать устройство: %s' % name)
|
||||
|
||||
|
||||
func initialize_logs_manager(logs_node: LogsRich) -> void:
|
||||
'''Инициализация менеджера логов'''
|
||||
logs_manager = logs_node
|
||||
logs_manager.info("Логирование инициализировано для %s" % _self_name)
|
||||
|
||||
|
||||
func _initialize_socket() -> void:
|
||||
'''Инициализация UDP сокета'''
|
||||
_socket = SocketUDP.new()
|
||||
if logs_manager:
|
||||
logs_manager.debug("UDP сокет инициализирован")
|
||||
|
||||
|
||||
func _initialize_timers() -> void:
|
||||
@@ -84,6 +94,8 @@ func _initialize_timers() -> void:
|
||||
_timer = Timer.new()
|
||||
_timer.wait_time = 1.0 / 5.0
|
||||
_timer.timeout.connect(_on_broadcast_timeout)
|
||||
if logs_manager:
|
||||
logs_manager.debug("Таймеры инициализированы")
|
||||
|
||||
|
||||
func _initialize_ukp_data() -> void:
|
||||
@@ -95,6 +107,8 @@ func _initialize_ukp_data() -> void:
|
||||
ukp1_data = PackedByteArray()
|
||||
ukp1_data.resize(UKP_DATA_SIZE)
|
||||
ukp1_data.fill(0)
|
||||
if logs_manager:
|
||||
logs_manager.debug("Данные UKP инициализированы")
|
||||
|
||||
|
||||
func _initialize_isa_ports() -> void:
|
||||
@@ -103,12 +117,14 @@ func _initialize_isa_ports() -> void:
|
||||
set_isa_port(0x0106, 0) # DOU2 статус
|
||||
set_isa_port(0x0108, 0) # DOU3 статус
|
||||
set_isa_port(0x010A, 0) # ATT
|
||||
if logs_manager:
|
||||
logs_manager.debug("ISA порты инициализированы")
|
||||
|
||||
|
||||
func _bind_to_device_address(device_name: String) -> bool:
|
||||
'''Привязка к адресу устройства по его имени'''
|
||||
if not ADDRESS_LIST.has(device_name):
|
||||
push_error('Неизвестное устройство: %s' % device_name)
|
||||
_log_error('Неизвестное устройство: %s' % device_name)
|
||||
return false
|
||||
|
||||
var port: int = ADDRESS_LIST[device_name][0]
|
||||
@@ -120,15 +136,15 @@ func _bind_to_device_address(device_name: String) -> bool:
|
||||
func bind_unit_address(port: int, address: String) -> bool:
|
||||
'''Привязка сокета к указанному порту и адресу'''
|
||||
if port <= 0 or port > 65535:
|
||||
push_error('Некорректный номер порта: %d' % port)
|
||||
_log_error('Некорректный номер порта: %d' % port)
|
||||
return false
|
||||
|
||||
var bind_result = _socket.bind(port, address)
|
||||
if bind_result != OK:
|
||||
push_error('Не удалось привязаться к %s:%d - %s' % [address, port, error_string(bind_result)])
|
||||
_log_error('Не удалось привязаться к %s:%d - %s' % [address, port, error_string(bind_result)])
|
||||
return false
|
||||
|
||||
print('Успешно привязано к %s:%d' % [address, port])
|
||||
_log_info('Успешно привязано к %s:%d' % [address, port])
|
||||
return true
|
||||
|
||||
|
||||
@@ -138,27 +154,28 @@ func add_timers_to_scene(parent: Node) -> void:
|
||||
if not _timer.get_parent():
|
||||
parent.add_child(_timer)
|
||||
elif _timer.get_parent() != parent:
|
||||
push_warning('Таймер broadcast уже добавлен в другую сцену')
|
||||
_log_warning('Таймер broadcast уже добавлен в другую сцену')
|
||||
else:
|
||||
_log_debug("Таймеры добавлены в сцену")
|
||||
|
||||
|
||||
func start_broadcast() -> void:
|
||||
'''Запуск широковещательной рассылки и опроса сокета'''
|
||||
_timer.start()
|
||||
print('Широковещательная рассылка запущена')
|
||||
_log_info('Широковещательная рассылка запущена')
|
||||
|
||||
|
||||
func stop_broadcast() -> void:
|
||||
'''Остановка широковещательной рассылки'''
|
||||
_timer.stop()
|
||||
#_poll_timer.stop()
|
||||
print('Широковещательная рассылка остановлена')
|
||||
_log_info('Широковещательная рассылка остановлена')
|
||||
|
||||
|
||||
func close_udp_unit() -> void:
|
||||
'''Закрытие UDP соединения'''
|
||||
stop_broadcast()
|
||||
_socket.close()
|
||||
print('UDP соединение закрыто')
|
||||
_log_info('UDP соединение закрыто')
|
||||
|
||||
|
||||
#region Публичные методы для управления состоянием
|
||||
@@ -167,7 +184,7 @@ func _handle_set_flag_ems_g(set_flag: bool)->void:
|
||||
var current_status = get_sockets_status()
|
||||
if set_flag:
|
||||
current_status = current_status | (1 << 4)
|
||||
print('Установлен флаг загрузки EMS_G)')
|
||||
_log_info('Установлен флаг загрузки EMS-G')
|
||||
set_sockets_status(current_status)
|
||||
|
||||
|
||||
@@ -175,6 +192,7 @@ func set_sockets_status(status: int) -> void:
|
||||
'''Установка статуса сокетов'''
|
||||
_sockets_status_bit = status
|
||||
emit_signal('update_socket_status', _sockets_status_bit, _self_name)
|
||||
_log_debug("Статус сокетов обновлен: 0x%02X" % status)
|
||||
|
||||
|
||||
func get_sockets_status() -> int:
|
||||
@@ -185,6 +203,7 @@ func get_sockets_status() -> int:
|
||||
func set_dkm_status(status: int) -> void:
|
||||
'''Установка статуса DKM'''
|
||||
_dkm_status_bit = status
|
||||
_log_debug("Статус DKM установлен: 0x%02X" % status)
|
||||
|
||||
|
||||
func get_dkm_status() -> int:
|
||||
@@ -195,6 +214,7 @@ func get_dkm_status() -> int:
|
||||
func set_ip_status(status: int)->void:
|
||||
'''Установка статуса ИП'''
|
||||
_dry_contact_status_bit = status
|
||||
_log_debug("Статус ИП установлен: 0x%02X" % status)
|
||||
|
||||
|
||||
func get_ip_status()->int:
|
||||
@@ -208,16 +228,18 @@ func set_ems_g_status(in_imp: int, in_const: int, out_imp: int, out_const: int)
|
||||
_input_const = in_const
|
||||
_output_impulse = out_imp
|
||||
_output_const = out_const
|
||||
_log_debug("Статус EMS-G обновлен: IN_C=0x%04X, IN_I=0x%04X, OUT_C=0x%04X, OUT_I=0x%04X" % [in_const, in_imp, out_const, out_imp])
|
||||
|
||||
|
||||
func set_isa_port(port_addr: int, value: int) -> bool:
|
||||
'''Установка значения ISA порта'''
|
||||
if port_addr < 0 or port_addr > 0xFFFF:
|
||||
push_error('Некорректный адрес порта: 0x%03X' % port_addr)
|
||||
_log_error('Некорректный адрес порта: 0x%03X' % port_addr)
|
||||
return false
|
||||
|
||||
_isa_ports[port_addr] = value
|
||||
emit_signal('update_isa_ports', _isa_ports, _self_name)
|
||||
_log_debug("Порт ISA 0x%04X установлен: 0x%04X" % [port_addr, value])
|
||||
return true
|
||||
|
||||
|
||||
@@ -234,7 +256,7 @@ func read_isa_ports(port_addresses: Array) -> Dictionary:
|
||||
if port_addr is int and port_addr >= 0 and port_addr <= 0xFFFF:
|
||||
result[port_addr] = get_isa_port(port_addr)
|
||||
else:
|
||||
push_error('UDPBroadcast: Некорректный адрес порта: ' + str(port_addr))
|
||||
_log_error('Некорректный адрес порта: ' + str(port_addr))
|
||||
|
||||
return result
|
||||
|
||||
@@ -264,7 +286,7 @@ func send_broadcast() -> bool:
|
||||
if send_result == OK:
|
||||
return true
|
||||
else:
|
||||
push_error('Ошибка отправки широковещательного пакета')
|
||||
_log_error('Ошибка отправки широковещательного пакета')
|
||||
return false
|
||||
|
||||
|
||||
@@ -389,9 +411,9 @@ func _send_immediate_response(address: String, port: int) -> void:
|
||||
_socket.set_broadcast_enabled(true) # Включаем обратно для broadcast
|
||||
|
||||
if send_result == OK:
|
||||
print('Отправлен немедленный ответ на %s:%d' % [address, port])
|
||||
_log_debug('Отправлен немедленный ответ на %s:%d' % [address, port])
|
||||
else:
|
||||
push_error('Ошибка отправки ответа на %s:%d' % [address, port])
|
||||
_log_error('Ошибка отправки ответа на %s:%d' % [address, port])
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -412,7 +434,7 @@ func _handle_received_data(data: PackedByteArray, address: String, port: int) ->
|
||||
func _validate_received_packet(data: PackedByteArray) -> bool:
|
||||
'''Валидация входящего пакета'''
|
||||
if data.size() < MIN_PACKET_SIZE:
|
||||
push_warning('Получен слишком короткий пакет: %d байт' % data.size())
|
||||
_log_warning('Получен слишком короткий пакет: %d байт' % data.size())
|
||||
return false
|
||||
return true
|
||||
|
||||
@@ -435,7 +457,7 @@ func _handle_isa_command(command_code: int, data: PackedByteArray, address: Stri
|
||||
CMD_FLAG_EMS_G:
|
||||
_handle_set_flag_ems_g(true)
|
||||
_:
|
||||
push_warning('Неизвестная команда ISA: %d от %s:%d' % [command_code, address, port])
|
||||
_log_warning('Неизвестная команда ISA: %d от %s:%d' % [command_code, address, port])
|
||||
|
||||
|
||||
func _handle_read_isa_command(data: PackedByteArray, address: String, port: int) -> void:
|
||||
@@ -445,7 +467,7 @@ func _handle_read_isa_command(data: PackedByteArray, address: String, port: int)
|
||||
return
|
||||
|
||||
var port_data = _get_isa_ports_data(ports)
|
||||
print('Принята команда на чтение ISA портов от %s:%d: %s' % [address, port, port_data])
|
||||
_log_info('Принята команда на чтение ISA портов от %s:%d: %s' % [address, port, port_data])
|
||||
_written_isa_ports = []
|
||||
for i in range(ports.size()):
|
||||
_written_isa_ports.append([ports[i], port_data[i]])
|
||||
@@ -459,7 +481,7 @@ func _handle_write_isa_command(data: PackedByteArray, address: String, port: int
|
||||
var ports = _parse_command_ports(data)
|
||||
var data_to_write = _parse_command_ports_data(data)
|
||||
if ports.size() != data_to_write.size():
|
||||
push_warning('Несоответствие размеров портов и данных от %s:%d' % [address, port])
|
||||
_log_warning('Несоответствие размеров портов и данных от %s:%d' % [address, port])
|
||||
return
|
||||
|
||||
# Обновляем или добавляем записанные порты
|
||||
@@ -479,7 +501,7 @@ func _handle_write_isa_command(data: PackedByteArray, address: String, port: int
|
||||
if not found:
|
||||
_written_isa_ports.append([port_addr, value]) # Добавляем новый порт
|
||||
|
||||
print('Принята команда на запись в ISA порты от %s:%d: %s' % [address, port, _isa_ports])
|
||||
_log_info('Принята команда на запись в ISA порты от %s:%d: %s' % [address, port, _isa_ports])
|
||||
# Немедленная отправка ответа отправителю
|
||||
_send_immediate_response(address, port)
|
||||
#endregion
|
||||
@@ -524,7 +546,7 @@ func _parse_command_ports_data(data: PackedByteArray) -> Array:
|
||||
var port = data.decode_u16(8 + i * 4)
|
||||
var port_data = data.decode_u16(data_offset + i * 4)
|
||||
ports_data.append(port_data)
|
||||
print('Данные порта 0x%02X: 0x%02X' % [port, port_data])
|
||||
_log_debug('Данные порта 0x%02X: 0x%02X' % [port, port_data])
|
||||
return ports_data
|
||||
|
||||
|
||||
@@ -544,6 +566,38 @@ func _set_isa_ports_data(ports: Array, data: Array) -> void:
|
||||
|
||||
#endregion
|
||||
|
||||
#region Методы логирования
|
||||
|
||||
func _log_info(message: String) -> void:
|
||||
'''Логирование информационного сообщения'''
|
||||
if logs_manager:
|
||||
logs_manager.info("[%s] %s" % [_self_name, message])
|
||||
else:
|
||||
print("[%s] INFO: %s" % [_self_name, message])
|
||||
|
||||
func _log_warning(message: String) -> void:
|
||||
'''Логирование предупреждения'''
|
||||
if logs_manager:
|
||||
logs_manager.warning("[%s] %s" % [_self_name, message])
|
||||
else:
|
||||
print("[%s] WARNING: %s" % [_self_name, message])
|
||||
|
||||
func _log_error(message: String) -> void:
|
||||
'''Логирование ошибки'''
|
||||
if logs_manager:
|
||||
logs_manager.error("[%s] %s" % [_self_name, message])
|
||||
else:
|
||||
print("[%s] ERROR: %s" % [_self_name, message])
|
||||
|
||||
func _log_debug(message: String) -> void:
|
||||
'''Логирование отладочной информации'''
|
||||
if logs_manager:
|
||||
logs_manager.debug("[%s] %s" % [_self_name, message])
|
||||
else:
|
||||
print("[%s] DEBUG: %s" % [_self_name, message])
|
||||
|
||||
#endregion
|
||||
|
||||
#region Вложенный класс SocketUDP
|
||||
|
||||
class SocketUDP extends PacketPeerUDP:
|
||||
@@ -566,7 +620,7 @@ class SocketUDP extends PacketPeerUDP:
|
||||
func clear_written_ports() -> void:
|
||||
'''Очистка списка записанных портов (ручное управление)'''
|
||||
_written_isa_ports.clear()
|
||||
print('Список записанных портов очищен')
|
||||
_log_info('Список записанных портов очищен')
|
||||
|
||||
func get_written_ports_count() -> int:
|
||||
'''Получение количества записанных портов'''
|
||||
@@ -577,7 +631,7 @@ func remove_written_port(port_addr: int) -> bool:
|
||||
for i in range(_written_isa_ports.size()):
|
||||
if _written_isa_ports[i][0] == port_addr:
|
||||
_written_isa_ports.remove_at(i)
|
||||
print('Порт 0x%04X удален из списка записанных' % port_addr)
|
||||
_log_info('Порт 0x%04X удален из списка записанных' % port_addr)
|
||||
return true
|
||||
return false
|
||||
|
||||
|
||||
88
журнал.gd
Normal file
88
журнал.gd
Normal file
@@ -0,0 +1,88 @@
|
||||
class_name LogsRich
|
||||
extends RichTextLabel
|
||||
|
||||
enum LogLevel {
|
||||
INFO,
|
||||
WARNING,
|
||||
ERROR,
|
||||
DEBUG
|
||||
}
|
||||
|
||||
var _level_colors: Dictionary = {
|
||||
LogLevel.INFO: Color.WHITE,
|
||||
LogLevel.WARNING: Color.YELLOW,
|
||||
LogLevel.ERROR: Color.RED,
|
||||
LogLevel.DEBUG: Color.CYAN
|
||||
}
|
||||
|
||||
var _level_prefixes: Dictionary = {
|
||||
LogLevel.INFO: "[INFO]",
|
||||
LogLevel.WARNING: "[WARNING]",
|
||||
LogLevel.ERROR: "[ERROR]",
|
||||
LogLevel.DEBUG: "[DEBUG]"
|
||||
}
|
||||
|
||||
var max_lines: int = 1000
|
||||
|
||||
func _ready():
|
||||
scroll_active = true
|
||||
#scroll_following = true
|
||||
bbcode_enabled = true
|
||||
fit_content = false
|
||||
clear_logs()
|
||||
|
||||
|
||||
func add_log(message: String, level: LogLevel = LogLevel.INFO) -> void:
|
||||
if not is_inside_tree():
|
||||
push_warning("LogsRich не добавлен в дерево сцены!")
|
||||
return
|
||||
|
||||
var timestamp = Time.get_time_string_from_system()
|
||||
var prefix = _level_prefixes.get(level, "[INFO]")
|
||||
var color = _level_colors.get(level, Color.WHITE)
|
||||
|
||||
var formatted_message = "[%s] %s %s" % [timestamp, prefix, message]
|
||||
var color_hex = color.to_html(false)
|
||||
|
||||
# Просто добавляем текст (RichTextLabel сам обрабатывает BBcode)
|
||||
append_text("[color=#%s]%s[/color]\n" % [color_hex, formatted_message])
|
||||
|
||||
# Прокручиваем вниз
|
||||
if is_inside_tree():
|
||||
scroll_to_line(get_line_count())
|
||||
|
||||
# Ограничиваем количество строк
|
||||
limit_line_count_simple()
|
||||
|
||||
func info(message: String) -> void:
|
||||
add_log(message, LogLevel.INFO)
|
||||
|
||||
func warning(message: String) -> void:
|
||||
add_log(message, LogLevel.WARNING)
|
||||
|
||||
func error(message: String) -> void:
|
||||
add_log(message, LogLevel.ERROR)
|
||||
|
||||
func debug(message: String) -> void:
|
||||
add_log(message, LogLevel.DEBUG)
|
||||
|
||||
func clear_logs() -> void:
|
||||
text = ""
|
||||
|
||||
func limit_line_count_simple() -> void:
|
||||
var lines = get_line_count()
|
||||
if lines > max_lines:
|
||||
# Получаем чистый текст без BBcode
|
||||
var raw_text = get_parsed_text()
|
||||
var text_lines = raw_text.split("\n")
|
||||
|
||||
if text_lines.size() > max_lines:
|
||||
# Удаляем первые строки
|
||||
text_lines = text_lines.slice(text_lines.size() - max_lines)
|
||||
|
||||
# Очищаем и перезаписываем
|
||||
clear_logs()
|
||||
for line in text_lines:
|
||||
if line.strip_edges().length() > 0:
|
||||
# Добавляем как INFO (теряем цвета, но это проще)
|
||||
append_text("[color=#ffffff]%s[/color]\n" % line)
|
||||
1
журнал.gd.uid
Normal file
1
журнал.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://bwll70u61ocw6
|
||||
Reference in New Issue
Block a user