Доработка. Отображение и запись в регистры управления питанием прибора Щ3
This commit is contained in:
@@ -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')
|
||||
|
||||
Reference in New Issue
Block a user