Merge remote-tracking branch 'MaD_CaT/master'

# Conflicts:
#	scenes/btn_scale.tscn
#	scenes/tilemap.gd
#	scenes/работа.gd
#	scenes/работа.tscn
#	scripts/signaller.gd
This commit is contained in:
sasha80
2023-11-16 14:33:51 +03:00
22 changed files with 348 additions and 143 deletions

View File

@@ -15,10 +15,12 @@ class CapsRpb:
signal parse_error(unit: CapsRpb, msg: String) ## Сигнал ошибки разбора сообщения
static var json_conv: = JSON.new()
var online: = false ## Состояние связи с источником сообщений
var name: String ## Имя экземпляра
var json_dic: Dictionary ## Аппарат для разбора сообщений
var tick: = 0 ## Тик время последнего обновления, мс
var online: = false ## Состояние связи с источником сообщений
var name: String ## Имя экземпляра
var json_dic: Dictionary ## Аппарат для разбора сообщений
var tick: = 0 ## Тик время последнего обновления, мс
var tx_data: = PackedByteArray() ## Пакет для отправки
var tx_stack: Array ## Массив пакетов для отправки
func _to_string() -> String: return String('капсрпб: "%s" %s ' % [self.name, ['отключен', 'на связи'][int(online)]])
func _init(nm): self.name = nm
@@ -40,3 +42,9 @@ class CapsRpb:
if online and ((now_tick - tick) > ONLINE_TIMEOUT):
online = false
emit_signal('line_changed', self)
if len(tx_stack):
tx_data = tx_stack[0]
tx_stack.remove_at(0)
return Error.OK
else:
return Error.ERR_UNAVAILABLE

View File

@@ -2,14 +2,6 @@ extends Node
## Представление помехи
## Состояние выполнения сеанса помехи
const INTERFER_STATE = {
0: 'идёт подготовка к выполнению',
1: 'выполняется',
2: 'не выполнена по причине ошибки в команде',
3: 'не выполнена по причине занятости',
4: 'не выполнена по причинееисправности' }
## Режимы помехи
const ITERFER_MODE = {
@@ -26,19 +18,39 @@ const ITERFER_MODE = {
'k1': ['K1', ['freq', 'width', 'dur', 'period']],
'ozp1': ['ОЗП-1', ['freq', 'width']] }
const ID_INTERFERS_LEN = 63 ## Размер пула номеров целей
var msg_ss: int = 0 ## счётчик сообщений
var id_array: Array ## Массив id воздействий
var thrs: Dictionary ## Словарь воздействия для целей, ключ - id воздействия
## Сеанс помехи
class Interfer:
var ss: int = 0 ## Счётчик сообщений.
var ispp: int = 0 ## Индекс сеанса.
var state: = 0 ## Состояние сеанса. Ответ КАПСРПБ. Возможные значения в [param ITERFER_STATE].
var svk: = 0 ## Состояние сеанса. Ответ КАПСРПБ. Возможные значения в [param ITERFER_STATE].
var krp: String = '' ## Тип помехи. Возможные значения в [param INTERFER_MODE].
var powp: float = 0.0 ## Мощность излучения выраженная в процентах.
var kni: = 0.0 ## Курсовой угол направления излучения.
var params: = {} ## Параметры помехи.
var get: Array[String] ## Запрос массива параметров (список запрошенных параметров).
var retss: int ## Значение счётчика сообщения в котором был произведён запрос массива параметров.
var tick_rx: int ## Тик время обновления цели, мс.
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':
data_to_json['kni'] = kni
data_to_json['powp'] = powp # Необходимо добавить управление мощностью
data_to_json['get'] = []
data_to_json['params'] = params
var json = JSON.new().stringify(data_to_json)
var pac = json.to_utf8_buffer()
return pac
func set_from_dic(dic: Dictionary):
var names: = tools.get_members_names(self)
@@ -49,10 +61,18 @@ signal interfer_preparing(ecm: Interfer) ## Вызывается в м
signal interfer_run(ecm: Interfer) ## Вызывается в момент начала работы помехи.
signal interfer_error(ecm: Interfer, msg: String) ## Вызывается при ошибке.
signal interfer_update(ecm: Interfer) ## Вызывается при обновлении помехи.
signal interfer_new(ecm: Interfer) ## Вызывается при создании новой помехи.
signal interfer_resized(ecms: Dictionary) ## Вызывается при изменении количества сеансов помех.
func _ready():
var ecms: Dictionary = {} ## Словарь помех
for i in range(ID_INTERFERS_LEN): # Заполняет массив ID целей
id_array.append(i+1)
var unit_key = repsettings.get_unit_key('уарэп-капсрпб-отп')
var unit = repnetwork.units[unit_key]
signaller.connect('interfer_create', Callable(self, 'on_interfer_create').bind(unit, ecms))
## Производит приём состояния помех. [param unit] -> [param ecms]
func on_data_capsrpb_received(unit: capsrpb.CapsRpb, ecms: Dictionary):
if not unit.json_dic.has('ts'): return
@@ -77,6 +97,53 @@ func on_data_capsrpb_received(unit: capsrpb.CapsRpb, ecms: Dictionary):
ecm.set_from_dic(dic_msvk)
ecms[ispp] = ecm
ecm.tick_rx = unit.tick
call_deferred('emit_signal', 'interfer_new', ecm)
if sz != ecms.size():
call_deferred('emit_signal', 'interfer_resized', ecms)
## Вызыватся, когда пользователь выбрал помеху и выбраны цели
func on_interfer_create(btn, sel_threats, unit, ecms):
for item in sel_threats:
var ispp: int = 0
var interfer_name: String = btn.get_meta('rfi_name')
var param: Dictionary = {}
var kni: float = item.aoa
param['freq'] = item.freq
param['width'] = item.width
if interfer_name == 'k1':
param['dur'] = 1.0 # Необходимо добавить параметры управления
param['period'] = 1.0 # Необходимо добавить параметры управления
var key = thrs.find_key(item.id)
if key != null:
ispp = key
else:
ispp = pop_id()
if ispp == 0: return
msg_ss += 1
var ecm: Interfer
if ecms.has(ispp):
ecm = ecms[ispp]
else:
ecm = Interfer.new()
ecm.ispp = ispp
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)
func pop_id():
var id = 0
if len(id_array):
id = id_array[0]
id_array.remove_at(0)
return id
func push_id(id : int):
id_array.append(id)

