Рефактор. Переписан автомат состояний для работы с ЯУ-07 в ПРД.
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user