Merge remote-tracking branch 'refs/remotes/kotik/prd-control'

This commit is contained in:
kira-a-k
2025-11-17 21:01:43 +03:00
21 changed files with 223 additions and 225 deletions

View File

@@ -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]
@@ -366,13 +367,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 +465,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 +491,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 +526,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 +577,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 +624,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']

View File

@@ -2,6 +2,7 @@ class_name TestPRD
extends Node
# Константы
const CONFIG_PATH = "user://config/setting_prd_control.json"
const DEFAULT_CONFIG_PATH = "res://config/setting_prd_control.json"
const RAY_m5: String = "RAY_m5"
const RAY_5: String = "RAY_5"
@@ -61,6 +62,7 @@ var flag_fs_status_ok: bool = false
var flag_si_fs_input: bool = false
var flag_si_fs_output: bool = false
var flag_in_control: bool = false
var flag_control_is_over: bool = false
var unit_prd: Object
var control_timer: Timer = Timer.new()
var ems_6666_timer: Timer = Timer.new()
@@ -109,7 +111,24 @@ func _get_ray_key(machine_state: int) -> String:
return _ray_state_mapping.get(machine_state, "")
func _ensure_config_exists() -> bool:
DirAccess.make_dir_recursive_absolute("user://config")
if FileAccess.file_exists(CONFIG_PATH):
return true
if not FileAccess.file_exists(DEFAULT_CONFIG_PATH):
return false
var src := FileAccess.open(DEFAULT_CONFIG_PATH, FileAccess.READ)
var dst := FileAccess.open(CONFIG_PATH, FileAccess.WRITE)
if src == null or dst == null:
return false
dst.store_string(src.get_as_text())
src.close()
dst.close()
return true
func _load_configuration() -> void:
if not _ensure_config_exists(): return
var config_file = FileAccess.open(CONFIG_PATH, FileAccess.READ)
if config_file:
var json_text = config_file.get_as_text()
@@ -184,13 +203,14 @@ func on_data_received(unit_pribor: Object) -> void:
return
_process_dkm_status(status)
if current_litera != 0:
if current_litera != 0: # Формирование мощностей в литерах
var tek_litera: Dictionary = power_for_litera[current_litera]
var interes = _get_ray_key(state)
if interes != '':
tek_litera[_get_ray_key(state)] = power_um_ukp(status, current_litera, tek_litera[_get_ray_key(state)])
power_for_litera[current_litera] = tek_litera
var ems_input_1: int
var ems_input_2: int
var ems_input_lit_1: int
@@ -202,17 +222,18 @@ var ems_output_lit_1: int
func _get_data_index(key: String) -> int:
return data_indices.get(key, -1)
func socket_status_ems_g(packet_form_yau_07: PackedByteArray) -> void:
if self_name in ['', '', '', '']:
ems_input_1 = (packet_form_yau_07.decode_u16(_get_data_index('IN_BLANK_PRD')) & (1 << 9)) != 0
ems_input_2 = (packet_form_yau_07.decode_u16(_get_data_index('IN_BLANK_PRD')) & (1 << 10)) != 0
if self_name in ['', '', '', '']:
ems_input_1 = (packet_form_yau_07.decode_u16(_get_data_index('IN_BLANK_PRD')) & (1 << 11)) != 0
ems_input_1 = (packet_form_yau_07.decode_u16(_get_data_index('IN_BLANK_PRD')) & (1 << 12)) != 0
ems_input_2 = (packet_form_yau_07.decode_u16(_get_data_index('IN_BLANK_PRD')) & (1 << 12)) != 0
if self_name in ['', '', '', '']:
ems_input_1 = (packet_form_yau_07.decode_u16(_get_data_index('IN_BLANK_PRD')) & (1 << 13)) != 0
ems_input_1 = (packet_form_yau_07.decode_u16(_get_data_index('IN_BLANK_PRD')) & (1 << 14)) != 0
ems_input_lit_1 = (packet_form_yau_07.decode_u16(_get_data_index('IN_BLANK_PRD')) & (1 << 8)) != 0
ems_input_1 = (packet_form_yau_07.decode_u16(_get_data_index('IN_BLANK_PRD')) & (1 << 13)) != 0
ems_input_2 = (packet_form_yau_07.decode_u16(_get_data_index('IN_BLANK_PRD')) & (1 << 14)) != 0
ems_output_1 = (packet_form_yau_07.decode_u16(_get_data_index('OUT_BLANK_PRD')) & (1 << 4)) != 0
ems_output_2 = (packet_form_yau_07.decode_u16(_get_data_index('OUT_BLANK_PRD')) & (1 << 5)) != 0
@@ -247,7 +268,6 @@ func on_fs_update_state(packet_type_7: Dictionary, fs_mapping: Dictionary) -> vo
func state_control_machine() -> void:
match state:
STATE_MACHINE.INIT:
print("Start control for %s device %s litera" % [self_name, current_litera])
_handle_init_state()
STATE_MACHINE.FS_TURN_ON:
_handle_fs_turn_on_state()
@@ -335,15 +355,24 @@ func state_control_machine() -> void:
STATE_MACHINE.STOP_CONTROL:
_handle_stop_control_state()
## В машине состояний вызов изменения состояния прогресс бара контроля
progressbar_status()
if block_kasseta_y5_config['yau07']:
progressbar_status()
## 'Выполняется инициализация ФС-%s' % current_litera
func _handle_init_state() -> void:
if current_litera in [1, 2, 3, 4, 5, 6, 7]:
if not ecms.size():
var flag_ecm: bool = false
for key in ecms:
var params = ecms[key].params.freq
if fs_parameters[current_litera].freq == params:
var kni = ecms[key].kni
if pribor_config[self_name].angle == kni:
flag_ecm = true
if not flag_ecm:
state = STATE_MACHINE.FS_TURN_ON
else:
flag_control_is_over = true
control_results = on_control_result(block_ip_config, control_results)
power_result = prep_power(power_for_litera, self_name)
emit_signal('control_is_over')
@@ -524,12 +553,12 @@ func setup_timer() -> void:
func on_mode_changed(in_tree: bool) -> void:
flag_in_control = in_tree
if not in_tree: ## TODO: Дополнительная проверка если контроль идет, если нет, то смысла вызывать нет
flag_control_is_over = false
progress_value = 0
machine_timer.stop()
state = STATE_MACHINE.INIT
_handle_fs_turn_off_state()
#prd_v_module.cmd_array.append([unit_prd_v.CmdCode.WRITE_ISA, [constants_v.ADDR_UG_LITERA_1, ug_work_1, constants_v.ADDR_UG_LITERA_2, ug_work_2]])
func _process_dkm_status(status: PackedByteArray) -> void:

View File

@@ -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

View File

@@ -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()