Merge remote-tracking branch 'lepshiy/master' into для_киры

This commit is contained in:
sasha80
2024-11-07 13:44:03 +03:00
9 changed files with 369 additions and 103 deletions

View File

@@ -19,6 +19,7 @@ const IN_SET_ROW: Array = [CellLineEdit, CellLEEmpty, CellLEEmpty, CellLEEmpty,
var g_boards: Dictionary ## Словарь плат ЭМС.
var active_board = null ## Активная плата ЭМС
var posx: int = 125 ## Позиция элементов по x.
var posy: int = 70 ## Позиция элементов по y.
@@ -29,6 +30,9 @@ func _ready() -> void:
## Инициализация основных элементов экрана ЭМС.
func init_boards():
var unit_key = settings.get_unit_key('уарэп-эмс')
var unit_ems = network.units[unit_key]
# Выставление позиций элементов ЭМС на экране
$scrollin.set_position(Vector2(posx,posy))
$scrollout.set_position(Vector2(posx + 650,posy))
@@ -40,9 +44,11 @@ func init_boards():
$btn_connect.set_position(Vector2(posx + 590,posy - 25))
$btn_disconnect.set_position(Vector2(posx + 587,posy + 675))
g_boards['КЭМС-Б'] = yemsboards.EmsBoard.new(0, 0x130, yemsconsts.INPUT_KEMS, yemsconsts.OUTPUT_KEMS)
g_boards['ЭМС-Б1'] = yemsboards.EmsBoard.new(1, 0x110, yemsconsts.INPUT_EMS1, yemsconsts.OUTPUT_EMS1)
g_boards['ЭМС-Б2'] = yemsboards.EmsBoard.new(2, 0x120, yemsconsts.INPUT_EMS2, yemsconsts.OUTPUT_EMS2)
g_boards['КЭМС-Б'] = yemsboards.EmsBoard.new(0, 0x130, yemsconsts.INPUT_KEMS, yemsconsts.OUTPUT_KEMS, unit_ems)
g_boards['ЭМС-Б1'] = yemsboards.EmsBoard.new(1, 0x110, yemsconsts.INPUT_EMS1, yemsconsts.OUTPUT_EMS1, unit_ems)
g_boards['ЭМС-Б2'] = yemsboards.EmsBoard.new(2, 0x120, yemsconsts.INPUT_EMS2, yemsconsts.OUTPUT_EMS2, unit_ems)
active_board = g_boards['КЭМС-Б']
init_tbl_in()
$scrollin/tbl_in.pin_header($scrollin, self)
@@ -53,9 +59,8 @@ func init_boards():
init_tbl_files()
$scrl_files/tbl_files.pin_header($scrl_files, self)
var unit_key = settings.get_unit_key('уарэп-эмс')
var unit = network.units[unit_key]
unit.connect('data_received', Callable(self, 'on_data_ems_received'))
unit_ems.connect('data_received', Callable(self, 'on_data_ems_received'))
unit_ems.connect('command_done', Callable(self, 'on_command_done'))
$btn_connect.connect('pressed', Callable(self, 'on_btn_connect'))
$btn_disconnect.connect('pressed', Callable(self, 'on_btn_disconnect'))
$btn_flash_read.button_connect('pressed', Callable(self, 'on_btn_flash_read').bind($btn_flash_read))
@@ -126,9 +131,9 @@ func init_tbl_in():
$scrollin/tbl_in.add_row(row_type)
var row_index : int = $scrollin/tbl_in.get_rows_count() - 1
var params : Array = item[1]
var in_dev: yemsdevs.InDev = yemsdevs.InDev.new(item[0], params, row_index)
var in_dev: yemsdevs.InDev = yemsdevs.InDev.new(item[0], params, row_index, g_boards[board].base_addr_isa)
g_boards[board].in_devs[in_dev.id] = in_dev
in_dev.board = board
in_dev.isa_addr = g_boards[board].base_addr_isa
for i in range(len(row_type)):
if i < len(params):
var node = $scrollin/tbl_in.get_node2(i, row_index)
@@ -209,9 +214,10 @@ func init_tbl_out():
$scrollout/tbl_out.add_row([CellLineEdit, CellLineEdit, CellLineEdit, CellLineEdit, CellState, CellLineEdit])
var row_index : int = $scrollout/tbl_out.get_rows_count() - 1
var params : Array = item[1]
var out_dev = yemsdevs.OutDev.new(item[0], params, row_index)
var out_dev = yemsdevs.OutDev.new(item[0], params, row_index, g_boards[board].base_addr_isa)
g_boards[board].out_devs[out_dev.id] = out_dev
out_dev.set_default_mode()
out_dev.board = board
out_dev.isa_addr = g_boards[board].base_addr_isa
for i in range(len(header_text)):
var cell = $scrollout/tbl_out.get_node2(i, row_index)
if i < len(params):
@@ -219,7 +225,7 @@ func init_tbl_out():
cell.editable = false
$scrollout/tbl_out.set_node_user_data(i, row_index, [out_dev, board])
if i in COLUMN_OPTS_BTN:
cell.text = out_dev.mode
cell.text = OUT_MODE[out_dev.mode]
$scrollout/tbl_out.set_columns_min_size([250, 100, 70, 70, 70, 100])
$scrollout/tbl_out.set_columns_alignments(yams_alligment_out)
$scrollout/tbl_out.connect('row_pressed', Callable(self, 'on_row_pressed_out'))
@@ -277,9 +283,7 @@ func set_out_dev(dev):
var mode = $scrl_out_set/tbl_out_set.get_node2(5, 0)
for opt in OUT_MODE:
mode.add_item(opt)
var mode_index: int = OUT_MODE.find(dev.mode)
if mode_index != -1:
mode.select(mode_index)
mode.select(dev.mode)
## Выбор входного или выходного устройства.[br]
@@ -375,6 +379,11 @@ func on_row_pressed(i_row: int, tbl):
func on_data_ems_received(unit):
for board in g_boards.values():
board.set_status(unit.status)
if active_board.state_read == active_board.WAIT:
if board.online and not board.read_done:
active_board = board
active_board.state_read = active_board.READ
active_board.start_rw_kems(true)
for i_row in range($scrollin/tbl_in.get_rows_count()):
var state_pic = ($scrollin/tbl_in.get_node2(4, i_row))
var dev = $scrollin/tbl_in.get_node_user_data(4, i_row)[0]
@@ -383,3 +392,7 @@ func on_data_ems_received(unit):
var state_pic = ($scrollout/tbl_out.get_node2(4, i_row))
var dev = $scrollout/tbl_out.get_node_user_data(4, i_row)[0]
state_pic.set_frame(dev.state)
func on_command_done(unit_ems):
active_board.on_command_done(unit_ems)

View File

@@ -8,18 +8,11 @@ const ONLINE_TIMEOUT = 3000 ## Время ожидания пакета от К
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) ## Сигнал ошибки разбора сообщения.
class CapsRpb extends unit.Unit:
static var json_conv: = JSON.new()
var online: = false ## Состояние связи с источником сообщений.
var name: String ## Имя экземпляра.
var json_dic: Dictionary ## Аппарат для разбора сообщений.
var tick: = 0 ## Тик время последнего обновления, мс.
var tx_data: = PackedByteArray() ## Пакет для отправки.
var tx_stack: Array ## Массив пакетов для отправки.
func _to_string() -> String: return String('капсрпб: "%s" %s ' % [self.name, ['отключен', 'на связи'][int(online)]])
@@ -44,6 +37,7 @@ class CapsRpb:
emit_signal('line_changed', self)
if len(tx_stack):
tx_data = tx_stack[0]
tx_len = len(tx_data)
tx_stack.remove_at(0)
return Error.OK
else:

View File

@@ -215,7 +215,7 @@ func _process(_delta: float) -> void:
for addr in units_udp:
var unit = units[addr]
match unit.process(tick):
Error.OK: sock_unicast.send_to([addr[0], dst_ports[addr]], unit.tx_data)
Error.OK: sock_unicast.send_to([addr[0], dst_ports[addr]], unit.tx_data.slice(0, unit.tx_len))
Error.FAILED: emit_signal('socket_error', 'ошибка: %s %s:%d' % [unit, addr[0], addr[1]])
for key in units_serial:
var unit = units_serial[key]

View File

@@ -98,6 +98,7 @@ class Sch3 extends unit.Unit:
if cmd_state != CmdState.DONE: return false
var json_dict = {'code': 'write', 'data': [addr] + data}
tx_data = JSON.stringify(json_dict).to_utf8_buffer()
tx_len = len(tx_data)
cmd_state = CmdState.SEND
return true
@@ -108,6 +109,7 @@ class Sch3 extends unit.Unit:
if cmd_state != CmdState.DONE: return false
var json_dict = {'code': 'read_holding', 'data': [addr, count]}
tx_data = JSON.stringify(json_dict).to_utf8_buffer()
tx_len = len(tx_data)
cmd_state = CmdState.SEND
return true
@@ -118,5 +120,6 @@ class Sch3 extends unit.Unit:
if cmd_state != CmdState.DONE: return false
var json_dict = {'code': 'read_input', 'data': [addr, count]}
tx_data = JSON.stringify(json_dict).to_utf8_buffer()
tx_len = len(tx_data)
cmd_state = CmdState.SEND
return true

