test real

This commit is contained in:
remilia 2025-04-15 21:18:04 +08:00
parent 6308cc5dc2
commit 7d10eba483
22 changed files with 357 additions and 73 deletions

View File

@ -0,0 +1,145 @@
[Root]
VersionDriverOEMPA=1.3.0.1
CycleCount=1
EnableFMC=1
FMCElementStart=0
FMCElementStop=255
FMCElementStep=1
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
Start=0.000000 us
Range=100.000000 us
TimeSlot=4169.900000 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.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000 us
Width_8=0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000 us
Width_16=0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000 us
Width_24=0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000 us
Width_32=0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000 us
Width_40=0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000 us
Width_48=0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000 us
Width_56=0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000 us
Width_64=0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000 us
Width_72=0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000 us
Width_80=0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000 us
Width_88=0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000 us
Width_96=0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000 us
Width_104=0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000 us
Width_112=0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000 us
Width_120=0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000 us
Width_128=0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000 us
Width_136=0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000 us
Width_144=0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000 us
Width_152=0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000 us
Width_160=0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000 us
Width_168=0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000 us
Width_176=0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000 us
Width_184=0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000 us
Width_192=0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000 us
Width_200=0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000 us
Width_208=0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000 us
Width_216=0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000 us
Width_224=0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000 us
Width_232=0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000 us
Width_240=0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000 us
Width_248=0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000;0.100000 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

View File

@ -9,6 +9,13 @@ DisableUSB3=1
AscanBitSize=14Bits AscanBitSize=14Bits
Enable256=0 Enable256=0
SWEncoder1Resolution=1
TriggerMode=Internal
Encoder1A=DigitalInput01
Encoder1B=DigitalInput02
Encoder1Type=Quadrature4Edges
RequestIO=OnCycleOnly
[Cycle:0] [Cycle:0]
GainDigital=0.000000 dB GainDigital=0.000000 dB
BeamCorrection=0.0 dB BeamCorrection=0.0 dB

1
config/imaging/baby.json Normal file
View File

@ -0,0 +1 @@
{"t_end": 2068, "t_start": 1439, "v2": 1524, "dct_center": 1086, "dct_bandwidth": 915, "f_rows": 3944, "beta": 30}

View File

@ -0,0 +1 @@
{"t_end": 5002, "t_start": 3239, "v2": 1524, "dct_center": 798, "dct_bandwidth": 857, "f_rows": 4939, "beta": 30}

View File

@ -18,6 +18,7 @@ from flandre.nodes.Robot import Robot
from flandre.nodes.ImageFFMPEG import ImageFFMPEG from flandre.nodes.ImageFFMPEG import ImageFFMPEG
from flandre.nodes.ImageQt import ImageQt from flandre.nodes.ImageQt import ImageQt
from flandre.nodes.Midi import Midi from flandre.nodes.Midi import Midi
from flandre.nodes.Mi import Mi
from flandre.utils.Msg import KillMsg from flandre.utils.Msg import KillMsg
from flandre.config import CONFIG_FOLDER from flandre.config import CONFIG_FOLDER
@ -33,6 +34,7 @@ class LaunchComponent(Enum):
ImageFFMPEG = ImageFFMPEG ImageFFMPEG = ImageFFMPEG
ImageQt = ImageQt ImageQt = ImageQt
Midi = Midi Midi = Midi
Mi = Mi
def launch(arg: dict[LaunchComponent, dict]): def launch(arg: dict[LaunchComponent, dict]):

View File

