Merge remote-tracking branch 'MaD_CaT/master'

This commit is contained in:
sasha80
2025-02-12 10:56:43 +03:00
15 changed files with 256 additions and 112 deletions

View File

@@ -50,6 +50,7 @@ class Interfer:
var retss: int ## Значение счётчика сообщения в котором был произведён запрос массива параметров.
var tick_tx: int ## Тик время обновления цели, мс.
var source_interfer: String = '' ## Тип объекта по которой поставлена помеха.
var modulation: bool ## Модуляция для включения усилителей
func _to_string() -> String:
return 'номер: %d название: %s частота: %0.1f МГц пеленг: %0.1f гр.' % [ispp, ITERFER_MODE[krp][0], params['freq'], kni]
@@ -86,7 +87,6 @@ class Interfer:
else:
self.set(value_key, value)
signal interfer_preparing(ecm: Interfer) ## Вызывается в момент запуска помехи.
signal interfer_run(ecm: Interfer) ## Вызывается в момент начала работы помехи.
signal interfer_error(ecm: Interfer, msg: String) ## Вызывается при ошибке.
@@ -149,6 +149,7 @@ func on_th_aoa_update(threats: Dictionary, ecms: Dictionary, unit):
ecm.kni = thr.aoa
send_ecm(ecm, unit)
signaller.emit_signal('fs_update_color', ecms)
prd.update_fs_state(ecms)
if auto_status == 0:
return

View File

@@ -30,6 +30,7 @@ class Socket extends PacketPeerUDP:
put_packet(data)
class SocketTCP extends TCPServer:
const RX_TIMEOUT: int = 1000 ## Время сброса счётчика принятия части пакета.
var peerstream: = PacketPeerStream.new()

150
scripts/prd.gd Normal file
View File

@@ -0,0 +1,150 @@
extends Node
## Границы секторов блоков ФС по частоте в режиме РТО.
const fs_band_rto: Dictionary = {
0: [200.0, 250.0],
1: [250.0, 300.0],
2: [300.0, 350.0],
3: [350.0, 400.0],
4: [400.0, 450.0],
5: [450.0, 500.0],
6: [500.0, 550.0] }
## Границы секторов блоков ФС по частоте в режиме РЛС.
const fs_band_rls: Dictionary = {
0: [480.0, 490.0],
1: [490.0, 500.0],
2: [500.0, 510.0],
3: [510.0, 520.0],
4: [520.0, 530.0],
5: [530.0, 540.0],
6: [540.0, 550.0] }
## Границы секторов блоков ФС по пеленгу.
const fs_sectors: Dictionary = {
0: [0.0, 90.0],
3: [90.0, 180.0],
2: [180.0, 270.0],
1: [270.0, 360.0] }
const fs_freq: Dictionary = {
0: [390.0, 800.0, 200.0, 250.0, 433.0],
1: [800.0, 1065.0, 250.0, 300.0, 860.0],
2: [1065.0, 1210.0, 300.0, 350.0, 1137.0],
3: [1150.0, 1490.0, 350.0, 400.0, 1227.0],
4: [1490.0, 2000.0, 400.0, 450.0, 1575.0],
5: [2000.0, 3500.0, 450.0, 500.0, 2450.0],
6: [3500.0, 6000.0, 500.0, 550.0, 5800.0] }
const prd_names: Array = [
'уарэп-яу07-1н',
'уарэп-яу07-1в',
'уарэп-яу07-1к',
'уарэп-яу07-2н',
'уарэп-яу07-2в',
'уарэп-яу07-2к',
'уарэп-яу07-3н',
'уарэп-яу07-3в',
'уарэп-яу07-3к',
'уарэп-яу07-4н',
'уарэп-яу07-4в',
'уарэп-яу07-4к', ]
const fs_ampls: Dictionary = {
0: ['уарэп-яу07-1к'],
1: ['уарэп-яу07-4к'],
2: ['уарэп-яу07-3к'],
3: ['уарэп-яу07-2к'],
4: ['уарэп-яу07-1н'],
5: ['уарэп-яу07-4н'],
6: ['уарэп-яу07-3н'],
7: ['уарэп-яу07-2н'],
8: ['уарэп-яу07-1н'],
9: ['уарэп-яу07-4н'],
10: ['уарэп-яу07-3н'],
11: ['уарэп-яу07-2н'],
12: ['уарэп-яу07-1в'],
13: ['уарэп-яу07-4в'],
14: ['уарэп-яу07-3в'],
15: ['уарэп-яу07-2в'],
16: ['уарэп-яу07-1в'],
17: ['уарэп-яу07-4в'],
18: ['уарэп-яу07-3в'],
19: ['уарэп-яу07-2в'],
20: ['уарэп-яу07-1к'],
21: ['уарэп-яу07-4к'],
22: ['уарэп-яу07-3к'],
23: ['уарэп-яу07-2к'],
24: ['уарэп-яу07-1к'],
25: ['уарэп-яу07-4к'],
26: ['уарэп-яу07-3к'],
27: ['уарэп-яу07-2к'], }
var fs_dict: Dictionary
var prd_dict: Dictionary
class FsAmpl:
var index ## Индекс блока усилителей
var modulation: int ## Состояние модуляции
var prd_name: String ## Ипя прибора ПРД в котором стоит модуль
func _init(i, p_name):
prd_name = p_name
index = i
func set_modulation(val):
modulation = val
class PRD:
var prd_name: String ## Имя прибора
var unit_yau07 ## Юнит эмс
var fs_dic: Dictionary ## Массив блоков ФС
var yemsg_board ## Плата ЭМС-Г
func _init(u_name ,u, yems_board):
prd_name = u_name
unit_yau07 = u
yemsg_board = yems_board
func _ready() -> void:
for prd_name in prd_names:
var unit_key = settings.get_unit_key(prd_name)
var unit_prd = network.units[unit_key]
for yemsg_board in yemsg.ems_board.values():
if yemsg_board[1] == unit_prd:
var yemsg_b = yemsg_board[0]
var new_prd = PRD.new(prd_name, unit_prd, yemsg_b)
prd_dict[prd_name] = new_prd
for key in fs_ampls.keys():
var fs_ampl = FsAmpl.new(key, fs_ampls[key][0])
fs_dict[key] = fs_ampl
if prd_dict.has(fs_ampl.prd_name):
prd_dict[fs_ampl.prd_name].fs_dic[key] = fs_ampl
func get_fs_index(ecm, fs_index_arr):
var sector: int
var band: Array
var angle: float = ecm.kni + 45.0
if angle > 360.0:
angle -= 360.0
for sec in fs_sectors.values():
if float(angle) >= sec[0] and float(angle) <= sec[1]:
sector = fs_sectors.find_key(sec)
for diap in fs_freq.values():
if ecm.params.has('freq'):
if ecm.params['freq'] >= diap[0] and ecm.params['freq'] <= diap[1]:
band.append(fs_freq.find_key(diap))
for item in band:
fs_index_arr.append(item * 4 + sector)
func update_fs_state(ecms):
for ecm in ecms.values():
var fs_ids: Array
get_fs_index(ecm, fs_ids)
pass

