From 37f39a50e0efba2859150dbf0e597901a1d2cc3b Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Tue, 19 Nov 2024 16:17:31 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0.=20=D0=AD=D0=9C=D0=A1,=20=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=B0=20=D1=81=20=D1=84=D0=B0=D0=B9=D0=BB=D0=B0=D0=BC?= =?UTF-8?q?=D0=B8=20=D0=B8=20flash.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/document-new-0.png | Bin 1961 -> 0 bytes data/document-save-0.png | Bin 4079 -> 0 bytes data/document-save-0.png.import | 34 ----- data/edit-copy-0.png | Bin 1967 -> 0 bytes data/load.png | Bin 0 -> 13316 bytes ...edit-copy-0.png.import => load.png.import} | 8 +- data/save.png | Bin 0 -> 11675 bytes ...ument-new-0.png.import => save.png.import} | 8 +- project.godot | 1 + scenes/эмс/эмс.gd | 142 ++++++++++++++++-- scenes/эмс/эмс.tscn | 77 +++++++--- scripts/network.gd | 4 +- scripts/settings.gd | 2 +- scripts/tools.gd | 29 ++++ scripts/yau07.gd | 28 +++- scripts/yems-boards.gd | 77 ++++++++-- scripts/yems-consts.gd | 12 ++ 17 files changed, 321 insertions(+), 101 deletions(-) delete mode 100644 data/document-new-0.png delete mode 100644 data/document-save-0.png delete mode 100644 data/document-save-0.png.import delete mode 100644 data/edit-copy-0.png create mode 100644 data/load.png rename data/{edit-copy-0.png.import => load.png.import} (68%) create mode 100644 data/save.png rename data/{document-new-0.png.import => save.png.import} (68%) diff --git a/data/document-new-0.png b/data/document-new-0.png deleted file mode 100644 index c95c45a6a636ec513ea3da615a93babf57f846dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1961 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 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 3127b1e028e868b66fe5aed098b2c4240fe8b68f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1967 zcmV;g2T=HlP)TQj?^*a;R1&xr@UG={AzVFqmswMzXsZ=Nc z9e{>UqqzWhwOSRVQmJSF@&FdS&+j`30iX@wC4jc>d43VVF94htLd1m-^#5UrrfIIG zX>!cRECAmC_zQq-KV$87J8}8)W#hty3sg#Zpx!5hpja$+Yqi?5`T6^PoF;h z@AK!+|M=p?i*Lv2Lyz*R0?=x;LIDs$P_NgKOeS&a)Tv1+mjduJ&NnIcoB$-V9XnA@0Ys<1efAHYJUkA}@ zAOIl*T-QY+k-);jLewM#%d-4?rxCpn0-C1b!-o$zcI?=~wQJXYZ&?<5{P^)buWT5P zLQ+b&t_#jNdc9ucBxP9^D5X9C(=^d&G$sOL+cvhgws83HVVpQ|;s-Zw-1y2gO}4VK z@~5#Qpt6u@nrJqgkpP;_CW^&kALZ2ZW0n*s7K`X~IuJsD5Q38@PtM=GdGm`~w{DpL z{x)cO4yBMX#I|i%mId3k`>r5;R0O1ya2yAm^RX_*7!1Sk`&7T5IdkT->({UU?)L55 zmq!Mmj8R@xo$I>ZcQMAGX<8ou^^5{D>ecCV@aokobUGby&im}Sc=6(qt5>i7_R*t9 zN5@K|N&~iShjLnZNg3g~E;LO;Hk+MD15!$CZf@e)vu8dC)!(H{m(H4|`Ri7zwNoe* z1_MwYRbJI~J(Sa4E#n(6gaD-!Gcz+2XQQ)c&!W+2pkA+IZEX!38yhf96QxoK3kwV9 zR#sLv&YwTuH)%$S*l`>fhJm@cxzIX>QtFFN0p^^e)9Fl=QuFz|KSny8M!VgHrfFb| zk;TQu`DU}(E0s!vDWqx}$8lhqW@Ih1v$KO(Ear>ewr#XpEx4`=LdZlkQqIU^GN6>A zR4RcnhS}L!bh};s;lqbys0M;*^zGZXku&l3_BIY3I@Bj%Ldehpa8Q9qDTS00#bOb; zTn?#J3aL~I@pv4sU%&pS?|~Xn(|i~JN~u3sFzu?$G)>cW9r=77x~}_LBZP$7F)#w0 z^FAp|CdO-rRxh{a-{lzueH z4b*@T0=-@j?RGoTQ=Lu+Gcz-N095p*+V~LymSrKA%k^nWO`0Q>(?Kv%6jG52PJGj3 zA?5KzBH@cUxYig+17VqHSngI{S5@VH?Ii`rkJ42rg;e%YwMbM6oXKQ9qFuM!-M1Z$ zL?QvhF#P@$Ge%yK4MMKcXE1BowjHUNNt$Vz$Y!%(jEzU3U~X4gB}~Nc-n~OEm-Dkj zSeBTk1r3j)bmXF5c{Hk=CWQ1wD!3+?ltPR#f0IDbR5>Q9BG3ob`9Wi&#HQwp;H(_R z)lt{Q+uPfHW2Dn*Fvk28Jv5Cf5J4@3Ay*L!3RrnjCX=CIJHdM=vaPKxGCMnKaL%a$K1~^+ zC~Fu-ACO>yIS@cTpLf^S*T1dRYX9EY*jTqL%N|rk0QhWqd3l+0KBuCUOeXhD13_&? zEtK@Vp<7y7YA-D<{T;x=YPCA-=;v5G9{-gPVqaG=VTML+GV9Zx7L8N*O99<6x@Y`0c8~Aj@qg@zXPQO)I78vPR}HoSxH*btp3R&9fcM7Ar}VmwfcLu1{{Ym|z>-_J<3s=e002ovPDHLkV1j7I Bz4!nC diff --git a/data/load.png b/data/load.png new file mode 100644 index 0000000000000000000000000000000000000000..d1f8e71b475a442ae7c1f1bd33bce305b75d4a82 GIT binary patch literal 13316 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%0DoS#0=(i^lPvnjKro6b%} zo8*&MwVAVhgLr1)ogyZSDX7fg&ch@5gGpl7bY87&4>A(i_JVP_HMSeKA{PYZG&O(T z{PohzPzA+)dnILZ~ ztfIV8(GLd{xDv^Dq@Sycn-|VcNtmV=2cF?+v@nt;LUvXXHq$$bR3mv3ky7GP;uw^M zpQ8^}Sa~B-(bLurXQ+Poy9zK;5_TYy-EnBNudlDTucSE1(;h7$FE5YAV9{7C3P_;5 z{N2cSKa`u72&`gVhdR-V;OXd2b|kqWVV!szk~djNSQxA$zbgl;1Pwnh`P~3Krm6QL z+oH9>KnnN+1khLvMh=C+qOkJlU-yGmJ-r{h-MqfD2>3+%;oZ>^;uy56>u)=}$QnLB z?fugoUdG^M4{b>FB6)ifh#EdbH?qjDM%`V!y?(Xn?L~yAXt-T$?a%-e&GN5%G`01P z{@4T4Xz%FiPTK)X|0-!q_#x-+?dd|3u_d61E<{%V#0zMa_)VVdX!kQfzxe~N`~whR z?uY*0r2pWHhK0r}PMt*XhK*{gD+$ARakeCaqb-j1C@Dq6VC1DGP(&h879}Mmg+
G^0Fu*-o_RMpvj=*@kBY4 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 Df2YcS literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..cd056a17500d6cda54886dbaf8921b9b3ba93c62 GIT binary patch literal 11675 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 literal 0 HcmV?d00001 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']],