Merge remote-tracking branch 'MaD_CaT/master'
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
150
scripts/prd.gd
Normal 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
|
||||
@@ -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('Модуль настроек готов')
|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
@@ -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']],]
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
Reference in New Issue
Block a user