diff --git a/scenes/pribor-uyep/sch3-view.gd b/scenes/pribor-uyep/sch3-view.gd index 91e6a4b5..b8e4e43a 100644 --- a/scenes/pribor-uyep/sch3-view.gd +++ b/scenes/pribor-uyep/sch3-view.gd @@ -19,6 +19,7 @@ var holding_stack: = [] ## Стек команд для чтения регис var input_stack: = [] ## Стек команд для чтения регистров входов var read_step: = 0 var switches_sync: = false +var timer = Timer.new() class StackItem: @@ -62,9 +63,14 @@ func on_toggled_switch(val: bool, unit_sch3: sch_3.Sch3, meta: Array): if regs_holding.has(on_addr) and regs_holding.has(off_addr): regs_holding[on_addr] = tools.set_bit(regs_holding[on_addr], on_bit, val) regs_holding[off_addr] = tools.set_bit(regs_holding[off_addr], off_bit, not val) + push_write_holding() + + +## Заносит в очередь команду чтения регистров хранения +func push_write_holding(): var regs_data: = [] var keys = regs_holding.keys() - keys.sort() + keys.sort() # Ключи в словаре хранятся не упорядочено for addr in keys: regs_data.append(regs_holding[addr]) write_stack.push_back(StackItem.new(keys[0], regs_data)) @@ -78,17 +84,24 @@ func _ready() -> void: var items = get_tree().get_nodes_in_group('bits_items_switch') for item in items: var meta = item.get_meta('bits') - item.connect('toggled', on_toggled_switch.bind(unit_sch3, meta)) + item.connect('toggled', on_toggled_switch.bind(meta)) item.disabled = true unit_sch3.connect('resp_input', on_resp_input) unit_sch3.connect('resp_holding', on_resp_holding) - var timer = Timer.new() + unit_sch3.connect('command_fail', on_command_fail) timer.connect('timeout', _on_timeout.bind(unit_sch3)) add_child(timer) - timer.start(1.0) + timer.start(request_period) -func on_line_changed(unit_sch3): +func on_command_fail(unit_sch3): + unit_sch3.cmd_state = unit.Unit.CmdState.DONE + timer.stop() + + +## Вызывается, когда состояния прибора Щ3 "на связи" изменяется[br] +## [param unit_sch3] - Экземпляр представления прибора Щ3 +func on_line_changed(unit_sch3: sch_3.Sch3): for item in get_tree().get_nodes_in_group('bits_items_good'): item.texture = textures[STATE_VAL.NONE] if not unit_sch3.online: @@ -100,6 +113,10 @@ func on_line_changed(unit_sch3): input_stack.clear() holding_stack.clear() switches_sync = false + $margin/vbox/grid1/lbl_freq.text = '<нет данных>' + $margin/vbox/grid1/state_freq.texture = textures[STATE_VAL.NONE] + else: + timer.start(request_period) func on_resp_holding(base_addr: int, data: Array): @@ -108,14 +125,18 @@ func on_resp_holding(base_addr: int, data: Array): for i in data.size(): regs_holding[base_addr + i] = data[i] if not switches_sync: + switches_sync = true for item in get_tree().get_nodes_in_group('bits_items_switch'): var bits = item.get_meta('bits') - var byte: int = bits[0] - var bit: int = bits[1] - item.button_pressed = regs_holding[byte] & (1 << bit) > 0 + var byte0: int = bits[0] # Адрес регистра + var bit0: int = bits[1] # Индекс бита + var byte1: int = bits[2] # Адрес регистра + var bit1: int = bits[3] # Индекс бита + var val0: bool = regs_holding[byte0] & (1 << bit0) > 0 + item.button_pressed = val0 item.disabled = false - switches_sync = true - $margin/vbox/grid1/lbl_freq.text = '<нет данных>' + regs_holding[byte1] = tools.set_bit(regs_holding[byte1], bit1, not val0) + push_write_holding() func on_resp_input(base_addr: int, data: Array): @@ -130,6 +151,9 @@ func on_resp_input(base_addr: int, data: Array): regs_input[base_addr + i] = data[i] # Таблица 3.15, Регистр PowerState $margin/vbox/grid1/lbl_freq.text = '%d' % (regs_input[4] & 0x1ff) + $margin/vbox/grid1/state_freq.texture \ + = textures[STATE_VAL.GOOD] if regs_input[4] & (1 << 15) \ + else textures[STATE_VAL.ERROR] var cnt_good: int = 0 for item in items: var bits: Array = item.get_meta('bits')