diff --git a/scenes/эмс/эмс.gd b/scenes/эмс/эмс.gd index a664ff45..99e64d31 100644 --- a/scenes/эмс/эмс.gd +++ b/scenes/эмс/эмс.gd @@ -44,11 +44,11 @@ func init_boards(): $btn_connect.set_position(Vector2(posx + 590,posy - 25)) $btn_disconnect.set_position(Vector2(posx + 587,posy + 675)) - g_boards['КЭМС-Б'] = yemsboards.EmsBoard.new(0, 0x130, yemsconsts.INPUT_KEMS, yemsconsts.OUTPUT_KEMS, unit_ems) - g_boards['ЭМС-Б1'] = yemsboards.EmsBoard.new(1, 0x110, yemsconsts.INPUT_EMS1, yemsconsts.OUTPUT_EMS1, unit_ems) - g_boards['ЭМС-Б2'] = yemsboards.EmsBoard.new(2, 0x120, yemsconsts.INPUT_EMS2, yemsconsts.OUTPUT_EMS2, unit_ems) + g_boards[yemsconsts.KEMS_BOARD_NAME] = yemsboards.EmsBoard.new(0, 0x130, yemsconsts.INPUT_KEMS, yemsconsts.OUTPUT_KEMS, unit_ems) + g_boards[yemsconsts.EMS1_BOARD_NAME] = yemsboards.EmsBoard.new(1, 0x110, yemsconsts.INPUT_EMS1, yemsconsts.OUTPUT_EMS1, unit_ems) + g_boards[yemsconsts.EMS2_BOARD_NAME] = yemsboards.EmsBoard.new(2, 0x120, yemsconsts.INPUT_EMS2, yemsconsts.OUTPUT_EMS2, unit_ems) - active_board = g_boards['КЭМС-Б'] + active_board = g_boards[yemsconsts.KEMS_BOARD_NAME] init_tbl_in() $scrollin/tbl_in.pin_header($scrollin, self) @@ -61,6 +61,10 @@ func init_boards(): unit_ems.connect('data_received', Callable(self, 'on_data_ems_received')) unit_ems.connect('command_done', Callable(self, 'on_command_done')) + unit_ems.connect('line_changed', Callable(self, 'on_line_changed')) + for board in g_boards.values(): + board.connect('upd_delay_offset', Callable(self, 'on_upd_delay_offset')) + board.connect('upd_o_state', Callable(self, 'on_upd_o_state')) $btn_connect.connect('pressed', Callable(self, 'on_btn_connect')) $btn_disconnect.connect('pressed', Callable(self, 'on_btn_disconnect')) $btn_flash_read.button_connect('pressed', Callable(self, 'on_btn_flash_read').bind($btn_flash_read)) @@ -137,7 +141,15 @@ func init_tbl_in(): for i in range(len(row_type)): if i < len(params): var node = $scrollin/tbl_in.get_node2(i, row_index) - node.text = params[i] + if i == 0: + node.text = board + ': ' + params[i] + elif i in TABLE_ENTRY_COLUMNS: + if board == yemsconsts.EMS1_BOARD_NAME or board == yemsconsts.EMS2_BOARD_NAME: + node.text = '' + else: + node.text = '%3.1f' % float(params[i]) + else: + node.text = params[i] node.editable = false $scrollin/tbl_in.set_node_user_data(i, row_index, [in_dev, board]) $scrollin/tbl_in.set_columns_alignments(yams_alligment_in) @@ -221,7 +233,15 @@ func init_tbl_out(): for i in range(len(header_text)): var cell = $scrollout/tbl_out.get_node2(i, row_index) if i < len(params): - cell.text = params[i] + if i == 0: + cell.text = board + ': ' + params[i] + elif i in TABLE_ENTRY_COLUMNS: + if board == yemsconsts.EMS1_BOARD_NAME or board == yemsconsts.EMS2_BOARD_NAME: + cell.text = '' + else: + cell.text = '%3.1f' % float(params[i]) + else: + cell.text = params[i] cell.editable = false $scrollout/tbl_out.set_node_user_data(i, row_index, [out_dev, board]) if i in COLUMN_OPTS_BTN: @@ -298,14 +318,22 @@ func set_dev(tbl, dev, row_type, row_type_conn, lbl_text, row_size): tbl.set_columns_min_size(row_size) var le_name: LineEdit = tbl.get_node2(0, 0) le_name.editable = false - le_name.text = dev.dev_name + le_name.text = dev.board + ': ' + dev.dev_name var connector: LineEdit = tbl.get_node2(1, 0) connector.editable = false connector.text = dev.connector var delay: LineEdit = tbl.get_node2(2, 0) - delay.text = '%4.2f'%dev.delay + delay.text = '%3.1f'%dev.delay var offset: LineEdit = tbl.get_node2(3, 0) - offset.text = '%4.2f'%dev.offset + offset.text = '%3.1f'%dev.offset + if dev.board == yemsconsts.EMS1_BOARD_NAME or dev.board == yemsconsts.EMS2_BOARD_NAME: + delay.text = '' + delay.editable = false + offset.text = '' + offset.editable = false + else: + delay.editable = true + offset.editable = true var state = tbl.get_node2(4, 0) state.set_frame(dev.state) tbl.add_row(row_type_conn) @@ -336,27 +364,32 @@ func on_btn_connect(): if len(in_row_index) and len(out_row_index): var in_user_data = $scrollin/tbl_in.get_node_user_data(0, in_row_index[0]) var out_user_data = $scrollout/tbl_out.get_node_user_data(0, out_row_index[0]) + if in_user_data[1] != out_user_data[1] or not active_board.read_done: + return var in_dev = in_user_data[0] var out_dev = out_user_data[0] add_connection_dev($scrl_out_set/tbl_out_set, in_dev, out_dev, OUT_SET_ROW, in_user_data) add_connection_dev($scrl_in_set/tbl_in_set, out_dev, in_dev, IN_SET_ROW, out_user_data) -## Образовывает связь между выбранным входом и выходом.[br] +## Образует связь между выбранным входом и выходом.[br] ## [param tbl] - таблица,[br] ## [param dev1] - устройство1,[br] ## [param dev2] - устройство 2,[br] ## [param set_row] - массив с пустыми LineEdit,[br] ## [param user_data] - пользовательские данные устройства1.[br] func add_connection_dev(tbl, dev1, dev2, set_row, user_data): - if not dev1.connector in dev2.connect_devs: + if not dev1.dev_name in dev2.connect_devs: tbl.add_row(set_row) var node_index: Array = [0, tbl.get_rows_count() -1] var le_name: LineEdit = tbl.get_node2(node_index[0], node_index[1]) - le_name.text = dev1.connector + 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) - dev2.connect_devs[dev1.connector] = user_data + dev2.connect_devs[dev1.dev_name] = user_data + if dev1 is yemsdevs.OutDev: + active_board = g_boards[user_data[1]] + active_board.set_connection(dev1.id, dev2.id, true) ## Отключает возможность редактирования LineEdit в таблице.[br] @@ -376,11 +409,12 @@ func on_row_pressed(i_row: int, tbl): tbl.set_row_selected(i_row, not is_row_selected) -func on_data_ems_received(unit): +## Обработчик получения пакета от ячейки ЯУ-07Б +func on_data_ems_received(unit_ems): for board in g_boards.values(): - board.set_status(unit.status) + board.set_status(unit_ems.status) if active_board.state_read == active_board.WAIT: - if board.online and not board.read_done: + if board.online and not board.read_done and board.ems_load: active_board = board active_board.state_read = active_board.READ active_board.start_rw_kems(true) @@ -394,5 +428,37 @@ func on_data_ems_received(unit): state_pic.set_frame(dev.state) +## Обработчик выполнения команды func on_command_done(unit_ems): active_board.on_command_done(unit_ems) + + +## Вызывается по изменению статуса ячейки ЯУ-07Б +func on_line_changed(unit_ems): + if unit_ems.online: + $lbl_online.text = 'Ячейка ЯУ-07 на связи' + $lbl_online.modulate = Color.GREEN + else: + $lbl_online.text = 'Ячейка ЯУ-07 не на связи' + $lbl_online.modulate = Color.RED + for board in g_boards.values(): + board.state_read = board.WAIT + board.read_done = false + + +## Вызывается по обновлению информации от ячейки времянках входов/выходов +func on_upd_delay_offset(_board, dev): + if dev.board == yemsconsts.EMS1_BOARD_NAME or dev.board == yemsconsts.EMS2_BOARD_NAME: + return + var tbl = $scrollin/tbl_in + if dev is yemsdevs.OutDev: + tbl = $scrollout/tbl_out + var le_delay = tbl.get_node2(2, dev.tbl_row_id) + var le_offset = tbl.get_node2(3, dev.tbl_row_id) + le_delay.set_text(str('%3.1f' % dev.delay)) + le_offset.set_text(str('%3.1f' % dev.offset)) + + +## Вызывается по обновлению информации о режиме выходов +func on_upd_o_state(board, dev): + pass diff --git a/scenes/эмс/эмс.tscn b/scenes/эмс/эмс.tscn index 1c570bfa..4d889e63 100644 --- a/scenes/эмс/эмс.tscn +++ b/scenes/эмс/эмс.tscn @@ -20,7 +20,6 @@ offset_left = 30.0 offset_top = 4.0 offset_right = 166.0 offset_bottom = 30.0 -theme_override_colors/font_color = Color(0, 0.647059, 0.184314, 1) text = "Ячейка на связи" [node name="btn_flash_read" parent="." instance=ExtResource("2_eju8r")] diff --git a/scripts/tools.gd b/scripts/tools.gd index 3acb289e..272e8724 100644 --- a/scripts/tools.gd +++ b/scripts/tools.gd @@ -134,15 +134,12 @@ func set_wordi(buf: PackedByteArray, index: int, val: int) -> void: buf[index + 1] = (val >> 8) & 0xff +## Устанавливает бит в соответствии с маской +## [param bits] - Прежние значения бит +## [param index] - Индекс нового значения бита +## [param val] - Новое значение бита +## [param mask] - Маска изменяемых бит func set_bit(bits, index, val, mask = 0xfffffffffffffff): - """ - :param bits: прежние значения - :param index: индекс бита - :param val: новое значение бита - :param mask: - :return: - мастер - """ bits &= mask if val: bits |= 1 << index @@ -151,12 +148,9 @@ func set_bit(bits, index, val, mask = 0xfffffffffffffff): return (bits & mask) +## Устанавливает биты в соответствии с маской +## [param v] - Прежние значения бит +## [param a] - Новые значения бит +## [param m] - Маска изменяемых бит func set_bits(v, a, m): - """ - Устанавливает биты в соответствии с маской - :param v: Прежние значения бит - :param a: Новые значения бит - :param m: Маска изменяемых бит - :return: Изменённые значения бит - """ - return v & a & (~m) | (~v) & a & m | v & a & m | v & (~a) & (~m) + return (~m) & v | a & m diff --git a/scripts/yems-boards.gd b/scripts/yems-boards.gd index 1219386c..30568051 100644 --- a/scripts/yems-boards.gd +++ b/scripts/yems-boards.gd @@ -75,7 +75,6 @@ LOAD_KEMS, WRITE_FLASH_END} # Отправка команды на запись или чтение порта func on_wr_device(dev_number): - print_debug([id_board, dev_number]) if (state == WR_DEV_NUM_W) or (state == WR_DEV_NUM_R): unit_ems.send_isa(unit_ems.CmdCode.WRITE_ISA, [base_addr_isa + 2, dev_number]) elif state == WRITE: @@ -183,3 +182,10 @@ LOAD_KEMS, WRITE_FLASH_END} else: state = WR_DEV_NUM_W on_wr_device(cur_dev_num) + + func set_connection(o_dev, i_dev, val): + cur_dev_num = o_dev + if check_dev_number(): + cur_dev.set_dot(i_dev, val) + state = WR_DEV_NUM_W + on_wr_device(cur_dev_num) diff --git a/scripts/yems-consts.gd b/scripts/yems-consts.gd index 9c88b529..23b3c6ed 100644 --- a/scripts/yems-consts.gd +++ b/scripts/yems-consts.gd @@ -7,6 +7,10 @@ const STATUS_OFFSET = { # Смещение статуса, ключ 1: 26, 2: 52 } +const KEMS_BOARD_NAME = 'КЭМС-Б' +const EMS1_BOARD_NAME = 'ЭМС-Б1' +const EMS2_BOARD_NAME = 'ЭМС-Б2' + ## Таблица с данными для входов, первое значение - индекс устройства в ячейке КЭМС. const INPUT_KEMS = [ [1 ,['УИЗП №1', 'Х7', '0.00', '0.00']], diff --git a/scripts/yems-devs.gd b/scripts/yems-devs.gd index 99f33783..bf1db051 100644 --- a/scripts/yems-devs.gd +++ b/scripts/yems-devs.gd @@ -10,7 +10,7 @@ class InDev: var state: int ## Состояние входа. var freq: int ## Предполагаемая частота на которой работает комплекс. var ports_data: Dictionary ## Словарь состояния портов устройства. - var tbl_row_id: int ## Индекс устройства в таблице выходов. + var tbl_row_id: int ## Индекс устройства в таблице. var out_dots: Array ## Список выходных устройств в порядке, как в таблице и точки матрицы. var connect_devs: Dictionary ## Список присоединённых устройств. var board: String ## Плата в которой находится устройство. @@ -64,9 +64,9 @@ class OutDev extends InDev: for i in range(yemsconsts.NUM_INPUT): btns_state[i+1] = bool((data >> i) & 1) - func set_dot(i_dev): + func set_dot(i_dev, val): if btns_state.has(i_dev): - btns_state[i_dev] = not btns_state[i_dev] + btns_state[i_dev] = val var data = 0 for i in range(yemsconsts.NUM_INPUT): data = data | (int(btns_state[i+1]) << i)