Рефакторинг.

This commit is contained in:
sasha80
2023-08-11 16:41:30 +03:00
parent f43020f23b
commit b4f7763083
8 changed files with 63 additions and 58 deletions

View File

@@ -11,7 +11,7 @@ func _ready() -> void:
Threats.connect('threat_lost', Callable(self, 'on_threats_changed').bind('Цель потеряна'))
func on_threats_changed(threats: Dictionary, th: Object, msg: String):
func on_threats_changed(_threats: Dictionary, th: Object, msg: String):
Log.message(Logger.INFO, '%s: %s' % [msg, th.to_string()])

View File

@@ -45,7 +45,7 @@ func _on_full_screen(): toggle_full_screen(window_0_id)
## Обработчик сигнала изменения списка целей
func on_threats_changed(threats: Dictionary, th: Object): $count_all_pad/count_all.text = '%02d' % threats.size()
func on_threats_changed(threats: Dictionary, _th): $count_all_pad/count_all.text = '%02d' % threats.size()
## Производит инициализацию
@@ -66,24 +66,24 @@ func _ready():
## Производит отображение цели на диаграмму
func map_threat_to_bip(th: Threats.Threat, bip: Sprite2D):
bip.position = Tools.pos_calc (
bip.position = Tools.pos_calc(
th.freq,
th.aoa,
$canvas.get_strob_center(),
$canvas.get_radius_min(),
$canvas.get_radius_max(),
REPSettings.ThreatParams.freq_min[0],
REPSettings.ThreatParams.freq_max[0] - REPSettings.ThreatParams.freq_min[0])
REPSettings.ThreatParams.radius_center,
REPSettings.ThreatParams.radius_inner,
REPSettings.ThreatParams.radius_outter,
REPSettings.ThreatParams.freq_low,
REPSettings.ThreatParams.freq_high)
## Обработчик сигнала обновления цели
func on_threat_update(threats: Dictionary, th: Object):
func on_threat_update(_threats: Dictionary, th):
var bip = get_node('%d' % th.id)
map_threat_to_bip(th, bip)
## Обработчик сигнала обнаружения цели
func on_threat_new(threats: Dictionary, th: Object):
func on_threat_new(_threats: Dictionary, th) -> void:
var bip = Bip.instantiate()
bip.name = '%d' % th.id
map_threat_to_bip(th, bip)
@@ -91,14 +91,14 @@ func on_threat_new(threats: Dictionary, th: Object):
## Обработчик сигнала потери цели
func on_threat_lost(threats: Dictionary, th: Object):
func on_threat_lost(_threats: Dictionary, th) -> void:
var bip = get_node('%d' % th.id)
remove_child(bip)
bip.free()
## Обработчик нажатия кнопки "Строб". Управляет отображением строба
func on_button_strobe_pressed():
func on_button_strobe_pressed() -> void:
if $btn_strobe.is_pressed():
$canvas.set_strob_visible(true)
drag_fsm = DragFSM.IDLE
@@ -108,7 +108,7 @@ func on_button_strobe_pressed():
## Поведение радиокнопок в группе. Управляет состоянием кнопок в радиогруппе
func on_button_pressed(btn_this, btn_others):
func on_button_pressed(btn_this, btn_others) -> void:
for btn_other in btn_others: btn_other.set_pressed(btn_this == btn_other)
@@ -127,7 +127,7 @@ func get_strob_band(pos: Vector2, prev: float) -> float:
## Устанавливает центр строба по частоте и направлению
func set_strob(pos: Vector2):
func set_strob(pos: Vector2) -> void:
var radp: Vector2 = Tools.map_dec_to_rad(strob_center, pos)
if radp.y < $canvas.get_radius_max():
$canvas.set_strob_dir(radp.x)
@@ -135,7 +135,7 @@ func set_strob(pos: Vector2):
## Обработка движения мыши для управления стробом. Вызывается во время движения мыши
func _on_drag_continue(event):
func _on_drag_continue(event) -> void:
if drag_button == MOUSE_BUTTON_RIGHT:
if shift_pressed:
var strob_width: float = get_strob_width(event.position, strob_width_begin)
@@ -148,7 +148,7 @@ func _on_drag_continue(event):
## Обработка движения мыши для управления стробом. Вызывается при нажатии мыши
func _on_drag_begin(event):
func _on_drag_begin(event) -> void:
drag_pos_begin = event.position
if drag_button == MOUSE_BUTTON_LEFT:
set_strob(event.position)
@@ -179,7 +179,7 @@ func _input(event):
## Переключает режим окна программы полный - обычный экран
func toggle_full_screen(id: int):
func toggle_full_screen(id: int) -> void:
var mode = DisplayServer.window_get_mode(id)
if mode == DisplayServer.WINDOW_MODE_FULLSCREEN:
mode = DisplayServer.WINDOW_MODE_WINDOWED