@ -2,6 +2,7 @@ import logging
import time import time
import cupy as cp import cupy as cp
import cv2
import zmq import zmq
from flandre.beamformer.das import gen_pwi from flandre.beamformer.das import gen_pwi
@ -10,7 +11,7 @@ from flandre.config import C
from flandre.nodes.Node import Node from flandre.nodes.Node import Node
from flandre.utils.Config import DeviceConfig from flandre.utils.Config import DeviceConfig
from flandre.utils.Msg import ImageArgMsg, Msg, RfFrameWithMetaMsg, BeamformerMsg, \ from flandre.utils.Msg import ImageArgMsg, Msg, RfFrameWithMetaMsg, BeamformerMsg, \
SeqMetaMsg, RfMatMsg SeqMetaMsg, RfMatMsg, RGB888Msg
from flandre.utils.RfFile import RfSequenceMeta from flandre.utils.RfFile import RfSequenceMeta
from flandre.utils.RfMat import RfMat from flandre.utils.RfMat import RfMat
@ -34,17 +35,22 @@ class Beamformer(Node):
return return
d2 = (data d2 = (data
# .dct(80, 1500) # .dct(80, 1500)
.dct_center(arg.dct_center, arg.dct_bandwidth) # .dct_center(arg.dct_center, arg.dct_bandwidth)
.call(lambda m: m.astype(cp.int16)) # .call(lambda m: m.astype(cp.int16))
.call(pwi) # .call(pwi)
.call(cp.asarray, order='C') # .call(cp.asarray, order='C')
.argrelextrema() # .argrelextrema()
.conv_guass(b=arg.beta * 0.01) # .conv_guass(b=arg.beta * 0.01)
.crop_center(arg.t_start, arg.t_end) # .crop_center(arg.t_start, arg.t_end)
.rotate90() .rotate90()
.cpu() .cpu()
.grey()
.call(cv2.cvtColor, cv2.COLOR_GRAY2RGB)
# .pseudo_color()
) )
# time.sleep(0.01)
self.send(RfMatMsg(d2)) self.send(RfMatMsg(d2))
# self.send(RGB888Msg(d2.__bytes__(), d2.w, d2.h))
def loop(self): def loop(self):
time.sleep(1) time.sleep(1)
@ -79,5 +85,8 @@ class Beamformer(Node):
last_f_rows = arg_msg.f_rows last_f_rows = arg_msg.f_rows
dc = DeviceConfig(v2=arg_msg.v2, rows=arg_msg.f_rows) dc = DeviceConfig(v2=arg_msg.v2, rows=arg_msg.f_rows)
pwi, _ = gen_pwi(direct_dist(dc), dc) pwi, _ = gen_pwi(direct_dist(dc), dc)
try:
if seq_meta.mode == RfSequenceMeta.RfSequenceMode.PWI: if seq_meta.mode == RfSequenceMeta.RfSequenceMode.PWI:
self.process_pwi(mat, arg_msg, pwi) self.process_pwi(mat, arg_msg, pwi)
except Exception as e:
logger.warning(e)

View File

@ -6,13 +6,14 @@ import zmq
from flandre.config import C from flandre.config import C
from flandre.nodes.Node import Node from flandre.nodes.Node import Node
from flandre.utils.Msg import BMMsg, SetWindowVisibleMsg from flandre.utils.Msg import BMMsg, SetWindowVisibleMsg, RfMatMsg
from flandre.utils.RfMat import RfMat
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class ImageCV(Node): class ImageCV(Node):
topics = [BMMsg, SetWindowVisibleMsg] topics = [BMMsg, SetWindowVisibleMsg, RfMatMsg]
def __init__(self, level=logging.INFO): def __init__(self, level=logging.INFO):
super().__init__(level=level) super().__init__(level=level)
@ -29,6 +30,10 @@ class ImageCV(Node):
b = np.frombuffer(msg.data, dtype=np.uint8) b = np.frombuffer(msg.data, dtype=np.uint8)
b = np.reshape(b, (C.video_height, C.video_width, 4)) b = np.reshape(b, (C.video_height, C.video_width, 4))
self.buffer = b self.buffer = b
elif isinstance(msg, RfMatMsg):
rfmat: RfMat = msg.rfmat
b = rfmat.pseudo_color().m
self.buffer = b
elif isinstance(msg, SetWindowVisibleMsg): elif isinstance(msg, SetWindowVisibleMsg):
if msg.name == 'bscan' and msg.sender != 'cv': if msg.name == 'bscan' and msg.sender != 'cv':
self.show = msg.value self.show = msg.value

View File