View File

@@ -68,6 +68,6 @@ func _process(_delta: float) -> void:
for addr in units:
var unit = units[addr]
match unit.process(tick):
Error.OK: sock_unicast.send_to(addr, unit.data_tx)
Error.OK: sock_unicast.send_to(addr, unit.tx_data)
Error.FAILED: emit_signal('socket_error', 'ошибка: %s %s:%d' % [unit, addr[0], addr[1]])
poll_sockets.any(func(sock): poll_receive(sock, tick))

View File

@@ -5,7 +5,7 @@ class_name Signaller extends Node
## два и более узла, из разных файлов.
## Вызывается, когда оператор выбирает цель.
## Вызывается, когда оператор выбирает цель в таблице.
## [param threats] - Словарь. Ключ - идентификатор (номер) цели. Значение - цель [br]
## [param th] - Выбранная цель [br]
signal threat_selected(threats: Dictionary, th)
@@ -22,6 +22,26 @@ signal threat_unselected(threats: Dictionary, th)
signal full_screen(id: int)
## Вызывается, когда пользователь выбирает цель
## [param bip] - Отметка цели на экране
signal rto_threat_sel (bip: Control)
## Вызывается, когда пользователь выбирает помеху
## [param btn] - Нажатая кнопка помехи
signal interfer_init (btn: PanelContainer)
## Вызывается, когда выбраны цели для постановки помех
## [param btn] - Нажатая кнопка помехи, [param sel_threats] - список целей
signal interfer_create (btn: PanelContainer, sel_threats: Array)
## Вызывается, когда создалась новая помеха
## [param ecm] - Новая помеха
signal interfer_new (ecm: interfer.Interfer)
## Вызывается при запросе изменения уровня детализации карты
## [param zoom] - Вновь установленный уровень детализации
signal zoom_changed(zoom: int)

View File

@@ -26,6 +26,7 @@ class Threat:
var tick_rx: int ## Тик время обновления цели, мс.
var tmod: String ## Тип модуляции.
var width: float ## Ширина занимаемого диапазона частот, МГц.
var selected: bool ## Флаг, что цель выбрана
func _init(): clear_fflags()
func _to_string() -> String: return '<Threat>: номер:%d пеленг:%0.1f частота:%0.1f МГц' % [id, aoa, freq]
@@ -52,7 +53,9 @@ func _ready() -> void:
unit.connect('data_received', Callable(self, 'on_data_capsrpb_received').bind(threats))
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('threat_selected', Callable(self, 'on_threat_selected').bind(threats))
signaller.connect('interfer_init', Callable(self, 'on_interfer_init').bind(threats))
## Периодически удаляет устаревшие цели
func on_timer_check_lost(time_lost: int, threats: Dictionary):
@@ -66,6 +69,31 @@ func on_timer_check_lost(time_lost: int, threats: Dictionary):
call_deferred('emit_signal', 'threats_resized', threats)
## Выбирает цель, если нажать по отметке цели.
func on_rto_threat_sel(bip, threats):
for threat in threats.values():
threat.selected = false
threats[bip.name.to_int()].selected = true
## Выбирает цель, если выбрать в таблице
func on_threat_selected(th, threats):
for threat in threats.values():
threat.selected = false
th.selected = true
## Формирует список выбранных целей для включения помехи
func on_interfer_init(btn, threats):
var sel_threats: Array = []
for threat in threats.values():
if threat.selected:
sel_threats.append(threat)
if len(sel_threats):
signaller.emit_signal('interfer_create', btn, sel_threats)
## Производит приём целей
func on_data_capsrpb_received(unit: capsrpb.CapsRpb, threats: Dictionary):
if not unit.json_dic.has('ts'): return