This commit is contained in:
remilia 2025-03-23 22:33:55 +08:00
parent 97e6eab5df
commit 253516bb5b
14 changed files with 1475 additions and 863 deletions

View File

@ -10,6 +10,8 @@ LIVE_SOCKET_IP = '11.6.1.71'
LIVE_REP_SOCKET_PORT = 5556 LIVE_REP_SOCKET_PORT = 5556
LIVE_SOCKET = f'{LIVE_SOCKET_IP}:5555' LIVE_SOCKET = f'{LIVE_SOCKET_IP}:5555'
LIVE_REP_SOCKET = f'{LIVE_SOCKET_IP}:{LIVE_REP_SOCKET_PORT}' 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_HEIGHT = 1920
VIDEO_WIDTH = 1080 VIDEO_WIDTH = 1080
@ -22,6 +24,7 @@ BASE = Path(__file__).parent.parent
DS = BASE / '@DS' DS = BASE / '@DS'
DOC = BASE / 'doc' DOC = BASE / 'doc'
CONFIG = BASE / 'config' CONFIG = BASE / 'config'
ASSETS = BASE / 'assets'
DS.mkdir(exist_ok=True, parents=True) DS.mkdir(exist_ok=True, parents=True)
DOC.mkdir(exist_ok=True, parents=True) DOC.mkdir(exist_ok=True, parents=True)
DEVICE_CONFIG = CONFIG / 'device' DEVICE_CONFIG = CONFIG / 'device'

View File

@ -2,46 +2,95 @@ import logging
import struct import struct
import subprocess import subprocess
import time import time
from enum import Enum, auto
from threading import Thread from threading import Thread
import zmq import zmq
from BusClient import BusClient
from config import LIVE_REP_SOCKET, CONFIG, DEVICE_CONFIG from config import LIVE_REP_SOCKET, CONFIG, DEVICE_CONFIG
from nodes.Node import Node from nodes.Node import Node
from utils.Msg import ImageArgMsg, KillMsg, SetDeviceConnectedMsg, SetDeviceEnabledMsg, DeviceEnabledMsg, \ from utils.Msg import ImageArgMsg, KillMsg, SetDeviceConnectedMsg, SetDeviceEnabledMsg, DeviceEnabledMsg, \
DeviceConnectedMsg, SetDeviceConfigMsg, DeviceOnlineMsg, DeviceConfigListMsg, RequestRfFrameMsg, RfFrameMsg, \ DeviceConnectedMsg, SetDeviceConfigMsg, DeviceOnlineMsg, DeviceConfigListMsg, RequestRfFrameMsg, RfFrameMsg, \
RfFrameWithMetaMsg, DeviceZero RfFrameWithMetaMsg, DeviceZero, SetDeviceSwitchMsg, DeviceSwitchMsg, SeqMetaMsg, RefreshDeviceMsg
from utils.RfMeta import RfFrameMeta from utils.RfMeta import RfFrameMeta
logger = logging.getLogger(__name__) 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): class Device(Node):
topics = [SetDeviceConnectedMsg, SetDeviceEnabledMsg, SetDeviceConfigMsg, RequestRfFrameMsg, DeviceZero] magic = 7355608
topics = [SetDeviceConnectedMsg, SetDeviceEnabledMsg, SetDeviceConfigMsg, RequestRfFrameMsg, DeviceZero,
DeviceSwitchMsg
]
def __init__(self, level=logging.INFO): def __init__(self, level=logging.INFO):
super(Device, self).__init__(level=level) super(Device, self).__init__(level=level)
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 = None
self.device_rep_socket = None self.device_rep_socket: zmq.Socket = None
self.ok = b'ok\x00' self.ok = b'ok\x00'
self.loop2_t = None self.loop2_t = None
self.switch = False
def loop2(self): def loop2(self):
while True: while True:
self.online() self.online()
time.sleep(1) 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): def connect(self):
self.device_rep_socket.send(b'connect') temp_client = BusClient(SetDeviceSwitchMsg,RefreshDeviceMsg, poller=True)
rb = self.device_rep_socket.recv() temp_client.poller.register(self.device_rep_socket, zmq.POLLIN)
if rb == self.ok: self.device_cmd(DeviceCmd.SetConnectionOn)
self.send(DeviceConnectedMsg(True)) logger.warning('onn')
else: d = dict(temp_client.poller.poll())
logger.error(f"Device msg: {rb}")
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): def disconnect(self):
self.device_rep_socket.send(b'disconnect') self.device_cmd(DeviceCmd.SetConnectionOff)
rb = self.device_rep_socket.recv() rb = self.device_rep_socket.recv()
if rb == self.ok: if rb == self.ok:
self.send(DeviceConnectedMsg(False)) self.send(DeviceConnectedMsg(False))
@ -49,7 +98,7 @@ class Device(Node):
logger.error(f"Device msg: {rb}") logger.error(f"Device msg: {rb}")
def enable(self): def enable(self):
self.device_rep_socket.send(b'enable') self.device_cmd(DeviceCmd.SetEnableOn)
rb = self.device_rep_socket.recv() rb = self.device_rep_socket.recv()
if rb == self.ok: if rb == self.ok:
self.send(DeviceEnabledMsg(True)) self.send(DeviceEnabledMsg(True))
@ -59,7 +108,7 @@ class Device(Node):
return False return False
def disable(self): def disable(self):
self.device_rep_socket.send(b'disable') self.device_cmd(DeviceCmd.SetEnableOff)
rb = self.device_rep_socket.recv() rb = self.device_rep_socket.recv()
if rb == self.ok: if rb == self.ok:
self.send(DeviceEnabledMsg(False)) self.send(DeviceEnabledMsg(False))
@ -80,8 +129,8 @@ class Device(Node):
self.send(DeviceOnlineMsg(True)) self.send(DeviceOnlineMsg(True))
return True return True
def enabled(self): def get_enable(self):
self.device_rep_socket.send(b'enabled') self.device_cmd(DeviceCmd.GetEnable)
rb = self.device_rep_socket.recv() rb = self.device_rep_socket.recv()
match rb: match rb:
case b'true': case b'true':
@ -93,8 +142,14 @@ class Device(Node):
case _: case _:
logger.error(f"Device msg: {rb}") logger.error(f"Device msg: {rb}")
def connected(self): def get_seq_meta_name(self):
self.device_rep_socket.send(b'connected') 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() rb = self.device_rep_socket.recv()
match rb: match rb:
case b'true': case b'true':
@ -106,18 +161,20 @@ class Device(Node):
case _: case _:
logger.error(f"Device msg: {rb}") logger.error(f"Device msg: {rb}")
def setfile(self, config_str: str): def set_name_and_file(self, name: str, config_str: str):
if self.enabled(): if self.get_enable():
self.disable() self.disable()
self.setfileonly(config_str) self.set_name_and_file_only(name, config_str)
self.enable() self.enable()
elif self.connected(): elif self.get_connection():
self.setfileonly(config_str) self.set_name_and_file_only(name, config_str)
else: else:
logger.warning(f"Device not connect, cannot set config") logger.warning(f"Device not connect, cannot set config")
def setfileonly(self, s: str): def set_name_and_file_only(self, name: str, txt: str):
self.device_rep_socket.send(b'fileonly' + s.encode()) 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() rb = self.device_rep_socket.recv()
if rb == self.ok: if rb == self.ok:
return True return True
@ -125,12 +182,12 @@ class Device(Node):
logger.error(f"Device msg: {rb}") logger.error(f"Device msg: {rb}")
return False return False
def data(self): def get_data(self):
self.device_rep_socket.send(b'data') self.device_cmd(DeviceCmd.GetData)
return self.device_rep_socket.recv() return self.device_rep_socket.recv()
def zero(self): def set_zero(self):
self.device_rep_socket.send(b'zero') self.device_cmd(DeviceCmd.SetZero)
return self.device_rep_socket.recv() return self.device_rep_socket.recv()
def custom_setup(self): def custom_setup(self):
@ -141,10 +198,11 @@ class Device(Node):
def loop(self): def loop(self):
arr = [] arr = []
time.sleep(1) time.sleep(3)
if self.online(): if self.online():
self.connected() self.get_connection()
self.enabled() self.get_enable()
self.get_seq_meta_name()
for f in DEVICE_CONFIG.glob('*.txt'): for f in DEVICE_CONFIG.glob('*.txt'):
arr.append((f.stem, f.read_text())) arr.append((f.stem, f.read_text()))
self.send(DeviceConfigListMsg(arr)) self.send(DeviceConfigListMsg(arr))
@ -162,21 +220,35 @@ class Device(Node):
else: else:
self.disable() self.disable()
elif isinstance(msg, SetDeviceConnectedMsg): elif isinstance(msg, SetDeviceConnectedMsg):
logger.info('connecting to device')
if msg.value: if msg.value:
self.connect() self.connect()
else: else:
self.disconnect() self.disconnect()
elif isinstance(msg, SetDeviceConfigMsg): 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): elif isinstance(msg, RequestRfFrameMsg):
braw = self.data() if self.switch:
if braw == b'': braw = self.get_data()
continue if braw == b'':
_, sequence_id, encoder = struct.unpack_from('=iqi', braw) logger.warning('empty msg!')
buffer = braw[4 + 8 + 4:] continue
# logger.debug('send') _, sequence_id, encoder = struct.unpack_from('=iqi', braw)
self.send(RfFrameWithMetaMsg(0, RfFrameMeta( buffer = braw[4 + 8 + 4:]
encoder=encoder, sequence_id=sequence_id # logger.debug('send')
), buffer)) self.send(RfFrameWithMetaMsg(0, RfFrameMeta(
encoder=encoder, sequence_id=sequence_id
), buffer))
else:
logger.warning('device not online')
elif isinstance(msg, DeviceZero): 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()

