Merge remote-tracking branch 'MaD_CaT/master-prd'

# Conflicts:
#	scenes/frame-ecm-list/scroll-ecm-list.gd
#	scenes/настройки/настройки.gd
#	scenes/работа/работа.gd
#	scenes/эмс2/эмс2.tscn
This commit is contained in:
sasha80
2025-12-15 14:30:48 +03:00
28 changed files with 587 additions and 265 deletions

View File

@@ -289,10 +289,10 @@ func on_th_aoa_update(threats: Dictionary, ecms: Dictionary, unit_instance) -> v
var ecm_active = true
if not gos_flag:
if ecm.nmfs in gos_nmfs:
interfer_off(ecm, unit_instance)
signaller.emit_signal('interfer_off', ecm)
ecm_active = false
if ecm_active and (prd.fs_caps_id[ecm.nmfs] in fs_closed):
interfer_off(ecm, unit_instance)
signaller.emit_signal('interfer_off', ecm)
var th_id = thr.id
for ecm_i in thrs.keys():
@@ -302,9 +302,9 @@ func on_th_aoa_update(threats: Dictionary, ecms: Dictionary, unit_instance) -> v
ecm.kni = fposmod(thr.aoa - course, 360)
call_ecm_proc(ecm)
if ecm.nmfs in gos_nmfs:
interfer_off(ecm, unit_instance)
signaller.emit_signal('interfer_off', ecm)
elif prd.fs_caps_id[ecm.nmfs] in fs_closed:
interfer_off(ecm, unit_instance)
signaller.emit_signal('interfer_off', ecm)
else:
send_ecm(ecm, unit_instance)
signaller.emit_signal('fs_update_color', ecms)
@@ -394,7 +394,7 @@ func on_interfer_create(interfer_name, sel_threats, fs_arr, power, u, ecms) -> v
for ecm in ecms.values():
if ecm.nmfs == item.nmfs:
if item.priority > ecm.priority:
interfer_off(ecm, u)
signaller.emit_signal('interfer_off', ecm)
elif item.priority < ecm.priority:
need_continue = true
break
@@ -508,7 +508,6 @@ 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 ecm.modulation:
ecm.svk = 0
call_deferred('emit_signal', 'interfer_update', ecm)
return
msg6_num += 1
@@ -516,17 +515,17 @@ func send_ecm(ecm, unit0) -> void:
unit0.tx_stack.append(json_data)
func on_interfer_off_all(unit0, ecms: Dictionary) -> void:
func on_interfer_off_all(_unit0, ecms: Dictionary) -> void:
for ecm in ecms.values():
interfer_off(ecm, unit0)
signaller.emit_signal('interfer_off', ecm)
func on_threats_lost(th, ecms, unit0) -> void:
func on_threats_lost(th, ecms, _unit0) -> void:
for key in interfer.thrs:
if interfer.thrs[key] == th.id:
var ecm_id = key
var ecm = ecms[ecm_id]
interfer_off(ecm, unit0)
signaller.emit_signal('interfer_off', ecm)
func pop_id() -> int:
@@ -653,19 +652,36 @@ func get_krp(threat: threats.Threat):
for key in ITERFER_MODE.keys():
var ecm_params = ITERFER_MODE[key][1]
if not ecm_params.has('files'): continue
if ecm_params['files'] == threat.rparams['filename']:
krp = key
return krp
if typeof(ecm_params['files']) == TYPE_DICTIONARY:
for value in ecm_params['files'].values():
if typeof(value) == TYPE_STRING:
if value == threat.rparams['filename']:
krp = key
return krp
elif typeof(value) == TYPE_ARRAY:
if value[0] == threat.rparams['filename']:
krp = key
return krp
elif typeof(ecm_params['files']) == TYPE_STRING:
if ecm_params['files'] == threat.rparams['filename']:
krp = key
return krp
return krp
func on_interfer_off(ecm: Interfer, _ecms, unit_caps):
func on_interfer_off(ecm: Interfer, ecms, unit_caps):
ecm.krp = INTERFER_OFF
send_ecm(ecm, unit_caps)
func interfer_off(ecm, _unit_caps):
signaller.emit_signal('interfer_off', ecm)
if not unit_caps.online:
var sz = ecms.size()
signaller.emit_signal('on_prog_ecm_off', ecm)
ecms.erase(ecm.ispp)
thrs.erase(ecm.ispp)
cu.erase(ecm.ispp)
fs.erase(ecm.ispp)
push_id(ecm.ispp)
if sz != ecms.size():
interfer.call_deferred('emit_signal', 'interfer_resized', ecms)
func on_interfer_new(ecm, unit_caps):

