Compare commits
3 Commits
master-afs
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
56e6aa4bb0 | ||
|
|
2e6be9b4f1 | ||
|
|
a311e3201b |
@@ -642,29 +642,6 @@ class Tile:
|
|||||||
self.y = y0
|
self.y = y0
|
||||||
self.z = z0
|
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:
|
func remove_closest_dot(screen_pos: Vector2) -> bool:
|
||||||
var closest_dot = find_at_screen_position(screen_pos)
|
var closest_dot = find_at_screen_position(screen_pos)
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
class_name Iterfer extends Node
|
class_name Iterfer extends Node
|
||||||
|
|
||||||
|
const default_um: = 5.0 ## Угол места по умолчанию
|
||||||
|
|
||||||
## Представление помехи.
|
## Представление помехи.
|
||||||
|
|
||||||
## Режимы помехи.
|
## Режимы помехи.
|
||||||
@@ -92,7 +94,7 @@ const EXCLUDE_INTERFER = ['srni1', 'srnm2', 'srngps', 'svi1', 'svm2']
|
|||||||
const ID_INTERFERS_LEN = 63 ## Размер пула номеров целей.
|
const ID_INTERFERS_LEN = 63 ## Размер пула номеров целей.
|
||||||
const INTERFER_OFF = 'off'
|
const INTERFER_OFF = 'off'
|
||||||
const INTERFER_IQFILE = 'IQ-файл'
|
const INTERFER_IQFILE = 'IQ-файл'
|
||||||
const POW_DEFAULT: float = 50.0
|
const POW_DEFAULT: float = 80.0
|
||||||
const PERIOD_DEFAULT = 7.5
|
const PERIOD_DEFAULT = 7.5
|
||||||
const MIN_WIDTH_COEF = 1.0
|
const MIN_WIDTH_COEF = 1.0
|
||||||
const MIN_RESEND_TIMEOUT = 0.05
|
const MIN_RESEND_TIMEOUT = 0.05
|
||||||
@@ -115,9 +117,12 @@ var fs_closed: Dictionary ## Словарь секторо
|
|||||||
var width_coef: float = 1.5 ## Коэффициент расширения полосы
|
var width_coef: float = 1.5 ## Коэффициент расширения полосы
|
||||||
var now: = 0.0 ## Время с момента запуска
|
var now: = 0.0 ## Время с момента запуска
|
||||||
var resend_timeout: float = 1.0 ## Время повторной отправки команды
|
var resend_timeout: float = 1.0 ## Время повторной отправки команды
|
||||||
|
var trim = 0.0 ## Килевая качка
|
||||||
|
var roll = 0.0 ## Бортовая качка
|
||||||
|
|
||||||
signal send_ecms(time_now) ## Сигнал отправки помех, если настало время
|
signal send_ecms(time_now) ## Сигнал отправки помех, если настало время
|
||||||
|
|
||||||
|
var unit_nav: unit.Unit ## Навигация
|
||||||
|
|
||||||
## Сеанс помехи.
|
## Сеанс помехи.
|
||||||
class Interfer:
|
class Interfer:
|
||||||
@@ -137,6 +142,9 @@ class Interfer:
|
|||||||
var priority: int = 0 ## Приоритет помехи
|
var priority: int = 0 ## Приоритет помехи
|
||||||
var active: bool = false ## Флаг, что фиксируется мощность на выходном усилителе
|
var active: bool = false ## Флаг, что фиксируется мощность на выходном усилителе
|
||||||
var freq_change = false ## Флаг, что частота изменнена пользователем
|
var freq_change = false ## Флаг, что частота изменнена пользователем
|
||||||
|
var bort = false ## Признак бортовая или килевая качка
|
||||||
|
var trim_roll = 0.0 ## Качка для конкретной помехи
|
||||||
|
var trim_roll_manual = false ## Флаг что ум задан оператором
|
||||||
|
|
||||||
func _to_string() -> String:
|
func _to_string() -> String:
|
||||||
return 'номер: %d название: %s частота: %0.1f МГц пеленг: %0.1f гр.' % [ispp, ITERFER_MODE[krp][0], params['freq'], kni]
|
return 'номер: %d название: %s частота: %0.1f МГц пеленг: %0.1f гр.' % [ispp, ITERFER_MODE[krp][0], params['freq'], kni]
|
||||||
@@ -173,11 +181,25 @@ class Interfer:
|
|||||||
var param = self.get(value_key)
|
var param = self.get(value_key)
|
||||||
if param == null:
|
if param == null:
|
||||||
params[value_key] = value
|
params[value_key] = value
|
||||||
|
elif value_key == 'um':
|
||||||
|
trim_roll_manual = true
|
||||||
|
params[value_key] = value
|
||||||
|
set_um()
|
||||||
else:
|
else:
|
||||||
self.set(value_key, value)
|
self.set(value_key, value)
|
||||||
if value_key == 'freq':
|
if value_key == 'freq':
|
||||||
freq_change = true
|
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_preparing(ecm: Interfer) ## Вызывается в момент запуска помехи.
|
||||||
signal interfer_run(ecm: Interfer) ## Вызывается в момент начала работы помехи.
|
signal interfer_run(ecm: Interfer) ## Вызывается в момент начала работы помехи.
|
||||||
signal interfer_error(ecm: Interfer, msg: String) ## Вызывается при ошибке.
|
signal interfer_error(ecm: Interfer, msg: String) ## Вызывается при ошибке.
|
||||||
@@ -223,8 +245,8 @@ func _ready() -> void:
|
|||||||
threats.connect('threats_resized', Callable(self, 'on_threats_resized'))
|
threats.connect('threats_resized', Callable(self, 'on_threats_resized'))
|
||||||
threats.connect('threat_update', Callable(self, 'on_threats_update').bind(ecms))
|
threats.connect('threat_update', Callable(self, 'on_threats_update').bind(ecms))
|
||||||
ProjectSettings.connect('settings_changed', on_settings_changed)
|
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))
|
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))
|
connect('send_ecms', Callable(self, 'on_send_ecms').bind(ecms, unit_caps))
|
||||||
call_deferred('emit_signal', 'interfer_resized', ecms)
|
call_deferred('emit_signal', 'interfer_resized', ecms)
|
||||||
|
|
||||||
@@ -232,8 +254,9 @@ func _ready() -> void:
|
|||||||
func on_trenazh_mode(val: bool): trenazh_mode = val
|
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 ship_time = Time.get_datetime_dict_from_system()
|
||||||
|
var update_bk_kk = false
|
||||||
course = coords.get('k', 0.0)
|
course = coords.get('k', 0.0)
|
||||||
var data_to_json = {
|
var data_to_json = {
|
||||||
'ts': 8,
|
'ts': 8,
|
||||||
@@ -251,9 +274,23 @@ func on_nav_data_received(coords: Dictionary, unit_caps):
|
|||||||
'minute': ship_time['minute'],
|
'minute': ship_time['minute'],
|
||||||
'second': ship_time['second'],}
|
'second': ship_time['second'],}
|
||||||
var json_data = JSON.stringify(data_to_json).to_utf8_buffer()
|
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)
|
unit_caps.tx_stack.append(json_data)
|
||||||
msg8_num += 1
|
msg8_num += 1
|
||||||
msg8_num %= 0xffffffff
|
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:
|
func on_th_aoa_update(threats: Dictionary, ecms: Dictionary) -> void:
|
||||||
@@ -286,6 +323,7 @@ func on_th_aoa_update(threats: Dictionary, ecms: Dictionary) -> void:
|
|||||||
if thrs[ecm_i] == th_id:
|
if thrs[ecm_i] == th_id:
|
||||||
var ecm = ecms[ecm_i]
|
var ecm = ecms[ecm_i]
|
||||||
ecm.params['freq'] = thr.freq
|
ecm.params['freq'] = thr.freq
|
||||||
|
ecm.params['um'] = get_um(thr.lat, thr.lon, thr.alt)
|
||||||
ecm.kni = fposmod(thr.aoa - course, 360)
|
ecm.kni = fposmod(thr.aoa - course, 360)
|
||||||
call_ecm_proc(ecm)
|
call_ecm_proc(ecm)
|
||||||
if ecm.nmfs in gos_nmfs or prd.fs_caps_id[ecm.nmfs] in fs_closed:
|
if ecm.nmfs in gos_nmfs or prd.fs_caps_id[ecm.nmfs] in fs_closed:
|
||||||
@@ -389,6 +427,7 @@ func on_interfer_create(interfer_name, sel_threats, fs_arr, power, u, ecms) -> v
|
|||||||
var id = item.id
|
var id = item.id
|
||||||
param['freq'] = item.freq
|
param['freq'] = item.freq
|
||||||
param['width'] = item.width * width_coef
|
param['width'] = item.width * width_coef
|
||||||
|
param['um'] = get_um(item.lat, item.lon, item.alt)
|
||||||
if item.rparams.has('period'):
|
if item.rparams.has('period'):
|
||||||
param['period'] = item.rparams['period']
|
param['period'] = item.rparams['period']
|
||||||
if (item.rkrp != '') and item.fflags.rkrp and auto_enabled:
|
if (item.rkrp != '') and item.fflags.rkrp and auto_enabled:
|
||||||
@@ -409,6 +448,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)
|
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:
|
func on_interfer_rcv(interfer_params: Array, unit0, unit_caps, ecms) -> void:
|
||||||
var err: bool = false
|
var err: bool = false
|
||||||
var mode = interfer_params[0]
|
var mode = interfer_params[0]
|
||||||
@@ -472,11 +520,12 @@ func interfer_create(_u, interfer_name, ecms, param, kni, id, dict, source_inter
|
|||||||
ecm.params = param
|
ecm.params = param
|
||||||
ecm.powp = power
|
ecm.powp = power
|
||||||
ecm.source_interfer = source_interfer
|
ecm.source_interfer = source_interfer
|
||||||
ecm.um = param.get('um', 15.0) # Значение по умолчанию
|
|
||||||
if source_interfer == SOURCE_INTERFER[0]:
|
if source_interfer == SOURCE_INTERFER[0]:
|
||||||
if thrs_dict.has(dict[ispp]):
|
if thrs_dict.has(dict[ispp]):
|
||||||
ecm.priority = thrs_dict[dict[ispp]].priority
|
ecm.priority = thrs_dict[dict[ispp]].priority
|
||||||
call_ecm_proc(ecm)
|
call_ecm_proc(ecm)
|
||||||
|
set_bort(ecm)
|
||||||
|
ecm.set_um()
|
||||||
var set_nmfs_ok = set_nmfs(ecm)
|
var set_nmfs_ok = set_nmfs(ecm)
|
||||||
if set_nmfs_ok != Error.OK:
|
if set_nmfs_ok != Error.OK:
|
||||||
log.error('Ошибка выбора модуля ФС для помехи: %s' %[ecm.ispp])
|
log.error('Ошибка выбора модуля ФС для помехи: %s' %[ecm.ispp])
|
||||||
@@ -723,3 +772,18 @@ func on_send_ecms(time_now, ecms, unit_caps):
|
|||||||
func _process(delta: float) -> void:
|
func _process(delta: float) -> void:
|
||||||
now += delta
|
now += delta
|
||||||
emit_signal('send_ecms', now)
|
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
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ class NaviSource extends unit.Unit:
|
|||||||
var data: = {} ## Принятые данные
|
var data: = {} ## Принятые данные
|
||||||
var source_addr: = [] ## Адрес отправителя
|
var source_addr: = [] ## Адрес отправителя
|
||||||
const akng_mode = {0:'тестовый', 1:'основной', 2:'резервный', 3:'аварийный'}
|
const akng_mode = {0:'тестовый', 1:'основной', 2:'резервный', 3:'аварийный'}
|
||||||
|
static var latlon: Vector2 ## Текущие координаты
|
||||||
func _to_string() -> String:
|
func _to_string() -> String:
|
||||||
return String('NaviSource: %s %s' % [self.name, 'на связи' if online else 'отключен'])
|
return String('NaviSource: %s %s' % [self.name, 'на связи' if online else 'отключен'])
|
||||||
func _init(nm):
|
func _init(nm):
|
||||||
@@ -40,8 +41,10 @@ class NaviSource extends unit.Unit:
|
|||||||
if flags & (1 << 1):
|
if flags & (1 << 1):
|
||||||
data['k'] = rx_data.decode_float(8) # Курс, градусы (0.0 - Север)
|
data['k'] = rx_data.decode_float(8) # Курс, градусы (0.0 - Север)
|
||||||
if flags & (1 << 2):
|
if flags & (1 << 2):
|
||||||
data['latitude'] = float(rx_data.decode_s32(12) * 180) / pow_2_30 # Широта, градусы
|
latlon.x = float(rx_data.decode_s32(12) * 180) / pow_2_30 # Широта, градусы
|
||||||
data['longitude'] = float(rx_data.decode_s32(16) * 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):
|
if flags & (1 << 3):
|
||||||
data['speed'] = rx_data.decode_float(20) # Скорость, м/с
|
data['speed'] = rx_data.decode_float(20) # Скорость, м/с
|
||||||
data['err'] = rx_data.decode_u16(24) #
|
data['err'] = rx_data.decode_u16(24) #
|
||||||
|
|||||||
@@ -197,6 +197,30 @@ func set_bits(v, a, m):
|
|||||||
return (~m) & 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):
|
func fill_files_table(tbl: table, folder: String, rows_types: Array):
|
||||||
var dir: = DirAccess.open(folder)
|
var dir: = DirAccess.open(folder)
|
||||||
if dir == null:
|
if dir == null:
|
||||||
|
|||||||
Reference in New Issue
Block a user