Доработка. ЭМС, работа с файлами и flash.

This commit is contained in:
MaD_CaT
2024-11-19 16:17:31 +03:00
parent f1c2433b91
commit 37f39a50e0
17 changed files with 321 additions and 101 deletions

View File

@@ -23,8 +23,8 @@ class Serial extends SerialPort:
class Socket extends PacketPeerUDP:
func send_to(addr, data):
self.set_dest_address(addr[0], addr[1])
self.put_packet(data)
set_dest_address(addr[0], addr[1])
put_packet(data)
class SocketTCP extends TCPServer:

View File

@@ -5,7 +5,7 @@ class_name rep_settings extends Node
@export var UnitProfiles: = { \
# Название | Протокол | Адрес | Порт | Широковещательное | Привязывать к адресу | Комментарий
'уарэп-яу07-частный': ['yau07rx', '10.1.1.2', [50002], false, true, 'IP-адрес на котором принимают частные сообщения от ЯУ-07'],
'уарэп-яу07-частный': ['yau07rx', '10.1.1.5', [50005], false, true, 'IP-адрес на котором принимают частные сообщения от ЯУ-07'],
'уарэп-яу07-общий': ['yau07rx', '*', [50000], true, true, 'IP-адрес на котором принимают широковещательные сообщения от ЯУ-07'],
'уарэп-капсрпб': ['json-capsrpb', '127.0.0.1', [42023, 42022], false, true, 'IP-адрес на котором принимают сообщения от КАПС РПБ'],
'уарэп-эмс': ['yau07tx', '10.1.1.52', [50052], false, false, 'IP-адрес ЯУ-07 прибора УФ'],

View File

@@ -154,3 +154,32 @@ func set_bit(bits, index, val, mask = 0xfffffffffffffff):
## [param m] - Маска изменяемых бит
func set_bits(v, a, m):
return (~m) & v | a & m
func fill_files_table(tbl: table, folder: String, rows_types: Array):
var dir: = DirAccess.open(folder)
if dir == null:
return
var exclude_names: = ['.', '..']
dir.list_dir_begin() # TODOGODOT4 fill missing arguments https://github.com/godotengine/godot/pull/40547
while true:
var file: = dir.get_next()
if file == '':
break
if file in exclude_names:
continue
var file_name = folder + file
var fd = FileAccess.open(file_name, FileAccess.READ)
if not fd:
continue
var glob_path = ProjectSettings.globalize_path(file_name)
var sz = fd.get_length()
var ut = FileAccess.get_modified_time(file_name)
fd.close()
var mt = Time.get_datetime_dict_from_unix_time(ut)
var file_row = [file, '%d' % sz, '%d-%02d-%02d %02d:%02d' % [mt.year, mt.month, mt.day, mt.hour, mt.minute]]
tbl.add_row(rows_types)
var i_row: = tbl.get_rows_count() - 1
tbl.set_row_text(i_row, file_row)
tbl.set_node_meta(0, i_row, 'file_path', glob_path)
dir.list_dir_end()

View File

@@ -2,10 +2,11 @@ class_name yau_07 extends Node
## Протокол ячейки ЯУ-07.
const ONLINE_TIMEOUT = 5000 ## Время ожидания пакета от ячейки, милисекунды
const RESEND_TIMEOUT = 300 ## Задержка для повторной отправки команды, секунды
const RETRY_COUNT = 5 ## Количество повторных отправок
const BUFFER_SIZE = 2048 ## Размер буфера для приёма датаграмм
const ONLINE_TIMEOUT = 5000 ## Время ожидания пакета от ячейки, милисекунды
const RESEND_TIMEOUT = 300 ## Задержка для повторной отправки команды, милисекунды
const RESEND_TIMEOUT_FLASH = 1500 ## Задержка для повторной отправки команды флеш, милисекунды
const RETRY_COUNT = 5 ## Количество повторных отправок
const BUFFER_SIZE = 2048 ## Размер буфера для приёма датаграмм
## Ячейка ЯУ-07.
@@ -41,6 +42,7 @@ class YaU07 extends unit.Unit:
var cmd_data: = PackedByteArray() ## Данные команды. Устанавливается в ЯУ-07
var cmd_retry = RETRY_COUNT ## Счётчик оставшихся попыток выполнить команду
var cmd_code_rx = 0 ## Код последней выполненой команды
var cmd_code_tx = 0 ## Код последней отправленной команды
var cmd_tick_tx = 0.0 ## Время последней отправки команды
var cmd_tick_rx = 0.0 ## Время последнего приёма команды
var status: = PackedByteArray() ## Поле "состояние прибора"
@@ -72,7 +74,10 @@ class YaU07 extends unit.Unit:
cmd_retry = RETRY_COUNT
elif cmd_state == CmdState.WAIT:
if cmd_retry:
if (tick - cmd_tick_tx) > RESEND_TIMEOUT:
var res_timeout = RESEND_TIMEOUT
if cmd_code_tx == CmdCode.WRITE_FLASH_MP550:
res_timeout = RESEND_TIMEOUT_FLASH
if (tick - cmd_tick_tx) > res_timeout:
rc = Error.OK
cmd_tick_tx = tick
cmd_retry -= 1
@@ -88,7 +93,8 @@ class YaU07 extends unit.Unit:
or (cmd_state == CmdState.UNCK):
return false
if not ((cmd_code == CmdCode.ERASE_FLASH) or (cmd_code == CmdCode.WRITE_FLASH) \
or (cmd_code == CmdCode.READ_FLASH) or (cmd_code == CmdCode.LOAD_FLASH)):
or (cmd_code == CmdCode.READ_FLASH) or (cmd_code == CmdCode.LOAD_FLASH)
or (cmd_code == CmdCode.READ_FLASH_MP550) or (cmd_code == CmdCode.WRITE_FLASH_MP550)):
return false
cmd_num_tx = (cmd_num_rx + 1) % 0xffff
tx_data.encode_u16(0, cmd_retry)
@@ -103,6 +109,13 @@ class YaU07 extends unit.Unit:
tx_len = 11 + len(fl_data) * 2
for i in range(len(fl_data)):
tx_data.encode_u16(12 + i * 2, fl_data[i])
elif cmd_code == CmdCode.WRITE_FLASH_MP550:
tx_data.encode_u8(7, id_sector)
tx_data.encode_u16(8, 0)
tx_data.encode_u16(10, len(fl_data) * 2)
tx_len = 12 + len(fl_data) * 2
for i in range(len(fl_data)):
tx_data.encode_u16(12 + i * 2, fl_data[i])
elif cmd_code == CmdCode.READ_FLASH:
tx_len = 11
tx_data.encode_u16(7, 0)
@@ -113,6 +126,7 @@ class YaU07 extends unit.Unit:
tx_data.encode_u16(8, 0)
tx_data.encode_u16(10, num_byte_rd)
cmd_state = CmdState.SEND
cmd_code_tx = cmd_code
return true
func send_isa(cmd_code: int, ports_data: Array) -> bool:
@@ -140,6 +154,7 @@ class YaU07 extends unit.Unit:
tx_data.encode_u16(8 + i, word)
i += 2
cmd_state = CmdState.SEND
cmd_code_tx = cmd_code
return true
func send_block(cmd_code: int, block_len: int, port: Array) -> bool:
@@ -163,6 +178,7 @@ class YaU07 extends unit.Unit:
tx_data.encode_u16(9, int(port[0]))
cmd_state = CmdState.SEND
cmd_code_tx = cmd_code
return true
## Возвращает код команды ЯУ-07.
## rx_data - Принятые данные.

