Files
uarep-ctl/scripts/yems-boards.gd

186 lines
8.5 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 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 ## Флаг, что данные из ячейки прочитанны
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 = 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
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 - 1)) & 1:
out_dev.state = 3
elif (out_blank >> (out_dev.id - 1)) & 1:
out_dev.state = 1
elif (out_imp >> (out_dev.id - 1)) & 1:
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)