View File

@ -14,7 +14,7 @@ logger = logging.getLogger(__name__)
class ImageFFMPEG(Node): class ImageFFMPEG(Node):
topics = [BMMsg, SetWindowVisibleMsg] topics = [BMMsg]
def __init__(self, level=logging.INFO): def __init__(self, level=logging.INFO):
super().__init__(level=level) super().__init__(level=level)

View File

@ -7,18 +7,19 @@ from enum import Enum, auto
from pathlib import Path from pathlib import Path
import zmq import zmq
from PyQt6 import QtCore, QtWidgets from PyQt6 import QtCore, QtWidgets, QtGui
from PyQt6.QtCore import QByteArray from PyQt6.QtCore import QByteArray
from PyQt6.QtWidgets import QMainWindow, QApplication, QFrame, QMessageBox, QFileDialog, QLineEdit from PyQt6.QtWidgets import QMainWindow, QApplication, QFrame, QMessageBox, QFileDialog, QLineEdit
from Main import Ui_MainWindow from Main import Ui_MainWindow
from ZMQReceiver import ZMQReceiver 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 nodes.Node import Node
from utils.Msg import KillMsg, Msg, ImageArgMsg, SeqIdMinMax, MoveAxisMsg, SeqListMsg, SetBaseMsg, \ from utils.Msg import KillMsg, Msg, ImageArgMsg, SeqIdMinMax, MoveAxisMsg, SeqListMsg, SetBaseMsg, \
SetSeqMetaMsg, SetPlayMode, DeviceConnectedMsg, DeviceEnabledMsg, DeviceOnlineMsg, SetDeviceEnabledMsg, \ SetSeqMetaMsg, SetPlayMode, DeviceConnectedMsg, DeviceEnabledMsg, DeviceOnlineMsg, SetDeviceEnabledMsg, \
SetDeviceConnectedMsg, DeviceConfigListMsg, SetDeviceConfigMsg, SetRecordMsg, RobotRtsiMsg, RecordFrameMsg, \ 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 from utils.RfMeta import RfSequenceMeta
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -28,6 +29,16 @@ class LinkStatus(Enum):
RED = auto() RED = auto()
YELLOW = auto() YELLOW = auto()
GREEN = auto() GREEN = auto()
ORANGE = auto()
def get_style_sheet(name, color):
return f"""
#{name}{{
background: {color};
border-radius: 7px;
}}
""".strip()
def humanbytes(B): def humanbytes(B):
@ -55,6 +66,15 @@ class Adv(QMainWindow, Ui_MainWindow):
super(Adv, self).__init__(parent) super(Adv, self).__init__(parent)
self.p = p self.p = p
self.setupUi(self) 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 = ZMQReceiver(self)
zmq_receiver.zmq_event.connect(self.on_zmq_event) zmq_receiver.zmq_event.connect(self.on_zmq_event)
zmq_receiver.start() zmq_receiver.start()
@ -66,15 +86,19 @@ class Adv(QMainWindow, Ui_MainWindow):
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(self.on_base_open) self.b_base.clicked.connect(self.on_base_open)
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)
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.b_record.clicked.connect(self.on_record)
self.record = False self.record = False
self.device_connected = False self.device_connected = False
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_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.setText(SOFTWARE_CONFIG.base_dir.__str__())
self.l_base.textChanged.connect(lambda e: self.l_base.textChanged.connect(lambda e:
self.l_base.setStyleSheet("") 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_probe_stop.clicked.connect(self.on_probe('stop'))
self.b_device_zero.clicked.connect(lambda: self.p.send(DeviceZero())) 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 on_probe(self, arg):
def f(): def f():
@ -134,14 +197,15 @@ class Adv(QMainWindow, Ui_MainWindow):
base = QFileDialog.getExistingDirectory(self, 'Select Base Folder', DS.__str__()) base = QFileDialog.getExistingDirectory(self, 'Select Base Folder', DS.__str__())
self.l_base.setText(Path(base).__str__()) self.l_base.setText(Path(base).__str__())
def update_b_play_live_enabled(self): # def update_b_play_live_enabled(self):
self.b_play_live.setEnabled(all([self.b1, self.b2])) # self.b_play_live.setEnabled(all([self.b1, self.b2]))
def on_base_open(self): def on_base_open(self):
if Path(self.l_base.text()): if Path(self.l_base.text()):
self.p.send(SetBaseMsg(self.l_base.text())) self.p.send(SetBaseMsg(self.l_base.text()))
self.b1 = True self.g_cap.setEnabled(True)
self.update_b_play_live_enabled() # 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:
@ -176,29 +240,33 @@ class Adv(QMainWindow, Ui_MainWindow):
def update_c_playback_seq_name_enable(self): def update_c_playback_seq_name_enable(self):
self.c_playback_seq_name.setEnabled(all([self.b3, self.b4])) self.c_playback_seq_name.setEnabled(all([self.b3, self.b4]))
def on_play_live(self): def on_play_live(self, b):
self.s_sid.setEnabled(False) if b:
self.b_play_live.setStyleSheet('background-color: red;') self.g_playback.setChecked(False)
self.b_play_playback.setStyleSheet('') # self.s_sid.setEnabled(False)
self.b_record.setEnabled(True) # self.b_play_live.setStyleSheet('background-color: red;')
self.l_record_commit.setEnabled(True) # self.b_play_playback.setStyleSheet('')
self.p.send(SetSeqMetaMsg('live', self.c_live_seq_name.itemText(self.c_live_seq_name.currentIndex()))) # self.b_record.setEnabled(True)
self.p.send(SetPlayMode('live')) # self.l_record_commit.setEnabled(True)
self.b3 = False # self.p.send(SetSeqMetaMsg('live', self.c_live_seq_name.itemText(self.c_live_seq_name.currentIndex())))
self.update_c_playback_seq_name_enable() self.p.send(SetPlayMode('live'))
self.b3 = False
self.update_c_playback_seq_name_enable()
def on_play_playback(self): def on_play_playback(self, b):
self.s_sid.setEnabled(True) if b:
self.b_play_live.setStyleSheet('') self.g_live.setChecked(False)
self.b_play_playback.setStyleSheet('background-color: red;') # self.s_sid.setEnabled(True)
self.b_record.setEnabled(False) # self.b_play_live.setStyleSheet('')
self.l_record_commit.setEnabled(False) # self.b_play_playback.setStyleSheet('background-color: red;')
self.p.send( # self.b_record.setEnabled(False)
SetSeqMetaMsg('playback', self.c_playback_seq_name.itemText(self.c_playback_seq_name.currentIndex()))) # self.l_record_commit.setEnabled(False)
self.p.send(SetPlayMode('playback')) self.p.send(
logger.debug(f'set playmode playback') SetSeqMetaMsg('playback', self.c_playback_seq_name.itemText(self.c_playback_seq_name.currentIndex())))
self.b3 = True self.p.send(SetPlayMode('playback'))
self.update_c_playback_seq_name_enable() logger.debug(f'set playmode playback')
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))
@ -216,6 +284,7 @@ class Adv(QMainWindow, Ui_MainWindow):
self.set_device_connection(LinkStatus.YELLOW) self.set_device_connection(LinkStatus.YELLOW)
def on_device_connect(self): def on_device_connect(self):
logger.info('btn pre')
self.p.send(SetDeviceConnectedMsg(True)) self.p.send(SetDeviceConnectedMsg(True))
self.b_device_connection.setEnabled(False) self.b_device_connection.setEnabled(False)
self.set_device_connection(LinkStatus.YELLOW) self.set_device_connection(LinkStatus.YELLOW)
@ -320,7 +389,7 @@ class Adv(QMainWindow, Ui_MainWindow):
if msg.value.__len__() > 0: if msg.value.__len__() > 0:
self.p.send(SetSeqMetaMsg('playback', self.c_playback_seq_name.itemText( self.p.send(SetSeqMetaMsg('playback', self.c_playback_seq_name.itemText(
self.c_playback_seq_name.currentIndex()))) self.c_playback_seq_name.currentIndex())))
self.b_play_playback.setEnabled(True) # self.b_play_playback.setEnabled(True)
elif isinstance(msg, SetSeqMetaMsg): elif isinstance(msg, SetSeqMetaMsg):
self.seq_meta = RfSequenceMeta.from_name(msg.name) self.seq_meta = RfSequenceMeta.from_name(msg.name)
mmax_shape0 = max(self.seq_meta.shape) mmax_shape0 = max(self.seq_meta.shape)
@ -338,15 +407,19 @@ class Adv(QMainWindow, Ui_MainWindow):
else: else:
self.set_device_enable(LinkStatus.RED) self.set_device_enable(LinkStatus.RED)
self.update_device_buttons() self.update_device_buttons()
elif isinstance(msg, DeviceOnlineMsg): elif isinstance(msg, SeqMetaMsg):
if msg.value: if msg.target == 'live':
self.l_online.setStyleSheet("") self.l_live_seq_name.setText(msg.name)
self.l_online.setText("Device Online") self.b_live_seq_apply.setEnabled(True)
self.g_device.setDisabled(False) # elif isinstance(msg, DeviceOnlineMsg):
else: # if msg.value:
self.l_online.setStyleSheet("background-color: pink;") # # self.l_online.setStyleSheet("")
self.l_online.setText("Device Offline") # # self.l_online.setText("Device Online")
self.g_device.setDisabled(True) # 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): elif isinstance(msg, DeviceConfigListMsg):
for name, txt in msg.arr: for name, txt in msg.arr:
self.c_live_seq_name.addItem(name, txt) self.c_live_seq_name.addItem(name, txt)
@ -380,6 +453,9 @@ class Adv(QMainWindow, Ui_MainWindow):
self.c_imaging_config.clear() self.c_imaging_config.clear()
for name in msg.value: for name in msg.value:
self.c_imaging_config.addItem(name) 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: except Exception as e:
logger.error(e) logger.error(e)
traceback.print_exception(e) traceback.print_exception(e)
@ -421,14 +497,21 @@ class Adv(QMainWindow, Ui_MainWindow):
if self.sp_sid.sender() is None: if self.sp_sid.sender() is None:
self.p.send(SetSidMsg(v)) self.p.send(SetSidMsg(v))
@QtCore.pyqtSlot(int) # @QtCore.pyqtSlot(int)
def on_seq_meta(self, v): def on_seq_meta(self):
if self.c_live_seq_name.sender() is None or isinstance(self.c_live_seq_name.sender(), QFrame): v = self.c_live_seq_name.currentIndex()
if self.c_live_seq_name.itemText(v) != 'Empty': name = self.c_live_seq_name.currentText()
self.b2 = True if name != 'Empty':
self.update_b_play_live_enabled() self.b_live_seq_apply.setEnabled(False)
self.p.send(SetDeviceConfigMsg(self.c_live_seq_name.itemData(v))) self.p.send(SetDeviceConfigMsg(name, self.c_live_seq_name.itemData(v)))
self.p.send(SetSeqMetaMsg('live', self.c_live_seq_name.itemText(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): class MainUI(Node):
@ -436,8 +519,8 @@ class MainUI(Node):
ImagingConfigNameListMsg, ImagingConfigNameListMsg,
SeqListMsg, SetSeqMetaMsg, SeqIdList, SetWindowVisibleMsg, SetSidMsg, SeqListMsg, SetSeqMetaMsg, SeqIdList, SetWindowVisibleMsg, SetSidMsg,
DeviceConnectedMsg, DeviceEnabledMsg, DeviceOnlineMsg, DeviceConfigListMsg, DeviceConnectedMsg, DeviceEnabledMsg, DeviceOnlineMsg, DeviceConfigListMsg,
RobotRtsiMsg, RobotRtsiMsg, DeviceSwitchMsg,
RecordFrameMsg] RecordFrameMsg, SeqMetaMsg]
def __init__(self, level=logging.INFO): def __init__(self, level=logging.INFO):
super().__init__(level=level) super().__init__(level=level)