@ -11,7 +11,7 @@ from flandre.config import C
from flandre.nodes.Node import Node from flandre.nodes.Node import Node
from flandre.pyqt.Image import Ui_MainWindow from flandre.pyqt.Image import Ui_MainWindow
from flandre.pyqt.ZMQReceiver import ZMQReceiver from flandre.pyqt.ZMQReceiver import ZMQReceiver
from flandre.utils.Msg import KillMsg, Msg, BMMsg, RfMatMsg, KeyPressMsg from flandre.utils.Msg import KillMsg, Msg, BMMsg, RfMatMsg, KeyPressMsg, RGB888Msg
from flandre.utils.RfMat import RfMat from flandre.utils.RfMat import RfMat
@ -61,20 +61,11 @@ class Adv(QMainWindow, Ui_MainWindow):
h = msg.rfmat.h h = msg.rfmat.h
d: RfMat = msg.rfmat d: RfMat = msg.rfmat
d2 = (d d2 = (d
.pseudo_color(cond=not self.grey)
.grey(cond=self.grey)
.resize((int(w * self.zoom), int(h * self.zoom))) .resize((int(w * self.zoom), int(h * self.zoom)))
.watermark(cond=self.watermark) .watermark(cond=self.watermark)
) )
w = d2.w w = d2.w
h = d2.h h = d2.h
if self.grey:
qImg = QImage(
d2.__bytes__(),
w, h, w,
QImage.Format.Format_Grayscale8
)
else:
qImg = QImage( qImg = QImage(
d2.__bytes__(), d2.__bytes__(),
w, h, 3 * w, w, h, 3 * w,
@ -88,6 +79,38 @@ class Adv(QMainWindow, Ui_MainWindow):
if self.need_fit: if self.need_fit:
self.graphicsView.fitInView(self.s.sceneRect(), Qt.AspectRatioMode.KeepAspectRatio) self.graphicsView.fitInView(self.s.sceneRect(), Qt.AspectRatioMode.KeepAspectRatio)
self.need_fit = False self.need_fit = False
# elif isinstance(msg, RGB888Msg):
# w = msg.w
# h = msg.h
# d: RfMat = msg.rfmat
# d2 = (d
# .resize((int(w * self.zoom), int(h * self.zoom)))
# .watermark(cond=self.watermark)
# )
# w = d2.w
# h = d2.h
# if self.grey:
# qImg = QImage(
# d2.__bytes__(),
# w, h, w,
# QImage.Format.Format_Grayscale8
# )
# else:
# qImg = QImage(
# d2.__bytes__(),
# w, h, 3 * w,
# QImage.Format.Format_BGR888
# )
# self.g.setPixmap(QPixmap(qImg))
# self.s.setSceneRect(0.0, 0.0, w, h)
# if self.scale:
# self.graphicsView.fitInView(self.s.sceneRect())
# else:
# if self.need_fit:
# self.graphicsView.fitInView(self.s.sceneRect(), Qt.AspectRatioMode.KeepAspectRatio)
# self.need_fit = False
#
# RGB888Msg
class ImageQt(Node): class ImageQt(Node):

View File

@ -1,4 +1,5 @@
import logging import logging
import time
from pathlib import Path from pathlib import Path
import zmq import zmq

View File

@ -89,7 +89,8 @@ class Adv(QMainWindow, Ui_MainWindow):
self.s_sid.valueChanged.connect(self.on_s_sid) self.s_sid.valueChanged.connect(self.on_s_sid)
self.sp_sid.valueChanged.connect(self.on_sp_sid) self.sp_sid.valueChanged.connect(self.on_sp_sid)
self.arg = ImageArgMsg('ui', t_start=0, t_end=1499) self.arg = ImageArgMsg('ui', t_start=0, t_end=1499)
self.seq_meta: RfSequenceMeta | None = None self.playback_seq_meta: RfSequenceMeta | None = None
self.live_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)
@ -97,10 +98,6 @@ class Adv(QMainWindow, Ui_MainWindow):
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_connected.clicked.connect(lambda: self.p.send(SetDeviceConnectedMsg(not self.device_connected)))
# 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.textChanged.connect(lambda e: self.l_base.textChanged.connect(lambda e:
self.l_base.setStyleSheet("") self.l_base.setStyleSheet("")
if Path(e).exists() else if Path(e).exists() else
@ -201,6 +198,10 @@ 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__())
@pyqtSlot()
def on_b_test1_clicked(self):
logger.info(f'test1 {self.arg}')
@pyqtSlot() @pyqtSlot()
def on_b_base_clicked(self): def on_b_base_clicked(self):
if Path(self.l_base.text()): if Path(self.l_base.text()):
@ -242,6 +243,8 @@ class Adv(QMainWindow, Ui_MainWindow):
if b: if b:
self.g_playback.setChecked(False) self.g_playback.setChecked(False)
self.p.send(SetPlayMode('live')) self.p.send(SetPlayMode('live'))
if self.live_seq_meta is not None:
self.update_max(max(self.live_seq_meta.shape))
logger.info(f'set playmode live') logger.info(f'set playmode live')
@pyqtSlot(bool) @pyqtSlot(bool)
@ -249,6 +252,8 @@ class Adv(QMainWindow, Ui_MainWindow):
if b: if b:
self.g_live.setChecked(False) self.g_live.setChecked(False)
self.p.send(SetPlayMode('playback')) self.p.send(SetPlayMode('playback'))
if self.playback_seq_meta is not None:
self.update_max(max(self.playback_seq_meta.shape))
logger.info(f'set playmode playback') logger.info(f'set playmode playback')
def on_device_disable(self): def on_device_disable(self):
@ -336,6 +341,19 @@ class Adv(QMainWindow, Ui_MainWindow):
else: else:
QMessageBox.warning(None, 'hint', 'Commit is empty!!') QMessageBox.warning(None, 'hint', 'Commit is empty!!')
def update_max(self, m):
self.s_t_start.setMaximum(m)
self.s_t_end.setMaximum(m)
self.s_dct_center.setMaximum(m)
self.s_dct_bandwidth.setMaximum(m)
self.s_f_rows.setMaximum(m)
self.sp_crop_center.setMaximum(m)
self.sp_crop_width.setMaximum(m)
self.sp_dct_center.setMaximum(m)
self.sp_dct_bandwidth.setMaximum(m)
self.sp_f_rows.setMaximum(m)
def on_zmq_event(self, msg: QByteArray): def on_zmq_event(self, msg: QByteArray):
try: try:
msg = Msg.decode_msg(msg.data()) msg = Msg.decode_msg(msg.data())
@ -357,6 +375,7 @@ class Adv(QMainWindow, Ui_MainWindow):
self.sp_crop_center.setValue(msg.t_start) self.sp_crop_center.setValue(msg.t_start)
self.sp_crop_width.setValue(msg.t_end) self.sp_crop_width.setValue(msg.t_end)
self.sp_f_rows.setValue(msg.f_rows) self.sp_f_rows.setValue(msg.f_rows)
self.sp_v2.setValue(msg.v2) self.sp_v2.setValue(msg.v2)
self.sp_dct_center.setValue(msg.dct_center) self.sp_dct_center.setValue(msg.dct_center)
self.sp_dct_bandwidth.setValue(msg.dct_bandwidth) self.sp_dct_bandwidth.setValue(msg.dct_bandwidth)
@ -387,21 +406,15 @@ 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.currentText())) self.p.send(SetSeqMetaMsg('playback', self.c_playback_seq_name.currentText()))
elif isinstance(msg, SetSeqMetaMsg): elif isinstance(msg, SetSeqMetaMsg):
self.seq_meta = RfSequenceMeta.from_name(msg.name) if msg.target == 'playback':
mmax_shape0 = max(self.seq_meta.shape) self.playback_seq_meta = RfSequenceMeta.from_name(msg.name)
self.update_max(max(self.playback_seq_meta.shape))
self.s_t_start.setMaximum(mmax_shape0) elif isinstance(msg, SeqMetaMsg):
self.s_t_end.setMaximum(mmax_shape0) if msg.target == 'live':
self.s_dct_center.setMaximum(mmax_shape0) self.l_live_seq_name.setText(msg.name)
self.s_dct_bandwidth.setMaximum(mmax_shape0) self.b_live_seq_apply.setEnabled(True)
self.s_f_rows.setMaximum(mmax_shape0) self.live_seq_meta = RfSequenceMeta.from_name(msg.name)
self.update_max(max(self.live_seq_meta.shape))
self.sp_crop_center.setMaximum(mmax_shape0)
self.sp_crop_width.setMaximum(mmax_shape0)
self.sp_dct_center.setMaximum(mmax_shape0)
self.sp_dct_bandwidth.setMaximum(mmax_shape0)
self.sp_f_rows.setMaximum(mmax_shape0)
elif isinstance(msg, DeviceConnectedMsg): elif isinstance(msg, DeviceConnectedMsg):
if msg.value: if msg.value:
self.set_device_connection(LinkStatus.GREEN) self.set_device_connection(LinkStatus.GREEN)
@ -414,19 +427,7 @@ 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, SeqMetaMsg):
if msg.target == 'live':
self.l_live_seq_name.setText(msg.name)
self.b_live_seq_apply.setEnabled(True)
# elif isinstance(msg, DeviceOnlineMsg):
# if msg.value:
# # self.l_online.setStyleSheet("")
# # self.l_online.setText("Device Online")
# self.g_device.setEnabled(True)
# else:
# # self.l_online.setStyleSheet("background-color: pink;")
# # self.l_online.setText("Device Offline")
# self.g_device.setEnabled(False)
elif isinstance(msg, DeviceConfigListMsg): 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)
@ -553,7 +554,8 @@ class Adv(QMainWindow, Ui_MainWindow):
self.p.send(SetSidMsg(v)) self.p.send(SetSidMsg(v))
# @pyqtSlot(int) # @pyqtSlot(int)
def on_seq_meta(self): @pyqtSlot()
def on_b_live_seq_apply_clicked(self):
v = self.c_live_seq_name.currentIndex() v = self.c_live_seq_name.currentIndex()
name = self.c_live_seq_name.currentText() name = self.c_live_seq_name.currentText()
if name != 'Empty': if name != 'Empty':

