2025-01-19 18:27:26 +08:00
|
|
|
import logging
|
2025-01-06 11:21:04 +08:00
|
|
|
import sys
|
|
|
|
|
|
|
|
|
|
from PyQt6 import QtCore
|
|
|
|
|
from PyQt6.QtCore import QByteArray
|
2025-01-19 18:27:26 +08:00
|
|
|
from PyQt6.QtWidgets import QMainWindow, QApplication, QFrame
|
2025-01-06 11:21:04 +08:00
|
|
|
|
|
|
|
|
from Main import Ui_MainWindow
|
2025-01-19 19:05:56 +08:00
|
|
|
from ZMQReceiver import ZMQReceiver
|
|
|
|
|
from nodes.Node import Node
|
2025-01-19 18:27:26 +08:00
|
|
|
from utils.Msg import KillMsg, Msg, ImageArgMsg, SelectSeqMsg, SeqIdMinMax, MoveAxisMsg, SeqListMsg, SetBaseMsg, \
|
|
|
|
|
SeqMetaMsg, SetPlayMode, DeviceConnectedMsg, DeviceEnabledMsg, DeviceOnlineMsg, SetDeviceEnabledMsg, \
|
2025-01-19 18:49:41 +08:00
|
|
|
SetDeviceConnectedMsg, DeviceConfigListMsg, SetDeviceConfigMsg, SetRecordMsg
|
2025-01-19 18:27:26 +08:00
|
|
|
from utils.RfFile import RfSequenceMeta
|
2025-01-06 11:21:04 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class Adv(QMainWindow, Ui_MainWindow):
|
|
|
|
|
def __init__(self, p: Node, parent=None):
|
|
|
|
|
super(Adv, self).__init__(parent)
|
|
|
|
|
self.p = p
|
|
|
|
|
self.setupUi(self)
|
|
|
|
|
zmq_receiver = ZMQReceiver(self)
|
|
|
|
|
zmq_receiver.zmq_event.connect(self.on_zmq_event)
|
|
|
|
|
zmq_receiver.start()
|
2025-01-20 13:03:02 +08:00
|
|
|
self.s_t_start.valueChanged.connect(self.on_t_start)
|
|
|
|
|
self.s_t_end.valueChanged.connect(self.on_t_end)
|
2025-01-19 18:27:26 +08:00
|
|
|
self.comboBox.currentIndexChanged.connect(self.cbc)
|
|
|
|
|
self.s_sid.valueChanged.connect(self.c_sid)
|
2025-01-20 13:03:02 +08:00
|
|
|
self.arg = ImageArgMsg('ui', t_start=0, t_end=1499)
|
2025-01-19 18:27:26 +08:00
|
|
|
self.b_base.clicked.connect(lambda: self.p.send(SetBaseMsg(self.l_base.text())))
|
|
|
|
|
self.seq_meta: RfSequenceMeta | None = None
|
|
|
|
|
self.b_exit.clicked.connect(lambda: self.p.send(KillMsg('')))
|
|
|
|
|
self.b_play_live.clicked.connect(self.on_play_live)
|
|
|
|
|
self.b_play_playback.clicked.connect(self.on_play_playback)
|
|
|
|
|
self.b_record.clicked.connect(self.on_record)
|
|
|
|
|
self.record = False
|
|
|
|
|
self.device_connected = False
|
|
|
|
|
self.device_enabled = False
|
|
|
|
|
self.b_device_enabled.clicked.connect(lambda: self.p.send(SetDeviceEnabledMsg(not self.device_enabled)))
|
|
|
|
|
self.b_device_connected.clicked.connect(lambda: self.p.send(SetDeviceConnectedMsg(not self.device_connected)))
|
|
|
|
|
self.c_seq_meta.currentIndexChanged.connect(self.on_m)
|
|
|
|
|
|
|
|
|
|
def on_play_live(self):
|
|
|
|
|
self.b_play_live.setStyleSheet('background-color: red;')
|
|
|
|
|
self.b_play_playback.setStyleSheet('')
|
|
|
|
|
self.b_record.setEnabled(True)
|
|
|
|
|
self.l_record_commit.setEnabled(True)
|
|
|
|
|
self.p.send(SeqMetaMsg(self.c_seq_meta.itemText(self.c_seq_meta.currentIndex())))
|
|
|
|
|
self.p.send(SetPlayMode('live'))
|
|
|
|
|
self.comboBox.setEnabled(False)
|
|
|
|
|
|
|
|
|
|
def on_play_playback(self):
|
|
|
|
|
self.b_play_live.setStyleSheet('')
|
|
|
|
|
self.b_play_playback.setStyleSheet('background-color: red;')
|
|
|
|
|
self.b_record.setEnabled(False)
|
|
|
|
|
self.l_record_commit.setEnabled(False)
|
|
|
|
|
self.p.send(SeqMetaMsg(self.comboBox.itemText(self.comboBox.currentIndex())))
|
|
|
|
|
self.p.send(SetPlayMode('playback'))
|
|
|
|
|
self.comboBox.setEnabled(True)
|
|
|
|
|
|
|
|
|
|
def on_record(self):
|
|
|
|
|
if self.record:
|
2025-01-19 18:49:41 +08:00
|
|
|
self.p.send(SetRecordMsg(False))
|
2025-01-19 18:27:26 +08:00
|
|
|
self.record = False
|
|
|
|
|
self.b_record.setStyleSheet('')
|
|
|
|
|
|
|
|
|
|
else:
|
2025-01-19 18:49:41 +08:00
|
|
|
if self.l_record_commit.text() != '':
|
|
|
|
|
self.p.send(SetRecordMsg(True, self.l_record_commit.text()))
|
|
|
|
|
self.record = True
|
|
|
|
|
self.b_record.setStyleSheet('background-color: red;')
|
2025-01-06 11:21:04 +08:00
|
|
|
|
|
|
|
|
def on_zmq_event(self, msg: QByteArray):
|
|
|
|
|
msg = Msg.decode_msg(msg.data())
|
|
|
|
|
if isinstance(msg, KillMsg):
|
|
|
|
|
if msg.name == '':
|
|
|
|
|
self.close()
|
|
|
|
|
elif isinstance(msg, ImageArgMsg):
|
2025-01-20 13:03:02 +08:00
|
|
|
self.s_t_end.setValue(msg.t_start)
|
|
|
|
|
self.s_t_end.setValue(msg.t_end)
|
2025-01-19 18:27:26 +08:00
|
|
|
elif isinstance(msg, MoveAxisMsg):
|
|
|
|
|
match msg.axis:
|
|
|
|
|
case 'S':
|
|
|
|
|
self.s_sid.setValue(msg.value)
|
|
|
|
|
elif isinstance(msg, SeqIdMinMax):
|
|
|
|
|
self.s_sid.setMinimum(msg.min)
|
|
|
|
|
self.s_sid.setMaximum(msg.max)
|
|
|
|
|
self.s_sid.setValue(msg.min)
|
|
|
|
|
elif isinstance(msg, SeqListMsg):
|
|
|
|
|
self.comboBox.setEnabled(True)
|
|
|
|
|
self.comboBox.clear()
|
|
|
|
|
for name in msg.value:
|
|
|
|
|
self.comboBox.addItem(name)
|
|
|
|
|
self.p.send(SelectSeqMsg(self.comboBox.itemText(self.comboBox.currentIndex())))
|
|
|
|
|
self.b_play_playback.setEnabled(True)
|
|
|
|
|
elif isinstance(msg, SeqMetaMsg):
|
|
|
|
|
self.seq_meta = RfSequenceMeta.from_name(msg.s)
|
2025-01-20 13:03:02 +08:00
|
|
|
self.s_t_start.setMaximum(max(self.seq_meta.shape))
|
|
|
|
|
self.s_t_end.setMaximum(max(self.seq_meta.shape))
|
2025-01-19 18:27:26 +08:00
|
|
|
elif isinstance(msg, DeviceConnectedMsg):
|
|
|
|
|
if msg.value:
|
2025-01-20 13:03:02 +08:00
|
|
|
self.b_device_connected.setStyleSheet("background-color: green;")
|
2025-01-19 18:27:26 +08:00
|
|
|
self.device_connected = True
|
|
|
|
|
else:
|
2025-01-20 13:03:02 +08:00
|
|
|
self.b_device_connected.setStyleSheet("background-color: red;")
|
2025-01-19 18:27:26 +08:00
|
|
|
self.device_connected = False
|
|
|
|
|
|
|
|
|
|
elif isinstance(msg, DeviceEnabledMsg):
|
|
|
|
|
if msg.value:
|
2025-01-20 13:03:02 +08:00
|
|
|
self.b_device_enabled.setStyleSheet("background-color: green;")
|
2025-01-19 18:27:26 +08:00
|
|
|
self.device_enabled = True
|
|
|
|
|
else:
|
2025-01-20 13:03:02 +08:00
|
|
|
self.b_device_enabled.setStyleSheet("background-color: red;")
|
2025-01-19 18:27:26 +08:00
|
|
|
self.device_enabled = False
|
|
|
|
|
elif isinstance(msg, DeviceOnlineMsg):
|
|
|
|
|
if msg.value:
|
|
|
|
|
self.l_online.setStyleSheet("")
|
|
|
|
|
self.l_online.setText("Device Online")
|
|
|
|
|
else:
|
|
|
|
|
self.l_online.setStyleSheet("background-color: pink;")
|
|
|
|
|
self.l_online.setText("Device Offline")
|
|
|
|
|
elif isinstance(msg, DeviceConfigListMsg):
|
|
|
|
|
for name, txt in msg.arr:
|
|
|
|
|
self.c_seq_meta.addItem(name, txt)
|
2025-01-06 11:21:04 +08:00
|
|
|
|
|
|
|
|
@QtCore.pyqtSlot(int)
|
2025-01-20 13:03:02 +08:00
|
|
|
def on_t_start(self, v):
|
|
|
|
|
if self.s_t_end.sender() is None:
|
|
|
|
|
self.arg.t_start = v
|
|
|
|
|
self.p.send(self.arg)
|
|
|
|
|
|
|
|
|
|
@QtCore.pyqtSlot(int)
|
|
|
|
|
def on_t_end(self, v):
|
|
|
|
|
if self.s_t_end.sender() is None:
|
|
|
|
|
self.arg.t_end = v
|
2025-01-19 18:27:26 +08:00
|
|
|
self.p.send(self.arg)
|
|
|
|
|
|
|
|
|
|
@QtCore.pyqtSlot(int)
|
|
|
|
|
def cbc(self, v):
|
2025-01-19 19:04:27 +08:00
|
|
|
if self.comboBox.sender() is None or isinstance(self.comboBox.sender(), QFrame):
|
2025-01-19 18:27:26 +08:00
|
|
|
self.p.send(SelectSeqMsg(self.comboBox.itemText(v)))
|
|
|
|
|
|
|
|
|
|
@QtCore.pyqtSlot(int)
|
|
|
|
|
def c_sid(self, v):
|
|
|
|
|
if self.s_sid.sender() is None:
|
|
|
|
|
self.p.send(MoveAxisMsg('ui', 'S', v))
|
|
|
|
|
|
|
|
|
|
@QtCore.pyqtSlot(int)
|
|
|
|
|
def on_m(self, v):
|
|
|
|
|
if self.c_seq_meta.sender() is None or isinstance(self.c_seq_meta.sender(), QFrame):
|
|
|
|
|
self.p.send(SetDeviceConfigMsg(self.c_seq_meta.itemData(v)))
|
|
|
|
|
self.p.send(SeqMetaMsg(self.c_seq_meta.itemText(v)))
|
2025-01-06 11:21:04 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class MainUI(Node):
|
2025-01-19 18:27:26 +08:00
|
|
|
topics = [ImageArgMsg, SeqIdMinMax, MoveAxisMsg,
|
|
|
|
|
SeqListMsg, SeqMetaMsg,
|
|
|
|
|
DeviceConnectedMsg, DeviceEnabledMsg, DeviceOnlineMsg, DeviceConfigListMsg]
|
2025-01-06 11:21:04 +08:00
|
|
|
|
2025-01-19 18:27:26 +08:00
|
|
|
def __init__(self, level=logging.INFO):
|
|
|
|
|
super().__init__(level=level)
|
2025-01-06 11:21:04 +08:00
|
|
|
|
|
|
|
|
def loop(self):
|
|
|
|
|
app = QApplication(sys.argv)
|
|
|
|
|
MainWindow = Adv(self)
|
|
|
|
|
# MainWindow.move(int(px), int(py))
|
|
|
|
|
# MainWindow.resize(int(sx), int(sy))
|
|
|
|
|
MainWindow.show()
|
|
|
|
|
app.exec()
|