View File

@@ -1,8 +1,8 @@
class_name yems_boards extends Node
class EmsBoard:
enum {WAIT, WR_DEV_NUM_W, WRITE, WR_DEV_NUM_R, READ, READ_FLASH, WRITE_FLASH_BEGIN, \
LOAD_KEMS, WRITE_FLASH_END}
enum {WAIT, WR_DEV_NUM_W, WRITE, WR_DEV_NUM_R, READ, READ_FLASH, WRITE_FLASH,
WRITE_FLASH_BEGIN, LOAD_KEMS, WRITE_FLASH_END}
var id_board: int ## id платы
var in_devs: Dictionary ## Словарь с входными устройствами.
@@ -13,7 +13,7 @@ LOAD_KEMS, WRITE_FLASH_END}
var out_tbl: Array
var online: bool ## статус платы
var ems_load: bool ## флаг загрузки платы
var state_cmd = WAIT ## текущее состояние платы ЭМС
var state_cmd = WAIT ## текущее состояние платы ЭМС
var state_board = WAIT ## текущее состояние платы ЭМС
var cur_dev ## Текущее устройство
var cur_dev_num: = 0 ## Номер текущего устройства
@@ -23,6 +23,8 @@ LOAD_KEMS, WRITE_FLASH_END}
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 ## Флаг, что надо записать данные в ячейку ЭМС
signal upd_delay_offset(board, cur_dev)
signal upd_o_state(board, cur_dev)
@@ -37,7 +39,6 @@ LOAD_KEMS, WRITE_FLASH_END}
ports_to_wr.append(base_addr_isa + 4 + i * 2) # Заполнение списка портами для записи
dev_num_list = in_tbl + out_tbl
func set_status(status):
var offset = yemsconsts.STATUS_OFFSET[id_board]
var bit_online = 0 + id_board
@@ -143,15 +144,9 @@ LOAD_KEMS, WRITE_FLASH_END}
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_BEGIN) and (unit_ems.cmd_code_rx == 49):
pass
#write_flash()
#emit_signal('write_msg', 'Произведено чтение из ПЗУ ячейки ЯУ-07')
elif (state_cmd == LOAD_KEMS) and (unit_ems.cmd_code_rx == 52):
pass
#start_rw_kems(true)
elif (state_cmd == WRITE_FLASH_END) and (unit_ems.cmd_code_rx == 50):
pass
elif (state_cmd == WRITE_FLASH) and (unit_ems.cmd_code_rx == unit_ems.CmdCode.WRITE_FLASH_MP550):
state_board = WAIT
state_cmd = WAIT
#load_flash()
#emit_signal('write_msg', 'Произведена запись в ПЗУ ячейки ЯУ-07')
@@ -181,6 +176,7 @@ LOAD_KEMS, WRITE_FLASH_END}
state_cmd = WR_DEV_NUM_R
else:
state_cmd = WR_DEV_NUM_W
need_write = false
on_wr_device(cur_dev_num)
func set_connection(o_dev, i_dev, val):
@@ -216,5 +212,56 @@ LOAD_KEMS, WRITE_FLASH_END}
func on_read_flash():
need_flash_rd = false
state_board = WAIT
print_debug(id_board)
var amount_dev = unit_ems.flash_len / 10
for i in amount_dev:
var cur_i = i * 10
cur_dev_num = unit_ems.flash_data.decode_u16(cur_i)
if not check_dev_number(): continue
cur_dev.ports_data[base_addr_isa + 4] = unit_ems.flash_data.decode_u16(cur_i + 2)
cur_dev.ports_data[base_addr_isa + 6] = unit_ems.flash_data.decode_u16(cur_i + 4)
cur_dev.ports_data[base_addr_isa + 8] = unit_ems.flash_data.decode_u16(cur_i + 6)
cur_dev.ports_data[base_addr_isa + 10] = unit_ems.flash_data.decode_u16(cur_i + 8)
start_rw_kems(false)
func write_flash():
need_flash_wr = false
var fl_data: Array = []
var cur_dev_temp = cur_dev_num
for i in yemsconsts.NUM_INPUT:
cur_dev_num = i + 1
append_data_to_flash(fl_data)
for i in yemsconsts.NUM_OUTPUT:
cur_dev_num = i + yemsconsts.STATUS_OUT_OFFSET
append_data_to_flash(fl_data)
unit_ems.send_flash(unit_ems.CmdCode.WRITE_FLASH_MP550, fl_data, 0, id_board)
cur_dev_num = cur_dev_temp
state_cmd = WRITE_FLASH
func append_data_to_flash(fl_data):
fl_data.append(cur_dev_num)
if check_dev_number():
fl_data.append(cur_dev.ports_data[base_addr_isa + 4])
fl_data.append(cur_dev.ports_data[base_addr_isa + 6])
fl_data.append(cur_dev.ports_data[base_addr_isa + 8])
fl_data.append(cur_dev.ports_data[base_addr_isa + 10])
else:
for j in range(4):
fl_data.append(0)
func btn_load(json_data):
for item in json_data.keys():
var ports: Dictionary = json_data[item]
cur_dev_num = int(item)
if not check_dev_number(): continue
if ports.has('%d'%(base_addr_isa + 4)):
cur_dev.ports_data[base_addr_isa + 4] = int(ports['%d'%(base_addr_isa + 4)])
else: continue
if ports.has('%d'%(base_addr_isa + 6)):
cur_dev.ports_data[base_addr_isa + 6] = int(ports['%d'%(base_addr_isa + 6)])
else: continue
if ports.has('%d'%(base_addr_isa + 8)):
cur_dev.ports_data[base_addr_isa + 8] = int(ports['%d'%(base_addr_isa + 8)])
else: continue
if ports.has('%d'%(base_addr_isa + 10)):
cur_dev.ports_data[base_addr_isa + 10] = int(ports['%d'%(base_addr_isa + 10)])
else: continue

View File

@@ -1,5 +1,10 @@
class_name yerms_consts extends Node
var files_folder = ProjectSettings.get_setting('application/config/kems_files_path', 'user://kems/') # Папка с файлами вариантами настроек ЭМС
var FILES_ROWS_ALIGNMENT = [ HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER ]
var FILES_COLUMN_WIDTHS = [ 90, 150, 150 ]
const NUM_INPUT = 38
const NUM_OUTPUT = 38
const NUM_BYTE_FROM_FLASH = 760
@@ -19,6 +24,13 @@ const MAX_VAL_OFFSET = 51.1
const I_COL_OFFSET = 3
const I_COL_DELAY = 2
const FILES_NAME = ['Вариант 1',
'Вариант 2',
'Вариант 3',
'Вариант 4',
'Вариант 5',
]
## Таблица с данными для входов, первое значение - индекс устройства в ячейке КЭМС.
const INPUT_KEMS = [
[1 ,['УИЗП №1', 'Х7', '0.00', '0.00']],