fix all ui
This commit is contained in:
parent
eb2a316100
commit
c2ed707a43
@ -9,7 +9,8 @@ import zmq
|
|||||||
|
|
||||||
from config import PLAYBACK_SOCKET, VIDEO_WIDTH, VIDEO_HEIGHT, LIVE_SOCKET
|
from config import PLAYBACK_SOCKET, VIDEO_WIDTH, VIDEO_HEIGHT, LIVE_SOCKET
|
||||||
from nodes.Node import Node
|
from nodes.Node import Node
|
||||||
from utils.Msg import BMMsg, ImageArgMsg, KillMsg, SeqMetaMsg, SetPlayMode, SetDeviceConfigMsg, SetRecordMsg
|
from utils.Msg import BMMsg, ImageArgMsg, KillMsg, SeqMetaMsg, SetPlayMode, SetDeviceConfigMsg, SetRecordMsg, \
|
||||||
|
RecordFrameMsg
|
||||||
from utils.RfFile import RfFrame, RfSequenceMeta
|
from utils.RfFile import RfFrame, RfSequenceMeta
|
||||||
from utils.RfMat import RfMat
|
from utils.RfMat import RfMat
|
||||||
|
|
||||||
@ -22,10 +23,12 @@ class Beamformer(Node):
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(Beamformer, self).__init__()
|
super(Beamformer, self).__init__()
|
||||||
self.arg = ImageArgMsg('', t_start=0, t_end=1499)
|
self.arg = ImageArgMsg('', t_start=0, t_end=1499)
|
||||||
self.seq_meta = None
|
self.seq_meta_live = None
|
||||||
|
self.seq_meta_playback = None
|
||||||
self.record_enable = False
|
self.record_enable = False
|
||||||
self.record_commit = None
|
self.record_commit = None
|
||||||
self.record_path: Path | None = None
|
self.record_path: Path | None = None
|
||||||
|
self.play_mode = None
|
||||||
|
|
||||||
def process(self, data: RfMat):
|
def process(self, data: RfMat):
|
||||||
if data is None:
|
if data is None:
|
||||||
@ -41,10 +44,19 @@ class Beamformer(Node):
|
|||||||
)
|
)
|
||||||
self.send(BMMsg(0, d2.__bytes__()))
|
self.send(BMMsg(0, d2.__bytes__()))
|
||||||
|
|
||||||
|
@property
|
||||||
|
def current_seq_meta(self):
|
||||||
|
seq_meta = None
|
||||||
|
match self.play_mode:
|
||||||
|
case 'live':
|
||||||
|
seq_meta = self.seq_meta_live
|
||||||
|
case 'playback':
|
||||||
|
seq_meta = self.seq_meta_playback
|
||||||
|
return seq_meta
|
||||||
|
|
||||||
def loop(self):
|
def loop(self):
|
||||||
device_socket = self.context.socket(zmq.PULL)
|
device_socket = self.context.socket(zmq.PULL)
|
||||||
device_socket.setsockopt(zmq.CONFLATE, 1)
|
device_socket.setsockopt(zmq.CONFLATE, 1)
|
||||||
device_socket.connect(f"tcp://{PLAYBACK_SOCKET}")
|
|
||||||
self.c.poller.register(device_socket, zmq.POLLIN)
|
self.c.poller.register(device_socket, zmq.POLLIN)
|
||||||
mat = None
|
mat = None
|
||||||
while True:
|
while True:
|
||||||
@ -53,15 +65,24 @@ class Beamformer(Node):
|
|||||||
buffer = device_socket.recv()
|
buffer = device_socket.recv()
|
||||||
_, sequence_id, encoder = struct.unpack_from('=iqi', buffer)
|
_, sequence_id, encoder = struct.unpack_from('=iqi', buffer)
|
||||||
s = buffer[4 + 8 + 4:]
|
s = buffer[4 + 8 + 4:]
|
||||||
if self.seq_meta is not None:
|
seq_meta = None
|
||||||
|
match self.play_mode:
|
||||||
|
case 'live':
|
||||||
|
seq_meta = self.seq_meta_live
|
||||||
|
case 'playback':
|
||||||
|
seq_meta = self.seq_meta_playback
|
||||||
|
|
||||||
|
if seq_meta is not None:
|
||||||
fb1 = cp.frombuffer(s, dtype=cp.int16)
|
fb1 = cp.frombuffer(s, dtype=cp.int16)
|
||||||
if fb1.shape[0] == np.prod(self.seq_meta.shape):
|
if fb1.shape[0] == np.prod(seq_meta.shape):
|
||||||
mat = RfMat(fb1.reshape(self.seq_meta.shape), RfFrame.RfFrameMeta(
|
mat = RfMat(fb1.reshape(seq_meta.shape), RfFrame.RfFrameMeta(
|
||||||
encoder=encoder,
|
encoder=encoder,
|
||||||
sequence_id=sequence_id,
|
sequence_id=sequence_id,
|
||||||
), self.seq_meta)
|
), seq_meta)
|
||||||
if self.record_enable:
|
if self.record_enable:
|
||||||
(self.record_path / mat.frame_meta.filename).write_bytes(mat.__bytes__())
|
bs = mat.__bytes__()
|
||||||
|
(self.record_path / mat.frame_meta.filename).write_bytes(bs)
|
||||||
|
self.send(RecordFrameMsg(bs.__len__(), sequence_id))
|
||||||
|
|
||||||
if self.c.sub in socks and socks[self.c.sub] == zmq.POLLIN:
|
if self.c.sub in socks and socks[self.c.sub] == zmq.POLLIN:
|
||||||
msg = self.recv()
|
msg = self.recv()
|
||||||
@ -69,22 +90,34 @@ class Beamformer(Node):
|
|||||||
if msg.name == '':
|
if msg.name == '':
|
||||||
return
|
return
|
||||||
if isinstance(msg, SeqMetaMsg):
|
if isinstance(msg, SeqMetaMsg):
|
||||||
self.seq_meta = RfSequenceMeta.from_name(msg.s)
|
match msg.target:
|
||||||
|
case 'live':
|
||||||
|
self.seq_meta_live = RfSequenceMeta.from_name(msg.name)
|
||||||
|
case 'playback':
|
||||||
|
self.seq_meta_playback = RfSequenceMeta.from_name(msg.name)
|
||||||
if isinstance(msg, ImageArgMsg):
|
if isinstance(msg, ImageArgMsg):
|
||||||
self.arg = msg
|
self.arg = msg
|
||||||
if isinstance(msg, SetPlayMode):
|
if isinstance(msg, SetPlayMode):
|
||||||
|
self.play_mode = msg.value
|
||||||
if msg.value == 'live':
|
if msg.value == 'live':
|
||||||
device_socket.disconnect(f"tcp://{PLAYBACK_SOCKET}")
|
try:
|
||||||
|
device_socket.disconnect(f"tcp://{PLAYBACK_SOCKET}")
|
||||||
|
except:
|
||||||
|
pass
|
||||||
device_socket.connect(f"tcp://{LIVE_SOCKET}")
|
device_socket.connect(f"tcp://{LIVE_SOCKET}")
|
||||||
elif msg.value == 'playback':
|
elif msg.value == 'playback':
|
||||||
device_socket.disconnect(f"tcp://{LIVE_SOCKET}")
|
try:
|
||||||
|
device_socket.disconnect(f"tcp://{LIVE_SOCKET}")
|
||||||
|
except:
|
||||||
|
pass
|
||||||
device_socket.connect(f"tcp://{PLAYBACK_SOCKET}")
|
device_socket.connect(f"tcp://{PLAYBACK_SOCKET}")
|
||||||
if isinstance(msg, SetRecordMsg):
|
if isinstance(msg, SetRecordMsg):
|
||||||
self.record_enable = msg.enable
|
self.record_enable = msg.enable
|
||||||
if msg.enable:
|
if msg.enable:
|
||||||
|
seq_meta = self.current_seq_meta
|
||||||
self.record_commit = msg.commit
|
self.record_commit = msg.commit
|
||||||
self.seq_meta.commit = msg.commit
|
seq_meta.commit = msg.commit
|
||||||
p = Path('/tmp/flandre_record') / self.seq_meta.name
|
p = Path(msg.base) / seq_meta.name
|
||||||
p.mkdir(parents=True, exist_ok=True)
|
p.mkdir(parents=True, exist_ok=True)
|
||||||
self.record_path = p
|
self.record_path = p
|
||||||
|
|
||||||
|
|||||||
@ -38,7 +38,7 @@ class Loader(Node):
|
|||||||
if base is None:
|
if base is None:
|
||||||
continue
|
continue
|
||||||
rff = RfSequence.from_folder(base / r.value)
|
rff = RfSequence.from_folder(base / r.value)
|
||||||
self.send(SeqMetaMsg(rff.meta.name))
|
self.send(SeqMetaMsg('playback', rff.meta.name))
|
||||||
self.send(SeqIdMinMax(*rff.seq_id_minmax))
|
self.send(SeqIdMinMax(*rff.seq_id_minmax))
|
||||||
elif isinstance(r, SetBaseMsg):
|
elif isinstance(r, SetBaseMsg):
|
||||||
base = Path(r.value)
|
base = Path(r.value)
|
||||||
|
|||||||
@ -1,10 +1,11 @@
|
|||||||
import logging
|
import logging
|
||||||
import sys
|
import sys
|
||||||
from enum import Enum, auto
|
from enum import Enum, auto
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
from PyQt6 import QtCore
|
from PyQt6 import QtCore
|
||||||
from PyQt6.QtCore import QByteArray
|
from PyQt6.QtCore import QByteArray
|
||||||
from PyQt6.QtWidgets import QMainWindow, QApplication, QFrame
|
from PyQt6.QtWidgets import QMainWindow, QApplication, QFrame, QMessageBox
|
||||||
|
|
||||||
from Main import Ui_MainWindow
|
from Main import Ui_MainWindow
|
||||||
from ZMQReceiver import ZMQReceiver
|
from ZMQReceiver import ZMQReceiver
|
||||||
@ -12,7 +13,7 @@ from config import DS
|
|||||||
from nodes.Node import Node
|
from nodes.Node import Node
|
||||||
from utils.Msg import KillMsg, Msg, ImageArgMsg, SelectSeqMsg, SeqIdMinMax, MoveAxisMsg, SeqListMsg, SetBaseMsg, \
|
from utils.Msg import KillMsg, Msg, ImageArgMsg, SelectSeqMsg, SeqIdMinMax, MoveAxisMsg, SeqListMsg, SetBaseMsg, \
|
||||||
SeqMetaMsg, SetPlayMode, DeviceConnectedMsg, DeviceEnabledMsg, DeviceOnlineMsg, SetDeviceEnabledMsg, \
|
SeqMetaMsg, SetPlayMode, DeviceConnectedMsg, DeviceEnabledMsg, DeviceOnlineMsg, SetDeviceEnabledMsg, \
|
||||||
SetDeviceConnectedMsg, DeviceConfigListMsg, SetDeviceConfigMsg, SetRecordMsg, RobotRtsiMsg
|
SetDeviceConnectedMsg, DeviceConfigListMsg, SetDeviceConfigMsg, SetRecordMsg, RobotRtsiMsg, RecordFrameMsg
|
||||||
from utils.RfFile import RfSequenceMeta
|
from utils.RfFile import RfSequenceMeta
|
||||||
|
|
||||||
|
|
||||||
@ -22,6 +23,26 @@ class LinkStatus(Enum):
|
|||||||
GREEN = auto()
|
GREEN = auto()
|
||||||
|
|
||||||
|
|
||||||
|
def humanbytes(B):
|
||||||
|
"""Return the given bytes as a human friendly KB, MB, GB, or TB string."""
|
||||||
|
B = float(B)
|
||||||
|
KB = float(1024)
|
||||||
|
MB = float(KB ** 2) # 1,048,576
|
||||||
|
GB = float(KB ** 3) # 1,073,741,824
|
||||||
|
TB = float(KB ** 4) # 1,099,511,627,776
|
||||||
|
|
||||||
|
if B < KB:
|
||||||
|
return '{0} {1}'.format(B, 'Bytes' if 0 == B > 1 else 'Byte')
|
||||||
|
elif KB <= B < MB:
|
||||||
|
return '{0:.2f} KB'.format(B / KB)
|
||||||
|
elif MB <= B < GB:
|
||||||
|
return '{0:.2f} MB'.format(B / MB)
|
||||||
|
elif GB <= B < TB:
|
||||||
|
return '{0:.2f} GB'.format(B / GB)
|
||||||
|
elif TB <= B:
|
||||||
|
return '{0:.2f} TB'.format(B / TB)
|
||||||
|
|
||||||
|
|
||||||
class Adv(QMainWindow, Ui_MainWindow):
|
class Adv(QMainWindow, Ui_MainWindow):
|
||||||
def __init__(self, p: Node, parent=None):
|
def __init__(self, p: Node, parent=None):
|
||||||
super(Adv, self).__init__(parent)
|
super(Adv, self).__init__(parent)
|
||||||
@ -35,7 +56,7 @@ class Adv(QMainWindow, Ui_MainWindow):
|
|||||||
self.c_playback_seq_name.currentIndexChanged.connect(self.cbc)
|
self.c_playback_seq_name.currentIndexChanged.connect(self.cbc)
|
||||||
self.s_sid.valueChanged.connect(self.c_sid)
|
self.s_sid.valueChanged.connect(self.c_sid)
|
||||||
self.arg = ImageArgMsg('ui', t_start=0, t_end=1499)
|
self.arg = ImageArgMsg('ui', t_start=0, t_end=1499)
|
||||||
self.b_base.clicked.connect(lambda: self.p.send(SetBaseMsg(self.l_base.text())))
|
self.b_base.clicked.connect(self.on_base)
|
||||||
self.seq_meta: RfSequenceMeta | None = None
|
self.seq_meta: RfSequenceMeta | None = None
|
||||||
self.b_play_live.clicked.connect(self.on_play_live)
|
self.b_play_live.clicked.connect(self.on_play_live)
|
||||||
self.b_play_playback.clicked.connect(self.on_play_playback)
|
self.b_play_playback.clicked.connect(self.on_play_playback)
|
||||||
@ -45,9 +66,24 @@ class Adv(QMainWindow, Ui_MainWindow):
|
|||||||
self.device_enabled = False
|
self.device_enabled = False
|
||||||
# self.b_device_enabled.clicked.connect(lambda: self.p.send(SetDeviceEnabledMsg(not self.device_enabled)))
|
# 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.b_device_connected.clicked.connect(lambda: self.p.send(SetDeviceConnectedMsg(not self.device_connected)))
|
||||||
self.c_seq_meta.currentIndexChanged.connect(self.on_m)
|
self.c_seq_meta.currentIndexChanged.connect(self.on_seq_meta)
|
||||||
self.l_base.setText(DS.__str__())
|
self.l_base.setText(DS.__str__())
|
||||||
|
|
||||||
|
self.b1, self.b2 = False, False
|
||||||
|
self.b3, self.b4 = False, False
|
||||||
|
|
||||||
|
self.record_size_cnt = 0
|
||||||
|
self.record_frame_cnt = 0
|
||||||
|
|
||||||
|
def update_b_play_live_enabled(self):
|
||||||
|
self.b_play_live.setEnabled(all([self.b1, self.b2]))
|
||||||
|
|
||||||
|
def on_base(self):
|
||||||
|
if Path(self.l_base.text()).exists():
|
||||||
|
self.p.send(SetBaseMsg(self.l_base.text()))
|
||||||
|
self.b1 = True
|
||||||
|
self.update_b_play_live_enabled()
|
||||||
|
|
||||||
def set_device_connection(self, status: LinkStatus):
|
def set_device_connection(self, status: LinkStatus):
|
||||||
match status:
|
match status:
|
||||||
case LinkStatus.RED:
|
case LinkStatus.RED:
|
||||||
@ -78,23 +114,28 @@ class Adv(QMainWindow, Ui_MainWindow):
|
|||||||
self.lb_device_enable.setText('Enabled')
|
self.lb_device_enable.setText('Enabled')
|
||||||
self.lb_device_enable.setStyleSheet('background-color: LightGreen;')
|
self.lb_device_enable.setStyleSheet('background-color: LightGreen;')
|
||||||
|
|
||||||
|
def update_c_playback_seq_name_enable(self):
|
||||||
|
self.c_playback_seq_name.setEnabled(all([self.b3, self.b4]))
|
||||||
|
|
||||||
def on_play_live(self):
|
def on_play_live(self):
|
||||||
self.b_play_live.setStyleSheet('background-color: red;')
|
self.b_play_live.setStyleSheet('background-color: red;')
|
||||||
self.b_play_playback.setStyleSheet('')
|
self.b_play_playback.setStyleSheet('')
|
||||||
self.b_record.setEnabled(True)
|
self.b_record.setEnabled(True)
|
||||||
self.l_record_commit.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(SeqMetaMsg('live', self.c_seq_meta.itemText(self.c_seq_meta.currentIndex())))
|
||||||
self.p.send(SetPlayMode('live'))
|
self.p.send(SetPlayMode('live'))
|
||||||
self.c_playback_seq_name.setEnabled(False)
|
self.b3 = False
|
||||||
|
self.update_c_playback_seq_name_enable()
|
||||||
|
|
||||||
def on_play_playback(self):
|
def on_play_playback(self):
|
||||||
self.b_play_live.setStyleSheet('')
|
self.b_play_live.setStyleSheet('')
|
||||||
self.b_play_playback.setStyleSheet('background-color: red;')
|
self.b_play_playback.setStyleSheet('background-color: red;')
|
||||||
self.b_record.setEnabled(False)
|
self.b_record.setEnabled(False)
|
||||||
self.l_record_commit.setEnabled(False)
|
self.l_record_commit.setEnabled(False)
|
||||||
self.p.send(SeqMetaMsg(self.c_playback_seq_name.itemText(self.c_playback_seq_name.currentIndex())))
|
self.p.send(SeqMetaMsg('playback', self.c_playback_seq_name.itemText(self.c_playback_seq_name.currentIndex())))
|
||||||
self.p.send(SetPlayMode('playback'))
|
self.p.send(SetPlayMode('playback'))
|
||||||
self.c_playback_seq_name.setEnabled(True)
|
self.b3 = True
|
||||||
|
self.update_c_playback_seq_name_enable()
|
||||||
|
|
||||||
def on_device_disable(self):
|
def on_device_disable(self):
|
||||||
self.p.send(SetDeviceEnabledMsg(False))
|
self.p.send(SetDeviceEnabledMsg(False))
|
||||||
@ -165,15 +206,20 @@ class Adv(QMainWindow, Ui_MainWindow):
|
|||||||
|
|
||||||
def on_record(self):
|
def on_record(self):
|
||||||
if self.record:
|
if self.record:
|
||||||
|
self.l_record_commit.setEnabled(True)
|
||||||
self.p.send(SetRecordMsg(False))
|
self.p.send(SetRecordMsg(False))
|
||||||
self.record = False
|
self.record = False
|
||||||
self.b_record.setStyleSheet('')
|
self.b_record.setStyleSheet('')
|
||||||
|
|
||||||
else:
|
else:
|
||||||
|
self.l_record_commit.setEnabled(False)
|
||||||
if self.l_record_commit.text() != '':
|
if self.l_record_commit.text() != '':
|
||||||
self.p.send(SetRecordMsg(True, self.l_record_commit.text()))
|
self.record_size_cnt = 0
|
||||||
|
self.record_frame_cnt = 0
|
||||||
|
self.p.send(SetRecordMsg(True, self.l_record_commit.text(), self.l_base.text()))
|
||||||
self.record = True
|
self.record = True
|
||||||
self.b_record.setStyleSheet('background-color: red;')
|
self.b_record.setStyleSheet('background-color: red;')
|
||||||
|
else:
|
||||||
|
QMessageBox.warning(None, 'hint', 'Commit is empty!!')
|
||||||
|
|
||||||
def on_zmq_event(self, msg: QByteArray):
|
def on_zmq_event(self, msg: QByteArray):
|
||||||
msg = Msg.decode_msg(msg.data())
|
msg = Msg.decode_msg(msg.data())
|
||||||
@ -190,9 +236,13 @@ class Adv(QMainWindow, Ui_MainWindow):
|
|||||||
elif isinstance(msg, SeqIdMinMax):
|
elif isinstance(msg, SeqIdMinMax):
|
||||||
self.s_sid.setMinimum(msg.min)
|
self.s_sid.setMinimum(msg.min)
|
||||||
self.s_sid.setMaximum(msg.max)
|
self.s_sid.setMaximum(msg.max)
|
||||||
self.s_sid.setValue(msg.min)
|
self.s_sid.setMinimum(msg.min)
|
||||||
|
self.sp_sid.setMaximum(msg.max)
|
||||||
|
self.sp_sid.setValue(msg.min)
|
||||||
|
self.sp_sid.setValue(msg.min)
|
||||||
elif isinstance(msg, SeqListMsg):
|
elif isinstance(msg, SeqListMsg):
|
||||||
self.c_playback_seq_name.setEnabled(True)
|
self.b4 = True
|
||||||
|
self.update_c_playback_seq_name_enable()
|
||||||
self.c_playback_seq_name.clear()
|
self.c_playback_seq_name.clear()
|
||||||
for name in msg.value:
|
for name in msg.value:
|
||||||
self.c_playback_seq_name.addItem(name)
|
self.c_playback_seq_name.addItem(name)
|
||||||
@ -200,7 +250,7 @@ class Adv(QMainWindow, Ui_MainWindow):
|
|||||||
self.p.send(SelectSeqMsg(self.c_playback_seq_name.itemText(self.c_playback_seq_name.currentIndex())))
|
self.p.send(SelectSeqMsg(self.c_playback_seq_name.itemText(self.c_playback_seq_name.currentIndex())))
|
||||||
self.b_play_playback.setEnabled(True)
|
self.b_play_playback.setEnabled(True)
|
||||||
elif isinstance(msg, SeqMetaMsg):
|
elif isinstance(msg, SeqMetaMsg):
|
||||||
self.seq_meta = RfSequenceMeta.from_name(msg.s)
|
self.seq_meta = RfSequenceMeta.from_name(msg.name)
|
||||||
self.s_t_start.setMaximum(max(self.seq_meta.shape))
|
self.s_t_start.setMaximum(max(self.seq_meta.shape))
|
||||||
self.s_t_end.setMaximum(max(self.seq_meta.shape))
|
self.s_t_end.setMaximum(max(self.seq_meta.shape))
|
||||||
elif isinstance(msg, DeviceConnectedMsg):
|
elif isinstance(msg, DeviceConnectedMsg):
|
||||||
@ -228,6 +278,13 @@ class Adv(QMainWindow, Ui_MainWindow):
|
|||||||
elif isinstance(msg, RobotRtsiMsg):
|
elif isinstance(msg, RobotRtsiMsg):
|
||||||
self.l_robot_pos.setText(','.join([f'{v:.3f}' for v in msg.pos]))
|
self.l_robot_pos.setText(','.join([f'{v:.3f}' for v in msg.pos]))
|
||||||
self.l_robot_force.setText(','.join([f'{v:.3f}' for v in msg.force]))
|
self.l_robot_force.setText(','.join([f'{v:.3f}' for v in msg.force]))
|
||||||
|
elif isinstance(msg, RecordFrameMsg):
|
||||||
|
|
||||||
|
self.record_frame_cnt += 1
|
||||||
|
self.record_size_cnt += msg.size
|
||||||
|
self.l_record_size.setText(humanbytes(self.record_size_cnt))
|
||||||
|
self.l_record_frames.setText(str(self.record_frame_cnt))
|
||||||
|
self.l_record_max_sid.setText(str(msg.current_sid))
|
||||||
|
|
||||||
def closeEvent(self, event):
|
def closeEvent(self, event):
|
||||||
self.p.send(KillMsg(''))
|
self.p.send(KillMsg(''))
|
||||||
@ -254,21 +311,25 @@ class Adv(QMainWindow, Ui_MainWindow):
|
|||||||
@QtCore.pyqtSlot(int)
|
@QtCore.pyqtSlot(int)
|
||||||
def c_sid(self, v):
|
def c_sid(self, v):
|
||||||
if self.s_sid.sender() is None:
|
if self.s_sid.sender() is None:
|
||||||
|
self.sp_sid.setValue(v)
|
||||||
self.p.send(MoveAxisMsg('ui', 'S', v))
|
self.p.send(MoveAxisMsg('ui', 'S', v))
|
||||||
|
|
||||||
@QtCore.pyqtSlot(int)
|
@QtCore.pyqtSlot(int)
|
||||||
def on_m(self, v):
|
def on_seq_meta(self, v):
|
||||||
if self.c_seq_meta.sender() is None or isinstance(self.c_seq_meta.sender(), QFrame):
|
if self.c_seq_meta.sender() is None or isinstance(self.c_seq_meta.sender(), QFrame):
|
||||||
if self.c_seq_meta.itemText(v) != 'Empty':
|
if self.c_seq_meta.itemText(v) != 'Empty':
|
||||||
|
self.b2 = True
|
||||||
|
self.update_b_play_live_enabled()
|
||||||
self.p.send(SetDeviceConfigMsg(self.c_seq_meta.itemData(v)))
|
self.p.send(SetDeviceConfigMsg(self.c_seq_meta.itemData(v)))
|
||||||
self.p.send(SeqMetaMsg(self.c_seq_meta.itemText(v)))
|
self.p.send(SeqMetaMsg('live', self.c_seq_meta.itemText(v)))
|
||||||
|
|
||||||
|
|
||||||
class MainUI(Node):
|
class MainUI(Node):
|
||||||
topics = [ImageArgMsg, SeqIdMinMax, MoveAxisMsg,
|
topics = [ImageArgMsg, SeqIdMinMax, MoveAxisMsg,
|
||||||
SeqListMsg, SeqMetaMsg,
|
SeqListMsg, SeqMetaMsg,
|
||||||
DeviceConnectedMsg, DeviceEnabledMsg, DeviceOnlineMsg, DeviceConfigListMsg,
|
DeviceConnectedMsg, DeviceEnabledMsg, DeviceOnlineMsg, DeviceConfigListMsg,
|
||||||
RobotRtsiMsg]
|
RobotRtsiMsg,
|
||||||
|
RecordFrameMsg]
|
||||||
|
|
||||||
def __init__(self, level=logging.INFO):
|
def __init__(self, level=logging.INFO):
|
||||||
super().__init__(level=level)
|
super().__init__(level=level)
|
||||||
|
|||||||
@ -26,12 +26,11 @@ class Ui_MainWindow(object):
|
|||||||
self.label_4 = QtWidgets.QLabel(parent=self.centralwidget)
|
self.label_4 = QtWidgets.QLabel(parent=self.centralwidget)
|
||||||
self.label_4.setObjectName("label_4")
|
self.label_4.setObjectName("label_4")
|
||||||
self.gridLayout_7.addWidget(self.label_4, 2, 0, 1, 1)
|
self.gridLayout_7.addWidget(self.label_4, 2, 0, 1, 1)
|
||||||
self.spinBox_7 = QtWidgets.QSpinBox(parent=self.centralwidget)
|
self.sp_sid = QtWidgets.QSpinBox(parent=self.centralwidget)
|
||||||
self.spinBox_7.setObjectName("spinBox_7")
|
self.sp_sid.setObjectName("sp_sid")
|
||||||
self.gridLayout_7.addWidget(self.spinBox_7, 2, 2, 1, 1)
|
self.gridLayout_7.addWidget(self.sp_sid, 2, 2, 1, 1)
|
||||||
self.b_play_playback = QtWidgets.QPushButton(parent=self.centralwidget)
|
self.b_play_playback = QtWidgets.QPushButton(parent=self.centralwidget)
|
||||||
self.b_play_playback.setEnabled(False)
|
self.b_play_playback.setEnabled(False)
|
||||||
self.b_play_playback.setStyleSheet("background-color : red")
|
|
||||||
self.b_play_playback.setObjectName("b_play_playback")
|
self.b_play_playback.setObjectName("b_play_playback")
|
||||||
self.gridLayout_7.addWidget(self.b_play_playback, 0, 0, 1, 3)
|
self.gridLayout_7.addWidget(self.b_play_playback, 0, 0, 1, 3)
|
||||||
self.c_playback_seq_name = QtWidgets.QComboBox(parent=self.centralwidget)
|
self.c_playback_seq_name = QtWidgets.QComboBox(parent=self.centralwidget)
|
||||||
@ -50,19 +49,41 @@ class Ui_MainWindow(object):
|
|||||||
self.l_record_commit.setEnabled(False)
|
self.l_record_commit.setEnabled(False)
|
||||||
self.l_record_commit.setObjectName("l_record_commit")
|
self.l_record_commit.setObjectName("l_record_commit")
|
||||||
self.gridLayout_6.addWidget(self.l_record_commit, 1, 1, 1, 1)
|
self.gridLayout_6.addWidget(self.l_record_commit, 1, 1, 1, 1)
|
||||||
|
self.label_17 = QtWidgets.QLabel(parent=self.centralwidget)
|
||||||
|
self.label_17.setObjectName("label_17")
|
||||||
|
self.gridLayout_6.addWidget(self.label_17, 1, 0, 1, 1)
|
||||||
self.b_record = QtWidgets.QPushButton(parent=self.centralwidget)
|
self.b_record = QtWidgets.QPushButton(parent=self.centralwidget)
|
||||||
self.b_record.setEnabled(False)
|
self.b_record.setEnabled(False)
|
||||||
self.b_record.setObjectName("b_record")
|
self.b_record.setObjectName("b_record")
|
||||||
self.gridLayout_6.addWidget(self.b_record, 1, 2, 1, 1)
|
self.gridLayout_6.addWidget(self.b_record, 1, 2, 1, 1)
|
||||||
self.label_17 = QtWidgets.QLabel(parent=self.centralwidget)
|
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
|
||||||
self.label_17.setObjectName("label_17")
|
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
|
||||||
self.gridLayout_6.addWidget(self.label_17, 1, 0, 1, 1)
|
|
||||||
self.b_play_live = QtWidgets.QPushButton(parent=self.centralwidget)
|
|
||||||
self.b_play_live.setObjectName("b_play_live")
|
|
||||||
self.gridLayout_6.addWidget(self.b_play_live, 0, 0, 1, 3)
|
|
||||||
self.label_18 = QtWidgets.QLabel(parent=self.centralwidget)
|
self.label_18 = QtWidgets.QLabel(parent=self.centralwidget)
|
||||||
self.label_18.setObjectName("label_18")
|
self.label_18.setObjectName("label_18")
|
||||||
self.gridLayout_6.addWidget(self.label_18, 2, 0, 1, 3)
|
self.horizontalLayout_2.addWidget(self.label_18)
|
||||||
|
self.l_record_frames = QtWidgets.QLabel(parent=self.centralwidget)
|
||||||
|
self.l_record_frames.setObjectName("l_record_frames")
|
||||||
|
self.horizontalLayout_2.addWidget(self.l_record_frames)
|
||||||
|
self.label_25 = QtWidgets.QLabel(parent=self.centralwidget)
|
||||||
|
self.label_25.setObjectName("label_25")
|
||||||
|
self.horizontalLayout_2.addWidget(self.label_25)
|
||||||
|
self.l_record_size = QtWidgets.QLabel(parent=self.centralwidget)
|
||||||
|
self.l_record_size.setObjectName("l_record_size")
|
||||||
|
self.horizontalLayout_2.addWidget(self.l_record_size)
|
||||||
|
self.label_26 = QtWidgets.QLabel(parent=self.centralwidget)
|
||||||
|
self.label_26.setObjectName("label_26")
|
||||||
|
self.horizontalLayout_2.addWidget(self.label_26)
|
||||||
|
self.l_record_max_sid = QtWidgets.QLabel(parent=self.centralwidget)
|
||||||
|
self.l_record_max_sid.setObjectName("l_record_max_sid")
|
||||||
|
self.horizontalLayout_2.addWidget(self.l_record_max_sid)
|
||||||
|
self.horizontalLayout_2.setStretch(1, 1)
|
||||||
|
self.horizontalLayout_2.setStretch(3, 1)
|
||||||
|
self.horizontalLayout_2.setStretch(5, 1)
|
||||||
|
self.gridLayout_6.addLayout(self.horizontalLayout_2, 2, 0, 1, 3)
|
||||||
|
self.b_play_live = QtWidgets.QPushButton(parent=self.centralwidget)
|
||||||
|
self.b_play_live.setEnabled(False)
|
||||||
|
self.b_play_live.setObjectName("b_play_live")
|
||||||
|
self.gridLayout_6.addWidget(self.b_play_live, 0, 0, 1, 3)
|
||||||
self.gridLayout.addLayout(self.gridLayout_6, 1, 0, 1, 1)
|
self.gridLayout.addLayout(self.gridLayout_6, 1, 0, 1, 1)
|
||||||
self.gridLayout_4 = QtWidgets.QGridLayout()
|
self.gridLayout_4 = QtWidgets.QGridLayout()
|
||||||
self.gridLayout_4.setObjectName("gridLayout_4")
|
self.gridLayout_4.setObjectName("gridLayout_4")
|
||||||
@ -316,10 +337,15 @@ class Ui_MainWindow(object):
|
|||||||
self.b_play_playback.setText(_translate("MainWindow", "Playback"))
|
self.b_play_playback.setText(_translate("MainWindow", "Playback"))
|
||||||
self.c_playback_seq_name.setItemText(0, _translate("MainWindow", "Unset"))
|
self.c_playback_seq_name.setItemText(0, _translate("MainWindow", "Unset"))
|
||||||
self.label_16.setText(_translate("MainWindow", "SeqName"))
|
self.label_16.setText(_translate("MainWindow", "SeqName"))
|
||||||
self.b_record.setText(_translate("MainWindow", "Record"))
|
|
||||||
self.label_17.setText(_translate("MainWindow", "RecordName"))
|
self.label_17.setText(_translate("MainWindow", "RecordName"))
|
||||||
|
self.b_record.setText(_translate("MainWindow", "Record"))
|
||||||
|
self.label_18.setText(_translate("MainWindow", "Record Frames:"))
|
||||||
|
self.l_record_frames.setText(_translate("MainWindow", "0"))
|
||||||
|
self.label_25.setText(_translate("MainWindow", "Record Size:"))
|
||||||
|
self.l_record_size.setText(_translate("MainWindow", "0"))
|
||||||
|
self.label_26.setText(_translate("MainWindow", "Max SeqId:"))
|
||||||
|
self.l_record_max_sid.setText(_translate("MainWindow", "0"))
|
||||||
self.b_play_live.setText(_translate("MainWindow", "Live"))
|
self.b_play_live.setText(_translate("MainWindow", "Live"))
|
||||||
self.label_18.setText(_translate("MainWindow", "Space left 1000GB"))
|
|
||||||
self.label_14.setText(_translate("MainWindow", "Yal"))
|
self.label_14.setText(_translate("MainWindow", "Yal"))
|
||||||
self.label_13.setText(_translate("MainWindow", "Pitch"))
|
self.label_13.setText(_translate("MainWindow", "Pitch"))
|
||||||
self.label_3.setText(_translate("MainWindow", "Probe Position"))
|
self.label_3.setText(_translate("MainWindow", "Probe Position"))
|
||||||
|
|||||||
@ -32,16 +32,13 @@
|
|||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="2">
|
<item row="2" column="2">
|
||||||
<widget class="QSpinBox" name="spinBox_7"/>
|
<widget class="QSpinBox" name="sp_sid"/>
|
||||||
</item>
|
</item>
|
||||||
<item row="0" column="0" colspan="3">
|
<item row="0" column="0" colspan="3">
|
||||||
<widget class="QPushButton" name="b_play_playback">
|
<widget class="QPushButton" name="b_play_playback">
|
||||||
<property name="enabled">
|
<property name="enabled">
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="styleSheet">
|
|
||||||
<string notr="true">background-color : red</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Playback</string>
|
<string>Playback</string>
|
||||||
</property>
|
</property>
|
||||||
@ -80,6 +77,13 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QLabel" name="label_17">
|
||||||
|
<property name="text">
|
||||||
|
<string>RecordName</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item row="1" column="2">
|
<item row="1" column="2">
|
||||||
<widget class="QPushButton" name="b_record">
|
<widget class="QPushButton" name="b_record">
|
||||||
<property name="enabled">
|
<property name="enabled">
|
||||||
@ -90,27 +94,62 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="0">
|
<item row="2" column="0" colspan="3">
|
||||||
<widget class="QLabel" name="label_17">
|
<layout class="QHBoxLayout" name="horizontalLayout_2" stretch="0,1,0,1,0,1">
|
||||||
<property name="text">
|
<item>
|
||||||
<string>RecordName</string>
|
<widget class="QLabel" name="label_18">
|
||||||
</property>
|
<property name="text">
|
||||||
</widget>
|
<string>Record Frames:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="l_record_frames">
|
||||||
|
<property name="text">
|
||||||
|
<string>0</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label_25">
|
||||||
|
<property name="text">
|
||||||
|
<string>Record Size:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="l_record_size">
|
||||||
|
<property name="text">
|
||||||
|
<string>0</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label_26">
|
||||||
|
<property name="text">
|
||||||
|
<string>Max SeqId:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="l_record_max_sid">
|
||||||
|
<property name="text">
|
||||||
|
<string>0</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item row="0" column="0" colspan="3">
|
<item row="0" column="0" colspan="3">
|
||||||
<widget class="QPushButton" name="b_play_live">
|
<widget class="QPushButton" name="b_play_live">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Live</string>
|
<string>Live</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="0" colspan="3">
|
|
||||||
<widget class="QLabel" name="label_18">
|
|
||||||
<property name="text">
|
|
||||||
<string>Space left 1000GB</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="1">
|
<item row="2" column="1">
|
||||||
|
|||||||
@ -28,6 +28,7 @@ class BG(Enum):
|
|||||||
DeviceConfigListMsg = auto()
|
DeviceConfigListMsg = auto()
|
||||||
SetRecordMsg = auto()
|
SetRecordMsg = auto()
|
||||||
RobotRtsiMsg = auto()
|
RobotRtsiMsg = auto()
|
||||||
|
RecordFrameMsg = auto()
|
||||||
|
|
||||||
|
|
||||||
class Msg:
|
class Msg:
|
||||||
@ -116,6 +117,7 @@ class DeviceOnlineMsg(BoolMsg):
|
|||||||
class SetRecordMsg(Msg):
|
class SetRecordMsg(Msg):
|
||||||
enable: bool
|
enable: bool
|
||||||
commit: str = ''
|
commit: str = ''
|
||||||
|
base: str = ''
|
||||||
|
|
||||||
|
|
||||||
class SetDeviceConfigMsg(StrMsg):
|
class SetDeviceConfigMsg(StrMsg):
|
||||||
@ -141,7 +143,8 @@ class SetPlayMode(StrMsg):
|
|||||||
|
|
||||||
@dataclasses.dataclass
|
@dataclasses.dataclass
|
||||||
class SeqMetaMsg(Msg):
|
class SeqMetaMsg(Msg):
|
||||||
s: str = ''
|
target: str
|
||||||
|
name: str
|
||||||
|
|
||||||
|
|
||||||
@dataclasses.dataclass
|
@dataclasses.dataclass
|
||||||
@ -169,6 +172,12 @@ class DeviceConfigListMsg(Msg):
|
|||||||
arr: list[tuple[str, str]]
|
arr: list[tuple[str, str]]
|
||||||
|
|
||||||
|
|
||||||
|
@dataclasses.dataclass
|
||||||
|
class RecordFrameMsg(Msg):
|
||||||
|
size: int
|
||||||
|
current_sid: int
|
||||||
|
|
||||||
|
|
||||||
class BMMsg(Msg):
|
class BMMsg(Msg):
|
||||||
def __init__(self, t: int, data: bytes):
|
def __init__(self, t: int, data: bytes):
|
||||||
self.data = data
|
self.data = data
|
||||||
|
|||||||
@ -232,7 +232,7 @@ class RfSequence:
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def seq_id_minmax(self):
|
def seq_id_minmax(self):
|
||||||
mmin = 1000000
|
mmin = 2**32
|
||||||
mmax = 0
|
mmax = 0
|
||||||
for f in self.frames:
|
for f in self.frames:
|
||||||
mmin = min(mmin, f.meta.sequence_id)
|
mmin = min(mmin, f.meta.sequence_id)
|
||||||
|
|||||||
2
uv.lock
2
uv.lock
@ -4331,6 +4331,8 @@ name = "pyqt6-qt6"
|
|||||||
version = "6.8.1"
|
version = "6.8.1"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
wheels = [
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/1d/19/b89eb6cecbdf1e65a44658a083693a967e9d428370026711b624e928a8ca/PyQt6_Qt6-6.8.1-1-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:2f4b8b55b1414b93f340f22e8c88d25550efcdebc4b65a3927dd947b73bd4358", size = 80877444 },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/87/1b/94d3710ee7ef93ee99c1dac512f631de5e310f6b21e43f474ef269f840b6/PyQt6_Qt6-6.8.1-1-py3-none-manylinux_2_39_aarch64.whl", hash = "sha256:98aa99fe38ae68c5318284cd28f3479ba538c40bf6ece293980abae0925c1b24", size = 79473622 },
|
||||||
{ url = "https://files.pythonhosted.org/packages/df/0a/c47a1cc272b418faff8af79b121f0cecd32b09d634253254e3a990432220/PyQt6_Qt6-6.8.1-py3-none-macosx_10_14_x86_64.whl", hash = "sha256:1eb8460a1fdb38d0b2458c2974c01d471c1e59e4eb19ea63fc447aaba3ad530e", size = 65754939 },
|
{ url = "https://files.pythonhosted.org/packages/df/0a/c47a1cc272b418faff8af79b121f0cecd32b09d634253254e3a990432220/PyQt6_Qt6-6.8.1-py3-none-macosx_10_14_x86_64.whl", hash = "sha256:1eb8460a1fdb38d0b2458c2974c01d471c1e59e4eb19ea63fc447aaba3ad530e", size = 65754939 },
|
||||||
{ url = "https://files.pythonhosted.org/packages/b1/e6/cc4fbc97a7d0955185e33add3ce00480f0023424d17ac6f864a504f60251/PyQt6_Qt6-6.8.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:9f3790c4ce4dc576e48b8718d55fb8743057e6cbd53a6ca1dd253ffbac9b7287", size = 59956028 },
|
{ url = "https://files.pythonhosted.org/packages/b1/e6/cc4fbc97a7d0955185e33add3ce00480f0023424d17ac6f864a504f60251/PyQt6_Qt6-6.8.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:9f3790c4ce4dc576e48b8718d55fb8743057e6cbd53a6ca1dd253ffbac9b7287", size = 59956028 },
|
||||||
{ url = "https://files.pythonhosted.org/packages/01/22/c2997fe76d765d9ba960e9a099238cb419a316362bdde50fedacc23e7c7d/PyQt6_Qt6-6.8.1-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:d6ca5d2b9d2ec0ee4a814b2175f641a5c4299cb80b45e0f5f8356632663f89b3", size = 72561636 },
|
{ url = "https://files.pythonhosted.org/packages/01/22/c2997fe76d765d9ba960e9a099238cb419a316362bdde50fedacc23e7c7d/PyQt6_Qt6-6.8.1-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:d6ca5d2b9d2ec0ee4a814b2175f641a5c4299cb80b45e0f5f8356632663f89b3", size = 72561636 },
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user