diff --git a/data/document-new-0.png b/data/document-new-0.png deleted file mode 100644 index c95c45a6..00000000 Binary files a/data/document-new-0.png and /dev/null differ diff --git a/data/document-save-0.png b/data/document-save-0.png deleted file mode 100644 index fb8dae0e..00000000 Binary files a/data/document-save-0.png and /dev/null differ diff --git a/data/document-save-0.png.import b/data/document-save-0.png.import deleted file mode 100644 index 6c1da76d..00000000 --- a/data/document-save-0.png.import +++ /dev/null @@ -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 diff --git a/data/edit-copy-0.png b/data/edit-copy-0.png deleted file mode 100644 index 3127b1e0..00000000 Binary files a/data/edit-copy-0.png and /dev/null differ diff --git a/data/load.png b/data/load.png new file mode 100644 index 00000000..d1f8e71b Binary files /dev/null and b/data/load.png differ diff --git a/data/edit-copy-0.png.import b/data/load.png.import similarity index 68% rename from data/edit-copy-0.png.import rename to data/load.png.import index e78a7908..fd7ae69b 100644 --- a/data/edit-copy-0.png.import +++ b/data/load.png.import @@ -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] diff --git a/data/save.png b/data/save.png new file mode 100644 index 00000000..cd056a17 Binary files /dev/null and b/data/save.png differ diff --git a/data/document-new-0.png.import b/data/save.png.import similarity index 68% rename from data/document-new-0.png.import rename to data/save.png.import index 7abe794e..c6d0eadf 100644 --- a/data/document-new-0.png.import +++ b/data/save.png.import @@ -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] diff --git a/project.godot b/project.godot index eb35db35..4530d817 100644 --- a/project.godot +++ b/project.godot @@ -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=1.0 +config/kems_files_path="user://kems/" [autoload] diff --git a/scenes/эмс/эмс.gd b/scenes/эмс/эмс.gd index 782a042f..32f33642 100644 --- a/scenes/эмс/эмс.gd +++ b/scenes/эмс/эмс.gd @@ -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 ## Активная плата ЭМС @@ -121,13 +123,22 @@ func on_btn_flash_read(btn): 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) ## Инициализация таблиц входов. @@ -148,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: @@ -238,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) @@ -268,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: @@ -306,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) @@ -425,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]] @@ -437,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 @@ -462,19 +473,33 @@ func on_data_ems_received(unit_ems): active_board.state_board = active_board.READ active_board.start_rw_kems(true) elif board.online and board.read_done and board.need_flash_rd: - print_debug() active_board = board active_board.state_board = active_board.READ_FLASH active_board.read_flash() - for i_row in range($scrollin/tbl_in.get_rows_count()): + 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): @@ -505,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)) ## Вызывается по обновлению информации о режиме выходов @@ -520,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]) + ## Вызывается при выборе режима работы выхода @@ -528,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 diff --git a/scenes/эмс/эмс.tscn b/scenes/эмс/эмс.tscn index 4d889e63..1eb1b15f 100644 --- a/scenes/эмс/эмс.tscn +++ b/scenes/эмс/эмс.tscn @@ -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"] diff --git a/scripts/network.gd b/scripts/network.gd index 19de36b9..b407e888 100644 --- a/scripts/network.gd +++ b/scripts/network.gd @@ -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: diff --git a/scripts/settings.gd b/scripts/settings.gd index 08525b8f..95b2b7f8 100644 --- a/scripts/settings.gd +++ b/scripts/settings.gd @@ -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 прибора УФ'], diff --git a/scripts/tools.gd b/scripts/tools.gd index 272e8724..571716d6 100644 --- a/scripts/tools.gd +++ b/scripts/tools.gd @@ -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() diff --git a/scripts/yau07.gd b/scripts/yau07.gd index b64cc949..57ff5ee6 100644 --- a/scripts/yau07.gd +++ b/scripts/yau07.gd @@ -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 - Принятые данные. diff --git a/scripts/yems-boards.gd b/scripts/yems-boards.gd index d7ac8e3e..803a7e67 100644 --- a/scripts/yems-boards.gd +++ b/scripts/yems-boards.gd @@ -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 diff --git a/scripts/yems-consts.gd b/scripts/yems-consts.gd index 3d201366..9ae9d520 100644 --- a/scripts/yems-consts.gd +++ b/scripts/yems-consts.gd @@ -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']],