Merge remote-tracking branch 'MaD_CaT/master'

This commit is contained in:
sasha80
2024-11-12 09:23:30 +03:00
4 changed files with 181 additions and 74 deletions

View File

@@ -13,14 +13,16 @@ class YaU07 extends unit.Unit:
## Коды выполняемых команд.
enum CmdCode {
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
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
READ_FLASH_MP550 = 56, ## Код команды "прочитать данные из FLASH" ячейки ЯУ-07
WRITE_FLASH_MP550 = 55, ## Код команды "записать данные из FLASH в КЭМС" ячейки ЯУ-07
WRITE_BLOCK = 60, ## Код команды "записать блок данных ISA" внешней шины ячейки ЯУ-07
READ_BLOCK = 61, ## Код команды "читать блок данных ISA" внешней шины ячейки ЯУ-07
}
## Состояние автомата выполнения команды.
@@ -37,7 +39,7 @@ class YaU07 extends unit.Unit:
var cmd_state = CmdState.UNCK ## Состояние выполнения команды
var cmd_result: = 1 ## Результат выполнения команды. Устанавливается в ЯУ-07
var cmd_data: = PackedByteArray() ## Данные команды. Устанавливается в ЯУ-07
var cmd_retry = 0 ## Счётчик оставшихся попыток выполнить команду
var cmd_retry = RETRY_COUNT ## Счётчик оставшихся попыток выполнить команду
var cmd_code_rx = 0 ## Код последней выполненой команды
var cmd_tick_tx = 0.0 ## Время последней отправки команды
var cmd_tick_rx = 0.0 ## Время последнего приёма команды
@@ -80,7 +82,7 @@ class YaU07 extends unit.Unit:
rc = Error.FAILED
return rc
func send_flash(cmd_code: int, fl_data: Array, num_byte_rd: int) -> bool:
func send_flash(cmd_code: int, fl_data: Array, num_byte_rd: int, id_sector: int = 0) -> bool:
if (cmd_state == CmdState.WAIT) \
or (cmd_state == CmdState.SEND) \
or (cmd_state == CmdState.UNCK):
@@ -105,6 +107,11 @@ class YaU07 extends unit.Unit:
tx_len = 11
tx_data.encode_u16(7, 0)
tx_data.encode_u16(9, num_byte_rd)
elif cmd_code == CmdCode.READ_FLASH_MP550:
tx_len = 12
tx_data.encode_u8(7, id_sector)
tx_data.encode_u16(8, 0)
tx_data.encode_u16(10, num_byte_rd)
cmd_state = CmdState.SEND
return true
@@ -211,6 +218,9 @@ class YaU07 extends unit.Unit:
if cmd_code == CmdCode.READ_FLASH:
flash_len = rx_data.decode_u16(status_len + 12)
flash_data = rx_data.slice(status_len + 14)
if cmd_code == CmdCode.READ_FLASH_MP550:
flash_len = rx_data.decode_u16(status_len + 13)
flash_data = rx_data.slice(status_len + 15)
return true
## Заполняет состояние прибора данными прочитанными из портов ЯУ-07.
@@ -270,6 +280,7 @@ class YaU07 extends unit.Unit:
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_MP550) or (cmd_code == CmdCode.WRITE_FLASH_MP550) \
or (cmd_code == CmdCode.READ_FLASH) or (cmd_code == CmdCode.LOAD_FLASH):
rc = parse_flash(rx_data, status_len, cmd_code)

View File

