Исправления. ЭМС, приём и отправка пакетов чтения/записи устройств.
This commit is contained in:
@@ -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]
|
||||
|
||||
@@ -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