Доработка. Добавлено мерцание цели.

This commit is contained in:
MaD_CaT
2025-12-19 15:40:39 +03:00
parent 90b2858fc6
commit 24d89aaabb
2 changed files with 86 additions and 53 deletions

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

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 = [ 40, 70, 82, 82, 82, 90, 110, 150, 80, 130, 82, 82, 82, 82, 82, 82, 140]
# Индекс колонки: 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,49 @@ 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 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 +156,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 +193,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 +309,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 +348,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 +366,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 +420,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 +454,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 +465,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 +480,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)
@@ -490,13 +511,13 @@ func get_threats_data():
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 +533,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 +556,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 +566,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 +581,19 @@ 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