View File

@@ -27,7 +27,7 @@ var settings_program: Dictionary
'уарэп-яу07-3к': ['yau07tx', '10.1.1.33', [50033], false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'],
# Название: [ Протокол, Адрес, Порт получения, Комментарий ]
'уарэп-5п28': [ '5p28', '192.168.3.109', [50000], 'IP-адрес комплекса 5П-28'],
'уарэп-5п28': [ '5p28', '127.0.0.1', [50000], 'IP-адрес комплекса 5П-28'],
# Название: [ Протокол, Адрес, Скорость, ??, ??, Комментарий
'уарэп-щ3': ['mbcs', '/home/sasha/dev/tty1', [19200, 7, 'N', 8, 1], 'Параметры клиента Modbus Serial'],
@@ -45,21 +45,25 @@ var settings_program: Dictionary
func _ready() -> void:
var file = FileAccess.open(settings_file, FileAccess.READ)
if file != null:
var read = file.get_as_text()
file.close()
var json_conv: = JSON.new()
if Error.OK == json_conv.parse(read):
var json_data = json_conv.get_data()
settings_program.merge(json_data)
for key in UnitProfiles.keys():
if json_data.has(key):
UnitProfiles[key][1] = json_data[key][0]
for i in len(json_data[key]) - 1:
if json_data[key][1][i+1].is_valid_int():
UnitProfiles[key][2][i] = int(json_data[key][i+1])
else:
UnitProfiles[key][2][i] = json_data[key][i+1]
if not file:
log.info('Не удалось открыть файл настроек %s, использованы настройики по умолчанию' % settings_file)
return
var read = file.get_as_text()
file.close()
var json_conv: = JSON.new()
if Error.OK != json_conv.parse(read):
log.info('Не удалось прочитать файл настроек %s, использованы настройики по умолчанию' % settings_file)
return
var json_data = json_conv.get_data()
settings_program.merge(json_data)
for key in UnitProfiles.keys():
if not json_data.has(key): continue
UnitProfiles[key][1] = json_data[key][0]
for i in len(json_data[key]) - 1:
if json_data[key][1][i+1].is_valid_int():
UnitProfiles[key][2][i] = int(json_data[key][i+1])
else:
UnitProfiles[key][2][i] = json_data[key][i+1]
log.info('Модуль настроек готов')

View File

@@ -24,7 +24,7 @@ class YaU07 extends unit.Unit:
WRITE_FLASH_MP550 = 55, ## Код команды "записать данные из FLASH в КЭМС" ячейки ЯУ-07
WRITE_BLOCK = 60, ## Код команды "записать блок данных ISA" внешней шины ячейки ЯУ-07
READ_BLOCK = 61, ## Код команды "читать блок данных ISA" внешней шины ячейки ЯУ-07
LOAD_EMG_DONE = 70, ## Код команды "читать блок данных ISA" внешней шины ячейки ЯУ-07
LOAD_EMS_DONE = 70, ## Код команды "читать блок данных ISA" внешней шины ячейки ЯУ-07
}
var cmd_num_rx: = 0 ## Номер команды принятый
@@ -173,12 +173,12 @@ class YaU07 extends unit.Unit:
cmd_code_tx = cmd_code
return true
func send_other(cmd_code: int):
func send_load_ems_done(cmd_code: int):
if (cmd_state == CmdState.WAIT) \
or (cmd_state == CmdState.SEND) \
or (cmd_state == CmdState.UNCK):
return false
if not (cmd_code == CmdCode.LOAD_EMG_DONE):
if not (cmd_code == CmdCode.LOAD_EMS_DONE):
return false
cmd_num_tx = (cmd_num_rx + 1) % 0xffff
tx_data.encode_u16(0, cmd_retry)

View File

