Рефактор. Переписан автомат состояний для работы с ЯУ-07 в ПРД.

This commit is contained in:
MaD_CaT
2025-03-13 14:33:28 +03:00
parent 5441e5d9e6
commit d296b78cd5
8 changed files with 140 additions and 97 deletions

View File

@@ -2,7 +2,9 @@ class_name yems_boards extends Node
class EmsBoard:
enum {WAIT, WR_DEV_NUM_W, WRITE, WR_DEV_NUM_R, READ, READ_FLASH, WRITE_FLASH,
WRITE_FLASH_BEGIN, LOAD_KEMS, WRITE_FLASH_END, LOAD_FAIL} ## Состояния платы
WRITE_FLASH_BEGIN, WRITE_FLASH_END} ## Состояния платы
enum LoadState {NOT_LOAD, DONE, IN_PROCESS, FAIL, NOT_DEFINED}
const modulation_dev: Dictionary = { ## Словарь соответствия диапазона номеру устройства
0 : 50,
@@ -13,33 +15,32 @@ class EmsBoard:
5 : 51,
6 : 52, }
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 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_cmd = WAIT ## текущее состояние платы ЭМС
var state_board = 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 ## Флаг, что данные из ячейки прочитанны
var need_flash_rd: bool = false ## Флаг, что надо прочитать флеш
var need_flash_wr: bool = false ## Флаг, что надо записать данные в флеш
var need_write: bool = false ## Флаг, что надо записать данные в ячейку ЭМС
var ems_g_fn: String = '' ## Имя файла настроек ЭМС-Г
var cmd_array: Array ## Очередь выполнения команд
var online: bool ## статус платы
var ems_load: int = LoadState.NOT_DEFINED ## состояние загрузки платы
var state_cmd = WAIT ## текущее состояние платы ЭМС
var state_board = 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 ## Флаг, что данные из ячейки прочитанны
var need_flash_rd: bool = false ## Флаг, что надо прочитать флеш
var need_flash_wr: bool = false ## Флаг, что надо записать данные в флеш
var need_write: bool = false ## Флаг, что надо записать данные в ячейку ЭМС
var ems_g_fn: String = '' ## Имя файла настроек ЭМС-Г
var cmd_array: Array ## Очередь выполнения команд
signal upd_delay_offset(board, cur_dev) ## Сигнал о обновлении данных задержек
signal upd_o_state(board, cur_dev) ## Сигнал о обновлении данных режима выходов
signal load_done(board) ## Сигнал о окончании загрузки данных в ячейку
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
@@ -59,13 +60,18 @@ class EmsBoard:
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
ems_load = LoadState.DONE if ((status[0] >> bit_load) & 1) else LoadState.NOT_LOAD
else:
online = status[0] & 1
var bit_load = 4
ems_load = (status[0] >> bit_load) & 1
if not online:
need_write = true
if online:
if ems_load == LoadState.NOT_DEFINED:
ems_load = LoadState.DONE if ((status[0] >> bit_load) & 1) else LoadState.NOT_LOAD
elif ((status[0] >> bit_load) & 1):
ems_load = LoadState.DONE
else:
ems_load = LoadState.NOT_DEFINED
set_wait()
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) | \
@@ -155,19 +161,20 @@ class EmsBoard:
state_cmd = WR_DEV_NUM_W
on_wr_device(cur_dev_num)
else: # Пробег закончен, выбираем последнее устройство
state_cmd = WAIT
state_board = WAIT
set_wait()
read_done = true
cur_dev_index -= 1
need_next_dev = false
else:
state_cmd = WAIT
if cmd_array.size():
execute_cmd()
else:
set_wait()
elif (state_cmd == READ_FLASH) and (unit_ems.cmd_code_rx == unit_ems.CmdCode.READ_FLASH_MP550):
on_read_flash()
elif (state_cmd == WRITE_FLASH) and (unit_ems.cmd_code_rx == unit_ems.CmdCode.WRITE_FLASH_MP550):
state_board = WAIT
state_cmd = WAIT
set_wait()
## Выбор текущего устройства и проверка правильности его номера
func check_dev_number():
@@ -297,6 +304,7 @@ class EmsBoard:
func execute_cmd():
if len(cmd_array):
state_board = WRITE
var cmd: Array = cmd_array.pop_front()
change_mode(cmd[0], cmd[1])
@@ -308,3 +316,7 @@ class EmsBoard:
func get_dev_mode(fs_index):
return out_devs[modulation_dev[fs_index/4]].mode
func set_wait():
state_cmd = WAIT
state_board = WAIT