Files
PRD_TU_MP550/scripts/network.gd

233 lines
8.6 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

extends Node
# ЯУ-07 Блок
var unit = Yau07.YaU07.new('ЯУ-07Б')
var soc_unicast: Socket
var soc_brodcast: Socket
var ip_address_yau: String = Constants.ADDRESSES[0][1]
var ip_port_yau: int = Constants.ADDRESSES[0][2]
var timeout: float = 10.0
var last_update_time_yau07: float = 0.0
var last_update_time_fs: float = 0.0
var broadcast_packet: PackedByteArray
var state = Constants.STATE.WAIT
var send_array: Array = []
# ФС Блок
const ClientFs = preload("res://scripts/FS.gd")
var unit_fs_1: Node = ClientFs.ClientFs.new('FS1')
var unit_fs_2: Node = ClientFs.ClientFs.new('FS2')
var unit_fs_3: Node = ClientFs.ClientFs.new('FS3')
# Яу-07Б
signal yau_status_line(status, addr) ## Вызывается когда меняется состояние связи с ячейкой
signal yau_receive(data_from_yau)
signal yau_feedback_receive(data_from_yau)
signal yau_read_isa(unit_isa_ports)
# ФС модуль
signal data_from_fs_1(data:PackedByteArray)
signal data_from_fs_2(data:PackedByteArray)
signal data_from_fs_3(data:PackedByteArray)
signal port_fs_opened(port_name: String)
signal port_fs_closed(port_name: String)
signal port_error(error_str: String)
## Класс для отправки данных в сокет
class Socket extends PacketPeerUDP:
func send_to(addr: String, port: int, data: PackedByteArray):
self.set_dest_address(addr, port)
var _rc = self.put_packet(data)
func poll_receive_yau07(sock: Socket) -> bool: ## Приёмник
if timeout - last_update_time_yau07 > 0:
while sock.get_available_packet_count() > 0:
broadcast_packet = sock.get_packet()
var addr_receive = sock.get_packet_ip()
var port_receive = sock.get_packet_port()
print('addr_receive: ', addr_receive)
if (ip_address_yau == addr_receive) and (ip_port_yau == port_receive):
last_update_time_yau07 = 0.0
unit.parse(broadcast_packet)
var data_from_yau_07 = unit.status
emit_signal('yau_receive', data_from_yau_07)
if sock == soc_unicast:
emit_signal('yau_feedback_receive', data_from_yau_07)
emit_signal('yau_status_line', addr_receive)
else:
if sock.get_available_packet_count():
last_update_time_yau07 = 0.0
else:
emit_signal('yau_status_line', '')
return false
func _ready() -> void:
# Привязка для принятия широковещательного канала
soc_brodcast = Socket.new()
var rc = soc_brodcast.bind(Constants.BROADCAST_PORT, '*')
if rc != OK:
print_debug('Ошибка: Неудачная привязка широковещательного адреса')
soc_unicast = Socket.new()
rc = soc_unicast.bind(Constants.UNICAST_PORT, Constants.UNICAST_ADDRESS)
if rc != OK:
print_debug('Ошибка: неудачная привязка адреса: ', Constants.UNICAST_ADDRESS)
unit.connect('line_changed', Callable(self, '_on_connect_change'))
add_child(unit_fs_1)
add_child(unit_fs_2)
add_child(unit_fs_3)
## Настройка при старте программы
set_config()
func set_config():
write_port_isa(Constants.BASE_PORTS.EMS_G+2, Constants.META.CI_2_B_UF)
read_port_isa([Constants.BASE_PORTS.EMS_G+8])
write_port_isa(Constants.BASE_PORTS.EMS_G+2, Constants.META.CI_3_B_UF)
read_port_isa([Constants.BASE_PORTS.EMS_G+8])
write_port_isa(Constants.BASE_PORTS.EMS_G+2, Constants.META.MODUL_UM_2)
read_port_isa([Constants.BASE_PORTS.EMS_G+8])
write_port_isa(Constants.BASE_PORTS.EMS_G+2, Constants.META.MODUL_UM_3)
read_port_isa([Constants.BASE_PORTS.EMS_G+8])
write_port_isa(Constants.BASE_PORTS.EMS_G+2, Constants.META.FGOZ_3)
read_port_isa([Constants.BASE_PORTS.EMS_G+8, Constants.BASE_PORTS.UG+6, Constants.BASE_PORTS.UG+8])
func _process(delta: float) -> void:
last_update_time_yau07 += delta
last_update_time_fs += delta
poll_receive_yau07(soc_brodcast)
poll_receive_yau07(soc_unicast)
state_machine_yau07()
var rc = unit.process(delta)
if rc == Error.OK:
soc_unicast.send_to(ip_address_yau, ip_port_yau, unit.tx_data.slice(0, unit.tx_len))
#Error.FAILED: print_debug('Ошибка отправки данных')
func state_machine_yau07():
var fl_done = (unit.cmd_state == unit.CmdState.DONE or unit.cmd_state == unit.CmdState.FAIL)
## Режим ожидания
match state:
Constants.STATE.WAIT:
if fl_done and send_array.size():
state = Constants.STATE.READ_ISA if send_array[0][0] == 'rd' else Constants.STATE.WRITE_ISA
## Режим чтения из ИСА
Constants.STATE.READ_ISA:
if fl_done:
var ports_read = send_array.pop_front()
var _rc = unit.send_isa(unit.CmdCode.READ_ISA, ports_read[1])
state = Constants.STATE.DONE
## Режим записи в ИСА
Constants.STATE.WRITE_ISA:
if fl_done:
var ports_write: Array = send_array.pop_front()
if ports_write[0] == 'wr':
var key = ports_write[1].keys()
var _rc = unit.send_isa(unit.CmdCode.WRITE_ISA, [key[0], ports_write[1][key[0]]])
state = Constants.STATE.WAIT
Constants.STATE.DONE:
if fl_done:
emit_signal('yau_read_isa', unit.isa_ports)
state = Constants.STATE.WAIT
# Записать команду в ИСА
func read_port_isa(read_ports: Array) -> void:
send_array.append(['rd', read_ports])
# Прочитать данные из порта от ИСА
func write_port_isa(port_isa: int, data_isa: int) -> void:
var write_data: Dictionary = {port_isa: data_isa}
send_array.append(['wr', write_data])
## Изменения состояния соединения с ячейкой ЯУ-07Б
func _on_connect_change(unit_state_connect) -> void:
print_debug("%s" % unit_state_connect)
func on_command_change_device(meta_device: Array):
send_array = []
ip_address_yau = meta_device[0]
ip_port_yau = meta_device[1]
if unit_fs_1._stream:
unit_fs_1.disconnect_fs()
unit_fs_1.connect_to_host(meta_device[3], Constants.PORT_FS)
if unit_fs_2._stream:
unit_fs_2.disconnect_fs()
unit_fs_2.connect_to_host(meta_device[4], Constants.PORT_FS)
if meta_device[5] != '':
if unit_fs_3._stream:
unit_fs_3.disconnect_fs()
unit_fs_3.connect_to_host(meta_device[5], Constants.PORT_FS)
await get_tree().create_timer(0.1).timeout
setup_fs(unit_fs_1, meta_device)
setup_fs(unit_fs_2, meta_device)
if meta_device[5] != '':
setup_fs(unit_fs_3, meta_device)
func setup_fs(unit_fs: Node, meta_device: Array) -> void:
var mode_prd = meta_device[2]
var device: String
var freq: int
var att: float
match mode_prd:
Constants.MODE.PRD_H:
device = _find_device_address(meta_device[0], 0, 4)
freq = Constants.FS_FREQ.f2 if unit_fs == Network.unit_fs_1 else Constants.FS_FREQ.f3
att = _get_att_value(device, unit_fs == Network.unit_fs_1)
Constants.MODE.PRD_B:
device = _find_device_address(meta_device[0], 4, 8)
freq = Constants.FS_FREQ.f4 if unit_fs == Network.unit_fs_1 else Constants.FS_FREQ.f5
att = _get_att_value(device, unit_fs == Network.unit_fs_1)
Constants.MODE.PRD_K:
device = _find_device_address(meta_device[0], 8, 12)
freq = Constants.FS_FREQ.f6 if unit_fs == Network.unit_fs_1 else Constants.FS_FREQ.f7
att = _get_att_value(device, unit_fs == Network.unit_fs_1)
if not unit_fs.online:
return
_setup_fs_device(unit_fs, freq, att)
func _find_device_address(address: String, start_idx: int, end_idx: int) -> String:
for i_dev in range(start_idx, end_idx):
if address == Constants.ADDRESSES[i_dev][1]:
return Constants.ADDRESSES[i_dev][0]
return ""
func _get_att_value(device: String, is_unit_fs1: bool) -> float:
return Constants.FS_ATT[device][0] if is_unit_fs1 else Constants.FS_ATT[device][1]
# Асинхронная настройка модуля
func _setup_fs_device(unit_fs: Node, freq: int, att: float) -> void:
unit_fs.set_gen_state(false)
unit_fs.get_gen_state()
unit_fs.set_gen_state(true)
unit_fs.set_carrier(freq * 1_000_000)
unit_fs.set_att_batch(att)
unit_fs.get_carrier()
unit_fs.get_att_batch()
unit_fs.get_base_current_temp()
unit_fs.get_base_can_macro()
unit_fs.status_can_macro_exec(true)
unit_fs.get_gen_state()