From a2e5013c009a4d12ffa044031b2eb38b3e48feca Mon Sep 17 00:00:00 2001 From: sasha80 Date: Mon, 8 Sep 2025 15:27:06 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80.=20=D0=A1=D0=B5=D1=82=D0=B5=D0=B2=D0=BE=D0=B9=20=D0=BC?= =?UTF-8?q?=D0=BE=D0=B4=D1=83=D0=BB=D1=8C.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/настройки/настройки.tscn | 51 ++++++---------- scripts/capsrpb.gd | 1 + scripts/interfer.gd | 3 + scripts/network.gd | 100 ++++++++++++++++++-------------- 4 files changed, 76 insertions(+), 79 deletions(-) diff --git a/scenes/настройки/настройки.tscn b/scenes/настройки/настройки.tscn index 9d845afe..3a87ec65 100644 --- a/scenes/настройки/настройки.tscn +++ b/scenes/настройки/настройки.tscn @@ -141,30 +141,12 @@ func parse_cmd_line_args(settings_data: Dictionary): settings_data[key] = val0 -## Загружает настройки из файла -func load_settings(settings_data: Dictionary): - var settings_file = settings.get_settings_file_path() - var file = FileAccess.open(settings_file, FileAccess.READ) - var abs_path = ProjectSettings.globalize_path(settings_file) - if file: - var read = file.get_as_text() - file.close() - var json_conv = JSON.new() - if json_conv.parse(read) == OK: - settings_data.merge(json_conv.get_data()) - else: - log.warning('Не удалось разобрать \\\"%s\\\", будут использованы настройки по умолчанию' % abs_path) - else: - log.warning('Файл \\\"%s\\\" не найден, будут использованы настройки по умолчанию' % abs_path) - - func setting_tab(): $heard_table.set_header(HEADER_ROW) $heard_table.set_header_text(HEADER_ROW_TEXT) $heard_table.set_columns_min_size([600, 950]) $heard_table.set_columns_alignments(ALIGNMENT) var settings_data = {} - load_settings(settings_data) parse_cmd_line_args(settings_data) for key in settings_data: ProjectSettings.set_setting('application/config/%s' % key, settings_data[key]) @@ -211,7 +193,7 @@ func setting_tab(): profile.text = '' for val in unit_data: profile.text += str(val) + ',' - profile.text.rstrip(',') + profile.text = profile.text.trim_suffix(',') button_settings() @@ -232,25 +214,26 @@ func _on_btn_save_settings_pressed(): for i in SETTING_TABLE.size(): var parameter = SETTING_TABLE[i][0] if parameter in settings.UnitProfiles: + var ref_profile = settings.UnitProfiles[parameter][1] var profiles = $scroll_set/table.get_node2(1, i) var value = profiles.get_text() if parameter not in json_data: - json_data[parameter] = [] - if value.find(':') != -1: - var parts = value.split(':') - var ip = parts[0].strip_edges() - var ports = parts[1].split(',') - json_data[parameter].append(ip) - for port in ports: - if port == 'true': - json_data[parameter].append(true) - elif port == 'false': - json_data[parameter].append(false) + var row: = [] + for token in value.split(','): + var j: = row.size() + if token.is_valid_int(): + token = int(token) + elif token == 'false': + token = false + elif token == 'true': + token = true + if typeof(ref_profile[j]) == typeof(token): + row.append(token) else: - port = port.strip_edges() - if port.is_valid_int(): - port = int(port) - json_data[parameter].append(port) + # TODO: Это надо вывести на экран пользователю + push_error([parameter, j, type_string(typeof(ref_profile[j])), type_string(typeof(token))]) + row.append(ref_profile[j]) + json_data[parameter] = row else: var children = $scroll_set/table.get_node2(1, i).get_children() if len(children): diff --git a/scripts/capsrpb.gd b/scripts/capsrpb.gd index 7c216dbc..d889997d 100644 --- a/scripts/capsrpb.gd +++ b/scripts/capsrpb.gd @@ -14,6 +14,7 @@ class CapsRpb extends unit.Unit: var json_dic: Dictionary var tick: = 0 ## Тик время последнего обновления, мс. var tx_stack: Array ## Массив пакетов для отправки. + var source_addr: Array ## Адрес отправителя данных func _to_string() -> String: return String('CapsRpb(\"%s\")' % self.name) func _init(nm): self.name = nm diff --git a/scripts/interfer.gd b/scripts/interfer.gd index c1ca8c52..d402555b 100644 --- a/scripts/interfer.gd +++ b/scripts/interfer.gd @@ -210,6 +210,9 @@ func on_data_capsrpb_received(unit0: capsrpb.CapsRpb, ecms: Dictionary) -> void: if not (dic_msvk is Dictionary): continue if dic_msvk.has('ispp'): var ispp = int(dic_msvk['ispp']) + var errmsg = dic_msvk.get('errmsg', '') + if errmsg: + log.error('сеанс %d: \"%s\"' % [ispp, errmsg]) if ecms.has(ispp): var ecm = ecms[ispp] ecm.set_from_dic(dic_msvk) diff --git a/scripts/network.gd b/scripts/network.gd index cb0dc76a..cd55dff9 100644 --- a/scripts/network.gd +++ b/scripts/network.gd @@ -1,7 +1,7 @@ class_name Network extends Node -const UDPTX_PROTO: = {'yau07tx': yau07.YaU07} -const UDPJSON_PROTO: = {'json-capsrpb': capsrpb.CapsRpb} +const YAU07_PROTO: = {'yau07tx': yau07.YaU07} +const CAPS_PROTO: = {'json-capsrpb': capsrpb.CapsRpb} const TCP_PROTO: = {'5p28': tcp5p28.TCP5P28} const SERIAL_PROTO: = {'spt25': spt25.SPT25} const MODBUS_PROTO: = {'mbcs': sch3.Sch3} @@ -114,17 +114,15 @@ class SocketTCP extends TCPServer: var poll_sockets: Array[SocketUDP] ## Сокеты для непрерывного опроса наличия новых данных var tcp_sockets: Array[Array] ## Сокеты для TCP-соединений var units: Dictionary[StringName, unit.Unit] ## Экземпляры всех сетевых устройств -var units_udp: Dictionary[StringName, unit.Unit] ## Экземпляры устройств с udp-соединением которым нужно передавать данные +var units_udptx: Dictionary[StringName, unit.Unit] ## Экземпляры устройств с udp-соединением которым нужно передавать данные var units_udprx: Dictionary[StringName, unit.Unit] ## Экземпляры устройств с udp-соединением от которых приходят данные var units_tcp: Dictionary[StringName, unit.Unit] ## Экземпляры устройств с tcp-соединением var units_serial: Dictionary[StringName, unit.Unit] ## Экземпляры устройств с uart-соединением var units_modbus: Dictionary[StringName, unit.Unit] ## Экземпляры устройств с modbusserial-соединением -var serials: Dictionary[StringName, SocketSerial] ## Последовательные порты (uart) +var serials: Dictionary[StringName, SocketSerial] ## Последовательные порты (uart) var dst_ports: Dictionary[StringName, int] ## Преобразование имя устройства в порт назначения var dst_addrs: Dictionary[StringName, StringName] ## Преобразование имя устройства в адрес назначения -var unit_keys: Dictionary[int, StringName] ## Преобразование порта назначения в имя устройства -var sock_unicast: SocketUDP ## Сокет для приёма широковещательных сообщений от ЯУ-07 -var sock_capsrpb: SocketUDP ## Сокет для приёма сообщений от КАСПРПБ +var port_to_unit_name: Dictionary[int, StringName] ## Преобразование порта назначения в имя устройства var logger_page: Node ## Ссылка на журнал работы var send_sockets: Dictionary[StringName, SocketUDP] ## Таблица <имяустройста>: <сокет> для отправки сообщений var addr_port_to_unit_name: Dictionary[StringName, StringName] ## Преобразование адрес:порт в имя устройства @@ -136,15 +134,32 @@ func on_serial_data(data, unit): unit.parse(data, tick) ## [param unit_name] - Уникальное имя устройства[br] func create_socket_udp(unit_name: StringName) -> SocketUDP: var st = settings.UnitProfiles[unit_name][1] - var addr = st[0] - var port = st[1] + var addr = st[0] + var port = st[1] var broad = st[2] - var bind = st[3] + var bind = st[3] var sock: = SocketUDP.new() sock.set_broadcast_enabled(broad) - var rc = Error.OK if not bind else sock.bind(port, addr) - var errlevel = log.INFO if rc == Error.OK else log.ERROR - log.message(errlevel, '\"%s\" привязан к %s:%d? - %s, результат: %s' % [unit_name, addr, port, ['нет', 'да'][int(bind)], error_string(rc)]) + var rc: = sock.bind(port, addr) + if rc == Error.OK: + log.info('\"%s\" привязан к %s:%d' % [unit_name, addr, port]) + else: + var errmsg: = error_string(rc) + log.error('привязка \"%s\" к %s:%d не удалась: \"%s\"' % [unit_name, addr, port, errmsg]) + return sock + + +func create_socket_caps(unit_name: StringName) -> SocketUDP: + var st = settings.UnitProfiles[unit_name][1] + var addr = st[0] + var port0 = st[1] + var sock: = SocketUDP.new() + var rc: = sock.bind(port0, addr) + if rc == Error.OK: + log.info('\"%s\" привязан к %s:%d' % [unit_name, addr, port0]) + else: + var errmsg = error_string(rc) + log.error('привязка \"%s\" к %s:%d не удалась: \"%s\"' % [unit_name, addr, port0, errmsg]) return sock @@ -183,16 +198,14 @@ func create_modbus(unit_name: StringName) -> sch_3.Sch3: func _ready() -> void: - poll_sockets.append(create_socket_udp('уарэп-яу07-частный')) - poll_sockets.append(create_socket_udp('уарэп-яу07-общий')) - poll_sockets.append(create_socket_udp('уарэп-капсрпб')) - poll_sockets.append(create_socket_udp('навигация')) - sock_unicast = poll_sockets[0] - sock_capsrpb = poll_sockets[2] - + var sock_unicast: = create_socket_udp('уарэп-яу07-частный') + var sock_broadcast: = create_socket_udp('уарэп-яу07-общий') + var sock_navi: = create_socket_udp('навигация') + var sock_caps: = create_socket_caps('уарэп-капсрпб') + poll_sockets = [sock_unicast, sock_broadcast, sock_caps, sock_navi] send_sockets['уарэп-яу07-частный'] = sock_unicast - send_sockets['уарэп-яу07-общий'] = poll_sockets[1] - send_sockets['уарэп-капсрпб'] = sock_capsrpb + send_sockets['уарэп-яу07-общий'] = sock_broadcast + send_sockets['уарэп-капсрпб'] = sock_caps send_sockets['уарэп-эмс'] = sock_unicast send_sockets['уарэп-яу07-2в'] = sock_unicast send_sockets['уарэп-яу07-2н'] = sock_unicast @@ -220,19 +233,21 @@ func _ready() -> void: units_udprx[unit_name] = new_unit dst_ports[unit_name] = unit_profile[1] - if proto in UDPTX_PROTO: - var new_unit = UDPTX_PROTO[proto].new(unit_name) + if proto in YAU07_PROTO: + var new_unit = YAU07_PROTO[proto].new(unit_name) units[unit_name] = new_unit - units_udp[unit_name] = new_unit - dst_ports[unit_name] = unit_profile[1] + units_udptx[unit_name] = new_unit dst_addrs[unit_name] = unit_profile[0] + dst_ports[unit_name] = unit_profile[1] + var addr_port: = StringName('%s:%d' % [unit_profile[0], unit_profile[1]]) + addr_port_to_unit_name[addr_port] = unit_name - if proto in UDPJSON_PROTO: - var new_unit = UDPJSON_PROTO[proto].new(unit_name) + if proto in CAPS_PROTO: + var new_unit = CAPS_PROTO[proto].new(unit_name) units[unit_name] = new_unit - units_udp[unit_name] = new_unit - dst_ports[unit_name] = unit_profile[1] + units_udptx[unit_name] = new_unit dst_addrs[unit_name] = unit_profile[0] + dst_ports[unit_name] = unit_profile[2] if proto in TCP_PROTO: var unit_tcp = TCP_PROTO[proto].new(unit_name) @@ -259,18 +274,13 @@ func _ready() -> void: tcp_sockets.append([create_socket_tcp('уарэп-5п28'), units_tcp['уарэп-5п28']]) for key: StringName in dst_ports: - unit_keys[dst_ports[key]] = key + port_to_unit_name[dst_ports[key]] = key if logger_page: for key in units: var u = units[key] u.connect('line_changed', Callable(logger_page, 'on_line_changed')) u.connect('command_fail', Callable(logger_page, 'on_command_fail')) - for key in settings.UnitProfiles: - var item = settings.UnitProfiles[key][1] - var addr_port: = StringName('%s:%d' % [item[0], item[1]]) - addr_port_to_unit_name[addr_port] = StringName(key) - func _on_settings_changed_modbus(bind_modbuses: Array): var _external_ctl = ProjectSettings.get_setting('application/config/Внешнее управление', false) @@ -304,14 +314,14 @@ func poll_receive_udp(sock: SocketUDP) -> bool: var unit_name: = addr_port_to_unit_name[addr_port] units[unit_name].parse(data, tick) continue - if unit_keys.has(port): - var unit_name: = unit_keys[port] + if port_to_unit_name.has(port): + var unit_name: = port_to_unit_name[port] if units.has(unit_name): units[unit_name].parse(data, tick) continue var local_port: = sock.get_local_port() - if unit_keys.has(local_port): - var unit_name: = unit_keys[local_port] + if port_to_unit_name.has(local_port): + var unit_name: = port_to_unit_name[local_port] var unit_udprx: = units[unit_name] unit_udprx.source_addr = [addr, port] unit_udprx.parse(data, tick) @@ -371,11 +381,11 @@ func get_tcp_data(sock: SocketTCP, peer: StreamPeer, len_rx: int): func _process(_delta: float) -> void: tick = Time.get_ticks_msec() RenderingServer.global_shader_parameter_set('tick_curent', tick) - for unit_name: StringName in units_udp: - var unit_udp: = units_udp[unit_name] - if Error.OK == unit_udp.process(tick): - var sock: = send_sockets[unit_udp.name] - var tx_data: = unit_udp.tx_data.slice(0, unit_udp.tx_len) + for unit_name: StringName in units_udptx: + var unit_udptx: = units_udptx[unit_name] + if Error.OK == unit_udptx.process(tick): + var sock: = send_sockets[unit_name] + var tx_data: = unit_udptx.tx_data.slice(0, unit_udptx.tx_len) var dst_port: = dst_ports[unit_name] var dst_addr: = dst_addrs[unit_name] sock.send_to([dst_addr, dst_port], tx_data)