From 24d89aaabb2856e4d4d00a3f8027629c07e64bdb Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Fri, 19 Dec 2025 15:40:39 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0.=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=BE=20=D0=BC=D0=B5=D1=80=D1=86=D0=B0=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=20=D1=86=D0=B5=D0=BB=D0=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.gd | 2 +- threats.gd | 137 +++++++++++++++++++++++++++++++++-------------------- 2 files changed, 86 insertions(+), 53 deletions(-) diff --git a/main.gd b/main.gd index a11c0ea..5e3e6f7 100644 --- a/main.gd +++ b/main.gd @@ -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() diff --git a/threats.gd b/threats.gd index f36296d..db17280 100644 --- a/threats.gd +++ b/threats.gd @@ -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