@@ -1,286 +0,0 @@
class_name yems_boards extends Node
class EmsBoard:
enum {WAIT, WR_DEV_NUM_W, WRITE, WR_DEV_NUM_R, READ, READ_FLASH, WRITE_FLASH,
WRITE_FLASH_BEGIN, LOAD_KEMS, WRITE_FLASH_END, LOAD_FAIL} ## Состояния платы
var id_board: int ## id платы
var in_devs: Dictionary ## Словарь с входными устройствами.
var out_devs: Dictionary ## Словарь с выходными устройствами.
var base_addr_isa: int ## Базовый адрес ячейки isa.
var ports_to_wr: Array ## Порты для записи
var in_tbl: Array
var out_tbl: Array
var online: bool ## статус платы
var ems_load: bool ## флаг загрузки платы
var state_cmd = WAIT ## текущее состояние платы ЭМС
var state_board = WAIT ## текущее состояние платы ЭМС
var cur_dev ## Текущее устройство
var cur_dev_num: = 0 ## Номер текущего устройства
var cur_dev_index: = 0 ## Индекс текущего устройства в списке
var dev_num_list: = Array() ## Список всех устройств
var need_next_dev: bool = false ## Нужно ли переходить к следующему устройству
var unit_ems ## Юнит эмс
var read_done: bool = false ## Флаг, что данные из ячейки прочитанны
var need_flash_rd: bool = false ## Флаг, что надо прочитать флеш
var need_flash_wr: bool = false ## Флаг, что надо записать данные в флеш
var need_write: bool = false ## Флаг, что надо записать данные в ячейку ЭМС
var ems_g_fn: String = '' ## Имя файла настроек ЭМС-Г
signal upd_delay_offset(board, cur_dev) ## Сигнал о обновлении данных задержек
signal upd_o_state(board, cur_dev) ## Сигнал о обновлении данных режима выходов
signal load_done(board) ## Сигнал о окончании загрузки данных в ячейку
func _init(id, base_addr, in_table, out_table, u):
id_board = id
in_tbl = in_table
out_tbl = out_table
base_addr_isa = base_addr
unit_ems = u
for i in range(4):
ports_to_wr.append(base_addr_isa + 4 + i * 2) # Заполнение списка портами для записи
dev_num_list = in_tbl + out_tbl
## Устанавливает состояние входов и выходов платы
func set_status(status):
var offset = 0
if id_board < 3:
offset = yemsconsts.STATUS_OFFSET[id_board]
var bit_online = 0 + id_board
var bit_load = 3 + id_board
online = (status[0] >> bit_online) & 1
ems_load = (status[0] >> bit_load) & 1
else:
online = status[0] & 1
var bit_load = 4
ems_load = (status[0] >> bit_load) & 1
if not online:
need_write = true
var in_blank = int(status[1 + offset] | (status[2 + offset] << 8) | (status[3 + offset] << 16) | \
(status[4 + offset] << 24) | (status[5 + offset] << 32))
var in_imp = int(status[7 + offset] | (status[8 + offset] << 8) | (status[9 + offset] << 16) | \
(status[10 + offset] << 24) | (status[11 + offset] << 32))
var out_blank = int(status[13 + offset] | (status[14 + offset] << 8) | (status[15 + offset] << 16) | \
(status[16 + offset] << 24) | (status[17 + offset] << 32))
var out_imp = int(status[19 + offset] | (status[20 + offset] << 8) | (status[21 + offset] << 16)| \
(status[22 + offset] << 24) | (status[23 + offset] << 32))
var out_kz = int(status[25 + offset] | (status[26 + offset] << 8))
if id_board > 0:
out_kz = 0
for in_dev in in_devs.values():
if (in_blank >> (in_dev.id - 1)) & 1:
in_dev.state = 1
elif (in_imp >> (in_dev.id - 1)) & 1:
in_dev.state = 2
else:
in_dev.state = 0
for out_dev in out_devs.values():
if (out_kz >> (out_dev.id - yemsconsts.STATUS_OUT_OFFSET)) & 1:
out_dev.state = 3
elif (out_blank >> (out_dev.id - yemsconsts.STATUS_OUT_OFFSET)) & 1:
out_dev.state = 1
elif (out_imp >> (out_dev.id - yemsconsts.STATUS_OUT_OFFSET)) & 1:
out_dev.state = 2
else:
out_dev.state = 0
## Отправка команды на запись или чтение порта
func on_wr_device(dev_number):
if (state_cmd == WR_DEV_NUM_W) or (state_cmd == WR_DEV_NUM_R):
unit_ems.send_isa(unit_ems.CmdCode.WRITE_ISA, [base_addr_isa + 2, dev_number])
elif state_cmd == WRITE:
var ports: Array = []
if not check_dev_number():
return
for port in cur_dev.ports_data:
if port in ports_to_wr:
var data = cur_dev.ports_data[port]
ports.append(port)
ports.append(data)
unit_ems.send_isa(unit_ems.CmdCode.WRITE_ISA, ports)
elif state_cmd == READ:
var ports: Array = []
for port in cur_dev.ports_data:
if port in ports_to_wr:
ports.append(port)
unit_ems.send_isa(unit_ems.CmdCode.READ_ISA, ports)
## Обработчик сообщения, о том, что команда выполнена (машина состояний)
func on_command_done(_yau_07):
if not check_dev_number():
return
if (unit_ems.cmd_code_rx == 1) and state_cmd == WR_DEV_NUM_W:
state_cmd = WRITE
cur_dev_num = unit_ems.isa_ports[base_addr_isa + 2]
if not check_dev_number():
return
on_wr_device(cur_dev_num)
elif (unit_ems.cmd_code_rx == 1) and state_cmd == WR_DEV_NUM_R:
state_cmd = READ
cur_dev_num = unit_ems.isa_ports[base_addr_isa + 2]
if not check_dev_number():
return
on_wr_device(cur_dev_num)
elif (state_cmd == READ) or (state_cmd == WRITE) \
and ((unit_ems.cmd_code_rx == 1) or (unit_ems.cmd_code_rx == 0)):
for key in unit_ems.isa_ports.keys():
if cur_dev.ports_data.has(key):
cur_dev.ports_data[key] = unit_ems.isa_ports[key]
cur_dev.set_delay_offset()
emit_signal('upd_delay_offset', self, cur_dev)
if cur_dev is yemsdevs.OutDev: # Если это выход, заполняем комбобоксы и чекбатоны
cur_dev.set_mode()
cur_dev.set_btns_state()
emit_signal('upd_o_state', self, cur_dev)
if need_next_dev: # Если нужно вычитать все устройства, выбираем следующее
cur_dev_index += 1
if cur_dev_index < len(dev_num_list):
cur_dev_num = dev_num_list[cur_dev_index][0]
if state_cmd == READ:
state_cmd = WR_DEV_NUM_R
on_wr_device(cur_dev_num)
else:
state_cmd = WR_DEV_NUM_W
on_wr_device(cur_dev_num)
else: # Пробег закончен, выбираем последнее устройство
state_cmd = WAIT
state_board = WAIT
read_done = true
cur_dev_index -= 1
need_next_dev = false
else:
state_cmd = WAIT
elif (state_cmd == READ_FLASH) and (unit_ems.cmd_code_rx == unit_ems.CmdCode.READ_FLASH_MP550):
on_read_flash()
elif (state_cmd == WRITE_FLASH) and (unit_ems.cmd_code_rx == unit_ems.CmdCode.WRITE_FLASH_MP550):
state_board = WAIT
state_cmd = WAIT
## Выбор текущего устройства и проверка правильности его номера
func check_dev_number():
cur_dev = get_dev()
if not cur_dev:
state_cmd = WAIT
return false
return true
## Возвращает устройство по текущему номеру, если он есть в словарях
func get_dev():
if in_devs.has(cur_dev_num):
return in_devs[cur_dev_num]
elif out_devs.has(cur_dev_num):
return out_devs[cur_dev_num]
else:
return null
## Запуск чтения/записи данных из/в ячейки КЭМС
func start_rw_kems(read: bool):
cur_dev_index = 0
cur_dev_num = dev_num_list[cur_dev_index][0]
need_next_dev = true
if read:
state_cmd = WR_DEV_NUM_R
else:
state_cmd = WR_DEV_NUM_W
need_write = false
on_wr_device(cur_dev_num)
## Устанавливает связь между входом и выходом
func set_connection(o_dev, i_dev, val):
cur_dev_num = o_dev
if check_dev_number():
cur_dev.set_dot(i_dev, val)
state_cmd = WR_DEV_NUM_W
on_wr_device(cur_dev_num)
## Изменяет режим работы выхода
func change_mode(o_dev, mode):
cur_dev_num = o_dev
if check_dev_number():
cur_dev.set_sw_mode(mode)
state_cmd = WR_DEV_NUM_W
on_wr_device(cur_dev_num)
## Устанавливает задержи устройства
func set_delay(dev_index, val, is_delay, read):
cur_dev_num = dev_index
if check_dev_number():
if not read:
if is_delay:
cur_dev.set_delay(val)
else:
cur_dev.set_offset(val)
state_cmd = WR_DEV_NUM_W
else:
state_cmd = WR_DEV_NUM_R
on_wr_device(cur_dev_num)
## Отправка команды чтения флеш
func read_flash():
unit_ems.send_flash(unit_ems.CmdCode.READ_FLASH_MP550, [], yemsconsts.NUM_BYTE_FROM_FLASH, id_board)
state_cmd = READ_FLASH
## Обработчик выполнения команды чтения флеш, заполняет прочитанными данными устройства
func on_read_flash():
need_flash_rd = false
var amount_dev = unit_ems.flash_len / 10
for i in amount_dev:
var cur_i = i * 10
cur_dev_num = unit_ems.flash_data.decode_u16(cur_i)
if not check_dev_number(): continue
cur_dev.ports_data[base_addr_isa + 4] = unit_ems.flash_data.decode_u16(cur_i + 2)
cur_dev.ports_data[base_addr_isa + 6] = unit_ems.flash_data.decode_u16(cur_i + 4)
cur_dev.ports_data[base_addr_isa + 8] = unit_ems.flash_data.decode_u16(cur_i + 6)
cur_dev.ports_data[base_addr_isa + 10] = unit_ems.flash_data.decode_u16(cur_i + 8)
start_rw_kems(false)
## Команда записи в флеш текущих данных из программы
func write_flash():
need_flash_wr = false
var fl_data: Array = []
var cur_dev_temp = cur_dev_num
for i in yemsconsts.NUM_INPUT:
cur_dev_num = i + 1
append_data_to_flash(fl_data)
for i in yemsconsts.NUM_OUTPUT:
cur_dev_num = i + yemsconsts.STATUS_OUT_OFFSET
append_data_to_flash(fl_data)
unit_ems.send_flash(unit_ems.CmdCode.WRITE_FLASH_MP550, fl_data, 0, id_board)
cur_dev_num = cur_dev_temp
state_cmd = WRITE_FLASH
## Заполнение данными с устройств массива для записи флеш
func append_data_to_flash(fl_data):
fl_data.append(cur_dev_num)
if check_dev_number():
fl_data.append(cur_dev.ports_data[base_addr_isa + 4])
fl_data.append(cur_dev.ports_data[base_addr_isa + 6])
fl_data.append(cur_dev.ports_data[base_addr_isa + 8])
fl_data.append(cur_dev.ports_data[base_addr_isa + 10])
else:
for j in range(4):
fl_data.append(0)
## Выстевление в устройства данных прочитанных из файла
func btn_load(json_data):
for item in json_data.keys():
var ports: Dictionary = json_data[item]
cur_dev_num = int(item)
if not check_dev_number(): continue
if ports.has('%d'%(base_addr_isa + 4)):
cur_dev.ports_data[base_addr_isa + 4] = int(ports['%d'%(base_addr_isa + 4)])
else: continue
if ports.has('%d'%(base_addr_isa + 6)):
cur_dev.ports_data[base_addr_isa + 6] = int(ports['%d'%(base_addr_isa + 6)])
else: continue
if ports.has('%d'%(base_addr_isa + 8)):
cur_dev.ports_data[base_addr_isa + 8] = int(ports['%d'%(base_addr_isa + 8)])
else: continue
if ports.has('%d'%(base_addr_isa + 10)):
cur_dev.ports_data[base_addr_isa + 10] = int(ports['%d'%(base_addr_isa + 10)])
func set_load_done():
unit_ems.send_other(unit_ems.CmdCode.LOAD_EMG_DONE)

