Доработка. Добавлена команда отправки угла места, рефактор машин состояний отправки команд ЭМС. Мелкие исправления.
This commit is contained in:
@@ -10,7 +10,7 @@ func set_track_visible(value: bool): $track.visible = value
|
||||
func set_ecm_visible(value: bool): $ecm_done.visible = value
|
||||
|
||||
|
||||
func update(tick_ms: int = 0): pass
|
||||
func update(_tick_ms: int = 0): pass
|
||||
|
||||
|
||||
## Задаёт цвет
|
||||
|
||||
@@ -4,7 +4,7 @@ var scene_list=[]
|
||||
|
||||
func node_list(node):
|
||||
scene_list.append(node)
|
||||
|
||||
|
||||
func _enter_tree():
|
||||
get_tree().node_added.connect(self.node_list)
|
||||
func _ready():
|
||||
|
||||
@@ -193,8 +193,7 @@ func _on_btn_save_settings_pressed():
|
||||
json_data[parameter].append(child.is_pressed())
|
||||
var file = FileAccess.open(settings.settings_file, FileAccess.WRITE)
|
||||
if file:
|
||||
var json_conv = JSON.new()
|
||||
var json_string = json_conv.stringify(json_data)
|
||||
var json_string = JSON.stringify(json_data)
|
||||
file.store_string(json_string)
|
||||
file.close()
|
||||
log.info('Настройки сохранены в файл %s' % settings.settings_file)
|
||||
|
||||
@@ -2,7 +2,7 @@ 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, WRITE_FLASH_END} ## Состояния платы
|
||||
WRITE_FLASH_BEGIN, WRITE_FLASH_END, LOADING} ## Состояния платы
|
||||
|
||||
enum LoadState {NOT_LOAD, DONE, IN_PROCESS, FAIL, NOT_DEFINED}
|
||||
|
||||
@@ -65,7 +65,7 @@ class EmsBoard:
|
||||
online = status[0] & 1
|
||||
var bit_load = 4
|
||||
if online:
|
||||
if ems_load == LoadState.NOT_DEFINED:
|
||||
if (ems_load != LoadState.IN_PROCESS) and (ems_load != LoadState.FAIL):
|
||||
ems_load = LoadState.DONE if ((status[0] >> bit_load) & 1) else LoadState.NOT_LOAD
|
||||
elif ((status[0] >> bit_load) & 1):
|
||||
ems_load = LoadState.DONE
|
||||
@@ -123,22 +123,23 @@ class EmsBoard:
|
||||
ports.append(port)
|
||||
unit_ems.send_isa(unit_ems.CmdCode.READ_ISA, ports)
|
||||
|
||||
## Проверяет правильность выполнения команды записи номера устройства
|
||||
func check_set_dev(cmd_s):
|
||||
if unit_ems.isa_ports.has(base_addr_isa + 2):
|
||||
cur_dev_num = unit_ems.isa_ports[base_addr_isa + 2]
|
||||
state_cmd = cmd_s
|
||||
if not check_dev_number():
|
||||
return
|
||||
on_wr_device(cur_dev_num)
|
||||
|
||||
## Обработчик сообщения, о том, что команда выполнена (машина состояний)
|
||||
func on_command_done(_yau_07):
|
||||
if not check_dev_number():
|
||||
return
|
||||
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)
|
||||
check_set_dev(WRITE)
|
||||
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)
|
||||
check_set_dev(READ)
|
||||
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():
|
||||
@@ -175,6 +176,8 @@ class EmsBoard:
|
||||
on_read_flash()
|
||||
elif (state_cmd == WRITE_FLASH) and (unit_ems.cmd_code_rx == unit_ems.CmdCode.WRITE_FLASH_MP550):
|
||||
set_wait()
|
||||
elif state_board == LOADING:
|
||||
set_wait()
|
||||
|
||||
## Выбор текущего устройства и проверка правильности его номера
|
||||
func check_dev_number():
|
||||
@@ -300,6 +303,7 @@ class EmsBoard:
|
||||
cur_dev.ports_data[base_addr_isa + 10] = int(ports['%d'%(base_addr_isa + 10)])
|
||||
|
||||
func set_load_done():
|
||||
state_board = LOADING
|
||||
unit_ems.send_load_ems_done(unit_ems.CmdCode.LOAD_EMS_DONE)
|
||||
|
||||
func execute_cmd():
|
||||
|
||||
@@ -29,16 +29,6 @@ const FS_SECTORS: Dictionary = {
|
||||
2: [180.0, 270.0],
|
||||
1: [270.0, 360.0] }
|
||||
|
||||
const CODE_UM: Array = [
|
||||
[-5, 0],
|
||||
[0 , 10],
|
||||
[10, 20],
|
||||
[20, 30],
|
||||
[30, 40],
|
||||
[40, 50],
|
||||
[50, 55]
|
||||
]
|
||||
|
||||
const FS_FREQ: Dictionary = {
|
||||
0: [390.0, 800.0, 200.0, 250.0, 433.0],
|
||||
1: [800.0, 1065.0, 250.0, 300.0, 860.0],
|
||||
@@ -99,18 +89,28 @@ var prd_dict: Dictionary ## Словарь с приборами ПРД
|
||||
|
||||
class Fs:
|
||||
const UM_PORTS: Dictionary = {
|
||||
1 : 0x6,
|
||||
2 : 0xA,
|
||||
3 : 0x6,
|
||||
4 : 0xA,
|
||||
5 : 0x6,
|
||||
6 : 0xA }
|
||||
1 : 0x106,
|
||||
2 : 0x10A,
|
||||
3 : 0x106,
|
||||
4 : 0x10A,
|
||||
5 : 0x106,
|
||||
6 : 0x10A }
|
||||
|
||||
const CODE_UM: Array = [
|
||||
[-5, 0],
|
||||
[0 , 10],
|
||||
[10, 20],
|
||||
[20, 30],
|
||||
[30, 40],
|
||||
[40, 50],
|
||||
[50, 55]]
|
||||
|
||||
var index ## Индекс блока усилителей
|
||||
var modulation: bool ## Состояние модуляции
|
||||
var prd_name: String ## Ипя прибора ПРД в котором стоит модуль
|
||||
var um_port: int = 0 ## Порт для угла места
|
||||
var um_code: int = 0 ## Код угла места
|
||||
var um_code_tx: int = 0 ## Код угла места для отправки в прибор
|
||||
var um_code_rx: int = 0 ## Текущий код угла места
|
||||
|
||||
signal update_modulation(index)
|
||||
|
||||
@@ -123,16 +123,34 @@ class Fs:
|
||||
func set_modulation(val):
|
||||
modulation = val
|
||||
|
||||
func set_um_code(um: float):
|
||||
if um < CODE_UM[0][0]:
|
||||
um_code_tx = 0
|
||||
elif um > CODE_UM[len(CODE_UM) - 1][1]:
|
||||
um_code_tx = len(CODE_UM) - 1
|
||||
else:
|
||||
for i in CODE_UM.size():
|
||||
if (um >= CODE_UM[i][0]) and (um < CODE_UM[i][1]):
|
||||
um_code_tx = i
|
||||
|
||||
func set_um_data(data_arr, u):
|
||||
if UM_PORTS.has(index/4):
|
||||
var val = um_code_tx
|
||||
if u.isa_ports.has(um_port):
|
||||
val = tools.set_bits(u.isa_ports[um_port], um_code_tx, 0x0003)
|
||||
data_arr.append(um_port)
|
||||
data_arr.append(val)
|
||||
|
||||
|
||||
class PRD:
|
||||
const UG_BASE_ADDR: int = 0x100 ## адрес ячейки УГ
|
||||
|
||||
var prd_name: String ## Имя прибора
|
||||
var unit_yau07 ## Юнит эмс
|
||||
var fs_dic: Dictionary ## Массив блоков ФС
|
||||
var yemsg_board: yemsboards.EmsBoard ## Плата ЭМС-Г
|
||||
var state = PrdState.WORK
|
||||
var cmd_array: Array ## Очередь команд
|
||||
var ug_online: bool = false ## Состояние ячейки УГ
|
||||
var set_ug_state: bool = true ## Необходимо ли записать в УГ настройки
|
||||
|
||||
func _init(u_name ,u):
|
||||
prd_name = u_name
|
||||
@@ -159,18 +177,25 @@ class PRD:
|
||||
unit_yau07.connect('command_done', Callable(self, 'on_command_done').bind())
|
||||
unit_yau07.connect('line_changed', Callable(self, 'on_line_changed').bind())
|
||||
|
||||
func on_command_done(unit_ems):
|
||||
func on_command_done(u):
|
||||
if yemsg_board.state_board != yemsg_board.WAIT or yemsg_board.state_cmd != yemsg_board.WAIT:
|
||||
yemsg_board.on_command_done(unit_ems)
|
||||
yemsg_board.on_command_done(u)
|
||||
return
|
||||
for fs in fs_dic.values():
|
||||
for port in u.isa_ports.keys():
|
||||
if port == fs.um_port:
|
||||
fs.um_code_rx = u.isa_ports[port] & 0x7
|
||||
|
||||
|
||||
|
||||
func on_line_changed(unit_ems):
|
||||
if not unit_ems.online:
|
||||
yemsg_board.ems_load = yemsg_board.LoadState.NOT_DEFINED
|
||||
yemsg_board.set_wait()
|
||||
set_ug_state = true
|
||||
|
||||
func on_data_received(unit_ems):
|
||||
yemsg_board.set_status(unit_ems.status)
|
||||
func on_data_received(_u):
|
||||
set_prd_status()
|
||||
if state != PrdState.WORK:
|
||||
return
|
||||
if yemsg_board.state_board != yemsg_board.WAIT or yemsg_board.state_cmd != yemsg_board.WAIT:
|
||||
@@ -187,6 +212,12 @@ class PRD:
|
||||
return
|
||||
execute_cmd()
|
||||
|
||||
func set_prd_status():
|
||||
yemsg_board.set_status(unit_yau07.status)
|
||||
ug_online = (unit_yau07.status[0] >> 1) & 1
|
||||
if not ug_online:
|
||||
set_ug_state = true
|
||||
|
||||
func execute_cmd():
|
||||
if not len(cmd_array): return
|
||||
var cmd: Array = cmd_array.pop_front()
|
||||
@@ -219,6 +250,9 @@ class PRD:
|
||||
func on_update_modulation(index):
|
||||
yemsg_board.add_cmd(index/4, fs_dic[index].modulation)
|
||||
|
||||
func set_um(data_arr):
|
||||
cmd_array.append([unit_yau07.CmdCode.WRITE_ISA, data_arr])
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
check_dir()
|
||||
@@ -263,9 +297,11 @@ func update_fs_state(ecms):
|
||||
for fs_index in fs_ids:
|
||||
var fs = fs_dict[fs_index]
|
||||
fs.set_modulation(ecm.modulation)
|
||||
fs.set_um_code(ecm.um)
|
||||
for prd_module in prd_dict.values(): ## Отправка команды на исполнение в ПРД
|
||||
if prd_module.state != PrdState.WORK: return
|
||||
if not prd_module.unit_yau07.online: continue
|
||||
var um_data_array: Array = []
|
||||
for fs in prd_module.fs_dic.values():
|
||||
var dev_mode = prd_module.yemsg_board.get_dev_mode(fs.index)
|
||||
var fs_state = 2
|
||||
@@ -273,7 +309,15 @@ func update_fs_state(ecms):
|
||||
fs_state = 3
|
||||
if (dev_mode != fs_state) or (fs_state == 3):
|
||||
fs.emit_signal('update_modulation')
|
||||
|
||||
if not prd_module.ug_online: continue
|
||||
if prd_module.set_ug_state:
|
||||
fs.set_um_data(um_data_array, prd_module.unit_yau07)
|
||||
else:
|
||||
if fs.um_code_tx != fs.um_code_rx:
|
||||
fs.set_um_data(um_data_array, prd_module.unit_yau07)
|
||||
if um_data_array.size():
|
||||
prd_module.set_ug_state = false
|
||||
prd_module.set_um(um_data_array)
|
||||
|
||||
|
||||
## Проверяет ниличие директории, если их нет, создаёт
|
||||
|
||||
Reference in New Issue
Block a user