Compare commits

...

9 Commits

4 changed files with 138 additions and 69 deletions

View File

@@ -1,11 +1,5 @@
extends Node
var id_array: Array # Массив id целей
var interfers : Dictionary # Словарь целей
var msg_counter : int = 0 # Счётчик отправленных пакетов
var g_table # таблица с помехами
const TableCellType1 = preload('res://ячейка-1.tscn')
const TableCellType2 = preload('res://кнопка-3.tscn')
const TableCellType3 = preload('res://кнопка-4.tscn')
@@ -57,8 +51,21 @@ const INTERFER_NAMES: Dictionary = {
IQ_FL_NAME : ['SRNGPS.pcm',
'MCHM1.pcm',
'PDM2_20.pcm',
'PDM2_40.pcm',
'PDM2_88.pcm',
'PDM2_112.pcm',
'PDM4_20.pcm',
'PDM4_40.pcm',
'PDM4_84.pcm',
'PDM4_108.pcm',
'PDM4S_5.pcm',
'PDM4S_10.pcm',
'PDM4S_2_5.pcm',
'PDM4S_10.pcm',
'PDCHM_5.pcm',
'PDCHM_10.pcm',
'PDCHM_20.pcm',
'PDCHM_40.pcm',
'FM_5.pcm',
'K1.pcm',
'OZP1.pcm',
@@ -66,10 +73,18 @@ const INTERFER_NAMES: Dictionary = {
'SVI1_LIT3.pcm',
'SVM2_LIT2.pcm',
'SVM2_LIT3.pcm',
'ERLS.pcm',
'ELRS.pcm',
'SRNI1_LIT4.pcm',
'SRNI1_LIT5.pcm'] }
const INTERFER_OFF_TIMEOUT = 5.0 # Интервал выключения помехи
var id_array: Array # Массив id целей
var interfers : Dictionary # Словарь целей
var msg_counter : int = 0 # Счётчик отправленных пакетов
var g_table # таблица с помехами
var now = 0.0 # Время с момента запуска приложения
# Помеха
class Interfer:
var get_data: Dictionary = {
@@ -92,6 +107,7 @@ class Interfer:
var svk: int = 0
var row_id: int
var active_fs: fs.Fs
var rx_tick: = 0
func _init(data: Dictionary):
options.merge(data, true)
@@ -129,6 +145,7 @@ func set_interfer(data):
on_row_add(g_table, interfers[data['ispp']])
var cmd_state: int = fs.set_fs(interfers[data['ispp']])
interfers[data['ispp']].svk = cmd_state
interfers[data['ispp']].rx_tick = now;
var cell = g_table.get_node2(COLUMN_SVK, interfers[data['ispp']].row_id)
cell.select(cmd_state)
@@ -208,14 +225,14 @@ func on_row_pressed(i_row: int, table):
pass
func off_interfer(json_data):
if not interfers.has(json_data['ispp']): return
var row_id = interfers[json_data['ispp']].row_id
if interfers[json_data['ispp']] != null:
if interfers[json_data['ispp']].active_fs != null:
fs.fs_off(interfers[json_data['ispp']].active_fs)
func off_interfer(interfer_id):
if not interfers.has(interfer_id): return
var row_id = interfers[interfer_id].row_id
if interfers[interfer_id] != null:
if interfers[interfer_id].active_fs != null:
fs.fs_off(interfers[interfer_id].active_fs)
if g_table.get_rows_count() > row_id:
interfers.erase(json_data['ispp'])
interfers.erase(interfer_id)
g_table.remove_row(row_id)
for i in g_table.get_rows_count():
var interfer = g_table.get_node_user_data(0, i)
@@ -232,3 +249,10 @@ func check_interfers_state():
interfer.svk = cmd_state
var cell = g_table.get_node2(COLUMN_SVK, interfer.row_id)
cell.select(cmd_state)
func _process(delta):
now += delta
for key in interfers:
if (now - interfers[key].rx_tick) > INTERFER_OFF_TIMEOUT:
off_interfer(key)

View File

@@ -35,7 +35,7 @@ func _ready():
'panel': panel_threats}
sock.bind(main_addr[1], main_addr[0])
sock.set_dest_address(dst_addr[0], dst_addr[1])
Threats.init_treats(table_threats, nodes)
Threats.init_threats(table_threats, nodes)
Interfers.init_pomehi(table_pomehi)
fs.init_fs($ColorRect/tabs/pomehi, $ColorRect/tabs/pomehi/fs_rect)
var timer = Timer.new()
@@ -64,7 +64,7 @@ func on_receive(data):
if not json_data.has('ss'): return
if not ((json_data['ss'] is int) or (json_data['ss'] is float)): return
if json_data['krp'] == 'off':
Interfers.off_interfer(json_data)
Interfers.off_interfer(json_data['ispp'])
sock.put_packet(Interfers.get_msg7_data())
return
if not json_data.has('powp'): return
@@ -75,6 +75,8 @@ func on_receive(data):
sock.put_packet(Interfers.get_msg7_data())
elif json_data['ts'] == 8:
fs.on_receive_msg8(json_data)
elif json_data['ts'] == 9:
Threats.on_receive_msg9(json_data)
# Called every frame. 'delta' is the elapsed time since the previous frame.

View File

@@ -28,7 +28,10 @@ fs="*res://fs.gd"
window/size/viewport_width=1700
window/size/viewport_height=900
window/stretch/mode="2d"
window/size/window_width_override=800
window/size/window_height_override=600
window/stretch/mode="canvas_items"
window/stretch/aspect="keep_width"
[gui]

View File

@@ -1,13 +1,5 @@
extends Node
var id_array: Array # Массив id целей
var treats : Dictionary # Словарь целей
var msg_counter : int = 0 # Счётчик отправленных пакетов
var g_table: GridContainer
var send_flag = true
const TableCellType1 = preload('res://ячейка-1.tscn')
const TableCellType2 = preload('res://кнопка-3.tscn')
const TableCellType3 = preload('res://кнопка-4.tscn')
@@ -16,13 +8,13 @@ const TableCellType5 = preload('res://ячейка-2.tscn')
const TableCellType6 = preload('res://кнопка-5.tscn')
const TableHeader = preload('res://table/header.tscn')
# Индекс колонки: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
const TABLE_HEADERS = ['ID Цели', 'Курc.град', 'Частота', 'Ш. диап.', 'Ампл.', 'T обновл.', 'Мод.', 'Реж. см. F', 'Ск. пер.', 'Протокол', 'Ст. дол.', 'Ст. шир.', 'Cт. выс.', 'Тек. дол.', 'Тек. шир.', 'Тек. выс.', 'Рек. тип помехи']
const TABLE_HEADER_TYPES = [ TableHeader, TableHeader, TableHeader, TableHeader, TableHeader, TableHeader, TableHeader, TableHeader, TableHeader, TableHeader, TableHeader, TableHeader, TableHeader, TableHeader, TableHeader, TableHeader, TableHeader]
const TABLE_HEADER_ALIGNMENTS = [ HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER]
const TABLE_ROW_TYPES = [ TableCellType1, TableCellType5, TableCellType5, TableCellType5, TableCellType5, TableCellType5, TableCellType6, TableCellType6, TableCellType5, TableCellType6, TableCellType5, TableCellType5, TableCellType5, TableCellType5, TableCellType5, TableCellType5, TableCellType6]
const TABLE_ROW_ALIGNMENTS = [ HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_LEFT, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER]
const TABLE_COLUMN_SIZES = [ 82, 82, 82, 82, 82, 90, 150, 150, 80, 150, 82, 82, 82, 82, 82, 82, 100]
# Индекс колонки: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
const TABLE_HEADERS = ['ID', 'Курc, гр.', 'Частота', 'Ш. диап.', 'Ампл.', 'T обновл.', 'Мод.', 'Реж. см. F', 'Ск. пер.', 'Протокол', 'Ст. дол.', 'Ст. шир.', 'Cт. выс.', 'Тек. дол.', 'Тек. шир.', 'Тек. выс.', 'Рек. помеха', 'Мерцание']
const TABLE_HEADER_TYPES = [ TableHeader, TableHeader, TableHeader, TableHeader, TableHeader, TableHeader, TableHeader, TableHeader, TableHeader, TableHeader, TableHeader, TableHeader, TableHeader, TableHeader, TableHeader, TableHeader, TableHeader, TableHeader]
const TABLE_HEADER_ALIGNMENTS = [ HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER]
const TABLE_ROW_TYPES = [ TableCellType1, TableCellType5, TableCellType5, TableCellType5, TableCellType5, TableCellType5, TableCellType6, TableCellType6, TableCellType5, TableCellType6, TableCellType5, TableCellType5, TableCellType5, TableCellType5, TableCellType5, TableCellType5, TableCellType6, TableCellType5]
const TABLE_ROW_ALIGNMENTS = [ HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_LEFT, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER]
const TABLE_COLUMN_SIZES = [ 40, 70, 82, 82, 82, 90, 110, 150, 80, 130, 82, 82, 82, 82, 82, 82, 140, 82]
const COLUMN_ID = 0 # Идентификатор цели
const COLUMN_AOA = 1 # Курсовой угол на источник сигнала, градусы
@@ -41,6 +33,7 @@ const COLUMN_LAT = 13 # Текущие координаты, долгота
const COLUMN_LON = 14 # Текущие координаты, широта в градусах
const COLUMN_ALT = 15 # Текущая высота, метры
const COLUMN_REC = 16 # Текущая высота, метры
const COLUMN_FLIC = 17 # Время мерцания
# Индексы колонок, которым можно задавать выравнивание текста
const TABLE_ALLIGNED_COLUMNS = [
@@ -56,7 +49,8 @@ const TABLE_ALLIGNED_COLUMNS = [
COLUMN_SALT,
COLUMN_LAT,
COLUMN_LON,
COLUMN_ALT ]
COLUMN_ALT,
COLUMN_FLIC ]
# Индексы колонок, в которых можно вводит текст
const TABLE_ENTRY_COLUMNS = [
@@ -71,7 +65,8 @@ const TABLE_ENTRY_COLUMNS = [
COLUMN_SALT,
COLUMN_LAT,
COLUMN_LON,
COLUMN_ALT ]
COLUMN_ALT,
COLUMN_FLIC ]
# Типы модуляции
const MODE_TYPES = ['<неопр.>', 'am', 'ook', 'ask', 'fm', 'qpsk', 'oqpsk', 'pi4qpsk', 'qam16',
@@ -84,38 +79,50 @@ const FREQM = ['<неопр.>', 'fhss', 'lfm', 'const']
const M_PROTO = ['<неопр.>', '3dlink', 'skyhopperpro', 'picardiooem', 'solo7', 'j11',
'mavlink', 'ltm', 'hc12', 'df1', ]
const COLUMN_OPT_BTN = [COLUMN_TMOD, COLUMN_FREQM, COLUMN_PROTO, COLUMN_REC]
const ID_ARRAY_LEN = 150 # Размер пула номеров целей
const MIN_FLIC_TIME = 1.0 # минимальное время мерцания цели
var id_array: Array # Массив id целей
var threats : Dictionary # Словарь целей
var msg_counter : int = 0 # Счётчик отправленных пакетов
var g_table: GridContainer
var send_flag = true
var rkrp = []
var now = 0.0 # Время с момента запуска приложения
var bpo_mode: int = 1 # Режим работы блока БПО
# Номера колонок
var COLUMN_OPT = [[COLUMN_TMOD, MODE_TYPES], [COLUMN_FREQM, FREQM], [COLUMN_PROTO, M_PROTO], [COLUMN_REC, rkrp]]
const COLUMN_OPT_BTN = [COLUMN_TMOD, COLUMN_FREQM, COLUMN_PROTO, COLUMN_REC]
const ID_ARRAY_LEN = 150 # Размер пула номеров целей
# Цель
class Threat:
# параметры цели, второе значение, разрешение отправки.
var row: Dictionary = {
'id':[0,true],
'aoa':[10.0,true],
'freq':[2480.0,true],
'width':[20.0,true],
'power':[20.0,true],
'tick':[10,true],
'tmod':['<неопр.>',false],
'freqm':['<неопр.>',false],
'baud':[0.0,false],
'rparams': [{},false],
'rkrp': ['<неопр.>', false],
'proto':['<неопр.>', false],
'slon':[0.0,false],
'slat':[0.0,false],
'salt':[0.0,false],
'lat':[0.0,false],
'lon':[0.0,false],
'alt':[0.0,false],
'id': [0, true],
'aoa': [10.0, true],
'freq': [2480.0, true],
'width': [20.0, true],
'power': [20.0, true],
'tick': [10, true],
'tmod': ['<неопр.>', false],
'freqm': ['<неопр.>', false],
'baud': [0.0, false],
'rparams': [{}, false],
'rkrp': ['<неопр.>', false],
'proto': ['<неопр.>', false],
'slon': [0.0, false],
'slat': [0.0, false],
'salt': [0.0, false],
'lat': [0.0, false],
'lon': [0.0, false],
'alt': [0.0, false],
}
var row_id: int
var flic: Array = [0.0, false]
var flic_ena: bool = true
var flic_tick: = 0.0 ## Время изменения состояния flic
func _init(th_id : int, row_i: int):
row.id[0] = th_id
@@ -150,6 +157,7 @@ class Threat:
new_rows.append(_check_value(row.lon))
new_rows.append(_check_value(row.alt))
new_rows.append(_check_value(row.rkrp))
new_rows.append(_check_value(flic))
return new_rows
@@ -186,6 +194,16 @@ class Threat:
row.width[1] = Tools.check_empty(value)
return value
func set_flic(val):
var value = float(val)
value = Tools.check_negative(value)
value = Tools.check_len(val, value)
flic[0] = value
flic[1] = Tools.check_empty(value)
return value
func set_power(val):
var value = float(val)
value = Tools.check_negative(value)
@@ -292,7 +310,7 @@ class Threat:
return value
func init_treats(table, nodes): # Инициализация вкладки с целями
func init_threats(table, nodes): # Инициализация вкладки с целями
set_rkrp()
for i in range(ID_ARRAY_LEN): # Заполняет массив ID целей
id_array.append(i+1)
@@ -331,10 +349,11 @@ func load_treats(table):
var id = int(item['id'])
id_array.erase(int(id))
var threat : = Threat.new(id, table.get_rows_count())
treats['%d' % id] = threat
threats['%d' % id] = threat
for key in item:
if key == 'id': threat.row[key] = [int(item[key]), true]
elif key == 'tick': threat.row[key] = [int(item[key]), true]
elif key == 'flic': threat.flic = [float(item[key]), true]
else: threat.row[key] = [item[key], true]
var row = threat.update_rows()
table.add_row(TABLE_ROW_TYPES)
@@ -348,9 +367,10 @@ func load_treats(table):
func on_btn_save():
var file = FileAccess.open('user://save.json', FileAccess.WRITE)
var data_to_json : Array
for key in treats:
var treat = treats[key]
for key in threats:
var treat = threats[key]
var data = treat.get_data()
data['flic'] = threats[key].flic[0]
data_to_json.append(data)
var json = JSON.new().stringify(data_to_json)
file.store_string(json)
@@ -401,7 +421,7 @@ func on_edit_entry(text : String, entry):
func set_value(val : String, treat_id : String, column : int):
var treat = treats[treat_id]
var treat = threats[treat_id]
match column:
COLUMN_AOA:
return treat.set_aoa(val)
@@ -435,6 +455,8 @@ func set_value(val : String, treat_id : String, column : int):
return treat.set_alt_pressed(val)
COLUMN_REC:
return treat.set_rname(val)
COLUMN_FLIC:
return treat.set_flic(val)
func on_row_pressed(i_row: int, table):
table.clear_rows_selected()
@@ -444,7 +466,7 @@ func on_row_pressed(i_row: int, table):
func on_btn_add(table):
var id = pop_id()
var threat : = Threat.new(id, table.get_rows_count())
treats['%d' % id] = threat
threats['%d' % id] = threat
var row = threat.update_rows()
table.add_row(TABLE_ROW_TYPES)
table.set_row_text(table.get_rows_count()-1, row)
@@ -459,7 +481,7 @@ func on_btn_del(table):
table.get_selected_rows(row_i)
if len(row_i) > 0:
var cell = table.get_node2(0, row_i[0])
treats.erase(cell.text)
threats.erase(cell.text)
table.remove_row(row_i[0])
for i in table.get_rows_count():
var treat = table.get_node_user_data(0, i)
@@ -484,19 +506,20 @@ func get_threats_data():
msg_counter += 1
data_to_json['ss'] = msg_counter
data_to_json['msvk'] = []
data_to_json['sa'] = bpo_mode
for item in Interfers.interfers.values():
var msvk = {}
msvk['ispp'] = item.options['ispp']
msvk['svk'] = item.svk
data_to_json['msvk'].append(msvk)
data_to_json['mis'] = []
for key in treats:
var treat = treats[key]
for key in threats:
var threat = threats[key]
var flag = int(key) % 2
if int(send_flag) ^ flag:
if (int(send_flag) ^ flag) or (not threat.flic_ena):
continue
set_ticks(treat)
var data = treat.get_data()
set_ticks(threat)
var data = threat.get_data()
data_to_json['mis'].append(data)
var json = JSON.new().stringify(data_to_json)
var pac = json.to_utf8_buffer()
@@ -512,7 +535,7 @@ func set_ticks(treat):
func on_rotate_th(entry, table):
if entry.text.is_valid_float():
for th in treats.values():
for th in threats.values():
var aoa = th.row.aoa[0]
aoa += float(entry.text)
if aoa > 360.0:
@@ -535,7 +558,7 @@ func on_timeout(entry, table, chkbx_rt):
func on_btn_load(table):
for i in table.get_rows_count():
var cell = table.get_node2(0, 0)
treats.erase(cell.text)
threats.erase(cell.text)
table.remove_row(0)
load_treats(table)
@@ -545,7 +568,7 @@ func on_thr_gen(table):
var id = pop_id()
if id == 0: return
var threat : = Threat.new(id, table.get_rows_count())
treats['%d' % id] = threat
threats['%d' % id] = threat
threat.row.aoa[0] = 0 + 30 * i
while (threat.row.aoa[0] > 360):
threat.row.aoa[0] -= 360
@@ -560,7 +583,24 @@ func on_thr_gen(table):
table.connect_columns(self, 'text_submitted', 'on_edit_entry', TABLE_ENTRY_COLUMNS, [])
table.connect_columns(self, 'item_selected', 'on_item_selected', COLUMN_OPT_BTN, [])
func set_rkrp():
rkrp.append('<неопр.>')
for key in Interfers.INTERFER_NAMES.keys():
rkrp.append(key)
func _process(delta):
now += delta
for th in threats.values():
if th.flic[0] > MIN_FLIC_TIME:
if (now - th.flic_tick) >= th.flic[0]:
th.flic_ena = not th.flic_ena
th.flic_tick = now
else:
th.flic_ena = true
func on_receive_msg9(json_data):
if not json_data.has('sa'): return
bpo_mode = int(json_data['sa'])