131
src/nodes/Mi.py Normal file
View File

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

View File

@ -8,7 +8,7 @@ import zmq
from config import IMAGING_CONFIG from config import IMAGING_CONFIG
from nodes.Node import Node from nodes.Node import Node
from utils.Msg import ImageArgMsg, KillMsg, SetSeqMetaMsg, SetPlayMode, SetDeviceConfigMsg, \ 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 from utils.RfFile import RfSequenceMeta
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -16,7 +16,7 @@ logger = logging.getLogger(__name__)
class Muxer(Node): class Muxer(Node):
topics = [SetSeqMetaMsg, SetPlayMode, SetDeviceConfigMsg, RfFrameWithMetaMsg, RequestRfFrameMsg, topics = [SetSeqMetaMsg, SetPlayMode, SetDeviceConfigMsg, RfFrameWithMetaMsg, RequestRfFrameMsg,
ImageArgMsg, RobotRtsiMsg] ImageArgMsg, RobotRtsiMsg, SeqMetaMsg]
def __init__(self, level=logging.INFO): def __init__(self, level=logging.INFO):
super(Muxer, self).__init__(level=level) super(Muxer, self).__init__(level=level)
@ -93,10 +93,13 @@ class Muxer(Node):
self.arg = msg self.arg = msg
elif isinstance(msg, SetSeqMetaMsg): elif isinstance(msg, SetSeqMetaMsg):
match msg.target: match msg.target:
case 'live':
self.seq_meta_live = RfSequenceMeta.from_name(msg.name)
case 'playback': case 'playback':
self.seq_meta_playback = RfSequenceMeta.from_name(msg.name) 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): elif isinstance(msg, SetPlayMode):
logger.debug(f'set playmode {msg}') logger.debug(f'set playmode {msg}')
self.play_mode = msg.value self.play_mode = msg.value

