Merge remote-tracking branch 'MaD_CaT/master'

# Conflicts:
#	project.godot
#	scripts/settings.gd
This commit is contained in:
sasha80
2024-11-20 09:40:20 +03:00
21 changed files with 356 additions and 125 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

View File

@@ -1,34 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://coqg6wsftvtxr"
path="res://.godot/imported/document-save-0.png-beb8a5dba6cf2046205d50b7f2a0303a.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://data/document-save-0.png"
dest_files=["res://.godot/imported/document-save-0.png-beb8a5dba6cf2046205d50b7f2a0303a.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

BIN
data/load.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View File

@@ -2,16 +2,16 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://cywuevvpkxl7v"
path="res://.godot/imported/edit-copy-0.png-669a30c517f56dcd05ee05650e14794f.ctex"
uid="uid://t51eyh4hmc6p"
path="res://.godot/imported/load.png-d59058e2af05e1fb46f2802cfb03f428.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://data/edit-copy-0.png"
dest_files=["res://.godot/imported/edit-copy-0.png-669a30c517f56dcd05ee05650e14794f.ctex"]
source_file="res://data/load.png"
dest_files=["res://.godot/imported/load.png-d59058e2af05e1fb46f2802cfb03f428.ctex"]
[params]

BIN
data/save.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

@@ -2,16 +2,16 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://nm7cpjw6rs51"
path="res://.godot/imported/document-new-0.png-4076926ba4469926b76b7d685aad96aa.ctex"
uid="uid://biyjygfnhhf7i"
path="res://.godot/imported/save.png-ff5f3648379e88ca48662f125f3e98a0.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://data/document-new-0.png"
dest_files=["res://.godot/imported/document-new-0.png-4076926ba4469926b76b7d685aad96aa.ctex"]
source_file="res://data/save.png"
dest_files=["res://.godot/imported/save.png-ff5f3648379e88ca48662f125f3e98a0.ctex"]
[params]

View File

@@ -37,6 +37,7 @@ config/external_cu=false
config/unit_rr_left_bort="http://127.0.0.1:8080/reports/left_SelfTestReport.json"
config/unit_rr_right_bort="http://127.0.0.1:8080/reports/right_SelfTestReport.json"
config/unit_rr_request_period=5.0
config/kems_files_path="user://kems/"
[autoload]

View File

@@ -26,4 +26,3 @@ func _on_bip_gui_input(event):
func update():
$bip.material.set('shader_parameter/tick_update', float(Time.get_ticks_msec()/1000))

View File

@@ -150,4 +150,3 @@ func map_th_to_row(ecm) -> Array:
if INTERFER_STATE.has(ecm.svk):
row[COLUMN_STATE] = '%s' % INTERFER_STATE[ecm.svk]
return row

View File

@@ -101,4 +101,3 @@ func on_rto_threat_sel(th_id, tbl):
## Снимает выделение цели.
func on_rto_threat_unsel(_th_id): $table.clear_rows_selected()

View File

@@ -23,30 +23,37 @@ layout_mode = 0
offset_right = 1600.0
offset_bottom = 1200.0
tooltip_text = "Переключает режимы работы программы"
current_tab = 0
script = ExtResource("1_fg0vd")
[node name="Работа" parent="tab_switch" instance=ExtResource("2_u7p16")]
layout_mode = 2
metadata/_tab_index = 0
[node name="Контроль" parent="tab_switch" instance=ExtResource("3_txp0s")]
visible = false
layout_mode = 2
metadata/_tab_index = 1
[node name="Журнал" parent="tab_switch" instance=ExtResource("4_cu5k8")]
visible = false
layout_mode = 2
metadata/_tab_index = 2
[node name="ЭМС" parent="tab_switch" instance=ExtResource("5_u71bh")]
visible = false
layout_mode = 2
metadata/_tab_index = 3
[node name="ЭМС2" parent="tab_switch" instance=ExtResource("6_rsg03")]
visible = false
layout_mode = 2
metadata/_tab_index = 4
[node name="Настройки" parent="tab_switch" instance=ExtResource("6_i8iv3")]
visible = false
layout_mode = 2
metadata/_tab_index = 5
[node name="lbl_ready" type="Label" parent="."]
layout_mode = 0

View File

@@ -2,6 +2,7 @@ class_name ems extends Panel
## Предзагрузка ячеек таблиц.
const TableHeader = preload('res://table/header.tscn')
const TableLabel = preload('res://table/lable.tscn')
const CellYemsButton = preload('res://scenes/эмс/кнопка-эмс.tscn')
const CellLineEdit = preload('res://table/ячейка-2.tscn')
const CellState = preload('res://scenes/эмс/состояния-эмс.tscn')
@@ -17,6 +18,7 @@ const TABLE_ENTRY_COLUMNS: Array = [2,3]
const OUT_SET_ROW: Array = [CellLineEdit, CellLEEmpty, CellLEEmpty, CellLEEmpty, CellLEEmpty, CellLEEmpty]
const IN_SET_ROW: Array = [CellLineEdit, CellLEEmpty, CellLEEmpty, CellLEEmpty, CellLEEmpty]
var FILES_ROWS_TYPES = [CellLineEdit, CellLineEdit, CellLineEdit ]
var g_boards: Dictionary ## Словарь плат ЭМС.
var active_board = null ## Активная плата ЭМС
@@ -113,19 +115,30 @@ func on_disconnect(tbl, selected_rows, unit_ems):
func on_btn_flash_read(btn):
await get_tree().create_timer(0.1).timeout
btn.pressed = false
for board in g_boards.values():
board.need_flash_rd = true
## Обработчик нажатия кнопки "Записать".
func on_btn_flash_write(btn):
await get_tree().create_timer(0.1).timeout
btn.pressed = false
for board in g_boards.values():
board.need_flash_wr = true
## Инициализация таблицы с файлами настроек ЭМС.
func init_tbl_files():
check_dir()
$scrl_files/tbl_files.set_header([TableHeader, TableHeader, TableHeader])
$scrl_files/tbl_files.set_header_text(['Имя файла', 'Дата изменения', 'Размер'])
$scrl_files/tbl_files.set_columns_min_size([200, 120, 70])
tools.fill_files_table($scrl_files/tbl_files, yemsconsts.files_folder, FILES_ROWS_TYPES)
$scrl_files/tbl_files.set_columns_alignments(yemsconsts.FILES_ROWS_ALIGNMENT)
$scrl_files/tbl_files.set_columns_min_size(yemsconsts.FILES_COLUMN_WIDTHS)
$scrl_files/tbl_files.connect('row_pressed', Callable(self, 'on_pressed_file'))
for i_row in $scrl_files/tbl_files.get_rows_count():
disable_edit($scrl_files/tbl_files, len(FILES_ROWS_TYPES), i_row)
## Инициализация таблиц входов.
@@ -146,7 +159,7 @@ func init_tbl_in():
var in_dev: yemsdevs.InDev = yemsdevs.InDev.new(item[0], params, row_index, g_boards[board].base_addr_isa)
g_boards[board].in_devs[in_dev.id] = in_dev
in_dev.board = board
for i in range(len(row_type)):
for i in len(row_type):
if i < len(params):
var node = $scrollin/tbl_in.get_node2(i, row_index)
if i == 0:
@@ -236,7 +249,7 @@ func on_selected_changed_si(i_row: int):
var out_user_data = $scrl_in_set/tbl_in_set.get_node_user_data(0, i_row)
var dev = out_user_data
var connector = dev.connector
for i in range($scrollout/tbl_out.get_rows_count()):
for i in $scrollout/tbl_out.get_rows_count():
var node = $scrollout/tbl_out.get_node2(1, i)
if connector == node.text:
on_row_pressed_out(i)
@@ -266,7 +279,7 @@ func init_tbl_out():
g_boards[board].out_devs[out_dev.id] = out_dev
out_dev.set_default_mode()
out_dev.board = board
for i in range(len(header_text)):
for i in len(header_text):
var cell = $scrollout/tbl_out.get_node2(i, row_index)
if i < len(params):
if i == 0:
@@ -304,7 +317,7 @@ func on_selected_changed_so(i_row: int):
var in_user_data = $scrl_out_set/tbl_out_set.get_node_user_data(0, i_row)
var dev = in_user_data
var connector = dev.connector
for i in range($scrollin/tbl_in.get_rows_count()):
for i in $scrollin/tbl_in.get_rows_count():
var node = $scrollin/tbl_in.get_node2(1, i)
if connector == node.text:
on_row_pressed_in(i)
@@ -423,7 +436,7 @@ func add_connection_dev(tbl, dev1, dev2, set_row, user_data):
var le_name: LineEdit = tbl.get_node2(node_index[0], node_index[1])
le_name.text = dev1.dev_name
disable_edit(tbl, len(set_row), node_index[1])
tbl.set_node_user_data(node_index[0], node_index[1], user_data)
tbl.set_node_user_data(node_index[0], node_index[1], user_data[0])
dev2.connect_devs[dev1.dev_name] = dev1
if dev1 is yemsdevs.OutDev:
active_board = g_boards[user_data[1]]
@@ -435,7 +448,7 @@ func add_connection_dev(tbl, dev1, dev2, set_row, user_data):
## [param num_col] - номер колонки,[br]
## [param i_row] - номер столбца.[br]
func disable_edit(tbl, num_col: int, i_row: int):
for col in range(num_col):
for col in num_col:
var node: LineEdit = tbl.get_node2(col, i_row)
node.editable = false
@@ -455,23 +468,38 @@ func on_data_ems_received(unit_ems):
for board in g_boards.values():
board.set_status(unit_ems.status)
if active_board.state_board == active_board.WAIT and active_board.state_cmd == active_board.WAIT:
if board.online and not board.read_done and board.ems_load:
if board.online and not board.read_done:
active_board = board
active_board.state_board = active_board.READ
active_board.start_rw_kems(true)
elif board.online and board.read_done and board.ems_load and board.need_flash_rd:
elif board.online and board.read_done and board.need_flash_rd:
active_board = board
active_board.state_board = active_board.READ_FLASH
#active_board.start_rw_kems(true)
for i_row in range($scrollin/tbl_in.get_rows_count()):
active_board.read_flash()
elif board.online and board.read_done and board.need_flash_wr:
active_board = board
active_board.state_board = active_board.WRITE_FLASH
active_board.write_flash()
elif board.online and board.read_done and board.need_write:
active_board = board
active_board.state_board = active_board.WRITE
active_board.start_rw_kems(false)
for i_row in $scrollin/tbl_in.get_rows_count():
var state_pic = ($scrollin/tbl_in.get_node2(4, i_row))
var dev = $scrollin/tbl_in.get_node_user_data(4, i_row)[0]
state_pic.set_frame(dev.state)
for i_row in range($scrollout/tbl_out.get_rows_count()):
for i_row in $scrollout/tbl_out.get_rows_count():
var state_pic = ($scrollout/tbl_out.get_node2(4, i_row))
var dev = $scrollout/tbl_out.get_node_user_data(4, i_row)[0]
state_pic.set_frame(dev.state)
if $scrl_in_set/tbl_in_set.get_rows_count():
var dev = $scrl_in_set/tbl_in_set.get_node_user_data(0, 0)
var state_pic = $scrl_in_set/tbl_in_set.get_node2(4, 0)
state_pic.set_frame(dev.state)
if $scrl_out_set/tbl_out_set.get_rows_count():
var dev = $scrl_out_set/tbl_out_set.get_node_user_data(0, 0)
var state_pic = $scrl_out_set/tbl_out_set.get_node2(4, 0)
state_pic.set_frame(dev.state)
## Обработчик выполнения команды
func on_command_done(unit_ems):
@@ -502,6 +530,18 @@ func on_upd_delay_offset(_board, dev):
var le_offset = tbl.get_node2(TABLE_ENTRY_COLUMNS[1], dev.tbl_row_id)
le_delay.set_text(str('%3.1f' % dev.delay))
le_offset.set_text(str('%3.1f' % dev.offset))
if $scrl_in_set/tbl_in_set.get_rows_count():
var sel_dev = $scrl_in_set/tbl_in_set.get_node_user_data(0, 0)
var l_delay = $scrl_in_set/tbl_in_set.get_node2(2, 0)
var l_offset = $scrl_in_set/tbl_in_set.get_node2(3, 0)
l_delay.set_text(str('%3.1f' % sel_dev.delay))
l_offset.set_text(str('%3.1f' % sel_dev.offset))
if $scrl_out_set/tbl_out_set.get_rows_count():
var sel_dev = $scrl_out_set/tbl_out_set.get_node_user_data(0, 0)
var l_delay = $scrl_out_set/tbl_out_set.get_node2(2, 0)
var l_offset = $scrl_out_set/tbl_out_set.get_node2(3, 0)
l_delay.set_text(str('%3.1f' % sel_dev.delay))
l_offset.set_text(str('%3.1f' % sel_dev.offset))
## Вызывается по обновлению информации о режиме выходов
@@ -517,6 +557,11 @@ func on_upd_o_state(board, dev):
var in_dev = board.in_devs[in_id]
in_dev.connect_devs[dev.dev_name] = dev
dev.connect_devs[in_dev.dev_name] = in_dev
if $scrl_out_set/tbl_out_set.get_rows_count():
var sel_dev = $scrl_out_set/tbl_out_set.get_node_user_data(0, 0)
var mode = $scrl_out_set/tbl_out_set.get_node2(5, 0)
mode.set_text(OUT_MODE[sel_dev.mode])
## Вызывается при выборе режима работы выхода
@@ -525,3 +570,83 @@ func on_switch_done(mode, dev):
if active_board.state_board == active_board.WAIT and board.online:
active_board = board
active_board.change_mode(dev.id, mode)
## Проверяет ниличие директории, если нет, создаёт
func check_dir():
var dir = DirAccess.open(yemsconsts.files_folder)
if dir:
check_files()
else:
DirAccess.make_dir_absolute(yemsconsts.files_folder)
check_files()
func check_files():
for file in yemsconsts.FILES_NAME:
var fd = FileAccess.open(yemsconsts.files_folder + file, FileAccess.READ)
if fd:
fd.close()
else:
fd = FileAccess.open(yemsconsts.files_folder + file, FileAccess.WRITE)
fd.close()
## Обработчик выбора строки с таблице
func on_pressed_file(i_row: int):
$scrl_files/tbl_files.clear_rows_selected()
var is_row_selected = $scrl_files/tbl_files.is_row_selected(i_row)
$scrl_files/tbl_files.set_row_selected(i_row, not is_row_selected)
func _on_btn_save_pressed() -> void:
var sel_row: Array = []
$scrl_files/tbl_files.get_selected_rows(sel_row)
if sel_row:
var fl_node = $scrl_files/tbl_files.get_node2(0, sel_row[0])
var fl_name = fl_node.text
var file = FileAccess.open(yemsconsts.files_folder + fl_name, FileAccess.WRITE)
var json_data: Dictionary = {}
fill_json_data(json_data)
var json = JSON.stringify(json_data)
file.store_string(json)
file.close()
for i_row in $scrl_files/tbl_files.get_rows_count():
$scrl_files/tbl_files.remove_row(0)
tools.fill_files_table($scrl_files/tbl_files, yemsconsts.files_folder, FILES_ROWS_TYPES)
$scrl_files/tbl_files.set_columns_alignments(yemsconsts.FILES_ROWS_ALIGNMENT)
$scrl_files/tbl_files.set_columns_min_size(yemsconsts.FILES_COLUMN_WIDTHS)
for i_row in $scrl_files/tbl_files.get_rows_count():
disable_edit($scrl_files/tbl_files, len(FILES_ROWS_TYPES), i_row)
func fill_json_data(json_data: Dictionary):
for board in g_boards.values():
var devs: Dictionary = {}
json_data[board.id_board] = devs
for in_dev in board.in_devs.values():
json_data[board.id_board][in_dev.id] = in_dev.ports_data
for out_dev in board.out_devs.values():
json_data[board.id_board][out_dev.id] = out_dev.ports_data
func _on_btn_load_pressed() -> void:
var sel_row: Array = []
$scrl_files/tbl_files.get_selected_rows(sel_row)
if sel_row:
var fl_node = $scrl_files/tbl_files.get_node2(0, sel_row[0])
var fl_name = fl_node.text
var file = FileAccess.open(yemsconsts.files_folder + fl_name, FileAccess.READ)
if file == null:
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()
for board in g_boards.values():
if not json_data.has(str(board.id_board)):
return
var data = json_data[str(board.id_board)]
board.btn_load(data)
board.need_write = true

View File

@@ -1,14 +1,35 @@
[gd_scene load_steps=9 format=3 uid="uid://dab6loryocc73"]
[gd_scene load_steps=19 format=3 uid="uid://dab6loryocc73"]
[ext_resource type="Script" path="res://scenes/эмс/эмс.gd" id="1_mk57x"]
[ext_resource type="PackedScene" uid="uid://da7w3vkhadfwe" path="res://scenes/button-flat/button-flat.tscn" id="2_eju8r"]
[ext_resource type="Texture2D" uid="uid://nm7cpjw6rs51" path="res://data/document-new-0.png" id="3_w7rqa"]
[ext_resource type="Texture2D" uid="uid://coqg6wsftvtxr" path="res://data/document-save-0.png" id="4_gyaoq"]
[ext_resource type="Texture2D" uid="uid://cywuevvpkxl7v" path="res://data/edit-copy-0.png" id="5_dxpqo"]
[ext_resource type="Texture2D" uid="uid://biyjygfnhhf7i" path="res://data/save.png" id="3_sc4po"]
[ext_resource type="Texture2D" uid="uid://t51eyh4hmc6p" path="res://data/load.png" id="4_mit0h"]
[ext_resource type="Texture2D" uid="uid://7h55yvh84cve" path="res://data/connect.png" id="6_axj2m"]
[ext_resource type="Texture2D" uid="uid://cjsr544qccftu" path="res://data/disconnect.png" id="7_yscbq"]
[ext_resource type="Script" path="res://table/table.gd" id="8_qcl30"]
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_sy7ny"]
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_udlbp"]
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_4amgo"]
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_fi0eb"]
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_5kkhp"]
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_ot108"]
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_63bsy"]
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_yuj6c"]
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_2q0t0"]
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_n2m1l"]
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_x5pts"]
[node name="ЭМС" type="Panel"]
offset_right = 1598.0
offset_bottom = 1201.0
@@ -40,34 +61,31 @@ offset_bottom = 129.0
strips_rotation = 10.0
text = "Записать"
[node name="btn_new" type="Button" parent="."]
layout_mode = 0
offset_left = 1453.0
offset_top = 960.0
offset_right = 1509.0
offset_bottom = 1016.0
focus_mode = 0
shortcut_feedback = false
shortcut_in_tooltip = false
icon = ExtResource("3_w7rqa")
[node name="btn_save" type="Button" parent="."]
layout_mode = 0
offset_left = 1453.0
offset_top = 1017.0
offset_right = 1509.0
offset_bottom = 1073.0
offset_top = 960.0
offset_right = 1973.0
offset_bottom = 1480.0
scale = Vector2(0.1, 0.1)
focus_mode = 0
icon = ExtResource("4_gyaoq")
theme_override_styles/focus = SubResource("StyleBoxEmpty_sy7ny")
theme_override_styles/pressed = SubResource("StyleBoxEmpty_udlbp")
theme_override_styles/normal = SubResource("StyleBoxEmpty_4amgo")
icon = ExtResource("3_sc4po")
[node name="btn_copy" type="Button" parent="."]
[node name="btn_load" type="Button" parent="."]
layout_mode = 0
offset_left = 1454.0
offset_top = 1074.0
offset_right = 1510.0
offset_bottom = 1130.0
offset_left = 1453.0
offset_top = 1015.0
offset_right = 1973.0
offset_bottom = 1535.0
scale = Vector2(0.1, 0.1)
focus_mode = 0
icon = ExtResource("5_dxpqo")
theme_override_styles/focus = SubResource("StyleBoxEmpty_fi0eb")
theme_override_styles/pressed = SubResource("StyleBoxEmpty_5kkhp")
theme_override_styles/normal = SubResource("StyleBoxEmpty_4amgo")
icon = ExtResource("4_mit0h")
[node name="btn_connect" type="Button" parent="."]
layout_mode = 0
@@ -77,6 +95,9 @@ offset_right = 683.0
offset_bottom = 111.0
focus_mode = 0
theme_override_colors/icon_normal_color = Color(1, 1, 1, 1)
theme_override_styles/focus = SubResource("StyleBoxEmpty_ot108")
theme_override_styles/pressed = SubResource("StyleBoxEmpty_63bsy")
theme_override_styles/normal = SubResource("StyleBoxEmpty_yuj6c")
icon = ExtResource("6_axj2m")
[node name="btn_disconnect" type="Button" parent="."]
@@ -87,6 +108,9 @@ offset_right = 770.0
offset_bottom = 815.0
focus_mode = 0
theme_override_colors/icon_normal_color = Color(1, 1, 1, 1)
theme_override_styles/focus = SubResource("StyleBoxEmpty_2q0t0")
theme_override_styles/pressed = SubResource("StyleBoxEmpty_n2m1l")
theme_override_styles/normal = SubResource("StyleBoxEmpty_x5pts")
icon = ExtResource("7_yscbq")
[node name="scrollin" type="ScrollContainer" parent="."]
@@ -143,3 +167,6 @@ offset_bottom = 924.0
[node name="tbl_out_set" type="GridContainer" parent="scrl_out_set"]
layout_mode = 2
script = ExtResource("8_qcl30")
[connection signal="pressed" from="btn_save" to="." method="_on_btn_save_pressed"]
[connection signal="pressed" from="btn_load" to="." method="_on_btn_load_pressed"]

View File

@@ -25,8 +25,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

@@ -4,23 +4,23 @@ class_name rep_settings extends Node
## Параметры.
@export var UnitProfiles: = { \
# Название | Протокол | Адрес | Порт | Широковещательное | Привязывать к адресу | Комментарий
'уарэп-яу07-частный': ['yau07rx', '127.0.0.2', [50002], false, true, 'IP-адрес на котором принимают частные сообщения от ЯУ-07'],
'уарэп-яу07-общий': ['yau07rx', '*', [50000], true, true, 'IP-адрес на котором принимают широковещательные сообщения от ЯУ-07'],
'уарэп-капсрпб': ['json-capsrpb', '127.0.0.1', [42023, 42022], false, true, 'IP-адрес на котором принимают сообщения от КАПС РПБ'],
'уарэп-эмс': ['yau07tx', '127.0.0.52', [50052], false, false, 'IP-адрес ЯУ-07 прибора УФ'],
'уарэп-яу07-2в': ['yau07tx', '127.0.0.34', [50034], false, false, 'IP-адрес ЯУ-07 прибора ПРД-В'],
'уарэп-яу07-2н': ['yau07tx', '127.0.0.33', [50033], false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'],
'уарэп-яу07-2к': ['yau07tx', '127.0.0.35', [50035], false, false, 'IP-адрес ЯУ-07 прибора ПРД-К'],
'уарэп-яу07-4в': ['yau07tx', '127.0.0.66', [50066], false, false, 'IP-адрес ЯУ-07 прибора ПРД-В'],
'уарэп-яу07-4н': ['yau07tx', '127.0.0.65', [50065], false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'],
'уарэп-яу07-4к': ['yau07tx', '127.0.0.67', [50067], false, false, 'IP-адрес ЯУ-07 прибора ПРД-К'],
'уарэп-яу07-1в': ['yau07tx', '127.0.0.18', [50018], false, false, 'IP-адрес ЯУ-07 прибора ПРД-В'],
'уарэп-яу07-1н': ['yau07tx', '127.0.0.17', [50017], false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'],
'уарэп-яу07-1к': ['yau07tx', '127.0.0.19', [50019], false, false, 'IP-адрес ЯУ-07 прибора ПРД-К'],
'уарэп-яу07-3в': ['yau07tx', '127.0.0.50', [50050], false, false, 'IP-адрес ЯУ-07 прибора ПРД-В'],
'уарэп-яу07-3н': ['yau07tx', '127.0.0.49', [50049], false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'],
'уарэп-яу07-3к': ['yau07tx', '127.0.0.51', [50051], false, false, '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 прибора УФ'],
'уарэп-яу07-2в': ['yau07tx', '10.1.1.34', [50034], false, false, 'IP-адрес ЯУ-07 прибора ПРД-В'],
'уарэп-яу07-2н': ['yau07tx', '10.1.1.33', [50033], false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'],
'уарэп-яу07-2к': ['yau07tx', '10.1.1.35', [50035], false, false, 'IP-адрес ЯУ-07 прибора ПРД-К'],
'уарэп-яу07-4в': ['yau07tx', '10.1.1.66', [50066], false, false, 'IP-адрес ЯУ-07 прибора ПРД-В'],
'уарэп-яу07-4н': ['yau07tx', '10.1.1.65', [50065], false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'],
'уарэп-яу07-4к': ['yau07tx', '10.1.1.67', [50067], false, false, 'IP-адрес ЯУ-07 прибора ПРД-К'],
'уарэп-яу07-1в': ['yau07tx', '10.1.1.18', [50018], false, false, 'IP-адрес ЯУ-07 прибора ПРД-В'],
'уарэп-яу07-1н': ['yau07tx', '10.1.1.17', [50017], false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'],
'уарэп-яу07-1к': ['yau07tx', '10.1.1.19', [50019], false, false, 'IP-адрес ЯУ-07 прибора ПРД-К'],
'уарэп-яу07-3в': ['yau07tx', '10.1.1.50', [50050], false, false, 'IP-адрес ЯУ-07 прибора ПРД-В'],
'уарэп-яу07-3н': ['yau07tx', '10.1.1.49', [50049], false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'],
'уарэп-яу07-3к': ['yau07tx', '10.1.1.51', [50051], false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'],
# Название: [ Протокол, Адрес, Порт получения, Комментарий ]
'уарэп-5п28': [ '5p28', '127.0.0.1', [50000], 'IP-адрес комплекса 5П-28'],

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.
@@ -32,6 +33,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() ## Поле "состояние прибора"
@@ -63,7 +65,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
@@ -79,7 +84,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)
@@ -94,6 +100,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)
@@ -104,6 +117,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:
@@ -131,6 +145,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:
@@ -154,6 +169,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
@@ -141,18 +142,11 @@ LOAD_KEMS, WRITE_FLASH_END}
else:
state_cmd = WAIT
elif (state_cmd == READ_FLASH) and (unit_ems.cmd_code_rx == 51):
pass
#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 == 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
#load_flash()
#emit_signal('write_msg', 'Произведена запись в ПЗУ ячейки ЯУ-07')
@@ -182,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):
@@ -211,6 +206,62 @@ LOAD_KEMS, WRITE_FLASH_END}
state_cmd = WR_DEV_NUM_R
on_wr_device(cur_dev_num)
func on_btn_flash_read():
unit_ems.send_flash(unit_ems.CmdCode.READ_FLASH,[], yemsconsts.NUM_BYTE_FROM_FLASH, id_board)
func read_flash():
unit_ems.send_flash(unit_ems.CmdCode.READ_FLASH_MP550, [], yemsconsts.NUM_BYTE_FROM_FLASH, id_board)
state_cmd = READ_FLASH
func on_read_flash():
need_flash_rd = false
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']],