@@ -13,8 +13,8 @@ LOAD_KEMS, WRITE_FLASH_END}
var out_tbl: Array
var online: bool ## статус платы
var ems_load: bool ## флаг загрузки платы
var state = WAIT ## текущее состояние платы ЭМС
var state_read = WAIT ## текущее состояние платы ЭМС
var state_cmd = WAIT ## текущее состояние платы ЭМС
var state_board = WAIT ## текущее состояние платы ЭМС
var cur_dev ## Текущее устройство
var cur_dev_num: = 0 ## Номер текущего устройства
var cur_dev_index: = 0 ## Индекс текущего устройства в списке
@@ -22,6 +22,7 @@ LOAD_KEMS, WRITE_FLASH_END}
var need_next_dev: bool = false ## Нужно ли переходить к следующему устройству
var unit_ems ## Юнит эмс
var read_done: bool = false ## Флаг, что данные из ячейки прочитанны
var need_flash_rd: bool = false ## Флаг, что надо прочитать флеш
signal upd_delay_offset(board, cur_dev)
signal upd_o_state(board, cur_dev)
@@ -64,20 +65,20 @@ LOAD_KEMS, WRITE_FLASH_END}
in_dev.state = 0
for out_dev in out_devs.values():
if (out_kz >> (out_dev.id - 1)) & 1:
if (out_kz >> (out_dev.id - yemsconsts.STATUS_OUT_OFFSET)) & 1:
out_dev.state = 3
elif (out_blank >> (out_dev.id - 1)) & 1:
elif (out_blank >> (out_dev.id - yemsconsts.STATUS_OUT_OFFSET)) & 1:
out_dev.state = 1
elif (out_imp >> (out_dev.id - 1)) & 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 == WR_DEV_NUM_W) or (state == WR_DEV_NUM_R):
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 == WRITE:
elif state_cmd == WRITE:
var ports: Array = []
if not check_dev_number():
return
@@ -87,7 +88,7 @@ LOAD_KEMS, WRITE_FLASH_END}
ports.append(port)
ports.append(data)
unit_ems.send_isa(unit_ems.CmdCode.WRITE_ISA, ports)
elif state == READ:
elif state_cmd == READ:
var ports: Array = []
for port in cur_dev.ports_data:
if port in ports_to_wr:
@@ -98,19 +99,19 @@ LOAD_KEMS, WRITE_FLASH_END}
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
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 == WR_DEV_NUM_R:
state = READ
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 == READ) or (state == WRITE) \
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):
@@ -125,32 +126,32 @@ LOAD_KEMS, WRITE_FLASH_END}
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
if state_cmd == READ:
state_cmd = WR_DEV_NUM_R
on_wr_device(cur_dev_num)
else:
state = WR_DEV_NUM_W
state_cmd = WR_DEV_NUM_W
on_wr_device(cur_dev_num)
else: # Пробег закончен, выбираем последнее устройство
state = WAIT
state_read = WAIT
state_cmd = WAIT
state_board = WAIT
read_done = true
cur_dev_index -= 1
need_next_dev = false
else:
state = WAIT
state_cmd = WAIT
elif (state == READ_FLASH) and (unit_ems.cmd_code_rx == 51):
elif (state_cmd == READ_FLASH) and (unit_ems.cmd_code_rx == 51):
pass
#read_flash()
elif (state == WRITE_FLASH_BEGIN) and (unit_ems.cmd_code_rx == 49):
elif (state_cmd == 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):
elif (state_cmd == 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):
elif (state_cmd == WRITE_FLASH_END) and (unit_ems.cmd_code_rx == 50):
pass
#load_flash()
#emit_signal('write_msg', 'Произведена запись в ПЗУ ячейки ЯУ-07')
@@ -159,7 +160,7 @@ LOAD_KEMS, WRITE_FLASH_END}
func check_dev_number():
cur_dev = get_dev()
if not cur_dev:
state = WAIT
state_cmd = WAIT
return false
return true
@@ -178,14 +179,38 @@ LOAD_KEMS, WRITE_FLASH_END}
cur_dev_num = dev_num_list[cur_dev_index][0]
need_next_dev = true
if read:
state = WR_DEV_NUM_R
state_cmd = WR_DEV_NUM_R
else:
state = WR_DEV_NUM_W
state_cmd = WR_DEV_NUM_W
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 = WR_DEV_NUM_W
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 on_btn_flash_read():
unit_ems.send_flash(unit_ems.CmdCode.READ_FLASH,[], yemsconsts.NUM_BYTE_FROM_FLASH, id_board)
state_cmd = READ_FLASH

View File

@@ -2,15 +2,23 @@ class_name yerms_consts extends Node
const NUM_INPUT = 38
const NUM_OUTPUT = 38
const NUM_BYTE_FROM_FLASH = 760
const STATUS_OFFSET = { # Смещение статуса, ключ id платы
0: 0,
1: 26,
2: 52 }
const STATUS_OUT_OFFSET = 47
const KEMS_BOARD_NAME = 'КЭМС-Б'
const EMS1_BOARD_NAME = 'ЭМС-Б1'
const EMS2_BOARD_NAME = 'ЭМС-Б2'
const MAX_VAL_DELAY = 6.3
const MAX_VAL_OFFSET = 51.1
const I_COL_OFFSET = 3
const I_COL_DELAY = 2
## Таблица с данными для входов, первое значение - индекс устройства в ячейке КЭМС.
const INPUT_KEMS = [
[1 ,['УИЗП №1', 'Х7', '0.00', '0.00']],