diff --git a/project.godot b/project.godot index 573868b..922bfd4 100644 --- a/project.godot +++ b/project.godot @@ -28,7 +28,7 @@ interfer/center_offset=Vector2(200, 225) interfer/default_color0=Color(0.38, 0.47, 0.51, 1) interfer/default_color1=Color(0.39, 0.44, 0.5, 1) interfer/select_color=Color(1, 1, 1, 1) -interfer/interfer_color=Color(0.92379, 0.0965192, 0.249261, 1) +interfer/interfer_color=Color(0.9, 0.1, 0.25, 0.9) interfer/resend_timeout=1000.0 config/external_cu=false config/unit_rr_request_period=20.0 @@ -36,7 +36,7 @@ config/kems_files_path="user://kems/" config/emsg_files_path="user://emsg/" config/settings_path="user://settings.json" config/unit_bpo_request_period=20.0 -interfer/emit_color=Color(0.92549, 0.0980392, 0.25098, 0.509804) +interfer/emit_color=Color(0.9, 0.1, 0.25, 0.5) interfer/closed_sectors=Color(0, 0, 0, 1) [autoload] diff --git a/scenes/frame-ecm-list/scroll-ecm-list.gd b/scenes/frame-ecm-list/scroll-ecm-list.gd index 23f9d4c..8ad0a9f 100644 --- a/scenes/frame-ecm-list/scroll-ecm-list.gd +++ b/scenes/frame-ecm-list/scroll-ecm-list.gd @@ -122,7 +122,8 @@ func on_interfer_new(ecm, table_index): # Будем надеяться, что отложенные вызовы производятся в том же порядке $table.call_deferred('clear_rows_selected') $table.call_deferred('set_row_selected', i_row, true) - signaller.emit_signal('interfer_selected', ecm) + if not interfer.auto_enabled: + signaller.emit_signal('interfer_selected', ecm) func on_interfer_off(ecm, table_index): diff --git a/scenes/tilemap/23900.png b/scenes/tilemap/23900.png index b7ca1d1..f8e3ab0 100644 Binary files a/scenes/tilemap/23900.png and b/scenes/tilemap/23900.png differ diff --git a/scenes/tilemap/ship_mark.tscn b/scenes/tilemap/ship_mark.tscn index 888ea82..fbf2558 100644 --- a/scenes/tilemap/ship_mark.tscn +++ b/scenes/tilemap/ship_mark.tscn @@ -3,6 +3,5 @@ [ext_resource type="Texture2D" uid="uid://cj1f2uy6qfvki" path="res://scenes/tilemap/23900.png" id="1_v0nwa"] [node name="23900" type="Sprite2D"] -rotation = 4.71239 scale = Vector2(0.496934, 0.496934) texture = ExtResource("1_v0nwa") diff --git a/scenes/настройки/настройки.tscn b/scenes/настройки/настройки.tscn index b77ce24..9a6497d 100644 --- a/scenes/настройки/настройки.tscn +++ b/scenes/настройки/настройки.tscn @@ -64,7 +64,7 @@ const SETTING_TABLE = [ ['Адрес БПО правого борта', TableEdit, TableEdit, 'http-адрес для запроса состояния прибора БПО'], ['Период опроса состояния БПО, секунды', TableEdit, TableEdit, 'Время в секундах' ], ['Период опроса состояния АФСП, секунды', TableEdit, TableEdit, 'Время в секундах' ], - ['уареп-трасса', TableEdit, TableEdit, 'IP-адрес для связи с Трассой [<адрес этого узла>, <адрес удалённого узла>, <порт этого узла>, <порт удалённого узла>]'], + ['уарэп-трасса', TableEdit, TableEdit, 'IP-адрес для связи с Трассой [<адрес этого узла>, <адрес удалённого узла>, <порт этого узла>, <порт удалённого узла>]'], ['Включить работу по своим целям', TableEdit, TableToggle, 'Разрешает работу в секторе со своей целью'], ['Список своих протоколов', TableEdit, TableEdit, 'Список протоколов целей, по которым запрещено работать' ], ] diff --git a/scenes/работа/работа.gd b/scenes/работа/работа.gd index 98bb536..2079510 100644 --- a/scenes/работа/работа.gd +++ b/scenes/работа/работа.gd @@ -31,7 +31,8 @@ var strob_band_begin: float ## Ширина строба в моме var strob_dir_begin: float ## Направление антенны в момент начала перетаскивания. var strob_width_begin: float ## Ширина строба по углу в момент начала перетаскивания. var view_mode: MapViewMode ## Режим отображения карты -var thrs_dict: Dictionary ## Ссылка на словарь целей +var thrs_dict: Dictionary ## Ссылка на словарь целей +var gos_flag = true ## Флаг работать по своим целям var color_ecm: Color var color_select: Color var color_emit: Color @@ -92,6 +93,7 @@ func on_enter_tree() -> void: call_deferred('on_button_strobe_pressed') func on_settings_changed(): + gos_flag = ProjectSettings.get_setting('application/config/Включить работу по своим целям', true) color_emit = ProjectSettings.get_setting('application/interfer/emit_color', Color(0.58, 0.47, 0.51, 1.0)) color_ecm = ProjectSettings.get_setting('application/interfer/interfer_color', Color(0.58, 0.47, 0.51, 1.0)) color_select = ProjectSettings.get_setting('application/interfer/select_color', Color(1.0, 1.0, 1.0, 1.0)) @@ -109,9 +111,7 @@ func on_settings_changed(): ## Обработчик сигнала изменения списка целей. func on_threats_resized(ths: Dictionary): - $count_all_pad/count_all.text = '%02d' % ths.size() - var c: int = ths.values().filter(func(th: threats.Threat): return th.proto != '').size() - $count_danger_pad/count_danger.text = '%02d' % c + count_threats(ths) thrs_dict = ths @@ -531,7 +531,6 @@ func update_fs_colors(): $btn_activate.self_modulate = Color.WHITE - func unsel_fs_all(need_btns_off: bool): fs_selected.clear() update_fs_colors() @@ -625,6 +624,14 @@ func _on_btn_all_work_pressed() -> void: func on_th_aoa_update(ths): + count_threats(ths) + + +func count_threats(ths): $count_all_pad/count_all.text = '%02d' % ths.size() - var c: int = ths.values().filter(func(th: threats.Threat): return th.proto != '').size() + var c: int = 0 + if gos_flag: + c = ths.values().filter(func(th: threats.Threat): return th.proto != '').size() + else: + c = ths.values().filter(func(th: threats.Threat): return ((th.proto != '') and th.proto not in interfer.gos_protocols)).size() $count_danger_pad/count_danger.text = '%02d' % c diff --git a/scripts/interfer.gd b/scripts/interfer.gd index 3381836..b79416d 100644 --- a/scripts/interfer.gd +++ b/scripts/interfer.gd @@ -125,6 +125,7 @@ class Interfer: var modulation: bool ## Модуляция для включения усилителей var um: float ## Угол места для помехи. var nmfs: int = 0 ## Номер модуля ФС в нумерации СТЦ + var priority: int = 0 ## Приоритет помехи func _to_string() -> String: return 'номер: %d название: %s частота: %0.1f МГц пеленг: %0.1f гр.' % [ispp, ITERFER_MODE[krp][0], params['freq'], kni] @@ -279,6 +280,28 @@ func on_th_aoa_update(threats: Dictionary, ecms: Dictionary, unit_instance) -> v if ecm_active and (prd.fs_caps_id[ecm.nmfs] in fs_closed): interfer_off(ecm, unit_instance) + var fs_arr: Array = [] + var th_aoa = fposmod(thr.aoa - course, 360) + prd.find_fs_index(th_aoa, thr.freq, fs_arr) + if fs_arr.size(): + for item in fs_arr: + var nmfs = prd.FS_PRD[item][1] + thr.nmfs = nmfs + if (thr.proto in gos_protocols) and thr.fflags.proto and (not gos_flag): + gos_nmfs.append(nmfs) + + thr.emit_state = 0 + for ecm in ecms.values(): + if thr.nmfs == ecm.nmfs: + set_th_emit(thr, ecm) + var ecm_active = true + if not gos_flag: + if ecm.nmfs in gos_nmfs: + interfer_off(ecm, unit_instance) + ecm_active = false + if ecm_active and (prd.fs_caps_id[ecm.nmfs] in fs_closed): + interfer_off(ecm, unit_instance) + var th_id = thr.id for ecm_i in thrs.keys(): if thrs[ecm_i] == th_id: @@ -366,13 +389,23 @@ func map_mpchf_to_seczaps(unit_instance: unit.Unit, _seczaps: Dictionary): ## Вызыватся, когда пользователь выбрал помеху и выбраны цели. func on_interfer_create(interfer_name, sel_threats, fs_arr, power, u, ecms) -> void: for item in sel_threats: + if auto_enabled: + var need_continue = false + for ecm in ecms.values(): + if ecm.nmfs == item.nmfs: + if item.priority > ecm.priority: + interfer_off(ecm, u) + elif item.priority < ecm.priority: + need_continue = true + break + if need_continue: continue var param: Dictionary = {} var kni: float = item.aoa - course if kni < 0: kni += 360.0 var id = item.id param['freq'] = item.freq - param['width'] = item.width + param['width'] = item.width * 1.5 if (item.rkrp != '') and item.fflags.rkrp and auto_enabled: var krp = get_krp(item) if krp != '': @@ -454,13 +487,16 @@ func interfer_create(u, interfer_name, ecms, param, kni, id, dict, source_interf ecm = Interfer.new() ecm.ispp = ispp ecms[ispp] = ecm + ecm.modulation = emit_enable ecm.kni = kni ecm.krp = interfer_name ecm.params = param ecm.powp = power ecm.source_interfer = source_interfer - ecm.modulation = emit_enable ecm.um = param.get('um', 15.0) # Значение по умолчанию + if source_interfer == SOURCE_INTERFER[0]: + if thrs_dict.has(dict[ispp]): + ecm.priority = thrs_dict[dict[ispp]].priority call_ecm_proc(ecm) var set_nmfs_ok = set_nmfs(ecm) if set_nmfs_ok != Error.OK: @@ -477,7 +513,7 @@ 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: + if not ecm.modulation: ecm.svk = 0 call_deferred('emit_signal', 'interfer_update', ecm) return @@ -512,8 +548,10 @@ 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): @@ -561,8 +599,12 @@ func on_threats_update(threat, ecms, unit_caps): for ecm_i in thrs.keys(): if thrs[ecm_i] == th_id: ecm = ecms[ecm_i] + ecm.priority = threat.priority ecm.params['freq'] = threat.freq - ecm.params['width'] = threat.width + var width = threat.width * 1.5 + if width < settings.WIDTH_MIN: + width = settings.WIDTH_MIN + ecm.params['width'] = width if (threat.rkrp != '') and threat.fflags.rkrp and auto_enabled: var krp = get_krp(threat) if krp != '': @@ -604,7 +646,7 @@ func set_rparams(threat: threats.Threat, params: Dictionary): if threat.rparams.has('width'): params['width'] = threat.rparams['width'] else: - params['width'] = threat.width + params['width'] = threat.width * 1.5 if threat.rparams.has('filename'): params['filename'] = threat.rparams['filename'] @@ -675,3 +717,4 @@ func set_th_emit(th: threats.Threat, ecm: Interfer): return else: th.emit_state = 1 + diff --git a/scripts/settings.gd b/scripts/settings.gd index 17e62c9..15d0ddc 100644 --- a/scripts/settings.gd +++ b/scripts/settings.gd @@ -51,7 +51,7 @@ var UnitProfiles: Dictionary[StringName, Array] = { \ const FREQ_MAX: = 6000.0 const FREQ_MIN: = 400.0 const WIDTH_MAX: = 120.0 -const WIDTH_MIN: = 0.0 +const WIDTH_MIN: = 5.0 const DUR_MAX: = 1000000.0 const PERIOD_MAX: = 1000000.0 const UM_MIN: = -5.0 diff --git a/scripts/signaller.gd b/scripts/signaller.gd index 82d2afe..d4ade28 100644 --- a/scripts/signaller.gd +++ b/scripts/signaller.gd @@ -223,3 +223,4 @@ signal start_contol_device() ## Вызывается при программном отключении помехи.[br] ## [param ecm] - выключаемая помеха ([b]true[/b] signal on_prog_ecm_off(ecm: interfer.Interfer) + diff --git a/scripts/threats.gd b/scripts/threats.gd index 5f39f51..1070cd2 100644 --- a/scripts/threats.gd +++ b/scripts/threats.gd @@ -29,7 +29,8 @@ class Threat: var selected: bool ## Флаг, что цель выбрана. var auto_selected: bool = false ## Флаг автомата для целей var emit_state: int = 0 ## 0 - подавление не назначено, 1 - назначено, 2 - выполняется - var nmfs:int ## Индекс модуля ФС, в зону действия которого попала цель + var nmfs: int ## Индекс модуля ФС, в зону действия которого попала цель + var priority: int ## Приоритет опасности цели func _init(): clear_fflags() func _to_string() -> String: return 'номер: %d пеленг: %0.1f частота: %0.1f МГц' % [id, aoa, freq] @@ -142,6 +143,10 @@ func on_data_capsrpb_received(unit: capsrpb.CapsRpb, threats: Dictionary): th.clear_fflags() th.set_from_dic(dic_th) th.tick_rx = unit.tick + if th.fflags.proto and th.proto != '': + th.priority = 1 + else: + th.priority = 0 call_deferred('emit_signal', 'threat_update', th) else: var th: = Threat.new()