Merge remote-tracking branch 'origin/master' into master-prd

This commit is contained in:
Maxim
2025-09-01 13:22:27 +03:00
20 changed files with 579 additions and 172 deletions

View File

@@ -4,22 +4,38 @@ class_name Iterfer extends Node
## Режимы помехи.
const ITERFER_MODE = {
'off': ['Откл', ['freq', 'width'], 0],
'srni1': ['СРН-И1', ['freq', 'width'], 1],
'srnm2': ['СРН-М2', ['freq', 'width'], 2],
'srngps': ['СРН-GPS', ['freq', 'width'], 3],
'lchm1': ['ЛЧМ-1', ['freq', 'width'], 10],
'lchm2': ['ЛЧМ-2', ['freq', 'width'], 16],
'mchm1': ['МЧМ-1', ['freq', 'width'], 11],
'pdm2': ['ПД-М2', ['freq', 'width'], 12],
'pdm4': ['ПД-М4', ['freq', 'width'], 13],
'pdm4s': ['ПД-М4С', ['freq', 'width'], 14],
'pdchm': ['ПД-ЧМ', ['freq', 'width'], 15],
'svi1': ['СВ-И1', ['freq', 'width'], 20],
'svm2': ['СВ-М2', ['freq', 'width'], 21],
'k1': ['K1', ['freq', 'width', 'dur', 'period'], 50],
'ozp1': ['ОЗП-1', ['freq', 'width'], 51] }
'off': ['Откл', {}, 0],
'srni1': ['СРН-И1', {}, 1],
'srnm2': ['СРН-М2', {}, 2],
'srngps': ['СРН-GPS', {}, 3],
'lchm1': ['ЛЧМ-1', {}, 10],
'lchm2': ['ЛЧМ-2', {}, 16],
'mchm1': ['МЧМ-1', {}, 11],
'pdm2': ['ПД-М2', {}, 12],
'pdm4': ['ПД-М4', {}, 13],
'pdm4s': ['ПД-М4С', {}, 14],
'pdchm': ['ПД-ЧМ', {}, 15],
'svi1': ['СВ-И1', SVI1_PARAMS, 20],
'svm2': ['СВ-М2', SVM2_PARAMS, 21],
'k1': ['K1', K1_PARAMS, 50],
'ozp1': ['ОЗП-1', OZP1_PARAMS, 51] }
const K1_PARAMS = {'files': ['K1'],
'call_proc': 'call_all_diap'}
const OZP1_PARAMS = {'files': ['OZP1'],
'call_proc': 'call_all_diap'}
# Файл : Диапазон: ['имя файла', частота]
const SVI1_PARAMS = {'files': {1: ['SVI1_LIT2', 1017],
2: ['SVI1_LIT3', 1156]},
'call_proc': 'call_diap'}
const SVM2_PARAMS = {'files': {1: ['SVM2_LIT2', 1017],
2: ['SVM2_LIT3', 1156]},
'call_proc': 'call_diap'}
const PD_CHM = {'files': {
},
'call_proc': 'call_pd_chm'}
const SOURCE_INTERFER = ['th','fs','cu']
const ID_INTERFERS_LEN = 63 ## Размер пула номеров целей.
@@ -31,6 +47,7 @@ var id_array: Array ## Массив id воздействий.
var thrs: Dictionary ## Словарь воздействия для целей, ключ - id воздействия.
var fs: Dictionary ## Словарь воздействий для секторов, ключ - id воздействия.
var cu: Dictionary ## Словарь воздействий для 5П-28, ключ - id воздействия.
var thrs_dict: Dictionary ## Ссылка на словарь целей
var auto_enabled: bool = false ## Режим автомата
var emit_enable: bool = true ## Разрешить излучение
@@ -48,6 +65,7 @@ class Interfer:
var source_interfer: String = '' ## Тип объекта по которой поставлена помеха.
var modulation: bool ## Модуляция для включения усилителей
var um: float ## Угол места для помехи.
var nmfs: int = 0 ## Номер модуля ФС в нумерации СТЦ
func _to_string() -> String:
return 'номер: %d название: %s частота: %0.1f МГц пеленг: %0.1f гр.' % [ispp, ITERFER_MODE[krp][0], params['freq'], kni]
@@ -58,9 +76,10 @@ class Interfer:
data_to_json['ss'] = msg_num
data_to_json['ispp'] = ispp
data_to_json['krp'] = krp
data_to_json['nmfs'] = nmfs
if krp != INTERFER_OFF:
data_to_json['kni'] = kni
data_to_json['powp'] = powp # TODO: Необходимо добавить управление мощностью
data_to_json['powp'] = powp
data_to_json['params'] = params
data_to_json['get'] = get_params
var pac = JSON.stringify(data_to_json).to_utf8_buffer()
@@ -128,6 +147,8 @@ func _ready() -> void:
threats.connect('threat_lost', Callable(self, 'on_threats_lost').bind(ecms, unit_caps))
var unit_nav = network.get_unit_instance('навигация')
unit_nav.connect('data_received', on_nav_data_received.bind(unit_caps))
threats.connect('threats_resized', Callable(self, 'on_threats_resized'))
threats.connect('threat_update', Callable(self, 'on_threats_update').bind(ecms))
func on_nav_data_received(coords: Dictionary, unit_caps):
@@ -292,6 +313,13 @@ func interfer_create(u, interfer_name, ecms, param, kni, id, dict, source_interf
ecm.source_interfer = source_interfer
ecm.modulation = emit_enable
ecm.um = param.get('um', 15.0) # Значение по умолчанию
var ecm_params = ITERFER_MODE[interfer_name][1]
if ecm_params.has('call_proc'):
var call_set_params = Callable(self, ecm_params['call_proc']).bind(ecm, ecm_params)
call_set_params.call()
var set_nmfs_ok = set_nmfs(ecm)
if set_nmfs_ok != Error.OK:
log.error('Ошибка выбора модуля ФС для помехи: %s' %[ecm.ispp])
signaller.emit_signal('interfer_new', ecm)
if interfer_name == 'off':
signaller.emit_signal('interfer_off', ecm, ecms, thrs)
@@ -301,6 +329,11 @@ func interfer_create(u, interfer_name, ecms, param, kni, id, dict, source_interf
func send_ecm(ecm, unit0) -> void:
if ecm.krp != INTERFER_OFF:
if not emit_enable:
return
elif not ecm.modulation:
return
msg6_num += 1
var json_data = ecm.get_msg6_data(msg6_num)
unit0.tx_stack.append(json_data)
@@ -336,7 +369,70 @@ func push_id(id: int) -> void:
id_array.sort()
func on_emit_changed(state, ecms) -> void:
func on_emit_changed(state, _ecms) -> void:
emit_enable = state
for ecm in ecms.values():
ecm.modulation = state
func call_all_diap(ecm, ecm_params: Dictionary):
ecm.params['filename'] = ecm_params['files']
func call_diap(ecm, ecm_params: Dictionary):
var fs_index_arr: Array
prd.get_fs_index(ecm, fs_index_arr)
if len(fs_index_arr):
var band = fs_index_arr[0] / 4
if ecm_params['files'].has(band):
ecm.params['filename'] = ecm_params['files'][band][0]
ecm.params['freq'] = ecm_params['files'][band][1]
func set_nmfs(ecm):
var fs_index_arr: Array
prd.get_fs_index(ecm, fs_index_arr)
if len(fs_index_arr):
ecm.nmfs = prd.FS_PRD[fs_index_arr[0]][1]
return Error.OK
else:
return Error.FAILED
func on_threats_resized(th_dic):
thrs_dict = th_dic
func on_threats_update(threat, ecms):
if threat.tmod != 'fm': return
var th_fm_dict: Dictionary
for th_index in thrs_dict:
if thrs_dict[th_index].tmod != 'fm': continue
var fs_index_arr: Array
prd.find_fs_index(thrs_dict[th_index].aoa, thrs_dict[th_index].freq, fs_index_arr)
if fs_index_arr.size() == 0: continue
if th_fm_dict.has(fs_index_arr[0]):
th_fm_dict[fs_index_arr[0]][th_index] = thrs_dict[th_index]
else:
var th_dict: Dictionary
th_fm_dict[fs_index_arr[0]] = th_dict
th_fm_dict[fs_index_arr[0]][th_index] = thrs_dict[th_index]
for key in th_fm_dict:
if len(th_fm_dict[key]) < 2: continue
var nmfs = prd.FS_PRD[key][1]
for ecm in ecms.values():
if nmfs != ecm.nmfs: continue
if ecm.krp != 'pdchm': continue
func get_freq_range(freq_range_dict: Dictionary, th_dict: Dictionary):
var min_range_abs: int = 6000
var max_range_abs: int = 0
for key_i in th_dict:
var min_range: int = 6000
var max_range: int = 0
for key_j in th_dict:
if key_i == key_j: continue
var freq_range = abs(th_dict[key_i].freq - th_dict[key_j].freq)
if freq_range < min_range: min_range = freq_range
if freq_range > max_range: max_range = freq_range
if min_range < min_range_abs: min_range_abs = min_range
if max_range > max_range_abs: max_range_abs = max_range

View File

@@ -1,7 +1,7 @@
class_name Network extends Node
const UDP_PROTO: = {'yau07tx': yau07.YaU07, 'json-capsrpb': capsrpb.CapsRpb}
const UDPTX_PROTO: = {'yau07tx': yau07.YaU07}
const UDPJSON_PROTO: = {'json-capsrpb': capsrpb.CapsRpb}
const TCP_PROTO: = {'5p28': tcp5p28.TCP5P28}
const SERIAL_PROTO: = {'uart': spt25.SPT25}
const MODBUS_PROTO: = {'mbcs': sch3.Sch3}
@@ -34,8 +34,8 @@ class Serial extends SerialPort:
return Error.OK
class Socket extends PacketPeerUDP:
func send_to(addr, data):
class SocketUDP extends PacketPeerUDP:
func send_to(addr: Array, data: PackedByteArray):
set_dest_address(addr[0], addr[1])
var rc: = put_packet(data)
if rc != Error.OK:
@@ -45,7 +45,7 @@ class Socket extends PacketPeerUDP:
class SocketTCP extends TCPServer:
const RX_TIMEOUT: int = 1000 ## Время сброса счётчика принятия части пакета.
var peerstream: = PacketPeerStream.new()
var unit_key: StringName ## Ключ юнита.
var unit_name: StringName ## Уникальное имя устройства
var head_len: int = 8 ## Длина заголовка команды.
var len_place: int = 4 ## Номер начального байта с длинной блока данных.
var type_len: int = 4 ## Количество байт в размере длинны.
@@ -55,52 +55,53 @@ class SocketTCP extends TCPServer:
var rx_data: PackedByteArray ## Принятые данные.
var data_len: int ## Размер ожидаемых данных.
func send_to(data):
func send_to(data: PackedByteArray):
var peer = peerstream.get_stream_peer()
peer.put_data(data)
var poll_sockets: Array[Socket]
var tcp_sockets: Array[Array]
var units: Dictionary[StringName, unit.Unit]
var units_udp: Dictionary[StringName, unit.Unit]
var units_udprx: Dictionary[StringName, unit.Unit]
var units_tcp: Dictionary[StringName, unit.Unit]
var units_serial: Dictionary[StringName, unit.Unit]
var units_modbus: Dictionary[StringName, unit.Unit]
var serials: Dictionary[StringName, Serial] # Последовательные порты
var mbcs: Dictionary[StringName, unit.Unit] # Клиенты modbus
var dst_ports: Dictionary[StringName, int]
var dst_addrs: Dictionary[StringName, StringName]
var unit_keys: Dictionary[int, StringName]
var sock_unicast: Socket
var sock_capsrpb: Socket
var logger_page: Node
var send_sockets: Dictionary[StringName, Socket] # Таблица <имяустройста>: <сокет> для отправки сообщений
var addr_port_to_unit_name: Dictionary[StringName, StringName]
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_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, Serial] ## Последовательные порты (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 logger_page: Node ## Ссылка на журнал работы
var send_sockets: Dictionary[StringName, SocketUDP] ## Таблица <имяустройста>: <сокет> для отправки сообщений
var addr_port_to_unit_name: Dictionary[StringName, StringName] ## Преобразование адрес:порт в имя устройства
func on_serial_data(data, unit): unit.parse(data, tick)
func create_socket(nm) -> Socket:
var addr = settings.UnitProfiles[nm][1]
var port = settings.UnitProfiles[nm][2][0]
var broad = settings.UnitProfiles[nm][3]
var bind = settings.UnitProfiles[nm][4]
var sock: = Socket.new()
## [param unit_name] - Уникальное имя устройства[br]
func create_socket_udp(unit_name: StringName) -> SocketUDP:
var addr = settings.UnitProfiles[unit_name][1]
var port = settings.UnitProfiles[unit_name][2][0]
var broad = settings.UnitProfiles[unit_name][3]
var bind = settings.UnitProfiles[unit_name][4]
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' % [nm, addr, port, ['нет', 'да'][int(bind)], error_string(rc)])
log.message(errlevel, '\"%s\" привязан к %s:%d? - %s, результат: %s' % [unit_name, addr, port, ['нет', 'да'][int(bind)], error_string(rc)])
return sock
func create_tcpsocket(unit_name: StringName) -> SocketTCP:
## [param unit_name] - Уникальное имя устройства[br]
func create_socket_tcp(unit_name: StringName) -> SocketTCP:
var addr = settings.UnitProfiles[unit_name][1]
var port = settings.UnitProfiles[unit_name][2][0]
var sock = SocketTCP.new()
sock.unit_key = unit_name
var sock: = SocketTCP.new()
sock.unit_name = unit_name
var rc: = sock.listen(port, addr)
if rc == Error.OK:
log.message(log.INFO, '\"%s\" слушает на %s:%d' % [unit_name, addr, port])
@@ -109,26 +110,28 @@ func create_tcpsocket(unit_name: StringName) -> SocketTCP:
return sock
func create_serial(nm) -> Serial:
var port = settings.UnitProfiles[nm][1]
var baud = settings.UnitProfiles[nm][2][0]
var sp: = Serial.new()
sp.port = port
sp.baudrate = baud
sp.timeout = 20000
return sp
## [param unit_name] - Уникальное имя устройства[br]
func create_serial(unit_name: StringName) -> Serial:
var port = settings.UnitProfiles[unit_name][1]
var baud = settings.UnitProfiles[unit_name][2][0]
var serial: = Serial.new()
serial.port = port
serial.baudrate = baud
serial.timeout = 20000
return serial
func create_modbus(nm) -> sch_3.Sch3:
var unit_sch3: = sch_3.Sch3.new(nm)
return unit_sch3
## [param unit_name] - Уникальное имя устройства[br]
func create_modbus(unit_name: StringName) -> sch_3.Sch3:
var unit_modbus: = sch_3.Sch3.new(unit_name)
return unit_modbus
func _ready() -> void:
poll_sockets.append(create_socket('уарэп-яу07-частный'))
poll_sockets.append(create_socket('уарэп-яу07-общий'))
poll_sockets.append(create_socket('уарэп-капсрпб'))
poll_sockets.append(create_socket('навигация'))
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]
@@ -153,21 +156,28 @@ func _ready() -> void:
var bind_modbuses: = []
for unit_name in settings.UnitProfiles:
var st = settings.UnitProfiles[unit_name]
var proto = st[0]
var unit_profile = settings.UnitProfiles[unit_name]
var proto = unit_profile[0]
if proto in UDPRX_PROTO:
var new_unit = UDPRX_PROTO[proto].new(unit_name)
units[unit_name] = new_unit
units_udprx[unit_name] = new_unit
dst_ports[unit_name] = st[2][0]
dst_ports[unit_name] = unit_profile[2][0]
if proto in UDP_PROTO:
var new_unit = UDP_PROTO[proto].new(unit_name)
if proto in UDPTX_PROTO:
var new_unit = UDPTX_PROTO[proto].new(unit_name)
units[unit_name] = new_unit
units_udp[unit_name] = new_unit
dst_ports[unit_name] = st[2][1] if len(st[2]) > 1 else st[2][0]
dst_addrs[unit_name] = st[1]
dst_ports[unit_name] = unit_profile[2][0]
dst_addrs[unit_name] = unit_profile[1]
if proto in UDPJSON_PROTO:
var new_unit = UDPJSON_PROTO[proto].new(unit_name)
units[unit_name] = new_unit
units_udp[unit_name] = new_unit
dst_ports[unit_name] = unit_profile[2][1]
dst_addrs[unit_name] = unit_profile[1]
if proto in TCP_PROTO:
var unit_tcp = TCP_PROTO[proto].new(unit_name)
@@ -176,23 +186,23 @@ func _ready() -> void:
if proto in MODBUS_PROTO:
var unit_modbus = MODBUS_PROTO[proto].new(unit_name)
unit_modbus.port = settings.UnitProfiles[unit_name][1] # TODO: убрать это отсюда (обращение к глобальным данным из экземпляра)
unit_modbus.params = settings.UnitProfiles[unit_name][2] # TODO: убрать это отсюда (обращение к глобальным данным из экземпляра)
unit_modbus.port = unit_profile[1]
unit_modbus.params = unit_profile[2]
units[unit_name] = unit_modbus
units_modbus[unit_name] = unit_modbus
bind_modbuses.append([unit_modbus, unit_name])
if proto in SERIAL_PROTO:
var unit_serial = SERIAL_PROTO[proto].new(unit_name)
var serial = create_serial(unit_name)
var serial: = create_serial(unit_name)
units_serial[unit_name] = unit_serial
units[unit_name] = unit_serial
serials[unit_name] = serial
ProjectSettings.connect('settings_changed', Callable(self, '_on_settings_changed_serial').bind(bind_serials))
tcp_sockets.append([create_tcpsocket('уарэп-5п28'), units_tcp['уарэп-5п28']])
for key in dst_ports:
tcp_sockets.append([create_socket_tcp('уарэп-5п28'), units_tcp['уарэп-5п28']])
for key: StringName in dst_ports:
unit_keys[dst_ports[key]] = key
if logger_page:
for key in units:
@@ -207,10 +217,10 @@ func _ready() -> void:
func _on_settings_changed_modbus(bind_modbuses: Array):
var external_ctl = ProjectSettings.get_setting('application/config/Внешнее управление', false)
var _external_ctl = ProjectSettings.get_setting('application/config/Внешнее управление', false)
for bm in bind_modbuses:
var unit_modbus = bm[0]
var unit_name = bm[1]
var _unit_modbus = bm[0]
var _unit_name = bm[1]
func _on_settings_changed_serial(bind_serials: Array):
@@ -228,7 +238,7 @@ func _on_settings_changed_serial(bind_serials: Array):
log.message(log.INFO, '%s для \"%s\"' % [serial, unit_name])
func poll_receive_udp(sock: Socket) -> bool:
func poll_receive_udp(sock: SocketUDP) -> bool:
while sock.get_available_packet_count() > 0:
var data: = sock.get_packet()
var addr: = sock.get_packet_ip()
@@ -239,14 +249,14 @@ func poll_receive_udp(sock: Socket) -> bool:
units[unit_name].parse(data, tick)
continue
if unit_keys.has(port):
var unit_key = unit_keys[port]
if units.has(unit_key):
units[unit_key].parse(data, tick)
var unit_name: = unit_keys[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]
var unit_udprx = units[unit_name]
var unit_name: = unit_keys[local_port]
var unit_udprx: = units[unit_name]
unit_udprx.source_addr = [addr, port]
unit_udprx.parse(data, tick)
continue
@@ -260,15 +270,17 @@ func poll_receive_tcp(sock: SocketTCP) -> bool:
log.info('подключен: %s:%d к порту: %d' % [ client.get_connected_host(), client.get_connected_port(), client.get_local_port() ] )
var peer = sock.peerstream.get_stream_peer()
if peer:
var peer_len_data = peer.get_available_bytes()
if peer_len_data > 0:
get_client_data(sock, peer_len_data, peer)
if sock.unit_key in units_tcp and sock.rx_all:
units_tcp[sock.unit_key].parse(sock.rx_data, tick)
while true:
var peer_len_data: = peer.get_available_bytes()
if peer_len_data <= 0:
break
get_client_data(sock, peer, peer_len_data)
if sock.unit_name in units_tcp and sock.rx_all:
units_tcp[sock.unit_name].parse(sock.rx_data, tick)
return false
func get_client_data(sock: SocketTCP, peer_len_data, peer):
func get_client_data(sock: SocketTCP, peer: StreamPeer, peer_len_data: int) -> void:
if tick - sock.rx_tick > sock.RX_TIMEOUT:
sock.rx_all = true
sock.rx_tick = tick
@@ -292,35 +304,35 @@ func get_client_data(sock: SocketTCP, peer_len_data, peer):
get_tcp_data(sock, peer, len_rx)
func get_tcp_data(sock: SocketTCP, peer, len_rx):
func get_tcp_data(sock: SocketTCP, peer: StreamPeer, len_rx: int):
var temp_data = peer.get_data(len_rx)[1]
sock.rx_data.append_array(temp_data)
sock.rx_len += len_rx
if sock.rx_len >= sock.head_len + sock.data_len:
if sock.rx_len == sock.head_len + sock.data_len:
sock.rx_all = true
func _process(_delta: float) -> void:
tick = Time.get_ticks_msec()
RenderingServer.global_shader_parameter_set('tick_curent', tick)
for key: StringName in units_udp:
var unit_udp = units_udp[key]
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)
var dst_port = dst_ports[key]
var dst_addr = dst_addrs[key]
var sock: = send_sockets[unit_udp.name]
var tx_data: = unit_udp.tx_data.slice(0, unit_udp.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)
for key: StringName in units_udprx:
var unit_udprx = units_udprx[key]
for unit_name: StringName in units_udprx:
var unit_udprx: = units_udprx[unit_name]
unit_udprx.process(tick)
for key: StringName in units_serial:
var unit_serial = units_serial[key]
var serial = serials[key]
for unit_name: StringName in units_serial:
var unit_serial: = units_serial[unit_name]
var serial: = serials[unit_name]
if Error.OK == unit_serial.process(tick):
serial.send_to(unit_serial.tx_data)
for key: StringName in units_modbus:
var unit_modbus = units_modbus[key]
for unit_name: StringName in units_modbus:
var unit_modbus: = units_modbus[unit_name]
unit_modbus.process(tick)
for sock_unit: Array in tcp_sockets:
var sock = sock_unit[0]
@@ -331,6 +343,7 @@ func _process(_delta: float) -> void:
poll_sockets.any(poll_receive_udp)
## [param unit_name] - Уникальное имя устройства[br]
func get_unit_instance(unit_name: StringName) -> unit.Unit:
tools.allways(unit_name in units, 'нет такого устройства: \"%s\"' % unit_name)
return units[unit_name]