View File

@ -39,6 +39,17 @@ class Node:
FORMAT = '[%(asctime)s] p%(process)s {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s' 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' 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',) 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() self.context = zmq.Context()
if self.enable_init: if self.enable_init:

View File

@ -12,24 +12,44 @@ from PyQt6 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object): class Ui_MainWindow(object):
def setupUi(self, MainWindow): def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow") MainWindow.setObjectName("MainWindow")
MainWindow.resize(1158, 998) MainWindow.resize(1238, 999)
self.centralwidget = QtWidgets.QWidget(parent=MainWindow) self.centralwidget = QtWidgets.QWidget(parent=MainWindow)
self.centralwidget.setObjectName("centralwidget") self.centralwidget.setObjectName("centralwidget")
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget) self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout.setObjectName("gridLayout") 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.setEnabled(True)
self.g_device.setTitle("")
self.g_device.setObjectName("g_device") self.g_device.setObjectName("g_device")
self.verticalLayout = QtWidgets.QVBoxLayout(self.g_device) self.verticalLayout = QtWidgets.QVBoxLayout(self.g_device)
self.verticalLayout.setObjectName("verticalLayout") 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 = QtWidgets.QGridLayout()
self.gridLayout_8.setObjectName("gridLayout_8") self.gridLayout_8.setObjectName("gridLayout_8")
self.b_device_connection = QtWidgets.QPushButton(parent=self.g_device) 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(1, 1)
self.gridLayout_8.setColumnStretch(3, 1) self.gridLayout_8.setColumnStretch(3, 1)
self.verticalLayout.addLayout(self.gridLayout_8) self.verticalLayout.addLayout(self.gridLayout_8)
self.horizontalLayout = QtWidgets.QHBoxLayout() self.gridLayout_7 = QtWidgets.QGridLayout()
self.horizontalLayout.setObjectName("horizontalLayout") self.gridLayout_7.setObjectName("gridLayout_7")
self.label_20 = QtWidgets.QLabel(parent=self.g_device) self.label_32 = QtWidgets.QLabel(parent=self.g_device)
self.label_20.setObjectName("label_20") self.label_32.setObjectName("label_32")
self.horizontalLayout.addWidget(self.label_20) 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 = QtWidgets.QComboBox(parent=self.g_device)
self.c_live_seq_name.setEnabled(False) self.c_live_seq_name.setEnabled(False)
self.c_live_seq_name.setObjectName("c_live_seq_name") self.c_live_seq_name.setObjectName("c_live_seq_name")
self.c_live_seq_name.addItem("") self.c_live_seq_name.addItem("")
self.horizontalLayout.addWidget(self.c_live_seq_name) self.gridLayout_7.addWidget(self.c_live_seq_name, 0, 1, 1, 1)
self.horizontalLayout.setStretch(1, 1) self.label_20 = QtWidgets.QLabel(parent=self.g_device)
self.verticalLayout.addLayout(self.horizontalLayout) 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 = QtWidgets.QPushButton(parent=self.g_device)
self.b_device_zero.setObjectName("b_device_zero") self.b_device_zero.setObjectName("b_device_zero")
self.verticalLayout.addWidget(self.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 = QtWidgets.QGridLayout()
self.gridLayout_4.setObjectName("gridLayout_4") self.gridLayout_4.setObjectName("gridLayout_4")
self.label_14 = QtWidgets.QLabel(parent=self.centralwidget) self.label_14 = QtWidgets.QLabel(parent=self.centralwidget)
@ -157,22 +189,220 @@ class Ui_MainWindow(object):
self.horizontalSlider_8.setObjectName("horizontalSlider_8") self.horizontalSlider_8.setObjectName("horizontalSlider_8")
self.gridLayout_4.addWidget(self.horizontalSlider_8, 6, 1, 1, 1) self.gridLayout_4.addWidget(self.horizontalSlider_8, 6, 1, 1, 1)
self.gridLayout.addLayout(self.gridLayout_4, 3, 1, 1, 1) self.gridLayout.addLayout(self.gridLayout_4, 3, 1, 1, 1)
self.horizontalLayout_4 = QtWidgets.QHBoxLayout() self.horizontalLayout_6 = QtWidgets.QHBoxLayout()
self.horizontalLayout_4.setObjectName("horizontalLayout_4") self.horizontalLayout_6.setObjectName("horizontalLayout_6")
self.label = QtWidgets.QLabel(parent=self.centralwidget) self.cb_bscan = QtWidgets.QCheckBox(parent=self.centralwidget)
self.label.setObjectName("label") self.cb_bscan.setChecked(True)
self.horizontalLayout_4.addWidget(self.label) self.cb_bscan.setObjectName("cb_bscan")
self.l_base = QtWidgets.QLineEdit(parent=self.centralwidget) self.horizontalLayout_6.addWidget(self.cb_bscan)
self.l_base.setText("") self.checkBox = QtWidgets.QCheckBox(parent=self.centralwidget)
self.l_base.setObjectName("l_base") self.checkBox.setObjectName("checkBox")
self.horizontalLayout_4.addWidget(self.l_base) self.horizontalLayout_6.addWidget(self.checkBox)
self.b_select_base = QtWidgets.QPushButton(parent=self.centralwidget) spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
self.b_select_base.setObjectName("b_select_base") self.horizontalLayout_6.addItem(spacerItem1)
self.horizontalLayout_4.addWidget(self.b_select_base) self.gridLayout.addLayout(self.horizontalLayout_6, 5, 0, 1, 2)
self.b_base = QtWidgets.QPushButton(parent=self.centralwidget) self.g_cap = QtWidgets.QGroupBox(parent=self.centralwidget)
self.b_base.setObjectName("b_base") self.g_cap.setEnabled(False)
self.horizontalLayout_4.addWidget(self.b_base) self.g_cap.setObjectName("g_cap")
self.gridLayout.addLayout(self.horizontalLayout_4, 4, 0, 1, 2) 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 = QtWidgets.QGridLayout()
self.gridLayout_5.setObjectName("gridLayout_5") self.gridLayout_5.setObjectName("gridLayout_5")
self.spinBox_3 = QtWidgets.QSpinBox(parent=self.centralwidget) 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.setOrientation(QtCore.Qt.Orientation.Horizontal)
self.horizontalSlider_2.setObjectName("horizontalSlider_2") self.horizontalSlider_2.setObjectName("horizontalSlider_2")
self.gridLayout_5.addWidget(self.horizontalSlider_2, 5, 1, 1, 1) self.gridLayout_5.addWidget(self.horizontalSlider_2, 5, 1, 1, 1)
spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding) spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding)
self.gridLayout_5.addItem(spacerItem1, 7, 1, 1, 1) self.gridLayout_5.addItem(spacerItem2, 7, 1, 1, 1)
self.label_2 = QtWidgets.QLabel(parent=self.centralwidget) self.label_2 = QtWidgets.QLabel(parent=self.centralwidget)
font = QtGui.QFont() font = QtGui.QFont()
font.setPointSize(20) font.setPointSize(20)
@ -241,211 +471,75 @@ class Ui_MainWindow(object):
self.horizontalLayout_3.setStretch(1, 1) self.horizontalLayout_3.setStretch(1, 1)
self.gridLayout_5.addLayout(self.horizontalLayout_3, 2, 0, 1, 3) self.gridLayout_5.addLayout(self.horizontalLayout_3, 2, 0, 1, 3)
self.gridLayout.addLayout(self.gridLayout_5, 3, 0, 1, 1) self.gridLayout.addLayout(self.gridLayout_5, 3, 0, 1, 1)
self.horizontalLayout_6 = QtWidgets.QHBoxLayout() self.g_probe_head = QtWidgets.QGroupBox(parent=self.centralwidget)
self.horizontalLayout_6.setObjectName("horizontalLayout_6") self.g_probe_head.setStyleSheet("#g_probe_head {\n"
self.cb_bscan = QtWidgets.QCheckBox(parent=self.centralwidget) " background: pink;\n"
self.cb_bscan.setChecked(True) "border-radius: 7px;\n"
self.cb_bscan.setObjectName("cb_bscan") "}")
self.horizontalLayout_6.addWidget(self.cb_bscan) self.g_probe_head.setTitle("")
self.checkBox = QtWidgets.QCheckBox(parent=self.centralwidget) self.g_probe_head.setObjectName("g_probe_head")
self.checkBox.setObjectName("checkBox") self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.g_probe_head)
self.horizontalLayout_6.addWidget(self.checkBox) self.verticalLayout_5.setObjectName("verticalLayout_5")
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.horizontalLayout_7 = QtWidgets.QHBoxLayout() self.horizontalLayout_7 = QtWidgets.QHBoxLayout()
self.horizontalLayout_7.setObjectName("horizontalLayout_7") self.horizontalLayout_7.setObjectName("horizontalLayout_7")
self.b_probe_start = QtWidgets.QPushButton(parent=self.centralwidget) self.label_31 = QtWidgets.QLabel(parent=self.g_probe_head)
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)
font = QtGui.QFont() font = QtGui.QFont()
font.setFamily("Noto Sans")
font.setPointSize(15) font.setPointSize(15)
self.label_19.setFont(font) self.label_31.setFont(font)
self.label_19.setStyleSheet("background-color: pink;") self.label_31.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
self.label_19.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) self.label_31.setObjectName("label_31")
self.label_19.setObjectName("label_19") self.horizontalLayout_7.addWidget(self.label_31)
self.gridLayout_2.addWidget(self.label_19, 0, 0, 1, 7) self.b_probe_head_switch = QtWidgets.QPushButton(parent=self.g_probe_head)
self.gridLayout_2.setColumnStretch(1, 1) self.b_probe_head_switch.setText("")
self.gridLayout_2.setColumnStretch(2, 1) self.b_probe_head_switch.setObjectName("b_probe_head_switch")
self.gridLayout_2.setColumnStretch(3, 1) self.horizontalLayout_7.addWidget(self.b_probe_head_switch)
self.gridLayout_2.setColumnStretch(4, 1) self.horizontalLayout_7.setStretch(0, 1)
self.gridLayout_2.setColumnStretch(5, 1) self.verticalLayout_5.addLayout(self.horizontalLayout_7)
self.gridLayout_2.setColumnStretch(6, 1) self.groupBox_3 = QtWidgets.QGroupBox(parent=self.g_probe_head)
self.gridLayout.addLayout(self.gridLayout_2, 0, 1, 1, 1) self.groupBox_3.setTitle("")
self.gridLayout_7 = QtWidgets.QGridLayout() self.groupBox_3.setObjectName("groupBox_3")
self.gridLayout_7.setObjectName("gridLayout_7") self.horizontalLayout_11 = QtWidgets.QHBoxLayout(self.groupBox_3)
self.s_sid = QtWidgets.QSlider(parent=self.centralwidget) self.horizontalLayout_11.setObjectName("horizontalLayout_11")
self.s_sid.setEnabled(False) self.b_probe_start = QtWidgets.QPushButton(parent=self.groupBox_3)
self.s_sid.setOrientation(QtCore.Qt.Orientation.Horizontal) self.b_probe_start.setObjectName("b_probe_start")
self.s_sid.setObjectName("s_sid") self.horizontalLayout_11.addWidget(self.b_probe_start)
self.gridLayout_7.addWidget(self.s_sid, 3, 1, 1, 1) self.b_probe_stop = QtWidgets.QPushButton(parent=self.groupBox_3)
self.sp_sid = QtWidgets.QSpinBox(parent=self.centralwidget) self.b_probe_stop.setObjectName("b_probe_stop")
self.sp_sid.setObjectName("sp_sid") self.horizontalLayout_11.addWidget(self.b_probe_stop)
self.gridLayout_7.addWidget(self.sp_sid, 3, 2, 1, 1) self.b_probe_single = QtWidgets.QPushButton(parent=self.groupBox_3)
self.b_play_playback = QtWidgets.QPushButton(parent=self.centralwidget) self.b_probe_single.setObjectName("b_probe_single")
self.b_play_playback.setEnabled(False) self.horizontalLayout_11.addWidget(self.b_probe_single)
self.b_play_playback.setObjectName("b_play_playback") self.b_probe_orig = QtWidgets.QPushButton(parent=self.groupBox_3)
self.gridLayout_7.addWidget(self.b_play_playback, 0, 0, 1, 3) self.b_probe_orig.setObjectName("b_probe_orig")
self.label_16 = QtWidgets.QLabel(parent=self.centralwidget) self.horizontalLayout_11.addWidget(self.b_probe_orig)
self.label_16.setObjectName("label_16") self.l_probe_angle = QtWidgets.QLabel(parent=self.groupBox_3)
self.gridLayout_7.addWidget(self.label_16, 1, 0, 1, 1) self.l_probe_angle.setObjectName("l_probe_angle")
self.label_4 = QtWidgets.QLabel(parent=self.centralwidget) self.horizontalLayout_11.addWidget(self.l_probe_angle)
self.label_4.setObjectName("label_4") self.verticalLayout_5.addWidget(self.groupBox_3)
self.gridLayout_7.addWidget(self.label_4, 3, 0, 1, 1) self.verticalLayout_5.setStretch(1, 1)
self.c_playback_seq_name = QtWidgets.QComboBox(parent=self.centralwidget) self.gridLayout.addWidget(self.g_probe_head, 1, 0, 1, 1)
self.c_playback_seq_name.setEnabled(False) self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
self.c_playback_seq_name.setEditable(False) self.horizontalLayout_4.setObjectName("horizontalLayout_4")
self.c_playback_seq_name.setObjectName("c_playback_seq_name") self.label = QtWidgets.QLabel(parent=self.centralwidget)
self.c_playback_seq_name.addItem("") self.label.setObjectName("label")
self.gridLayout_7.addWidget(self.c_playback_seq_name, 1, 1, 1, 2) self.horizontalLayout_4.addWidget(self.label)
self.horizontalLayout_5 = QtWidgets.QHBoxLayout() self.l_base = QtWidgets.QLineEdit(parent=self.centralwidget)
self.horizontalLayout_5.setObjectName("horizontalLayout_5") self.l_base.setText("")
self.label26 = QtWidgets.QLabel(parent=self.centralwidget) self.l_base.setObjectName("l_base")
self.label26.setObjectName("label26") self.horizontalLayout_4.addWidget(self.l_base)
self.horizontalLayout_5.addWidget(self.label26) self.b_select_base = QtWidgets.QPushButton(parent=self.centralwidget)
self.l_seq_min = QtWidgets.QLabel(parent=self.centralwidget) self.b_select_base.setObjectName("b_select_base")
self.l_seq_min.setObjectName("l_seq_min") self.horizontalLayout_4.addWidget(self.b_select_base)
self.horizontalLayout_5.addWidget(self.l_seq_min) self.b_base = QtWidgets.QPushButton(parent=self.centralwidget)
self.label_28 = QtWidgets.QLabel(parent=self.centralwidget) self.b_base.setIconSize(QtCore.QSize(16, 16))
self.label_28.setObjectName("label_28") self.b_base.setObjectName("b_base")
self.horizontalLayout_5.addWidget(self.label_28) self.horizontalLayout_4.addWidget(self.b_base)
self.l_seq_current = QtWidgets.QLabel(parent=self.centralwidget) self.gridLayout.addLayout(self.horizontalLayout_4, 4, 0, 1, 2)
self.l_seq_current.setObjectName("l_seq_current") self.gridLayout.setRowStretch(0, 1)
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)
MainWindow.setCentralWidget(self.centralwidget) MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(parent=MainWindow) 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") self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar) MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(parent=MainWindow) self.statusbar = QtWidgets.QStatusBar(parent=MainWindow)
@ -458,16 +552,18 @@ class Ui_MainWindow(object):
def retranslateUi(self, MainWindow): def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate _translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "Scarlet Flandre Control Panel")) MainWindow.setWindowTitle(_translate("MainWindow", "Scarlet Flandre Control Panel"))
self.g_device.setTitle(_translate("MainWindow", "Device Status")) self.label_30.setText(_translate("MainWindow", "Ultrasound T/R Device Driver"))
self.l_online.setText(_translate("MainWindow", "Device Offline"))
self.b_device_connection.setText(_translate("MainWindow", "Connect")) self.b_device_connection.setText(_translate("MainWindow", "Connect"))
self.lb_device_connection.setText(_translate("MainWindow", "Disconnected")) self.lb_device_connection.setText(_translate("MainWindow", "Disconnected"))
self.lb_device_enable.setText(_translate("MainWindow", "Disabled")) self.lb_device_enable.setText(_translate("MainWindow", "Disabled"))
self.b_device_enable.setText(_translate("MainWindow", "Disconnect")) self.b_device_enable.setText(_translate("MainWindow", "Disconnect"))
self.label_24.setText(_translate("MainWindow", "<html><head/><body><p style=\"line-height:0.3\" align=\"center\">Beam</p><p align=\"center\">Status</p></body></html>")) self.label_24.setText(_translate("MainWindow", "<html><head/><body><p style=\"line-height:0.3\" align=\"center\">Beam</p><p align=\"center\">Status</p></body></html>"))
self.label_21.setText(_translate("MainWindow", "<html><head/><body><p style=\"line-height:0.3\" align=\"center\">Connection</p><p align=\"center\">Status</p></body></html>")) self.label_21.setText(_translate("MainWindow", "<html><head/><body><p style=\"line-height:0.3\" align=\"center\">Connection</p><p align=\"center\">Status</p></body></html>"))
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.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.b_device_zero.setText(_translate("MainWindow", "Zero"))
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"))
@ -477,18 +573,10 @@ class Ui_MainWindow(object):
self.label_12.setText(_translate("MainWindow", "Roll")) self.label_12.setText(_translate("MainWindow", "Roll"))
self.label_11.setText(_translate("MainWindow", "E")) self.label_11.setText(_translate("MainWindow", "E"))
self.label_8.setText(_translate("MainWindow", "X")) 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.cb_bscan.setText(_translate("MainWindow", "BSCAN"))
self.checkBox.setText(_translate("MainWindow", "FOCUS")) 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.label_17.setText(_translate("MainWindow", "RecordName"))
self.b_record.setText(_translate("MainWindow", "Record")) self.b_record.setText(_translate("MainWindow", "Record"))
self.label_18.setText(_translate("MainWindow", "Record Frames:")) 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.l_record_size.setText(_translate("MainWindow", "0"))
self.label_26.setText(_translate("MainWindow", "Max SeqId:")) self.label_26.setText(_translate("MainWindow", "Max SeqId:"))
self.l_record_max_sid.setText(_translate("MainWindow", "0")) self.l_record_max_sid.setText(_translate("MainWindow", "0"))
self.b_play_live.setText(_translate("MainWindow", "Live")) self.g_playback.setTitle(_translate("MainWindow", "Playback"))
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.label_4.setText(_translate("MainWindow", "Frame ID")) 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.c_playback_seq_name.setItemText(0, _translate("MainWindow", "Unset"))
self.label26.setText(_translate("MainWindow", "Min:")) self.label26.setText(_translate("MainWindow", "Min:"))
self.l_seq_min.setText(_translate("MainWindow", "0")) 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.l_seq_current.setText(_translate("MainWindow", "0"))
self.label_29.setText(_translate("MainWindow", "Max:")) self.label_29.setText(_translate("MainWindow", "Max:"))
self.l_seq_max.setText(_translate("MainWindow", "0")) 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"))

