Доработка. Отображение состояния СПТ-25 в режиме Контроль

This commit is contained in:
sasha80
2024-10-30 14:37:55 +03:00
parent e67f930c17
commit 8763741c07
5 changed files with 50 additions and 21 deletions

View File

@@ -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]

View File

@@ -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
# Критическая температура

View File

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

View File

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

View File

@@ -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 ## Длина последнего отправленного пакета.