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 - - - - - - diff --git a/src/utils/Msg.py b/src/utils/Msg.py index 9d8e376..7cd52dc 100644 --- a/src/utils/Msg.py +++ b/src/utils/Msg.py @@ -40,6 +40,9 @@ class BG(Enum): BytesMsg = auto() BeamformerMsg = auto() RequestRfFrameMsg = auto() + MidiMsg = auto() + JoystickMsg = auto() + DeviceZero = auto() class Msg: @@ -308,6 +311,23 @@ class BeamformerMsg(BytesMsg): pass +class DeviceZero(Msg): + pass + + +@dataclasses.dataclass +class MidiMsg(Msg): + type: str + channel: int + pitch: int + + +@dataclasses.dataclass +class JoystickMsg(Msg): + key: str + value: float + + @dataclasses.dataclass class RobotRtsiMsg(Msg): pos: tuple[int, int, int, int, int, int] diff --git a/src/utils/mi.py b/src/utils/mi.py index df57ad5..5ebd058 100644 --- a/src/utils/mi.py +++ b/src/utils/mi.py @@ -1,3 +1,4 @@ +import click from miio.miioprotocol import MiIOProtocol from config import SWITCH1_IP, SWITCH1_TOKEN, SWITCH2_IP, SWITCH2_TOKEN @@ -51,5 +52,38 @@ def c2_connected(): return c2().send('get_properties', [{'did': 'MYDID', 'siid': 2, 'piid': 1}])[0]['value'] +@click.group() +def cli(): + pass + + +@cli.command() +@click.argument('name') +def on(name): + if name == 'c1': + c1_connect() + if name == 'c2': + c2_connect() + + +@cli.command() +@click.argument('name') +def off(name): + if name == 'c1': + c1_disconnect() + if name == 'c2': + c2_disconnect() + + +@cli.command() +@click.argument('name') +def status(name): + if name == 'c1': + print(c1_connected()) + print(c1_power()) + if name == 'c2': + print(c2_connected()) + + if __name__ == '__main__': - print(c2_connect()) + cli() diff --git a/test/kdemain.py b/test/kdemain.py index f93cf72..dc58c80 100644 --- a/test/kdemain.py +++ b/test/kdemain.py @@ -7,7 +7,10 @@ from nodes.Broker import Broker from nodes.Device import Device from nodes.ImageCV import ImageCV from nodes.ImageFFMPEG import ImageFFMPEG +from nodes.JoyStick import Joystick from nodes.Loader import Loader +from nodes.Midi import Midi +from nodes.Monitor import Monitor from nodes.Muxer import Muxer from nodes.Recorder import Recorder from nodes.Robot import Robot @@ -23,13 +26,16 @@ if __name__ == '__main__': Broker(), kde_pyqt6_mainui, Device(level=logging.DEBUG), - ImageFFMPEG(), + # ImageFFMPEG(), ImageCV(level=logging.DEBUG), Beamformer(level=logging.DEBUG), Loader(), Muxer(level=logging.DEBUG), + Midi(), + # Joystick(), Robot(), Recorder(), + # Monitor(), ] for p in ps: pps.append(multiprocessing.Process(target=p)) diff --git a/test/testmiio.py b/test/testmiio.py index d807c9e..459a4bb 100644 --- a/test/testmiio.py +++ b/test/testmiio.py @@ -2,12 +2,35 @@ from miio.miioprotocol import MiIOProtocol from config import SWITCH1_IP, SWITCH1_TOKEN, SWITCH2_IP, SWITCH2_TOKEN from miio import Device -from utils.mi import c1_disconnect, c1_connect +# from utils.mi import c1_disconnect, c1_connect, c2_connect +# +# if __name__ == '__main__': +# # m = MiIOProtocol( +# # SWITCH1_IP, SWITCH1_TOKEN, +# # ) +# # r = m.send('get_properties', [{'did': 'MYDID', 'siid': 2, 'piid': 1}]) +# # print(r[0]['value']) +# c1_connect() +# c2_connect() +import click + + +@click.group() +def cli(): + pass + +@cli.command() +@click.option('--count', default=1, help='Number of greetings.') +@click.option('--name', prompt='Your name', + help='The person to greet.') +def con(count, name): + """Simple program that greets NAME for a total of COUNT times.""" + for x in range(count): + click.echo(f"Hello {name}!") + +@cli.command() +def disconnect(): + click.echo('Dropped the database') if __name__ == '__main__': - # m = MiIOProtocol( - # SWITCH1_IP, SWITCH1_TOKEN, - # ) - # r = m.send('get_properties', [{'did': 'MYDID', 'siid': 2, 'piid': 1}]) - # print(r[0]['value']) - c1_connect() \ No newline at end of file + cli() diff --git a/uv.lock b/uv.lock index cd7c5df..462eba9 100644 --- a/uv.lock +++ b/uv.lock @@ -9,13 +9,6 @@ resolution-markers = [ "sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", ] -[manifest] -overrides = [ - { name = "av", marker = "sys_platform != 'linux' and sys_platform != 'win32'", specifier = ">=14.0.0" }, - { name = "av", marker = "sys_platform == 'linux'", path = "av-14.2.0rc1-cp312-cp312-linux_x86_64.whl" }, - { name = "av", marker = "sys_platform == 'win32'", path = "av-14.1.0-cp312-cp312-win_amd64.whl" }, -] - [[package]] name = "aiohappyeyeballs" version = "2.4.4" @@ -69,46 +62,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/13/e7/e436a0c0eb5127d8b491a9b83ecd2391c6ff7dcd5548dfaec2080a2340fd/aiohttp_cors-0.7.0-py3-none-any.whl", hash = "sha256:0451ba59fdf6909d0e2cd21e4c0a43752bc0703d33fc78ae94d9d9321710193e", size = 27564 }, ] -[[package]] -name = "aioice" -version = "0.9.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "dnspython" }, - { name = "ifaddr" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/33/b6/e2b0e48ccb5b04fe29265e93f14a0915f416e359c897ae87d570566c430b/aioice-0.9.0.tar.gz", hash = "sha256:fc2401b1c4b6e19372eaaeaa28fd1bd9cbf6b0e412e48625297c53b495eebd1e", size = 40324 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b6/35/d21e48d3ba25d32aba5d142d54c4491376c659dd74d052a30dd25198007b/aioice-0.9.0-py3-none-any.whl", hash = "sha256:b609597a3a5a611e0004ff04772e16aceb881d51c25c0afc4ceac05d5e50024e", size = 24177 }, -] - -[[package]] -name = "aiortc" -version = "1.9.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "aioice" }, - { name = "av", version = "14.1.0", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform != 'linux' and sys_platform != 'win32'" }, - { name = "av", version = "14.2.0rc1", source = { path = "av-14.1.0-cp312-cp312-win_amd64.whl" }, marker = "sys_platform == 'win32'" }, - { name = "av", version = "14.2.0rc1", source = { path = "av-14.2.0rc1-cp312-cp312-linux_x86_64.whl" }, marker = "sys_platform == 'linux'" }, - { name = "cffi" }, - { name = "cryptography" }, - { name = "google-crc32c" }, - { name = "pyee" }, - { name = "pylibsrtp" }, - { name = "pyopenssl" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/71/32/e9b01e2271124643e5dc15c273f2bb8155efebf5bc2115407441ac62f4c5/aiortc-1.9.0.tar.gz", hash = "sha256:03faa76d76ef0e5989ac10386898b029369756102217230e2fcd4b029c50b303", size = 1168973 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/93/01/db89910fc4dfb72ca25fd9a41326762a490d93d39d2fc4aac3f86c05857d/aiortc-1.9.0-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:e3e67c1970c2cffacac53c8f161df264efc62b22721c64a621940935028ee087", size = 1216069 }, - { url = "https://files.pythonhosted.org/packages/4c/6d/76ed96521080492c7264eacf73a8cba2202f1ff9f59af1776c5a2532f332/aiortc-1.9.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d893cb3d4ffa0ff4f9bb03a88f0a700cdbcd4c0dc060a46c59a27ccd1c890663", size = 896012 }, - { url = "https://files.pythonhosted.org/packages/8c/87/1f666108764fa5b557bed4f0fd5e2acccd739bb2cca2b766dcacb53e5669/aiortc-1.9.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:176b4eb38d833667f87cf719a7a3e105e25a35b138b30893294418c1c96e38db", size = 1779113 }, - { url = "https://files.pythonhosted.org/packages/32/03/f3233e936f7a81549bd95f33f3d304e2a9211cb35d819d74570c0718b1ac/aiortc-1.9.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44b610f36b8d17123855dfbe915fa6874201765b8a2c7fd9cf72d14cf417740", size = 1896322 }, - { url = "https://files.pythonhosted.org/packages/96/99/6672cf57777801c6ddacc13e1ee07f8c2151d0847a4f81455eeec998eaed/aiortc-1.9.0-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:55505adb31d56cba19a1ef8ad6aa9b727ccdba2a83bfbfb4aa79ef3c472026a6", size = 1918600 }, - { url = "https://files.pythonhosted.org/packages/76/e3/bdb76e7e51bc4fc7a5869597de2effad073ccf5ef14de3aed742d7384107/aiortc-1.9.0-cp38-abi3-win32.whl", hash = "sha256:680b703e35870e301535c930bfe32e7d012224a91ce51531aba45a3124ef07cc", size = 923055 }, - { url = "https://files.pythonhosted.org/packages/6a/df/de098b31a3fbf1117f6d4cb84c14518636054e3c95a9d9f693a1123c95b3/aiortc-1.9.0-cp38-abi3-win_amd64.whl", hash = "sha256:de5e7020cfc2d2d9fb95690926ff2e3b3c30cd4f5f5bc68d5b6756a8eebb686e", size = 1009610 }, -] - [[package]] name = "aiosignal" version = "1.3.2" @@ -232,43 +185,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6a/21/5b6702a7f963e95456c0de2d495f67bf5fd62840ac655dc451586d23d39a/attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2", size = 63001 }, ] -[[package]] -name = "av" -version = "14.1.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "sys_platform == 'darwin'", - "sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", -] -sdist = { url = "https://files.pythonhosted.org/packages/c1/8c/8551a53c713424aff5ae1600f17f7407e64761d4eca8854013ee15f2c090/av-14.1.0.tar.gz", hash = "sha256:81a0185af0237016049c2b1560d51d5895ef56763ea7ebab939baa7b6b87e6f7", size = 4049387 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/3f/9fb6a691f52a38917330d7025690445db1aff3eff5887852a44a0728511d/av-14.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d2ca492e369b5628c8a1fc6889c1ac1f66ec8e4b99d2cc2633e7eaf4d2c82e66", size = 22093254 }, - { url = "https://files.pythonhosted.org/packages/af/08/b1de0d440e73b3dfd117cedd2dcbb81eabe601da4ea84aa12d66bc9b3716/av-14.1.0-cp312-cp312-macosx_11_0_x86_64.whl", hash = "sha256:8bf8db92bd986e3278b93bd7ca187bf753bb56d63a0015160fe1d3bba69f30e7", size = 27487693 }, -] - -[[package]] -name = "av" -version = "14.2.0rc1" -source = { path = "av-14.1.0-cp312-cp312-win_amd64.whl" } -resolution-markers = [ - "sys_platform == 'win32'", -] -wheels = [ - { filename = "av-14.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:09b2b76869a38b5f1b7a0808f799c60882ff64ec1e66927e319aafc1b3bf55c0" }, -] - -[[package]] -name = "av" -version = "14.2.0rc1" -source = { path = "av-14.2.0rc1-cp312-cp312-linux_x86_64.whl" } -resolution-markers = [ - "platform_machine == 'aarch64' and sys_platform == 'linux'", - "platform_machine != 'aarch64' and sys_platform == 'linux'", -] -wheels = [ - { filename = "av-14.2.0rc1-cp312-cp312-linux_x86_64.whl", hash = "sha256:09b2b76869a38b5f1b7a0808f799c60882ff64ec1e66927e319aafc1b3bf55c0" }, -] - [[package]] name = "babel" version = "2.16.0" @@ -542,15 +458,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604 }, ] -[[package]] -name = "dnspython" -version = "2.7.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b5/4a/263763cb2ba3816dd94b08ad3a33d5fdae34ecb856678773cc40a3605829/dnspython-2.7.0.tar.gz", hash = "sha256:ce9c432eda0dc91cf618a5cedf1a4e142651196bbcd2c80e89ed5a907e5cfaf1", size = 345197 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/68/1b/e0a87d256e40e8c888847551b20a017a6b98139178505dc7ffb96f04e954/dnspython-2.7.0-py3-none-any.whl", hash = "sha256:b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86", size = 313632 }, -] - [[package]] name = "executing" version = "2.1.0" @@ -589,13 +496,12 @@ version = "0.1.0" source = { virtual = "." } dependencies = [ { name = "aiohttp-cors" }, - { name = "aiortc" }, - { name = "av", version = "14.1.0", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform != 'linux' and sys_platform != 'win32'" }, - { name = "av", version = "14.2.0rc1", source = { path = "av-14.1.0-cp312-cp312-win_amd64.whl" }, marker = "sys_platform == 'win32'" }, - { name = "av", version = "14.2.0rc1", source = { path = "av-14.2.0rc1-cp312-cp312-linux_x86_64.whl" }, marker = "sys_platform == 'linux'" }, + { name = "click" }, { name = "cupy-cuda12x" }, { name = "jupyter" }, + { name = "mido", extra = ["ports-rtmidi"] }, { name = "opencv-python" }, + { name = "pyjoystick" }, { name = "pyqt6" }, { name = "pyqt6-fluent-widgets", extra = ["full"] }, { name = "python-miio" }, @@ -608,13 +514,12 @@ dependencies = [ [package.metadata] requires-dist = [ { name = "aiohttp-cors", specifier = ">=0.7.0" }, - { name = "aiortc", specifier = ">=1.9.0" }, - { name = "av", marker = "sys_platform != 'linux' and sys_platform != 'win32'" }, - { name = "av", marker = "sys_platform == 'linux'", path = "av-14.2.0rc1-cp312-cp312-linux_x86_64.whl" }, - { name = "av", marker = "sys_platform == 'win32'", path = "av-14.1.0-cp312-cp312-win_amd64.whl" }, + { name = "click", specifier = ">=8.1.8" }, { name = "cupy-cuda12x", specifier = ">=13.3.0" }, { name = "jupyter", specifier = ">=1.1.1" }, + { name = "mido", extras = ["ports-rtmidi"], specifier = ">=1.3.3" }, { name = "opencv-python", specifier = ">=4.10.0.84" }, + { name = "pyjoystick", specifier = ">=1.2.4" }, { name = "pyqt6", specifier = ">=6.8.0" }, { name = "pyqt6-fluent-widgets", extras = ["full"], specifier = ">=1.7.4" }, { name = "python-miio", specifier = ">=0.5.12" }, @@ -674,19 +579,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c6/c8/a5be5b7550c10858fcf9b0ea054baccab474da77d37f1e828ce043a3a5d4/frozenlist-1.5.0-py3-none-any.whl", hash = "sha256:d994863bba198a4a518b467bb971c56e1db3f180a25c6cf7bb1949c267f748c3", size = 11901 }, ] -[[package]] -name = "google-crc32c" -version = "1.6.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/67/72/c3298da1a3773102359c5a78f20dae8925f5ea876e37354415f68594a6fb/google_crc32c-1.6.0.tar.gz", hash = "sha256:6eceb6ad197656a1ff49ebfbbfa870678c75be4344feb35ac1edf694309413dc", size = 14472 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cf/41/65a91657d6a8123c6c12f9aac72127b6ac76dda9e2ba1834026a842eb77c/google_crc32c-1.6.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:ed767bf4ba90104c1216b68111613f0d5926fb3780660ea1198fc469af410e9d", size = 30268 }, - { url = "https://files.pythonhosted.org/packages/59/d0/ee743a267c7d5c4bb8bd865f7d4c039505f1c8a4b439df047fdc17be9769/google_crc32c-1.6.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:62f6d4a29fea082ac4a3c9be5e415218255cf11684ac6ef5488eea0c9132689b", size = 30113 }, - { url = "https://files.pythonhosted.org/packages/25/53/e5e449c368dd26ade5fb2bb209e046d4309ed0623be65b13f0ce026cb520/google_crc32c-1.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c87d98c7c4a69066fd31701c4e10d178a648c2cac3452e62c6b24dc51f9fcc00", size = 32995 }, - { url = "https://files.pythonhosted.org/packages/52/12/9bf6042d5b0ac8c25afed562fb78e51b0641474097e4139e858b45de40a5/google_crc32c-1.6.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd5e7d2445d1a958c266bfa5d04c39932dc54093fa391736dbfdb0f1929c1fb3", size = 32614 }, - { url = "https://files.pythonhosted.org/packages/76/29/fc20f5ec36eac1eea0d0b2de4118c774c5f59c513f2a8630d4db6991f3e0/google_crc32c-1.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:7aec8e88a3583515f9e0957fe4f5f6d8d4997e36d0f61624e70469771584c760", size = 33445 }, -] - [[package]] name = "h11" version = "0.14.0" @@ -1185,6 +1077,23 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/7b/64/e1327477189913bba3e8392a3518c4fa2db14644ea2d0d5e243a018d7752/micloud-0.6.tar.gz", hash = "sha256:46c9e66741410955a9daf39892a7e6c3e24514a46bb126e872b1ddcf6de85138", size = 9429 } +[[package]] +name = "mido" +version = "1.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/23/14/cfda3fe61ce4c0f50a9f707ae02b46cb53211732b2cd4522bf06272848f4/mido-1.3.3.tar.gz", hash = "sha256:1aecb30b7f282404f17e43768cbf74a6a31bf22b3b783bdd117a1ce9d22cb74c", size = 124288 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/28/45deb15c11859d2f10702b32e71de9328a9fa494f989626916db39a9617f/mido-1.3.3-py3-none-any.whl", hash = "sha256:01033c9b10b049e4436fca2762194ca839b09a4334091dd3c34e7f4ae674fd8a", size = 54614 }, +] + +[package.optional-dependencies] +ports-rtmidi = [ + { name = "python-rtmidi" }, +] + [[package]] name = "mistune" version = "3.1.0" @@ -1542,18 +1451,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/43/1d/81d59d228381576b92ecede5cd7239762c14001a828bdba30d64896e9778/pycryptodome-3.21.0-cp36-abi3-win_amd64.whl", hash = "sha256:b7aa25fc0baa5b1d95b7633af4f5f1838467f1815442b22487426f94e0d66c53", size = 1812863 }, ] -[[package]] -name = "pyee" -version = "12.1.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/0a/37/8fb6e653597b2b67ef552ed49b438d5398ba3b85a9453f8ada0fd77d455c/pyee-12.1.1.tar.gz", hash = "sha256:bbc33c09e2ff827f74191e3e5bbc6be7da02f627b7ec30d86f5ce1a6fb2424a3", size = 30915 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/25/68/7e150cba9eeffdeb3c5cecdb6896d70c8edd46ce41c0491e12fb2b2256ff/pyee-12.1.1-py3-none-any.whl", hash = "sha256:18a19c650556bb6b32b406d7f017c8f513aceed1ef7ca618fb65de7bd2d347ef", size = 15527 }, -] - [[package]] name = "pygments" version = "2.19.1" @@ -1564,21 +1461,16 @@ wheels = [ ] [[package]] -name = "pylibsrtp" -version = "0.10.0" +name = "pyjoystick" +version = "1.2.4" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cffi" }, + { name = "pysdl2" }, + { name = "resource-man" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6b/ae/c95199144eed954976223bdce3f94564eb6c43567111aff8048a26a429bd/pylibsrtp-0.10.0.tar.gz", hash = "sha256:d8001912d7f51bd05b4ea3551747930631777fd37892cf3bfe0e541a742e699f", size = 10557 } +sdist = { url = "https://files.pythonhosted.org/packages/cb/0c/8cc48bb0f8e9e8b537e53d416de5c55570a63c84d4b5d8e4086391e543fd/pyjoystick-1.2.4.tar.gz", hash = "sha256:d3d676888d743b9e4aa2845f16f55df7fbbfa30db0ff4f033ace0ee33a8f7d29", size = 1084161 } wheels = [ - { url = "https://files.pythonhosted.org/packages/1c/d2/ffc24f80e83a54d9b309cdae6b31cf9294b4f3a85ab107827fd272d1e687/pylibsrtp-0.10.0-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6a1121ceea3339e0a84842a4a9da0fcf57cc8f99eb60dbf31a46d978b4170e7c", size = 1704188 }, - { url = "https://files.pythonhosted.org/packages/66/3e/db86a09a5cb290a274f76ce25f4fae3a7e3c4a4dbc64baf7e2aaa57a32bb/pylibsrtp-0.10.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:ca1994e73c6857b0a695fdde94cc5ac846c1b0d5d8766255a1dc2db40857f667", size = 2028580 }, - { url = "https://files.pythonhosted.org/packages/21/ab/9b2b5ad2ceaa1660de16e0a2e3c54a2043a9c4a3eef7718930c78dc84e77/pylibsrtp-0.10.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb7640b524544603d07bd4373b04c9582c8cfe41d9789d3f492081f053bed9c1", size = 2484470 }, - { url = "https://files.pythonhosted.org/packages/ab/e6/b0a30e79aa2312834b33f5e9c0ad459fc94e195c610634ee9665fafb1fc8/pylibsrtp-0.10.0-cp38-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f13aa945e1dcf8c138bf3d4a6e34056c4c2f69bf9934bc53b320ef14c7317ccc", size = 2078367 }, - { url = "https://files.pythonhosted.org/packages/16/78/9ea0c88490ad4fe9683ddf3bbee702c7a2331e83a333bb3aa52e8d7d909b/pylibsrtp-0.10.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b2ef1c32d1145239dd0fe7b7fbe083334d345df6b4597fc66faf914a32682d9", size = 2134898 }, - { url = "https://files.pythonhosted.org/packages/00/f6/c76fa5401f9d95c14db70de0cf4fad922ad61686843bc3e7411178a64bc8/pylibsrtp-0.10.0-cp38-abi3-win32.whl", hash = "sha256:8c6fe2576b2ab13942b47db6c2ffe71f5eb1edc1dc3bdd7283169fecd5249e74", size = 1130881 }, - { url = "https://files.pythonhosted.org/packages/4c/31/85a58625edc0b6967fe0904c9d89d019bcece3f3e3bf775b9151a8cf9d0d/pylibsrtp-0.10.0-cp38-abi3-win_amd64.whl", hash = "sha256:cd965d4b0e9a77b362526cab119f4d9ce39b83f1f20f46c6af8e694b86fa19a7", size = 1448840 }, + { url = "https://files.pythonhosted.org/packages/a5/65/858dc1f7f4c65b9e9c8e769019cb156e6b8b96fd7f2f8f1f6bfef8717d95/pyjoystick-1.2.4-py3-none-any.whl", hash = "sha256:773989a5d796d7f32261d25338d583233ddae9a091c0c13c3fc09d250b0870a9", size = 1185266 }, ] [[package]] @@ -4058,18 +3950,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/68/1a/06e6f8de19505c3807db47962308390e2d15e5729342c8382750a538762c/pyobjc_framework_WebKit-10.3.2-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:efce711d3cbe5ef34620002ae2189b802420e6e2923973ed4c59989443b5499f", size = 44847 }, ] -[[package]] -name = "pyopenssl" -version = "24.3.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cryptography" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c1/d4/1067b82c4fc674d6f6e9e8d26b3dff978da46d351ca3bac171544693e085/pyopenssl-24.3.0.tar.gz", hash = "sha256:49f7a019577d834746bc55c5fce6ecbcec0f2b4ec5ce1cf43a9a173b8138bb36", size = 178944 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/42/22/40f9162e943f86f0fc927ebc648078be87def360d9d8db346619fb97df2b/pyOpenSSL-24.3.0-py3-none-any.whl", hash = "sha256:e474f5a473cd7f92221cc04976e48f4d11502804657a08a989fb3be5514c904a", size = 56111 }, -] - [[package]] name = "pyparsing" version = "3.2.0" @@ -4161,6 +4041,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/92/af/17a92b67db31a086bd693bf97d98aa2f45427e7982df53f59cdc26899979/PyQt6_sip-13.9.1-cp312-cp312-win_arm64.whl", hash = "sha256:976c7758f668806d4df7a8853f390ac123d5d1f73591ed368bdb8963574ff589", size = 45335 }, ] +[[package]] +name = "pysdl2" +version = "0.9.17" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/ff/8704d84ad4d25f0a7bf7912504f64575e432e8d57dfba2fe35f5b2db7e04/pysdl2-0.9.17.tar.gz", hash = "sha256:48c6ef01a4eb123db5f7e46e1a1b565675755b07e615f3fe20a623c94735b52b", size = 775955 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/e2/399ea7900e7510096aeb41439e6f1540bef0bdf7e15cc2d8464e4adb71e8/PySDL2-0.9.17-py3-none-any.whl", hash = "sha256:fe923dbf5c7b27bbc1eb2bf58abfa793f8f13fd7ae8b27b1bc2de49920bcbd41", size = 583137 }, +] + [[package]] name = "python-dateutil" version = "2.9.0.post0" @@ -4207,6 +4096,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f0/26/3aba8af51a7522ef54b8e0adaa34a8ccf7615e6745aa5ac49dd0e855abbc/python_miio-0.5.12-py3-none-any.whl", hash = "sha256:206ac0d8505aa3c673e101543d0a0e8f0ebe8f19a50ff66edd302c8770813f73", size = 330966 }, ] +[[package]] +name = "python-rtmidi" +version = "1.5.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/dd/ee/0f91965dcc471714c69df21e5ca3d94dc81411b7dee2d31ff1184bea07c9/python_rtmidi-1.5.8.tar.gz", hash = "sha256:7f9ade68b068ae09000ecb562ae9521da3a234361ad5449e83fc734544d004fa", size = 368130 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/27/887b0378e0a907489a07bdeb808fa5ed349675245c6ee14d9f6d00304f96/python_rtmidi-1.5.8-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5443634597eb340cdec0734f76267a827c2d366f00a6f9195141c78828016ac2", size = 158861 }, + { url = "https://files.pythonhosted.org/packages/4d/ec/57cecde253daab896ce53778520cd41eb062641862ebdb0ee6f97511b1d9/python_rtmidi-1.5.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:29d9c9d9f82ce679fecad7bb4cb79f3a24574ea84600e377194b4cc1baacec0e", size = 153416 }, + { url = "https://files.pythonhosted.org/packages/6f/5b/dc19c53d9d512b74dc2cca3725591cc612b9465645695a0696352a8c8b54/python_rtmidi-1.5.8-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:25f5a5db7be98911c41ca5bebb262fcf9a7c89600b88fd3c207ceafd3101e721", size = 305696 }, + { url = "https://files.pythonhosted.org/packages/f6/92/5a60f56dfb2740e644e932233928947423cd2101895319b331f84527eb31/python_rtmidi-1.5.8-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:cec30924e305f55284594ccf35a71dee7216fd308dfa2dec1b3ed03e6f243803", size = 315579 }, + { url = "https://files.pythonhosted.org/packages/93/46/6af077d262f521ea2bf1ab60b8aad72f34fe6dd55af739176605369d449c/python_rtmidi-1.5.8-cp312-cp312-win_amd64.whl", hash = "sha256:052c89933cae4fca354012d8ca7248f4f9e1e3f062471409d48415a7f7d7e59e", size = 129755 }, +] + [[package]] name = "pytz" version = "2025.1" @@ -4303,6 +4205,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, ] +[[package]] +name = "resource-man" +version = "2.2.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1f/ee/8e4c4ae1742c2bf479657dfefb6a481fca23de4ec0b801b291f70317255b/resource_man-2.2.8.tar.gz", hash = "sha256:bf747dd671b7254fd76b7c72aa920942cf9d417eda1ed3ec7baedc075e48e33b", size = 43952 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/78/695d73ac84ac380694a1b8dc5dced7ee0275b27c40676f6b32c052583849/resource_man-2.2.8-py3-none-any.whl", hash = "sha256:93920d33f24eb5158290b183766baef64f334d6d4eacf6a520ac3aef6bfcc23b", size = 44832 }, +] + [[package]] name = "rfc3339-validator" version = "0.1.4"