View File

@@ -242,9 +242,14 @@ class PRD:
var json_data = json_conv.get_data()
yemsg_board.need_write = true
yemsg_board.ems_load = yemsg_board.LoadState.IN_PROCESS
yemsg_board.btn_load(json_data)
yemsg_board.state_board = yemsg_board.WRITE
yemsg_board.start_rw_kems(false)
var read_ok = yemsg_board.btn_load(json_data)
if read_ok:
yemsg_board.state_board = yemsg_board.WRITE
yemsg_board.start_rw_kems(false)
else:
yemsg_board.ems_load = yemsg_board.LoadState.FAIL
yemsg_board.set_wait()
log.error('Не удалось прочитать файл настроек ячейки ЭМС-Г %s' %abs_dir)
else:
yemsg_board.ems_load = yemsg_board.LoadState.FAIL
yemsg_board.set_wait()
@@ -290,18 +295,23 @@ func get_fs_param(index: int) -> Array:
## Функция возвращает массив с индексами модулей ФС для выбранной помехи
func get_fs_index(ecm, fs_index_arr):
var angle: float = ecm.kni + 45.0
if ecm.params.has('freq'):
find_fs_index(angle, ecm.params['freq'], fs_index_arr)
func find_fs_index(aoa: float, freq: int, fs_index_arr: Array):
var sector: int
var band: Array
var angle: float = ecm.kni + 45.0
var angle = aoa
if angle > 360.0:
angle -= 360.0
for sec in FS_SECTORS.values():
if float(angle) >= sec[0] and float(angle) <= sec[1]:
sector = FS_SECTORS.find_key(sec)
for diap in FS_FREQ.values():
if ecm.params.has('freq'):
if ecm.params['freq'] >= diap[0] and ecm.params['freq'] <= diap[1]:
band.append(FS_FREQ.find_key(diap))
if freq >= diap[0] and freq <= diap[1]:
band.append(FS_FREQ.find_key(diap))
for item in band:
fs_index_arr.append(item * 4 + sector)

View File

@@ -36,7 +36,7 @@ class Sch3 extends unit.Unit:
mbc.close()
func try_connect() -> bool:
var rc = mbc.open(port, params[0], params[1], params[2], params[3], params[4])
var rc: = mbc.open(port, params[0], params[1], params[2], params[3], params[4])
if rc != Error.OK: # TODO: убрать это отсюда (неуместный вывод сообщения)
if not reconnect_failed:
push_error('%s: невозможно открыть \"%s\" %s' % [name, port, params])

View File

@@ -46,8 +46,8 @@ class YaU07 extends unit.Unit:
func _to_string() -> String: return String('яу07: %s %s' % [self.name, ['отключен', 'на связи'][int(online)]])
func _init(nm: StringName):
self.name = nm
func _init(unit_name: StringName):
self.name = unit_name
tx_data.resize(BUFFER_SIZE)
tx_data.fill(0)
@@ -236,7 +236,7 @@ class YaU07 extends unit.Unit:
var block_data: = []
if rx_data.size() < (ports_count_pos + 7 + (block_len - 1) * 2):
return false
for i in block_len:
for i: int in block_len:
var shift: int = i * 2
block_data.append(rx_data.decode_u16(ports_count_pos + 7 + shift))
isa_block[block_adr] = block_data