From fa436b18505f1165ea4a42535151efc8847a3fad Mon Sep 17 00:00:00 2001 From: sasha80 Date: Sat, 2 Nov 2024 11:57:39 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0.=20=D0=9E=D1=82=D0=BE=D0=B1=D1=80=D0=B0=D0=B6?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=81=D0=BE=D1=81=D1=82=D0=BE=D1=8F?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=A93=20(=D0=A9-3)=20=D0=B2=20=D1=80?= =?UTF-8?q?=D0=B5=D0=B6=D0=B8=D0=BC=D0=B5=20=D0=9A=D0=BE=D0=BD=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=BB=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/pribor-uyep/pribor-uyep.tscn | 2 +- scenes/pribor-uyep/sch3-view.gd | 35 ++++++++++++++++++++++++----- scenes/pribor-uyep/spt25-view.gd | 6 ++--- scenes/контроль/элемент-я.gd | 2 +- scripts/sch3.gd | 24 ++++++++++++-------- scripts/spt25.gd | 8 +++---- scripts/tcp5p28.gd | 1 - scripts/unit.gd | 6 +++-- 8 files changed, 56 insertions(+), 28 deletions(-) diff --git a/scenes/pribor-uyep/pribor-uyep.tscn b/scenes/pribor-uyep/pribor-uyep.tscn index 92f1e02..499b0c4 100644 --- a/scenes/pribor-uyep/pribor-uyep.tscn +++ b/scenes/pribor-uyep/pribor-uyep.tscn @@ -117,7 +117,7 @@ offset_top = 275.0 offset_right = 225.0 offset_bottom = 367.0 -[node name="sch3" parent="." groups=["bit_items"] instance=ExtResource("7_13r50")] +[node name="sch3" parent="." instance=ExtResource("7_13r50")] offset_left = 175.0 offset_top = 714.0 offset_right = 680.0 diff --git a/scenes/pribor-uyep/sch3-view.gd b/scenes/pribor-uyep/sch3-view.gd index 2c9a55c..7e83aa2 100644 --- a/scenes/pribor-uyep/sch3-view.gd +++ b/scenes/pribor-uyep/sch3-view.gd @@ -3,14 +3,35 @@ extends "res://scenes/контроль/элемент-я.gd" +func on_data_received(data): pass + + +func _enter_tree() -> void: + if Engine.is_editor_hint(): return + var unit_key = settings.get_unit_key(unit_name) + var unit = network.units[unit_key] + unit.connect('responce_received', Callable(self, 'on_responce_received')) + + +func _exit_tree() -> void: + if Engine.is_editor_hint(): return + var unit_key = settings.get_unit_key(unit_name) + var unit = network.units[unit_key] + unit.disconnect('responce_received', Callable(self, 'responce_received')) + + func on_line_changed(_unit): - var items = get_tree().get_nodes_in_group('bit_items') - for item in items: - item.texture = textures[STATE_VAL.NONE] - - -func on_data_received(data: PackedByteArray): var items = get_tree().get_nodes_in_group('bits_items') + for item in items: + item.texture = textures[STATE_VAL.ERROR] + + +func on_responce_received(addr: int, data: PackedByteArray): + print_debug([addr, data]) + if (addr != 0) or (data.size() != 4): + return + var items = get_tree().get_nodes_in_group('bits_items') + var cnt_good: int = 0 for item in items: var bits: Array = item.get_meta('bits') var byte0: int = bits[0] @@ -21,4 +42,6 @@ func on_data_received(data: PackedByteArray): if (data[byte0] & (1 << bit0)) \ == (data[byte1] & (1 << bit1)) \ else STATE_VAL.ERROR + cnt_good += int(v == STATE_VAL.GOOD) item.texture = textures[v] + state = STATE_VAL.GOOD if cnt_good == items.size() else STATE_VAL.ERROR diff --git a/scenes/pribor-uyep/spt25-view.gd b/scenes/pribor-uyep/spt25-view.gd index 53be483..797b1cb 100644 --- a/scenes/pribor-uyep/spt25-view.gd +++ b/scenes/pribor-uyep/spt25-view.gd @@ -19,10 +19,8 @@ func on_line_changed(unit): $block_input2.state2 = STATE_VAL.NONE -func on_data_received(data: PackedByteArray, unit): - if data.size() <= 6: - push_error('ошибка: неверная длина данных %d байт %s' % [data.size(), unit]) - return +func on_data_received(data: PackedByteArray): + # Сеть 1. Использование $block_input1.state = STATE_VAL.GOOD if data[4] & (1 << 5) else STATE_VAL.ERROR # Сеть 1. Вход diff --git a/scenes/контроль/элемент-я.gd b/scenes/контроль/элемент-я.gd index e812600..4ffdb2c 100644 --- a/scenes/контроль/элемент-я.gd +++ b/scenes/контроль/элемент-я.gd @@ -55,7 +55,7 @@ func _enter_tree() -> void: if Engine.is_editor_hint(): return var unit_key = settings.get_unit_key(unit_name) var unit = network.units[unit_key] - unit.connect('data_received', Callable(self, 'on_data_received').bind(unit)) + unit.connect('data_received', Callable(self, 'on_data_received')) unit.connect('line_changed', Callable(self, 'on_line_changed')) diff --git a/scripts/sch3.gd b/scripts/sch3.gd index a2b2e20..b301015 100644 --- a/scripts/sch3.gd +++ b/scripts/sch3.gd @@ -1,6 +1,7 @@ class_name sch_3 extends Node -const ONLINE_TIMEOUT = 5.0 ## Время ожидания пакета от ячейки, секунды. +const ONLINE_TIMEOUT: int = 5000 ## Время ожидания данных +const REQUEST_PERIOD: int = 3000 ## Переиод запроса, мс class Sch3 extends unit.Unit: @@ -29,24 +30,26 @@ class Sch3 extends unit.Unit: ## Изменяет состояние. Вызывать периодически.[br] ## [param tick] - Текущщее время в мс.[br] func process(tick: int): - if online and ((tick - tick_rx) > ONLINE_TIMEOUT): + if online and ((tick - rx_tick) > ONLINE_TIMEOUT): online = false emit_signal('line_changed', self) - if (cmd_state == CmdState.WAIT) or (cmd_state == CmdState.SEND): + if cmd_state == CmdState.WAIT: cmd_state = CmdState.FAIL emit_signal('command_fail', self) var rc = Error.ERR_BUSY - if cmd_state == CmdState.SEND: - rc = Error.OK - tick_tx = tick - cmd_state = CmdState.WAIT + if (tick - tx_tick) > REQUEST_PERIOD: + if read_input(0, 4): + tx_tick = tick + cmd_state = CmdState.WAIT + rc = Error.OK return rc + ## Производит разбор принятых данных. Вызывать при приёме данных на сокете.[br] ## [param data] - Данные принятые на сокете.[br] ## [param tick] - Текущщее время в мс.[br] func parse(data: PackedByteArray, tick: int) -> bool: - tick_rx = tick + rx_tick = tick if not online: online = true emit_signal('line_changed', self) @@ -63,15 +66,18 @@ class Sch3 extends unit.Unit: var addr = message_data[0] var regs = message_data.slice(1) emit_signal('responce_received', addr, regs) + rc = true 'info': var msg = message['data'] emit_signal('info_received', msg) 'exception': var msg = message['data'] + cmd_state = CmdState.FAIL emit_signal('except_received', msg) rc = false _: var msg: String = 'код команды \"%s\" - не распознан' % message_code + cmd_state = CmdState.FAIL emit_signal('parse_failed', msg) rc = false if (cmd_state == CmdState.WAIT) and rc: @@ -98,7 +104,7 @@ class Sch3 extends unit.Unit: ## Отправляет команду "читать регистры хранения".[br] ## [param addr] - Начальный адрес регистров.[br] ## [param count] - Количество регистров от начального адреса.[br] - func read_holdind(addr: int, count: int = 1) -> bool: + func read_holding(addr: int, count: int = 1) -> bool: if cmd_state != CmdState.DONE: return false var json_dict = {'code': 'read_holding', 'data': [addr, count]} tx_data = JSON.stringify(json_dict).to_utf8_buffer() diff --git a/scripts/spt25.gd b/scripts/spt25.gd index 9b73db4..9a93110 100644 --- a/scripts/spt25.gd +++ b/scripts/spt25.gd @@ -5,9 +5,6 @@ const REQUEST_PERIOD: int = 3000 ## Переиод запроса, мс class SPT25 extends unit.Unit: - var tx_tick: int = 0 - var rx_tick: int = 0 - var req_period = REQUEST_PERIOD func _to_string() -> String: return String('СПТ-25 %s %s' % [self.name, ['отключен', 'на связи'][int(online)]]) func _init(nm) -> void: @@ -28,12 +25,15 @@ class SPT25 extends unit.Unit: if not online: online = true emit_signal('line_changed', self) + if rx_data.size() <= 6: + emit_signal('parse_failed', self) + return emit_signal('data_received', rx_data) func process(tick: int): var rc: = Error.ERR_BUSY - if (tick - tx_tick) > req_period: + if (tick - tx_tick) > REQUEST_PERIOD: tx_tick = tick rc = Error.OK if online: diff --git a/scripts/tcp5p28.gd b/scripts/tcp5p28.gd index d590fbe..339cd71 100644 --- a/scripts/tcp5p28.gd +++ b/scripts/tcp5p28.gd @@ -44,7 +44,6 @@ class TCP5P28 extends unit.Unit: signal get_threats(unit: TCP5P28) ## Сигнал запрос целей. signal get_interfers(unit: TCP5P28) ## Запрос состояния выполнения целеуказания. - var rx_tick: = 0 ## Тик время последнего приёма, мс. var tx_stack: Array ## Массив пакетов для отправки. func _to_string() -> String: return String('капсрпб: "%s" %s ' % [self.name, ['отключен', 'на связи'][int(online)]]) diff --git a/scripts/unit.gd b/scripts/unit.gd index 03fadf2..9aeb273 100644 --- a/scripts/unit.gd +++ b/scripts/unit.gd @@ -8,8 +8,10 @@ class Unit: signal parse_failed(unit) ## Вызывается при обнаружении ошибки во входных данных signal data_received(data: PackedByteArray) ## Вызывается по приёму данных - var tx_data: = PackedByteArray() ## Буфер отправленный. - var tx_len = 0 ## Длина последнего отправленного пакета. + var tx_data: = PackedByteArray() ## Буфер отправленный. + var tx_len = 0 ## Длина последнего отправленного пакета. + var tx_tick: int = 0 + var rx_tick: int = 0 var online: bool var name: String func _init(nm) -> void: self.name = nm