View File

@@ -1,208 +0,0 @@
class_name yerms_consts extends Node
var files_folder = ProjectSettings.get_setting('application/config/kems_files_path', 'user://kems/') # Папка с файлами вариантами настроек ЭМС
var emsg_files_folder = ProjectSettings.get_setting('application/config/emsg_files_path', 'user://emsg/') # Папка с файлами вариантами настроек ЭМС
var FILES_ROWS_ALIGNMENT = [ HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER ]
var FILES_COLUMN_WIDTHS = [ 90, 150, 150 ]
const NUM_INPUT = 38 ## Количество входных устройств
const NUM_OUTPUT = 38 ## Количество выходных устройств
const NUM_INPUT_G = 16 ## Количество входных устройств для ЭМС-Г
const NUM_OUTPUT_G = 16 ## Количество выходных устройств для ЭМС-Г
const NUM_BYTE_FROM_FLASH = 760 ## Количество байт для запись в flash
const STATUS_OFFSET = { ## Смещение статуса, ключ id платы
0: 0,
1: 26,
2: 52 }
const STATUS_OUT_OFFSET = 47 ## Смещение индекса выходных устройств относитель входных
const KEMS_BOARD_NAME = 'КЭМС-Б1' ## Название платы КЭМС
const EMS1_BOARD_NAME = 'ЭМС-Б1' ## Название платы ЭМС 1
const EMS2_BOARD_NAME = 'ЭМС-Б2' ## Название платы ЭМС 2
const MAX_VAL_DELAY = 6.3 ## Максимальная задержка переднего фронта сигнала
const MAX_VAL_OFFSET = 51.1 ## Максимальная задержка заднего фронта сигнала
const I_COL_OFFSET = 3 ## Индекс колонки с задержкой заднего фронта
const I_COL_DELAY = 2 ## Индекс колонки с задержкой переднего фронта
## Названия файлов для записи настроек ЭМС
const FILES_NAME = ['Вариант 1',
'Вариант 2',
'Вариант 3',
'Вариант 4',
'Вариант 5',
]
## Первый элемент - имя юнита, второй - имя файла настроек
const EMS_G_BOARDS = [
['уарэп-яу07-2в','ЭМС-Г-В2'],
['уарэп-яу07-2н','ЭМС-Г-Н2'],
['уарэп-яу07-2к','ЭМС-Г-К2'],
['уарэп-яу07-4в','ЭМС-Г-В4'],
['уарэп-яу07-4н','ЭМС-Г-Н4'],
['уарэп-яу07-4к','ЭМС-Г-К4'],
['уарэп-яу07-1в','ЭМС-Г-В1'],
['уарэп-яу07-1н','ЭМС-Г-Н1'],
['уарэп-яу07-1к','ЭМС-Г-К1'],
['уарэп-яу07-3в','ЭМС-Г-В3'],
['уарэп-яу07-3н','ЭМС-Г-Н3'],
['уарэп-яу07-3к','ЭМС-Г-К4'],]
## Таблица с данными для входов, первое значение - индекс устройства в ячейке КЭМС.
const INPUT_KEMS = [
[1 ,['УИЗП №1', 'Х7', '0.00', '0.00']],
[2 ,['УИЗПФ №1','Х8', '0.00', '0.00']],
[3 ,['УИЗП №2', 'Х10', '0.00', '0.00']],
[4 ,['УИЗПФ №2','Х11', '0.00', '0.00']],
[5 ,['УИЗП №3', 'Х13', '0.00', '0.00']],
[6 ,['УИЗПФ №3','Х14', '0.00', '0.00']],
[7 ,['УИЗП №4', 'Х16', '0.00', '0.00']],
[8 ,['УИЗПФ №4','Х17', '0.00', '0.00']],
[9 ,['УИЗП №5', 'Х19', '0.00', '0.00']],
[10,['УИЗПФ №5','Х20', '0.00', '0.00']],
[11,['УИЗП №6', 'Х22', '0.00', '0.00']],
[12,['УИЗПФ №6','Х23', '0.00', '0.00']],
[13,['УИЗП №7', 'Х25', '0.00', '0.00']],
[14,['УИЗПФ №7','Х26', '0.00', '0.00']],
[17,['УИЗП_МП №1', 'X28 : 1', '0.00', '0.00']],
[18,['УИЗП_МП №2', 'X28 : 2', '0.00', '0.00']],
[19,['УИЗП_МП №3', 'X28 : 3', '0.00', '0.00']],
[20,['УИЗП_МП №4', 'X28 : 4', '0.00', '0.00']],
[21,['УИЗП_МП №5', 'X28 : 5', '0.00', '0.00']],]
## Таблица с данными для выходов, первое значение - индекс устройства в ячейке КЭМС.
const OUTPUT_KEMS = [
[47,['Бланк №1','Х6', '0.00', '0.00']],
[48,['Бланк №2','Х9', '0.00', '0.00']],
[49,['Бланк №3','Х12', '0.00', '0.00']],
[50,['Бланк №4','Х15', '0.00', '0.00']],
[51,['Бланк №5','Х18', '0.00', '0.00']],
[52,['Бланк №6','Х21', '0.00', '0.00']],
[53,['Бланк №7','Х24', '0.00', '0.00']],
[55,['Бланк_МП №1', 'X28 : 8', '0.00', '0.00']],
[56,['Бланк_МП №2', 'X28 : 9', '0.00', '0.00']],
[57,['Бланк_МП №3', 'X28 : 10', '0.00', '0.00']],
[58,['Бланк_МП №4', 'X28 : 11', '0.00', '0.00']],
[59,['Бланк_МП №5', 'X28 : 12', '0.00', '0.00']], ]
## Таблица с данными для входов, первое значение - индекс устройства в ячейке КЭМС.
const INPUT_EMS1 = [
[1 ,['БИ В Лб', 'Х49 : 37', '0.00', '0.00']],
[18,['БИ В ПрБ', 'Х49 : 31', '0.00', '0.00']],
[2 ,['БИ Г Лб', 'Х49 : 15', '0.00', '0.00']],
[19,['БИ Г ПрБ', 'Х49 : 8', '0.00', '0.00']],
[3 ,['БИ Д Лб', 'Х49 : 6', '0.00', '0.00']],
[20,['БИ Д ПрБ', 'Х49 : 10', '0.00', '0.00']],
[4 ,['БИ Е Лб', 'Х49 : 25', '0.00', '0.00']],
[21,['БИ Е ПрБ', 'Х49 : 40', '0.00', '0.00']],
[5 ,['СЗИ В Лб', 'Х49 : 42', '0.00', '0.00']],
[22,['СЗИ В ПрБ','Х49 : 44', '0.00', '0.00']],
[6 ,['СЗИ Г Лб', 'Х49 : 46', '0.00', '0.00']],
[23,['СЗИ Г ПрБ','Х49 : 32', '0.00', '0.00']],
[7 ,['СЗИ Д Лб', 'Х49 : 16', '0.00', '0.00']],
[24,['СЗИ Д ПрБ','Х49 : 47', '0.00', '0.00']],
[8 ,['СЗИ Е Лб', 'Х49 : 1', '0.00', '0.00']],
[25,['СЗИ Е ПрБ','Х49 : 50', '0.00', '0.00']],
[33,['Бланк_МП №1', 'X29 : 1', '0.00', '0.00']],
[34,['Бланк_МП №2', 'X29 : 2', '0.00', '0.00']],
[35,['Бланк_МП №3', 'X29 : 3', '0.00', '0.00']],]
## Таблица с данными для выходов, первое значение - индекс устройства в ячейке КЭМС.
const OUTPUT_EMS1 = [
[47 ,['СЗИ1 Л1','X31 : 11', '0.00', '0.00']],
[64,['СЗИ1 Л6','X31 : 14', '0.00', '0.00']],
[48 ,['СЗИ1 Л7','X31 : 17', '0.00', '0.00']],
[65,['СЗИ2 Л1','X32 : 11', '0.00', '0.00']],
[49 ,['СЗИ2 Л6','X32 : 14', '0.00', '0.00']],
[66,['СЗИ2 Л7','X32 : 17', '0.00', '0.00']],
[50 ,['СЗИ3 Л1','X33 : 11', '0.00', '0.00']],
[67,['СЗИ3 Л6','X33 : 14', '0.00', '0.00']],
[51 ,['СЗИ3 Л7','X33 : 17', '0.00', '0.00']],
[68,['СЗИ4 Л1','X34 : 11', '0.00', '0.00']],
[52 ,['СЗИ4 Л6','X34 : 14', '0.00', '0.00']],
[69,['СЗИ4 Л7','X34 : 17', '0.00', '0.00']],
[53 ,['СЗИ1 Л2','X38 : 11', '0.00', '0.00']],
[70,['СЗИ1 Л3','X38 : 14', '0.00', '0.00']],
[54 ,['СЗИ2 Л2','X39 : 11', '0.00', '0.00']],
[71,['СЗИ2 Л3','X39 : 14', '0.00', '0.00']],
[55 ,['СЗИ3 Л2','X40 : 11', '0.00', '0.00']],
[72,['СЗИ3 Л3','X40 : 14', '0.00', '0.00']],
[56,['СЗИ4 Л2','X41 : 11', '0.00', '0.00']],
[73,['СЗИ4 Л3','X41 : 14', '0.00', '0.00']],
[57,['СЗИ1 Л4','X42 : 11', '0.00', '0.00']],
[74,['СЗИ1 Л5','X42 : 14', '0.00', '0.00']],
[58,['СЗИ2 Л4','X43 : 11', '0.00', '0.00']],
[75,['СЗИ2 Л5','X43 : 14', '0.00', '0.00']],
[59,['СЗИ3 Л4','X44 : 11', '0.00', '0.00']],
[76,['СЗИ3 Л5','X44 : 14', '0.00', '0.00']],
[60,['СЗИ4 Л4','X45 : 11', '0.00', '0.00']],
[77,['СЗИ4 Л5','X45 : 14', '0.00', '0.00']],
[79,['УИЗП_МП №1', 'X29 : 8', '0.00', '0.00']],
[80,['УИЗП_МП №2', 'X29 : 9', '0.00', '0.00']],
[81,['Выход 35', 'X29 : 10', '0.00', '0.00']],
[82,['Выход 36', 'X29 : 11', '0.00', '0.00']],
[83,['Выход 37', 'X29 : 12', '0.00', '0.00']],
[84,['Выход 38', 'X29 : 13', '0.00', '0.00']],]
## Таблица с данными для входов, первое значение - индекс устройства в ячейке КЭМС.
const INPUT_EMS2 = [
[1 ,['СИ1 Л1','X31 : 2', '0.00', '0.00']],
[18,['СИ1 Л6','X31 : 5', '0.00', '0.00']],
[2 ,['СИ1 Л7','X31 : 8', '0.00', '0.00']],
[19,['СИ2 Л1','X32 : 2', '0.00', '0.00']],
[3 ,['СИ2 Л6','X32 : 5', '0.00', '0.00']],
[20,['СИ2 Л7','X32 : 8', '0.00', '0.00']],
[4 ,['СИ3 Л1','X33 : 2', '0.00', '0.00']],
[21,['СИ3 Л6','X33 : 5', '0.00', '0.00']],
[5 ,['СИ3 Л7','X33 : 8', '0.00', '0.00']],
[22,['СИ4 Л1','X34 : 2', '0.00', '0.00']],
[6 ,['СИ4 Л6','X34 : 5', '0.00', '0.00']],
[23,['СИ4 Л7','X34 : 8', '0.00', '0.00']],
[7 ,['СИ1 Л2','X38 : 2', '0.00', '0.00']],
[24,['СИ1 Л3','X38 : 5', '0.00', '0.00']],
[8 ,['СИ2 Л2','X39 : 2', '0.00', '0.00']],
[25,['СИ2 Л3','X39 : 5', '0.00', '0.00']],
[9 ,['СИ3 Л2','X40 : 2', '0.00', '0.00']],
[26,['СИ3 Л3','X40 : 5', '0.00', '0.00']],
[10,['СИ4 Л2','X41 : 2', '0.00', '0.00']],
[27,['СИ4 Л3','X41 : 5', '0.00', '0.00']],
[11,['СИ1 Л4','X42 : 2', '0.00', '0.00']],
[28,['СИ1 Л5','X42 : 5', '0.00', '0.00']],
[12,['СИ2 Л4','X43 : 2', '0.00', '0.00']],
[29,['СИ2 Л5','X43 : 5', '0.00', '0.00']],
[13,['СИ3 Л4','X44 : 2', '0.00', '0.00']],
[30,['СИ3 Л5','X44 : 5', '0.00', '0.00']],
[14,['СИ4 Л4','X45 : 2', '0.00', '0.00']],
[31,['СИ4 Л5','X45 : 5', '0.00', '0.00']],
[33,['Бланк_МП №4', 'X30 : 1', '0.00', '0.00']],
[34,['Бланк_МП №5', 'X30 : 2', '0.00', '0.00']],
[35,['Вход 35', 'X29 : 10', '0.00', '0.00']],
[36,['Вход 36', 'X29 : 11', '0.00', '0.00']],
[37,['Вход 37', 'X29 : 12', '0.00', '0.00']],
[38,['Вход 38', 'X29 : 13', '0.00', '0.00']],]
## Таблица с данными для выходов, первое значение - индекс устройства в ячейке КЭМС.
const OUTPUT_EMS2 = [
[47,['БИ РТР №1','X47 : 2', '0.00', '0.00']],
[64,['БИ РТР №2','X47 : 5', '0.00', '0.00']],
[48,['БИ РТР №3','X47 : 8', '0.00', '0.00']],
[65,['БИ РТР №4','X47 : 11', '0.00', '0.00']],
[49,['СИ В Лб', 'Х49 : 21', '0.00', '0.00']],
[66,['СИ В ПрБ', 'Х49 : 19', '0.00', '0.00']],
[50,['СИ Г Лб', 'Х49 : 28', '0.00', '0.00']],
[67,['СИ Г ПрБ', 'Х49 : 30', '0.00', '0.00']],
[51,['СИ Д Лб', 'Х49 : 13', '0.00', '0.00']],
[68,['СИ Д ПрБ', 'Х49 : 11', '0.00', '0.00']],
[52,['СИ Е Лб', 'Х49 : 26', '0.00', '0.00']],
[69,['СИ Е ПрБ', 'Х49 : 35', '0.00', '0.00']],
[79,['УИЗП_МП №3', 'X30 : 8', '0.00', '0.00']],
[80,['УИЗП_МП №4', 'X30 : 9', '0.00', '0.00']],
[81,['УИЗП_МП №5', 'X30 : 10', '0.00', '0.00']],]

