From e86ef2f8de2802adc9bf7b9ea75b1aeca5ec0ecd Mon Sep 17 00:00:00 2001
From: remilia
Date: Mon, 3 Mar 2025 22:22:06 +0800
Subject: [PATCH] add many
---
.../device/AA256,U=30,M=PWI,S=(256 1502).txt | 7 +
.../device/AAA256,U=80,M=PWI,S=(256 4002).txt | 138 ++++
pyproject.toml | 3 +
src/BusClient.py | 2 +
src/nodes/Beamformer.py | 2 +-
src/nodes/Device.py | 22 +-
src/nodes/JoyStick.py | 123 +++
src/nodes/MainUI.py | 40 +-
src/nodes/Midi.py | 66 ++
src/nodes/Node.py | 5 +-
src/ui/Main.py | 417 ++++++----
src/ui/Main.ui | 772 ++++++++++--------
src/utils/Msg.py | 20 +
src/utils/mi.py | 36 +-
test/kdemain.py | 8 +-
test/testmiio.py | 37 +-
uv.lock | 209 ++---
17 files changed, 1253 insertions(+), 654 deletions(-)
create mode 100644 config/device/AAA256,U=80,M=PWI,S=(256 4002).txt
create mode 100644 src/nodes/JoyStick.py
create mode 100644 src/nodes/Midi.py
diff --git a/config/device/AA256,U=30,M=PWI,S=(256 1502).txt b/config/device/AA256,U=30,M=PWI,S=(256 1502).txt
index 2e9e02a..a59b332 100644
--- a/config/device/AA256,U=30,M=PWI,S=(256 1502).txt
+++ b/config/device/AA256,U=30,M=PWI,S=(256 1502).txt
@@ -9,6 +9,13 @@ DisableUSB3=1
AscanBitSize=14Bits
Enable256=0
+SWEncoder1Resolution=1
+TriggerMode=Internal
+Encoder1A=DigitalInput01
+Encoder1B=DigitalInput02
+Encoder1Type=Quadrature4Edges
+RequestIO=OnCycleOnly
+
[Cycle:0]
GainDigital=0.000000 dB
BeamCorrection=0.0 dB
diff --git a/config/device/AAA256,U=80,M=PWI,S=(256 4002).txt b/config/device/AAA256,U=80,M=PWI,S=(256 4002).txt
new file mode 100644
index 0000000..e051dc5
--- /dev/null
+++ b/config/device/AAA256,U=80,M=PWI,S=(256 4002).txt
@@ -0,0 +1,138 @@
+[Root]
+VersionDriverOEMPA=1.3.0.0
+CycleCount=1
+EnableFMC=1
+FMCElementStart=0
+FMCElementStop=255
+FMCElementStep=1
+DisableUSB3=1
+AscanBitSize=14Bits
+Enable256=0
+
+[Cycle:0]
+GainDigital=0.000000 dB
+BeamCorrection=0.0 dB
+Start=0.000000 us
+Range=80.000000 us
+TimeSlot=3987.300000 us
+PointFactor=2
+CompressionType=Decimation
+Rectification=Signed
+FilterIndex=0
+GainAnalog=40.000000 dB
+GateCount=0
+
+[Cycle:0\Pulser]
+WedgeDelay=0.0 us
+Element.count=256
+Element_0=0;1;2;3;4;5;6;7
+Element_8=8;9;10;11;12;13;14;15
+Element_16=16;17;18;19;20;21;22;23
+Element_24=24;25;26;27;28;29;30;31
+Element_32=32;33;34;35;36;37;38;39
+Element_40=40;41;42;43;44;45;46;47
+Element_48=48;49;50;51;52;53;54;55
+Element_56=56;57;58;59;60;61;62;63
+Element_64=64;65;66;67;68;69;70;71
+Element_72=72;73;74;75;76;77;78;79
+Element_80=80;81;82;83;84;85;86;87
+Element_88=88;89;90;91;92;93;94;95
+Element_96=96;97;98;99;100;101;102;103
+Element_104=104;105;106;107;108;109;110;111
+Element_112=112;113;114;115;116;117;118;119
+Element_120=120;121;122;123;124;125;126;127
+Element_128=128;129;130;131;132;133;134;135
+Element_136=136;137;138;139;140;141;142;143
+Element_144=144;145;146;147;148;149;150;151
+Element_152=152;153;154;155;156;157;158;159
+Element_160=160;161;162;163;164;165;166;167
+Element_168=168;169;170;171;172;173;174;175
+Element_176=176;177;178;179;180;181;182;183
+Element_184=184;185;186;187;188;189;190;191
+Element_192=192;193;194;195;196;197;198;199
+Element_200=200;201;202;203;204;205;206;207
+Element_208=208;209;210;211;212;213;214;215
+Element_216=216;217;218;219;220;221;222;223
+Element_224=224;225;226;227;228;229;230;231
+Element_232=232;233;234;235;236;237;238;239
+Element_240=240;241;242;243;244;245;246;247
+Element_248=248;249;250;251;252;253;254;255
+Delay.count=256;1
+Delay_0=0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000 us
+Delay_8=0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000 us
+Delay_16=0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000 us
+Delay_24=0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000 us
+Delay_32=0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000 us
+Delay_40=0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000 us
+Delay_48=0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000 us
+Delay_56=0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000 us
+Delay_64=0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000 us
+Delay_72=0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000 us
+Delay_80=0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000 us
+Delay_88=0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000 us
+Delay_96=0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000 us
+Delay_104=0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000 us
+Delay_112=0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000 us
+Delay_120=0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000 us
+Delay_128=0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000 us
+Delay_136=0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000 us
+Delay_144=0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000 us
+Delay_152=0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000 us
+Delay_160=0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000 us
+Delay_168=0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000 us
+Delay_176=0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000 us
+Delay_184=0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000 us
+Delay_192=0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000 us
+Delay_200=0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000 us
+Delay_208=0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000 us
+Delay_216=0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000 us
+Delay_224=0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000 us
+Delay_232=0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000 us
+Delay_240=0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000 us
+Delay_248=0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000;0.000000 us
+Width.count=256
+Width_0=0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429 us
+Width_8=0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429 us
+Width_16=0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429 us
+Width_24=0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429 us
+Width_32=0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429 us
+Width_40=0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429 us
+Width_48=0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429 us
+Width_56=0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429 us
+Width_64=0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429 us
+Width_72=0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429 us
+Width_80=0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429 us
+Width_88=0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429 us
+Width_96=0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429 us
+Width_104=0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429 us
+Width_112=0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429 us
+Width_120=0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429 us
+Width_128=0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429 us
+Width_136=0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429 us
+Width_144=0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429 us
+Width_152=0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429 us
+Width_160=0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429 us
+Width_168=0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429 us
+Width_176=0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429 us
+Width_184=0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429 us
+Width_192=0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429 us
+Width_200=0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429 us
+Width_208=0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429 us
+Width_216=0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429 us
+Width_224=0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429 us
+Width_232=0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429 us
+Width_240=0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429 us
+Width_248=0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429;0.071429 us
+
+[Cycle:0\Receiver]
+WedgeDelay=0.0 us
+Element.count=1
+Element=0
+Focusing=Standard
+Delay.count=1;1
+Delay=0.0 us
+Gain.count=1
+Gain=0.0 dB
+FocalTimeOfFlight.count=1
+FocalTimeOfFlight=0.0 us
+
diff --git a/pyproject.toml b/pyproject.toml
index 0142715..868628d 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -16,4 +16,7 @@ dependencies = [
"vtk>=9.4.0",
"jupyter>=1.1.1",
"python-miio>=0.5.12",
+ "click>=8.1.8",
+ "mido[ports-rtmidi]>=1.3.3",
+ "pyjoystick>=1.2.4",
]
diff --git a/src/BusClient.py b/src/BusClient.py
index 342fbc4..6adb4f9 100644
--- a/src/BusClient.py
+++ b/src/BusClient.py
@@ -24,6 +24,8 @@ class BusClient:
self.sub = self.ctx.socket(zmq.SUB)
for msg in msgs:
self.sub.setsockopt(zmq.SUBSCRIBE, msg.magic() + msg.eid())
+ if msgs.__len__() == 0:
+ self.sub.setsockopt(zmq.SUBSCRIBE, b'')
if conflare:
self.sub.setsockopt(zmq.CONFLATE, 1)
self.sub.connect(f'tcp://127.0.0.1:{self.bp}')
diff --git a/src/nodes/Beamformer.py b/src/nodes/Beamformer.py
index 8607ab8..08f29fd 100644
--- a/src/nodes/Beamformer.py
+++ b/src/nodes/Beamformer.py
@@ -37,7 +37,7 @@ class Beamformer(Node):
time.sleep(1)
while True:
self.send(RequestRfFrameMsg())
- r = dict(self.c.poller.poll(1000))
+ r = dict(self.c.poller.poll(10))
if self.c.sub in r:
msg = self.recv()
if isinstance(msg, BeamformerMsg):
diff --git a/src/nodes/Device.py b/src/nodes/Device.py
index 746ea21..8ea31bd 100644
--- a/src/nodes/Device.py
+++ b/src/nodes/Device.py
@@ -2,6 +2,7 @@ import logging
import struct
import subprocess
import time
+from threading import Thread
import zmq
@@ -9,14 +10,14 @@ 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
+ RfFrameWithMetaMsg, DeviceZero
from utils.RfMeta import RfFrameMeta
logger = logging.getLogger(__name__)
class Device(Node):
- topics = [SetDeviceConnectedMsg, SetDeviceEnabledMsg, SetDeviceConfigMsg, RequestRfFrameMsg]
+ topics = [SetDeviceConnectedMsg, SetDeviceEnabledMsg, SetDeviceConfigMsg, RequestRfFrameMsg, DeviceZero]
def __init__(self, level=logging.INFO):
super(Device, self).__init__(level=level)
@@ -24,6 +25,12 @@ class Device(Node):
self.seq_meta = None
self.device_rep_socket = None
self.ok = b'ok\x00'
+ self.loop2_t = None
+
+ def loop2(self):
+ while True:
+ self.online()
+ time.sleep(1)
def connect(self):
self.device_rep_socket.send(b'connect')
@@ -64,7 +71,7 @@ class Device(Node):
def online(self):
code = subprocess.run(['curl', '-m', '1', f'http://{LIVE_REP_SOCKET}'], stderr=subprocess.DEVNULL,
stdout=subprocess.DEVNULL).returncode
- logger.info(f'detect curl code: {code}')
+ logger.debug(f'detect curl code: {code}')
match code:
case 28 | 7:
self.send(DeviceOnlineMsg(False))
@@ -122,9 +129,15 @@ class Device(Node):
self.device_rep_socket.send(b'data')
return self.device_rep_socket.recv()
+ def zero(self):
+ self.device_rep_socket.send(b'zero')
+ return self.device_rep_socket.recv()
+
def custom_setup(self):
self.device_rep_socket = self.context.socket(zmq.REQ)
self.device_rep_socket.connect(f"tcp://{LIVE_REP_SOCKET}")
+ self.loop2_t = Thread(target=self.loop2)
+ self.loop2_t.start()
def loop(self):
arr = []
@@ -161,6 +174,9 @@ class Device(Node):
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))
+ elif isinstance(msg, DeviceZero):
+ self.zero()
diff --git a/src/nodes/JoyStick.py b/src/nodes/JoyStick.py
new file mode 100644
index 0000000..16cf783
--- /dev/null
+++ b/src/nodes/JoyStick.py
@@ -0,0 +1,123 @@
+import logging
+from threading import Thread
+
+import mido
+import pyjoystick
+import zmq
+from mido.backends.rtmidi import Input, Output
+from pyjoystick.sdl2 import Key, Joystick, run_event_loop
+
+from nodes.Node import Node
+from utils.Msg import KillMsg, Msg, ImageArgMsg, JoystickMsg
+
+logger = logging.getLogger(__name__)
+
+
+def clamp(x, t):
+ if -t < x < t:
+ return 0.0
+ return x
+
+
+class Joystick(Node):
+ def __init__(self, level=logging.INFO):
+ super(Joystick, self).__init__(level=level)
+ self.m_input: Input = None
+ self.m_output: Output = None
+ self.do_loop = True
+ self.t_joystick_event_loop: Thread = None
+ self.isa: zmq.Socket = None
+
+ def sendj(self, t=0.1):
+ d2 = self.d.copy()
+ self.s2.send_json(dict(
+ x=clamp(d2['x'], t),
+ y=clamp(d2['y'], t),
+ z=clamp(d2['z'], t),
+ rx=clamp(d2['rx'], t),
+ ry=clamp(d2['ry'], t),
+ rz=clamp(d2['rz'], t),
+ ))
+
+ def custom_setup(self):
+ self.isa = self.c.ctx.socket(zmq.PUSH)
+ self.isa.bind("inproc://midi")
+
+ self.s2 = self.c.ctx.socket(zmq.PUSH)
+ self.s2.connect("tcp://11.6.1.63:5555")
+
+ self.t_joystick_event_loop = Thread(target=self.joystick_event_loop)
+ self.t_joystick_event_loop.start()
+ self.arg = ImageArgMsg('joystick', 0, 0)
+ self.arg1 = 0
+ self.d = dict(
+ x=0.0,
+ y=0.0,
+ z=0.0,
+ rx=0.0,
+ ry=0.0,
+ rz=0.0,
+ )
+ self.rz1 = 0
+ self.rz2 = 0
+
+ self.z1 = 0
+ self.z2 = 0
+
+ def joystick_event_loop(self):
+ def key_received(key: pyjoystick.interface.Key):
+ msg = JoystickMsg(str(key).replace('-', ''), key.value)
+ # print(msg)
+ match msg.key:
+ case 'Axis 0':
+ self.d['x'] = -msg.value
+ case 'Axis 1':
+ self.d['y'] = msg.value
+ case 'Axis 4':
+ self.d['rx'] = -msg.value
+ case 'Axis 3':
+ self.d['ry'] = -msg.value
+ case 'Axis 2':
+ self.z1 = msg.value
+ case 'Axis 5':
+ self.z2 = - msg.value
+ case 'Button 4':
+ self.rz1 = - msg.value
+ case 'Button 5':
+ self.rz2 = msg.value
+ self.d['rz'] = float(self.rz1 + self.rz2)
+ self.d['z'] = float(self.z1 + self.z2)
+
+ self.sendj()
+
+ # if msg.key == 'Axis 0':
+ # self.arg1 += msg.value
+ # self.arg.t_end = int(self.arg1 * 2)
+ # self.send(self.arg)
+
+ run_event_loop(None, None, key_received)
+
+ def loop(self):
+ isb = self.c.ctx.socket(zmq.PULL)
+ isb.connect("inproc://midi")
+ self.c.poller.register(isb, zmq.POLLIN)
+ while True:
+ p = dict(self.c.poller.poll())
+ if isb in p:
+ msg = Msg.decode_msg(isb.recv())
+ match msg.type:
+ case 'pitchwheel':
+ match msg.channel:
+ case 0:
+ # print(msg.pitch)
+ self.send(ImageArgMsg('midi', 0, msg.pitch * 3))
+ if self.c.sub in p:
+ msg = self.recv()
+ if isinstance(msg, KillMsg):
+ if msg.name == '':
+ self.do_loop = False
+ return
+
+
+if __name__ == '__main__':
+ Joystick()()
diff --git a/src/nodes/MainUI.py b/src/nodes/MainUI.py
index 160719d..d39c1d8 100644
--- a/src/nodes/MainUI.py
+++ b/src/nodes/MainUI.py
@@ -1,10 +1,12 @@
import logging
import platform
import sys
+import time
import traceback
from enum import Enum, auto
from pathlib import Path
+import zmq
from PyQt6 import QtCore, QtWidgets
from PyQt6.QtCore import QByteArray
from PyQt6.QtWidgets import QMainWindow, QApplication, QFrame, QMessageBox, QFileDialog, QLineEdit
@@ -16,7 +18,7 @@ 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
+ SeqIdList, SetWindowVisibleMsg, SetSidMsg, ImagingConfigNameListMsg, DeviceZero
from utils.RfMeta import RfSequenceMeta
logger = logging.getLogger(__name__)
@@ -97,6 +99,24 @@ class Adv(QMainWindow, Ui_MainWindow):
self.b_new_imaging_config.clicked.connect(self.on_new_imaging_config)
self.c_imaging_config.currentIndexChanged.connect(self.on_imaging_config)
+ self.b_probe_single.clicked.connect(self.on_probe('single'))
+ self.b_probe_orig.clicked.connect(self.on_probe('orig'))
+ self.b_probe_start.clicked.connect(self.on_probe('start'))
+ self.b_probe_stop.clicked.connect(self.on_probe('stop'))
+
+ self.b_device_zero.clicked.connect(lambda: self.p.send(DeviceZero()))
+
+ def on_probe(self, arg):
+ def f():
+ ctx = zmq.Context()
+ p = ctx.socket(zmq.PUSH)
+ p.connect('tcp://q1hyb.as:23456')
+ time.sleep(0.1)
+ p.send_string(arg)
+ p.disconnect('tcp://q1hyb.as:23456')
+
+ return f
+
def on_imaging_config(self, i):
name = self.c_imaging_config.itemText(i)
self.p.send(ImageArgMsg.from_path(IMAGING_CONFIG / f'{name}.json'))
@@ -322,15 +342,29 @@ class Adv(QMainWindow, Ui_MainWindow):
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, DeviceConfigListMsg):
for name, txt in msg.arr:
self.c_live_seq_name.addItem(name, txt)
elif isinstance(msg, RobotRtsiMsg):
- self.l_robot_pos.setText(','.join([f'{v}' for v in msg.pos]))
- self.l_robot_force.setText(','.join([f'{v}' for v in msg.force]))
+ self.ln_x.display(f"{msg.pos[0] / 100:.2f}")
+ self.ln_y.display(f"{msg.pos[1] / 100:.2f}")
+ self.ln_z.display(f"{msg.pos[2] / 100:.2f}")
+ self.ln_rx.display(f"{msg.pos[3] / 1000:.3f}")
+ self.ln_ry.display(f"{msg.pos[4] / 1000:.3f}")
+ self.ln_rz.display(f"{msg.pos[5] / 1000:.3f}")
+
+ self.ln_fx.display(f"{msg.force[0] / 10:.1f}")
+ self.ln_fy.display(f"{msg.force[1] / 10:.1f}")
+ self.ln_fz.display(f"{msg.force[2] / 10:.1f}")
+ self.ln_frx.display(f"{msg.force[3] / 100:.2f}")
+ self.ln_fry.display(f"{msg.force[4] / 100:.2f}")
+ self.ln_frz.display(f"{msg.force[5] / 100:.2f}")
+
elif isinstance(msg, RecordFrameMsg):
self.record_frame_cnt += 1
diff --git a/src/nodes/Midi.py b/src/nodes/Midi.py
new file mode 100644
index 0000000..7cda2e5
--- /dev/null
+++ b/src/nodes/Midi.py
@@ -0,0 +1,66 @@
+import logging
+from threading import Thread
+from unittest import case
+
+import mido
+import zmq
+from mido import Message
+from mido.backends.rtmidi import Input, Output
+
+from nodes.Node import Node
+from utils.Msg import KillMsg, MidiMsg, Msg, ImageArgMsg
+
+logger = logging.getLogger(__name__)
+
+
+class Midi(Node):
+ def __init__(self, level=logging.INFO):
+ super(Midi, self).__init__(level=level)
+ self.m_input: Input = None
+ self.m_output: Output = None
+ self.do_loop = True
+ self.t_midi_event_loop: Thread = None
+ self.isa: zmq.Socket = None
+
+ def custom_setup(self):
+ self.isa = self.c.ctx.socket(zmq.PUSH)
+ self.isa.bind("inproc://midi")
+
+ self.m_input: Input = mido.open_input('SMC-Mixer:SMC-Mixer Bluetooth 128:0')
+ self.m_output: Output = mido.open_output('SMC-Mixer:SMC-Mixer Bluetooth 128:0')
+ self.t_midi_event_loop = Thread(target=self.midi_event_loop)
+ self.t_midi_event_loop.start()
+
+ def midi_event_loop(self):
+ while self.do_loop:
+ midi_msg: Message = self.m_input.receive()
+ # print(midi_msg)
+ d = midi_msg.dict()
+ match d['type']:
+ case 'pitchwheel':
+ channel = d['channel']
+ # 0-127
+ pitch = int(d['pitch'] / 128) + 64
+ # pitch_p = int(pitch / 127)
+ self.isa.send(MidiMsg(type='pitchwheel', channel=channel, pitch=pitch).encode_msg())
+
+ def loop(self):
+ isb = self.c.ctx.socket(zmq.PULL)
+ isb.connect("inproc://midi")
+ self.c.poller.register(isb, zmq.POLLIN)
+ while True:
+ p = dict(self.c.poller.poll())
+ if isb in p:
+ msg = Msg.decode_msg(isb.recv())
+ match msg.type:
+ case 'pitchwheel':
+ match msg.channel:
+ case 0:
+ # print(msg.pitch)
+ self.send(ImageArgMsg('midi', 0, msg.pitch * 3))
+ if self.c.sub in p:
+ msg = self.recv()
+ if isinstance(msg, KillMsg):
+ if msg.name == '':
+ self.do_loop = False
+ return
diff --git a/src/nodes/Node.py b/src/nodes/Node.py
index d7665c9..039b201 100644
--- a/src/nodes/Node.py
+++ b/src/nodes/Node.py
@@ -37,8 +37,9 @@ class Node:
def base_setup(self):
FORMAT = '[%(asctime)s] p%(process)s {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s'
- FORMAT = '"%(pathname)s:%(lineno)d" %(levelname)s - %(message)s'
- logging.basicConfig(level=self.level, format=FORMAT)
+ 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',)
+
self.context = zmq.Context()
if self.enable_init:
self.c = BusClient(*([KillMsg] + self.topics), poller=True, conflare=self.conflare)
diff --git a/src/ui/Main.py b/src/ui/Main.py
index 23acc0a..73111eb 100644
--- a/src/ui/Main.py
+++ b/src/ui/Main.py
@@ -12,91 +12,68 @@ from PyQt6 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
- MainWindow.resize(1158, 805)
+ MainWindow.resize(1158, 998)
self.centralwidget = QtWidgets.QWidget(parent=MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout.setObjectName("gridLayout")
- self.gridLayout_3 = QtWidgets.QGridLayout()
- self.gridLayout_3.setObjectName("gridLayout_3")
- self.horizontalLayout = QtWidgets.QHBoxLayout()
- self.horizontalLayout.setObjectName("horizontalLayout")
- self.label_20 = QtWidgets.QLabel(parent=self.centralwidget)
- self.label_20.setObjectName("label_20")
- self.horizontalLayout.addWidget(self.label_20)
- self.c_live_seq_name = QtWidgets.QComboBox(parent=self.centralwidget)
- 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.gridLayout_3.addLayout(self.horizontalLayout, 3, 0, 1, 4)
- self.b_device_enable = QtWidgets.QPushButton(parent=self.centralwidget)
- self.b_device_enable.setEnabled(False)
- self.b_device_enable.setObjectName("b_device_enable")
- self.gridLayout_3.addWidget(self.b_device_enable, 2, 3, 1, 1)
- self.b_device_connection = QtWidgets.QPushButton(parent=self.centralwidget)
- self.b_device_connection.setObjectName("b_device_connection")
- self.gridLayout_3.addWidget(self.b_device_connection, 2, 1, 1, 1)
- self.label_24 = QtWidgets.QLabel(parent=self.centralwidget)
- self.label_24.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
- self.label_24.setObjectName("label_24")
- self.gridLayout_3.addWidget(self.label_24, 1, 2, 2, 1)
- self.lb_device_connection = QtWidgets.QLabel(parent=self.centralwidget)
- self.lb_device_connection.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
- self.lb_device_connection.setObjectName("lb_device_connection")
- self.gridLayout_3.addWidget(self.lb_device_connection, 1, 1, 1, 1)
- self.l_online = QtWidgets.QLabel(parent=self.centralwidget)
+ self.g_device = QtWidgets.QGroupBox(parent=self.centralwidget)
+ self.g_device.setEnabled(True)
+ 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.gridLayout_3.addWidget(self.l_online, 0, 0, 1, 4)
- self.lb_device_enable = QtWidgets.QLabel(parent=self.centralwidget)
+ 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)
+ self.b_device_connection.setObjectName("b_device_connection")
+ self.gridLayout_8.addWidget(self.b_device_connection, 1, 1, 1, 1)
+ self.lb_device_connection = QtWidgets.QLabel(parent=self.g_device)
+ self.lb_device_connection.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
+ self.lb_device_connection.setObjectName("lb_device_connection")
+ self.gridLayout_8.addWidget(self.lb_device_connection, 0, 1, 1, 1)
+ self.lb_device_enable = QtWidgets.QLabel(parent=self.g_device)
self.lb_device_enable.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
self.lb_device_enable.setObjectName("lb_device_enable")
- self.gridLayout_3.addWidget(self.lb_device_enable, 1, 3, 1, 1)
- self.label_21 = QtWidgets.QLabel(parent=self.centralwidget)
+ self.gridLayout_8.addWidget(self.lb_device_enable, 0, 3, 1, 1)
+ self.b_device_enable = QtWidgets.QPushButton(parent=self.g_device)
+ self.b_device_enable.setEnabled(False)
+ self.b_device_enable.setObjectName("b_device_enable")
+ self.gridLayout_8.addWidget(self.b_device_enable, 1, 3, 1, 1)
+ self.label_24 = QtWidgets.QLabel(parent=self.g_device)
+ self.label_24.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
+ self.label_24.setObjectName("label_24")
+ self.gridLayout_8.addWidget(self.label_24, 0, 2, 2, 1)
+ self.label_21 = QtWidgets.QLabel(parent=self.g_device)
self.label_21.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
self.label_21.setObjectName("label_21")
- self.gridLayout_3.addWidget(self.label_21, 1, 0, 2, 1)
- self.gridLayout_3.setColumnStretch(1, 1)
- self.gridLayout_3.setColumnStretch(3, 1)
- self.gridLayout.addLayout(self.gridLayout_3, 0, 0, 1, 1)
- self.gridLayout_2 = QtWidgets.QGridLayout()
- self.gridLayout_2.setObjectName("gridLayout_2")
- self.l_robot_pos = QtWidgets.QLabel(parent=self.centralwidget)
- font = QtGui.QFont()
- font.setPointSize(15)
- self.l_robot_pos.setFont(font)
- self.l_robot_pos.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
- self.l_robot_pos.setObjectName("l_robot_pos")
- self.gridLayout_2.addWidget(self.l_robot_pos, 1, 1, 1, 1)
- self.l_robot_force = QtWidgets.QLabel(parent=self.centralwidget)
- font = QtGui.QFont()
- font.setPointSize(15)
- self.l_robot_force.setFont(font)
- self.l_robot_force.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
- self.l_robot_force.setObjectName("l_robot_force")
- self.gridLayout_2.addWidget(self.l_robot_force, 2, 1, 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.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.label_19 = QtWidgets.QLabel(parent=self.centralwidget)
- font = QtGui.QFont()
- 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, 2)
- self.gridLayout_2.setColumnStretch(1, 1)
- self.gridLayout.addLayout(self.gridLayout_2, 0, 1, 1, 1)
+ self.gridLayout_8.addWidget(self.label_21, 0, 0, 2, 1)
+ 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.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.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.gridLayout_4 = QtWidgets.QGridLayout()
self.gridLayout_4.setObjectName("gridLayout_4")
self.label_14 = QtWidgets.QLabel(parent=self.centralwidget)
@@ -179,7 +156,23 @@ class Ui_MainWindow(object):
self.horizontalSlider_8.setOrientation(QtCore.Qt.Orientation.Horizontal)
self.horizontalSlider_8.setObjectName("horizontalSlider_8")
self.gridLayout_4.addWidget(self.horizontalSlider_8, 6, 1, 1, 1)
- self.gridLayout.addLayout(self.gridLayout_4, 2, 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.gridLayout_5 = QtWidgets.QGridLayout()
self.gridLayout_5.setObjectName("gridLayout_5")
self.spinBox_3 = QtWidgets.QSpinBox(parent=self.centralwidget)
@@ -247,7 +240,158 @@ class Ui_MainWindow(object):
self.horizontalLayout_3.addWidget(self.b_new_imaging_config)
self.horizontalLayout_3.setStretch(1, 1)
self.gridLayout_5.addLayout(self.horizontalLayout_3, 2, 0, 1, 3)
- self.gridLayout.addLayout(self.gridLayout_5, 2, 0, 1, 1)
+ 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.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)
+ font = QtGui.QFont()
+ 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)
@@ -299,76 +443,6 @@ class Ui_MainWindow(object):
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.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, 3, 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_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, 4, 0, 1, 2)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(parent=MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 1158, 30))
@@ -384,20 +458,17 @@ 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.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.c_live_seq_name.setItemText(0, _translate("MainWindow", "Empty"))
- self.b_device_enable.setText(_translate("MainWindow", "Disconnect"))
- self.b_device_connection.setText(_translate("MainWindow", "Connect"))
- self.label_24.setText(_translate("MainWindow", "Beam
Status
"))
- self.lb_device_connection.setText(_translate("MainWindow", "Disconnected"))
- self.l_online.setText(_translate("MainWindow", "Device Offline"))
- self.lb_device_enable.setText(_translate("MainWindow", "Disabled"))
- self.label_21.setText(_translate("MainWindow", "Connection
Status
"))
- self.l_robot_pos.setText(_translate("MainWindow", "0,0,0,0,0,0"))
- self.l_robot_force.setText(_translate("MainWindow", "0,0,0,0,0,0"))
- self.label_22.setText(_translate("MainWindow", "Position"))
- self.label_23.setText(_translate("MainWindow", "Force"))
- self.label_19.setText(_translate("MainWindow", "Robot Offline"))
+ self.b_device_zero.setText(_translate("MainWindow", "Zero"))
self.label_14.setText(_translate("MainWindow", "Yal"))
self.label_13.setText(_translate("MainWindow", "Pitch"))
self.label_3.setText(_translate("MainWindow", "Probe Position"))
@@ -406,6 +477,9 @@ 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"))
@@ -413,6 +487,25 @@ class Ui_MainWindow(object):
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.label_17.setText(_translate("MainWindow", "RecordName"))
+ self.b_record.setText(_translate("MainWindow", "Record"))
+ self.label_18.setText(_translate("MainWindow", "Record Frames:"))
+ self.l_record_frames.setText(_translate("MainWindow", "0"))
+ self.label_25.setText(_translate("MainWindow", "Record Size:"))
+ self.l_record_size.setText(_translate("MainWindow", "0"))
+ self.label_26.setText(_translate("MainWindow", "Max SeqId:"))
+ self.l_record_max_sid.setText(_translate("MainWindow", "0"))
+ self.b_play_live.setText(_translate("MainWindow", "Live"))
+ self.b_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"))
@@ -423,17 +516,3 @@ 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.setText(_translate("MainWindow", "Base Path"))
- self.b_select_base.setText(_translate("MainWindow", "Select"))
- self.b_base.setText(_translate("MainWindow", "Open"))
- self.label_17.setText(_translate("MainWindow", "RecordName"))
- self.b_record.setText(_translate("MainWindow", "Record"))
- self.label_18.setText(_translate("MainWindow", "Record Frames:"))
- self.l_record_frames.setText(_translate("MainWindow", "0"))
- self.label_25.setText(_translate("MainWindow", "Record Size:"))
- self.l_record_size.setText(_translate("MainWindow", "0"))
- self.label_26.setText(_translate("MainWindow", "Max SeqId:"))
- self.l_record_max_sid.setText(_translate("MainWindow", "0"))
- self.b_play_live.setText(_translate("MainWindow", "Live"))
- self.cb_bscan.setText(_translate("MainWindow", "BSCAN"))
- self.checkBox.setText(_translate("MainWindow", "FOCUS"))
diff --git a/src/ui/Main.ui b/src/ui/Main.ui
index 4eaf95e..41561b7 100644
--- a/src/ui/Main.ui
+++ b/src/ui/Main.ui
@@ -7,183 +7,136 @@
0
0
1158
- 805
+ 998
Scarlet Flandre Control Panel
-
+
-
-
-
-
-
-
-
-
-
- DeviceConfig
-
-
-
- -
-
-
- false
-
-
-
+
+
+ true
+
+
+ Device Status
+
+
+
-
+
+
+
+ 15
+
+
+
+ background-color: pink;
+
+
+ Device Offline
+
+
+ Qt::AlignmentFlag::AlignCenter
+
+
+
+ -
+
+
-
+
- Empty
+ Connect
-
-
-
-
-
- -
-
-
- false
-
-
- Disconnect
-
-
-
- -
-
-
- Connect
-
-
-
- -
-
-
- <html><head/><body><p style="line-height:0.3" align="center">Beam</p><p align="center">Status</p></body></html>
-
-
- Qt::AlignmentFlag::AlignCenter
-
-
-
- -
-
-
- Disconnected
-
-
- Qt::AlignmentFlag::AlignCenter
-
-
-
- -
-
-
-
- 15
-
-
-
- background-color: pink;
-
-
- Device Offline
-
-
- Qt::AlignmentFlag::AlignCenter
-
-
-
- -
-
-
- Disabled
-
-
- 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
-
-
-
-
+
+
+ -
+
+
+ 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
+
+
+
+
+
+ -
+
+
-
+
+
+ DeviceConfig
+
+
+
+ -
+
+
+ false
+
+
-
+
+ Empty
+
+
+
+
+
+
+ -
+
+
+ Zero
+
+
+
+
+
- -
-
-
-
-
-
-
- 15
-
-
-
- 0,0,0,0,0,0
-
-
- Qt::AlignmentFlag::AlignCenter
-
-
-
- -
-
-
-
- 15
-
-
-
- 0,0,0,0,0,0
-
-
- Qt::AlignmentFlag::AlignCenter
-
-
-
- -
-
-
- Position
-
-
-
- -
-
-
- Force
-
-
-
- -
-
-
-
- 15
-
-
-
- background-color: pink;
-
-
- Robot Offline
-
-
- Qt::AlignmentFlag::AlignCenter
-
-
-
-
-
- -
+
-
-
@@ -335,7 +288,39 @@
- -
+
-
+
+
-
+
+
+ Base Path
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+ Select
+
+
+
+ -
+
+
+ Open
+
+
+
+
+
+ -
-
@@ -463,6 +448,307 @@
+ -
+
+
-
+
+
+ BSCAN
+
+
+ true
+
+
+
+ -
+
+
+ FOCUS
+
+
+
+ -
+
+
+ Qt::Orientation::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+
+
+ -
+
+
-
+
+
+ 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
+
+
+
+
+
-
-
@@ -565,156 +851,6 @@
- -
-
-
-
-
-
- Base Path
-
-
-
- -
-
-
-
-
-
-
- -
-
-
- Select
-
-
-
- -
-
-
- Open
-
-
-
-
-
- -
-
-
-
-
-
- false
-
-
-
- -
-
-
- RecordName
-
-
-
- -
-
-
- false
-
-
- Record
-
-
-
- -
-
-
-
-
-
- Record Frames:
-
-
-
- -
-
-
- 0
-
-
-
- -
-
-
- Record Size:
-
-
-
- -
-
-
- 0
-
-
-
- -
-
-
- Max SeqId:
-
-
-
- -
-
-
- 0
-
-
-
-
-
- -
-
-
- false
-
-
- Live
-
-
-
-
-
- -
-
-
-
-
-
- BSCAN
-
-
- true
-
-
-
- -
-
-
- FOCUS
-
-
-
- -
-
-
- Qt::Orientation::Horizontal
-
-
-
- 40
- 20
-
-
-
-
-
-