Merge remote-tracking branch 'sasha/master'
# Conflicts: # scenes/button-flat.tscn # scenes/tab_switch.tscn # scenes/ЭМС.tscn # scenes/работа.tscn
This commit is contained in:
@@ -9,13 +9,13 @@ const BUFFER_SIZE = 2048 ## Размер приёмного буфера д
|
||||
|
||||
|
||||
class CapsRpb:
|
||||
signal line_changed(unit: CapsRpb) ## Сигнал состояние связи изменилось
|
||||
signal data_received(unit: CapsRpb) ## Сигнал данные приняты
|
||||
signal command_fail(unit: CapsRpb) ## Сигнал при не выполнении команды
|
||||
signal parse_error(unit: CapsRpb, msg: String) ## Сигнал ошибки разбора сообщения
|
||||
signal line_changed(unit: CapsRpb) ## Сигнал состояние связи изменилось
|
||||
signal data_received(unit: CapsRpb) ## Сигнал данные приняты
|
||||
signal command_fail(unit: CapsRpb) ## Сигнал при не выполнении команды
|
||||
signal parse_error(unit: CapsRpb, msg: String) ## Сигнал ошибки разбора сообщения
|
||||
|
||||
static var json_conv: = JSON.new()
|
||||
var online: = false ## Состояние на связи
|
||||
var online: = false ## Состояние связи с источником сообщений
|
||||
var name: String ## Имя экземпляра
|
||||
var json_dic: Dictionary ## Аппарат для разбора сообщений
|
||||
var tick: = 0 ## Тик время последнего обновления, мс
|
||||
|
||||
82
scripts/interfer.gd
Normal file
82
scripts/interfer.gd
Normal file
@@ -0,0 +1,82 @@
|
||||
extends Node
|
||||
|
||||
## Представление помехи
|
||||
|
||||
## Состояние выполнения сеанса помехи
|
||||
const INTERFER_STATE = {
|
||||
0: 'идёт подготовка к выполнению',
|
||||
1: 'выполняется',
|
||||
2: 'не выполнена по причине ошибки в команде',
|
||||
3: 'не выполнена по причине занятости',
|
||||
4: 'не выполнена по причине_неисправности' }
|
||||
|
||||
|
||||
## Режимы помехи
|
||||
const ITERFER_MODE = {
|
||||
'srni1': ['СРН-И1', ['freq', 'width']],
|
||||
'srnm2': ['СРН-М2', ['freq', 'width']],
|
||||
'lchm1': ['ЛЧМ-1', ['freq', 'width']],
|
||||
'mchm1': ['МЧМ-1', ['freq', 'width']],
|
||||
'pdm2': ['ПД-М2', ['freq', 'width']],
|
||||
'pdm4': ['ПД-М4', ['freq', 'width']],
|
||||
'pdm4s': ['ПД-М4С', ['freq', 'width']],
|
||||
'pdchm': ['ПД-ЧМ', ['freq', 'width']],
|
||||
'svi1': ['СВ-И1', ['freq', 'width']],
|
||||
'svm2': ['СВ-М2', ['freq', 'width']],
|
||||
'k1': ['K1', ['freq', 'width', 'dur', 'period']],
|
||||
'ozp1': ['ОЗП-1', ['freq', 'width']] }
|
||||
|
||||
|
||||
## Сеанс помехи
|
||||
class Interfer:
|
||||
var ss: int = 0 ## Счётчик сообщений.
|
||||
var ispp: int = 0 ## Индекс сеанса.
|
||||
var state: = 0 ## Состояние сеанса. Ответ КАПСРПБ. Возможные значения в [param ITERFER_STATE].
|
||||
var krp: String = '' ## Тип помехи. Возможные значения в [param INTERFER_MODE].
|
||||
var powp: float = 0.0 ## Мощность излучения выраженная в процентах.
|
||||
var kni: = 0.0 ## Курсовой угол направления излучения.
|
||||
var params: = {} ## Параметры помехи.
|
||||
var get: Array[String] ## Запрос массива параметров (список запрошенных параметров).
|
||||
var retss: int ## Значение счётчика сообщения в котором был произведён запрос массива параметров.
|
||||
|
||||
|
||||
func set_from_dic(dic: Dictionary):
|
||||
var names: = Tools.get_members_names(self)
|
||||
names.any(func(vn): if dic.has(vn): set(vn, dic[vn]); return false)
|
||||
|
||||
|
||||
signal interfer_preparing(ecm: Interfer) ## Вызывается при запуске помехи
|
||||
signal interfer_run(ecm: Interfer) ## Вызывается в момент начала работы помехи
|
||||
signal interfer_error(ecm: Interfer, msg: String) ## Вызывается при ошибке
|
||||
signal interfer_update(ecm: Interfer) ## Вызывается при обновлении помехи
|
||||
signal interfer_new(ecm: Interfer) ## Вызывается при новой помехе
|
||||
signal interfer_resized(ecms: Dictionary) ## Вызывается при изменении количества сеансов помех
|
||||
|
||||
|
||||
## Производит приём состояния помех. [param unit] -> [param ecms]
|
||||
func on_data_capsrpb_received(unit: capsrpb.CapsRpb, ecms: Dictionary):
|
||||
if not unit.json_dic.has('ts'): return
|
||||
if not (unit.json_dic['ts'] is int): return
|
||||
if unit.json_dic['ts'] != 5: return
|
||||
if not unit.json_dic.has('msvk'): return
|
||||
if not (unit.json_dic['msvk'] is Array): return
|
||||
|
||||
var msvk = unit.json_dic['msvk']
|
||||
var sz: = ecms.size()
|
||||
for dic_msvk in msvk:
|
||||
if not (dic_msvk is Dictionary): continue
|
||||
if dic_msvk.has('ispp'):
|
||||
var ispp = int(dic_msvk['ispp'])
|
||||
if ecms.has(ispp):
|
||||
var ecm = ecms[ispp]
|
||||
ecm.set_from_dic(dic_msvk)
|
||||
ecm.tick_rx = unit.tick
|
||||
call_deferred('emit_signal', 'interfer_update', ecm)
|
||||
else:
|
||||
var ecm = Interfer.new()
|
||||
ecm.set_from_dic(dic_msvk)
|
||||
ecms[ispp] = ecm
|
||||
ecm.tick_rx = unit.tick
|
||||
call_deferred('emit_signal', 'interfer_new', ecm)
|
||||
if sz != ecms.size():
|
||||
call_deferred('emit_signal', 'interfer_resized', ecms)
|
||||
@@ -1,13 +1,15 @@
|
||||
extends Node
|
||||
|
||||
|
||||
const PROTOCOL_TYPES: = {'yau07tx': yau07.YaU07, 'jsontx': capsrpb.CapsRpb}
|
||||
|
||||
|
||||
class Socket extends PacketPeerUDP:
|
||||
func send_to(addr, data):
|
||||
self.set_dest_address(addr[0], addr[1])
|
||||
self.put_packet(data)
|
||||
|
||||
|
||||
const PROTOCOL_TYPES: = {'yau07tx': yau07.YaU07, 'jsontx': capsrpb.CapsRpb}
|
||||
var poll_sockets: Array[Socket]
|
||||
var units: Dictionary
|
||||
var sock_unicast: Socket
|
||||
|
||||
@@ -2,9 +2,15 @@ extends Node
|
||||
|
||||
## Параметры
|
||||
|
||||
## Профили внешних устройств
|
||||
## Профили внешних устройств.[br]
|
||||
## [param key] - Название.[br]
|
||||
## [param val[0]] - Протокол.[br]
|
||||
## [param val[1]] - Адрес.[br]
|
||||
## [param val[2]] - Порт.[br]
|
||||
## [param val[3]] - Широковещательное.[br]
|
||||
## [param val[4]] - Привязывать к адресу.[br]
|
||||
## [param val[5]] - Комментарий.[br]
|
||||
@export var UnitProfiles: = { \
|
||||
# Название Протокол Адрес Порт Широков. Привяз. Комментарий
|
||||
'уарэп-яу07-частный': ['yau07rx', '127.0.0.1', 50079, false, true, 'IP-адрес на котором принимают частные сообщения от ЯУ-07'],
|
||||
'уарэп-яу07-общий': ['yau07rx', '127.0.0.255', 50000, true, true, 'IP-адрес на котором принимают широковещательные сообщения от ЯУ-07'],
|
||||
'уарэп-капсрпб-пол': ['jsonrx', '127.0.0.1', 42023, false, true, 'IP-адрес на котором принимают сообщения от КАПС РПБ'],
|
||||
@@ -27,12 +33,12 @@ extends Node
|
||||
|
||||
## Параметры цели
|
||||
@export var ThreatParams = {
|
||||
'radius_center': Vector2(560, 560), ## Координаты центра диаграммы в пикселях для отображения частота-пеленг
|
||||
'time_lost': 5000, ## Время после последнего обновления в мс, через которое цель считается потерянной
|
||||
'freq_low': 200.0, ## Нижняя рабочая частота, МГЦ
|
||||
'freq_high': 6000.0, ## Нижняя рабочая частота, МГЦ
|
||||
'radius_inner': 200, ## Внутренний радиус диаграммы в пикселях для отображения частота-пеленг
|
||||
'radius_outter': 550 ## Наружний радиус диаграммы в пикселях для отображения частота-пеленг
|
||||
'radius_center': Vector2(560, 560), ## Координаты центра диаграммы в пикселях для отображения частота-пеленг.
|
||||
'time_lost': 5000, ## Время после последнего обновления в мс, через которое цель считается потерянной.
|
||||
'freq_low': 200.0, ## Нижняя рабочая частота, МГЦ.
|
||||
'freq_high': 6000.0, ## Верхняя рабочая частота, МГЦ.
|
||||
'radius_inner': 200, ## Внутренний радиус диаграммы в пикселях для отображения частота-пеленг.
|
||||
'radius_outter': 550 ## Наружний радиус диаграммы в пикселях для отображения частота-пеленг.
|
||||
}
|
||||
|
||||
|
||||
|
||||
16
scripts/signaller.gd
Normal file
16
scripts/signaller.gd
Normal file
@@ -0,0 +1,16 @@
|
||||
class_name Signaller extends Node
|
||||
|
||||
|
||||
## Обмен сигналами между узлами
|
||||
|
||||
|
||||
## Вызывается, когда оператор выбирает цель.
|
||||
## [param threats] - Словарь. Ключ - идентификатор (номер) цели. Значение - цель
|
||||
## [param th] - Выбранная цель [br]
|
||||
signal threat_selected(threats: Dictionary, th)
|
||||
|
||||
|
||||
## Вызывается, когда оператор снимает выбор цели.
|
||||
## [param threats] - Словарь. Ключ - идентификатор (номер) цели. Значение - цель
|
||||
## [param th] - Ранее выбранная цель [br]
|
||||
signal threat_unselected(threats: Dictionary, th)
|
||||
@@ -1,6 +1,6 @@
|
||||
extends Node
|
||||
|
||||
##
|
||||
## Работа с целями
|
||||
|
||||
|
||||
## Цель
|
||||
@@ -12,6 +12,7 @@ class Threat:
|
||||
var fflags: Dictionary ## Флаги достоверности полей.
|
||||
var freq: float ## Частота несущей или центральная частота, МГц.
|
||||
var freqm: String ## Режим смены частоты.
|
||||
var id: int ## Идентификатор цели.
|
||||
var lat: float ## Текущие координаты, долгота в градусах.
|
||||
var lon: float ## Текущие координаты, широта в градусах.
|
||||
var power: float ## Уровень принимаемого сигнала, дБм.
|
||||
@@ -22,63 +23,71 @@ class Threat:
|
||||
var slat: float ## Координаты старта, широта в градусах.
|
||||
var slon: float ## Координаты старта, долгота в градусах.
|
||||
var tick: int ## Тик время приёма сигнала, мс.
|
||||
var tick_rx: int ## Тик время обновления цели, мс.
|
||||
var tmod: String ## Тип модуляции.
|
||||
var width: float ## Ширина занимаемого диапазона частот, МГц.
|
||||
var id: int ## Идентификатор цели.
|
||||
|
||||
func _init(): Tools.get_members_names(self).any(func(vn): fflags[vn] = false)
|
||||
func _to_string() -> String: return 'номер:%d пеленг:%0.1f частота:%0.1f МГц' % [id, aoa, freq]
|
||||
func _init(): clear_fflags()
|
||||
func _to_string() -> String: return '<Threat>: номер:%d пеленг:%0.1f частота:%0.1f МГц' % [id, aoa, freq]
|
||||
func clear_fflags(): Tools.get_members_names(self).any(func(vn): fflags[vn] = false)
|
||||
|
||||
func set_from_dic(dic_vals: Dictionary):
|
||||
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)
|
||||
func set_from_dic(dic: Dictionary):
|
||||
var items: = fflags.keys().filter(func(vn): return dic.has(vn))
|
||||
items.any(func(vn): set(vn, dic[vn]); fflags[vn] = true; return false)
|
||||
|
||||
|
||||
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'
|
||||
signal threat_new(th: Threat)
|
||||
signal threat_lost(th: Threat)
|
||||
signal threat_update(th: Threat)
|
||||
signal threats_resized(th: Dictionary)
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
Log.info('Модуль обработки целей готов')
|
||||
var threats = {} ## Список целей. Индекс - <номер цели>
|
||||
var unit_key = REPSettings.get_unit_key('уарэп-капсрпб-отп')
|
||||
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(REPSettings.ThreatParams.time_lost))
|
||||
unit.connect('data_received', Callable(self, 'on_data_capsrpb_received').bind(threats))
|
||||
timer_check_lost.connect('timeout', Callable(self, 'on_timer_check_lost').bind(REPSettings.ThreatParams.time_lost, threats))
|
||||
timer_check_lost.start(REPSettings.ThreatParams.time_lost / 1000.0)
|
||||
|
||||
|
||||
## Периодически проверяет приборы на связи
|
||||
func on_timer_check_lost(time_lost: int):
|
||||
## Периодически удаляет устаревшие цели
|
||||
func on_timer_check_lost(time_lost: int, threats: Dictionary):
|
||||
var tick = Time.get_ticks_msec()
|
||||
var sz: = threats.size()
|
||||
for th in threats.values():
|
||||
if (tick - th.tick) >= time_lost:
|
||||
if (tick - th.tick_rx) >= time_lost:
|
||||
threats.erase(th.id)
|
||||
emit_signal('threat_lost', threats, th)
|
||||
call_deferred('emit_signal', 'threat_lost', th)
|
||||
if sz != threats.size():
|
||||
call_deferred('emit_signal', 'threats_resized', threats)
|
||||
|
||||
|
||||
## Производит приём целей
|
||||
func on_data_capsrpb_received(unit: capsrpb.CapsRpb):
|
||||
if 'mis' not in unit.json_dic:
|
||||
return
|
||||
func on_data_capsrpb_received(unit: capsrpb.CapsRpb, threats: Dictionary):
|
||||
if not unit.json_dic.has('ts'): return
|
||||
if unit.json_dic['ts'] != 5: return
|
||||
if not unit.json_dic.has('mis'): return
|
||||
|
||||
var mis = unit.json_dic['mis']
|
||||
var sz: = threats.size()
|
||||
for dic_th in mis:
|
||||
if dic_th.has('id'):
|
||||
var id = int(dic_th['id'])
|
||||
if threats.has(id):
|
||||
var th = threats[id]
|
||||
th.clear_fflags()
|
||||
th.set_from_dic(dic_th)
|
||||
th.tick = unit.tick
|
||||
call_deferred('emit_signal', 'threat_update', threats, th)
|
||||
th.tick_rx = unit.tick
|
||||
call_deferred('emit_signal', 'threat_update', th)
|
||||
else:
|
||||
var th = Threat.new()
|
||||
th.set_from_dic(dic_th)
|
||||
th.tick = unit.tick
|
||||
th.fflags['tick'] = true
|
||||
threats[id] = th
|
||||
call_deferred('emit_signal', 'threat_new', threats, th)
|
||||
th.tick_rx = unit.tick
|
||||
call_deferred('emit_signal', 'threat_new', th)
|
||||
if sz != threats.size():
|
||||
call_deferred('emit_signal', 'threats_resized', threats)
|
||||
|
||||
@@ -73,10 +73,11 @@ 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 sz: = p.size()
|
||||
assert(sz)
|
||||
var j: int = sz - 1
|
||||
var odd_nodes: int = 0
|
||||
for i in len(p):
|
||||
for i in sz:
|
||||
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
|
||||
@@ -85,6 +86,6 @@ func is_point_in_polygon(pos: Vector2, p: PackedVector2Array) -> bool:
|
||||
|
||||
## Записывает слово [param val] в элемент байтовго массива [param buf]
|
||||
## расположенный по индексу [param index]. Младшее слово
|
||||
func set_wordi(buf: Array, index: int, val: int) -> void:
|
||||
func set_wordi(buf: PackedByteArray, index: int, val: int) -> void:
|
||||
buf[index] = val & 0xff
|
||||
buf[index + 1] = (val >> 8) & 0xff
|
||||
|
||||
@@ -2,10 +2,10 @@ extends Node
|
||||
|
||||
## Протокол ячейки ЯУ-07
|
||||
|
||||
const ONLINE_TIMEOUT = 5000 ## Время ожидания пакета от ячейки, секунды
|
||||
const RESEND_TIMEOUT = 0.3 ## Задержка для повторной отправки команды, секунды
|
||||
const BUFFER_SIZE = 2048 ## Размер буфера для приёма датаграмм, байты
|
||||
const ONLINE_TIMEOUT = 5000 ## Время ожидания пакета от ячейки, мс
|
||||
const RESEND_TIMEOUT = 300 ## Задержка для повторной отправки команды, мс
|
||||
const RETRY_COUNT = 5 ## Количество повторных отправок
|
||||
const BUFFER_SIZE = 2048 ## Размер буфера для приёма датаграмм
|
||||
|
||||
|
||||
## Ячейка ЯУ-07
|
||||
@@ -19,32 +19,32 @@ class YaU07:
|
||||
|
||||
## Состояние автомата выполнения команды
|
||||
enum CmdState {
|
||||
UNCK, ## Номер команды не ининциирован
|
||||
SEND, ## Буфер готов для отправки
|
||||
WAIT, ## Ожидание выполнения
|
||||
DONE, ## Команда выполнена
|
||||
FAIL ## Команда не выполнена
|
||||
FAIL, ## Команда не выполнена
|
||||
SEND, ## Буфер готов для отправки
|
||||
UNCK, ## Номер команды не ининциирован
|
||||
WAIT ## Ожидание выполнения
|
||||
}
|
||||
|
||||
signal line_changed(unit: YaU07) ## Вызывается когда меняется состояние связи с ячейкой
|
||||
signal command_done(unit: YaU07) ## Вызывается после выполнения команды
|
||||
signal command_fail(unit: YaU07) ## Вызывается если возникла ошибка при выполнении команды и команда не выполнена
|
||||
|
||||
var name: = String()
|
||||
var cmd_data: = PackedByteArray() ## Данные команды. Устанавливается в ЯУ-07
|
||||
var cmd_num_rx: = 0 ## Номер команды принятый
|
||||
var cmd_num_tx: = 0 ## Номер команды переданный
|
||||
var cmd_state = CmdState.UNCK ## Состояние выполнения команды
|
||||
var cmd_result: = 1 ## Результат выполнения команды. Устанавливается в ЯУ-07
|
||||
var cmd_data: = PackedByteArray() ## Данные команды. Устанавливается в ЯУ-07
|
||||
var cmd_retry = 0 ## Счётчик оставшихся попыток выполнить команду
|
||||
var tick = 0.0 ## Текущее тик-время в мс
|
||||
var cmd_tick_tx = 0.0 ## Время последней отправки команды
|
||||
var cmd_state = CmdState.UNCK ## Состояние выполнения команды
|
||||
var cmd_tick_rx = 0.0 ## Время последнего приёма команды
|
||||
var status: = PackedByteArray() ## Поле "состояние прибора"
|
||||
var tx_data: = [] ## Буфер отправленный
|
||||
var tx_len = 0 ## Длина последнего отправленного пакета
|
||||
var cmd_tick_tx = 0.0 ## Время последней отправки команды
|
||||
var isa_ports = {} ## Результат выполнения команды "читать порт"
|
||||
var name: = String() ## Имя
|
||||
var online = false ## Состояние связи с ячейкой
|
||||
var status: = PackedByteArray() ## Поле "состояние прибора"
|
||||
var tick = 0.0 ## Текущее тик-время в мс
|
||||
var tx_data: = PackedByteArray() ## Буфер отправленный
|
||||
var tx_len = 0 ## Длина последнего отправленного пакета
|
||||
|
||||
func _to_string() -> String: return String('яу07: %s %s' % [self.name, ['отключен', 'на связи'][int(online)]])
|
||||
|
||||
@@ -56,8 +56,8 @@ class YaU07:
|
||||
tick = 0.0
|
||||
|
||||
|
||||
func process(delta: float):
|
||||
tick += delta
|
||||
func process(t: int):
|
||||
tick = t
|
||||
if online and ((tick - cmd_tick_rx) > ONLINE_TIMEOUT):
|
||||
online = false
|
||||
emit_signal('line_changed', self)
|
||||
@@ -93,7 +93,7 @@ class YaU07:
|
||||
|
||||
var ports_count = ports_data.size()
|
||||
tx_len = ports_count * 2 + 8
|
||||
Tools.set_wordi(tx_data, 2, cmd_num_tx)
|
||||
tx_data.encode_u16(2, cmd_num_tx)
|
||||
|
||||
if cmd_code == CmdCode.WRITE_ISA:
|
||||
ports_count /= 2
|
||||
@@ -102,21 +102,22 @@ class YaU07:
|
||||
|
||||
var i: = 0
|
||||
for word in ports_data:
|
||||
Tools.set_wordi(tx_data, 8 + i, word)
|
||||
tx_data.encode_u16(8 + i, word)
|
||||
i += 2
|
||||
cmd_state = CmdState.SEND
|
||||
return true
|
||||
|
||||
|
||||
## Возвращает код команды ЯУ-07
|
||||
## rx_data - Принятые данные
|
||||
## Возвращает - Код команды не найден, 0...255 - код команды
|
||||
func get_cmd_code(rx_data):
|
||||
## [param rx_data] - Принятые данные[br]
|
||||
## Возвращает [b]null[/b] - Если код команды не найден[br]
|
||||
## Возвращает [b]0...255[/b] - Код команды
|
||||
func get_cmd_code(rx_data: PackedByteArray):
|
||||
|
||||
var rx_data_len = rx_data.size()
|
||||
if rx_data_len < 7:
|
||||
return null
|
||||
var status_len = Tools.ibytes_to_word(rx_data, 6) # Длина массива байтового "состояние прибора"
|
||||
var status_len = rx_data.decode_u16(6) # Длина массива байтового "состояние прибора"
|
||||
if rx_data_len <= (status_len + 6): # Нет поля "ответ на команду", разбор пакета завершить
|
||||
return null
|
||||
var cmd_code_pos = status_len + 8 # Положение в приёмном буфере "кода команды"
|
||||
@@ -125,7 +126,7 @@ class YaU07:
|
||||
return rx_data[cmd_code_pos] # "код команды"
|
||||
|
||||
|
||||
func parse_isa(rx_data, status_len) -> bool:
|
||||
func parse_isa(rx_data: PackedByteArray, status_len) -> bool:
|
||||
var ports_count_pos = status_len + 10 # Положение в приёмном буфере количества портов
|
||||
if rx_data.size() < ports_count_pos:
|
||||
return false
|
||||
@@ -138,11 +139,11 @@ class YaU07:
|
||||
var i: = 0
|
||||
while i < ports_count:
|
||||
var shift: = i * 4
|
||||
var isa_addr = Tools.ibytes_to_word(rx_data, addr_pos + shift) # Адрес порта ISA яу-07
|
||||
var isa_data = Tools.ibytes_to_word(rx_data, data_pos + shift) # Данные порта ISA яу-07
|
||||
var isa_addr = rx_data.decode_u16(addr_pos + shift) # Адрес порта ISA яу-07
|
||||
var isa_data = rx_data.decode_u16(data_pos + shift) # Данные порта ISA яу-07
|
||||
isa_ports[isa_addr] = isa_data
|
||||
i += 1
|
||||
cmd_data = rx_data.subarray(addr_pos, (addr_pos + ports_count * 4) - 1)
|
||||
cmd_data = rx_data.slice(addr_pos, (addr_pos + ports_count * 4) - 1)
|
||||
return i > 0
|
||||
|
||||
|
||||
@@ -161,11 +162,11 @@ class YaU07:
|
||||
if rx_data_len < 11:
|
||||
return false
|
||||
|
||||
cmd_num_rx = Tools.ibytes_to_word(rx_data, 2)
|
||||
cmd_num_rx = rx_data.decode_u16(2)
|
||||
if cmd_state == CmdState.UNCK:
|
||||
cmd_state = CmdState.DONE
|
||||
|
||||
var status_len = Tools.ibytes_to_word(rx_data, 6) # Длина массива байтового "состояние прибора"
|
||||
var status_len = rx_data.decode_u16(6) # Длина массива байтового "состояние прибора"
|
||||
if rx_data_len < (status_len + 6):
|
||||
return false
|
||||
var i: = 0
|
||||
|
||||
Reference in New Issue
Block a user