File diff suppressed because it is too large Load Diff

View File

@ -10,6 +10,7 @@ from utils.RfMeta import RfFrameMeta
class BG(Enum): class BG(Enum):
Msg1 = auto() Msg1 = auto()
Msg2 = auto() Msg2 = auto()
RefreshDeviceMsg = auto()
BMMsg = auto() BMMsg = auto()
TickMsg = auto() TickMsg = auto()
KillMsg = auto() KillMsg = auto()
@ -17,6 +18,7 @@ class BG(Enum):
MoveAxisMsg = auto() MoveAxisMsg = auto()
ImageArgMsg = auto() ImageArgMsg = auto()
SetSeqMetaMsg = auto() SetSeqMetaMsg = auto()
SeqMetaMsg = auto()
SeqIdMinMax = auto() SeqIdMinMax = auto()
SetBaseMsg = auto() SetBaseMsg = auto()
SeqListMsg = auto() SeqListMsg = auto()
@ -43,6 +45,8 @@ class BG(Enum):
MidiMsg = auto() MidiMsg = auto()
JoystickMsg = auto() JoystickMsg = auto()
DeviceZero = auto() DeviceZero = auto()
SetDeviceSwitchMsg = auto()
DeviceSwitchMsg = auto()
class Msg: class Msg:
@ -83,6 +87,8 @@ class Msg1(Msg):
a: int = 0 a: int = 0
b: int = 1 b: int = 1
class RefreshDeviceMsg(Msg):
pass
@dataclasses.dataclass @dataclasses.dataclass
class KillMsg(Msg): class KillMsg(Msg):
@ -143,9 +149,10 @@ class SetRecordMsg(Msg):
commit: str = '' commit: str = ''
base: str = '' base: str = ''
@dataclasses.dataclass
class SetDeviceConfigMsg(StrMsg): class SetDeviceConfigMsg(Msg):
pass name:str
txt:str
class SetBaseMsg(StrMsg): class SetBaseMsg(StrMsg):
@ -171,6 +178,10 @@ class SetSeqMetaMsg(Msg):
target: str target: str
name: str name: str
@dataclasses.dataclass
class SeqMetaMsg(Msg):
target: str
name: str
@dataclasses.dataclass @dataclasses.dataclass
class SeqIdMinMax(Msg): class SeqIdMinMax(Msg):
@ -328,6 +339,14 @@ class JoystickMsg(Msg):
value: float value: float
class DeviceSwitchMsg(StrMsg):
pass
class SetDeviceSwitchMsg(BoolMsg):
pass
@dataclasses.dataclass @dataclasses.dataclass
class RobotRtsiMsg(Msg): class RobotRtsiMsg(Msg):
pos: tuple[int, int, int, int, int, int] pos: tuple[int, int, int, int, int, int]