View File

@ -74,6 +74,10 @@ class Mi(Node):
self.ping60enable = False self.ping60enable = False
time.sleep(10) time.sleep(10)
def start(self):
self.device_py_req_socket.send(b'start')
self.device_py_req_socket.recv()
def loop(self): def loop(self):
if c1_connected() and check_socket(C.device_py_rep_socket): if c1_connected() and check_socket(C.device_py_rep_socket):
self.device_py_req_socket.send(b'get_device_status') self.device_py_req_socket.send(b'get_device_status')

View File

@ -12,7 +12,7 @@ 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(1238, 1017) MainWindow.resize(1238, 1044)
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)
@ -367,6 +367,9 @@ class Ui_MainWindow(object):
self.checkBox = QtWidgets.QCheckBox(parent=self.centralwidget) self.checkBox = QtWidgets.QCheckBox(parent=self.centralwidget)
self.checkBox.setObjectName("checkBox") self.checkBox.setObjectName("checkBox")
self.horizontalLayout_6.addWidget(self.checkBox) self.horizontalLayout_6.addWidget(self.checkBox)
self.b_test1 = QtWidgets.QPushButton(parent=self.centralwidget)
self.b_test1.setObjectName("b_test1")
self.horizontalLayout_6.addWidget(self.b_test1)
spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
self.horizontalLayout_6.addItem(spacerItem1) self.horizontalLayout_6.addItem(spacerItem1)
self.gridLayout.addLayout(self.horizontalLayout_6, 5, 0, 1, 2) self.gridLayout.addLayout(self.horizontalLayout_6, 5, 0, 1, 2)
@ -486,6 +489,7 @@ class Ui_MainWindow(object):
self.label_7.setObjectName("label_7") self.label_7.setObjectName("label_7")
self.gridLayout_5.addWidget(self.label_7, 6, 0, 1, 1) self.gridLayout_5.addWidget(self.label_7, 6, 0, 1, 1)
self.sp_crop_width = QtWidgets.QSpinBox(parent=self.centralwidget) self.sp_crop_width = QtWidgets.QSpinBox(parent=self.centralwidget)
self.sp_crop_width.setMaximum(9999)
self.sp_crop_width.setObjectName("sp_crop_width") self.sp_crop_width.setObjectName("sp_crop_width")
self.gridLayout_5.addWidget(self.sp_crop_width, 4, 2, 1, 1) self.gridLayout_5.addWidget(self.sp_crop_width, 4, 2, 1, 1)
spacerItem2 = 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)
@ -497,6 +501,7 @@ class Ui_MainWindow(object):
self.s_t_end.setObjectName("s_t_end") self.s_t_end.setObjectName("s_t_end")
self.gridLayout_5.addWidget(self.s_t_end, 4, 1, 1, 1) self.gridLayout_5.addWidget(self.s_t_end, 4, 1, 1, 1)
self.sp_dct_bandwidth = QtWidgets.QSpinBox(parent=self.centralwidget) self.sp_dct_bandwidth = QtWidgets.QSpinBox(parent=self.centralwidget)
self.sp_dct_bandwidth.setMaximum(9999)
self.sp_dct_bandwidth.setObjectName("sp_dct_bandwidth") self.sp_dct_bandwidth.setObjectName("sp_dct_bandwidth")
self.gridLayout_5.addWidget(self.sp_dct_bandwidth, 7, 2, 1, 1) self.gridLayout_5.addWidget(self.sp_dct_bandwidth, 7, 2, 1, 1)
self.label_5 = QtWidgets.QLabel(parent=self.centralwidget) self.label_5 = QtWidgets.QLabel(parent=self.centralwidget)
@ -524,9 +529,11 @@ class Ui_MainWindow(object):
self.sp_v2.setObjectName("sp_v2") self.sp_v2.setObjectName("sp_v2")
self.gridLayout_5.addWidget(self.sp_v2, 5, 2, 1, 1) self.gridLayout_5.addWidget(self.sp_v2, 5, 2, 1, 1)
self.sp_dct_center = QtWidgets.QSpinBox(parent=self.centralwidget) self.sp_dct_center = QtWidgets.QSpinBox(parent=self.centralwidget)
self.sp_dct_center.setMaximum(9999)
self.sp_dct_center.setObjectName("sp_dct_center") self.sp_dct_center.setObjectName("sp_dct_center")
self.gridLayout_5.addWidget(self.sp_dct_center, 6, 2, 1, 1) self.gridLayout_5.addWidget(self.sp_dct_center, 6, 2, 1, 1)
self.sp_f_rows = QtWidgets.QSpinBox(parent=self.centralwidget) self.sp_f_rows = QtWidgets.QSpinBox(parent=self.centralwidget)
self.sp_f_rows.setMaximum(7000)
self.sp_f_rows.setObjectName("sp_f_rows") self.sp_f_rows.setObjectName("sp_f_rows")
self.gridLayout_5.addWidget(self.sp_f_rows, 8, 2, 1, 1) self.gridLayout_5.addWidget(self.sp_f_rows, 8, 2, 1, 1)
self.s_f_rows = QtWidgets.QSlider(parent=self.centralwidget) self.s_f_rows = QtWidgets.QSlider(parent=self.centralwidget)
@ -559,6 +566,7 @@ class Ui_MainWindow(object):
self.label_2.setObjectName("label_2") self.label_2.setObjectName("label_2")
self.gridLayout_5.addWidget(self.label_2, 0, 0, 1, 3) self.gridLayout_5.addWidget(self.label_2, 0, 0, 1, 3)
self.sp_crop_center = QtWidgets.QSpinBox(parent=self.centralwidget) self.sp_crop_center = QtWidgets.QSpinBox(parent=self.centralwidget)
self.sp_crop_center.setMaximum(9999)
self.sp_crop_center.setObjectName("sp_crop_center") self.sp_crop_center.setObjectName("sp_crop_center")
self.gridLayout_5.addWidget(self.sp_crop_center, 3, 2, 1, 1) self.gridLayout_5.addWidget(self.sp_crop_center, 3, 2, 1, 1)
self.s_beta = QtWidgets.QSlider(parent=self.centralwidget) self.s_beta = QtWidgets.QSlider(parent=self.centralwidget)
@ -572,6 +580,7 @@ class Ui_MainWindow(object):
self.label_35.setObjectName("label_35") self.label_35.setObjectName("label_35")
self.gridLayout_5.addWidget(self.label_35, 9, 0, 1, 1) self.gridLayout_5.addWidget(self.label_35, 9, 0, 1, 1)
self.sp_beta = QtWidgets.QSpinBox(parent=self.centralwidget) self.sp_beta = QtWidgets.QSpinBox(parent=self.centralwidget)
self.sp_beta.setMaximum(9999)
self.sp_beta.setObjectName("sp_beta") self.sp_beta.setObjectName("sp_beta")
self.gridLayout_5.addWidget(self.sp_beta, 9, 2, 1, 1) self.gridLayout_5.addWidget(self.sp_beta, 9, 2, 1, 1)
self.gridLayout.addLayout(self.gridLayout_5, 3, 0, 1, 1) self.gridLayout.addLayout(self.gridLayout_5, 3, 0, 1, 1)
@ -643,6 +652,7 @@ class Ui_MainWindow(object):
self.l_probe_angle.setText(_translate("MainWindow", "TextLabel")) self.l_probe_angle.setText(_translate("MainWindow", "TextLabel"))
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.b_test1.setText(_translate("MainWindow", "test1"))
self.label_23.setText(_translate("MainWindow", "Force")) self.label_23.setText(_translate("MainWindow", "Force"))
self.label_22.setText(_translate("MainWindow", "Position")) self.label_22.setText(_translate("MainWindow", "Position"))
self.label_19.setText(_translate("MainWindow", "6DOF Cobot")) self.label_19.setText(_translate("MainWindow", "6DOF Cobot"))

