Merge remote-tracking branch 'sasha/master'
This commit is contained in:
@@ -23,8 +23,8 @@ class CapsRpb:
|
||||
func _to_string() -> String: return String('капсрпб: "%s" %s ' % [self.name, ['отключен', 'на связи'][int(online)]])
|
||||
func _init(nm): self.name = nm
|
||||
|
||||
func parse(data):
|
||||
tick_rx = tick
|
||||
func parse(data: PackedByteArray, now_tick: int):
|
||||
tick = now_tick
|
||||
if not online:
|
||||
online = true
|
||||
emit_signal('line_changed', self)
|
||||
@@ -36,8 +36,7 @@ class CapsRpb:
|
||||
var msg = json_conv.get_error_message()
|
||||
emit_signal('parse_error', self, msg)
|
||||
|
||||
func process(delta: float):
|
||||
tick += delta
|
||||
if online and ((tick - tick_rx) > ONLINE_TIMEOUT):
|
||||
func process(now_tick: int):
|
||||
if online and ((now_tick - tick) > ONLINE_TIMEOUT):
|
||||
online = false
|
||||
emit_signal('line_changed', self)
|
||||
|
||||
@@ -48,20 +48,21 @@ func _ready() -> void:
|
||||
for key in units: Log.info('%s %s:%d' % [units[key].name, key[0], key[1]])
|
||||
|
||||
|
||||
func poll_receive(sock: Socket) -> bool:
|
||||
func poll_receive(sock: Socket, tick: int) -> bool:
|
||||
while sock.get_available_packet_count() > 0:
|
||||
var data: = sock.get_packet()
|
||||
var addr: = sock.get_packet_ip()
|
||||
var port: = sock.get_packet_port()
|
||||
var addr_port: = [addr, port]
|
||||
if addr_port in units: units[addr_port].parse(data)
|
||||
if addr_port in units: units[addr_port].parse(data, tick)
|
||||
return false
|
||||
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
func _process(_delta: float) -> void:
|
||||
var tick = Time.get_ticks_msec()
|
||||
for addr in units:
|
||||
var unit = units[addr]
|
||||
match unit.process(delta):
|
||||
match unit.process(tick):
|
||||
Error.OK: sock_unicast.send_to(addr, unit.data_tx)
|
||||
Error.FAILED: emit_signal('socket_error', 'ошибка: %s %s:%d' % [unit, addr[0], addr[1]])
|
||||
poll_sockets.any(func(sock): poll_receive(sock))
|
||||
poll_sockets.any(func(sock): poll_receive(sock, tick))
|
||||
|
||||
@@ -22,16 +22,18 @@ extends Node
|
||||
'уарэп-яу07-3в': ['yau07tx', '10.1.1.50', 50050, false, false, 'IP-адрес ЯУ-07 прибора ПРД-В'],
|
||||
'уарэп-яу07-3н': ['yau07tx', '10.1.1.49', 50049, false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'],
|
||||
'уарэп-яу07-3к': ['yau07tx', '10.1.1.51', 50051, false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'],
|
||||
'уарэп-щ3': ['uart', '/dev/stty0', 115200, 1, 1, false, 1000, 'Прибор Щ3'] } # скорость, стартовых, стоповых, чётность, таймаут в мкс
|
||||
'уарэп-щ3': ['uart', '/dev/stty0', 115200, 1, 1, false, 1000, 'Прибор Щ3'] } # скорость, стартовых, стоповых, чётность, таймаут в мкс
|
||||
|
||||
|
||||
## Параметры цели
|
||||
@export var ThreatParams = {
|
||||
'time_lost': [5.0, 'Время после последнего обновления в с, через которое цель считается потерянной'],
|
||||
'freq_min': [200.0, 'Нижняя рабочая частота, МГЦ'],
|
||||
'freq_max': [6000.0, 'Нижняя рабочая частота, МГЦ'],
|
||||
'radius_inner': [100, 'Внутренний радиус в пикселях для отображения частота-пеленг'],
|
||||
'radius_outter': [800, 'Наружний радиус в пикселях для отображения частота-пеленг'] }
|
||||
'radius_center': Vector2(560, 560), ## Координаты центра диаграммы в пикселях для отображения частота-пеленг
|
||||
'time_lost': 5000, ## Время после последнего обновления в мс, через которое цель считается потерянной
|
||||
'freq_low': 200.0, ## Нижняя рабочая частота, МГЦ
|
||||
'freq_high': 6000.0, ## Нижняя рабочая частота, МГЦ
|
||||
'radius_inner': 100, ## Внутренний радиус диаграммы в пикселях для отображения частота-пеленг
|
||||
'radius_outter': 800 ## Наружний радиус диаграммы в пикселях для отображения частота-пеленг
|
||||
}
|
||||
|
||||
|
||||
func _ready() -> void: Log.info('Модуль настроек готов')
|
||||
@@ -39,6 +41,6 @@ func _ready() -> void: Log.info('Модуль настроек готов')
|
||||
|
||||
## Возвращает ключ устройства
|
||||
func get_unit_key(unit_name: String) -> Array:
|
||||
assert(unit_name in UnitProfiles, 'ошибка: нет такого устройства "%s"' % unit_name)
|
||||
assert(UnitProfiles.has(unit_name), 'ошибка: нет такого устройства \"%s\"' % unit_name)
|
||||
var item = UnitProfiles[unit_name]
|
||||
return [item[1], item[2]]
|
||||
|
||||
@@ -23,7 +23,6 @@ class Threat:
|
||||
var slon: float ## Координаты старта, долгота в градусах.
|
||||
var tick: int ## Время приёма сигнала, мс.
|
||||
var tmod: String ## Тип модуляции.
|
||||
var utime: Dictionary ## Время крайнего обновления.
|
||||
var width: float ## Ширина занимаемого диапазона частот, МГц.
|
||||
var id: int ## Идентификатор цели.
|
||||
|
||||
@@ -31,7 +30,7 @@ class Threat:
|
||||
func _to_string() -> String: return 'номер:%d пеленг:%0.1f частота:%0.1f МГц' % [id, aoa, freq]
|
||||
|
||||
func set_from_dic(dic_vals: Dictionary):
|
||||
var items: = fflags.keys().filter(func(vn): return vn in dic_vals)
|
||||
var items: = fflags.keys().filter(func(vn): return dic_vals.has(vn))
|
||||
items.any(func(vn): set(vn, dic_vals[vn]); fflags[vn] = true; return false)
|
||||
|
||||
|
||||
@@ -39,6 +38,7 @@ signal threat_new(threats: Dictionary, th: Threat)
|
||||
signal threat_lost(threats: Dictionary, th: Threat)
|
||||
signal threat_update(threats: Dictionary, th: Threat)
|
||||
|
||||
|
||||
var threats = {} ## Список целей. Индекс - <источник цели>:<номер цели> Источник цели может быть: 'RPB', 'SIGMA', 'RLKS', 'MP405'
|
||||
|
||||
|
||||
@@ -48,20 +48,21 @@ func _ready() -> void:
|
||||
var unit = REPNetwork.units[unit_key]
|
||||
var timer_check_lost: = Timer.new()
|
||||
add_child(timer_check_lost)
|
||||
#unit.connect('data_received', Callable(self, 'on_data_capsrpb_received'))
|
||||
timer_check_lost.connect('timeout', Callable(self, 'on_timer_check_lost').bind(unit, REPSettings.ThreatParams.time_lost[0]))
|
||||
timer_check_lost.start(REPSettings.ThreatParams.time_lost[0] / 2.0)
|
||||
unit.connect('data_received', Callable(self, 'on_data_capsrpb_received'))
|
||||
timer_check_lost.connect('timeout', Callable(self, 'on_timer_check_lost').bind(REPSettings.ThreatParams.time_lost))
|
||||
timer_check_lost.start(REPSettings.ThreatParams.time_lost / 2.0)
|
||||
|
||||
|
||||
## Периодически проверяет приборы на связи
|
||||
func on_timer_check_lost(unit, time_lost: int):
|
||||
func on_timer_check_lost(time_lost: int):
|
||||
var tick = Time.get_ticks_msec()
|
||||
for th in threats.values():
|
||||
if (unit.tick - th.atick) >= time_lost:
|
||||
if (tick - th.tick) >= time_lost:
|
||||
threats.erase(th.id)
|
||||
call_deferred('emit_signal', 'threat_lost', threats, th)
|
||||
emit_signal('threat_lost', threats, th)
|
||||
|
||||
|
||||
## Приём целей
|
||||
## Производит приём целей
|
||||
func on_data_capsrpb_received(unit: capsrpb.CapsRpb):
|
||||
if 'mis' not in unit.json_dic:
|
||||
return
|
||||
@@ -72,12 +73,12 @@ func on_data_capsrpb_received(unit: capsrpb.CapsRpb):
|
||||
if threats.has(id):
|
||||
var th = threats[id]
|
||||
th.set_from_dic(dic_th)
|
||||
th.atick = unit.tick
|
||||
call_deferred('emit_signal', threat_update, threats, th)
|
||||
th.tick = unit.tick
|
||||
call_deferred('emit_signal', 'threat_update', threats, th)
|
||||
else:
|
||||
var th = Threat.new()
|
||||
th.set_from_dic(dic_th)
|
||||
th.atick = unit.tick
|
||||
th.fflags['atick'] = true
|
||||
th.tick = unit.tick
|
||||
th.fflags['tick'] = true
|
||||
threats[id] = th
|
||||
call_deferred('emit_signal', 'threat_new', threats, th)
|
||||
|
||||
@@ -7,7 +7,7 @@ extends Node
|
||||
func type_is_num(val) -> bool: return (typeof(val) == TYPE_INT) or (typeof(val) == typeof(0.0))
|
||||
|
||||
|
||||
## Производит преобразование из угла в радианы
|
||||
## Возвращае значение в радианах для угла в градусах [param val].
|
||||
func radians(val: float): return (val * PI) / 180.0
|
||||
|
||||
|
||||
@@ -24,7 +24,8 @@ func is_overlap(x1, x2, y1, y2): return max(x1, y1) <= min(x2, y2)
|
||||
|
||||
|
||||
## Производит преобразование из декартовой в полярную систему координат
|
||||
func pos_calc(freq: float, aoa: float, pos0: Vector2, r0: float, r1: float, f0: float, df: float):
|
||||
func pos_calc(freq: float, aoa: float, pos0: Vector2, r0: float, r1: float, f0: float, f1: float):
|
||||
var df = f1 - f0
|
||||
var r = ((freq - f0) / df) * r1 + r0
|
||||
var aoa_rad = Tools.radians(aoa) - PI / 2.0
|
||||
var x = cos(aoa_rad) * r + pos0.x
|
||||
@@ -72,9 +73,10 @@ func map_range(val: float, a0: float, a1: float, b0: float, b1: float) -> float:
|
||||
|
||||
## Возвращает true, если точка внутри заданного полигона
|
||||
func is_point_in_polygon(pos: Vector2, p: PackedVector2Array) -> bool:
|
||||
assert(len(p))
|
||||
var j: int = len(p) - 1
|
||||
var odd_nodes: int = 0
|
||||
for i in range(len(p)):
|
||||
for i in len(p):
|
||||
if ((p[i].y < pos.y and p[j].y >= pos.y or p[j].y < pos.y and p[i].y >= pos.y) and (p[i].x <= pos.x or p[j].x <= pos.x)):
|
||||
odd_nodes ^= int((p[i].x + (pos.y - p[i].y) / (p[j].y - p[i].y) * (p[j].x - p[i].x) < pos.x))
|
||||
j = i
|
||||
|
||||
@@ -2,7 +2,7 @@ extends Node
|
||||
|
||||
## Протокол ячейки ЯУ-07
|
||||
|
||||
const ONLINE_TIMEOUT = 5.0 ## Время ожидания пакета от ячейки, секунды
|
||||
const ONLINE_TIMEOUT = 5000 ## Время ожидания пакета от ячейки, секунды
|
||||
const RESEND_TIMEOUT = 0.3 ## Задержка для повторной отправки команды, секунды
|
||||
const RETRY_COUNT = 5 ## Количество повторных отправок
|
||||
const BUFFER_SIZE = 2048 ## Размер буфера для приёма датаграмм
|
||||
@@ -19,7 +19,7 @@ class YaU07:
|
||||
|
||||
## Состояние автомата выполнения команды
|
||||
enum CmdState {
|
||||
UNCK, ## Номер команды не ининцирован
|
||||
UNCK, ## Номер команды не ининциирован
|
||||
SEND, ## Буфер готов для отправки
|
||||
WAIT, ## Ожидание выполнения
|
||||
DONE, ## Команда выполнена
|
||||
@@ -64,7 +64,7 @@ class YaU07:
|
||||
|
||||
var rc = Error.ERR_BUSY
|
||||
if cmd_state == CmdState.SEND:
|
||||
rc = rc.OK
|
||||
rc = Error.OK
|
||||
cmd_tick_tx = tick
|
||||
cmd_state = CmdState.WAIT
|
||||
cmd_retry = RETRY_COUNT
|
||||
@@ -147,10 +147,10 @@ class YaU07:
|
||||
|
||||
|
||||
## Заполняет состояние прибора данными прочитанными из портов ЯУ-07
|
||||
## для команд "читать порты" или "записать порты"
|
||||
## rx_data - Принятые данные
|
||||
## Возвращает True - Данные обработаны успешно,
|
||||
## Возвращает False - Данные не обработаны из за ошибки
|
||||
## для команд "читать порты" или "записать порты"[br]
|
||||
## [param rx_data] - Принятые данные[br]
|
||||
## Возвращает [b]true[/b] - Данные обработаны успешно[br]
|
||||
## Возвращает [b]false[/b] - Данные не обработаны из за ошибки[br]
|
||||
func parse(rx_data: PackedByteArray) -> bool:
|
||||
|
||||
if not online:
|
||||
@@ -169,7 +169,7 @@ class YaU07:
|
||||
if rx_data_len < (status_len + 6):
|
||||
return false
|
||||
var i: = 0
|
||||
var len_rx_data = rx_data.size()
|
||||
var len_rx_data: = rx_data.size()
|
||||
status.resize(status_len)
|
||||
while i < status_len:
|
||||
var byte_i = i + 8
|
||||
|
||||
Reference in New Issue
Block a user