Merge remote-tracking branch 'lepshiy/master' into для_киры
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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']],]
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user