From 253516bb5bf112408f942deaedb75a453b886806 Mon Sep 17 00:00:00 2001 From: remilia Date: Sun, 23 Mar 2025 22:33:55 +0800 Subject: [PATCH] big fix #1 --- src/config.py | 3 + src/nodes/Device.py | 154 +++-- src/nodes/ImageFFMPEG.py | 2 +- src/nodes/MainUI.py | 187 ++++-- src/nodes/Mi.py | 131 ++++ src/nodes/Muxer.py | 11 +- src/nodes/Node.py | 11 + src/ui/Main.py | 618 +++++++++-------- src/ui/Main.ui | 1144 ++++++++++++++++++-------------- src/utils/Msg.py | 25 +- src/utils/network.py | 16 +- test/kdemain.py | 8 +- test/testDevice.py | 5 +- test/testrobotremotecontrol.py | 23 + 14 files changed, 1475 insertions(+), 863 deletions(-) create mode 100644 src/nodes/Mi.py create mode 100644 test/testrobotremotecontrol.py diff --git a/src/config.py b/src/config.py index 2ada8fa..f6839a3 100644 --- a/src/config.py +++ b/src/config.py @@ -10,6 +10,8 @@ LIVE_SOCKET_IP = '11.6.1.71' LIVE_REP_SOCKET_PORT = 5556 LIVE_SOCKET = f'{LIVE_SOCKET_IP}:5555' LIVE_REP_SOCKET = f'{LIVE_SOCKET_IP}:{LIVE_REP_SOCKET_PORT}' +MI_REP_SOCKET_PORT = 5557 +DEVICE_PY_REP_SOCKET_PORT = 5558 VIDEO_HEIGHT = 1920 VIDEO_WIDTH = 1080 @@ -22,6 +24,7 @@ BASE = Path(__file__).parent.parent DS = BASE / '@DS' DOC = BASE / 'doc' CONFIG = BASE / 'config' +ASSETS = BASE / 'assets' DS.mkdir(exist_ok=True, parents=True) DOC.mkdir(exist_ok=True, parents=True) DEVICE_CONFIG = CONFIG / 'device' diff --git a/src/nodes/Device.py b/src/nodes/Device.py index 8ea31bd..e0ee51b 100644 --- a/src/nodes/Device.py +++ b/src/nodes/Device.py @@ -2,46 +2,95 @@ import logging import struct import subprocess import time +from enum import Enum, auto from threading import Thread import zmq +from BusClient import BusClient from config import LIVE_REP_SOCKET, CONFIG, DEVICE_CONFIG from nodes.Node import Node from utils.Msg import ImageArgMsg, KillMsg, SetDeviceConnectedMsg, SetDeviceEnabledMsg, DeviceEnabledMsg, \ DeviceConnectedMsg, SetDeviceConfigMsg, DeviceOnlineMsg, DeviceConfigListMsg, RequestRfFrameMsg, RfFrameMsg, \ - RfFrameWithMetaMsg, DeviceZero + RfFrameWithMetaMsg, DeviceZero, SetDeviceSwitchMsg, DeviceSwitchMsg, SeqMetaMsg, RefreshDeviceMsg from utils.RfMeta import RfFrameMeta logger = logging.getLogger(__name__) +class DeviceCmd(Enum): + Exit = 0 + + GetName = auto() + GetData = auto() + GetConnection = auto() + GetEnable = auto() + + SetNameAndFileOnly = auto() + SetConnectionOn = auto() + SetConnectionOff = auto() + SetEnableOn = auto() + SetEnableOff = auto() + SetZero = auto() + class Device(Node): - topics = [SetDeviceConnectedMsg, SetDeviceEnabledMsg, SetDeviceConfigMsg, RequestRfFrameMsg, DeviceZero] + magic = 7355608 + topics = [SetDeviceConnectedMsg, SetDeviceEnabledMsg, SetDeviceConfigMsg, RequestRfFrameMsg, DeviceZero, + DeviceSwitchMsg + ] def __init__(self, level=logging.INFO): super(Device, self).__init__(level=level) self.arg = ImageArgMsg('', t_start=0, t_end=1499) self.seq_meta = None - self.device_rep_socket = None + self.device_rep_socket: zmq.Socket = None self.ok = b'ok\x00' self.loop2_t = None + self.switch = False def loop2(self): while True: self.online() time.sleep(1) + def device_cmd(self, cmd: DeviceCmd, v: bytes = b''): + self.device_rep_socket.send(struct.pack('i', self.magic) + struct.pack('i', cmd.value) + v) + def connect(self): - self.device_rep_socket.send(b'connect') - rb = self.device_rep_socket.recv() - if rb == self.ok: - self.send(DeviceConnectedMsg(True)) - else: - logger.error(f"Device msg: {rb}") + temp_client = BusClient(SetDeviceSwitchMsg,RefreshDeviceMsg, poller=True) + temp_client.poller.register(self.device_rep_socket, zmq.POLLIN) + self.device_cmd(DeviceCmd.SetConnectionOn) + logger.warning('onn') + d = dict(temp_client.poller.poll()) + + if self.device_rep_socket in d: + rb = self.device_rep_socket.recv() + if rb == self.ok: + self.send(DeviceConnectedMsg(True)) + else: + logger.error(f"Device msg: {rb}") + if temp_client.sub in d: + msg = temp_client.recv() + if isinstance(msg, SetDeviceSwitchMsg): + if not msg.value: + self.switch = False + logger.warning(f"interrupt connecting") + self.device_rep_socket.close() + self.context.term() + self.context = zmq.Context() + self.device_rep_socket = self.context.socket(zmq.REQ) + self.device_rep_socket.connect(f"tcp://{LIVE_REP_SOCKET}") + if isinstance(msg,RefreshDeviceMsg): + self.switch = False + logger.warning(f"interrupt connecting") + self.device_rep_socket.close() + self.context.term() + self.context = zmq.Context() + self.device_rep_socket = self.context.socket(zmq.REQ) + self.device_rep_socket.connect(f"tcp://{LIVE_REP_SOCKET}") def disconnect(self): - self.device_rep_socket.send(b'disconnect') + self.device_cmd(DeviceCmd.SetConnectionOff) rb = self.device_rep_socket.recv() if rb == self.ok: self.send(DeviceConnectedMsg(False)) @@ -49,7 +98,7 @@ class Device(Node): logger.error(f"Device msg: {rb}") def enable(self): - self.device_rep_socket.send(b'enable') + self.device_cmd(DeviceCmd.SetEnableOn) rb = self.device_rep_socket.recv() if rb == self.ok: self.send(DeviceEnabledMsg(True)) @@ -59,7 +108,7 @@ class Device(Node): return False def disable(self): - self.device_rep_socket.send(b'disable') + self.device_cmd(DeviceCmd.SetEnableOff) rb = self.device_rep_socket.recv() if rb == self.ok: self.send(DeviceEnabledMsg(False)) @@ -80,8 +129,8 @@ class Device(Node): self.send(DeviceOnlineMsg(True)) return True - def enabled(self): - self.device_rep_socket.send(b'enabled') + def get_enable(self): + self.device_cmd(DeviceCmd.GetEnable) rb = self.device_rep_socket.recv() match rb: case b'true': @@ -93,8 +142,14 @@ class Device(Node): case _: logger.error(f"Device msg: {rb}") - def connected(self): - self.device_rep_socket.send(b'connected') + def get_seq_meta_name(self): + self.device_cmd(DeviceCmd.GetName) + rb = self.device_rep_socket.recv() + if rb != b'': + self.send(SeqMetaMsg('live', rb.decode())) + + def get_connection(self): + self.device_cmd(DeviceCmd.GetConnection) rb = self.device_rep_socket.recv() match rb: case b'true': @@ -106,18 +161,20 @@ class Device(Node): case _: logger.error(f"Device msg: {rb}") - def setfile(self, config_str: str): - if self.enabled(): + def set_name_and_file(self, name: str, config_str: str): + if self.get_enable(): self.disable() - self.setfileonly(config_str) + self.set_name_and_file_only(name, config_str) self.enable() - elif self.connected(): - self.setfileonly(config_str) + elif self.get_connection(): + self.set_name_and_file_only(name, config_str) else: logger.warning(f"Device not connect, cannot set config") - def setfileonly(self, s: str): - self.device_rep_socket.send(b'fileonly' + s.encode()) + def set_name_and_file_only(self, name: str, txt: str): + name_encoded = name.encode() + self.device_cmd(DeviceCmd.SetNameAndFileOnly, + struct.pack('I', name_encoded.__len__()) + name.encode() + txt.encode()) rb = self.device_rep_socket.recv() if rb == self.ok: return True @@ -125,12 +182,12 @@ class Device(Node): logger.error(f"Device msg: {rb}") return False - def data(self): - self.device_rep_socket.send(b'data') + def get_data(self): + self.device_cmd(DeviceCmd.GetData) return self.device_rep_socket.recv() - def zero(self): - self.device_rep_socket.send(b'zero') + def set_zero(self): + self.device_cmd(DeviceCmd.SetZero) return self.device_rep_socket.recv() def custom_setup(self): @@ -141,10 +198,11 @@ class Device(Node): def loop(self): arr = [] - time.sleep(1) + time.sleep(3) if self.online(): - self.connected() - self.enabled() + self.get_connection() + self.get_enable() + self.get_seq_meta_name() for f in DEVICE_CONFIG.glob('*.txt'): arr.append((f.stem, f.read_text())) self.send(DeviceConfigListMsg(arr)) @@ -162,21 +220,35 @@ class Device(Node): else: self.disable() elif isinstance(msg, SetDeviceConnectedMsg): + logger.info('connecting to device') if msg.value: self.connect() else: self.disconnect() elif isinstance(msg, SetDeviceConfigMsg): - self.setfile(msg.value) + self.set_name_and_file(msg.name, msg.txt) + self.send(SeqMetaMsg('live', msg.name)) elif isinstance(msg, RequestRfFrameMsg): - braw = self.data() - if braw == b'': - continue - _, sequence_id, encoder = struct.unpack_from('=iqi', braw) - buffer = braw[4 + 8 + 4:] - # logger.debug('send') - self.send(RfFrameWithMetaMsg(0, RfFrameMeta( - encoder=encoder, sequence_id=sequence_id - ), buffer)) + if self.switch: + braw = self.get_data() + if braw == b'': + logger.warning('empty msg!') + continue + _, sequence_id, encoder = struct.unpack_from('=iqi', braw) + buffer = braw[4 + 8 + 4:] + # logger.debug('send') + self.send(RfFrameWithMetaMsg(0, RfFrameMeta( + encoder=encoder, sequence_id=sequence_id + ), buffer)) + else: + logger.warning('device not online') elif isinstance(msg, DeviceZero): - self.zero() + self.set_zero() + elif isinstance(msg, DeviceSwitchMsg): + self.switch = msg.value == 'GREEN' + # elif isinstance(msg, SetDeviceSwitchMsg): + # logger.info(f'{msg.value}') + # if msg.value: + # self.device_rep_socket.connect(f"tcp://{LIVE_REP_SOCKET}") + # else: + # self.device_rep_socket.close() diff --git a/src/nodes/ImageFFMPEG.py b/src/nodes/ImageFFMPEG.py index 3be7012..596ecf6 100644 --- a/src/nodes/ImageFFMPEG.py +++ b/src/nodes/ImageFFMPEG.py @@ -14,7 +14,7 @@ logger = logging.getLogger(__name__) class ImageFFMPEG(Node): - topics = [BMMsg, SetWindowVisibleMsg] + topics = [BMMsg] def __init__(self, level=logging.INFO): super().__init__(level=level) diff --git a/src/nodes/MainUI.py b/src/nodes/MainUI.py index d39c1d8..017351b 100644 --- a/src/nodes/MainUI.py +++ b/src/nodes/MainUI.py @@ -7,18 +7,19 @@ from enum import Enum, auto from pathlib import Path import zmq -from PyQt6 import QtCore, QtWidgets +from PyQt6 import QtCore, QtWidgets, QtGui from PyQt6.QtCore import QByteArray from PyQt6.QtWidgets import QMainWindow, QApplication, QFrame, QMessageBox, QFileDialog, QLineEdit from Main import Ui_MainWindow from ZMQReceiver import ZMQReceiver -from config import DS, SOFTWARE_CONFIG, IMAGING_CONFIG +from config import DS, SOFTWARE_CONFIG, IMAGING_CONFIG, ASSETS, MI_REP_SOCKET_PORT from nodes.Node import Node from utils.Msg import KillMsg, Msg, ImageArgMsg, SeqIdMinMax, MoveAxisMsg, SeqListMsg, SetBaseMsg, \ SetSeqMetaMsg, SetPlayMode, DeviceConnectedMsg, DeviceEnabledMsg, DeviceOnlineMsg, SetDeviceEnabledMsg, \ SetDeviceConnectedMsg, DeviceConfigListMsg, SetDeviceConfigMsg, SetRecordMsg, RobotRtsiMsg, RecordFrameMsg, \ - SeqIdList, SetWindowVisibleMsg, SetSidMsg, ImagingConfigNameListMsg, DeviceZero + SeqIdList, SetWindowVisibleMsg, SetSidMsg, ImagingConfigNameListMsg, DeviceZero, DeviceSwitchMsg, \ + SetDeviceSwitchMsg, SeqMetaMsg, RefreshDeviceMsg from utils.RfMeta import RfSequenceMeta logger = logging.getLogger(__name__) @@ -28,6 +29,16 @@ class LinkStatus(Enum): RED = auto() YELLOW = auto() GREEN = auto() + ORANGE = auto() + + +def get_style_sheet(name, color): + return f""" +#{name}{{ + background: {color}; + border-radius: 7px; +}} +""".strip() def humanbytes(B): @@ -55,6 +66,15 @@ class Adv(QMainWindow, Ui_MainWindow): super(Adv, self).__init__(parent) self.p = p self.setupUi(self) + self.device_switch_state: LinkStatus = LinkStatus.RED + icon = QtGui.QIcon() + icon.addPixmap(QtGui.QPixmap(str(ASSETS / 'switch_button.png'))) + self.b_probe_head_switch.setIcon(icon) + self.b_us_switch.setIcon(icon) + self.b_cobot_switch.setIcon(icon) + icon = QtGui.QIcon() + icon.addPixmap(QtGui.QPixmap(str(ASSETS / 'refresh_button.png'))) + self.b_us_refresh.setIcon(icon) zmq_receiver = ZMQReceiver(self) zmq_receiver.zmq_event.connect(self.on_zmq_event) zmq_receiver.start() @@ -66,15 +86,19 @@ class Adv(QMainWindow, Ui_MainWindow): self.arg = ImageArgMsg('ui', t_start=0, t_end=1499) self.b_base.clicked.connect(self.on_base_open) self.seq_meta: RfSequenceMeta | None = None - self.b_play_live.clicked.connect(self.on_play_live) - self.b_play_playback.clicked.connect(self.on_play_playback) + # self.b_play_live.clicked.connect(self.on_play_live) + # self.b_play_playback.clicked.connect(self.on_play_playback) + self.g_playback.clicked.connect(self.on_play_playback) + self.g_live.clicked.connect(self.on_play_live) + 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_live_seq_name.currentIndexChanged.connect(self.on_seq_meta) + # self.c_live_seq_name.currentIndexChanged.connect(self.on_seq_meta) + self.b_live_seq_apply.clicked.connect(self.on_seq_meta) self.l_base.setText(SOFTWARE_CONFIG.base_dir.__str__()) self.l_base.textChanged.connect(lambda e: self.l_base.setStyleSheet("") @@ -105,6 +129,45 @@ class Adv(QMainWindow, Ui_MainWindow): self.b_probe_stop.clicked.connect(self.on_probe('stop')) self.b_device_zero.clicked.connect(lambda: self.p.send(DeviceZero())) + self.b_us_switch.clicked.connect(self.on_deivce_switch) + self.b_us_refresh.clicked.connect(self.on_deivce_refresh) + + self.mi_req_socket = zmq.Context().socket(zmq.REQ) + self.mi_req_socket.connect(f"tcp://127.0.0.1:{MI_REP_SOCKET_PORT}") + + def on_deivce_switch(self): + match self.device_switch_state: + case LinkStatus.RED: + self.p.send(SetDeviceSwitchMsg(True)) + self.p.send(DeviceSwitchMsg('YELLOW')) + case LinkStatus.GREEN | LinkStatus.YELLOW | LinkStatus.ORANGE: + self.p.send(SetDeviceSwitchMsg(False)) + + def on_deivce_refresh(self): + match self.device_switch_state: + case LinkStatus.GREEN | LinkStatus.YELLOW | LinkStatus.ORANGE: + self.p.send(RefreshDeviceMsg()) + self.set_device_enable(LinkStatus.RED) + self.set_device_connection(LinkStatus.RED) + self.update_device_buttons() + + def on_device_switch_state(self): + match self.device_switch_state: + case LinkStatus.RED: + self.g_device.setEnabled(False) + self.g_us.setStyleSheet(get_style_sheet('g_us', 'pink')) + self.set_device_enable(LinkStatus.RED) + self.set_device_connection(LinkStatus.RED) + self.update_device_buttons() + case LinkStatus.YELLOW: + self.g_device.setEnabled(False) + self.g_us.setStyleSheet(get_style_sheet('g_us', 'yellow')) + case LinkStatus.GREEN: + self.g_device.setEnabled(True) + self.g_us.setStyleSheet(get_style_sheet('g_us', 'LightGreen')) + case LinkStatus.ORANGE: + self.g_device.setEnabled(False) + self.g_us.setStyleSheet(get_style_sheet('g_us', 'orange')) def on_probe(self, arg): def f(): @@ -134,14 +197,15 @@ class Adv(QMainWindow, Ui_MainWindow): base = QFileDialog.getExistingDirectory(self, 'Select Base Folder', DS.__str__()) self.l_base.setText(Path(base).__str__()) - def update_b_play_live_enabled(self): - self.b_play_live.setEnabled(all([self.b1, self.b2])) + # def update_b_play_live_enabled(self): + # self.b_play_live.setEnabled(all([self.b1, self.b2])) def on_base_open(self): if Path(self.l_base.text()): self.p.send(SetBaseMsg(self.l_base.text())) - self.b1 = True - self.update_b_play_live_enabled() + self.g_cap.setEnabled(True) + # self.b1 = True + # self.update_b_play_live_enabled() def set_device_connection(self, status: LinkStatus): match status: @@ -176,29 +240,33 @@ class Adv(QMainWindow, Ui_MainWindow): def update_c_playback_seq_name_enable(self): self.c_playback_seq_name.setEnabled(all([self.b3, self.b4])) - def on_play_live(self): - self.s_sid.setEnabled(False) - 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(SetSeqMetaMsg('live', self.c_live_seq_name.itemText(self.c_live_seq_name.currentIndex()))) - self.p.send(SetPlayMode('live')) - self.b3 = False - self.update_c_playback_seq_name_enable() + def on_play_live(self, b): + if b: + self.g_playback.setChecked(False) + # self.s_sid.setEnabled(False) + # 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(SetSeqMetaMsg('live', self.c_live_seq_name.itemText(self.c_live_seq_name.currentIndex()))) + self.p.send(SetPlayMode('live')) + self.b3 = False + self.update_c_playback_seq_name_enable() - def on_play_playback(self): - self.s_sid.setEnabled(True) - 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( - SetSeqMetaMsg('playback', self.c_playback_seq_name.itemText(self.c_playback_seq_name.currentIndex()))) - self.p.send(SetPlayMode('playback')) - logger.debug(f'set playmode playback') - self.b3 = True - self.update_c_playback_seq_name_enable() + def on_play_playback(self, b): + if b: + self.g_live.setChecked(False) + # self.s_sid.setEnabled(True) + # 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( + SetSeqMetaMsg('playback', self.c_playback_seq_name.itemText(self.c_playback_seq_name.currentIndex()))) + self.p.send(SetPlayMode('playback')) + logger.debug(f'set playmode playback') + self.b3 = True + self.update_c_playback_seq_name_enable() def on_device_disable(self): self.p.send(SetDeviceEnabledMsg(False)) @@ -216,6 +284,7 @@ class Adv(QMainWindow, Ui_MainWindow): self.set_device_connection(LinkStatus.YELLOW) def on_device_connect(self): + logger.info('btn pre') self.p.send(SetDeviceConnectedMsg(True)) self.b_device_connection.setEnabled(False) self.set_device_connection(LinkStatus.YELLOW) @@ -320,7 +389,7 @@ class Adv(QMainWindow, Ui_MainWindow): if msg.value.__len__() > 0: self.p.send(SetSeqMetaMsg('playback', 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, SetSeqMetaMsg): self.seq_meta = RfSequenceMeta.from_name(msg.name) mmax_shape0 = max(self.seq_meta.shape) @@ -338,15 +407,19 @@ class Adv(QMainWindow, Ui_MainWindow): else: self.set_device_enable(LinkStatus.RED) self.update_device_buttons() - elif isinstance(msg, DeviceOnlineMsg): - if msg.value: - self.l_online.setStyleSheet("") - self.l_online.setText("Device Online") - self.g_device.setDisabled(False) - else: - self.l_online.setStyleSheet("background-color: pink;") - self.l_online.setText("Device Offline") - self.g_device.setDisabled(True) + elif isinstance(msg, SeqMetaMsg): + if msg.target == 'live': + self.l_live_seq_name.setText(msg.name) + self.b_live_seq_apply.setEnabled(True) + # elif isinstance(msg, DeviceOnlineMsg): + # if msg.value: + # # self.l_online.setStyleSheet("") + # # self.l_online.setText("Device Online") + # self.g_device.setEnabled(True) + # else: + # # self.l_online.setStyleSheet("background-color: pink;") + # # self.l_online.setText("Device Offline") + # self.g_device.setEnabled(False) elif isinstance(msg, DeviceConfigListMsg): for name, txt in msg.arr: self.c_live_seq_name.addItem(name, txt) @@ -380,6 +453,9 @@ class Adv(QMainWindow, Ui_MainWindow): self.c_imaging_config.clear() for name in msg.value: self.c_imaging_config.addItem(name) + elif isinstance(msg, DeviceSwitchMsg): + self.device_switch_state = LinkStatus[msg.value] + self.on_device_switch_state() except Exception as e: logger.error(e) traceback.print_exception(e) @@ -421,14 +497,21 @@ class Adv(QMainWindow, Ui_MainWindow): if self.sp_sid.sender() is None: self.p.send(SetSidMsg(v)) - @QtCore.pyqtSlot(int) - def on_seq_meta(self, v): - if self.c_live_seq_name.sender() is None or isinstance(self.c_live_seq_name.sender(), QFrame): - if self.c_live_seq_name.itemText(v) != 'Empty': - self.b2 = True - self.update_b_play_live_enabled() - self.p.send(SetDeviceConfigMsg(self.c_live_seq_name.itemData(v))) - self.p.send(SetSeqMetaMsg('live', self.c_live_seq_name.itemText(v))) + # @QtCore.pyqtSlot(int) + def on_seq_meta(self): + v = self.c_live_seq_name.currentIndex() + name = self.c_live_seq_name.currentText() + if name != 'Empty': + self.b_live_seq_apply.setEnabled(False) + self.p.send(SetDeviceConfigMsg(name, self.c_live_seq_name.itemData(v))) + # self.p.send(SetSeqMetaMsg('live', self.c_live_seq_name.itemText(v))) + + # if self.c_live_seq_name.sender() is None or isinstance(self.c_live_seq_name.sender(), QFrame): + # if self.c_live_seq_name.itemText(v) != 'Empty': + # self.b2 = True + # # self.update_b_play_live_enabled() + # self.p.send(SetDeviceConfigMsg(self.c_live_seq_name.itemData(v))) + # self.p.send(SetSeqMetaMsg('live', self.c_live_seq_name.itemText(v))) class MainUI(Node): @@ -436,8 +519,8 @@ class MainUI(Node): ImagingConfigNameListMsg, SeqListMsg, SetSeqMetaMsg, SeqIdList, SetWindowVisibleMsg, SetSidMsg, DeviceConnectedMsg, DeviceEnabledMsg, DeviceOnlineMsg, DeviceConfigListMsg, - RobotRtsiMsg, - RecordFrameMsg] + RobotRtsiMsg, DeviceSwitchMsg, + RecordFrameMsg, SeqMetaMsg] def __init__(self, level=logging.INFO): super().__init__(level=level) diff --git a/src/nodes/Mi.py b/src/nodes/Mi.py new file mode 100644 index 0000000..802e9bf --- /dev/null +++ b/src/nodes/Mi.py @@ -0,0 +1,131 @@ +import logging +import struct +import subprocess +import time +from threading import Thread + +import zmq + +from config import LIVE_REP_SOCKET, CONFIG, DEVICE_CONFIG, MI_REP_SOCKET_PORT, DEVICE_PY_REP_SOCKET_PORT, LIVE_SOCKET_IP +from nodes.Node import Node +from utils.Msg import ImageArgMsg, KillMsg, SetDeviceConnectedMsg, SetDeviceEnabledMsg, DeviceEnabledMsg, \ + DeviceConnectedMsg, SetDeviceConfigMsg, DeviceOnlineMsg, DeviceConfigListMsg, RequestRfFrameMsg, RfFrameMsg, \ + RfFrameWithMetaMsg, DeviceZero, SetDeviceSwitchMsg, DeviceSwitchMsg, RefreshDeviceMsg +from utils.RfMeta import RfFrameMeta +from utils.mi import c1_connect, c1_connected, c1_disconnect +from utils.network import check_port + +logger = logging.getLogger(__name__) + + +class Mi(Node): + topics = [SetDeviceSwitchMsg,RefreshDeviceMsg] + + def __init__(self, level=logging.INFO): + super(Mi, self).__init__(level=level) + self.ping1enable = False + self.ping60enable = False + + def custom_setup(self): + self.mi_rep_socket = self.context.socket(zmq.REP) + self.mi_rep_socket.bind(f"tcp://*:{MI_REP_SOCKET_PORT}") + + self.device_py_req_socket = self.context.socket(zmq.REQ) + self.device_py_req_socket.connect(f"tcp://{LIVE_SOCKET_IP}:{DEVICE_PY_REP_SOCKET_PORT}") + + self.device_py_req_socket1s = self.context.socket(zmq.REQ) + self.device_py_req_socket1s.connect(f"tcp://{LIVE_SOCKET_IP}:{DEVICE_PY_REP_SOCKET_PORT}") + + self.device_py_req_socket60s = self.context.socket(zmq.REQ) + self.device_py_req_socket60s.connect(f"tcp://{LIVE_SOCKET_IP}:{DEVICE_PY_REP_SOCKET_PORT}") + + self.ping1s_thread = Thread(target=self.ping1s) + self.ping1s_thread.start() + self.ping60s_thread = Thread(target=self.ping60s) + self.ping60s_thread.start() + + self.c.poller.register(self.mi_rep_socket, zmq.POLLIN) + + def ping1s(self): + while True: + if self.ping1enable: + self.device_py_req_socket1s.send(b'get_device_status') + match self.device_py_req_socket1s.recv(): + case b'on': + self.send(DeviceSwitchMsg('GREEN')) + self.ping1enable = False + self.ping60enable = True + self.device_py_req_socket1s.send(b'start') + self.device_py_req_socket1s.recv() + case b'off': + pass + case b'err': + self.send(DeviceSwitchMsg('ORANGE')) + self.ping1enable = False + time.sleep(1) + + def ping60s(self): + while True: + if self.ping60enable: + self.device_py_req_socket60s.send(b'get_device_status') + match self.device_py_req_socket60s.recv(): + case b'off' | b'err': + self.send(DeviceSwitchMsg('ORANGE')) + self.ping60enable = False + self.device_py_req_socket60s.send(b'get_driver_status') + match self.device_py_req_socket60s.recv(): + case b'off' | b'err': + self.send(DeviceSwitchMsg('ORANGE')) + self.ping60enable = False + time.sleep(10) + + def loop(self): + if c1_connected() and check_port(LIVE_SOCKET_IP, DEVICE_PY_REP_SOCKET_PORT): + self.device_py_req_socket.send(b'get_device_status') + r = self.device_py_req_socket.recv() + if r == b'on': + self.device_py_req_socket.send(b'get_driver_status') + r = self.device_py_req_socket.recv() + if r == b'on': + self.send(DeviceSwitchMsg('GREEN')) + else: + self.send(DeviceSwitchMsg('ORANGE')) + else: + self.send(DeviceSwitchMsg('YELLOW')) + self.ping1enable = True + while True: + r = dict(self.c.poller.poll()) + # if self.mi_rep_socket in r: + # msg = self.mi_rep_socket.recv() + # if msg == b'c1_connected': + # c1_connected() + # + # if msg == b'c1_connect': + # c1_connect() + # if msg == b'c1_disconnect': + # c1_disconnect() + # self.mi_rep_socket.send(b'ok') + if self.c.sub in r: + msg = self.recv() + logger.info(f'{msg}') + if isinstance(msg, KillMsg): + if msg.name == '': + return + if isinstance(msg, SetDeviceSwitchMsg): + if msg.value: + c1_connect() + self.ping1enable = True + else: + self.ping60enable = False + c1_disconnect() + self.device_py_req_socket.send(b'kill') + self.device_py_req_socket.recv() + self.send(DeviceSwitchMsg('RED')) + elif isinstance(msg,RefreshDeviceMsg): + self.device_py_req_socket.send(b'kill') + self.device_py_req_socket.recv() + self.device_py_req_socket.send(b'start') + self.device_py_req_socket.recv() + self.send(DeviceSwitchMsg('GREEN')) + self.ping60enable = True + diff --git a/src/nodes/Muxer.py b/src/nodes/Muxer.py index cdb9876..2d087e6 100644 --- a/src/nodes/Muxer.py +++ b/src/nodes/Muxer.py @@ -8,7 +8,7 @@ import zmq from config import IMAGING_CONFIG from nodes.Node import Node from utils.Msg import ImageArgMsg, KillMsg, SetSeqMetaMsg, SetPlayMode, SetDeviceConfigMsg, \ - ImagingConfigNameListMsg, RfFrameWithMetaMsg, BeamformerMsg, RequestRfFrameMsg, RobotRtsiMsg + ImagingConfigNameListMsg, RfFrameWithMetaMsg, BeamformerMsg, RequestRfFrameMsg, RobotRtsiMsg, SeqMetaMsg from utils.RfFile import RfSequenceMeta logger = logging.getLogger(__name__) @@ -16,7 +16,7 @@ logger = logging.getLogger(__name__) class Muxer(Node): topics = [SetSeqMetaMsg, SetPlayMode, SetDeviceConfigMsg, RfFrameWithMetaMsg, RequestRfFrameMsg, - ImageArgMsg, RobotRtsiMsg] + ImageArgMsg, RobotRtsiMsg, SeqMetaMsg] def __init__(self, level=logging.INFO): super(Muxer, self).__init__(level=level) @@ -93,10 +93,13 @@ class Muxer(Node): self.arg = msg elif isinstance(msg, SetSeqMetaMsg): 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) + elif isinstance(msg, SeqMetaMsg): + logger.info(f'use live {msg}') + match msg.target: + case 'live': + self.seq_meta_live = RfSequenceMeta.from_name(msg.name) elif isinstance(msg, SetPlayMode): logger.debug(f'set playmode {msg}') self.play_mode = msg.value diff --git a/src/nodes/Node.py b/src/nodes/Node.py index 039b201..4b6c865 100644 --- a/src/nodes/Node.py +++ b/src/nodes/Node.py @@ -39,6 +39,17 @@ class Node: FORMAT = '[%(asctime)s] p%(process)s {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s' FORMAT = '"%(pathname)s:%(lineno)d" [%(asctime)s.%(msecs)03d] %(levelname)s - %(message)s' logging.basicConfig(level=self.level, format=FORMAT,datefmt = '%Y-%m-%d %H:%M:%S',) + rootLogger = logging.getLogger() + + logFormatter = logging.Formatter(FORMAT,datefmt = '%Y-%m-%d %H:%M:%S',) + + fileHandler = logging.FileHandler("log.log") + fileHandler.setFormatter(logFormatter) + rootLogger.addHandler(fileHandler) + + # consoleHandler = logging.StreamHandler() + # consoleHandler.setFormatter(logFormatter) + # rootLogger.addHandler(consoleHandler) self.context = zmq.Context() if self.enable_init: diff --git a/src/ui/Main.py b/src/ui/Main.py index 73111eb..5d024a0 100644 --- a/src/ui/Main.py +++ b/src/ui/Main.py @@ -12,24 +12,44 @@ from PyQt6 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") - MainWindow.resize(1158, 998) + MainWindow.resize(1238, 999) self.centralwidget = QtWidgets.QWidget(parent=MainWindow) self.centralwidget.setObjectName("centralwidget") self.gridLayout = QtWidgets.QGridLayout(self.centralwidget) self.gridLayout.setObjectName("gridLayout") - self.g_device = QtWidgets.QGroupBox(parent=self.centralwidget) + self.g_us = QtWidgets.QGroupBox(parent=self.centralwidget) + self.g_us.setStyleSheet("#g_us{\n" +" background: pink;\n" +"border-radius: 7px;\n" +"}") + self.g_us.setObjectName("g_us") + self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.g_us) + self.verticalLayout_2.setObjectName("verticalLayout_2") + self.horizontalLayout_9 = QtWidgets.QHBoxLayout() + self.horizontalLayout_9.setObjectName("horizontalLayout_9") + self.label_30 = QtWidgets.QLabel(parent=self.g_us) + font = QtGui.QFont() + font.setPointSize(15) + self.label_30.setFont(font) + self.label_30.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) + self.label_30.setObjectName("label_30") + self.horizontalLayout_9.addWidget(self.label_30) + self.b_us_refresh = QtWidgets.QPushButton(parent=self.g_us) + self.b_us_refresh.setText("") + self.b_us_refresh.setObjectName("b_us_refresh") + self.horizontalLayout_9.addWidget(self.b_us_refresh) + self.b_us_switch = QtWidgets.QPushButton(parent=self.g_us) + self.b_us_switch.setText("") + self.b_us_switch.setObjectName("b_us_switch") + self.horizontalLayout_9.addWidget(self.b_us_switch) + self.horizontalLayout_9.setStretch(0, 1) + self.verticalLayout_2.addLayout(self.horizontalLayout_9) + self.g_device = QtWidgets.QGroupBox(parent=self.g_us) self.g_device.setEnabled(True) + self.g_device.setTitle("") self.g_device.setObjectName("g_device") self.verticalLayout = QtWidgets.QVBoxLayout(self.g_device) self.verticalLayout.setObjectName("verticalLayout") - self.l_online = QtWidgets.QLabel(parent=self.g_device) - font = QtGui.QFont() - font.setPointSize(15) - self.l_online.setFont(font) - self.l_online.setStyleSheet("background-color: pink;") - self.l_online.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) - self.l_online.setObjectName("l_online") - self.verticalLayout.addWidget(self.l_online) self.gridLayout_8 = QtWidgets.QGridLayout() self.gridLayout_8.setObjectName("gridLayout_8") self.b_device_connection = QtWidgets.QPushButton(parent=self.g_device) @@ -58,22 +78,34 @@ class Ui_MainWindow(object): self.gridLayout_8.setColumnStretch(1, 1) self.gridLayout_8.setColumnStretch(3, 1) self.verticalLayout.addLayout(self.gridLayout_8) - self.horizontalLayout = QtWidgets.QHBoxLayout() - self.horizontalLayout.setObjectName("horizontalLayout") - self.label_20 = QtWidgets.QLabel(parent=self.g_device) - self.label_20.setObjectName("label_20") - self.horizontalLayout.addWidget(self.label_20) + self.gridLayout_7 = QtWidgets.QGridLayout() + self.gridLayout_7.setObjectName("gridLayout_7") + self.label_32 = QtWidgets.QLabel(parent=self.g_device) + self.label_32.setObjectName("label_32") + self.gridLayout_7.addWidget(self.label_32, 1, 0, 1, 1) self.c_live_seq_name = QtWidgets.QComboBox(parent=self.g_device) self.c_live_seq_name.setEnabled(False) self.c_live_seq_name.setObjectName("c_live_seq_name") self.c_live_seq_name.addItem("") - self.horizontalLayout.addWidget(self.c_live_seq_name) - self.horizontalLayout.setStretch(1, 1) - self.verticalLayout.addLayout(self.horizontalLayout) + self.gridLayout_7.addWidget(self.c_live_seq_name, 0, 1, 1, 1) + self.label_20 = QtWidgets.QLabel(parent=self.g_device) + self.label_20.setObjectName("label_20") + self.gridLayout_7.addWidget(self.label_20, 0, 0, 1, 1) + self.b_live_seq_apply = QtWidgets.QPushButton(parent=self.g_device) + self.b_live_seq_apply.setObjectName("b_live_seq_apply") + self.gridLayout_7.addWidget(self.b_live_seq_apply, 0, 2, 1, 1) + self.l_live_seq_name = QtWidgets.QLabel(parent=self.g_device) + self.l_live_seq_name.setObjectName("l_live_seq_name") + self.gridLayout_7.addWidget(self.l_live_seq_name, 1, 1, 1, 2) + self.gridLayout_7.setColumnStretch(1, 1) + self.verticalLayout.addLayout(self.gridLayout_7) self.b_device_zero = QtWidgets.QPushButton(parent=self.g_device) self.b_device_zero.setObjectName("b_device_zero") self.verticalLayout.addWidget(self.b_device_zero) - self.gridLayout.addWidget(self.g_device, 0, 0, 1, 1) + self.verticalLayout.setStretch(1, 1) + self.verticalLayout_2.addWidget(self.g_device) + self.verticalLayout_2.setStretch(1, 1) + self.gridLayout.addWidget(self.g_us, 0, 0, 1, 1) self.gridLayout_4 = QtWidgets.QGridLayout() self.gridLayout_4.setObjectName("gridLayout_4") self.label_14 = QtWidgets.QLabel(parent=self.centralwidget) @@ -157,22 +189,220 @@ class Ui_MainWindow(object): self.horizontalSlider_8.setObjectName("horizontalSlider_8") self.gridLayout_4.addWidget(self.horizontalSlider_8, 6, 1, 1, 1) self.gridLayout.addLayout(self.gridLayout_4, 3, 1, 1, 1) - self.horizontalLayout_4 = QtWidgets.QHBoxLayout() - self.horizontalLayout_4.setObjectName("horizontalLayout_4") - self.label = QtWidgets.QLabel(parent=self.centralwidget) - self.label.setObjectName("label") - self.horizontalLayout_4.addWidget(self.label) - self.l_base = QtWidgets.QLineEdit(parent=self.centralwidget) - self.l_base.setText("") - self.l_base.setObjectName("l_base") - self.horizontalLayout_4.addWidget(self.l_base) - self.b_select_base = QtWidgets.QPushButton(parent=self.centralwidget) - self.b_select_base.setObjectName("b_select_base") - self.horizontalLayout_4.addWidget(self.b_select_base) - self.b_base = QtWidgets.QPushButton(parent=self.centralwidget) - self.b_base.setObjectName("b_base") - self.horizontalLayout_4.addWidget(self.b_base) - self.gridLayout.addLayout(self.horizontalLayout_4, 4, 0, 1, 2) + self.horizontalLayout_6 = QtWidgets.QHBoxLayout() + self.horizontalLayout_6.setObjectName("horizontalLayout_6") + self.cb_bscan = QtWidgets.QCheckBox(parent=self.centralwidget) + self.cb_bscan.setChecked(True) + self.cb_bscan.setObjectName("cb_bscan") + self.horizontalLayout_6.addWidget(self.cb_bscan) + self.checkBox = QtWidgets.QCheckBox(parent=self.centralwidget) + self.checkBox.setObjectName("checkBox") + self.horizontalLayout_6.addWidget(self.checkBox) + spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) + self.horizontalLayout_6.addItem(spacerItem1) + self.gridLayout.addLayout(self.horizontalLayout_6, 5, 0, 1, 2) + self.g_cap = QtWidgets.QGroupBox(parent=self.centralwidget) + self.g_cap.setEnabled(False) + self.g_cap.setObjectName("g_cap") + self.horizontalLayout_8 = QtWidgets.QHBoxLayout(self.g_cap) + self.horizontalLayout_8.setObjectName("horizontalLayout_8") + self.g_live = QtWidgets.QGroupBox(parent=self.g_cap) + self.g_live.setCheckable(True) + self.g_live.setChecked(False) + self.g_live.setObjectName("g_live") + self.verticalLayout_6 = QtWidgets.QVBoxLayout(self.g_live) + self.verticalLayout_6.setObjectName("verticalLayout_6") + self.horizontalLayout_12 = QtWidgets.QHBoxLayout() + self.horizontalLayout_12.setObjectName("horizontalLayout_12") + self.label_17 = QtWidgets.QLabel(parent=self.g_live) + self.label_17.setObjectName("label_17") + self.horizontalLayout_12.addWidget(self.label_17) + self.l_record_commit = QtWidgets.QLineEdit(parent=self.g_live) + self.l_record_commit.setEnabled(False) + self.l_record_commit.setObjectName("l_record_commit") + self.horizontalLayout_12.addWidget(self.l_record_commit) + self.b_record = QtWidgets.QPushButton(parent=self.g_live) + self.b_record.setEnabled(False) + self.b_record.setObjectName("b_record") + self.horizontalLayout_12.addWidget(self.b_record) + self.verticalLayout_6.addLayout(self.horizontalLayout_12) + self.horizontalLayout_2 = QtWidgets.QHBoxLayout() + self.horizontalLayout_2.setObjectName("horizontalLayout_2") + self.label_18 = QtWidgets.QLabel(parent=self.g_live) + self.label_18.setObjectName("label_18") + self.horizontalLayout_2.addWidget(self.label_18) + self.l_record_frames = QtWidgets.QLabel(parent=self.g_live) + self.l_record_frames.setObjectName("l_record_frames") + self.horizontalLayout_2.addWidget(self.l_record_frames) + self.label_25 = QtWidgets.QLabel(parent=self.g_live) + self.label_25.setObjectName("label_25") + self.horizontalLayout_2.addWidget(self.label_25) + self.l_record_size = QtWidgets.QLabel(parent=self.g_live) + self.l_record_size.setObjectName("l_record_size") + self.horizontalLayout_2.addWidget(self.l_record_size) + self.label_26 = QtWidgets.QLabel(parent=self.g_live) + self.label_26.setObjectName("label_26") + self.horizontalLayout_2.addWidget(self.label_26) + self.l_record_max_sid = QtWidgets.QLabel(parent=self.g_live) + 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.verticalLayout_6.addLayout(self.horizontalLayout_2) + self.verticalLayout_6.setStretch(0, 1) + self.horizontalLayout_8.addWidget(self.g_live) + self.g_playback = QtWidgets.QGroupBox(parent=self.g_cap) + self.g_playback.setCheckable(True) + self.g_playback.setChecked(False) + self.g_playback.setObjectName("g_playback") + self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.g_playback) + self.verticalLayout_3.setObjectName("verticalLayout_3") + self.gridLayout_6 = QtWidgets.QGridLayout() + self.gridLayout_6.setObjectName("gridLayout_6") + self.sp_sid = QtWidgets.QSpinBox(parent=self.g_playback) + self.sp_sid.setObjectName("sp_sid") + self.gridLayout_6.addWidget(self.sp_sid, 1, 2, 1, 1) + self.label_4 = QtWidgets.QLabel(parent=self.g_playback) + self.label_4.setObjectName("label_4") + self.gridLayout_6.addWidget(self.label_4, 1, 0, 1, 1) + self.label_16 = QtWidgets.QLabel(parent=self.g_playback) + self.label_16.setObjectName("label_16") + self.gridLayout_6.addWidget(self.label_16, 0, 0, 1, 1) + self.c_playback_seq_name = QtWidgets.QComboBox(parent=self.g_playback) + self.c_playback_seq_name.setEnabled(False) + self.c_playback_seq_name.setEditable(False) + self.c_playback_seq_name.setObjectName("c_playback_seq_name") + self.c_playback_seq_name.addItem("") + self.gridLayout_6.addWidget(self.c_playback_seq_name, 0, 1, 1, 2) + self.s_sid = QtWidgets.QSlider(parent=self.g_playback) + self.s_sid.setOrientation(QtCore.Qt.Orientation.Horizontal) + self.s_sid.setObjectName("s_sid") + self.gridLayout_6.addWidget(self.s_sid, 1, 1, 1, 1) + self.verticalLayout_3.addLayout(self.gridLayout_6) + self.horizontalLayout_5 = QtWidgets.QHBoxLayout() + self.horizontalLayout_5.setObjectName("horizontalLayout_5") + self.label26 = QtWidgets.QLabel(parent=self.g_playback) + self.label26.setObjectName("label26") + self.horizontalLayout_5.addWidget(self.label26) + self.l_seq_min = QtWidgets.QLabel(parent=self.g_playback) + self.l_seq_min.setObjectName("l_seq_min") + self.horizontalLayout_5.addWidget(self.l_seq_min) + self.label_28 = QtWidgets.QLabel(parent=self.g_playback) + self.label_28.setObjectName("label_28") + self.horizontalLayout_5.addWidget(self.label_28) + self.l_seq_current = QtWidgets.QLabel(parent=self.g_playback) + self.l_seq_current.setObjectName("l_seq_current") + self.horizontalLayout_5.addWidget(self.l_seq_current) + self.label_29 = QtWidgets.QLabel(parent=self.g_playback) + self.label_29.setObjectName("label_29") + self.horizontalLayout_5.addWidget(self.label_29) + self.l_seq_max = QtWidgets.QLabel(parent=self.g_playback) + self.l_seq_max.setObjectName("l_seq_max") + self.horizontalLayout_5.addWidget(self.l_seq_max) + self.horizontalLayout_5.setStretch(1, 1) + self.horizontalLayout_5.setStretch(3, 1) + self.horizontalLayout_5.setStretch(5, 1) + self.verticalLayout_3.addLayout(self.horizontalLayout_5) + self.horizontalLayout_8.addWidget(self.g_playback) + self.gridLayout.addWidget(self.g_cap, 2, 0, 1, 2) + self.g_cobot = QtWidgets.QGroupBox(parent=self.centralwidget) + self.g_cobot.setStyleSheet("#g_cobot {\n" +" background: pink;\n" +"border-radius: 7px;\n" +"}") + self.g_cobot.setTitle("") + self.g_cobot.setObjectName("g_cobot") + self.gridLayout_3 = QtWidgets.QGridLayout(self.g_cobot) + self.gridLayout_3.setObjectName("gridLayout_3") + self.groupBox_2 = QtWidgets.QGroupBox(parent=self.g_cobot) + self.groupBox_2.setTitle("") + self.groupBox_2.setObjectName("groupBox_2") + self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.groupBox_2) + self.verticalLayout_4.setObjectName("verticalLayout_4") + self.gridLayout_2 = QtWidgets.QGridLayout() + self.gridLayout_2.setObjectName("gridLayout_2") + self.ln_rz = QtWidgets.QLCDNumber(parent=self.groupBox_2) + self.ln_rz.setDigitCount(6) + self.ln_rz.setSegmentStyle(QtWidgets.QLCDNumber.SegmentStyle.Flat) + self.ln_rz.setObjectName("ln_rz") + self.gridLayout_2.addWidget(self.ln_rz, 0, 6, 1, 1) + self.ln_frx = QtWidgets.QLCDNumber(parent=self.groupBox_2) + self.ln_frx.setSegmentStyle(QtWidgets.QLCDNumber.SegmentStyle.Flat) + self.ln_frx.setObjectName("ln_frx") + self.gridLayout_2.addWidget(self.ln_frx, 1, 4, 1, 1) + self.ln_frz = QtWidgets.QLCDNumber(parent=self.groupBox_2) + self.ln_frz.setSegmentStyle(QtWidgets.QLCDNumber.SegmentStyle.Flat) + self.ln_frz.setObjectName("ln_frz") + self.gridLayout_2.addWidget(self.ln_frz, 1, 6, 1, 1) + self.ln_fx = QtWidgets.QLCDNumber(parent=self.groupBox_2) + self.ln_fx.setSegmentStyle(QtWidgets.QLCDNumber.SegmentStyle.Flat) + self.ln_fx.setObjectName("ln_fx") + self.gridLayout_2.addWidget(self.ln_fx, 1, 1, 1, 1) + self.ln_rx = QtWidgets.QLCDNumber(parent=self.groupBox_2) + self.ln_rx.setDigitCount(6) + self.ln_rx.setSegmentStyle(QtWidgets.QLCDNumber.SegmentStyle.Flat) + self.ln_rx.setObjectName("ln_rx") + self.gridLayout_2.addWidget(self.ln_rx, 0, 4, 1, 1) + self.ln_z = QtWidgets.QLCDNumber(parent=self.groupBox_2) + self.ln_z.setDigitCount(6) + self.ln_z.setSegmentStyle(QtWidgets.QLCDNumber.SegmentStyle.Flat) + self.ln_z.setObjectName("ln_z") + self.gridLayout_2.addWidget(self.ln_z, 0, 3, 1, 1) + self.ln_fry = QtWidgets.QLCDNumber(parent=self.groupBox_2) + self.ln_fry.setSegmentStyle(QtWidgets.QLCDNumber.SegmentStyle.Flat) + self.ln_fry.setObjectName("ln_fry") + self.gridLayout_2.addWidget(self.ln_fry, 1, 5, 1, 1) + self.ln_y = QtWidgets.QLCDNumber(parent=self.groupBox_2) + self.ln_y.setDigitCount(6) + self.ln_y.setSegmentStyle(QtWidgets.QLCDNumber.SegmentStyle.Flat) + self.ln_y.setObjectName("ln_y") + self.gridLayout_2.addWidget(self.ln_y, 0, 2, 1, 1) + self.label_23 = QtWidgets.QLabel(parent=self.groupBox_2) + self.label_23.setObjectName("label_23") + self.gridLayout_2.addWidget(self.label_23, 1, 0, 1, 1) + self.ln_fz = QtWidgets.QLCDNumber(parent=self.groupBox_2) + self.ln_fz.setSmallDecimalPoint(False) + self.ln_fz.setSegmentStyle(QtWidgets.QLCDNumber.SegmentStyle.Flat) + self.ln_fz.setProperty("value", 0.01) + self.ln_fz.setObjectName("ln_fz") + self.gridLayout_2.addWidget(self.ln_fz, 1, 3, 1, 1) + self.ln_fy = QtWidgets.QLCDNumber(parent=self.groupBox_2) + self.ln_fy.setSegmentStyle(QtWidgets.QLCDNumber.SegmentStyle.Flat) + self.ln_fy.setObjectName("ln_fy") + self.gridLayout_2.addWidget(self.ln_fy, 1, 2, 1, 1) + self.ln_x = QtWidgets.QLCDNumber(parent=self.groupBox_2) + self.ln_x.setDigitCount(6) + self.ln_x.setSegmentStyle(QtWidgets.QLCDNumber.SegmentStyle.Flat) + self.ln_x.setObjectName("ln_x") + self.gridLayout_2.addWidget(self.ln_x, 0, 1, 1, 1) + self.ln_ry = QtWidgets.QLCDNumber(parent=self.groupBox_2) + self.ln_ry.setDigitCount(6) + self.ln_ry.setSegmentStyle(QtWidgets.QLCDNumber.SegmentStyle.Flat) + self.ln_ry.setObjectName("ln_ry") + self.gridLayout_2.addWidget(self.ln_ry, 0, 5, 1, 1) + self.label_22 = QtWidgets.QLabel(parent=self.groupBox_2) + self.label_22.setObjectName("label_22") + self.gridLayout_2.addWidget(self.label_22, 0, 0, 1, 1) + self.verticalLayout_4.addLayout(self.gridLayout_2) + self.gridLayout_3.addWidget(self.groupBox_2, 1, 0, 1, 1) + self.horizontalLayout_10 = QtWidgets.QHBoxLayout() + self.horizontalLayout_10.setObjectName("horizontalLayout_10") + self.label_19 = QtWidgets.QLabel(parent=self.g_cobot) + font = QtGui.QFont() + font.setPointSize(15) + self.label_19.setFont(font) + self.label_19.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) + self.label_19.setObjectName("label_19") + self.horizontalLayout_10.addWidget(self.label_19) + self.b_cobot_switch = QtWidgets.QPushButton(parent=self.g_cobot) + self.b_cobot_switch.setText("") + self.b_cobot_switch.setObjectName("b_cobot_switch") + self.horizontalLayout_10.addWidget(self.b_cobot_switch) + self.horizontalLayout_10.setStretch(0, 1) + self.gridLayout_3.addLayout(self.horizontalLayout_10, 0, 0, 1, 1) + self.gridLayout_3.setRowStretch(1, 1) + self.gridLayout.addWidget(self.g_cobot, 0, 1, 2, 1) self.gridLayout_5 = QtWidgets.QGridLayout() self.gridLayout_5.setObjectName("gridLayout_5") self.spinBox_3 = QtWidgets.QSpinBox(parent=self.centralwidget) @@ -191,8 +421,8 @@ class Ui_MainWindow(object): self.horizontalSlider_2.setOrientation(QtCore.Qt.Orientation.Horizontal) self.horizontalSlider_2.setObjectName("horizontalSlider_2") self.gridLayout_5.addWidget(self.horizontalSlider_2, 5, 1, 1, 1) - spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding) - self.gridLayout_5.addItem(spacerItem1, 7, 1, 1, 1) + spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding) + self.gridLayout_5.addItem(spacerItem2, 7, 1, 1, 1) self.label_2 = QtWidgets.QLabel(parent=self.centralwidget) font = QtGui.QFont() font.setPointSize(20) @@ -241,211 +471,75 @@ class Ui_MainWindow(object): self.horizontalLayout_3.setStretch(1, 1) self.gridLayout_5.addLayout(self.horizontalLayout_3, 2, 0, 1, 3) self.gridLayout.addLayout(self.gridLayout_5, 3, 0, 1, 1) - self.horizontalLayout_6 = QtWidgets.QHBoxLayout() - self.horizontalLayout_6.setObjectName("horizontalLayout_6") - self.cb_bscan = QtWidgets.QCheckBox(parent=self.centralwidget) - self.cb_bscan.setChecked(True) - self.cb_bscan.setObjectName("cb_bscan") - self.horizontalLayout_6.addWidget(self.cb_bscan) - self.checkBox = QtWidgets.QCheckBox(parent=self.centralwidget) - self.checkBox.setObjectName("checkBox") - self.horizontalLayout_6.addWidget(self.checkBox) - spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) - self.horizontalLayout_6.addItem(spacerItem2) - self.gridLayout.addLayout(self.horizontalLayout_6, 5, 0, 1, 2) - self.gridLayout_6 = QtWidgets.QGridLayout() - self.gridLayout_6.setObjectName("gridLayout_6") - self.l_record_commit = QtWidgets.QLineEdit(parent=self.centralwidget) - self.l_record_commit.setEnabled(False) - self.l_record_commit.setObjectName("l_record_commit") - 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.setEnabled(False) - self.b_record.setObjectName("b_record") - self.gridLayout_6.addWidget(self.b_record, 1, 2, 1, 1) - self.horizontalLayout_2 = QtWidgets.QHBoxLayout() - self.horizontalLayout_2.setObjectName("horizontalLayout_2") - self.label_18 = QtWidgets.QLabel(parent=self.centralwidget) - self.label_18.setObjectName("label_18") - 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.g_probe_head = QtWidgets.QGroupBox(parent=self.centralwidget) + self.g_probe_head.setStyleSheet("#g_probe_head {\n" +" background: pink;\n" +"border-radius: 7px;\n" +"}") + self.g_probe_head.setTitle("") + self.g_probe_head.setObjectName("g_probe_head") + self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.g_probe_head) + self.verticalLayout_5.setObjectName("verticalLayout_5") self.horizontalLayout_7 = QtWidgets.QHBoxLayout() self.horizontalLayout_7.setObjectName("horizontalLayout_7") - self.b_probe_start = QtWidgets.QPushButton(parent=self.centralwidget) - self.b_probe_start.setObjectName("b_probe_start") - self.horizontalLayout_7.addWidget(self.b_probe_start) - self.b_probe_stop = QtWidgets.QPushButton(parent=self.centralwidget) - self.b_probe_stop.setObjectName("b_probe_stop") - self.horizontalLayout_7.addWidget(self.b_probe_stop) - self.l_probe_angle = QtWidgets.QLabel(parent=self.centralwidget) - self.l_probe_angle.setObjectName("l_probe_angle") - self.horizontalLayout_7.addWidget(self.l_probe_angle) - self.b_probe_single = QtWidgets.QPushButton(parent=self.centralwidget) - self.b_probe_single.setObjectName("b_probe_single") - self.horizontalLayout_7.addWidget(self.b_probe_single) - self.b_probe_orig = QtWidgets.QPushButton(parent=self.centralwidget) - self.b_probe_orig.setObjectName("b_probe_orig") - self.horizontalLayout_7.addWidget(self.b_probe_orig) - self.gridLayout.addLayout(self.horizontalLayout_7, 2, 0, 1, 2) - self.gridLayout_2 = QtWidgets.QGridLayout() - self.gridLayout_2.setObjectName("gridLayout_2") - self.ln_y = QtWidgets.QLCDNumber(parent=self.centralwidget) - self.ln_y.setDigitCount(6) - self.ln_y.setSegmentStyle(QtWidgets.QLCDNumber.SegmentStyle.Flat) - self.ln_y.setObjectName("ln_y") - self.gridLayout_2.addWidget(self.ln_y, 1, 2, 1, 1) - self.ln_z = QtWidgets.QLCDNumber(parent=self.centralwidget) - self.ln_z.setDigitCount(6) - self.ln_z.setSegmentStyle(QtWidgets.QLCDNumber.SegmentStyle.Flat) - self.ln_z.setObjectName("ln_z") - self.gridLayout_2.addWidget(self.ln_z, 1, 3, 1, 1) - self.ln_x = QtWidgets.QLCDNumber(parent=self.centralwidget) - self.ln_x.setDigitCount(6) - self.ln_x.setSegmentStyle(QtWidgets.QLCDNumber.SegmentStyle.Flat) - self.ln_x.setObjectName("ln_x") - self.gridLayout_2.addWidget(self.ln_x, 1, 1, 1, 1) - self.ln_ry = QtWidgets.QLCDNumber(parent=self.centralwidget) - self.ln_ry.setDigitCount(6) - self.ln_ry.setSegmentStyle(QtWidgets.QLCDNumber.SegmentStyle.Flat) - self.ln_ry.setObjectName("ln_ry") - self.gridLayout_2.addWidget(self.ln_ry, 1, 5, 1, 1) - self.label_22 = QtWidgets.QLabel(parent=self.centralwidget) - self.label_22.setObjectName("label_22") - self.gridLayout_2.addWidget(self.label_22, 1, 0, 1, 1) - self.ln_rx = QtWidgets.QLCDNumber(parent=self.centralwidget) - self.ln_rx.setDigitCount(6) - self.ln_rx.setSegmentStyle(QtWidgets.QLCDNumber.SegmentStyle.Flat) - self.ln_rx.setObjectName("ln_rx") - self.gridLayout_2.addWidget(self.ln_rx, 1, 4, 1, 1) - self.label_23 = QtWidgets.QLabel(parent=self.centralwidget) - self.label_23.setObjectName("label_23") - self.gridLayout_2.addWidget(self.label_23, 2, 0, 1, 1) - self.ln_rz = QtWidgets.QLCDNumber(parent=self.centralwidget) - self.ln_rz.setDigitCount(6) - self.ln_rz.setSegmentStyle(QtWidgets.QLCDNumber.SegmentStyle.Flat) - self.ln_rz.setObjectName("ln_rz") - self.gridLayout_2.addWidget(self.ln_rz, 1, 6, 1, 1) - self.ln_fx = QtWidgets.QLCDNumber(parent=self.centralwidget) - self.ln_fx.setSegmentStyle(QtWidgets.QLCDNumber.SegmentStyle.Flat) - self.ln_fx.setObjectName("ln_fx") - self.gridLayout_2.addWidget(self.ln_fx, 2, 1, 1, 1) - self.ln_fy = QtWidgets.QLCDNumber(parent=self.centralwidget) - self.ln_fy.setSegmentStyle(QtWidgets.QLCDNumber.SegmentStyle.Flat) - self.ln_fy.setObjectName("ln_fy") - self.gridLayout_2.addWidget(self.ln_fy, 2, 2, 1, 1) - self.ln_fz = QtWidgets.QLCDNumber(parent=self.centralwidget) - self.ln_fz.setSmallDecimalPoint(False) - self.ln_fz.setSegmentStyle(QtWidgets.QLCDNumber.SegmentStyle.Flat) - self.ln_fz.setProperty("value", 0.01) - self.ln_fz.setObjectName("ln_fz") - self.gridLayout_2.addWidget(self.ln_fz, 2, 3, 1, 1) - self.ln_frx = QtWidgets.QLCDNumber(parent=self.centralwidget) - self.ln_frx.setSegmentStyle(QtWidgets.QLCDNumber.SegmentStyle.Flat) - self.ln_frx.setObjectName("ln_frx") - self.gridLayout_2.addWidget(self.ln_frx, 2, 4, 1, 1) - self.ln_fry = QtWidgets.QLCDNumber(parent=self.centralwidget) - self.ln_fry.setSegmentStyle(QtWidgets.QLCDNumber.SegmentStyle.Flat) - self.ln_fry.setObjectName("ln_fry") - self.gridLayout_2.addWidget(self.ln_fry, 2, 5, 1, 1) - self.ln_frz = QtWidgets.QLCDNumber(parent=self.centralwidget) - self.ln_frz.setSegmentStyle(QtWidgets.QLCDNumber.SegmentStyle.Flat) - self.ln_frz.setObjectName("ln_frz") - self.gridLayout_2.addWidget(self.ln_frz, 2, 6, 1, 1) - self.label_19 = QtWidgets.QLabel(parent=self.centralwidget) + self.label_31 = QtWidgets.QLabel(parent=self.g_probe_head) font = QtGui.QFont() + font.setFamily("Noto Sans") font.setPointSize(15) - self.label_19.setFont(font) - self.label_19.setStyleSheet("background-color: pink;") - self.label_19.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) - self.label_19.setObjectName("label_19") - self.gridLayout_2.addWidget(self.label_19, 0, 0, 1, 7) - self.gridLayout_2.setColumnStretch(1, 1) - self.gridLayout_2.setColumnStretch(2, 1) - self.gridLayout_2.setColumnStretch(3, 1) - self.gridLayout_2.setColumnStretch(4, 1) - self.gridLayout_2.setColumnStretch(5, 1) - self.gridLayout_2.setColumnStretch(6, 1) - self.gridLayout.addLayout(self.gridLayout_2, 0, 1, 1, 1) - self.gridLayout_7 = QtWidgets.QGridLayout() - self.gridLayout_7.setObjectName("gridLayout_7") - self.s_sid = QtWidgets.QSlider(parent=self.centralwidget) - self.s_sid.setEnabled(False) - self.s_sid.setOrientation(QtCore.Qt.Orientation.Horizontal) - self.s_sid.setObjectName("s_sid") - self.gridLayout_7.addWidget(self.s_sid, 3, 1, 1, 1) - self.sp_sid = QtWidgets.QSpinBox(parent=self.centralwidget) - self.sp_sid.setObjectName("sp_sid") - self.gridLayout_7.addWidget(self.sp_sid, 3, 2, 1, 1) - self.b_play_playback = QtWidgets.QPushButton(parent=self.centralwidget) - self.b_play_playback.setEnabled(False) - self.b_play_playback.setObjectName("b_play_playback") - self.gridLayout_7.addWidget(self.b_play_playback, 0, 0, 1, 3) - self.label_16 = QtWidgets.QLabel(parent=self.centralwidget) - self.label_16.setObjectName("label_16") - self.gridLayout_7.addWidget(self.label_16, 1, 0, 1, 1) - self.label_4 = QtWidgets.QLabel(parent=self.centralwidget) - self.label_4.setObjectName("label_4") - self.gridLayout_7.addWidget(self.label_4, 3, 0, 1, 1) - self.c_playback_seq_name = QtWidgets.QComboBox(parent=self.centralwidget) - self.c_playback_seq_name.setEnabled(False) - self.c_playback_seq_name.setEditable(False) - self.c_playback_seq_name.setObjectName("c_playback_seq_name") - self.c_playback_seq_name.addItem("") - self.gridLayout_7.addWidget(self.c_playback_seq_name, 1, 1, 1, 2) - self.horizontalLayout_5 = QtWidgets.QHBoxLayout() - self.horizontalLayout_5.setObjectName("horizontalLayout_5") - self.label26 = QtWidgets.QLabel(parent=self.centralwidget) - self.label26.setObjectName("label26") - self.horizontalLayout_5.addWidget(self.label26) - self.l_seq_min = QtWidgets.QLabel(parent=self.centralwidget) - self.l_seq_min.setObjectName("l_seq_min") - self.horizontalLayout_5.addWidget(self.l_seq_min) - self.label_28 = QtWidgets.QLabel(parent=self.centralwidget) - self.label_28.setObjectName("label_28") - self.horizontalLayout_5.addWidget(self.label_28) - self.l_seq_current = QtWidgets.QLabel(parent=self.centralwidget) - self.l_seq_current.setObjectName("l_seq_current") - self.horizontalLayout_5.addWidget(self.l_seq_current) - self.label_29 = QtWidgets.QLabel(parent=self.centralwidget) - self.label_29.setObjectName("label_29") - self.horizontalLayout_5.addWidget(self.label_29) - self.l_seq_max = QtWidgets.QLabel(parent=self.centralwidget) - self.l_seq_max.setObjectName("l_seq_max") - self.horizontalLayout_5.addWidget(self.l_seq_max) - self.horizontalLayout_5.setStretch(1, 1) - self.horizontalLayout_5.setStretch(3, 1) - self.horizontalLayout_5.setStretch(5, 1) - self.gridLayout_7.addLayout(self.horizontalLayout_5, 2, 0, 1, 3) - self.gridLayout.addLayout(self.gridLayout_7, 1, 1, 1, 1) + self.label_31.setFont(font) + self.label_31.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) + self.label_31.setObjectName("label_31") + self.horizontalLayout_7.addWidget(self.label_31) + self.b_probe_head_switch = QtWidgets.QPushButton(parent=self.g_probe_head) + self.b_probe_head_switch.setText("") + self.b_probe_head_switch.setObjectName("b_probe_head_switch") + self.horizontalLayout_7.addWidget(self.b_probe_head_switch) + self.horizontalLayout_7.setStretch(0, 1) + self.verticalLayout_5.addLayout(self.horizontalLayout_7) + self.groupBox_3 = QtWidgets.QGroupBox(parent=self.g_probe_head) + self.groupBox_3.setTitle("") + self.groupBox_3.setObjectName("groupBox_3") + self.horizontalLayout_11 = QtWidgets.QHBoxLayout(self.groupBox_3) + self.horizontalLayout_11.setObjectName("horizontalLayout_11") + self.b_probe_start = QtWidgets.QPushButton(parent=self.groupBox_3) + self.b_probe_start.setObjectName("b_probe_start") + self.horizontalLayout_11.addWidget(self.b_probe_start) + self.b_probe_stop = QtWidgets.QPushButton(parent=self.groupBox_3) + self.b_probe_stop.setObjectName("b_probe_stop") + self.horizontalLayout_11.addWidget(self.b_probe_stop) + self.b_probe_single = QtWidgets.QPushButton(parent=self.groupBox_3) + self.b_probe_single.setObjectName("b_probe_single") + self.horizontalLayout_11.addWidget(self.b_probe_single) + self.b_probe_orig = QtWidgets.QPushButton(parent=self.groupBox_3) + self.b_probe_orig.setObjectName("b_probe_orig") + self.horizontalLayout_11.addWidget(self.b_probe_orig) + self.l_probe_angle = QtWidgets.QLabel(parent=self.groupBox_3) + self.l_probe_angle.setObjectName("l_probe_angle") + self.horizontalLayout_11.addWidget(self.l_probe_angle) + self.verticalLayout_5.addWidget(self.groupBox_3) + self.verticalLayout_5.setStretch(1, 1) + self.gridLayout.addWidget(self.g_probe_head, 1, 0, 1, 1) + self.horizontalLayout_4 = QtWidgets.QHBoxLayout() + self.horizontalLayout_4.setObjectName("horizontalLayout_4") + self.label = QtWidgets.QLabel(parent=self.centralwidget) + self.label.setObjectName("label") + self.horizontalLayout_4.addWidget(self.label) + self.l_base = QtWidgets.QLineEdit(parent=self.centralwidget) + self.l_base.setText("") + self.l_base.setObjectName("l_base") + self.horizontalLayout_4.addWidget(self.l_base) + self.b_select_base = QtWidgets.QPushButton(parent=self.centralwidget) + self.b_select_base.setObjectName("b_select_base") + self.horizontalLayout_4.addWidget(self.b_select_base) + self.b_base = QtWidgets.QPushButton(parent=self.centralwidget) + self.b_base.setIconSize(QtCore.QSize(16, 16)) + self.b_base.setObjectName("b_base") + self.horizontalLayout_4.addWidget(self.b_base) + self.gridLayout.addLayout(self.horizontalLayout_4, 4, 0, 1, 2) + self.gridLayout.setRowStretch(0, 1) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(parent=MainWindow) - self.menubar.setGeometry(QtCore.QRect(0, 0, 1158, 30)) + self.menubar.setGeometry(QtCore.QRect(0, 0, 1238, 30)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(parent=MainWindow) @@ -458,16 +552,18 @@ class Ui_MainWindow(object): def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "Scarlet Flandre Control Panel")) - self.g_device.setTitle(_translate("MainWindow", "Device Status")) - self.l_online.setText(_translate("MainWindow", "Device Offline")) + self.label_30.setText(_translate("MainWindow", "Ultrasound T/R Device Driver")) self.b_device_connection.setText(_translate("MainWindow", "Connect")) self.lb_device_connection.setText(_translate("MainWindow", "Disconnected")) self.lb_device_enable.setText(_translate("MainWindow", "Disabled")) self.b_device_enable.setText(_translate("MainWindow", "Disconnect")) self.label_24.setText(_translate("MainWindow", "