View File

@@ -23,8 +23,8 @@ class CapsRpb:
func _to_string() -> String: return String('капсрпб: "%s" %s ' % [self.name, ['отключен', 'на связи'][int(online)]])
func _init(nm): self.name = nm
func parse(data):
tick_rx = tick
func parse(data: PackedByteArray, now_tick: int):
tick = now_tick
if not online:
online = true
emit_signal('line_changed', self)
@@ -36,8 +36,7 @@ class CapsRpb:
var msg = json_conv.get_error_message()
emit_signal('parse_error', self, msg)
func process(delta: float):
tick += delta
if online and ((tick - tick_rx) > ONLINE_TIMEOUT):
func process(now_tick: int):
if online and ((now_tick - tick) > ONLINE_TIMEOUT):
online = false
emit_signal('line_changed', self)

View File

@@ -48,20 +48,21 @@ func _ready() -> void:
for key in units: Log.info('%s %s:%d' % [units[key].name, key[0], key[1]])
func poll_receive(sock: Socket) -> bool:
func poll_receive(sock: Socket, tick: int) -> bool:
while sock.get_available_packet_count() > 0:
var data: = sock.get_packet()
var addr: = sock.get_packet_ip()
var port: = sock.get_packet_port()
var addr_port: = [addr, port]
if addr_port in units: units[addr_port].parse(data)
if addr_port in units: units[addr_port].parse(data, tick)
return false
func _process(delta: float) -> void:
func _process(_delta: float) -> void:
var tick = Time.get_ticks_msec()
for addr in units:
var unit = units[addr]
match unit.process(delta):
match unit.process(tick):
Error.OK: sock_unicast.send_to(addr, unit.data_tx)
Error.FAILED: emit_signal('socket_error', 'ошибка: %s %s:%d' % [unit, addr[0], addr[1]])
poll_sockets.any(func(sock): poll_receive(sock))
poll_sockets.any(func(sock): poll_receive(sock, tick))

View File

@@ -22,16 +22,18 @@ extends Node
'уарэп-яу07-3в': ['yau07tx', '10.1.1.50', 50050, false, false, 'IP-адрес ЯУ-07 прибора ПРД-В'],
'уарэп-яу07-3н': ['yau07tx', '10.1.1.49', 50049, false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'],
'уарэп-яу07-3к': ['yau07tx', '10.1.1.51', 50051, false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'],
'уарэп-щ3': ['uart', '/dev/stty0', 115200, 1, 1, false, 1000, 'Прибор Щ3'] } # скорость, стартовых, стоповых, чётность, таймаут в мкс
'уарэп-щ3': ['uart', '/dev/stty0', 115200, 1, 1, false, 1000, 'Прибор Щ3'] } # скорость, стартовых, стоповых, чётность, таймаут в мкс
## Параметры цели
@export var ThreatParams = {
'time_lost': [5.0, 'Время после последнего обновления в с, через которое цель считается потерянной'],
'freq_min': [200.0, 'Нижняя рабочая частота, МГЦ'],
'freq_max': [6000.0, 'Нижняя рабочая частота, МГЦ'],
'radius_inner': [100, 'Внутренний радиус в пикселях для отображения частота-пеленг'],
'radius_outter': [800, 'Наружний радиус в пикселях для отображения частота-пеленг'] }
'radius_center': Vector2(560, 560), ## Координаты центра диаграммы в пикселях для отображения частота-пеленг
'time_lost': 5000, ## Время после последнего обновления в мс, через которое цель считается потерянной
'freq_low': 200.0, ## Нижняя рабочая частота, МГЦ
'freq_high': 6000.0, ## Нижняя рабочая частота, МГЦ
'radius_inner': 100, ## Внутренний радиус диаграммы в пикселях для отображения частота-пеленг
'radius_outter': 800 ## Наружний радиус диаграммы в пикселях для отображения частота-пеленг
}
func _ready() -> void: Log.info('Модуль настроек готов')
@@ -39,6 +41,6 @@ func _ready() -> void: Log.info('Модуль настроек готов')
## Возвращает ключ устройства
func get_unit_key(unit_name: String) -> Array:
assert(unit_name in UnitProfiles, 'ошибка: нет такого устройства "%s"' % unit_name)
assert(UnitProfiles.has(unit_name), 'ошибка: нет такого устройства \"%s\"' % unit_name)
var item = UnitProfiles[unit_name]
return [item[1], item[2]]