View File

@ -7,7 +7,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>1238</width> <width>1238</width>
<height>1017</height> <height>1044</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -681,6 +681,13 @@ border-radius: 7px;
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="QPushButton" name="b_test1">
<property name="text">
<string>test1</string>
</property>
</widget>
</item>
<item> <item>
<spacer name="horizontalSpacer"> <spacer name="horizontalSpacer">
<property name="orientation"> <property name="orientation">
@ -910,7 +917,11 @@ border-radius: 7px;
</widget> </widget>
</item> </item>
<item row="4" column="2"> <item row="4" column="2">
<widget class="QSpinBox" name="sp_crop_width"/> <widget class="QSpinBox" name="sp_crop_width">
<property name="maximum">
<number>9999</number>
</property>
</widget>
</item> </item>
<item row="10" column="1"> <item row="10" column="1">
<spacer name="verticalSpacer_2"> <spacer name="verticalSpacer_2">
@ -939,7 +950,11 @@ border-radius: 7px;
</widget> </widget>
</item> </item>
<item row="7" column="2"> <item row="7" column="2">
<widget class="QSpinBox" name="sp_dct_bandwidth"/> <widget class="QSpinBox" name="sp_dct_bandwidth">
<property name="maximum">
<number>9999</number>
</property>
</widget>
</item> </item>
<item row="4" column="0"> <item row="4" column="0">
<widget class="QLabel" name="label_5"> <widget class="QLabel" name="label_5">
@ -987,10 +1002,18 @@ border-radius: 7px;
</widget> </widget>
</item> </item>
<item row="6" column="2"> <item row="6" column="2">
<widget class="QSpinBox" name="sp_dct_center"/> <widget class="QSpinBox" name="sp_dct_center">
<property name="maximum">
<number>9999</number>
</property>
</widget>
</item> </item>
<item row="8" column="2"> <item row="8" column="2">
<widget class="QSpinBox" name="sp_f_rows"/> <widget class="QSpinBox" name="sp_f_rows">
<property name="maximum">
<number>7000</number>
</property>
</widget>
</item> </item>
<item row="8" column="1"> <item row="8" column="1">
<widget class="QSlider" name="s_f_rows"> <widget class="QSlider" name="s_f_rows">
@ -1052,7 +1075,11 @@ border-radius: 7px;
</widget> </widget>
</item> </item>
<item row="3" column="2"> <item row="3" column="2">
<widget class="QSpinBox" name="sp_crop_center"/> <widget class="QSpinBox" name="sp_crop_center">
<property name="maximum">
<number>9999</number>
</property>
</widget>
</item> </item>
<item row="9" column="1"> <item row="9" column="1">
<widget class="QSlider" name="s_beta"> <widget class="QSlider" name="s_beta">
@ -1078,7 +1105,11 @@ border-radius: 7px;
</widget> </widget>
</item> </item>
<item row="9" column="2"> <item row="9" column="2">
<widget class="QSpinBox" name="sp_beta"/> <widget class="QSpinBox" name="sp_beta">
<property name="maximum">
<number>9999</number>
</property>
</widget>
</item> </item>
</layout> </layout>
</item> </item>