View File

@@ -132,3 +132,31 @@ func is_point_in_polygon(pos: Vector2, p: PackedVector2Array) -> bool:
func set_wordi(buf: PackedByteArray, index: int, val: int) -> void:
buf[index] = val & 0xff
buf[index + 1] = (val >> 8) & 0xff
func set_bit(bits, index, val, mask = 0xfffffffffffffff):
"""
:param bits: прежние значения
:param index: индекс бита
:param val: новое значение бита
:param mask:
:return:
мастер
"""
bits &= mask
if val:
bits |= 1 << index
else:
bits &= ~(1 << index)
return (bits & mask)
func set_bits(v, a, m):
"""
Устанавливает биты в соответствии с маской
:param v: Прежние значения бит
:param a: Новые значения бит
:param m: Маска изменяемых бит
:return: Изменённые значения бит
"""
return v & a & (~m) | (~v) & a & m | v & a & m | v & (~a) & (~m)

View File

@@ -13,10 +13,14 @@ class YaU07 extends unit.Unit:
## Коды выполняемых команд.
enum CmdCode {
READ_ISA = 0, ## Код команды "читать порт ISA" ячейки ЯУ-07.
WRITE_ISA = 1, ## Код команды "записать порт ISA" ячейки ЯУ-07.
WRITE_BLOCK = 60, ## Код команды "записать блок данных ISA" внешней шины ячейки ЯУ-07.
READ_BLOCK = 61, ## Код команды "читать блок данных ISA" внешней шины ячейки ЯУ-07.
READ_ISA = 0, ## Код команды "читать порт ISA" ячейки ЯУ-07
WRITE_ISA = 1, ## Код команды "записать порт ISA" ячейки ЯУ-07
ERASE_FLASH = 49, ## Код команды "стереть данные из FLASH" ячейки ЯУ-07
WRITE_FLASH = 50, ## Код команды "записать данные в FLASH" ячейки ЯУ-07
READ_FLASH = 51, ## Код команды "прочитать данные из FLASH" ячейки ЯУ-07
LOAD_FLASH = 52, ## Код команды "записать данные из FLASH в КЭМС" ячейки ЯУ-07
WRITE_BLOCK = 60, ## Код команды "записать блок данных ISA" внешней шины ячейки ЯУ-07
READ_BLOCK = 61, ## Код команды "читать блок данных ISA" внешней шины ячейки ЯУ-07
}
## Состояние автомата выполнения команды.
@@ -28,17 +32,20 @@ class YaU07 extends unit.Unit:
FAIL ## Команда не выполнена.
}
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 cmd_tick_tx = 0.0 ## Время последней отправки команды.
var cmd_tick_rx = 0.0 ## Время последнего приёма команды.
var status: = PackedByteArray() ## Поле "состояние прибора".
var isa_ports = {} ## Результат выполнения команды "читать порт".
var isa_block = {} ## Результат выполнения команды "читать массив из порта".
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 cmd_code_rx = 0 ## Код последней выполненой команды
var cmd_tick_tx = 0.0 ## Время последней отправки команды
var cmd_tick_rx = 0.0 ## Время последнего приёма команды
var status: = PackedByteArray() ## Поле "состояние прибора"
var isa_ports = {} ## Результат выполнения команды "читать порт"
var isa_block = {} ## Результат выполнения команды "читать массив из порта"
var flash_data: = PackedByteArray() ## Данные прочитанные из Flash
var flash_len: = 0 ## Длинна данных прочитанных из Flash
func _to_string() -> String: return String('яу07: %s %s' % [self.name, ['отключен', 'на связи'][int(online)]])
@@ -73,6 +80,33 @@ class YaU07 extends unit.Unit:
rc = Error.FAILED
return rc
func send_flash(cmd_code: int, fl_data: Array, num_byte_rd: int) -> bool:
if (cmd_state == CmdState.WAIT) \
or (cmd_state == CmdState.SEND) \
or (cmd_state == CmdState.UNCK):
return false
if not ((cmd_code == CmdCode.ERASE_FLASH) or (cmd_code == CmdCode.WRITE_FLASH) \
or (cmd_code == CmdCode.READ_FLASH) or (cmd_code == CmdCode.LOAD_FLASH)):
return false
cmd_num_tx = (cmd_num_rx + 1) % 0xffff
tx_data.encode_u16(0, cmd_retry)
tx_data.encode_u16(2, cmd_num_tx)
tx_data.encode_u8(6, cmd_code)
if cmd_code == CmdCode.ERASE_FLASH:
tx_len = 7
elif cmd_code == CmdCode.WRITE_FLASH:
tx_data.encode_u8(7, 1)
tx_data.encode_u16(8, 0)
tx_data.encode_u16(10, len(fl_data))
tx_len = 11 + len(fl_data) * 2
for i in range(len(fl_data)):
tx_data.encode_u16(12 + i * 2, fl_data[i])
elif cmd_code == CmdCode.READ_FLASH:
tx_len = 11
tx_data.encode_u16(7, 0)
tx_data.encode_u16(9, num_byte_rd)
cmd_state = CmdState.SEND
return true
func send_isa(cmd_code: int, ports_data: Array) -> bool:
if (cmd_state == CmdState.WAIT) \
@@ -173,6 +207,11 @@ class YaU07 extends unit.Unit:
isa_block[block_adr] = block_data
return true
func parse_flash(rx_data: PackedByteArray, status_len, cmd_code) -> bool:
if cmd_code == CmdCode.READ_FLASH:
flash_len = rx_data.decode_u16(status_len + 12)
flash_data = rx_data.slice(status_len + 14)
return true
## Заполняет состояние прибора данными прочитанными из портов ЯУ-07.
## для команд "читать порты" или "записать порты".[br]
@@ -230,9 +269,14 @@ class YaU07 extends unit.Unit:
elif (cmd_code == CmdCode.READ_BLOCK) or (cmd_code == CmdCode.WRITE_BLOCK):
rc = parse_block(rx_data, status_len)
elif (cmd_code == CmdCode.ERASE_FLASH) or (cmd_code == CmdCode.WRITE_FLASH) \
or (cmd_code == CmdCode.READ_FLASH) or (cmd_code == CmdCode.LOAD_FLASH):
rc = parse_flash(rx_data, status_len, cmd_code)
if rc:
if (cmd_state == CmdState.WAIT) and (cmd_num_rx == cmd_num_tx):
cmd_state = CmdState.DONE
cmd_code_rx = cmd_code
emit_signal('command_done', self)
else:
emit_signal('parse_failed', self)