View File

@@ -1,93 +0,0 @@
class_name yems_dev extends Node
class InDev:
var id: int ## Идентификатор индекс устройства.
var dev_name: String ## Имя подключаемого комплекса.
var connector: String ## Номер разъёма в приборе.
var delay: float ## Задержка фронта импульса.
var offset: float ## Смещение фронта импульса.
var state: int ## Состояние входа.
var freq: int ## Предполагаемая частота на которой работает комплекс.
var ports_data: Dictionary ## Словарь состояния портов устройства.
var tbl_row_id: int ## Индекс устройства в таблице.
var out_dots: Array ## Список выходных устройств в порядке, как в таблице и точки матрицы.
var connect_devs: Dictionary ## Список присоединённых устройств.
var board: String ## Плата в которой находится устройство.
var isa_addr: int ## Адрес устройства на шине isa
func _init(dev_id : int, params : Array, row_id : int, base_addr: int):
id = dev_id
dev_name = String(params[0])
connector = String(params[1])
delay = float(params[2])
offset = float(params[3])
tbl_row_id = row_id
isa_addr = base_addr
ports_data[isa_addr + 4] = 0xFFFF
ports_data[isa_addr + 6] = 0xFFFF
ports_data[isa_addr + 8] = 0xFFFF
ports_data[isa_addr + 10] = 0xFFFF
## Устанавливает задержки переднего и заднего фронта из данных портов
func set_delay_offset():
delay = float(ports_data[isa_addr + 10] & 0x003F)/10
offset = float((ports_data[isa_addr + 10] >> 6) & 0x01FF)/10
## Устанавливает задержку переднего фронта в порт
func set_delay(val):
delay = val
var bin_val = int(val * 10)
ports_data[isa_addr + 10] = tools.set_bits(ports_data[isa_addr + 10], bin_val, 0x003F)
## Устанавливает задержку заднего фронта в порт
func set_offset(val):
offset = val
var bin_val = int(val * 10)
ports_data[isa_addr + 10] = tools.set_bits(ports_data[isa_addr + 10], (bin_val << 6), 0x7FC0)
class OutDev extends InDev:
var mode: int ## Режим работы выхода.
var btns_state: = Dictionary()
func set_default_mode(): mode = 0
## Устанавливает режим работы выхода из порта
func set_mode():
if (ports_data[isa_addr + 8] >> 13) & 1:
mode = 1
elif (ports_data[isa_addr + 8] >> 14) & 1:
mode = 2
elif (ports_data[isa_addr + 8] >> 15) & 1:
mode = 3
else:
mode = 0
## Устанавливает список соединений из портов
func set_btns_state():
var data = ports_data[isa_addr + 4] | (ports_data[isa_addr + 6] << 16) | ((ports_data[isa_addr + 8] & 0x3f) << 32)
for i in range(yemsconsts.NUM_INPUT):
btns_state[i+1] = bool((data >> i) & 1)
## Устанавливает соединение и записывает в порт
func set_dot(i_dev, val):
if btns_state.has(i_dev):
btns_state[i_dev] = val
var data = 0
for i in range(yemsconsts.NUM_INPUT):
data = data | (int(btns_state[i+1]) << i)
ports_data[isa_addr + 4] = data & 0xffff
ports_data[isa_addr + 6] = (data >> 16) & 0xffff
ports_data[isa_addr + 8] = tools.set_bits(ports_data[isa_addr + 8], ((data >> 32) & 0x3f), 0x003F)
## Записывает в порт режим работы выхода
func set_sw_mode(o_state):
mode = o_state
if mode == 0:
ports_data[isa_addr + 8] = tools.set_bits(ports_data[isa_addr + 8], 0x0000, 0xE000)
elif mode == 1:
ports_data[isa_addr + 8] = tools.set_bits(ports_data[isa_addr + 8], 0x2000, 0xE000)
elif mode == 2:
ports_data[isa_addr + 8] = tools.set_bits(ports_data[isa_addr + 8], 0x4000, 0xE000)
elif mode == 3:
ports_data[isa_addr + 8] = tools.set_bits(ports_data[isa_addr + 8], 0x8000, 0xE000)