View File

@ -1,4 +1,6 @@
import socket import socket
import subprocess
def check_port(host, port): def check_port(host, port):
try: try:
@ -12,4 +14,16 @@ def check_port(host, port):
return False return False
except socket.error as e: except socket.error as e:
print(f"连接过程中发生错误: {e}") print(f"连接过程中发生错误: {e}")
return False 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

View File

@ -9,6 +9,7 @@ from nodes.ImageCV import ImageCV
from nodes.ImageFFMPEG import ImageFFMPEG from nodes.ImageFFMPEG import ImageFFMPEG
from nodes.JoyStick import Joystick from nodes.JoyStick import Joystick
from nodes.Loader import Loader from nodes.Loader import Loader
from nodes.Mi import Mi
from nodes.Midi import Midi from nodes.Midi import Midi
from nodes.Monitor import Monitor from nodes.Monitor import Monitor
from nodes.Muxer import Muxer from nodes.Muxer import Muxer
@ -25,17 +26,18 @@ if __name__ == '__main__':
ps = [ ps = [
Broker(), Broker(),
kde_pyqt6_mainui, kde_pyqt6_mainui,
Device(level=logging.DEBUG), Device(),
# ImageFFMPEG(), ImageFFMPEG(),
ImageCV(level=logging.DEBUG), ImageCV(level=logging.DEBUG),
Beamformer(level=logging.DEBUG), Beamformer(level=logging.DEBUG),
Loader(), Loader(),
Muxer(level=logging.DEBUG), Muxer(level=logging.DEBUG),
Midi(), # Midi(),
# Joystick(), # Joystick(),
Robot(), Robot(),
Recorder(), Recorder(),
# Monitor(), # Monitor(),
Mi(),
] ]
for p in ps: for p in ps:
pps.append(multiprocessing.Process(target=p)) pps.append(multiprocessing.Process(target=p))

View File

@ -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()) # d.setfile(Path('/home/lambda/source/scarlet/flandre/config/device/AA256,U=30,M=PWI,S=(256 1502).txt').read_text())
# time.sleep(2) # time.sleep(2)
while True: while True:
d.data() r = d.get_data()
print(1) print(r.__len__())
break
# d.disable() # d.disable()
# d.disconnect() # d.disconnect()

View File

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