Рефактор. Сетевой модуль.
This commit is contained in:
@@ -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):
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user