View File

@@ -1,79 +0,0 @@
extends Node
var ems_board: Dictionary = {}
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
check_dir()
var in_tbl: Array = []
var out_tbl: Array = []
for j in yemsconsts.NUM_INPUT_G:
in_tbl.append([j+1])
out_tbl.append([j+yemsconsts.STATUS_OUT_OFFSET])
for i in len(yemsconsts.EMS_G_BOARDS):
var unit_key = settings.get_unit_key(yemsconsts.EMS_G_BOARDS[i][0])
var unit_ems = network.units[unit_key]
var ems_g: yemsboards.EmsBoard = yemsboards.EmsBoard.new(i+3, 0x120, in_tbl, out_tbl, unit_ems)
ems_board[i+3] = [ems_g, unit_ems]
ems_g.ems_g_fn = yemsconsts.EMS_G_BOARDS[i][1]
var params = ['','',0.0, 0,0]
for item in ems_g.in_tbl:
var in_dev: yemsdevs.InDev = yemsdevs.InDev.new(item[0], params, 0, 0x120)
ems_g.in_devs[in_dev.id] = in_dev
for item in ems_g.out_tbl:
var out_dev = yemsdevs.OutDev.new(item[0], params, 0, 0x120)
ems_g.out_devs[out_dev.id] = out_dev
ems_g.need_write = true
unit_ems.connect('data_received', Callable(self, 'on_data_ems_received').bind(ems_g))
unit_ems.connect('command_done', Callable(self, 'on_command_done').bind(ems_g))
unit_ems.connect('line_changed', Callable(self, 'on_line_changed').bind(ems_g))
func on_line_changed(unit_ems, board):
if not unit_ems.online:
board.ems_load = false
board.state_board = board.WAIT
board.state_cmd = board.WAIT
board.need_write = true
func on_data_ems_received(unit_ems, board):
board.set_status(unit_ems.status)
if board.state_board == board.WAIT and board.state_cmd == board.WAIT:
if board.online:
if board.need_write:
start_load(board)
elif not board.ems_load:
board.set_load_done()
else:
board.need_write = true
func on_command_done(unit_ems, board):
board.on_command_done(unit_ems)
func start_load(board):
var file = FileAccess.open(yemsconsts.emsg_files_folder + board.ems_g_fn, FileAccess.READ)
if file == null:
board.state_board = board.LOAD_FAIL
return
var read = file.get_as_text()
file.close()
var json_conv: = JSON.new()
if Error.OK == json_conv.parse(read):
var json_data = json_conv.get_data()
board.btn_load(json_data)
board.state_board = board.WRITE
board.start_rw_kems(false)
else:
board.state_board = board.LOAD_FAIL
## Проверяет ниличие директории, если их нет, создаёт
func check_dir():
var dir = DirAccess.open(yemsconsts.emsg_files_folder)
if dir:
return
else:
DirAccess.make_dir_absolute(yemsconsts.emsg_files_folder)