Merge remote-tracking branch 'MaD_CaT/master'
# Conflicts: # scripts/signaller.gd
This commit is contained in:
@@ -5,6 +5,8 @@ extends Node
|
||||
|
||||
## Режимы помехи
|
||||
const ITERFER_MODE = {
|
||||
'off': ['Откл', ['freq', 'width']],
|
||||
'auto': ['АВТО', ['freq', 'width']],
|
||||
'srni1': ['СРН-И1', ['freq', 'width']],
|
||||
'srnm2': ['СРН-М2', ['freq', 'width']],
|
||||
'lchm1': ['ЛЧМ-1', ['freq', 'width']],
|
||||
@@ -19,6 +21,8 @@ const ITERFER_MODE = {
|
||||
'ozp1': ['ОЗП-1', ['freq', 'width']] }
|
||||
|
||||
const ID_INTERFERS_LEN = 63 ## Размер пула номеров целей
|
||||
const INTERFER_OFF = 'off'
|
||||
const STATE_TSMT = 5 ## Значение svk для цели, когда ответ ещё не получен
|
||||
var msg_ss: int = 0 ## счётчик сообщений
|
||||
var id_array: Array ## Массив id воздействий
|
||||
var thrs: Dictionary ## Словарь воздействия для целей, ключ - id воздействия
|
||||
@@ -35,15 +39,18 @@ class Interfer:
|
||||
var params: = {} ## Параметры помехи.
|
||||
var get_params: Array[String] ## Запрос массива параметров (список запрошенных параметров).
|
||||
var retss: int ## Значение счётчика сообщения в котором был произведён запрос массива параметров.
|
||||
var tick_rx: int ## Тик время обновления цели, мс.
|
||||
|
||||
var tick_tx: int ## Тик время обновления цели, мс.
|
||||
|
||||
func _to_string() -> String:
|
||||
return 'номер: %d название: %s частота: %0.1f МГц пеленг: %0.1f гр.' % [ispp, ITERFER_MODE[krp][0], params['freq'], kni]
|
||||
|
||||
func get_msg6_data():
|
||||
var data_to_json : Dictionary = {}
|
||||
data_to_json['ts'] = 6
|
||||
data_to_json['ss'] = ss
|
||||
data_to_json['ispp'] = ispp
|
||||
data_to_json['krp'] = krp
|
||||
if krp != 'off':
|
||||
if krp != INTERFER_OFF:
|
||||
data_to_json['kni'] = kni
|
||||
data_to_json['powp'] = powp # Необходимо добавить управление мощностью
|
||||
data_to_json['get'] = []
|
||||
@@ -56,7 +63,20 @@ class Interfer:
|
||||
var names: = tools.get_members_names(self)
|
||||
names.any(func(vn): if dic.has(vn): set(vn, dic[vn]); return false)
|
||||
|
||||
|
||||
func get_value(value_key):
|
||||
var param = self.get(value_key)
|
||||
if param == null:
|
||||
if params.has(value_key): param = params[value_key]
|
||||
return param
|
||||
|
||||
func set_value(value, value_key):
|
||||
var param = self.get(value_key)
|
||||
if param == null:
|
||||
params[value_key] = value
|
||||
else:
|
||||
self.set(value_key, value)
|
||||
|
||||
|
||||
signal interfer_preparing(ecm: Interfer) ## Вызывается в момент запуска помехи.
|
||||
signal interfer_run(ecm: Interfer) ## Вызывается в момент начала работы помехи.
|
||||
signal interfer_error(ecm: Interfer, msg: String) ## Вызывается при ошибке.
|
||||
@@ -70,17 +90,32 @@ func _ready():
|
||||
id_array.append(i + 1)
|
||||
var unit_key = repsettings.get_unit_key('уарэп-капсрпб-отп')
|
||||
var unit = repnetwork.units[unit_key]
|
||||
var timer_check_state: = Timer.new()
|
||||
add_child(timer_check_state)
|
||||
var resend_timeout = ProjectSettings.get_setting('application/interfer/resend_timeout', 1000.0)
|
||||
timer_check_state.connect('timeout', Callable(self, 'on_timer_check_state').bind(unit, ecms, resend_timeout))
|
||||
timer_check_state.start(resend_timeout / 1000.0)
|
||||
unit.connect('data_received', Callable(self, 'on_data_capsrpb_received').bind(ecms))
|
||||
signaller.connect('interfer_create', Callable(self, 'on_interfer_create').bind(unit, ecms))
|
||||
signaller.connect('interfer_new', Callable(self, 'send_ecm').bind(unit))
|
||||
|
||||
# Проверяет состояние отправки пакета и если не доставлен, повторяет отправку
|
||||
func on_timer_check_state(unit, ecms, resend_timeout):
|
||||
var tick = Time.get_ticks_msec()
|
||||
for ecm in ecms.values():
|
||||
if ecm.svk == STATE_TSMT:
|
||||
if (tick - ecm.tick_tx) >= resend_timeout:
|
||||
send_ecm(ecm, unit)
|
||||
ecm.tick_tx = tick
|
||||
|
||||
|
||||
## Производит приём состояния помех. [param unit] -> [param ecms]
|
||||
func on_data_capsrpb_received(unit: capsrpb.CapsRpb, ecms: Dictionary):
|
||||
if not unit.json_dic.has('ts'): return
|
||||
if not (unit.json_dic['ts'] is int): return
|
||||
if unit.json_dic['ts'] != 5: return
|
||||
if not unit.json_dic.has('msvk'): return
|
||||
if not unit.json_dic.has('ts'): return
|
||||
if not (unit.json_dic['ts'] is float): return
|
||||
if unit.json_dic['ts'] != 5: return
|
||||
if not unit.json_dic.has('msvk'): return
|
||||
if not (unit.json_dic['msvk'] is Array): return
|
||||
|
||||
var msvk = unit.json_dic['msvk']
|
||||
var sz: = ecms.size()
|
||||
for dic_msvk in msvk:
|
||||
@@ -90,13 +125,12 @@ func on_data_capsrpb_received(unit: capsrpb.CapsRpb, ecms: Dictionary):
|
||||
if ecms.has(ispp):
|
||||
var ecm = ecms[ispp]
|
||||
ecm.set_from_dic(dic_msvk)
|
||||
ecm.tick_rx = unit.tick
|
||||
call_deferred('emit_signal', 'interfer_update', ecm)
|
||||
else:
|
||||
var ecm = Interfer.new()
|
||||
ecm.set_from_dic(dic_msvk)
|
||||
ecms[ispp] = ecm
|
||||
ecm.tick_rx = unit.tick
|
||||
ecm.krp = INTERFER_OFF
|
||||
send_ecm(ecm, unit)
|
||||
if sz != ecms.size():
|
||||
call_deferred('emit_signal', 'interfer_resized', ecms)
|
||||
|
||||
@@ -117,6 +151,8 @@ func on_interfer_create(btn, sel_threats, unit, ecms):
|
||||
if key != null:
|
||||
ispp = key
|
||||
else:
|
||||
if interfer_name == 'off':
|
||||
return
|
||||
ispp = pop_id()
|
||||
if ispp == 0: return
|
||||
msg_ss += 1
|
||||
@@ -126,15 +162,24 @@ func on_interfer_create(btn, sel_threats, unit, ecms):
|
||||
else:
|
||||
ecm = Interfer.new()
|
||||
ecm.ispp = ispp
|
||||
ecms[ispp] = ecm
|
||||
ecm.svk = STATE_TSMT # Подготовка к передаче сообщения
|
||||
ecm.ss = msg_ss
|
||||
ecm.kni = kni
|
||||
ecm.krp = interfer_name
|
||||
ecm.params = param
|
||||
ecm.powp = 100.0 # Необходимо добавить управление мощностью
|
||||
thrs[ispp] = item.id
|
||||
var json_data = ecm.get_msg6_data()
|
||||
unit.tx_stack.append(json_data)
|
||||
signaller.emit_signal('interfer_new', ecm)
|
||||
if interfer_name == 'off':
|
||||
signaller.emit_signal('interfer_off', ecm, ecms, thrs)
|
||||
push_id(ecm.ispp)
|
||||
ecm.tick_tx = Time.get_ticks_msec()
|
||||
|
||||
|
||||
func send_ecm(ecm, unit):
|
||||
var json_data = ecm.get_msg6_data()
|
||||
unit.tx_stack.append(json_data)
|
||||
|
||||
|
||||
func pop_id():
|
||||
@@ -147,3 +192,4 @@ func pop_id():
|
||||
|
||||
func push_id(id : int):
|
||||
id_array.append(id)
|
||||
id_array.sort()
|
||||
|
||||
@@ -23,8 +23,13 @@ signal full_screen(id: int)
|
||||
|
||||
|
||||
## Вызывается, когда пользователь выбирает цель
|
||||
## [param bip] - Отметка цели на экране.
|
||||
signal rto_threat_sel (bip: Control)
|
||||
## [param th_id] - Отметка цели на экране
|
||||
signal rto_threat_sel (th_id: int)
|
||||
|
||||
|
||||
## Вызывается, когда пользователь снимает выделение с цели
|
||||
## [param th_id] - Отметка цели на экране
|
||||
signal rto_threat_unsel (th_id: int)
|
||||
|
||||
|
||||
## Вызывается, когда пользователь выбирает помеху
|
||||
@@ -43,6 +48,17 @@ signal interfer_create (btn: PanelContainer, sel_threats: Array)
|
||||
signal interfer_new (ecm: interfer.Interfer)
|
||||
|
||||
|
||||
## Вызывается, когда отключается действующая помеха
|
||||
## [param ecm] - Новая помеха, [param ecms] - словарь помех
|
||||
## [param ecms] - словарь id помех и связанных с ними целей
|
||||
signal interfer_off (ecm: interfer.Interfer, ecms: Dictionary, thrs: Dictionary)
|
||||
|
||||
|
||||
## Вызывается, когда отключается действующая помеха
|
||||
## [param ecm] - Выбранная помеха
|
||||
signal interfer_selected (ecm: interfer.Interfer)
|
||||
|
||||
|
||||
## Вызывается при запросе изменения уровня детализации карты
|
||||
## [param zoom] - Вновь установленный уровень детализации
|
||||
signal zoom_changed(zoom: int)
|
||||
|
||||
@@ -29,7 +29,7 @@ class Threat:
|
||||
var selected: bool ## Флаг, что цель выбрана
|
||||
|
||||
func _init(): clear_fflags()
|
||||
func _to_string() -> String: return '<Threat>: номер:%d пеленг:%0.1f частота:%0.1f МГц' % [id, aoa, freq]
|
||||
func _to_string() -> String: return 'номер: %d пеленг: %0.1f частота: %0.1f МГц' % [id, aoa, freq]
|
||||
func clear_fflags(): tools.get_members_names(self).any(func(vn): fflags[vn] = false)
|
||||
|
||||
func set_from_dic(dic: Dictionary):
|
||||
@@ -54,6 +54,7 @@ func _ready() -> void:
|
||||
timer_check_lost.connect('timeout', Callable(self, 'on_timer_check_lost').bind(repsettings.ThreatParams.time_lost, threats))
|
||||
timer_check_lost.start(repsettings.ThreatParams.time_lost / 1000.0)
|
||||
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('threat_selected', Callable(self, 'on_threat_selected').bind(threats))
|
||||
signaller.connect('interfer_init', Callable(self, 'on_interfer_init').bind(threats))
|
||||
|
||||
@@ -69,11 +70,12 @@ func on_timer_check_lost(time_lost: int, threats: Dictionary):
|
||||
call_deferred('emit_signal', 'threats_resized', threats)
|
||||
|
||||
|
||||
## Снимает выделение с цели, если нажать по отметке цели.
|
||||
func on_rto_threat_unsel(th_id, threats): threats[th_id].selected = false
|
||||
|
||||
|
||||
## Выбирает цель, если нажать по отметке цели.
|
||||
func on_rto_threat_sel(bip, threats):
|
||||
for threat in threats.values():
|
||||
threat.selected = false
|
||||
threats[bip.name.to_int()].selected = true
|
||||
func on_rto_threat_sel(th_id, threats): on_threat_selected(threats[th_id], threats)
|
||||
|
||||
|
||||
## Выбирает цель, если выбрать в таблице
|
||||
|
||||
Reference in New Issue
Block a user