Доработка. Отображение и запись в регистры управления питанием прибора Щ3

This commit is contained in:
sasha80
2024-11-22 10:20:32 +03:00
parent 7df4ba92c2
commit 83e7800135

View File

@@ -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')