View File

@@ -2,6 +2,8 @@ extends Node
enum PrdState {WORK, CONTROL}
const TIME_YAU07_SEND = 50
## Границы секторов блоков ФС по частоте в режиме РТО.
const FS_BAND_RTO: Dictionary = {
0: [200.0, 250.0],
@@ -119,6 +121,9 @@ class Fs:
var freq_caps_rx: float = 0.0 ## Частота принятая от КАПС РПБ
var width_caps_rx: float = 0.0 ## Ширина полосы принятая от КАПС РПБ
var msvk: Array
var ready: bool = false ## Готовность сектора к излучению
var caps_online: bool = false ## Состояние связи с КАПС РПБ
var yau_07_online: bool = false ## Состояние связи ЯУ-07
signal update_modulation(index)
@@ -149,6 +154,9 @@ class Fs:
data_arr.append(um_port)
data_arr.append(val)
# Установка готовности модуля ФС к излучению
func set_ready():
ready = isg and caps_online and yau_07_online
class PRD:
enum STATE_DEVICE {
@@ -208,7 +216,6 @@ class PRD:
if port == fs.um_port:
fs.um_code_rx = u.isa_ports[port] & 0x7
func on_line_changed(unit_ems):
if not unit_ems.online:
yemsg_board.ems_load = yemsg_board.LoadState.NOT_DEFINED
@@ -303,7 +310,6 @@ class PRD:
break
return STATE_DEVICE.NONE if all_online else STATE_DEVICE.ERROR
func execute_cmd():
if not len(cmd_array): return
if unit_yau07.cmd_state != unit_yau07.CmdState.DONE: return
@@ -338,14 +344,16 @@ class PRD:
yemsg_board.set_wait()
log.error('Не удалось прочитать файл настроек ячейки ЭМС-Г %s' %abs_dir)
func on_update_modulation(index):
yemsg_board.add_cmd(index/4, fs_dic[index].modulation)
func set_um(data_arr):
cmd_array.append([unit_yau07.CmdCode.WRITE_ISA, data_arr])
func set_fs_caps_online(caps_online: bool):
for fs in fs_dic.values():
fs.caps_online = caps_online
fs.set_ready()
func _ready() -> void:
check_dir()
@@ -353,6 +361,7 @@ func _ready() -> void:
var unit_prd = network.get_unit_instance(prd_name)
var new_prd = PRD.new(prd_name, unit_prd)
prd_dict[prd_name] = new_prd
new_prd.unit_yau07.connect('line_changed', on_yau07_line_changed.bind(new_prd))
var unit_control = TestPRD.new({'unit_prd': unit_prd}, new_prd.cmd_array)
add_child(unit_control)
new_prd.unit_control = unit_control
@@ -367,6 +376,7 @@ func _ready() -> void:
fs_caps_id[FS_PRD[key][1]] = key
var unit_caps = network.get_unit_instance('уарэп-капсрпб')
unit_caps.connect('data_received', Callable(self, 'on_data_capsrpb_received'))
unit_caps.connect('line_changed', Callable(self, 'on_caps_line_changed'))
signaller.connect('режим_контроль', Callable(self, 'on_mode_changed').bind(PrdState.CONTROL))
signaller.connect('режим_работа', Callable(self, 'on_mode_changed').bind(PrdState.WORK))
var unit_nav = network.get_unit_instance('навигация')
@@ -433,7 +443,6 @@ func update_fs_state(ecms, trenaz_mode: bool):
prd_module.set_um(um_data_array)
## Проверяет ниличие директории, если их нет, создаёт
func check_dir():
var dir = DirAccess.open(yemsconsts.emsg_files_folder)
@@ -461,6 +470,7 @@ func on_data_capsrpb_received(unit0: capsrpb.CapsRpb):
var fs_module = fs_dict[ii]
if fs.has('isg'):
fs_module.isg = int(fs['isg'])
fs_module.set_ready()
if fs.has('pow'):
fs_module.pow_caps_rx = int(fs['pow'])
if fs.has('freq'):
@@ -479,3 +489,16 @@ func on_mode_changed(changed_mode: int) -> void:
func on_navi_data_received(data: Dictionary):
course = data.get('k', 0.0)
func on_caps_line_changed(unit_caps):
for pribor_prd in prd_dict.values():
pribor_prd.set_fs_caps_online(unit_caps.online)
signaller.emit_signal('fs_update_state', fs_dict)
func on_yau07_line_changed(unit_yau07, prd_pribor):
for fs in prd_pribor.fs_dic.values():
fs.yau_07_online = unit_yau07.online
fs.set_ready()
signaller.emit_signal('fs_update_state', fs_dict)

View File

@@ -14,7 +14,7 @@ const PROGRESS_RAY_STATES: float = 50.0
const PROGRESS_COMPLETE: float = 100.0
## Константы для работы с лучами управления
const COUNT_PACK_POWER_RECIEVE = 15
const COUNT_PACK_POWER_RECIEVE = 10
const RAY_MASK = 0x07
const SPECIAL_LITERAS = [3, 5, 7]
const RAY_m5: String = 'RAY_m5'
@@ -160,7 +160,7 @@ var current_status: String = 'Ожидание запуска контроля'
## Сигналы класса
signal control_is_over(device_name: String) # Когда контроль завершен
signal status_updated(status_text: String) # Сигнал для обновления статуса
signal control_results_updated(control_results: Dictionary) # Обновление результатов контроля
signal control_results_updated(control_results: Dictionary) # Обновление результатов контроля
signal update_progress(progress_value: float) # Обновление статуса выполнения контроля
signal update_max_value_progress(max_progress_value: int) # Установка максимального значения для прогресс бара
@@ -289,6 +289,8 @@ func _process(_delta: float) -> void:
## Обработка данных от ЯУ-07
func on_data_received(unit_pribor: Object) -> void:
var status: PackedByteArray = unit_pribor.status
if status.size() < 100: push_error('Принимаемые значения от ЯУ-07б:%s не коррентны. (размер пакета: %d)' % [self_name, status.size()]); return
temperature_um = check_temperature_um(status)
flags.temperature_ok = check_overheating(temperature_um)
block_ip_config = check_block_ip(status, block_ip_config)
@@ -390,7 +392,6 @@ func _handle_init_state() -> void:
if _get_current_ecm(): return
state = STATE_MACHINE.CHEK_KASSETA_Y5
else:
if _get_current_ecm(): return
# Завершение контроля если литеры закончились
flags.control_is_over = true
power_result = prep_power(power_for_litera, self_name)
@@ -996,18 +997,17 @@ static func on_y5_control_result(block_kasseta: Dictionary) -> bool:
## Установка угла и аттенюации для УМ
static func on_ug_setting(prd_unit: Object, settings_ug: Dictionary, prd_cmd_array: Array, cur_litera: int) -> bool:
var result_1: int
var result_2: int
if cur_litera == 1:
result_1 = ((settings_ug.ATT_UM_1 & 0x07) << 3) | (settings_ug.RAY_DOU_NUM & 0x07)
prd_cmd_array.append([prd_unit.CmdCode.WRITE_ISA, [settings_ug.ADDR_UG_LITERA_1, result_1]])
prd_cmd_array.append([prd_unit.CmdCode.WRITE_ISA, [settings_ug.ADDR_UG_LITERA_3, settings_ug.ATT_UM_3]])
else:
#if cur_litera in [2, 4, 6]:
result_1 = ((settings_ug.ATT_UM_1 & 0x07) << 3) | (settings_ug.RAY_DOU_NUM & 0x07)
prd_cmd_array.append([prd_unit.CmdCode.WRITE_ISA, [settings_ug.ADDR_UG_LITERA_1, result_1]])
#elif cur_litera in [3, 5, 7]:
result_2 = ((settings_ug.ATT_UM_2 & 0x07) << 3) | (settings_ug.RAY_DOU_NUM & 0x07)
prd_cmd_array.append([prd_unit.CmdCode.WRITE_ISA, [settings_ug.ADDR_UG_LITERA_2, result_2]])
if cur_litera in [2, 4, 6]:
result_1 = ((settings_ug.ATT_UM_1 & 0x07) << 3) | (settings_ug.RAY_DOU_NUM & 0x07)
prd_cmd_array.append([prd_unit.CmdCode.WRITE_ISA, [settings_ug.ADDR_UG_LITERA_1, result_1]])
elif cur_litera in [3, 5, 7]:
result_1 = ((settings_ug.ATT_UM_2 & 0x07) << 3) | (settings_ug.RAY_DOU_NUM & 0x07)
prd_cmd_array.append([prd_unit.CmdCode.WRITE_ISA, [settings_ug.ADDR_UG_LITERA_2, result_1]])
return true

View File

@@ -204,7 +204,7 @@ signal update_coordinates_map(new_coordinates)
## Вызывается при изменении исправности прибора УФ.[br]
## [param uf_serviceaability] - обновленное значение состояния исправности ([b]true[/b]
signal update_uf_serviceability(uf_serviceaability: bool)
signal update_uf_serviceability(uf_serviceaability: int)
signal tool_tip(new_ctrl_pos)

View File

@@ -2,6 +2,8 @@ extends Node
## Работа с целями.
var gos_flag = true ## Флаг работать по своим целям
var gos_protocols: PackedStringArray ## Список протоколов своих целей
## Цель
class Threat:
@@ -15,7 +17,7 @@ class Threat:
var id: int ## Идентификатор цели.
var lat: float ## Текущие координаты, широта в градусах.
var lon: float ## Текущие координаты, долгота в градусах.
var power: float ## Уровень принимаемого сигнала, дБм.
var pow: float ## Уровень принимаемого сигнала, дБм.
var proto: String ## Тип протокола источника сигнала.
var rkrp: String ## Рекомендуемый режим помехи.
var rparams: Dictionary ## Рекомендуемые параметры помехи.
@@ -31,6 +33,7 @@ class Threat:
var emit_state: int = 0 ## 0 - подавление не назначено, 1 - назначено, 2 - выполняется
var nmfs: int ## Индекс модуля ФС, в зону действия которого попала цель
var priority: int ## Приоритет опасности цели
var gos: bool = false ## Своя или чужая цель
func _init(): clear_fflags()
func _to_string() -> String: return 'номер: %d пеленг: %0.1f частота: %0.1f МГц' % [id, aoa, freq]
@@ -69,6 +72,8 @@ func _ready() -> void:
signaller.connect('threat_selected', Callable(self, 'on_threat_selected').bind(threats))
signaller.connect('interfer_init', Callable(self, 'on_interfer_init').bind(threats))
ProjectSettings.connect('settings_changed', on_settings_changed.bind(threats))
## Периодически удаляет устаревшие цели.
func on_timer_check_lost(time_lost: int, threats: Dictionary):
@@ -147,12 +152,31 @@ func on_data_capsrpb_received(unit: capsrpb.CapsRpb, threats: Dictionary):
th.priority = 1
else:
th.priority = 0
set_gos(th)
call_deferred('emit_signal', 'threat_update', th)
else:
var th: = Threat.new()
th.set_from_dic(dic_th)
threats[id] = th
th.tick_rx = unit.tick
set_gos(th)
call_deferred('emit_signal', 'threat_new', th)
if sz != threats.size():
call_deferred('emit_signal', 'threats_resized', threats)
func on_settings_changed(ths):
gos_flag = ProjectSettings.get_setting('application/config/Включить работу по своим целям', true)
var protocols: String = ProjectSettings.get_setting('application/config/Список своих протоколов', '')
gos_protocols = protocols.split(",", true)
for th in ths.values():
set_gos(th)
func set_gos(th: Threat):
if gos_flag:
th.gos = false
elif (th.proto in gos_protocols) and th.fflags.proto:
th.gos = true

View File

@@ -72,6 +72,8 @@ class YaU07 extends unit.Unit:
rc = Error.OK
cmd_tick_tx = tick
cmd_retry -= 1
cmd_num_tx = (cmd_num_rx + 1) % 0xffff
tx_data.encode_u16(2, cmd_num_tx)
else:
cmd_state = CmdState.FAIL
emit_signal('command_fail', self)