Merge remote-tracking branch 'lepshiy/master'

# Conflicts:
#	scenes/работа/работа.gd
#	scripts/signaller.gd
This commit is contained in:
MaD_CaT
2024-12-13 15:22:22 +03:00
8 changed files with 66 additions and 32 deletions

View File

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

View File

@@ -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)
## Перестраивает индекс таблицы. Вызывать при удалении строки

View File

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

View File

@@ -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 = []

View File

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

View File

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

View File

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

View File

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