View File

@ -53,6 +53,7 @@ class BG(Enum):
HeaderByteMsg = auto() HeaderByteMsg = auto()
RfMatMsg = auto() RfMatMsg = auto()
KeyPressMsg = auto() KeyPressMsg = auto()
RGB888Msg = auto()
class Msg: class Msg:
@ -319,6 +320,19 @@ class RfFrameMsg(Msg):
) )
class RGB888Msg(HeaderByteMsg):
def __init__(self, b: bytes, w: int, h: int):
self.w = w
self.h = h
super().__init__(dict(h=h, w=w), b)
@classmethod
def decode(cls, data) -> 'RGB888Msg':
msg = super(RGB888Msg, cls).decode(data)
return RGB888Msg(msg.data, msg.header['w'], msg.header['h'])
class RfMatMsg(HeaderByteMsg): class RfMatMsg(HeaderByteMsg):
def __init__(self, rfmat: 'RfMat'): def __init__(self, rfmat: 'RfMat'):

View File

@ -237,11 +237,12 @@ class RfMat:
color2 = (128, 128, 128) color2 = (128, 128, 128)
else: else:
raise NotImplementedError() raise NotImplementedError()
cv2.putText(canvas, line1, (0, 60), cv2.FONT_HERSHEY_PLAIN, 4, color1, 8) fontsize = 2
cv2.putText(canvas, line1, (0, 60), cv2.FONT_HERSHEY_PLAIN, 4, color2, 4) cv2.putText(canvas, line1, (0, 60), cv2.FONT_HERSHEY_PLAIN, fontsize, color1, 8)
cv2.putText(canvas, line1, (0, 60), cv2.FONT_HERSHEY_PLAIN, fontsize, color2, 4)
cv2.putText(canvas, line2, (0, 120), cv2.FONT_HERSHEY_PLAIN, 4, color1, 8) cv2.putText(canvas, line2, (0, 120), cv2.FONT_HERSHEY_PLAIN, fontsize, color1, 8)
cv2.putText(canvas, line2, (0, 120), cv2.FONT_HERSHEY_PLAIN, 4, color2, 4) cv2.putText(canvas, line2, (0, 120), cv2.FONT_HERSHEY_PLAIN, fontsize, color2, 4)
if canvas.shape.__len__() == 2: if canvas.shape.__len__() == 2:
ccp.m[canvas == 255] = 255 ccp.m[canvas == 255] = 255

3
software.json Normal file
View File

@ -0,0 +1,3 @@
{
"base_dir": "/home/lambda/source/scarlet/flandre/@DS"
}

25
test/testdevicegui.py Normal file
View File

@ -0,0 +1,25 @@
import struct
import time
import cv2
import numpy as np
import zmq
from flandre.config import C
from flandre.nodes.Device import Device, DeviceCmd
from flandre.nodes.Mi import Mi
if __name__ == '__main__':
context = zmq.Context()
req_driver_socket = context.socket(zmq.REQ)
req_driver_socket.connect(C.live_rep_socket)
magic = 7355608
cmd = DeviceCmd.GetData
cv2.namedWindow("test", cv2.WINDOW_AUTOSIZE)
while True:
req_driver_socket.send(struct.pack('i', magic) + struct.pack('i', cmd.value))
b = req_driver_socket.recv()
arr = np.frombuffer(b, dtype=np.int16, offset=4 + 8 + 4).reshape((256, 5002))
cv2.imshow('test', arr)
cv2.waitKey(0)
# print(b.__len__())