Beam

Status

")) self.label_21.setText(_translate("MainWindow", "

Connection

Status

")) - self.label_20.setText(_translate("MainWindow", "DeviceConfig")) + self.label_32.setText(_translate("MainWindow", "current")) self.c_live_seq_name.setItemText(0, _translate("MainWindow", "Empty")) + self.label_20.setText(_translate("MainWindow", "DeviceConfig")) + self.b_live_seq_apply.setText(_translate("MainWindow", "Apply")) + self.l_live_seq_name.setText(_translate("MainWindow", "Empty")) self.b_device_zero.setText(_translate("MainWindow", "Zero")) self.label_14.setText(_translate("MainWindow", "Yal")) self.label_13.setText(_translate("MainWindow", "Pitch")) @@ -477,18 +573,10 @@ class Ui_MainWindow(object): self.label_12.setText(_translate("MainWindow", "Roll")) self.label_11.setText(_translate("MainWindow", "E")) self.label_8.setText(_translate("MainWindow", "X")) - self.label.setText(_translate("MainWindow", "Base Path")) - self.b_select_base.setText(_translate("MainWindow", "Select")) - self.b_base.setText(_translate("MainWindow", "Open")) - self.label_7.setText(_translate("MainWindow", "TextLabel")) - self.label_2.setText(_translate("MainWindow", "Imaging")) - self.label_6.setText(_translate("MainWindow", "TextLabel")) - self.label_15.setText(_translate("MainWindow", "t_start")) - self.label_5.setText(_translate("MainWindow", "t_end")) - self.label_27.setText(_translate("MainWindow", "Profile")) - self.b_new_imaging_config.setText(_translate("MainWindow", "New")) self.cb_bscan.setText(_translate("MainWindow", "BSCAN")) self.checkBox.setText(_translate("MainWindow", "FOCUS")) + self.g_cap.setTitle(_translate("MainWindow", "Capture Source")) + self.g_live.setTitle(_translate("MainWindow", "Live")) self.label_17.setText(_translate("MainWindow", "RecordName")) self.b_record.setText(_translate("MainWindow", "Record")) self.label_18.setText(_translate("MainWindow", "Record Frames:")) @@ -497,18 +585,9 @@ class Ui_MainWindow(object): 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_probe_start.setText(_translate("MainWindow", "Start")) - self.b_probe_stop.setText(_translate("MainWindow", "Stop")) - self.l_probe_angle.setText(_translate("MainWindow", "TextLabel")) - self.b_probe_single.setText(_translate("MainWindow", "Single")) - self.b_probe_orig.setText(_translate("MainWindow", "Orig")) - self.label_22.setText(_translate("MainWindow", "Position")) - self.label_23.setText(_translate("MainWindow", "Force")) - self.label_19.setText(_translate("MainWindow", "Robot Offline")) - self.b_play_playback.setText(_translate("MainWindow", "Playback")) - self.label_16.setText(_translate("MainWindow", "SeqName")) + self.g_playback.setTitle(_translate("MainWindow", "Playback")) self.label_4.setText(_translate("MainWindow", "Frame ID")) + self.label_16.setText(_translate("MainWindow", "SeqName")) self.c_playback_seq_name.setItemText(0, _translate("MainWindow", "Unset")) self.label26.setText(_translate("MainWindow", "Min:")) self.l_seq_min.setText(_translate("MainWindow", "0")) @@ -516,3 +595,22 @@ class Ui_MainWindow(object): self.l_seq_current.setText(_translate("MainWindow", "0")) self.label_29.setText(_translate("MainWindow", "Max:")) self.l_seq_max.setText(_translate("MainWindow", "0")) + self.label_23.setText(_translate("MainWindow", "Force")) + self.label_22.setText(_translate("MainWindow", "Position")) + self.label_19.setText(_translate("MainWindow", "6DOF Cobot")) + self.label_7.setText(_translate("MainWindow", "TextLabel")) + self.label_2.setText(_translate("MainWindow", "Imaging")) + self.label_6.setText(_translate("MainWindow", "TextLabel")) + self.label_15.setText(_translate("MainWindow", "t_start")) + self.label_5.setText(_translate("MainWindow", "t_end")) + self.label_27.setText(_translate("MainWindow", "Profile")) + self.b_new_imaging_config.setText(_translate("MainWindow", "New")) + self.label_31.setText(_translate("MainWindow", "Probe Head Control")) + self.b_probe_start.setText(_translate("MainWindow", "Start")) + self.b_probe_stop.setText(_translate("MainWindow", "Stop")) + self.b_probe_single.setText(_translate("MainWindow", "Single")) + self.b_probe_orig.setText(_translate("MainWindow", "Orig")) + self.l_probe_angle.setText(_translate("MainWindow", "TextLabel")) + self.label.setText(_translate("MainWindow", "Base Path")) + self.b_select_base.setText(_translate("MainWindow", "Select")) + self.b_base.setText(_translate("MainWindow", "Open")) diff --git a/src/ui/Main.ui b/src/ui/Main.ui index 41561b7..3db0642 100644 --- a/src/ui/Main.ui +++ b/src/ui/Main.ui @@ -6,131 +6,179 @@ 0 0 - 1158 - 998 + 1238 + 999 Scarlet Flandre Control Panel - + - - - true + + + #g_us{ + background: pink; +border-radius: 7px; +} - - Device Status - - + - - - - 15 - - - - background-color: pink; - - - Device Offline - - - Qt::AlignmentFlag::AlignCenter - - - - - - - - - Connect + + + + + + 15 + - - - - - Disconnected + Ultrasound T/R Device Driver Qt::AlignmentFlag::AlignCenter - - + + - Disabled - - - Qt::AlignmentFlag::AlignCenter + - - - - false - + + - Disconnect - - - - - - - <html><head/><body><p style="line-height:0.3" align="center">Beam</p><p align="center">Status</p></body></html> - - - Qt::AlignmentFlag::AlignCenter - - - - - - - <html><head/><body><p style="line-height:0.3" align="center">Connection</p><p align="center">Status</p></body></html> - - - Qt::AlignmentFlag::AlignCenter + - - - - - DeviceConfig - - - - - - - false - - + + + true + + + + + + + + + + + Connect + + + + + + + Disconnected + + + Qt::AlignmentFlag::AlignCenter + + + + + + + Disabled + + + Qt::AlignmentFlag::AlignCenter + + + + + + + false + + + Disconnect + + + + + + + <html><head/><body><p style="line-height:0.3" align="center">Beam</p><p align="center">Status</p></body></html> + + + Qt::AlignmentFlag::AlignCenter + + + + + + + <html><head/><body><p style="line-height:0.3" align="center">Connection</p><p align="center">Status</p></body></html> + + + Qt::AlignmentFlag::AlignCenter + + + + + + + + + + + current + + + + + + + false + + + + Empty + + + + + + + + DeviceConfig + + + + + + + Apply + + + + + + + Empty + + + + + + + - Empty + Zero - - - - - - - - - Zero - + + + @@ -288,38 +336,421 @@ - - + + - + - Base Path + BSCAN + + + true - + - + FOCUS - - - Select + + + Qt::Orientation::Horizontal - - - - - - Open + + + 40 + 20 + - + + + + + false + + + Capture Source + + + + + + Live + + + true + + + false + + + + + + + + RecordName + + + + + + + false + + + + + + + false + + + Record + + + + + + + + + + + Record Frames: + + + + + + + 0 + + + + + + + Record Size: + + + + + + + 0 + + + + + + + Max SeqId: + + + + + + + 0 + + + + + + + + + + + + Playback + + + true + + + false + + + + + + + + + + + Frame ID + + + + + + + SeqName + + + + + + + false + + + false + + + + Unset + + + + + + + + Qt::Orientation::Horizontal + + + + + + + + + + + Min: + + + + + + + 0 + + + + + + + Current: + + + + + + + 0 + + + + + + + Max: + + + + + + + 0 + + + + + + + + + + + + + + + #g_cobot { + background: pink; +border-radius: 7px; +} + + + + + + + + + + + + + + + + + 6 + + + QLCDNumber::SegmentStyle::Flat + + + + + + + QLCDNumber::SegmentStyle::Flat + + + + + + + QLCDNumber::SegmentStyle::Flat + + + + + + + QLCDNumber::SegmentStyle::Flat + + + + + + + 6 + + + QLCDNumber::SegmentStyle::Flat + + + + + + + 6 + + + QLCDNumber::SegmentStyle::Flat + + + + + + + QLCDNumber::SegmentStyle::Flat + + + + + + + 6 + + + QLCDNumber::SegmentStyle::Flat + + + + + + + Force + + + + + + + false + + + QLCDNumber::SegmentStyle::Flat + + + 0.010000000000000 + + + + + + + QLCDNumber::SegmentStyle::Flat + + + + + + + 6 + + + QLCDNumber::SegmentStyle::Flat + + + + + + + 6 + + + QLCDNumber::SegmentStyle::Flat + + + + + + + Position + + + + + + + + + + + + + + + 15 + + + + 6DOF Cobot + + + Qt::AlignmentFlag::AlignCenter + + + + + + + + + + + + + + + @@ -448,407 +879,128 @@ - - + + + + #g_probe_head { + background: pink; +border-radius: 7px; +} + + + + + + + + + + + + Noto Sans + 15 + + + + Probe Head Control + + + Qt::AlignmentFlag::AlignCenter + + + + + + + + + + + + + + + + + + + + + + Start + + + + + + + Stop + + + + + + + Single + + + + + + + Orig + + + + + + + TextLabel + + + + + + + + + + + - + - BSCAN - - - true + Base Path - + - FOCUS + - - - Qt::Orientation::Horizontal + + + Select - + + + + + + Open + + - 40 - 20 + 16 + 16 - - - - - - - - - - false - - - - - RecordName - - - - - - - false - - - Record - - - - - - - - - Record Frames: - - - - - - - 0 - - - - - - - Record Size: - - - - - - - 0 - - - - - - - Max SeqId: - - - - - - - 0 - - - - - - - - - false - - - Live - - - - - - - - - - - Start - - - - - - - Stop - - - - - - - TextLabel - - - - - - - Single - - - - - - - Orig - - - - - - - - - - - 6 - - - QLCDNumber::SegmentStyle::Flat - - - - - - - 6 - - - QLCDNumber::SegmentStyle::Flat - - - - - - - 6 - - - QLCDNumber::SegmentStyle::Flat - - - - - - - 6 - - - QLCDNumber::SegmentStyle::Flat - - - - - - - Position - - - - - - - 6 - - - QLCDNumber::SegmentStyle::Flat - - - - - - - Force - - - - - - - 6 - - - QLCDNumber::SegmentStyle::Flat - - - - - - - QLCDNumber::SegmentStyle::Flat - - - - - - - QLCDNumber::SegmentStyle::Flat - - - - - - - false - - - QLCDNumber::SegmentStyle::Flat - - - 0.010000000000000 - - - - - - - QLCDNumber::SegmentStyle::Flat - - - - - - - QLCDNumber::SegmentStyle::Flat - - - - - - - QLCDNumber::SegmentStyle::Flat - - - - - - - - 15 - - - - background-color: pink; - - - Robot Offline - - - Qt::AlignmentFlag::AlignCenter - - - - - - - - - - - false - - - Qt::Orientation::Horizontal - - - - - - - - - - false - - - Playback - - - - - - - SeqName - - - - - - - Frame ID - - - - - - - false - - - false - - - - Unset - - - - - - - - - - Min: - - - - - - - 0 - - - - - - - Current: - - - - - - - 0 - - - - - - - Max: - - - - - - - 0 - - - - - @@ -858,7 +1010,7 @@ 0 0 - 1158 + 1238 30 diff --git a/src/utils/Msg.py b/src/utils/Msg.py index 7cd52dc..dd203ea 100644 --- a/src/utils/Msg.py +++ b/src/utils/Msg.py @@ -10,6 +10,7 @@ from utils.RfMeta import RfFrameMeta class BG(Enum): Msg1 = auto() Msg2 = auto() + RefreshDeviceMsg = auto() BMMsg = auto() TickMsg = auto() KillMsg = auto() @@ -17,6 +18,7 @@ class BG(Enum): MoveAxisMsg = auto() ImageArgMsg = auto() SetSeqMetaMsg = auto() + SeqMetaMsg = auto() SeqIdMinMax = auto() SetBaseMsg = auto() SeqListMsg = auto() @@ -43,6 +45,8 @@ class BG(Enum): MidiMsg = auto() JoystickMsg = auto() DeviceZero = auto() + SetDeviceSwitchMsg = auto() + DeviceSwitchMsg = auto() class Msg: @@ -83,6 +87,8 @@ class Msg1(Msg): a: int = 0 b: int = 1 +class RefreshDeviceMsg(Msg): + pass @dataclasses.dataclass class KillMsg(Msg): @@ -143,9 +149,10 @@ class SetRecordMsg(Msg): commit: str = '' base: str = '' - -class SetDeviceConfigMsg(StrMsg): - pass +@dataclasses.dataclass +class SetDeviceConfigMsg(Msg): + name:str + txt:str class SetBaseMsg(StrMsg): @@ -171,6 +178,10 @@ class SetSeqMetaMsg(Msg): target: str name: str +@dataclasses.dataclass +class SeqMetaMsg(Msg): + target: str + name: str @dataclasses.dataclass class SeqIdMinMax(Msg): @@ -328,6 +339,14 @@ class JoystickMsg(Msg): value: float +class DeviceSwitchMsg(StrMsg): + pass + + +class SetDeviceSwitchMsg(BoolMsg): + pass + + @dataclasses.dataclass class RobotRtsiMsg(Msg): pos: tuple[int, int, int, int, int, int] diff --git a/src/utils/network.py b/src/utils/network.py index 6c8a27f..1173a79 100644 --- a/src/utils/network.py +++ b/src/utils/network.py @@ -1,4 +1,6 @@ import socket +import subprocess + def check_port(host, port): try: @@ -12,4 +14,16 @@ def check_port(host, port): return False except socket.error as e: print(f"连接过程中发生错误: {e}") - return False \ No newline at end of file + return False + +# def c2(): +# code = subprocess.run(['curl', '-m', '1', f'http://{LIVE_REP_SOCKET}'], stderr=subprocess.DEVNULL, +# stdout=subprocess.DEVNULL).returncode +# logger.debug(f'detect curl code: {code}') +# match code: +# case 28 | 7: +# self.send(DeviceOnlineMsg(False)) +# return False +# case _: +# self.send(DeviceOnlineMsg(True)) +# return True \ No newline at end of file diff --git a/test/kdemain.py b/test/kdemain.py index dc58c80..d1b02da 100644 --- a/test/kdemain.py +++ b/test/kdemain.py @@ -9,6 +9,7 @@ from nodes.ImageCV import ImageCV from nodes.ImageFFMPEG import ImageFFMPEG from nodes.JoyStick import Joystick from nodes.Loader import Loader +from nodes.Mi import Mi from nodes.Midi import Midi from nodes.Monitor import Monitor from nodes.Muxer import Muxer @@ -25,17 +26,18 @@ if __name__ == '__main__': ps = [ Broker(), kde_pyqt6_mainui, - Device(level=logging.DEBUG), - # ImageFFMPEG(), + Device(), + ImageFFMPEG(), ImageCV(level=logging.DEBUG), Beamformer(level=logging.DEBUG), Loader(), Muxer(level=logging.DEBUG), - Midi(), + # Midi(), # Joystick(), Robot(), Recorder(), # Monitor(), + Mi(), ] for p in ps: pps.append(multiprocessing.Process(target=p)) diff --git a/test/testDevice.py b/test/testDevice.py index a0d4515..70ef186 100644 --- a/test/testDevice.py +++ b/test/testDevice.py @@ -23,8 +23,9 @@ def test2(): # d.setfile(Path('/home/lambda/source/scarlet/flandre/config/device/AA256,U=30,M=PWI,S=(256 1502).txt').read_text()) # time.sleep(2) while True: - d.data() - print(1) + r = d.get_data() + print(r.__len__()) + break # d.disable() # d.disconnect() diff --git a/test/testrobotremotecontrol.py b/test/testrobotremotecontrol.py new file mode 100644 index 0000000..573bb9a --- /dev/null +++ b/test/testrobotremotecontrol.py @@ -0,0 +1,23 @@ +import socket +from time import sleep + + +def send_message(message: str, host='11.6.1.53', port=29999): + # Create a TCP/IP socket + client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + + # Connect to the server + client_socket.connect((host, port)) + + try: + # Send the message + client_socket.sendall(message.encode()) + print(f"Sent: {message}") + finally: + # Close the socket + client_socket.close() + + +if __name__ == "__main__": + # send_message('remoteControl -on\nplay\nremoteControl -off\n') + send_message('remoteControl -on\nstop\nremoteControl -off\n')