diff --git a/scenes/контроль/элемент-я.gd b/scenes/контроль/элемент-я.gd new file mode 100644 index 0000000..fd6a944 --- /dev/null +++ b/scenes/контроль/элемент-я.gd @@ -0,0 +1,70 @@ +extends Control + +@export var textures: Array +@export var unit_name: String = '' + + +enum STATE_VAL { + NONE = 0, + GOOD = 1, + ERROR = 2 } + + +signal pressed(control: PanelContainer) + + +func _on_button_pressed(): + emit_signal('pressed', self) + + +@export var state: int: + set(v): + state = tools.clip_value(v, 0, textures.size() - 1) + if is_inside_tree(): + $margin/vbox/grid/state.texture = textures[v] + + +@export var fname: String: + set(v): + fname = v + if is_inside_tree(): + $margin/vbox/grid/fname.text = v + + +@export var rname: String: + set(v): + rname = v + if is_inside_tree(): + $margin/vbox/grid/rname.text = v + + +@export var alignment: int: + set(v): + if is_inside_tree(): + $margin/vbox.alignment = v + + +func _ready() -> void: call_deferred('_on_resized') + + +func _on_resized() -> void: + $rect.size = size + $margin.size = size + + +func _enter_tree() -> void: + if Engine.is_editor_hint(): return + var unit_any = network.get_unit_instance(unit_name) + unit_any.connect('data_received', Callable(self, 'on_data_received')) + unit_any.connect('line_changed', Callable(self, 'on_line_changed')) + $margin/vbox.alignment = alignment + $margin/vbox/grid/fname.text = fname + $margin/vbox/grid/rname.text = rname + $margin/vbox/grid/state.texture = textures[state] + + +func _exit_tree() -> void: + if Engine.is_editor_hint(): return + var unit_any = network.get_unit_instance(unit_name) + unit_any.disconnect('data_received', Callable(self, 'on_data_received')) + unit_any.disconnect('line_changed', Callable(self, 'on_line_changed')) diff --git a/scenes/контроль/элемент-я.gd.uid b/scenes/контроль/элемент-я.gd.uid new file mode 100644 index 0000000..aeb87e0 --- /dev/null +++ b/scenes/контроль/элемент-я.gd.uid @@ -0,0 +1 @@ +uid://blnakmwyvinxm diff --git a/scenes/контроль/элемент-я.tscn b/scenes/контроль/элемент-я.tscn index 45f5c62..5f9719b 100644 --- a/scenes/контроль/элемент-я.tscn +++ b/scenes/контроль/элемент-я.tscn @@ -1,83 +1,11 @@ [gd_scene load_steps=12 format=3 uid="uid://btpc78gucr57f"] +[ext_resource type="Script" uid="uid://blnakmwyvinxm" path="res://scenes/контроль/элемент-я.gd" id="1_ajips"] [ext_resource type="Texture2D" uid="uid://c6nve6f8sfyj2" path="res://data/состояние-исправности-0.png" id="3_dktys"] [ext_resource type="Texture2D" uid="uid://dnreyfh3cd1k2" path="res://data/состояние-исправности-1.png" id="3_t4y6r"] [ext_resource type="Texture2D" uid="uid://c6booa8753u5t" path="res://data/состояние-исправности-2.png" id="4_bdhnj"] [ext_resource type="Texture2D" uid="uid://c4mdrmk7h638f" path="res://data/nine-patch-round.png" id="4_or1kj"] -[sub_resource type="GDScript" id="GDScript_rmhe2"] -script/source = "extends Control - -@export var textures: Array -@export var unit_name: String = '' - - -enum STATE_VAL { - NONE = 0, - GOOD = 1, - ERROR = 2 } - - -signal pressed(control: PanelContainer) - - -func _on_button_pressed(): - emit_signal('pressed', self) - - -@export var state: int: - set(v): - state = tools.clip_value(v, 0, textures.size() - 1) - if is_inside_tree(): - $margin/vbox/grid/state.texture = textures[v] - - -@export var fname: String: - set(v): - fname = v - if is_inside_tree(): - $margin/vbox/grid/fname.text = v - - -@export var rname: String: - set(v): - rname = v - if is_inside_tree(): - $margin/vbox/grid/rname.text = v - - -@export var alignment: int: - set(v): - if is_inside_tree(): - $margin/vbox.alignment = v - - -func _ready() -> void: call_deferred('_on_resized') - - -func _on_resized() -> void: - $rect.size = size - $margin.size = size - - -func _enter_tree() -> void: - if Engine.is_editor_hint(): return - var unit_any = network.get_unit_instance(unit_name) - unit_any.connect('data_received', Callable(self, 'on_data_received')) - unit_any.connect('line_changed', Callable(self, 'on_line_changed')) - $margin/vbox.alignment = alignment - $margin/vbox/grid/fname.text = fname - $margin/vbox/grid/rname.text = rname - $margin/vbox/grid/state.texture = textures[state] - - -func _exit_tree() -> void: - if Engine.is_editor_hint(): return - var unit_any = network.get_unit_instance(unit_name) - unit_any.disconnect('data_received', Callable(self, 'on_data_received')) - unit_any.disconnect('line_changed', Callable(self, 'on_line_changed')) -" - [sub_resource type="GDScript" id="GDScript_45hqb"] script/source = "@tool @@ -120,7 +48,7 @@ layout_mode = 3 anchors_preset = 0 offset_right = 180.0 offset_bottom = 155.0 -script = SubResource("GDScript_rmhe2") +script = ExtResource("1_ajips") textures = [ExtResource("3_dktys"), ExtResource("3_t4y6r"), ExtResource("4_bdhnj")] [node name="rect" type="NinePatchRect" parent="."] diff --git a/scripts/network.gd b/scripts/network.gd index 3104223..9d9cd46 100644 --- a/scripts/network.gd +++ b/scripts/network.gd @@ -12,17 +12,17 @@ var tick: int = 0 class Spt25Serial extends SerialPort: func send_to(data: PackedByteArray): - tools.allways(data.size() >= 2, 'длина буфера меньше необходимого') + tools.allways(data.size() >= 3, 'длина буфера меньше необходимого') var i_sum: = data.size() - 3 - var csd: = data.slice(0, i_sum) - var v_sum: = get_check_sum(csd) + data.encode_u16(i_sum, 0) + var v_sum: = get_check_sum(data) data.encode_u16(i_sum, v_sum) - return write_raw(data) + write_raw(data) func _to_string() -> String: return 'последовательный порт \"%s\" @ %d (%s)' % [self.port, self.baudrate, 'открыт' if is_open() else 'закрыт'] func get_check_sum(src: PackedByteArray) -> int: - var P_DIV: = 0xF0B8 + var P_DIV: = 0xf0b8 var FCS = ~((src[2]<<8) + src[1]) for i in range(3, src.size()): var C = src[i] diff --git a/scripts/spt25.gd b/scripts/spt25.gd index 965445b..002e5e9 100644 --- a/scripts/spt25.gd +++ b/scripts/spt25.gd @@ -15,15 +15,16 @@ class SPT25 extends unit.Unit: func _init(nm) -> void: self.name = nm - tx_data.resize(8) + tx_data.resize(9) tx_data[0] = 0x7e # Флаги синхронизации пакета tx_data[1] = 0 # Адрес абонента, которому предназначен пакет tx_data[2] = CmdCode.INFO # Тип пакета, КОД КОМАНДЫ - Получить информацию о состоянии преобразователя tx_data[3] = 0 # Данные tx_data[4] = 0 # Данные tx_data[5] = 0 # Данные - tx_data[6] = 0 # Контрольная сумма - tx_data[7] = 0x7e # Флаги синхронизации пакета + tx_data[6] = 0 # Контрольная сумма мл. байт + tx_data[7] = 0 # Контрольная сумма ст. байт + tx_data[8] = 0x7e # Флаги синхронизации пакета func parse(rx_data: PackedByteArray, tick: int):