From 29101b0a6e6b021da20b031f0946779d18b7f4ed Mon Sep 17 00:00:00 2001 From: sasha80 Date: Tue, 8 Aug 2023 08:52:53 +0300 Subject: [PATCH] =?UTF-8?q?=D0=92=20=D0=BF=D1=80=D0=BE=D1=86=D0=B5=D1=81?= =?UTF-8?q?=D1=81=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/canvas.gd | 4 +- scenes/frm_threats.gd | 6 +- scenes/tab_switch.gd | 14 +---- scenes/ЭМС.gd | 3 - scenes/работа.gd | 3 +- scripts/capsrpb.gd | 6 +- scripts/repsettings.gd | 2 +- scripts/threats.gd | 21 +++---- scripts/tools.gd | 18 +----- scripts/yau07.gd | 6 +- scripts/yems_devs.gd | 78 +++++++++++------------ shaders/bip.gdshader | 2 +- table/table.gd | 140 ++++++++++++++++++++++------------------- 13 files changed, 140 insertions(+), 163 deletions(-) diff --git a/scenes/canvas.gd b/scenes/canvas.gd index 64c7eb7a..7c1cd58e 100644 --- a/scenes/canvas.gd +++ b/scenes/canvas.gd @@ -13,7 +13,7 @@ func get_strob_visible() -> bool: return $строб.visible func get_strob_width() -> float: return $строб.material.get('shader_parameter/width') func get_strob_band() -> float: return $строб.material.get('shader_parameter/band') * 125.0 func get_strob_radius(val: float): return $строб.material.set('shader_parameter/radius', sv(val)) -func get_radius_max() -> float: return $строб.scale.x / 2.0 -func get_radius_min() -> float: return 200.0 +func get_radius_max() -> float: return $строб.scale.x / 3.3 +func get_radius_min() -> float: return 212.0 func sv(val: float) -> float: return val / ($строб.scale.x / 2.0) * 0.125 diff --git a/scenes/frm_threats.gd b/scenes/frm_threats.gd index 7fe42c3b..ab699ae7 100644 --- a/scenes/frm_threats.gd +++ b/scenes/frm_threats.gd @@ -18,8 +18,7 @@ func init_table(): $scrl_threats/tbl_threats.connect('row_pressed', Callable(self, 'on_row_pressed')) -func on_row_pressed(i_row: int): - $scrl_threats/tbl_threats.set_row_selected(i_row, true) +func on_row_pressed(i_row: int): $scrl_threats/tbl_threats.set_row_selected(i_row, true) func _on_btn_add_thr_pressed() -> void: @@ -31,5 +30,4 @@ func _on_btn_add_thr_pressed() -> void: func _on_btn_del_thr_pressed() -> void: var i_rows: = Array() $scrl_threats/tbl_threats.get_selected_rows(i_rows) - for i in i_rows: - $scrl_threats/tbl_threats.remove_row(i) + for i in i_rows: $scrl_threats/tbl_threats.remove_row(i) diff --git a/scenes/tab_switch.gd b/scenes/tab_switch.gd index c40f5eb3..33743e78 100644 --- a/scenes/tab_switch.gd +++ b/scenes/tab_switch.gd @@ -1,15 +1,3 @@ extends TabContainer - -# Called when the node enters the scene tree for the first time. -func _ready() -> void: - pass - - -# Called every frame. 'delta' is the elapsed time since the previous frame. -func _process(_delta: float) -> void: - pass - - -func _enter_tree() -> void: - REPNetwork.logger_page = $журнал +func _enter_tree() -> void: REPNetwork.logger_page = $журнал diff --git a/scenes/ЭМС.gd b/scenes/ЭМС.gd index e4b0c801..bd6c2343 100644 --- a/scenes/ЭМС.gd +++ b/scenes/ЭМС.gd @@ -185,6 +185,3 @@ func on_item_selected(item_num, node): func on_mouse_entered(btn, i, j): $marker_in.position.y = $tbl_in.position.y + btn.position.y + btn.size.y / 2 $marker_out.position.y = $tbl_out.position.y + (btn.size.y + 4) * i + btn.size.y / 2 - -func _process(delta): - pass diff --git a/scenes/работа.gd b/scenes/работа.gd index af1068e4..af7cb591 100644 --- a/scenes/работа.gd +++ b/scenes/работа.gd @@ -73,7 +73,7 @@ func _ready(): Threats.connect('threat_lost', Callable(self, 'on_threats_changed')) -func pos_calc(freq, aoa, pos0: Vector2, r0, r1, f0: float, df: float): +func pos_calc(freq: float, aoa: float, pos0: Vector2, r0: float, r1: float, f0: float, df: float): var r = ((freq - f0) / df) * r1 + r0 var aoa_rad = Tools.radians(aoa) - PI / 2.0 var x = cos(aoa_rad) * r + pos0.x @@ -104,7 +104,6 @@ func on_threat_new(threats: Dictionary, th: Object): add_child(bip) - func on_threat_lost(threats: Dictionary, th: Object): var bip = get_node('%d' % th.id) remove_child(bip) diff --git a/scripts/capsrpb.gd b/scripts/capsrpb.gd index b23d3dac..352fc0f0 100644 --- a/scripts/capsrpb.gd +++ b/scripts/capsrpb.gd @@ -18,10 +18,7 @@ class CapsRpb: var tick_rx: = 0.0 func _to_string() -> String: return String('капсрпб: "%s" %s ' % [self.name, ['отключен', 'на связи'][int(online)]]) - - func _init(nm): - self.name = nm - + func _init(nm): self.name = nm func parse(data): tick_rx = tick @@ -36,7 +33,6 @@ 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): diff --git a/scripts/repsettings.gd b/scripts/repsettings.gd index 36cc289a..0efcaeff 100644 --- a/scripts/repsettings.gd +++ b/scripts/repsettings.gd @@ -24,7 +24,7 @@ extends Node @export var ThreatParams = { - 'time_lost': [5000, 'Время после последнего обновления в мс, через которое цель считается потерянной'], + 'time_lost': [5.0, 'Время после последнего обновления в с, через которое цель считается потерянной'], 'freq_min': [200.0, 'Нижняя рабочая частота, МГЦ'], 'freq_max': [6000.0, 'Нижняя рабочая частота, МГЦ'] } diff --git a/scripts/threats.gd b/scripts/threats.gd index e8b97066..5e621d1c 100644 --- a/scripts/threats.gd +++ b/scripts/threats.gd @@ -1,6 +1,5 @@ extends Node -@onready var timer_check_lost: = Timer.new() class Threat: var alt: float # Текущая высота, метры. @@ -23,10 +22,9 @@ class Threat: var tmod: String # Тип модуляции. var utime: Dictionary # Время крайнего обновления. var width: float # Ширина занимаемого диапазона частот, МГц. - var id: int # Идентификатор цели + var id: int # Идентификатор цел. func _init(): Tools.get_members_names(self).any(func(vn): fflags[vn] = false) - func _to_string() -> String: return 'номер:%d пеленг:%0.1f частота:%0.1f МГц' % [id, aoa, freq] func set_from_dic(dic_vals: Dictionary): @@ -50,16 +48,15 @@ func _ready() -> void: var unit_key = REPSettings.get_unit_key('уарэп-капсрпб-отп') var unit = REPNetwork.units[unit_key] unit.connect('data_received', Callable(self, 'on_data_capsrpb_received')) + var timer_check_lost: = Timer.new() add_child(timer_check_lost) - timer_check_lost.connect('timeout', Callable(self, 'on_timer_check_lost')) - timer_check_lost.start(REPSettings.ThreatParams.time_lost[0] / 2000.0) + 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) -func on_timer_check_lost(): - var tick = Time.get_ticks_msec() - for id in threats.keys(): - var th = threats[id] - if (tick - th.atick) >= REPSettings.ThreatParams.time_lost[0]: +func on_timer_check_lost(unit, time_lost: int): + for th in threats.values(): + if (unit.tick - th.atick) >= time_lost: threats.erase(th.id) call_deferred('emit_signal', 'threat_lost', threats, th) @@ -74,12 +71,12 @@ func on_data_capsrpb_received(unit: capsrpb.CapsRpb): if id in threats: var th = threats[id] th.set_from_dic(dic_th) - th.atick = Time.get_ticks_msec() + th.atick = unit.tick call_deferred('emit_signal', 'threat_update', threats, th) else: var th = Threat.new() th.set_from_dic(dic_th) - th.atick = Time.get_ticks_msec() + th.atick = unit.tick th.fflags['atick'] = true threats[id] = th call_deferred('emit_signal', 'threat_new', threats, th) diff --git a/scripts/tools.gd b/scripts/tools.gd index 495bbf26..ccb4613f 100644 --- a/scripts/tools.gd +++ b/scripts/tools.gd @@ -2,6 +2,8 @@ extends Node func radians(val: float): return (val * PI) / 180.0 +func ibytes_to_word(buf: PackedByteArray, i: int) -> int: return buf[i] + (buf[i + 1] * 256) +func hypot(x: float, y: float) -> float: return sqrt(x * x + y * y) func get_members_names(obj: Object) -> Array: @@ -24,13 +26,7 @@ func map_dec_to_rad(pos0: Vector2, pos: Vector2) -> Vector2: var x1: float = pos.x - pos0.x var y1: float = pos.y - pos0.y var ang: float = (atan2(y1, x1) * 180.0) / PI - ang += 360.0 * float(ang < 0.0) - var radius: float = hypot(x1, y1) - return Vector2(ang, radius) - - -func hypot(x: float, y: float) -> float: - return sqrt(x * x + y * y) + return Vector2(ang + 360.0 * float(ang < 0.0), hypot(x1, y1)) func is_overlap(x1, x2, y1, y2): @@ -38,10 +34,6 @@ func is_overlap(x1, x2, y1, y2): return max(x1, y1) <= min(x2, y2) -func ibytes_to_word(buf: PackedByteArray, i: int) -> int: - return buf[i] + (buf[i + 1] * 256) - - func map_range(val: float, a0: float, a1: float, b0: float, b1: float) -> float: """ Переводит значение val из диапазона a0...a1 в диапазон b0...b1 """ return (((val - a0) * (b1 - b0)) / (a1 - a0)) + b0 @@ -52,10 +44,6 @@ func type_is_num(val) -> bool: return (typeof(val) == TYPE_INT) or (typeof(val) == typeof(0.0)) -func sort_ascending_0(a, b) -> bool: - return a[0] < b[0] - - func is_point_in_polygon(pos: Vector2, p: PackedVector2Array) -> bool: var j: int = len(p) - 1 var odd_nodes: int = 0 diff --git a/scripts/yau07.gd b/scripts/yau07.gd index acda9c0e..2807e8a7 100644 --- a/scripts/yau07.gd +++ b/scripts/yau07.gd @@ -79,12 +79,12 @@ class YaU07: func send_isa(cmd_code: int, ports_data: Array) -> bool: - if (cmd_state == CmdState.WAIT) or (cmd_state == CmdState.SEND): + if (cmd_state == CmdState.WAIT) \ + or (cmd_state == CmdState.SEND) \ + or (cmd_state == CmdState.UNCK): return false if not ((cmd_code == CmdCode.READ_ISA) or (cmd_code == CmdCode.WRITE_ISA)): return false - if cmd_state == CmdState.UNCK: - return false cmd_num_tx = (cmd_num_rx + 1) % 0xffff diff --git a/scripts/yems_devs.gd b/scripts/yems_devs.gd index 8e7e5ec2..cf8e1f2a 100644 --- a/scripts/yems_devs.gd +++ b/scripts/yems_devs.gd @@ -2,43 +2,43 @@ extends Node class InDev: - var id: int # Идентификатор индекс устройства - var dev_name: String # Имя подключаемого комплекса - var connector: String # Номер разъёма в приборе - var delay: float # Задержка фронта импульса - var offset: float # Смещение фронта импульса - var state: int # Состояние входа - var freq: int # Предполагаемая частота на которой работает комплекс - var ports_data: Dictionary # Словарь состояния портов устройства - var tbl_row_id: int # Индекс устройства в таблице входов - var out_dots: Array # Список выходных устройств в порядке, как в таблице и точки матрицы - - func _init(dev_id : int, params : Array, row_id : int): - id = dev_id - dev_name = String(params[0]) - connector = String(params[1]) - delay = float(params[2]) - offset = float(params[3]) - tbl_row_id = row_id - - + var id: int # Идентификатор индекс устройства + var dev_name: String # Имя подключаемого комплекса + var connector: String # Номер разъёма в приборе + var delay: float # Задержка фронта импульса + var offset: float # Смещение фронта импульса + var state: int # Состояние входа + var freq: int # Предполагаемая частота на которой работает комплекс + var ports_data: Dictionary # Словарь состояния портов устройства + var tbl_row_id: int # Индекс устройства в таблице входов + var out_dots: Array # Список выходных устройств в порядке, как в таблице и точки матрицы + + func _init(dev_id : int, params : Array, row_id : int): + id = dev_id + dev_name = String(params[0]) + connector = String(params[1]) + delay = float(params[2]) + offset = float(params[3]) + tbl_row_id = row_id + + class OutDev: - var id: int # Идентификатор индекс устройства - var dev_name: String # Имя подключаемого комплекса - var connector: String # Номер разъёма в приборе - var delay: float # Задержка фронта импульса - var offset: float # Смещение фронта импульса - var state: int # Состояние входа - var freq: int # Предполагаемая частота на которой работает комплекс - var ports_data: Dictionary # Словарь состояния портов устройства - var tbl_row_id: int # Индекс устройства в таблице выходов - var mode: int # Режим работы выхода - - func _init(dev_id : int, params : Array, row_id : int): - id = dev_id - dev_name = String(params[0]) - connector = String(params[1]) - delay = float(params[2]) - offset = float(params[3]) - tbl_row_id = row_id - mode = 0 + var id: int # Идентификатор индекс устройства + var dev_name: String # Имя подключаемого комплекса + var connector: String # Номер разъёма в приборе + var delay: float # Задержка фронта импульса + var offset: float # Смещение фронта импульса + var state: int # Состояние входа + var freq: int # Предполагаемая частота на которой работает комплекс + var ports_data: Dictionary # Словарь состояния портов устройства + var tbl_row_id: int # Индекс устройства в таблице выходов + var mode: int # Режим работы выхода + + func _init(dev_id : int, params : Array, row_id : int): + id = dev_id + dev_name = String(params[0]) + connector = String(params[1]) + delay = float(params[2]) + offset = float(params[3]) + tbl_row_id = row_id + mode = 0 diff --git a/shaders/bip.gdshader b/shaders/bip.gdshader index 0e7ce0d8..a46d779a 100644 --- a/shaders/bip.gdshader +++ b/shaders/bip.gdshader @@ -3,7 +3,7 @@ shader_type canvas_item; /* Закрашенная окружность */ uniform vec4 color: source_color = vec4(1, 1, 1, 1); -const float ds = 0.005; /* Относительное расстояние на котором выполняется сглаживание краёв */ +const float ds = 0.01; /* Относительное расстояние на котором выполняется сглаживание краёв */ const vec2 center = vec2(0.125, 0.125); /* Центр должен быть в (0.5, 0.5), но это не так */ const float radius = 0.125 - ds * 2.0; /* Радиус должен быть 0.5, но это не так */ diff --git a/table/table.gd b/table/table.gd index 6b53e32d..e9fb7a40 100644 --- a/table/table.gd +++ b/table/table.gd @@ -36,6 +36,10 @@ var scroll: Control var scroll_adj: = Vector2(0, 0) +func get_node_scene(): return node_type_file +func _assert_meta(i_col: int, i_row: int, pname: String, node): assert(node.has_meta(pname), 'ошибка: нет мета-свойства \"%s\" у ячейки колонка:%d ряд:%d' % [pname, i_col, i_row]) + + func pin_header(scrl: ScrollContainer, prnt): scrl.remove_child(header) prnt.add_child(header) @@ -95,10 +99,6 @@ func load_node_scene(file_name: String): ScnNode = load(file_name) -func get_node_scene(): - return node_type_file - - func _ready(): ScnSelector = load(selector_type_file) ScnNode = load(node_type_file) @@ -113,10 +113,6 @@ func align_to_left_bottompos(hdr: Control, gap: = Vector2(0, 0)): position.y = hdr.position.y + hdr.size.y + gap.y -func _assert_meta(i_col: int, i_row: int, pname: String, node): - assert(node.has_meta(pname), 'ошибка: нет мета-свойства \"%s\" у ячейки (%s): колонка:%d ряд:%d' % [pname, typeof(node), i_col, i_row]) - - func set_node_meta(i_col: int, i_row: int, pname: String, val) -> void: var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) var node = nodes[key] @@ -287,22 +283,24 @@ func add_row(row_types: Array) -> void: set_columns(row_types.size()) else: assert(columns == row_types.size(), 'ошибка: %s количество колонок установлено ранее - %d, но требуется %d' % [self, columns, row_types.size()]) - var rows_count: int = get_rows_count() - assert(rows_count < MAX_INDEX, 'ошибка: слишком много рядов, больше %d' % (MAX_INDEX + 1)) + var i_row: int = get_rows_count() + assert(i_row < MAX_INDEX, 'ошибка: слишком много рядов, больше %d' % (MAX_INDEX + 1)) for i_col in columns: var node = row_types[i_col].instantiate() var head = nodes[HEAD_KEY_FORMAT % [0, i_col]] node.custom_minimum_size.x = head.custom_minimum_size.x node.size.x = head.size.x - var key: String = NODE_KEY_FORMAT % [rows_count, i_col] - node.name = key + var node_key: String = NODE_KEY_FORMAT % [i_row, i_col] + node.name = node_key add_child(node) - nodes[key] = node - node.connect('focus_entered', Callable(self, '_on_focus_entered').bind(key)) + nodes[node_key] = node + var conn = Callable(self, '_on_focus_entered').bind(node) + node.connect('focus_entered', conn) + set_node_meta(i_col, i_row, 'callable_focus_entered', conn) -func _on_focus_entered(key): - var indexes = get_key_indexes(key) +func _on_focus_entered(node): + var indexes = get_key_indexes(node.name) emit_signal('row_pressed', indexes[1]) @@ -351,71 +349,87 @@ func get_node_user_data(i_col: int, i_row: int) -> Object: func remove_row(i_row: int): var sel_key: String = ROW_SELECTOR_KEY_FORMAT % [i_row, 0] + if nodes.has(sel_key): var selector = nodes[sel_key] - var node_key: String = get_node_key(NODE_KEY_FORMAT, 0, i_row) - var node = nodes[node_key] - node.remove_child(selector) + scroll.get_parent().remove_child(selector) selector.queue_free() nodes.erase(sel_key) - for i_col in columns: - var node_key: String = get_node_key(NODE_KEY_FORMAT, i_col, i_row) - var conn_key: String = CONNECTED_KEY_FORMAT % [i_row, i_col] - var data_key: String = DATA_KEY_FORMAT % [i_row, i_col] - var node = nodes[node_key] - nodes.erase(node_key) - remove_child(node) - node.queue_free() + for i_col in columns: + + var node_key: String = NODE_KEY_FORMAT % [i_row, i_col] + var node = nodes[node_key] + + var conn_key: String = CONNECTED_KEY_FORMAT % [i_row, i_col] + var conn = get_node_meta(i_col, i_row, 'callable_focus_entered') + node.disconnect('focus_entered', conn) + + var data_key: String = DATA_KEY_FORMAT % [i_row, i_col] if nodes.has(data_key): nodes.erase(data_key) + if nodes.has(conn_key): - var conn = nodes[conn_key] - var callback = conn[0] - var dest_node = conn[1] - node.disconnect('pressed', Callable(dest_node, callback)) + conn = nodes[conn_key] + node.disconnect('pressed', conn) nodes.erase(conn_key) + remove_child(node) + nodes.erase(node_key) + node.queue_free() + + var swaps: = [] + var c0 = nodes.size() + rehash(swaps) + var c1 = nodes.size() + assert(c0 == c1) + + +func next_index(indexes: Vector2i): + indexes.x += 1 + if indexes.x == columns: + indexes.x = 0 + indexes.y += 1 + + +func swap_nodes(nodes_copy, swaps, node_key_format, i0, i1) -> bool: + var key0: = String(node_key_format % [i0.y, i0.x]) + if not nodes.has(key0): + return false + var key1: = String(node_key_format % [i1.y, i0.x]) + nodes_copy[key1] = nodes[key0] + nodes_copy[key1].name = key1 + swaps.append([key0, key1]) + return true + func rehash(swaps: Array): + # TODO: Не работает """ Переназначает ключи в соответствии с размерами таблицы. После вызова swaps содержит массив пар [<прежний ключ>, <текущий ключ>] """ assert(not swaps.size(), 'ошибка: swaps не пустой') - var nodes_copy: = {} - var i_col: = 0 - var i_row: = 0 - for key0 in nodes: - if NODE_PREFIX in key0: - var node_key1: String = NODE_KEY_FORMAT % [i_row, i_col] - nodes_copy[node_key1] = nodes[key0] - swaps.append([key0, node_key1]) + var i_node: = Vector2i() + var i_hdr: = Vector2i() + var i_slct: = Vector2i() + var i_conn: = Vector2i() + var i_data: = Vector2i() + var db = [] + var nodes_copy = {} + print_debug('до: %s' % str(nodes.keys())) + for node in nodes.values(): + var iv = get_key_indexes(node.name) + var i0 := Vector2i(iv[0], iv[1]) + db.append(iv) + if swap_nodes(nodes_copy, swaps, HEAD_KEY_FORMAT, i0, i_hdr): next_index(i_hdr) + if swap_nodes(nodes_copy, swaps, NODE_KEY_FORMAT, i0, i_node): next_index(i_node) + #if swap_nodes(nodes_copy, swaps, ROW_SELECTOR_KEY_FORMAT, i0, i_slct): next_index(i_slct) + #if swap_nodes(nodes_copy, swaps, CONNECTED_KEY_FORMAT, i0, i_conn): next_index(i_conn) + #if swap_nodes(nodes_copy, swaps, DATA_KEY_FORMAT, i0, i_data): next_index(i_data) + print_debug(db) - var indxs = get_key_indexes(key0) - - var slct_key0: String = ROW_SELECTOR_KEY_FORMAT % [indxs[1], indxs[0]] - if nodes.has(slct_key0): - var slct_key1: String = ROW_SELECTOR_KEY_FORMAT % [i_row, i_col] - nodes_copy[slct_key1] = nodes[slct_key0] - swaps.append([slct_key0, slct_key1]) - - var conn_key0: String = CONNECTED_KEY_FORMAT % [indxs[1], indxs[0]] - if nodes.has(conn_key0): - var conn_key1: String = CONNECTED_KEY_FORMAT % [i_row, i_col] - nodes_copy[conn_key1] = nodes[conn_key0] - swaps.append([conn_key0, conn_key1]) - - var data_key0: String = DATA_KEY_FORMAT % [indxs[1], indxs[0]] - if nodes.has(data_key0): - var data_key1: String = DATA_KEY_FORMAT % [i_row, i_col] - nodes_copy[data_key1] = nodes[data_key0] - swaps.append([data_key0, data_key1]) - - i_col += 1 - if i_col == columns: - i_col = 0 - i_row += 1 nodes.clear() nodes.merge(nodes_copy) + print_debug('после: %s' % str(nodes.keys())) func clear_rows() -> void: