From a311e3201b5802aee82c273be3e150885230b777 Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Wed, 8 Apr 2026 12:59:11 +0300 Subject: [PATCH 1/2] =?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=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0=5F=5F=D0=9F=D0=BE=D0=BB=D1=83=D1=87=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=5F=D1=83=D0=B3=D0=BE=D0=BB=5F=D0=BC=D0=B5=D1=81=D1=82?= =?UTF-8?q?=D0=B0=5F=D0=B4=D0=BB=D1=8F=5F=D0=BF=D0=BE=D0=BC=D0=B5=D1=85?= =?UTF-8?q?=D0=B8=5F=D0=B8=D0=B7=5F=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5?= =?UTF-8?q?=D1=82=D1=80=D0=BE=D0=B2=5F=D1=86=D0=B5=D0=BB=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/tilemap/tilemap.gd | 23 ----------------------- scripts/interfer.gd | 18 ++++++++++++++++-- scripts/navigation.gd | 7 +++++-- scripts/tools.gd | 24 ++++++++++++++++++++++++ 4 files changed, 45 insertions(+), 27 deletions(-) diff --git a/scenes/tilemap/tilemap.gd b/scenes/tilemap/tilemap.gd index aff9aad6..d7278352 100644 --- a/scenes/tilemap/tilemap.gd +++ b/scenes/tilemap/tilemap.gd @@ -642,29 +642,6 @@ class Tile: self.y = y0 self.z = z0 -# Возвращает расстояние в метрах между двумя точками на карте -func haversine_m(lat1: float, lon1: float, lat2: float, lon2: float) -> float: - # Радиус Земли в метрах - const R: = 6372795.0 - # Преобразование градусов в радианы - var rlat1: = deg_to_rad(lat1) - var rlon1: = deg_to_rad(lon1) - var rlat2: = deg_to_rad(lat2) - var rlon2: = deg_to_rad(lon2) - # вычисление длины большого круга - var cl1: = cos(rlat1) - var cl2: = cos(rlat2) - var sl1: = sin(rlat1) - var sl2: = sin(rlat2) - var delta: = rlon2 - rlon1 - var cdelta: = cos(delta) - var sdelta: = sin(delta) - var y: = sqrt(pow(cl2 * sdelta, 2.0) + pow(cl1 * sl2 - sl1 * cl2 * cdelta, 2.0)) - var x: = sl1 * sl2 + cl1 * cl2 * cdelta - var ad: = atan2(y, x) - var dist: = ad * R - return dist - func remove_closest_dot(screen_pos: Vector2) -> bool: var closest_dot = find_at_screen_position(screen_pos) diff --git a/scripts/interfer.gd b/scripts/interfer.gd index a93dc512..81b942d6 100644 --- a/scripts/interfer.gd +++ b/scripts/interfer.gd @@ -1,5 +1,7 @@ class_name Iterfer extends Node +const default_um: = 15.0 ## Угол места по умолчанию + ## Представление помехи. ## Режимы помехи. @@ -118,6 +120,7 @@ var resend_timeout: float = 1.0 ## Время повторной signal send_ecms(time_now) ## Сигнал отправки помех, если настало время +var unit_nav: unit.Unit ## Навигация ## Сеанс помехи. class Interfer: @@ -223,7 +226,7 @@ func _ready() -> void: threats.connect('threats_resized', Callable(self, 'on_threats_resized')) threats.connect('threat_update', Callable(self, 'on_threats_update').bind(ecms)) ProjectSettings.connect('settings_changed', on_settings_changed) - var unit_nav: = network.get_unit_instance('навигация') + unit_nav = network.get_unit_instance('навигация') unit_nav.connect('data_received', on_nav_data_received.bind(unit_caps)) connect('send_ecms', Callable(self, 'on_send_ecms').bind(ecms, unit_caps)) call_deferred('emit_signal', 'interfer_resized', ecms) @@ -286,6 +289,7 @@ func on_th_aoa_update(threats: Dictionary, ecms: Dictionary) -> void: if thrs[ecm_i] == th_id: var ecm = ecms[ecm_i] ecm.params['freq'] = thr.freq + ecm.params['um'] = get_um(thr.lat, thr.lon, thr.alt) ecm.kni = fposmod(thr.aoa - course, 360) call_ecm_proc(ecm) if ecm.nmfs in gos_nmfs or prd.fs_caps_id[ecm.nmfs] in fs_closed: @@ -389,6 +393,7 @@ func on_interfer_create(interfer_name, sel_threats, fs_arr, power, u, ecms) -> v var id = item.id param['freq'] = item.freq param['width'] = item.width * width_coef + param['um'] = get_um(item.lat, item.lon, item.alt) if item.rparams.has('period'): param['period'] = item.rparams['period'] if (item.rkrp != '') and item.fflags.rkrp and auto_enabled: @@ -409,6 +414,15 @@ func on_interfer_create(interfer_name, sel_threats, fs_arr, power, u, ecms) -> v interfer_create(u, interfer_name, ecms, param, kni, id, fs, SOURCE_INTERFER[1], power) +## Возвращает угол места до заданной цели +## [param lat] - +## [param lon] - +## [param alt] - высота +func get_um(lat: float, lon: float, alt: float) -> float: + var dist = tools.haversine_m(lat, lon, unit_nav.latlon.x, unit_nav.latlon.y) + return rad_to_deg(atan(alt / dist)) if dist > 0.0 else default_um + + func on_interfer_rcv(interfer_params: Array, unit0, unit_caps, ecms) -> void: var err: bool = false var mode = interfer_params[0] @@ -472,7 +486,7 @@ func interfer_create(_u, interfer_name, ecms, param, kni, id, dict, source_inter ecm.params = param ecm.powp = power ecm.source_interfer = source_interfer - ecm.um = param.get('um', 15.0) # Значение по умолчанию + ecm.um = param.get('um', default_um) # Значение по умолчанию if source_interfer == SOURCE_INTERFER[0]: if thrs_dict.has(dict[ispp]): ecm.priority = thrs_dict[dict[ispp]].priority diff --git a/scripts/navigation.gd b/scripts/navigation.gd index 245c9b8c..ce489a27 100644 --- a/scripts/navigation.gd +++ b/scripts/navigation.gd @@ -13,6 +13,7 @@ class NaviSource extends unit.Unit: var data: = {} ## Принятые данные var source_addr: = [] ## Адрес отправителя const akng_mode = {0:'тестовый', 1:'основной', 2:'резервный', 3:'аварийный'} + static var latlon: Vector2 ## Текущие координаты func _to_string() -> String: return String('NaviSource: %s %s' % [self.name, 'на связи' if online else 'отключен']) func _init(nm): @@ -40,8 +41,10 @@ class NaviSource extends unit.Unit: if flags & (1 << 1): data['k'] = rx_data.decode_float(8) # Курс, градусы (0.0 - Север) if flags & (1 << 2): - data['latitude'] = float(rx_data.decode_s32(12) * 180) / pow_2_30 # Широта, градусы - data['longitude'] = float(rx_data.decode_s32(16) * 180) / pow_2_30 # Долгота, градусы + latlon.x = float(rx_data.decode_s32(12) * 180) / pow_2_30 # Широта, градусы + latlon.y = float(rx_data.decode_s32(16) * 180) / pow_2_30 # Долгота, градусы + data['latitude'] = latlon.x + data['longitude'] = latlon.y if flags & (1 << 3): data['speed'] = rx_data.decode_float(20) # Скорость, м/с data['err'] = rx_data.decode_u16(24) # diff --git a/scripts/tools.gd b/scripts/tools.gd index 495056b9..ce4d04a3 100644 --- a/scripts/tools.gd +++ b/scripts/tools.gd @@ -197,6 +197,30 @@ func set_bits(v, a, m): return (~m) & v | a & m +# Возвращает расстояние в метрах между двумя точками на карте +func haversine_m(lat1: float, lon1: float, lat2: float, lon2: float) -> float: + # Радиус Земли в метрах + const R: = 6372795.0 + # Преобразование градусов в радианы + var rlat1: = deg_to_rad(lat1) + var rlon1: = deg_to_rad(lon1) + var rlat2: = deg_to_rad(lat2) + var rlon2: = deg_to_rad(lon2) + # вычисление длины большого круга + var cl1: = cos(rlat1) + var cl2: = cos(rlat2) + var sl1: = sin(rlat1) + var sl2: = sin(rlat2) + var delta: = rlon2 - rlon1 + var cdelta: = cos(delta) + var sdelta: = sin(delta) + var y: = sqrt(pow(cl2 * sdelta, 2.0) + pow(cl1 * sl2 - sl1 * cl2 * cdelta, 2.0)) + var x: = sl1 * sl2 + cl1 * cl2 * cdelta + var ad: = atan2(y, x) + var dist: = ad * R + return dist + + func fill_files_table(tbl: table, folder: String, rows_types: Array): var dir: = DirAccess.open(folder) if dir == null: From 2e6be9b4f12e17afd59955568b99a66036788c40 Mon Sep 17 00:00:00 2001 From: TotMaxim Date: Thu, 9 Apr 2026 19:38:12 +0300 Subject: [PATCH 2/2] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BA=D0=B0=D1=87=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/interfer.gd | 62 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 56 insertions(+), 6 deletions(-) diff --git a/scripts/interfer.gd b/scripts/interfer.gd index 81b942d6..54004de4 100644 --- a/scripts/interfer.gd +++ b/scripts/interfer.gd @@ -1,6 +1,6 @@ class_name Iterfer extends Node -const default_um: = 15.0 ## Угол места по умолчанию +const default_um: = 5.0 ## Угол места по умолчанию ## Представление помехи. @@ -94,7 +94,7 @@ const EXCLUDE_INTERFER = ['srni1', 'srnm2', 'srngps', 'svi1', 'svm2'] const ID_INTERFERS_LEN = 63 ## Размер пула номеров целей. const INTERFER_OFF = 'off' const INTERFER_IQFILE = 'IQ-файл' -const POW_DEFAULT: float = 50.0 +const POW_DEFAULT: float = 80.0 const PERIOD_DEFAULT = 7.5 const MIN_WIDTH_COEF = 1.0 const MIN_RESEND_TIMEOUT = 0.05 @@ -117,6 +117,8 @@ var fs_closed: Dictionary ## Словарь секторо var width_coef: float = 1.5 ## Коэффициент расширения полосы var now: = 0.0 ## Время с момента запуска var resend_timeout: float = 1.0 ## Время повторной отправки команды +var trim = 0.0 ## Килевая качка +var roll = 0.0 ## Бортовая качка signal send_ecms(time_now) ## Сигнал отправки помех, если настало время @@ -140,6 +142,9 @@ class Interfer: var priority: int = 0 ## Приоритет помехи var active: bool = false ## Флаг, что фиксируется мощность на выходном усилителе var freq_change = false ## Флаг, что частота изменнена пользователем + var bort = false ## Признак бортовая или килевая качка + var trim_roll = 0.0 ## Качка для конкретной помехи + var trim_roll_manual = false ## Флаг что ум задан оператором func _to_string() -> String: return 'номер: %d название: %s частота: %0.1f МГц пеленг: %0.1f гр.' % [ispp, ITERFER_MODE[krp][0], params['freq'], kni] @@ -176,11 +181,25 @@ class Interfer: var param = self.get(value_key) if param == null: params[value_key] = value + elif value_key == 'um': + trim_roll_manual = true + params[value_key] = value + set_um() else: self.set(value_key, value) if value_key == 'freq': freq_change = true - + + func set_um(): + if not self.trim_roll_manual: + self.um = params.get('um', default_um) + self.trim_roll + else: + self.um = params.get('um', default_um) + if (self.um < settings.UM_MIN): + self.um = settings.UM_MIN + elif (self.um > settings.UM_MAX): + self.um = settings.UM_MAX + signal interfer_preparing(ecm: Interfer) ## Вызывается в момент запуска помехи. signal interfer_run(ecm: Interfer) ## Вызывается в момент начала работы помехи. signal interfer_error(ecm: Interfer, msg: String) ## Вызывается при ошибке. @@ -227,7 +246,7 @@ func _ready() -> void: threats.connect('threat_update', Callable(self, 'on_threats_update').bind(ecms)) ProjectSettings.connect('settings_changed', on_settings_changed) unit_nav = network.get_unit_instance('навигация') - unit_nav.connect('data_received', on_nav_data_received.bind(unit_caps)) + unit_nav.connect('data_received', on_nav_data_received.bind(unit_caps, ecms)) connect('send_ecms', Callable(self, 'on_send_ecms').bind(ecms, unit_caps)) call_deferred('emit_signal', 'interfer_resized', ecms) @@ -235,8 +254,9 @@ func _ready() -> void: func on_trenazh_mode(val: bool): trenazh_mode = val -func on_nav_data_received(coords: Dictionary, unit_caps): +func on_nav_data_received(coords: Dictionary, unit_caps, ecms): var ship_time = Time.get_datetime_dict_from_system() + var update_bk_kk = false course = coords.get('k', 0.0) var data_to_json = { 'ts': 8, @@ -254,9 +274,23 @@ func on_nav_data_received(coords: Dictionary, unit_caps): 'minute': ship_time['minute'], 'second': ship_time['second'],} var json_data = JSON.stringify(data_to_json).to_utf8_buffer() + if data_to_json['roll'] != roll: + roll = data_to_json['roll'] + update_bk_kk = true + if data_to_json['trim'] != trim: + trim = data_to_json['trim'] + update_bk_kk = true unit_caps.tx_stack.append(json_data) msg8_num += 1 msg8_num %= 0xffffffff + if update_bk_kk: + for ecm in ecms.values(): + if ecm.bort: + ecm.trim_roll = roll + else: + ecm.trim_roll = trim + ecm.set_um() + signaller.emit_signal('interfer_new', ecm) func on_th_aoa_update(threats: Dictionary, ecms: Dictionary) -> void: @@ -486,11 +520,12 @@ func interfer_create(_u, interfer_name, ecms, param, kni, id, dict, source_inter ecm.params = param ecm.powp = power ecm.source_interfer = source_interfer - ecm.um = param.get('um', default_um) # Значение по умолчанию if source_interfer == SOURCE_INTERFER[0]: if thrs_dict.has(dict[ispp]): ecm.priority = thrs_dict[dict[ispp]].priority call_ecm_proc(ecm) + set_bort(ecm) + ecm.set_um() var set_nmfs_ok = set_nmfs(ecm) if set_nmfs_ok != Error.OK: log.error('Ошибка выбора модуля ФС для помехи: %s' %[ecm.ispp]) @@ -737,3 +772,18 @@ func on_send_ecms(time_now, ecms, unit_caps): func _process(delta: float) -> void: now += delta emit_signal('send_ecms', now) + + +func set_bort(ecm: Interfer): + var sec = 0 + for sect in prd.FS_SECTORS.keys(): + if ecm.kni >= prd.FS_SECTORS[sect][0] and ecm.kni <= prd.FS_SECTORS[sect][1]: + sec = sect + if (sec == 0) or (sec == 2): + ecm.bort = false + else: + ecm.bort = true + if ecm.bort: + ecm.trim_roll = roll + else: + ecm.trim_roll = trim