View File

@@ -1,25 +1,44 @@
class_name yems_boards extends Node
class EmsBoard:
enum {WAIT, WR_DEV_NUM_W, WRITE, WR_DEV_NUM_R, READ, READ_FLASH, WRITE_FLASH_BEGIN, \
LOAD_KEMS, WRITE_FLASH_END}
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 online: bool ## статус платы
var ems_load: bool ## флаг загрузки платы
var state = WAIT ## текущее состояние платы ЭМС
var state_read = 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 ## Флаг, что данные из ячейки прочитанны
func _init(id, base_addr, in_table, out_table):
signal upd_delay_offset(board, cur_dev)
signal upd_o_state(board, cur_dev)
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 == 1: offset = 26
elif id_board == 2: offset = 52
var offset = yemsconsts.STATUS_OFFSET[id_board]
var bit_online = 0 + id_board
var bit_load = 3 + id_board
online = (status[0] >> bit_online) & 1
@@ -53,3 +72,114 @@ class EmsBoard:
out_dev.state = 2
else:
out_dev.state = 0
# Отправка команды на запись или чтение порта
func on_wr_device(dev_number):
print_debug([id_board, dev_number])
if (state == WR_DEV_NUM_W) or (state == WR_DEV_NUM_R):
unit_ems.send_isa(unit_ems.CmdCode.WRITE_ISA, [base_addr_isa + 2, dev_number])
elif state == 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 == 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 == WR_DEV_NUM_W:
state = 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 == WR_DEV_NUM_R:
state = 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 == READ) or (state == 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 == READ:
state = WR_DEV_NUM_R
on_wr_device(cur_dev_num)
else:
state = WR_DEV_NUM_W
on_wr_device(cur_dev_num)
else: # Пробег закончен, выбираем последнее устройство
state = WAIT
state_read = WAIT
read_done = true
cur_dev_index -= 1
need_next_dev = false
else:
state = WAIT
elif (state == READ_FLASH) and (unit_ems.cmd_code_rx == 51):
pass
#read_flash()
elif (state == WRITE_FLASH_BEGIN) and (unit_ems.cmd_code_rx == 49):
pass
#write_flash()
#emit_signal('write_msg', 'Произведено чтение из ПЗУ ячейки ЯУ-07')
elif (state == LOAD_KEMS) and (unit_ems.cmd_code_rx == 52):
pass
#start_rw_kems(true)
elif (state == WRITE_FLASH_END) and (unit_ems.cmd_code_rx == 50):
pass
#load_flash()
#emit_signal('write_msg', 'Произведена запись в ПЗУ ячейки ЯУ-07')
# Выбор текущего устройства и проверка правильности его номера
func check_dev_number():
cur_dev = get_dev()
if not cur_dev:
state = 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 = WR_DEV_NUM_R
else:
state = WR_DEV_NUM_W
on_wr_device(cur_dev_num)

View File

@@ -1,5 +1,11 @@
class_name yerms_consts extends Node
const NUM_INPUT = 38
const NUM_OUTPUT = 38
const STATUS_OFFSET = { # Смещение статуса, ключ id платы
0: 0,
1: 26,
2: 52 }
## Таблица с данными для входов, первое значение - индекс устройства в ячейке КЭМС.
const INPUT_KEMS = [
@@ -65,40 +71,40 @@ const INPUT_EMS1 = [
## Таблица с данными для выходов, первое значение - индекс устройства в ячейке КЭМС.
const OUTPUT_EMS1 = [
[1 ,['СЗИ1 Л1','X31 : 11', '0.00', '0.00']],
[18,['СЗИ1 Л6','X31 : 14', '0.00', '0.00']],
[2 ,['СЗИ1 Л7','X31 : 17', '0.00', '0.00']],
[19,['СЗИ2 Л1','X32 : 11', '0.00', '0.00']],
[3 ,['СЗИ2 Л6','X32 : 14', '0.00', '0.00']],
[20,['СЗИ2 Л7','X32 : 17', '0.00', '0.00']],
[4 ,['СЗИ3 Л1','X33 : 11', '0.00', '0.00']],
[21,['СЗИ3 Л6','X33 : 14', '0.00', '0.00']],
[5 ,['СЗИ3 Л7','X33 : 17', '0.00', '0.00']],
[22,['СЗИ4 Л1','X34 : 11', '0.00', '0.00']],
[6 ,['СЗИ4 Л6','X34 : 14', '0.00', '0.00']],
[23,['СЗИ4 Л7','X34 : 17', '0.00', '0.00']],
[7 ,['СЗИ1 Л2','X38 : 11', '0.00', '0.00']],
[24,['СЗИ1 Л3','X38 : 14', '0.00', '0.00']],
[8 ,['СЗИ2 Л2','X39 : 11', '0.00', '0.00']],
[25,['СЗИ2 Л3','X39 : 14', '0.00', '0.00']],
[9 ,['СЗИ3 Л2','X40 : 11', '0.00', '0.00']],
[26,['СЗИ3 Л3','X40 : 14', '0.00', '0.00']],
[10,['СЗИ4 Л2','X41 : 11', '0.00', '0.00']],
[27,['СЗИ4 Л3','X41 : 14', '0.00', '0.00']],
[11,['СЗИ1 Л4','X42 : 11', '0.00', '0.00']],
[28,['СЗИ1 Л5','X42 : 14', '0.00', '0.00']],
[12,['СЗИ2 Л4','X43 : 11', '0.00', '0.00']],
[29,['СЗИ2 Л5','X43 : 14', '0.00', '0.00']],
[13,['СЗИ3 Л4','X44 : 11', '0.00', '0.00']],
[30,['СЗИ3 Л5','X44 : 14', '0.00', '0.00']],
[14,['СЗИ4 Л4','X45 : 11', '0.00', '0.00']],
[31,['СЗИ4 Л5','X45 : 14', '0.00', '0.00']],
[33,['УИЗП_МП №1', 'X29 : 8', '0.00', '0.00']],
[34,['УИЗП_МП №2', 'X29 : 9', '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']],]
[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']],
[76,['СЗИ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']],]
## Таблица с данными для входов, первое значение - индекс устройства в ячейке КЭМС.
@@ -141,18 +147,18 @@ const INPUT_EMS2 = [
## Таблица с данными для выходов, первое значение - индекс устройства в ячейке КЭМС.
const OUTPUT_EMS2 = [
[1,['БИ РТР №1','X47 : 2', '0.00', '0.00']],
[19,['БИ РТР №2','X47 : 5', '0.00', '0.00']],
[2,['БИ РТР №3','X47 : 8', '0.00', '0.00']],
[19,['БИ РТР №4','X47 : 11', '0.00', '0.00']],
[3,['СИ В Лб', 'Х49 : 21', '0.00', '0.00']],
[20,['СИ В ПрБ', 'Х49 : 19', '0.00', '0.00']],
[4,['СИ Г Лб', 'Х49 : 28', '0.00', '0.00']],
[21,['СИ Г ПрБ', 'Х49 : 30', '0.00', '0.00']],
[5,['СИ Д Лб', 'Х49 : 13', '0.00', '0.00']],
[22,['СИ Д ПрБ', 'Х49 : 11', '0.00', '0.00']],
[6,['СИ Е Лб', 'Х49 : 26', '0.00', '0.00']],
[23,['СИ Е ПрБ', 'Х49 : 35', '0.00', '0.00']],
[33,['УИЗП_МП №3', 'X30 : 8', '0.00', '0.00']],
[34,['УИЗП_МП №4', 'X30 : 9', '0.00', '0.00']],
[35,['УИЗП_МП №5', 'X30 : 10', '0.00', '0.00']],]
[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

@@ -16,23 +16,71 @@ class InDev:
var board: String ## Плата в которой находится устройство.
var isa_addr: int ## Адрес устройства на шине isa
func _init(dev_id : int, params : Array, row_id : int):
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: String ## Режим работы выхода.
var mode: int ## Режим работы выхода.
var btns_state: = Dictionary()
func _init(dev_id : int, params : Array, row_id : 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
mode = 'Работа'
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):
if btns_state.has(i_dev):
btns_state[i_dev] = not btns_state[i_dev]
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)