diff --git a/scenes/журнал.gd b/scenes/журнал.gd index 15cb9a8..d6e6b35 100644 --- a/scenes/журнал.gd +++ b/scenes/журнал.gd @@ -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()]) diff --git a/scenes/работа.gd b/scenes/работа.gd index 23ec6f6..4cb6917 100644 --- a/scenes/работа.gd +++ b/scenes/работа.gd @@ -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 diff --git a/scripts/capsrpb.gd b/scripts/capsrpb.gd index 9d963ed..8478e7d 100644 --- a/scripts/capsrpb.gd +++ b/scripts/capsrpb.gd @@ -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) diff --git a/scripts/repnetwork.gd b/scripts/repnetwork.gd index 68a0067..4a2510b 100644 --- a/scripts/repnetwork.gd +++ b/scripts/repnetwork.gd @@ -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)) diff --git a/scripts/repsettings.gd b/scripts/repsettings.gd index 9f581b2..d9261c4 100644 --- a/scripts/repsettings.gd +++ b/scripts/repsettings.gd @@ -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]] diff --git a/scripts/threats.gd b/scripts/threats.gd index 45b00a5..778b0f9 100644 --- a/scripts/threats.gd +++ b/scripts/threats.gd @@ -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) diff --git a/scripts/tools.gd b/scripts/tools.gd index 0285d2e..72d53f2 100644 --- a/scripts/tools.gd +++ b/scripts/tools.gd @@ -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 diff --git a/scripts/yau07.gd b/scripts/yau07.gd index c9f2a51..d1ca848 100644 --- a/scripts/yau07.gd +++ b/scripts/yau07.gd @@ -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