Compare commits
6 Commits
1633a45c9b
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
56e6aa4bb0 | ||
|
|
2e6be9b4f1 | ||
|
|
a311e3201b | ||
|
|
5032115b5d | ||
|
|
caebd4f05b | ||
|
|
b4e81218ab |
@@ -12,6 +12,13 @@ enum DEVICE_STATUS {
|
||||
CONTROL # Контроль завершен
|
||||
}
|
||||
|
||||
# Состояния сервиса для RTR устройств
|
||||
enum RTR_SERVICEABILITY {
|
||||
NO_CONNECTION = 0, # Нет связи
|
||||
PASSED = 1, # Все тесты пройдены
|
||||
ERROR = 2 # Есть ошибки
|
||||
}
|
||||
|
||||
const STATUS_CONFIG := {
|
||||
DEVICE_STATE.NONE: {'text': 'Нет связи', 'color': Color.WHITE, 'font_color': Color.BLACK},
|
||||
DEVICE_STATE.GOOD: {'text': 'Исправно', 'color': Color.GREEN, 'font_color': Color.BLACK},
|
||||
@@ -22,6 +29,9 @@ class DeviceObserver:
|
||||
var device_name: String
|
||||
var status: Array = [false, false, false] # [online, operational, control_complete]
|
||||
var last_results: Dictionary = {}
|
||||
|
||||
# Для RTR устройств
|
||||
var rtr_serviceability: int = RTR_SERVICEABILITY.NO_CONNECTION
|
||||
|
||||
func update_online_state(online: bool) -> bool:
|
||||
if status[DEVICE_STATUS.ONLINE] != online:
|
||||
@@ -55,11 +65,28 @@ class DeviceObserver:
|
||||
status[DEVICE_STATUS.CONTROL] = false
|
||||
changed = true
|
||||
return changed
|
||||
|
||||
func update_rtr_serviceability(state: int) -> bool:
|
||||
if rtr_serviceability != state:
|
||||
rtr_serviceability = state
|
||||
# Обновляем operational статус на основе RTR
|
||||
var new_operational = (state == RTR_SERVICEABILITY.PASSED)
|
||||
if status[DEVICE_STATUS.STATUS] != new_operational:
|
||||
status[DEVICE_STATUS.STATUS] = new_operational
|
||||
return true
|
||||
return false
|
||||
|
||||
var device_observers: Dictionary = {}
|
||||
var overall_prd_state: DEVICE_STATE = DEVICE_STATE.NONE
|
||||
var status_uf: int = DEVICE_STATE.NONE # Статус УФ (УАРЭП-ЭМС)
|
||||
|
||||
# Добавляем наблюдателей для RTR устройств
|
||||
var rtr_device_names := [
|
||||
'rtr_afsp_left',
|
||||
'rtr_afsp_right',
|
||||
'rtr_bpo' # Общий для левого и правого БПО
|
||||
]
|
||||
|
||||
func _ready() -> void:
|
||||
tooltip_text = 'Нет связи с приборами комплекса'
|
||||
add_theme_color_override('font_color', Color.BLACK)
|
||||
@@ -78,11 +105,20 @@ func _ready() -> void:
|
||||
|
||||
# Подписка на УФ
|
||||
signaller.connect('update_uf_serviceability', _on_uf_status_receive)
|
||||
|
||||
# Подписка на сигналы RTR (через signaller или напрямую)
|
||||
_connect_rtr_signals()
|
||||
|
||||
# Инициализация начального состояния
|
||||
_recalculate_overall_state()
|
||||
|
||||
|
||||
func _connect_rtr_signals() -> void:
|
||||
scouting.connect('serviceability_rtr_afsp_left', Callable(self, '_on_rtr_afsp_left_serviceability'))
|
||||
scouting.connect('serviceability_rtr_afsp_right', Callable(self, '_on_rtr_afsp_right_serviceability'))
|
||||
scouting.connect('serviceability_rtr_bpo', Callable(self, '_on_rtr_bpo_serviceability'))
|
||||
|
||||
|
||||
func _initialize_observers() -> void:
|
||||
var device_names := [
|
||||
'уарэп-яу07-1н', 'уарэп-яу07-1в', 'уарэп-яу07-1к',
|
||||
@@ -94,6 +130,69 @@ func _initialize_observers() -> void:
|
||||
for device_name in device_names:
|
||||
device_observers[device_name] = DeviceObserver.new()
|
||||
device_observers[device_name].device_name = device_name
|
||||
|
||||
# Инициализируем наблюдателей для RTR устройств
|
||||
for rtr_name in rtr_device_names:
|
||||
device_observers[rtr_name] = DeviceObserver.new()
|
||||
device_observers[rtr_name].device_name = rtr_name
|
||||
|
||||
|
||||
# Обработчики сигналов RTR
|
||||
func _on_rtr_afsp_left_serviceability(state: int) -> void:
|
||||
var observer: DeviceObserver = device_observers.get('rtr_afsp_left')
|
||||
if not observer:
|
||||
return
|
||||
|
||||
var changed = false
|
||||
if observer.update_rtr_serviceability(state):
|
||||
changed = true
|
||||
|
||||
var is_online = (state != RTR_SERVICEABILITY.NO_CONNECTION)
|
||||
if observer.update_online_state(is_online):
|
||||
changed = true
|
||||
|
||||
if changed:
|
||||
_recalculate_overall_state()
|
||||
else:
|
||||
_update_display()
|
||||
|
||||
|
||||
func _on_rtr_afsp_right_serviceability(state: int) -> void:
|
||||
var observer: DeviceObserver = device_observers.get('rtr_afsp_right')
|
||||
if not observer:
|
||||
return
|
||||
|
||||
var changed = false
|
||||
if observer.update_rtr_serviceability(state):
|
||||
changed = true
|
||||
|
||||
var is_online = (state != RTR_SERVICEABILITY.NO_CONNECTION)
|
||||
if observer.update_online_state(is_online):
|
||||
changed = true
|
||||
|
||||
if changed:
|
||||
_recalculate_overall_state()
|
||||
else:
|
||||
_update_display()
|
||||
|
||||
|
||||
func _on_rtr_bpo_serviceability(state: int) -> void:
|
||||
var observer: DeviceObserver = device_observers.get('rtr_bpo')
|
||||
if not observer:
|
||||
return
|
||||
|
||||
var changed = false
|
||||
if observer.update_rtr_serviceability(state):
|
||||
changed = true
|
||||
|
||||
var is_online = (state != RTR_SERVICEABILITY.NO_CONNECTION)
|
||||
if observer.update_online_state(is_online):
|
||||
changed = true
|
||||
|
||||
if changed:
|
||||
_recalculate_overall_state()
|
||||
else:
|
||||
_update_display()
|
||||
|
||||
|
||||
func _on_prd_online_changed(line_status: Object, prd_module: Object) -> void:
|
||||
@@ -123,7 +222,12 @@ func _recalculate_overall_state() -> void:
|
||||
var has_online_prd := false
|
||||
var all_prd_operational := true
|
||||
|
||||
for observer in device_observers.values():
|
||||
for observer_key in device_observers.keys():
|
||||
# Пропускаем RTR устройства при подсчете ПРД
|
||||
if observer_key.begins_with('rtr_'):
|
||||
continue
|
||||
|
||||
var observer = device_observers[observer_key]
|
||||
if observer.status[DEVICE_STATUS.ONLINE]:
|
||||
has_online_prd = true
|
||||
|
||||
@@ -142,15 +246,35 @@ func _recalculate_overall_state() -> void:
|
||||
prd_state = DEVICE_STATE.ERR
|
||||
else:
|
||||
prd_state = DEVICE_STATE.NONE
|
||||
|
||||
# Проверяем статус RTR устройств
|
||||
var rtr_state := DEVICE_STATE.NONE
|
||||
var has_online_rtr := false
|
||||
var all_rtr_operational := true
|
||||
|
||||
for rtr_name in rtr_device_names:
|
||||
var observer = device_observers.get(rtr_name)
|
||||
if observer and observer.status[DEVICE_STATUS.ONLINE]:
|
||||
has_online_rtr = true
|
||||
if not observer.status[DEVICE_STATUS.STATUS]:
|
||||
all_rtr_operational = false
|
||||
|
||||
if has_online_rtr:
|
||||
if all_rtr_operational:
|
||||
rtr_state = DEVICE_STATE.GOOD
|
||||
else:
|
||||
rtr_state = DEVICE_STATE.ERR
|
||||
else:
|
||||
rtr_state = DEVICE_STATE.NONE
|
||||
|
||||
# Комбинируем статусы по правилу:
|
||||
# 1. Если хоть один ERROR → ERROR
|
||||
# 2. Если нет ERROR и хоть один GOOD → GOOD
|
||||
# 3. Иначе → NONE
|
||||
|
||||
if prd_state == DEVICE_STATE.ERR or status_uf == DEVICE_STATE.ERR:
|
||||
if prd_state == DEVICE_STATE.ERR or status_uf == DEVICE_STATE.ERR or rtr_state == DEVICE_STATE.ERR:
|
||||
new_state = DEVICE_STATE.ERR
|
||||
elif prd_state == DEVICE_STATE.GOOD or status_uf == DEVICE_STATE.GOOD:
|
||||
elif prd_state == DEVICE_STATE.GOOD or status_uf == DEVICE_STATE.GOOD or rtr_state == DEVICE_STATE.GOOD:
|
||||
new_state = DEVICE_STATE.GOOD
|
||||
else:
|
||||
new_state = DEVICE_STATE.NONE
|
||||
@@ -174,6 +298,7 @@ func _get_tooltip_text() -> String:
|
||||
# Получаем статистику по ПРД
|
||||
var prd_summary = _get_prd_summary()
|
||||
var uf_status_str = _get_uf_status_text()
|
||||
var rtr_summary = _get_rtr_summary()
|
||||
|
||||
match overall_prd_state:
|
||||
DEVICE_STATE.NONE:
|
||||
@@ -185,6 +310,7 @@ func _get_tooltip_text() -> String:
|
||||
|
||||
tooltip += '\n\nСтатус ПРД систем: ' + prd_summary
|
||||
tooltip += '\nСтатус УФ: ' + uf_status_str
|
||||
tooltip += '\nСтатус RTR: ' + rtr_summary
|
||||
|
||||
# Детализация по источникам статуса
|
||||
tooltip += '\n\nСостояние систем:'
|
||||
@@ -192,7 +318,10 @@ func _get_tooltip_text() -> String:
|
||||
# ПРД системы
|
||||
var prd_ok_count = 0
|
||||
var prd_total = 0
|
||||
for observer in device_observers.values():
|
||||
for observer_key in device_observers.keys():
|
||||
if observer_key.begins_with('rtr_'):
|
||||
continue
|
||||
var observer = device_observers[observer_key]
|
||||
if observer.status[DEVICE_STATUS.ONLINE]:
|
||||
prd_total += 1
|
||||
if observer.status[DEVICE_STATUS.STATUS]:
|
||||
@@ -202,15 +331,67 @@ func _get_tooltip_text() -> String:
|
||||
|
||||
# УФ система
|
||||
tooltip += '\nУФ: ' + _get_uf_status_text()
|
||||
|
||||
|
||||
# RTR системы
|
||||
tooltip += '\nRTR:'
|
||||
for rtr_name in rtr_device_names:
|
||||
var observer = device_observers.get(rtr_name)
|
||||
if observer:
|
||||
var status_text = _get_rtr_status_text(observer.rtr_serviceability)
|
||||
var display_name = _get_rtr_display_name(rtr_name)
|
||||
tooltip += '\n - %s: %s' % [display_name, status_text]
|
||||
return tooltip
|
||||
|
||||
|
||||
func _get_rtr_summary() -> String:
|
||||
var online_count := 0
|
||||
var operational_count := 0
|
||||
|
||||
for rtr_name in rtr_device_names:
|
||||
var observer = device_observers.get(rtr_name)
|
||||
if observer and observer.status[DEVICE_STATUS.ONLINE]:
|
||||
online_count += 1
|
||||
if observer.status[DEVICE_STATUS.STATUS]:
|
||||
operational_count += 1
|
||||
|
||||
if online_count == 0:
|
||||
return 'Нет связи'
|
||||
else:
|
||||
return '%d/%d исправно' % [operational_count, online_count]
|
||||
|
||||
|
||||
func _get_rtr_status_text(state: int) -> String:
|
||||
match state:
|
||||
RTR_SERVICEABILITY.NO_CONNECTION:
|
||||
return 'Нет связи'
|
||||
RTR_SERVICEABILITY.PASSED:
|
||||
return 'Исправен'
|
||||
RTR_SERVICEABILITY.ERROR:
|
||||
return 'Ошибка'
|
||||
_:
|
||||
return 'Неизвестно'
|
||||
|
||||
|
||||
func _get_rtr_display_name(rtr_key: String) -> String:
|
||||
match rtr_key:
|
||||
'rtr_afsp_left':
|
||||
return 'АФСП Л'
|
||||
'rtr_afsp_right':
|
||||
return 'АФСП П'
|
||||
'rtr_bpo':
|
||||
return 'РТР'
|
||||
_:
|
||||
return rtr_key.replace('rtr_', '')
|
||||
|
||||
|
||||
func _get_prd_summary() -> String:
|
||||
var online_count := 0
|
||||
var operational_count := 0
|
||||
|
||||
for observer in device_observers.values():
|
||||
for observer_key in device_observers.keys():
|
||||
if observer_key.begins_with('rtr_'):
|
||||
continue
|
||||
var observer = device_observers[observer_key]
|
||||
if observer.status[DEVICE_STATUS.ONLINE]:
|
||||
online_count += 1
|
||||
if observer.status[DEVICE_STATUS.STATUS]:
|
||||
@@ -235,14 +416,20 @@ func _get_uf_status_text() -> String:
|
||||
|
||||
|
||||
func _has_prd_errors() -> bool:
|
||||
for observer in device_observers.values():
|
||||
for observer_key in device_observers.keys():
|
||||
if observer_key.begins_with('rtr_'):
|
||||
continue
|
||||
var observer = device_observers[observer_key]
|
||||
if observer.status[DEVICE_STATUS.ONLINE] and not observer.status[DEVICE_STATUS.STATUS]:
|
||||
return true
|
||||
return false
|
||||
|
||||
|
||||
func _has_operational_prd() -> bool:
|
||||
for observer in device_observers.values():
|
||||
for observer_key in device_observers.keys():
|
||||
if observer_key.begins_with('rtr_'):
|
||||
continue
|
||||
var observer = device_observers[observer_key]
|
||||
if observer.status[DEVICE_STATUS.ONLINE] and observer.status[DEVICE_STATUS.STATUS]:
|
||||
return true
|
||||
return false
|
||||
@@ -257,7 +444,8 @@ func get_device_status(device_name: String) -> Dictionary:
|
||||
'operational': observer.status[DEVICE_STATUS.STATUS],
|
||||
'control_complete': observer.status[DEVICE_STATUS.CONTROL],
|
||||
'last_results': observer.last_results.duplicate(),
|
||||
'status_uf': status_uf
|
||||
'status_uf': status_uf,
|
||||
'rtr_serviceability': observer.rtr_serviceability if device_name.begins_with('rtr_') else -1
|
||||
}
|
||||
return {}
|
||||
|
||||
@@ -267,7 +455,10 @@ func get_overall_status() -> Dictionary:
|
||||
var operational_count := 0
|
||||
var control_complete_count := 0
|
||||
|
||||
for observer in device_observers.values():
|
||||
for observer_key in device_observers.keys():
|
||||
if observer_key.begins_with('rtr_'):
|
||||
continue
|
||||
var observer = device_observers[observer_key]
|
||||
if observer.status[DEVICE_STATUS.ONLINE]:
|
||||
online_count += 1
|
||||
if observer.status[DEVICE_STATUS.STATUS]:
|
||||
@@ -279,7 +470,8 @@ func get_overall_status() -> Dictionary:
|
||||
'overall_state': overall_prd_state,
|
||||
'online_devices': online_count,
|
||||
'operational_devices': operational_count,
|
||||
'total_devices': device_observers.size(),
|
||||
'total_devices': device_observers.size() - len(rtr_device_names), # Исключаем RTR
|
||||
'control_complete_devices': control_complete_count,
|
||||
'uf_status': status_uf
|
||||
'uf_status': status_uf,
|
||||
'rtr_status': _get_rtr_summary()
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
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 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
|
||||
@@ -115,9 +117,12 @@ 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) ## Сигнал отправки помех, если настало время
|
||||
|
||||
var unit_nav: unit.Unit ## Навигация
|
||||
|
||||
## Сеанс помехи.
|
||||
class Interfer:
|
||||
@@ -137,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]
|
||||
@@ -173,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) ## Вызывается при ошибке.
|
||||
@@ -223,8 +245,8 @@ 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.connect('data_received', on_nav_data_received.bind(unit_caps))
|
||||
unit_nav = network.get_unit_instance('навигация')
|
||||
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)
|
||||
|
||||
@@ -232,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,
|
||||
@@ -251,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:
|
||||
@@ -286,6 +323,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 +427,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 +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)
|
||||
|
||||
|
||||
## Возвращает угол места до заданной цели
|
||||
## [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,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', 15.0) # Значение по умолчанию
|
||||
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])
|
||||
@@ -723,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
|
||||
|
||||
@@ -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) #
|
||||
|
||||
@@ -445,12 +445,11 @@ func _handle_fs_work_state() -> void:
|
||||
(current_litera == 6 and control_results.fs_6) or \
|
||||
(current_litera == 7 and control_results.fs_7) or \
|
||||
(current_litera == 1 and control_results.fs_1):
|
||||
if not block_kasseta_y5_config['yau07']:
|
||||
_set_status('Ожидание данных от ЯУ-07...')
|
||||
return # НЕ переходим дальше пока нет данных от сервиса МП550
|
||||
|
||||
if flags.only_fs:
|
||||
state = STATE_MACHINE.IN_EMS_STOP
|
||||
elif not block_kasseta_y5_config['yau07']:
|
||||
_set_status('Ожидание данных от МП550 сервиса...')
|
||||
return
|
||||
else:
|
||||
state = STATE_MACHINE.UG_SET_RAY_5 if current_litera == 1 else STATE_MACHINE.UG_SET_RAY_CTRL
|
||||
|
||||
@@ -470,7 +469,7 @@ func _handle_check_kasseta_state() -> void:
|
||||
_set_status('Перегрев УМ')
|
||||
state = STATE_MACHINE.IN_EMS_STOP
|
||||
else:
|
||||
flags.flag_only_fs = true
|
||||
flags.only_fs = true
|
||||
_set_status('Касета У5: ERROR, Проверка ФС.')
|
||||
state = STATE_MACHINE.FS_TURN_ON
|
||||
|
||||
@@ -554,8 +553,7 @@ func _handle_ray_read_mode() -> void:
|
||||
|
||||
## Обработка записи состояния луча
|
||||
func _handle_ray_write_mode(ray_num: int) -> void:
|
||||
if not _can_write_ray():
|
||||
return
|
||||
if not _can_write_ray(): return
|
||||
|
||||
if (ray_num == 6 or ray_num == 5) and not control_timer.is_stopped():
|
||||
control_timer.stop()
|
||||
@@ -1057,9 +1055,9 @@ static func check_block_kasseta_y5(status_prd: PackedByteArray, y5_config: Dicti
|
||||
y5_config.yau07 = not flag_not_trust
|
||||
if y5_config.yau07:
|
||||
y5_config.ems = (status_prd[0] & 1) and ((status_prd[0] >> 4) & 1)
|
||||
y5_config.ug = (status_prd[0] >> 1) & 1
|
||||
y5_config.ukp1 = (status_prd[0] >> 2) & 1
|
||||
y5_config.ukp2 = (status_prd[0] >> 3) & 1
|
||||
y5_config.ug = (status_prd[0] >> 1) & 1 != 0
|
||||
y5_config.ukp1 = (status_prd[0] >> 2) & 1 != 0
|
||||
y5_config.ukp2 = (status_prd[0] >> 3) & 1 != 0
|
||||
return y5_config
|
||||
|
||||
|
||||
|
||||
@@ -233,7 +233,7 @@ func _on_request_completed(result: int, response_code: int, _headers: PackedStri
|
||||
_on_request_finished()
|
||||
else:
|
||||
var error_msg = 'HTTP ошибка %d: %s' % [response_code, get_result_string(result)]
|
||||
print_debug(error_msg)
|
||||
log.message(Logger.ERROR, error_msg)
|
||||
_save_error(error_msg)
|
||||
|
||||
_update_online_status(device_str, side_str, false)
|
||||
@@ -290,7 +290,7 @@ func _emit_afsp_serviceability_signal(side: String, state: int) -> void:
|
||||
func _check_all_tests_passed(response_text: String) -> bool:
|
||||
var json = JSON.new()
|
||||
if json.parse(response_text) != OK:
|
||||
print('[rtr] Ошибка парсинга JSON')
|
||||
log.message(Logger.ERROR, '[rtr] Ошибка парсинга JSON')
|
||||
return false
|
||||
|
||||
var data = json.data
|
||||
@@ -322,7 +322,7 @@ func _check_system_passed(system: Dictionary) -> bool:
|
||||
var dev_name = dev.get('DevName', 'Неизвестное устройство')
|
||||
var dev_id = dev.get('DevId', '?')
|
||||
var error_text = dev.get('ErrorText', 'Нет описания ошибки')
|
||||
print('[rtr] НАЙДЕНА ОШИБКА! Устройство: %s (ID: %s). TestPassed: false. Причина: %s' % [dev_name, dev_id, error_text])
|
||||
print_debug('[rtr] НАЙДЕНА ОШИБКА! Устройство: %s (ID: %s). TestPassed: false. Причина: %s' % [dev_name, dev_id, error_text])
|
||||
|
||||
# Рекурсивно проверяем вложенные подсистемы
|
||||
var sub_systems = system.get('SystemList', [])
|
||||
@@ -388,7 +388,7 @@ func _request_next(next_state: State) -> void:
|
||||
return
|
||||
|
||||
if current_url.is_empty():
|
||||
print('URL не задан для ', current_state)
|
||||
push_error('URL не задан для ', current_state)
|
||||
var error_msg = 'URL не задан'
|
||||
_save_error(error_msg)
|
||||
|
||||
@@ -422,7 +422,7 @@ func _request_next(next_state: State) -> void:
|
||||
timeout_timer.start(timeout)
|
||||
var error = http_request.request(current_url)
|
||||
if error != OK:
|
||||
print('Ошибка запроса: ', error_string(error))
|
||||
log.message(Logger.ERROR, 'Ошибка запроса: %s' & error)
|
||||
var error_msg = 'Ошибка запроса: ' + error_string(error)
|
||||
_save_error(error_msg)
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user