diff --git a/scenes/pribor-prd-v/pribor_prd_v.gd b/scenes/pribor-prd-v/pribor_prd_v.gd index 01f9134a..fbc39a50 100644 --- a/scenes/pribor-prd-v/pribor_prd_v.gd +++ b/scenes/pribor-prd-v/pribor_prd_v.gd @@ -11,12 +11,16 @@ const POWER_UKP_1: int = 31 const POWER_UKP_2: int = 63 const bit_dkm_3: int = 3 const bit_dkm_4: int = 4 +const ADDR_UG_LITERA_1: int = 0x106 +const ADDR_UG_LITERA_2: int = 0x108 var count_packet_1:int = 0 var power_array_1: Array = [] var count_packet_2:int = 0 var power_array_2: Array = [] var currecnt_unit: String +var ug_work_1: int +var ug_work_2: int enum STATE_VAL { NONE = 0, @@ -43,13 +47,25 @@ func _ready() -> void: control_timer.start() +func _enter_tree() -> void: + signaller.connect('режим_работа', Callable(self, 'on_mode_changed').bind(false)) + on_ug_setting() + + +func _exit_tree() -> void: + var unit_key = settings.get_unit_key(get_meta('unit_name')[0]) + var unit_prd = network.units[unit_key] + var prd_module = prd.prd_dict[unit_prd.name] + prd_module.cmd_array.append([unit_prd.CmdCode.WRITE_ISA, [ADDR_UG_LITERA_1, ug_work_1, ADDR_UG_LITERA_2, ug_work_2]]) + + func set_default_state() -> void: $kasseta_P_1/ref_A19.state = STATE_VAL.NONE $kasseta_P_1/ref_A20.state = STATE_VAL.NONE $kasseta_P_1/ref_A21.state = STATE_VAL.NONE $maa2000_A23.state = STATE_VAL.NONE $maa2000_A22.state = STATE_VAL.NONE - + for group in get_tree().get_nodes_in_group('power_amplifier'): group.state = STATE_VAL.NONE @@ -231,10 +247,9 @@ func _on_control_fs(mode: bool) -> void: func on_stop_control() -> void: _on_control_fs(false) - print('stop timer') -func on_fs_update_state(packet_type_7: Dictionary): +func on_fs_update_state(packet_type_7: Dictionary) -> void: var parts = currecnt_unit.split('-') var last_part = parts[-1] # Прибор for fs in packet_type_7: @@ -246,7 +261,7 @@ func on_fs_update_state(packet_type_7: Dictionary): $kasseta_FS_VD/ref_A3.state = STATE_VAL.GOOD if packet_type_7[fs].isg == 1 else STATE_VAL.ERROR if packet_type_7[fs].isg == 0 else STATE_VAL.NONE if fs == 15 and last_part == '2в': $kasseta_FS_VD/ref_A3.state = STATE_VAL.GOOD if packet_type_7[fs].isg == 1 else STATE_VAL.ERROR if packet_type_7[fs].isg == 0 else STATE_VAL.NONE - + if fs == 16 and last_part == '1в': $kasseta_FS_VD/ref_A4.state = STATE_VAL.GOOD if packet_type_7[fs].isg == 1 else STATE_VAL.ERROR if packet_type_7[fs].isg == 0 else STATE_VAL.NONE if fs == 17 and last_part == '4в': @@ -255,4 +270,25 @@ func on_fs_update_state(packet_type_7: Dictionary): $kasseta_FS_VD/ref_A4.state = STATE_VAL.GOOD if packet_type_7[fs].isg == 1 else STATE_VAL.ERROR if packet_type_7[fs].isg == 0 else STATE_VAL.NONE if fs == 19 and last_part == '2в': $kasseta_FS_VD/ref_A4.state = STATE_VAL.GOOD if packet_type_7[fs].isg == 1 else STATE_VAL.ERROR if packet_type_7[fs].isg == 0 else STATE_VAL.NONE - + + +func on_ug_setting() -> void: + var unit_key = settings.get_unit_key(get_meta('unit_name')[0]) + var unit_prd = network.units[unit_key] + + if unit_prd.isa_ports.has(ADDR_UG_LITERA_1): + ug_work_1 = unit_prd.isa_ports[ADDR_UG_LITERA_1] + if unit_prd.isa_ports.has(ADDR_UG_LITERA_2): + ug_work_2 = unit_prd.isa_ports[ADDR_UG_LITERA_2] + + const dou = 0x3 + const att = 0x7 + var result = ((att & 0x07) << 3) | (dou & 0x07) + + var prd_module = prd.prd_dict[unit_prd.name] + prd_module.cmd_array.append([unit_prd.CmdCode.WRITE_ISA, [ADDR_UG_LITERA_1, result, ADDR_UG_LITERA_2, result]]) + + +func on_mode_changed(in_tree: bool) -> void: + if not in_tree: + queue_free() diff --git a/scenes/pribor-uyep/sch3-view.gd b/scenes/pribor-uyep/sch3-view.gd index 9fe56547..f0ee87f4 100644 --- a/scenes/pribor-uyep/sch3-view.gd +++ b/scenes/pribor-uyep/sch3-view.gd @@ -77,15 +77,13 @@ func _enter_tree() -> void: unit_sch3.regs_input_count = regs_input_count unit_sch3.request_period = request_period unit_sch3.reconnect_period = reconnect_period - unit_sch3.connect('read', on_read.bind(unit_sch3)) - unit_sch3.connect('read_input', on_input) + unit_sch3.connect('read_input', on_input.bind(unit_sch3)) unit_sch3.connect('error', on_error.bind(unit_sch3)) unit_sch3.connect('line_changed', on_line_changed_sch3) func _ready() -> void: var unit_key = settings.get_unit_key(unit_name) - var a = network.units var unit_sch3 = network.units[unit_key] var items = get_tree().get_nodes_in_group('bits_items_switch') for item in items: @@ -98,23 +96,34 @@ func _exit_tree() -> void: if Engine.is_editor_hint(): return var unit_key = settings.get_unit_key(unit_name) var unit_sch3 = network.units[unit_key] - unit_sch3.disconnect('read', on_read.bind(unit_sch3)) unit_sch3.disconnect('read_input', on_input.bind(unit_sch3)) external_ctl = ProjectSettings.get_setting('application/config/Внешнее управление', false) unit_sch3.disconnect('error', on_error) unit_sch3.disconnect('line_changed', on_line_changed_sch3) -## Вызывается по сигналу "приняты данные чтения регистров хранения"[br] +## Вызывается по сигналу "приняты данные чтения регистров входов".[br] ## [param base_addr] - Начальный адрес регистров.[br] -## [param data] - Массив значений прочитанных из регистров. -func on_read(base_addr: int, data: Array, unit_sch3): - if (base_addr != base_holding_address) or (data.size() < regs_holding_count): +## [param data] - Массив значений прочитанных из регистров.[br] +func on_input(base_addr: int, data: Array, unit_sch3): + if !is_inside_tree(): return + if (base_addr != base_input_address) or (data.size() < regs_input_count): + return + # "Для контроля состояния управляющего элемента подачи электроэнергии на приборы ..." + # "Для контроля подачи электроэнергии на приборы ..." + # Таблицы 3.13 и 3.14. Ecли значения соответствующих битов в этих + # регистрах равны, то "исправно". + var items = get_tree().get_nodes_in_group('bits_items_good') for i in data.size(): - regs_holding[base_addr + i] = data[i] + regs_input[base_addr + i] = data[i] # Разрешить работу выключателей только когда прочитано их реальное состояние if not switches_sync: + regs_holding[0] = regs_input[0] + regs_holding[1] = regs_input[1] + for i in 16: + regs_holding[2] = tools.set_bit(regs_holding[0], i, not ((regs_holding[0] >> i) & 1)) + regs_holding[3] = tools.set_bit(regs_holding[1], i, not ((regs_holding[1] >> i) & 1)) if not external_ctl: if regs_holding.has(0) and regs_holding.has(2): regs_holding[0] = regs_holding[0] | 1 @@ -127,27 +136,10 @@ func on_read(base_addr: int, data: Array, unit_sch3): var byte1: int = bits[2] # Адрес регистра var bit1: int = bits[3] # Индекс бита var val0: bool = regs_holding[byte0] & (1 << bit0) > 0 - item.button_pressed = val0 + item.set_pressed_no_signal(val0) item.disabled = false regs_holding[byte1] = tools.set_bit(regs_holding[byte1], bit1, not val0) unit_sch3.push_write_holding(regs_holding) - - -## Вызывается по сигналу "приняты данные чтения регистров входов".[br] -## [param base_addr] - Начальный адрес регистров.[br] -## [param data] - Массив значений прочитанных из регистров.[br] -func on_input(base_addr: int, data: Array): - if !is_inside_tree(): - return - if (base_addr != base_input_address) or (data.size() < regs_input_count): - return - # "Для контроля состояния управляющего элемента подачи электроэнергии на приборы ..." - # "Для контроля подачи электроэнергии на приборы ..." - # Таблицы 3.13 и 3.14. Ecли значения соответствующих битов в этих - # регистрах равны, то "исправно". - var items = get_tree().get_nodes_in_group('bits_items_good') - for i in data.size(): - regs_input[base_addr + i] = data[i] # Таблица 3.15, Регистр PowerState $margin/vbox/grid1/lbl_freq.text = '%d' % (regs_input[4] & 0x1ff) $margin/vbox/grid1/lbl_freq.self_modulate = Color.WHITE diff --git a/scenes/pribor-uyep/sch3.tscn b/scenes/pribor-uyep/sch3.tscn index 2905b587..a175a03f 100644 --- a/scenes/pribor-uyep/sch3.tscn +++ b/scenes/pribor-uyep/sch3.tscn @@ -136,6 +136,17 @@ theme_override_font_sizes/font_size = 17 text = "УФ" vertical_alignment = 1 +[node name="switch0" type="CheckButton" parent="margin/vbox/table" groups=["bits_items_switch", "c111"]] +editor_description = "Питание УФ" +material = SubResource("ShaderMaterial_c1mqk") +layout_mode = 2 +size_flags_horizontal = 2 +tooltip_text = "Выключатель питания УФ" +button_pressed = true +action_mode = 0 +script = ExtResource("7_l6esm") +metadata/bits = [0, 0, 2, 0] + [node name="state1" type="TextureRect" parent="margin/vbox/table" groups=["bits_items_good"]] custom_minimum_size = Vector2(24, 24) layout_mode = 2 diff --git a/scripts/prd.gd b/scripts/prd.gd index 2141471c..afffcdf3 100644 --- a/scripts/prd.gd +++ b/scripts/prd.gd @@ -194,7 +194,6 @@ class PRD: fs.um_code_rx = u.isa_ports[port] & 0x7 - func on_line_changed(unit_ems): if not unit_ems.online: yemsg_board.ems_load = yemsg_board.LoadState.NOT_DEFINED @@ -203,8 +202,6 @@ class PRD: func on_data_received(_u): set_prd_status() - if state != PrdState.WORK: - return if yemsg_board.state_board != yemsg_board.WAIT or yemsg_board.state_cmd != yemsg_board.WAIT: return if yemsg_board.online: @@ -280,6 +277,8 @@ func _ready() -> void: var unit_caps_key = settings.get_unit_key('уарэп-капсрпб') var unit_caps = network.units[unit_caps_key] unit_caps.connect('data_received', Callable(self, 'on_data_capsrpb_received')) + signaller.connect('режим_контроль', Callable(self, 'on_mode_changed').bind(PrdState.CONTROL)) + signaller.connect('режим_работа', Callable(self, 'on_mode_changed').bind(PrdState.WORK)) func get_fs_param(index: int) -> Array: @@ -347,7 +346,7 @@ func on_data_capsrpb_received(unit0: capsrpb.CapsRpb): if not unit0.json_dic.has('ts'): return if unit0.json_dic['ts'] != 7: return if not unit0.json_dic.has('msfs'): return - + var msfs = unit0.json_dic['msfs'] for fs in msfs: if fs is Dictionary: @@ -369,3 +368,9 @@ func on_data_capsrpb_received(unit0: capsrpb.CapsRpb): if fs.has('width'): fs_module.width_caps_rx = int(fs['width']) signaller.emit_signal('fs_update_state', fs_dict) + + +## Вызывается при переходе в режим работа/контроль +func on_mode_changed(changed_mode: int) -> void: + for pdr in prd.prd_dict.values(): + pdr.state = changed_mode diff --git a/scripts/sch3.gd b/scripts/sch3.gd index abedfbf2..acb767d3 100644 --- a/scripts/sch3.gd +++ b/scripts/sch3.gd @@ -70,11 +70,6 @@ class Sch3 extends unit.Unit: mbc.request_read_input(base_input_address, regs_input_count) cmd_state = CmdState.WAIT tx_tick = tick - step_fsm = Sch3Fsm.READ_HOLDING - elif step_fsm == Sch3Fsm.READ_HOLDING: - mbc.request_read(base_holding_address, regs_holding_count) - cmd_state = CmdState.WAIT - tx_tick = tick step_fsm = Sch3Fsm.WRITE elif step_fsm == Sch3Fsm.CONNECT: try_disconnect()