View File

@@ -23,7 +23,6 @@ class Threat:
var slon: float ## Координаты старта, долгота в градусах.
var tick: int ## Время приёма сигнала, мс.
var tmod: String ## Тип модуляции.
var utime: Dictionary ## Время крайнего обновления.
var width: float ## Ширина занимаемого диапазона частот, МГц.
var id: int ## Идентификатор цели.
@@ -31,7 +30,7 @@ class Threat:
func _to_string() -> String: return 'номер:%d пеленг:%0.1f частота:%0.1f МГц' % [id, aoa, freq]
func set_from_dic(dic_vals: Dictionary):
var items: = fflags.keys().filter(func(vn): return vn in dic_vals)
var items: = fflags.keys().filter(func(vn): return dic_vals.has(vn))
items.any(func(vn): set(vn, dic_vals[vn]); fflags[vn] = true; return false)
@@ -39,6 +38,7 @@ signal threat_new(threats: Dictionary, th: Threat)
signal threat_lost(threats: Dictionary, th: Threat)
signal threat_update(threats: Dictionary, th: Threat)
var threats = {} ## Список целей. Индекс - <источник цели>:<номер цели> Источник цели может быть: 'RPB', 'SIGMA', 'RLKS', 'MP405'
@@ -48,20 +48,21 @@ func _ready() -> void:
var unit = REPNetwork.units[unit_key]
var timer_check_lost: = Timer.new()
add_child(timer_check_lost)
#unit.connect('data_received', Callable(self, 'on_data_capsrpb_received'))
timer_check_lost.connect('timeout', Callable(self, 'on_timer_check_lost').bind(unit, REPSettings.ThreatParams.time_lost[0]))
timer_check_lost.start(REPSettings.ThreatParams.time_lost[0] / 2.0)
unit.connect('data_received', Callable(self, 'on_data_capsrpb_received'))
timer_check_lost.connect('timeout', Callable(self, 'on_timer_check_lost').bind(REPSettings.ThreatParams.time_lost))
timer_check_lost.start(REPSettings.ThreatParams.time_lost / 2.0)
## Периодически проверяет приборы на связи
func on_timer_check_lost(unit, time_lost: int):
func on_timer_check_lost(time_lost: int):
var tick = Time.get_ticks_msec()
for th in threats.values():
if (unit.tick - th.atick) >= time_lost:
if (tick - th.tick) >= time_lost:
threats.erase(th.id)
call_deferred('emit_signal', 'threat_lost', threats, th)
emit_signal('threat_lost', threats, th)
## Приём целей
## Производит приём целей
func on_data_capsrpb_received(unit: capsrpb.CapsRpb):
if 'mis' not in unit.json_dic:
return
@@ -72,12 +73,12 @@ func on_data_capsrpb_received(unit: capsrpb.CapsRpb):
if threats.has(id):
var th = threats[id]
th.set_from_dic(dic_th)
th.atick = unit.tick
call_deferred('emit_signal', threat_update, threats, th)
th.tick = unit.tick
call_deferred('emit_signal', 'threat_update', threats, th)
else:
var th = Threat.new()
th.set_from_dic(dic_th)
th.atick = unit.tick
th.fflags['atick'] = true
th.tick = unit.tick
th.fflags['tick'] = true
threats[id] = th
call_deferred('emit_signal', 'threat_new', threats, th)

