Рефактор. Переписан автомат состояний для работы с ЯУ-07 в ПРД.
This commit is contained in:
105
scripts/prd.gd
105
scripts/prd.gd
@@ -1,8 +1,9 @@
|
||||
extends Node
|
||||
|
||||
enum PrdState {WORK, CONTROL}
|
||||
|
||||
## Границы секторов блоков ФС по частоте в режиме РТО.
|
||||
const fs_band_rto: Dictionary = {
|
||||
const FS_BAND_RTO: Dictionary = {
|
||||
0: [200.0, 250.0],
|
||||
1: [250.0, 300.0],
|
||||
2: [300.0, 350.0],
|
||||
@@ -12,7 +13,7 @@ const fs_band_rto: Dictionary = {
|
||||
6: [500.0, 550.0] }
|
||||
|
||||
## Границы секторов блоков ФС по частоте в режиме РЛС.
|
||||
const fs_band_rls: Dictionary = {
|
||||
const FS_BAND_RLS: Dictionary = {
|
||||
0: [480.0, 490.0],
|
||||
1: [490.0, 500.0],
|
||||
2: [500.0, 510.0],
|
||||
@@ -22,13 +23,23 @@ const fs_band_rls: Dictionary = {
|
||||
6: [540.0, 550.0] }
|
||||
|
||||
## Границы секторов блоков ФС по пеленгу.
|
||||
const fs_sectors: Dictionary = {
|
||||
const FS_SECTORS: Dictionary = {
|
||||
0: [0.0, 90.0],
|
||||
3: [90.0, 180.0],
|
||||
2: [180.0, 270.0],
|
||||
1: [270.0, 360.0] }
|
||||
|
||||
const fs_freq: Dictionary = {
|
||||
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],
|
||||
2: [1065.0, 1210.0, 300.0, 350.0, 1137.0],
|
||||
@@ -38,7 +49,7 @@ const fs_freq: Dictionary = {
|
||||
6: [3500.0, 6000.0, 500.0, 550.0, 5800.0] }
|
||||
|
||||
## Названия приборов ПРД
|
||||
const prd_names: Array = [
|
||||
const PRD_NAMES: Array = [
|
||||
'уарэп-яу07-1н',
|
||||
'уарэп-яу07-1в',
|
||||
'уарэп-яу07-1к',
|
||||
@@ -53,7 +64,7 @@ const prd_names: Array = [
|
||||
'уарэп-яу07-4к', ]
|
||||
|
||||
## Соответствие модулей ФС их нахождуению в приборе ПРД
|
||||
const fs_prd: Dictionary = {
|
||||
const FS_PRD: Dictionary = {
|
||||
0: ['уарэп-яу07-1к'],
|
||||
1: ['уарэп-яу07-4к'],
|
||||
2: ['уарэп-яу07-3к'],
|
||||
@@ -87,7 +98,7 @@ var fs_dict: Dictionary ## Словарь с модулями ФС
|
||||
var prd_dict: Dictionary ## Словарь с приборами ПРД
|
||||
|
||||
class Fs:
|
||||
const um_ports: Dictionary = {
|
||||
const UM_PORTS: Dictionary = {
|
||||
1 : 0x6,
|
||||
2 : 0xA,
|
||||
3 : 0x6,
|
||||
@@ -99,27 +110,29 @@ class Fs:
|
||||
var modulation: bool ## Состояние модуляции
|
||||
var prd_name: String ## Ипя прибора ПРД в котором стоит модуль
|
||||
var um_port: int = 0 ## Порт для угла места
|
||||
var um: int = 0 ## Код угла места
|
||||
var um_code: int = 0 ## Код угла места
|
||||
|
||||
signal update_modulation(index)
|
||||
|
||||
func _init(i, p_name):
|
||||
prd_name = p_name
|
||||
index = i
|
||||
if um_ports.has(index/4):
|
||||
um_port = um_ports[index/4]
|
||||
if UM_PORTS.has(index/4):
|
||||
um_port = UM_PORTS[index/4]
|
||||
|
||||
func set_modulation(val):
|
||||
modulation = val
|
||||
|
||||
|
||||
class PRD:
|
||||
const ug_addr: int = 0x100 ## адрес ячейки УГ
|
||||
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 ## Очередь команд
|
||||
|
||||
func _init(u_name ,u):
|
||||
prd_name = u_name
|
||||
@@ -142,48 +155,66 @@ class PRD:
|
||||
var out_dev = yemsdevs.OutDev.new(item[0], params, 0, 0x120)
|
||||
yemsg_board.out_devs[out_dev.id] = out_dev
|
||||
yemsg_board.need_write = true
|
||||
unit_yau07.connect('data_received', Callable(self, 'on_data_ems_received').bind())
|
||||
unit_yau07.connect('data_received', Callable(self, 'on_data_received').bind())
|
||||
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):
|
||||
yemsg_board.on_command_done(unit_ems)
|
||||
if yemsg_board.state_board != yemsg_board.WAIT or yemsg_board.state_cmd != yemsg_board.WAIT:
|
||||
yemsg_board.on_command_done(unit_ems)
|
||||
return
|
||||
|
||||
func on_line_changed(unit_ems):
|
||||
if not unit_ems.online:
|
||||
yemsg_board.ems_load = false
|
||||
yemsg_board.state_board = yemsg_board.WAIT
|
||||
yemsg_board.state_cmd = yemsg_board.WAIT
|
||||
yemsg_board.need_write = true
|
||||
yemsg_board.ems_load = yemsg_board.LoadState.NOT_DEFINED
|
||||
yemsg_board.set_wait()
|
||||
|
||||
func on_data_ems_received(unit_ems):
|
||||
func on_data_received(unit_ems):
|
||||
yemsg_board.set_status(unit_ems.status)
|
||||
if yemsg_board.state_board == yemsg_board.WAIT and yemsg_board.state_cmd == yemsg_board.WAIT:
|
||||
if yemsg_board.online:
|
||||
if yemsg_board.need_write and (not yemsg_board.ems_load):
|
||||
start_load()
|
||||
elif not yemsg_board.ems_load:
|
||||
yemsg_board.set_load_done()
|
||||
elif yemsg_board.ems_load and len(yemsg_board.cmd_array):
|
||||
yemsg_board.execute_cmd()
|
||||
if state != PrdState.WORK:
|
||||
return
|
||||
if yemsg_board.state_board != yemsg_board.WAIT or yemsg_board.state_cmd != yemsg_board.WAIT:
|
||||
return
|
||||
if yemsg_board.online:
|
||||
if yemsg_board.ems_load == yemsg_board.LoadState.NOT_LOAD:
|
||||
start_load()
|
||||
elif yemsg_board.ems_load == yemsg_board.LoadState.IN_PROCESS:
|
||||
yemsg_board.set_load_done()
|
||||
elif (yemsg_board.ems_load == yemsg_board.LoadState.DONE) and len(yemsg_board.cmd_array):
|
||||
yemsg_board.execute_cmd()
|
||||
else:
|
||||
yemsg_board.need_write = true
|
||||
execute_cmd()
|
||||
return
|
||||
execute_cmd()
|
||||
|
||||
func execute_cmd():
|
||||
if not len(cmd_array): return
|
||||
var cmd: Array = cmd_array.pop_front()
|
||||
unit_yau07.send_isa(cmd[0], cmd[1])
|
||||
|
||||
func start_load():
|
||||
var file = FileAccess.open(yemsconsts.emsg_files_folder + yemsg_board.ems_g_fn, FileAccess.READ)
|
||||
var abs_dir = ProjectSettings.globalize_path(yemsconsts.emsg_files_folder + yemsg_board.ems_g_fn)
|
||||
if file == null:
|
||||
yemsg_board.state_board = yemsg_board.LOAD_FAIL
|
||||
yemsg_board.ems_load = yemsg_board.LoadState.FAIL
|
||||
yemsg_board.set_wait()
|
||||
log.error('Не удалось прочитать файл настроек ячейки ЭМС-Г %s' %abs_dir)
|
||||
return
|
||||
var read = file.get_as_text()
|
||||
file.close()
|
||||
var json_conv: = JSON.new()
|
||||
if Error.OK == json_conv.parse(read):
|
||||
var json_data = json_conv.get_data()
|
||||
yemsg_board.need_write = true
|
||||
yemsg_board.ems_load = yemsg_board.LoadState.IN_PROCESS
|
||||
yemsg_board.btn_load(json_data)
|
||||
yemsg_board.state_board = yemsg_board.WRITE
|
||||
yemsg_board.start_rw_kems(false)
|
||||
else:
|
||||
yemsg_board.state_board = yemsg_board.LOAD_FAIL
|
||||
yemsg_board.ems_load = yemsg_board.LoadState.FAIL
|
||||
yemsg_board.set_wait()
|
||||
log.error('Не удалось прочитать файл настроек ячейки ЭМС-Г %s' %abs_dir)
|
||||
|
||||
|
||||
func on_update_modulation(index):
|
||||
yemsg_board.add_cmd(index/4, fs_dic[index].modulation)
|
||||
@@ -191,13 +222,13 @@ class PRD:
|
||||
|
||||
func _ready() -> void:
|
||||
check_dir()
|
||||
for prd_name in prd_names:
|
||||
for prd_name in PRD_NAMES:
|
||||
var unit_key = settings.get_unit_key(prd_name)
|
||||
var unit_prd = network.units[unit_key]
|
||||
var new_prd = PRD.new(prd_name, unit_prd)
|
||||
prd_dict[prd_name] = new_prd
|
||||
for key in fs_prd.keys():
|
||||
var fs = Fs.new(key, fs_prd[key][0])
|
||||
for key in FS_PRD.keys():
|
||||
var fs = Fs.new(key, FS_PRD[key][0])
|
||||
fs_dict[key] = fs
|
||||
if prd_dict.has(fs.prd_name):
|
||||
prd_dict[fs.prd_name].fs_dic[key] = fs
|
||||
@@ -211,13 +242,13 @@ func get_fs_index(ecm, fs_index_arr):
|
||||
var angle: float = ecm.kni + 45.0
|
||||
if angle > 360.0:
|
||||
angle -= 360.0
|
||||
for sec in fs_sectors.values():
|
||||
for sec in FS_SECTORS.values():
|
||||
if float(angle) >= sec[0] and float(angle) <= sec[1]:
|
||||
sector = fs_sectors.find_key(sec)
|
||||
for diap in fs_freq.values():
|
||||
sector = FS_SECTORS.find_key(sec)
|
||||
for diap in FS_FREQ.values():
|
||||
if ecm.params.has('freq'):
|
||||
if ecm.params['freq'] >= diap[0] and ecm.params['freq'] <= diap[1]:
|
||||
band.append(fs_freq.find_key(diap))
|
||||
band.append(FS_FREQ.find_key(diap))
|
||||
for item in band:
|
||||
fs_index_arr.append(item * 4 + sector)
|
||||
|
||||
@@ -233,6 +264,7 @@ func update_fs_state(ecms):
|
||||
var fs = fs_dict[fs_index]
|
||||
fs.set_modulation(ecm.modulation)
|
||||
for prd_module in prd_dict.values(): ## Отправка команды на исполнение в ПРД
|
||||
if prd_module.state != PrdState.WORK: return
|
||||
if not prd_module.unit_yau07.online: continue
|
||||
for fs in prd_module.fs_dic.values():
|
||||
var dev_mode = prd_module.yemsg_board.get_dev_mode(fs.index)
|
||||
@@ -243,6 +275,7 @@ func update_fs_state(ecms):
|
||||
fs.emit_signal('update_modulation')
|
||||
|
||||
|
||||
|
||||
## Проверяет ниличие директории, если их нет, создаёт
|
||||
func check_dir():
|
||||
var dir = DirAccess.open(yemsconsts.emsg_files_folder)
|
||||
|
||||
Reference in New Issue
Block a user