diff --git a/config/device/max-256-100,U=100,M=PWI,S=(256 5002).txt b/config/device/max-256-100,U=100,M=PWI,S=(256 5002).txt new file mode 100644 index 0000000..46c286d --- /dev/null +++ b/config/device/max-256-100,U=100,M=PWI,S=(256 5002).txt @@ -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 + diff --git a/config/device/AA256,U=30,M=PWI,S=(256 1502).txt b/config/device/max-256-30,U=30,M=PWI,S=(256 1502).txt similarity index 100% rename from config/device/AA256,U=30,M=PWI,S=(256 1502).txt rename to config/device/max-256-30,U=30,M=PWI,S=(256 1502).txt diff --git a/config/device/AAA256,U=80,M=PWI,S=(256 4002).txt b/config/device/max-256-80,U=80,M=PWI,S=(256 4002).txt similarity index 98% rename from config/device/AAA256,U=80,M=PWI,S=(256 4002).txt rename to config/device/max-256-80,U=80,M=PWI,S=(256 4002).txt index e051dc5..0c0ffe5 100644 --- a/config/device/AAA256,U=80,M=PWI,S=(256 4002).txt +++ b/config/device/max-256-80,U=80,M=PWI,S=(256 4002).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/ARIA64,U=30,M=PWI,S=(64 1501).txt b/config/device/mini-64-30,U=30,M=PWI,S=(64 1501).txt similarity index 100% rename from config/device/ARIA64,U=30,M=PWI,S=(64 1501).txt rename to config/device/mini-64-30,U=30,M=PWI,S=(64 1501).txt diff --git a/config/device/ARIA641,U=30,M=PWI,S=(64 1501).txt b/config/device/mini-64-30-1,U=30,M=PWI,S=(64 1501).txt similarity index 100% rename from config/device/ARIA641,U=30,M=PWI,S=(64 1501).txt rename to config/device/mini-64-30-1,U=30,M=PWI,S=(64 1501).txt diff --git a/config/device/A60,U=60,M=PWI,S=(64 3001).txt b/config/device/mini-64-60,U=60,M=PWI,S=(64 3001).txt similarity index 100% rename from config/device/A60,U=60,M=PWI,S=(64 3001).txt rename to config/device/mini-64-60,U=60,M=PWI,S=(64 3001).txt diff --git a/config/device/A80,U=80,M=PWI,S=(64 4001).txt b/config/device/mini-64-80,U=80,M=PWI,S=(64 4001).txt similarity index 100% rename from config/device/A80,U=80,M=PWI,S=(64 4001).txt rename to config/device/mini-64-80,U=80,M=PWI,S=(64 4001).txt diff --git a/config/imaging/baby.json b/config/imaging/baby.json new file mode 100644 index 0000000..169ddb5 --- /dev/null +++ b/config/imaging/baby.json @@ -0,0 +1 @@ +{"t_end": 2068, "t_start": 1439, "v2": 1524, "dct_center": 1086, "dct_bandwidth": 915, "f_rows": 3944, "beta": 30} \ No newline at end of file diff --git a/config/imaging/baby2.json b/config/imaging/baby2.json new file mode 100644 index 0000000..d32df6f --- /dev/null +++ b/config/imaging/baby2.json @@ -0,0 +1 @@ +{"t_end": 5002, "t_start": 3239, "v2": 1524, "dct_center": 798, "dct_bandwidth": 857, "f_rows": 4939, "beta": 30} \ No newline at end of file diff --git a/flandre/launcher.py b/flandre/launcher.py index 42928b3..ce7afc9 100644 --- a/flandre/launcher.py +++ b/flandre/launcher.py @@ -18,6 +18,7 @@ from flandre.nodes.Robot import Robot from flandre.nodes.ImageFFMPEG import ImageFFMPEG from flandre.nodes.ImageQt import ImageQt from flandre.nodes.Midi import Midi +from flandre.nodes.Mi import Mi from flandre.utils.Msg import KillMsg from flandre.config import CONFIG_FOLDER @@ -33,6 +34,7 @@ class LaunchComponent(Enum): ImageFFMPEG = ImageFFMPEG ImageQt = ImageQt Midi = Midi + Mi = Mi def launch(arg: dict[LaunchComponent, dict]): diff --git a/flandre/nodes/Beamformer.py b/flandre/nodes/Beamformer.py index e2783ba..2becf11 100644 --- a/flandre/nodes/Beamformer.py +++ b/flandre/nodes/Beamformer.py @@ -2,6 +2,7 @@ import logging import time import cupy as cp +import cv2 import zmq from flandre.beamformer.das import gen_pwi @@ -10,7 +11,7 @@ from flandre.config import C from flandre.nodes.Node import Node from flandre.utils.Config import DeviceConfig from flandre.utils.Msg import ImageArgMsg, Msg, RfFrameWithMetaMsg, BeamformerMsg, \ - SeqMetaMsg, RfMatMsg + SeqMetaMsg, RfMatMsg, RGB888Msg from flandre.utils.RfFile import RfSequenceMeta from flandre.utils.RfMat import RfMat @@ -34,17 +35,22 @@ class Beamformer(Node): return d2 = (data # .dct(80, 1500) - .dct_center(arg.dct_center, arg.dct_bandwidth) - .call(lambda m: m.astype(cp.int16)) - .call(pwi) - .call(cp.asarray, order='C') - .argrelextrema() - .conv_guass(b=arg.beta * 0.01) - .crop_center(arg.t_start, arg.t_end) + # .dct_center(arg.dct_center, arg.dct_bandwidth) + # .call(lambda m: m.astype(cp.int16)) + # .call(pwi) + # .call(cp.asarray, order='C') + # .argrelextrema() + # .conv_guass(b=arg.beta * 0.01) + # .crop_center(arg.t_start, arg.t_end) .rotate90() .cpu() + .grey() + .call(cv2.cvtColor, cv2.COLOR_GRAY2RGB) + # .pseudo_color() ) + # time.sleep(0.01) self.send(RfMatMsg(d2)) + # self.send(RGB888Msg(d2.__bytes__(), d2.w, d2.h)) def loop(self): time.sleep(1) @@ -79,5 +85,8 @@ class Beamformer(Node): last_f_rows = arg_msg.f_rows dc = DeviceConfig(v2=arg_msg.v2, rows=arg_msg.f_rows) pwi, _ = gen_pwi(direct_dist(dc), dc) - if seq_meta.mode == RfSequenceMeta.RfSequenceMode.PWI: - self.process_pwi(mat, arg_msg, pwi) + try: + if seq_meta.mode == RfSequenceMeta.RfSequenceMode.PWI: + self.process_pwi(mat, arg_msg, pwi) + except Exception as e: + logger.warning(e) diff --git a/flandre/nodes/ImageCV.py b/flandre/nodes/ImageCV.py index 6b42d8a..7343b7a 100644 --- a/flandre/nodes/ImageCV.py +++ b/flandre/nodes/ImageCV.py @@ -6,13 +6,14 @@ import zmq from flandre.config import C 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__) class ImageCV(Node): - topics = [BMMsg, SetWindowVisibleMsg] + topics = [BMMsg, SetWindowVisibleMsg, RfMatMsg] def __init__(self, level=logging.INFO): super().__init__(level=level) @@ -29,6 +30,10 @@ class ImageCV(Node): b = np.frombuffer(msg.data, dtype=np.uint8) b = np.reshape(b, (C.video_height, C.video_width, 4)) self.buffer = b + elif isinstance(msg, RfMatMsg): + rfmat: RfMat = msg.rfmat + b = rfmat.pseudo_color().m + self.buffer = b elif isinstance(msg, SetWindowVisibleMsg): if msg.name == 'bscan' and msg.sender != 'cv': self.show = msg.value diff --git a/flandre/nodes/ImageQt.py b/flandre/nodes/ImageQt.py index 7e5a0c4..b7e9d82 100644 --- a/flandre/nodes/ImageQt.py +++ b/flandre/nodes/ImageQt.py @@ -11,7 +11,7 @@ from flandre.config import C from flandre.nodes.Node import Node from flandre.pyqt.Image import Ui_MainWindow 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 @@ -61,25 +61,16 @@ class Adv(QMainWindow, Ui_MainWindow): h = msg.rfmat.h d: RfMat = msg.rfmat d2 = (d - .pseudo_color(cond=not self.grey) - .grey(cond=self.grey) .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 - ) + 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: @@ -88,6 +79,38 @@ class Adv(QMainWindow, Ui_MainWindow): if self.need_fit: self.graphicsView.fitInView(self.s.sceneRect(), Qt.AspectRatioMode.KeepAspectRatio) 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): diff --git a/flandre/nodes/Loader.py b/flandre/nodes/Loader.py index dc5177d..eeab2ac 100644 --- a/flandre/nodes/Loader.py +++ b/flandre/nodes/Loader.py @@ -1,4 +1,5 @@ import logging +import time from pathlib import Path import zmq diff --git a/flandre/nodes/MainUI.py b/flandre/nodes/MainUI.py index 83a3158..50e8ea8 100644 --- a/flandre/nodes/MainUI.py +++ b/flandre/nodes/MainUI.py @@ -89,7 +89,8 @@ class Adv(QMainWindow, Ui_MainWindow): self.s_sid.valueChanged.connect(self.on_s_sid) self.sp_sid.valueChanged.connect(self.on_sp_sid) 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_playback.clicked.connect(self.on_play_playback) @@ -97,10 +98,6 @@ class Adv(QMainWindow, Ui_MainWindow): self.record = False self.device_connected = False self.device_enabled = False - # self.b_device_enabled.clicked.connect(lambda: self.p.send(SetDeviceEnabledMsg(not self.device_enabled))) - # self.b_device_connected.clicked.connect(lambda: self.p.send(SetDeviceConnectedMsg(not self.device_connected))) - # self.c_live_seq_name.currentIndexChanged.connect(self.on_seq_meta) - self.b_live_seq_apply.clicked.connect(self.on_seq_meta) self.l_base.textChanged.connect(lambda e: self.l_base.setStyleSheet("") if Path(e).exists() else @@ -201,6 +198,10 @@ class Adv(QMainWindow, Ui_MainWindow): base = QFileDialog.getExistingDirectory(self, 'Select Base Folder', DS.__str__()) self.l_base.setText(Path(base).__str__()) + @pyqtSlot() + def on_b_test1_clicked(self): + logger.info(f'test1 {self.arg}') + @pyqtSlot() def on_b_base_clicked(self): if Path(self.l_base.text()): @@ -242,6 +243,8 @@ class Adv(QMainWindow, Ui_MainWindow): if b: self.g_playback.setChecked(False) 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') @pyqtSlot(bool) @@ -249,6 +252,8 @@ class Adv(QMainWindow, Ui_MainWindow): if b: self.g_live.setChecked(False) 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') def on_device_disable(self): @@ -336,6 +341,19 @@ class Adv(QMainWindow, Ui_MainWindow): else: 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): try: 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_width.setValue(msg.t_end) self.sp_f_rows.setValue(msg.f_rows) + self.sp_v2.setValue(msg.v2) self.sp_dct_center.setValue(msg.dct_center) self.sp_dct_bandwidth.setValue(msg.dct_bandwidth) @@ -387,21 +406,15 @@ class Adv(QMainWindow, Ui_MainWindow): if msg.value.__len__() > 0: self.p.send(SetSeqMetaMsg('playback', self.c_playback_seq_name.currentText())) elif isinstance(msg, SetSeqMetaMsg): - self.seq_meta = RfSequenceMeta.from_name(msg.name) - mmax_shape0 = max(self.seq_meta.shape) - - self.s_t_start.setMaximum(mmax_shape0) - self.s_t_end.setMaximum(mmax_shape0) - self.s_dct_center.setMaximum(mmax_shape0) - self.s_dct_bandwidth.setMaximum(mmax_shape0) - self.s_f_rows.setMaximum(mmax_shape0) - - 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) - + if msg.target == 'playback': + self.playback_seq_meta = RfSequenceMeta.from_name(msg.name) + self.update_max(max(self.playback_seq_meta.shape)) + elif isinstance(msg, SeqMetaMsg): + if msg.target == 'live': + self.l_live_seq_name.setText(msg.name) + self.b_live_seq_apply.setEnabled(True) + self.live_seq_meta = RfSequenceMeta.from_name(msg.name) + self.update_max(max(self.live_seq_meta.shape)) elif isinstance(msg, DeviceConnectedMsg): if msg.value: self.set_device_connection(LinkStatus.GREEN) @@ -414,19 +427,7 @@ class Adv(QMainWindow, Ui_MainWindow): else: self.set_device_enable(LinkStatus.RED) 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): for name, txt in msg.arr: self.c_live_seq_name.addItem(name, txt) @@ -553,7 +554,8 @@ class Adv(QMainWindow, Ui_MainWindow): self.p.send(SetSidMsg(v)) # @pyqtSlot(int) - def on_seq_meta(self): + @pyqtSlot() + def on_b_live_seq_apply_clicked(self): v = self.c_live_seq_name.currentIndex() name = self.c_live_seq_name.currentText() if name != 'Empty': diff --git a/flandre/nodes/Mi.py b/flandre/nodes/Mi.py index 75e4a8c..4aab5e2 100644 --- a/flandre/nodes/Mi.py +++ b/flandre/nodes/Mi.py @@ -74,6 +74,10 @@ class Mi(Node): self.ping60enable = False time.sleep(10) + def start(self): + self.device_py_req_socket.send(b'start') + self.device_py_req_socket.recv() + def loop(self): if c1_connected() and check_socket(C.device_py_rep_socket): self.device_py_req_socket.send(b'get_device_status') diff --git a/flandre/pyqt/Main.py b/flandre/pyqt/Main.py index 4c28324..1822709 100644 --- a/flandre/pyqt/Main.py +++ b/flandre/pyqt/Main.py @@ -12,7 +12,7 @@ from PyQt6 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") - MainWindow.resize(1238, 1017) + MainWindow.resize(1238, 1044) self.centralwidget = QtWidgets.QWidget(parent=MainWindow) self.centralwidget.setObjectName("centralwidget") self.gridLayout = QtWidgets.QGridLayout(self.centralwidget) @@ -367,6 +367,9 @@ class Ui_MainWindow(object): self.checkBox = QtWidgets.QCheckBox(parent=self.centralwidget) self.checkBox.setObjectName("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) self.horizontalLayout_6.addItem(spacerItem1) 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.gridLayout_5.addWidget(self.label_7, 6, 0, 1, 1) self.sp_crop_width = QtWidgets.QSpinBox(parent=self.centralwidget) + self.sp_crop_width.setMaximum(9999) self.sp_crop_width.setObjectName("sp_crop_width") 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) @@ -497,6 +501,7 @@ class Ui_MainWindow(object): self.s_t_end.setObjectName("s_t_end") 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.setMaximum(9999) self.sp_dct_bandwidth.setObjectName("sp_dct_bandwidth") self.gridLayout_5.addWidget(self.sp_dct_bandwidth, 7, 2, 1, 1) self.label_5 = QtWidgets.QLabel(parent=self.centralwidget) @@ -524,9 +529,11 @@ class Ui_MainWindow(object): self.sp_v2.setObjectName("sp_v2") self.gridLayout_5.addWidget(self.sp_v2, 5, 2, 1, 1) self.sp_dct_center = QtWidgets.QSpinBox(parent=self.centralwidget) + self.sp_dct_center.setMaximum(9999) self.sp_dct_center.setObjectName("sp_dct_center") 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.setMaximum(7000) self.sp_f_rows.setObjectName("sp_f_rows") self.gridLayout_5.addWidget(self.sp_f_rows, 8, 2, 1, 1) self.s_f_rows = QtWidgets.QSlider(parent=self.centralwidget) @@ -559,6 +566,7 @@ class Ui_MainWindow(object): self.label_2.setObjectName("label_2") self.gridLayout_5.addWidget(self.label_2, 0, 0, 1, 3) self.sp_crop_center = QtWidgets.QSpinBox(parent=self.centralwidget) + self.sp_crop_center.setMaximum(9999) self.sp_crop_center.setObjectName("sp_crop_center") self.gridLayout_5.addWidget(self.sp_crop_center, 3, 2, 1, 1) self.s_beta = QtWidgets.QSlider(parent=self.centralwidget) @@ -572,6 +580,7 @@ class Ui_MainWindow(object): self.label_35.setObjectName("label_35") self.gridLayout_5.addWidget(self.label_35, 9, 0, 1, 1) self.sp_beta = QtWidgets.QSpinBox(parent=self.centralwidget) + self.sp_beta.setMaximum(9999) self.sp_beta.setObjectName("sp_beta") self.gridLayout_5.addWidget(self.sp_beta, 9, 2, 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.cb_bscan.setText(_translate("MainWindow", "BSCAN")) self.checkBox.setText(_translate("MainWindow", "FOCUS")) + self.b_test1.setText(_translate("MainWindow", "test1")) self.label_23.setText(_translate("MainWindow", "Force")) self.label_22.setText(_translate("MainWindow", "Position")) self.label_19.setText(_translate("MainWindow", "6DOF Cobot")) diff --git a/flandre/pyqt/Main.ui b/flandre/pyqt/Main.ui index a9aca95..75fc892 100644 --- a/flandre/pyqt/Main.ui +++ b/flandre/pyqt/Main.ui @@ -7,7 +7,7 @@ 0 0 1238 - 1017 + 1044 @@ -681,6 +681,13 @@ border-radius: 7px; + + + + test1 + + + @@ -910,7 +917,11 @@ border-radius: 7px; - + + + 9999 + + @@ -939,7 +950,11 @@ border-radius: 7px; - + + + 9999 + + @@ -987,10 +1002,18 @@ border-radius: 7px; - + + + 9999 + + - + + + 7000 + + @@ -1052,7 +1075,11 @@ border-radius: 7px; - + + + 9999 + + @@ -1078,7 +1105,11 @@ border-radius: 7px; - + + + 9999 + + diff --git a/flandre/utils/Msg.py b/flandre/utils/Msg.py index 5f76240..842fb62 100644 --- a/flandre/utils/Msg.py +++ b/flandre/utils/Msg.py @@ -53,6 +53,7 @@ class BG(Enum): HeaderByteMsg = auto() RfMatMsg = auto() KeyPressMsg = auto() + RGB888Msg = auto() 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): def __init__(self, rfmat: 'RfMat'): diff --git a/flandre/utils/RfMat.py b/flandre/utils/RfMat.py index 5b7ea4c..45cd1c1 100644 --- a/flandre/utils/RfMat.py +++ b/flandre/utils/RfMat.py @@ -237,11 +237,12 @@ class RfMat: color2 = (128, 128, 128) else: raise NotImplementedError() - cv2.putText(canvas, line1, (0, 60), cv2.FONT_HERSHEY_PLAIN, 4, color1, 8) - cv2.putText(canvas, line1, (0, 60), cv2.FONT_HERSHEY_PLAIN, 4, color2, 4) + fontsize = 2 + 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, 4, color2, 4) + cv2.putText(canvas, line2, (0, 120), cv2.FONT_HERSHEY_PLAIN, fontsize, color1, 8) + cv2.putText(canvas, line2, (0, 120), cv2.FONT_HERSHEY_PLAIN, fontsize, color2, 4) if canvas.shape.__len__() == 2: ccp.m[canvas == 255] = 255 diff --git a/software.json b/software.json new file mode 100644 index 0000000..01e8865 --- /dev/null +++ b/software.json @@ -0,0 +1,3 @@ +{ + "base_dir": "/home/lambda/source/scarlet/flandre/@DS" +} \ No newline at end of file diff --git a/test/testdevicegui.py b/test/testdevicegui.py new file mode 100644 index 0000000..a653084 --- /dev/null +++ b/test/testdevicegui.py @@ -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__())