diff --git a/scenes/frame-ecm-list/frm-ecm-list.gd b/scenes/frame-ecm-list/frm-ecm-list.gd index eb42dde..ee1ba69 100644 --- a/scenes/frame-ecm-list/frm-ecm-list.gd +++ b/scenes/frame-ecm-list/frm-ecm-list.gd @@ -2,12 +2,13 @@ class_name frm_ecm_list extends NinePatchRect const srn_sectors: Dictionary = { - 'srni1': [4, 5, 6, 7, 8, 9, 10, 11] } + 'srni1': [12, 13, 14, 15, 16, 17, 18, 19] } const jtids_sectors: Dictionary = { - 'svi1': [12, 13, 14, 15, 16, 17, 18, 19] } + 'svi1': [4, 5, 6, 7, 8, 9, 10, 11] } -const kupd_sectors: Dictionary = {} +const kupd_sectors: Dictionary = { + 'lchm1': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 20, 21, 22, 23, 24, 25, 26, 27] } const panika_sectors: Dictionary = { 'lchm1': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 20, 21, 22, 23, 24, 25, 26, 27], @@ -17,19 +18,21 @@ const panika_sectors: Dictionary = { ## Called when the node enters the scene tree for the first time. func _ready(): var nodes: Array = get_tree().get_nodes_in_group('группа-принудительно') - $grd_forced/btn_cancel.button_connect('pressed', Callable(self, 'on_btn_cancel_pressed').bind($grd_forced/btn_cancel)) + $grd_forced/btn_cancel.button_connect('pressed', Callable(self, 'on_btn_cancel_pressed').bind($grd_forced/btn_cancel, nodes)) nodes.any(func(btn): btn.button_connect('pressed', Callable(self, 'on_btn_pressed').bind(btn, nodes))) -func on_btn_cancel_pressed(btn): +func on_btn_cancel_pressed(btn, nodes): signaller.emit_signal('interfer_off_all') await get_tree().create_timer(0.1).timeout btn.pressed = false + nodes.any(func(btn): btn.pressed = false) func on_btn_pressed(btn_this, btn_others): for btn_other in btn_others: btn_other.set_pressed(btn_this == btn_other) signaller.emit_signal('interfer_off_all') + signaller.emit_signal('rto_threat_unsel_all') if btn_this == $grd_forced/btn_panika: signaller.emit_signal('interfer_prenuditelno', panika_sectors) elif btn_this == $grd_forced/btn_jtids: diff --git a/scenes/frame-ecm-list/scroll-ecm-list.gd b/scenes/frame-ecm-list/scroll-ecm-list.gd index f9f55e8..c4f6683 100644 --- a/scenes/frame-ecm-list/scroll-ecm-list.gd +++ b/scenes/frame-ecm-list/scroll-ecm-list.gd @@ -17,7 +17,7 @@ const INTERFER_STATE = { 2: 'Ошибка', 3: 'Занято', 4: 'Неисправность', - 5: 'Передача' } + 5: ' ' } ## Состояние выполнения сеанса помехи @@ -126,6 +126,7 @@ func on_interfer_off(ecm, ecms, thrs, table_index): rehash(table_index) ecms.erase(ecm.ispp) thrs.erase(ecm.ispp) + interfer.push_id(ecm.ispp) ## Перестраивает индекс таблицы. Вызывать при удалении строки diff --git a/scenes/работа/sld-mode.gd b/scenes/работа/sld-mode.gd index f8e97d4..c577743 100644 --- a/scenes/работа/sld-mode.gd +++ b/scenes/работа/sld-mode.gd @@ -3,10 +3,11 @@ extends VSlider const VAL_TO_LABEL = { 0: 'label0', 1: 'label1', 2: 'label2', 3: 'label3' } const VAL_TO_EVENT = { 0: 'manual_control', 1: 'interfer_auto', 2: 'threat_auto', 3: 'full_auto' } -func _ready(): _on_value_changed(3) +func _ready(): + on_value_changed(0) + signaller.connect('interfer_prenuditelno', Callable(self, 'on_interfer_prenuditelno')) - -func _on_value_changed(val): +func on_value_changed(val): val = int(val) for nm in VAL_TO_LABEL.values(): var lbl0 = get_node(nm) @@ -14,3 +15,7 @@ func _on_value_changed(val): var lbl1 = get_node(VAL_TO_LABEL[val]) lbl1.self_modulate.a = 1.0 signaller.emit_signal(VAL_TO_EVENT[val]) + +func on_interfer_prenuditelno(_interfer_sectors): + self.set_value_no_signal(0) + on_value_changed(0) diff --git a/scenes/работа/работа.gd b/scenes/работа/работа.gd index 24aa57c..9c417b9 100644 --- a/scenes/работа/работа.gd +++ b/scenes/работа/работа.gd @@ -64,13 +64,14 @@ const fs_sectors: Dictionary = { 1: [270.0, 360.0] } const fs_freq: Dictionary = { - 0: [370.0, 800.0, 200.0, 250.0], - 1: [800.0, 1065.0, 250.0, 300.0], - 2: [1065.0, 1180.0, 300.0, 350.0], - 3: [1180.0, 1450.0, 350.0, 400.0], - 4: [1450.0, 2000.0, 400.0, 450.0], - 5: [2000.0, 3500.0, 450.0, 500.0], - 6: [3500.0, 6000.0, 500.0, 550.0] } + 0: [390.0, 510.0, 200.0, 250.0, 433.0], + 1: [800.0, 1065.0, 250.0, 300.0, 860.0], + 2: [1065.0, 1210.0, 300.0, 350.0, 1137.0], + 3: [1150.0, 1280.0, 350.0, 400.0, 1227.0], + 4: [1490.0, 2000.0, 400.0, 450.0, 1575.0], + 5: [2000.0, 3500.0, 450.0, 500.0, 2450.0], + 6: [3500.0, 6000.0, 500.0, 550.0, 5800.0] + } ## Размеры карты для разных режимов РТО и РЛС соответственно const map_sizes = [ @@ -171,17 +172,18 @@ func get_all_nodes(root): func map_threat_to_bip(th: threats.Threat, bip: Control): var freq = th.freq var sector_key = null + var sector_width = 50.0 for key in fs_freq: var freq_range = fs_freq[key] + var num_values = (freq_range[1]- freq_range[0]) / sector_width if freq_range[0] <= freq and freq <= freq_range[1]: sector_key = key break - if sector_key != null: - var fsf = fs_freq[sector_key] - radius_internal = fsf[2] - radius_outter = fsf[3] - freq_low = fsf[0] - freq_high = fsf[1] + if sector_key!= null: + radius_internal = fs_freq[sector_key][2] + radius_outter = fs_freq[sector_key][3] + freq_low = fs_freq[sector_key][0] + freq_high = fs_freq[sector_key][1] bip.position = tools.pos_calc( th.freq, th.aoa, @@ -299,6 +301,8 @@ func on_button_select(btn_this, btn_others) -> void: ## Поведение радиокнопок в группе. Управляет состоянием кнопок в радиогруппе. func on_button_pressed(btn_this, btn_others) -> void: + $vslider.set_value_no_signal(0) + $vslider.on_value_changed(0) var fs_arr: Array = [] for btn_other in btn_others: btn_other.set_pressed(btn_this == btn_other) var interfer_name: String = btn_this.get_meta('rfi_name') @@ -458,7 +462,7 @@ func set_ecm_btns_state(value: bool): func get_fs_param(index: int) -> Array: - var freq = (fs_freq[index / 4][0] + fs_freq[index / 4][1])/2 + var freq = (fs_freq[index / 4][4]) var sector = (fs_sectors[index % 4][0] + fs_sectors[index % 4][1])/2 - 45.0 if sector < 0: sector += 360.0 @@ -504,6 +508,7 @@ func on_fs_update_color(ecms): set_fs_color(ecm) update_fs_colors() + func on_interfer_prenuditelno (prenuditelno_sectors, btns): for key in prenuditelno_sectors: var sectors = [] diff --git a/scenes/работа/работа.tscn b/scenes/работа/работа.tscn index 15faac2..ed58136 100644 --- a/scenes/работа/работа.tscn +++ b/scenes/работа/работа.tscn @@ -188,7 +188,6 @@ offset_right = 1143.0 offset_bottom = 1055.0 scale = Vector2(-1, 1) max_value = 3.0 -value = 3.0 tick_count = 4 ticks_on_borders = true script = ExtResource("12_gqdkl") @@ -254,4 +253,4 @@ vertical_alignment = 1 [connection signal="drag_begin" from="." to="." method="_on_drag_begin"] [connection signal="drag_continue" from="." to="." method="_on_drag_continue"] -[connection signal="value_changed" from="vslider" to="vslider" method="_on_value_changed"] +[connection signal="value_changed" from="vslider" to="vslider" method="on_value_changed"] diff --git a/scripts/interfer.gd b/scripts/interfer.gd index 26f65bd..8ac8d4f 100644 --- a/scripts/interfer.gd +++ b/scripts/interfer.gd @@ -35,6 +35,7 @@ var id_array: Array ## Массив id воздействий. var thrs: Dictionary ## Словарь воздействия для целей, ключ - id воздействия. var fs: Dictionary ## Словарь воздействий для секторов, ключ - id воздействия. var cu: Dictionary ## Словарь воздействий для 5П-28, ключ - id воздействия. +var auto_status: int = 0 # Статус скролла автомата ## Сеанс помехи. class Interfer: @@ -114,6 +115,9 @@ func _ready(): signaller.connect('interfer_off_all', Callable(self, 'on_interfer_off_all').bind(unit, ecms)) signaller.connect('th_aoa_update', Callable(self, 'on_th_aoa_update').bind(ecms, unit)) signaller.connect('interfer_off', Callable(self, 'on_interfer_off')) + signaller.connect('manual_control', Callable(self, 'on_manual_control')) + signaller.connect('full_auto', Callable(self, 'on_full_auto')) + signaller.connect('interfer_prenuditelno', Callable(self, 'on_interfer_prenuditelno')) threats.connect('threat_lost', Callable(self, 'on_threats_lost').bind(ecms, unit)) @@ -126,6 +130,11 @@ func on_timer_check_state(unit, ecms, resend_timeout): send_ecm(ecm, unit) ecm.tick_tx = tick +func on_manual_control(): + auto_status = 0 + +func on_full_auto(): + auto_status = 3 func on_th_aoa_update(threats: Dictionary, ecms: Dictionary, unit): for thr in threats.values(): @@ -138,6 +147,15 @@ func on_th_aoa_update(threats: Dictionary, ecms: Dictionary, unit): send_ecm(ecm, unit) signaller.emit_signal('fs_update_color', ecms) + if auto_status == 0: + return + + if auto_status == 3: + for thr in threats.values(): + thr.auto_selected = true + signaller.emit_signal('interfer_init', 'lchm1', []) + thr.auto_selected = false + ## Производит приём состояния помех. [param unit] -> [param ecms]. func on_data_capsrpb_received(unit: capsrpb.CapsRpb, ecms: Dictionary): @@ -211,11 +229,12 @@ func on_interfer_rcv(interfer_params: Array, unit, ecms): func interfer_create(interfer_name, ecms, param, kni, id, dict, source_interfer): + print_debug(ecms) var ispp: int = 0 if interfer_name == 'k1': param['dur'] = 1.0 # Необходимо добавить параметры управления param['period'] = 1.0 # Необходимо добавить параметры управления - var key = dict.find_key(id) + var key = ecms.find_key(id) if source_interfer != SOURCE_INTERFER[2]: if key != null: ispp = key @@ -225,6 +244,7 @@ func interfer_create(interfer_name, ecms, param, kni, id, dict, source_interfer) ispp = pop_id() if ispp == 0: return else: ispp = id + print_debug(id_array) dict[ispp] = id msg_ss += 1 var ecm: Interfer @@ -234,7 +254,7 @@ func interfer_create(interfer_name, ecms, param, kni, id, dict, source_interfer) ecm = Interfer.new() ecm.ispp = ispp ecms[ispp] = ecm - ecm.svk = STATE_TSMT # Подготовка к передаче сообщения + ecm.svk = STATE_TSMT # Подготовка к передаче сообщения ecm.ss = msg_ss ecm.kni = kni ecm.krp = interfer_name @@ -244,7 +264,6 @@ func interfer_create(interfer_name, ecms, param, kni, id, dict, source_interfer) signaller.emit_signal('interfer_new', ecm) if interfer_name == 'off': signaller.emit_signal('interfer_off', ecm, ecms, thrs) - push_id(ecm.ispp) thrs.erase(ispp) ecm.tick_tx = Time.get_ticks_msec() @@ -257,7 +276,6 @@ func send_ecm(ecm, unit): func on_interfer_off_all(unit, ecms): for ecm in ecms.values(): ecm.krp = INTERFER_OFF - push_id(ecm.ispp) send_ecm(ecm, unit) signaller.emit_signal('interfer_off',ecm, ecms, thrs) @@ -267,7 +285,6 @@ func on_threats_lost(th, ecms, unit): var ecm_id = key var ecm = ecms[ecm_id] ecm.krp = INTERFER_OFF - push_id(ecm.ispp) send_ecm(ecm, unit) signaller.emit_signal('interfer_off',ecm, ecms, thrs) diff --git a/scripts/signaller.gd b/scripts/signaller.gd index 0c10356..f41b4a4 100644 --- a/scripts/signaller.gd +++ b/scripts/signaller.gd @@ -142,7 +142,6 @@ signal map_coords_changed(lan: float, lat: float) ## [param mode] - Вновь установленный режим. signal map_mode_changed(mode: int) - ## Вызывается при обновлении позиции(угла) цели.[br] signal th_aoa_update(threats: Dictionary) @@ -150,3 +149,5 @@ signal th_aoa_update(threats: Dictionary) ## <...>[br] ## [param ecms] - <...> signal fs_update_color(ecms: Dictionary) + +signal socket_error(error: String) diff --git a/scripts/threats.gd b/scripts/threats.gd index f4a53c7..793485e 100644 --- a/scripts/threats.gd +++ b/scripts/threats.gd @@ -27,6 +27,7 @@ class Threat: var tmod: String ## Тип модуляции. var width: float ## Ширина занимаемого диапазона частот, МГц. var selected: bool ## Флаг, что цель выбрана. + var auto_selected: bool = false #Флаг автомата для целей func _init(): clear_fflags() func _to_string() -> String: return 'номер: %d пеленг: %0.1f частота: %0.1f МГц' % [id, aoa, freq] @@ -59,7 +60,7 @@ func _ready() -> void: timer_check_lost.connect('timeout', Callable(self, 'on_timer_check_lost').bind(settings.ThreatParams.time_lost, threats)) timer_check_lost.start(settings.ThreatParams.time_lost / 1000.0) timer_aoa_update.connect('timeout', Callable(self, 'on_timer_aoa_update').bind(threats)) - timer_aoa_update.start(0.25) + timer_aoa_update.start(1.00) signaller.connect('rto_threat_sel', Callable(self, 'on_rto_threat_sel').bind(threats)) signaller.connect('rto_threat_unsel', Callable(self, 'on_rto_threat_unsel').bind(threats)) signaller.connect('rto_threat_unsel_all', Callable(self, 'on_rto_threat_unsel_all').bind(threats)) @@ -112,6 +113,8 @@ func on_interfer_init(interfer_name, fs_arr, threats): for threat in threats.values(): if threat.selected: sel_threats.append(threat) + if threat.auto_selected: + sel_threats.append(threat) if len(sel_threats) or (len(fs_arr)): signaller.emit_signal('interfer_create', interfer_name, sel_threats, fs_arr)