Доработка. Отображение состояния СПТ-25 в режиме Контроль
This commit is contained in:
@@ -43,7 +43,7 @@ signal pressed(control: PanelContainer)
|
||||
|
||||
@export var state2: int:
|
||||
set(v):
|
||||
state1 = tools.clip_value(v, 0, textures.size() - 1)
|
||||
state2 = tools.clip_value(v, 0, textures.size() - 1)
|
||||
$margin/vbox/table/state2.texture = textures[v]
|
||||
|
||||
|
||||
|
||||
@@ -16,7 +16,21 @@ func _enter_tree() -> void:
|
||||
if Engine.is_editor_hint(): return
|
||||
var unit_key = repsettings.get_unit_key(unit_name)
|
||||
var unit = repnetwork.units[unit_key]
|
||||
unit.connect('data_received', on_data_received.bind(unit))
|
||||
unit.connect('data_received', on_data_received)
|
||||
unit.connect('line_changed', on_line_changed)
|
||||
|
||||
|
||||
func on_line_changed(unit):
|
||||
if not unit.online:
|
||||
$block_output.state0 = STATE_VAL.NONE
|
||||
$block_output.state1 = STATE_VAL.NONE
|
||||
$block_output.state2 = STATE_VAL.NONE
|
||||
$block_input1.state0 = STATE_VAL.NONE
|
||||
$block_input2.state0 = STATE_VAL.NONE
|
||||
$block_input1.state1 = STATE_VAL.NONE
|
||||
$block_input2.state1 = STATE_VAL.NONE
|
||||
$block_input1.state2 = STATE_VAL.NONE
|
||||
$block_input2.state2 = STATE_VAL.NONE
|
||||
|
||||
|
||||
func _exit_tree() -> void:
|
||||
@@ -26,9 +40,9 @@ func _exit_tree() -> void:
|
||||
unit.disconnect('data_received', on_data_received)
|
||||
|
||||
|
||||
func on_data_received(data, unit):
|
||||
# Неисправность, напряжение на выходе меньше номинального
|
||||
$block_output.state0 = STATE_VAL.GOOD if (data[4] & (1 << 0)) == 0 else STATE_VAL.ERROR
|
||||
func on_data_received(data):
|
||||
# Неисправность, напряжение меньше номинального, напряжение выше номинального
|
||||
$block_output.state0 = STATE_VAL.GOOD if ((data[4] & (1 << 0)) == 0) and ((data[4] & (1 << 7)) == 0) and ((data[5] & (1 << 2)) == 0) else STATE_VAL.ERROR
|
||||
# Перегрузка и короткое замыкание по выходу
|
||||
$block_output.state1 = STATE_VAL.GOOD if ((data[5] & (1 << 0)) == 0) and ((data[5] & (1 << 1)) == 0) else STATE_VAL.ERROR
|
||||
# Критическая температура
|
||||
|
||||
@@ -5,6 +5,7 @@ const PROTOCOL_TYPES: = {'yau07tx': yau07.YaU07, 'json-capsrpb': capsrpb.CapsRpb
|
||||
const TCP_PROTO: = {'5p28': tcp5p28.TCP5P28}
|
||||
const SERIAL_PROTO: = {'uart': spt25.SPT25 }
|
||||
|
||||
var tick: int = 0
|
||||
|
||||
class Serial extends SerialPort:
|
||||
func send_to(data: PackedByteArray): return write_raw(data)
|
||||
@@ -58,6 +59,9 @@ var sock_capsrpb: Socket
|
||||
var logger_page: Node
|
||||
|
||||
|
||||
func on_serial_data(data, unit): unit.parse(data, tick)
|
||||
|
||||
|
||||
func create_socket(nm) -> Socket:
|
||||
var addr = repsettings.UnitProfiles[nm][1]
|
||||
var port = repsettings.UnitProfiles[nm][2][0]
|
||||
@@ -134,7 +138,7 @@ func _ready() -> void:
|
||||
units_serial[unit_key] = unit
|
||||
units[unit_key] = unit
|
||||
serials[unit_key] = serial
|
||||
var rc = serial.try_open(unit.parse)
|
||||
var rc = serial.try_open(on_serial_data.bind(unit))
|
||||
if rc != Error.OK:
|
||||
log.message(log.ERROR, 'Невозможно открыть %s для \"%s\"' % [serial, unit_name])
|
||||
else:
|
||||
@@ -147,7 +151,7 @@ func _ready() -> void:
|
||||
for key in dst_ports: unit_keys[dst_ports[key]] = key
|
||||
|
||||
|
||||
func poll_receive(sock: Socket, tick: int) -> bool:
|
||||
func poll_receive(sock: Socket) -> bool:
|
||||
while sock.get_available_packet_count() > 0:
|
||||
var data: = sock.get_packet()
|
||||
var addr: = sock.get_packet_ip()
|
||||
@@ -161,7 +165,7 @@ func poll_receive(sock: Socket, tick: int) -> bool:
|
||||
return false
|
||||
|
||||
|
||||
func poll_receive_tcp(sock: SocketTCP, tick: int) -> bool:
|
||||
func poll_receive_tcp(sock: SocketTCP) -> bool:
|
||||
if sock.is_connection_available(): # check if someone's trying to connect
|
||||
var client = sock.take_connection() # accept connection
|
||||
sock.peerstream.set_stream_peer(client) # bind peerstream to new client
|
||||
@@ -169,12 +173,12 @@ func poll_receive_tcp(sock: SocketTCP, tick: int) -> bool:
|
||||
if peer:
|
||||
var peer_len_data = peer.get_available_bytes()
|
||||
if peer_len_data > 0:
|
||||
get_client_data(sock, peer_len_data, peer, tick)
|
||||
get_client_data(sock, peer_len_data, peer)
|
||||
if sock.unit_key in units_tcp and sock.rx_all: units_tcp[sock.unit_key].parse(sock.rx_data, tick)
|
||||
return false
|
||||
|
||||
|
||||
func get_client_data(sock: SocketTCP, peer_len_data, peer, tick):
|
||||
func get_client_data(sock: SocketTCP, peer_len_data, peer):
|
||||
if tick - sock.rx_tick > sock.RX_TIMEOUT:
|
||||
sock.rx_all = true
|
||||
sock.rx_tick = tick
|
||||
@@ -207,7 +211,7 @@ func get_tcp_data(sock: SocketTCP, peer, len_rx):
|
||||
|
||||
|
||||
func _process(_delta: float) -> void:
|
||||
var tick = Time.get_ticks_msec()
|
||||
tick = Time.get_ticks_msec()
|
||||
for addr in units_udp:
|
||||
var unit = units[addr]
|
||||
match unit.process(tick):
|
||||
@@ -225,5 +229,5 @@ func _process(_delta: float) -> void:
|
||||
match unit.process(tick):
|
||||
Error.OK: sock.send_to(unit.tx_data)
|
||||
Error.FAILED: emit_signal('socket_error', 'ошибка: %s' % unit)
|
||||
poll_receive_tcp(sock, tick)
|
||||
poll_sockets.any(func(sock): poll_receive(sock, tick))
|
||||
poll_receive_tcp(sock)
|
||||
poll_sockets.any(func(sock): poll_receive(sock))
|
||||
|
||||
@@ -1,11 +1,14 @@
|
||||
class_name spt25_unit extends Node
|
||||
|
||||
const ONLINE_TIMEOUT: int = 5000 ## Время ожидания данных
|
||||
const REQUEST_PERIOD: int = 3000 ## Переиод запроса, мс
|
||||
|
||||
class SPT25 extends unit.Unit:
|
||||
|
||||
var tx_tick: int = 0
|
||||
var req_period = 3000.0 ## Переиод запроса, мс
|
||||
func _to_string() -> String: return String('СПТ-25: %s %s' % [self.name, ['отключен', 'на связи'][int(online)]])
|
||||
var rx_tick: int = 0
|
||||
var req_period = REQUEST_PERIOD
|
||||
func _to_string() -> String: return String('СПТ-25 %s %s' % [self.name, ['отключен', 'на связи'][int(online)]])
|
||||
|
||||
func _init(nm) -> void:
|
||||
self.name = nm
|
||||
@@ -19,14 +22,22 @@ class SPT25 extends unit.Unit:
|
||||
tx_data[6] = 0 # Контрольная сумма
|
||||
tx_data[7] = 0x7e # Флаги синхронизации пакета
|
||||
|
||||
func parse(rx_data: PackedByteArray):
|
||||
if not self.online:
|
||||
self.online = true
|
||||
|
||||
func parse(rx_data: PackedByteArray, tick: int):
|
||||
rx_tick = tick
|
||||
if not online:
|
||||
online = true
|
||||
emit_signal('line_changed', self)
|
||||
emit_signal('data_received', rx_data)
|
||||
|
||||
|
||||
func process(tick: int):
|
||||
var rc: = Error.ERR_BUSY
|
||||
if (tick - tx_tick) > req_period:
|
||||
tx_tick = tick
|
||||
return Error.OK
|
||||
return Error.ERR_BUSY
|
||||
rc = Error.OK
|
||||
if online:
|
||||
if (tick - rx_tick) > ONLINE_TIMEOUT:
|
||||
online = false
|
||||
emit_signal('line_changed', self)
|
||||
return rc
|
||||
|
||||
@@ -6,7 +6,7 @@ class Unit:
|
||||
signal command_done(unit) ## Вызывается после выполнения команды.
|
||||
signal command_fail(unit) ## Вызывается если возникла ошибка при выполнении команды и команда не выполнена.
|
||||
signal parse_failed(unit) ## Вызывается при обнаружении ошибки во входных данных
|
||||
signal data_received(unit) ## Вызывается по приёму данных
|
||||
signal data_received(data: PackedByteArray) ## Вызывается по приёму данных
|
||||
|
||||
var tx_data: = PackedByteArray() ## Буфер отправленный.
|
||||
var tx_len = 0 ## Длина последнего отправленного пакета.
|
||||
|
||||
Reference in New Issue
Block a user