View File

@@ -7,7 +7,7 @@ extends Node
func type_is_num(val) -> bool: return (typeof(val) == TYPE_INT) or (typeof(val) == typeof(0.0))
## Производит преобразование из угла в радианы
## Возвращае значение в радианах для угла в градусах [param val].
func radians(val: float): return (val * PI) / 180.0
@@ -24,7 +24,8 @@ func is_overlap(x1, x2, y1, y2): return max(x1, y1) <= min(x2, y2)
## Производит преобразование из декартовой в полярную систему координат
func pos_calc(freq: float, aoa: float, pos0: Vector2, r0: float, r1: float, f0: float, df: float):
func pos_calc(freq: float, aoa: float, pos0: Vector2, r0: float, r1: float, f0: float, f1: float):
var df = f1 - f0
var r = ((freq - f0) / df) * r1 + r0
var aoa_rad = Tools.radians(aoa) - PI / 2.0
var x = cos(aoa_rad) * r + pos0.x
@@ -72,9 +73,10 @@ func map_range(val: float, a0: float, a1: float, b0: float, b1: float) -> float:
## Возвращает true, если точка внутри заданного полигона
func is_point_in_polygon(pos: Vector2, p: PackedVector2Array) -> bool:
assert(len(p))
var j: int = len(p) - 1
var odd_nodes: int = 0
for i in range(len(p)):
for i in len(p):
if ((p[i].y < pos.y and p[j].y >= pos.y or p[j].y < pos.y and p[i].y >= pos.y) and (p[i].x <= pos.x or p[j].x <= pos.x)):
odd_nodes ^= int((p[i].x + (pos.y - p[i].y) / (p[j].y - p[i].y) * (p[j].x - p[i].x) < pos.x))
j = i

View File

@@ -2,7 +2,7 @@ extends Node
## Протокол ячейки ЯУ-07
const ONLINE_TIMEOUT = 5.0 ## Время ожидания пакета от ячейки, секунды
const ONLINE_TIMEOUT = 5000 ## Время ожидания пакета от ячейки, секунды
const RESEND_TIMEOUT = 0.3 ## Задержка для повторной отправки команды, секунды
const RETRY_COUNT = 5 ## Количество повторных отправок
const BUFFER_SIZE = 2048 ## Размер буфера для приёма датаграмм
@@ -19,7 +19,7 @@ class YaU07:
## Состояние автомата выполнения команды
enum CmdState {
UNCK, ## Номер команды не ининцирован
UNCK, ## Номер команды не ининциирован
SEND, ## Буфер готов для отправки
WAIT, ## Ожидание выполнения
DONE, ## Команда выполнена
@@ -64,7 +64,7 @@ class YaU07:
var rc = Error.ERR_BUSY
if cmd_state == CmdState.SEND:
rc = rc.OK
rc = Error.OK
cmd_tick_tx = tick
cmd_state = CmdState.WAIT
cmd_retry = RETRY_COUNT
@@ -147,10 +147,10 @@ class YaU07:
## Заполняет состояние прибора данными прочитанными из портов ЯУ-07
## для команд "читать порты" или "записать порты"
## rx_data - Принятые данные
## Возвращает True - Данные обработаны успешно,
## Возвращает False - Данные не обработаны из за ошибки
## для команд "читать порты" или "записать порты"[br]
## [param rx_data] - Принятые данные[br]
## Возвращает [b]true[/b] - Данные обработаны успешно[br]
## Возвращает [b]false[/b] - Данные не обработаны из за ошибки[br]
func parse(rx_data: PackedByteArray) -> bool:
if not online:
@@ -169,7 +169,7 @@ class YaU07:
if rx_data_len < (status_len + 6):
return false
var i: = 0
var len_rx_data = rx_data.size()
var len_rx_data: = rx_data.size()
status.resize(status_len)
while i < status_len:
var byte_i = i + 8