diff --git a/scripts/interfer.gd b/scripts/interfer.gd new file mode 100644 index 0000000..8559e3a --- /dev/null +++ b/scripts/interfer.gd @@ -0,0 +1,80 @@ +extends Node + +## Представление помехи + +## Состояние выполнения сеанса помехи +const ITERFER_STATE = { + 0: 'идёт подготовка к выполнению', + 1: 'выполняется', + 2: 'не выполнена по причине ошибки в команде', + 3: 'не выполнена по причине занятости', + 4: 'не выполнена по причине_неисправности' } + + +## Режимы помехи +const ITERFER_MODE = { + 'srni1': ['СРН-И1', ['freq', 'width']], + 'srnm2': ['СРН-М2', ['freq', 'width']], + 'lchm1': ['ЛЧМ-1', ['freq', 'width']], + 'mchm1': ['МЧМ-1', ['freq', 'width']], + 'pdm2': ['ПД-М2', ['freq', 'width']], + 'pdm4': ['ПД-М4', ['freq', 'width']], + 'pdm4s': ['ПД-М4С', ['freq', 'width']], + 'pdchm': ['ПД-ЧМ', ['freq', 'width']], + 'svi1': ['СВ-И1', ['freq', 'width']], + 'svm2': ['СВ-М2', ['freq', 'width']], + 'k1': ['K1', ['freq', 'width', 'dur', 'period']], + 'ozp1': ['ОЗП-1', ['freq', 'width']] } + + +## Сеанс помехи +class Interfer: + var ss: int = 0 ## Счётчик сообщений + var ispp: int = 0 ## Индекс сеанса. + var state: = 0 ## Состояние сеанса. Ответ КАПСРПБ. Возможные значения в [param ITERFER_STATE] + var krp: String = '' ## Тип помехи. Возможные значения в [param ITERFER_MODE] + var powp: float = 0.0 ## Мощность излучения выраженная в процентах + var kni: = 0.0 ## Курсовой угол направления излучения + var params: = {} ## Параметры помехи + var get: Array[String] ## Запрос массива параметров (список запрошенных параметров) + var retss: int ## Значение счётчика сообщения в котором был произведён запрос массива параметров + + + func set_from_dic(dic: Dictionary): + var names: = Tools.get_members_names(self) + names.any(func(vn): if dic.has(vn): set(vn, dic[vn]); return false) + + +signal interfer_preparing(ecm: Interfer) +signal interfer_run(ecm: Interfer) +signal interfer_error(ecm: Interfer, msg: String) + + +## Производит приём состояния помех. [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['msvk'] is Array): return + + var msvk = unit.json_dic['msvk'] + var sz: = ecms.size() + for dic_msvk in msvk: + if not (dic_msvk is Dictionary): continue + if dic_msvk.has('ispp'): + var ispp = int(dic_msvk['ispp']) + 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 + call_deferred('emit_signal', 'interfer_new', ecm) + if sz != ecms.size(): + call_deferred('emit_signal', 'interfer_resized', ecms)