This commit is contained in:
remilia 2025-03-03 22:22:06 +08:00
parent 1738ae5b48
commit e86ef2f8de
17 changed files with 1253 additions and 654 deletions

View File

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

View File

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

View File

@ -16,4 +16,7 @@ dependencies = [
"vtk>=9.4.0", "vtk>=9.4.0",
"jupyter>=1.1.1", "jupyter>=1.1.1",
"python-miio>=0.5.12", "python-miio>=0.5.12",
"click>=8.1.8",
"mido[ports-rtmidi]>=1.3.3",
"pyjoystick>=1.2.4",
] ]

View File

@ -24,6 +24,8 @@ class BusClient:
self.sub = self.ctx.socket(zmq.SUB) self.sub = self.ctx.socket(zmq.SUB)
for msg in msgs: for msg in msgs:
self.sub.setsockopt(zmq.SUBSCRIBE, msg.magic() + msg.eid()) self.sub.setsockopt(zmq.SUBSCRIBE, msg.magic() + msg.eid())
if msgs.__len__() == 0:
self.sub.setsockopt(zmq.SUBSCRIBE, b'')
if conflare: if conflare:
self.sub.setsockopt(zmq.CONFLATE, 1) self.sub.setsockopt(zmq.CONFLATE, 1)
self.sub.connect(f'tcp://127.0.0.1:{self.bp}') self.sub.connect(f'tcp://127.0.0.1:{self.bp}')

View File

@ -37,7 +37,7 @@ class Beamformer(Node):
time.sleep(1) time.sleep(1)
while True: while True:
self.send(RequestRfFrameMsg()) self.send(RequestRfFrameMsg())
r = dict(self.c.poller.poll(1000)) r = dict(self.c.poller.poll(10))
if self.c.sub in r: if self.c.sub in r:
msg = self.recv() msg = self.recv()
if isinstance(msg, BeamformerMsg): if isinstance(msg, BeamformerMsg):

View File

@ -2,6 +2,7 @@ import logging
import struct import struct
import subprocess import subprocess
import time import time
from threading import Thread
import zmq import zmq
@ -9,14 +10,14 @@ from config import LIVE_REP_SOCKET, CONFIG, DEVICE_CONFIG
from nodes.Node import Node from nodes.Node import Node
from utils.Msg import ImageArgMsg, KillMsg, SetDeviceConnectedMsg, SetDeviceEnabledMsg, DeviceEnabledMsg, \ from utils.Msg import ImageArgMsg, KillMsg, SetDeviceConnectedMsg, SetDeviceEnabledMsg, DeviceEnabledMsg, \
DeviceConnectedMsg, SetDeviceConfigMsg, DeviceOnlineMsg, DeviceConfigListMsg, RequestRfFrameMsg, RfFrameMsg, \ DeviceConnectedMsg, SetDeviceConfigMsg, DeviceOnlineMsg, DeviceConfigListMsg, RequestRfFrameMsg, RfFrameMsg, \
RfFrameWithMetaMsg RfFrameWithMetaMsg, DeviceZero
from utils.RfMeta import RfFrameMeta from utils.RfMeta import RfFrameMeta
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class Device(Node): class Device(Node):
topics = [SetDeviceConnectedMsg, SetDeviceEnabledMsg, SetDeviceConfigMsg, RequestRfFrameMsg] topics = [SetDeviceConnectedMsg, SetDeviceEnabledMsg, SetDeviceConfigMsg, RequestRfFrameMsg, DeviceZero]
def __init__(self, level=logging.INFO): def __init__(self, level=logging.INFO):
super(Device, self).__init__(level=level) super(Device, self).__init__(level=level)
@ -24,6 +25,12 @@ class Device(Node):
self.seq_meta = None self.seq_meta = None
self.device_rep_socket = None self.device_rep_socket = None
self.ok = b'ok\x00' self.ok = b'ok\x00'
self.loop2_t = None
def loop2(self):
while True:
self.online()
time.sleep(1)
def connect(self): def connect(self):
self.device_rep_socket.send(b'connect') self.device_rep_socket.send(b'connect')
@ -64,7 +71,7 @@ class Device(Node):
def online(self): def online(self):
code = subprocess.run(['curl', '-m', '1', f'http://{LIVE_REP_SOCKET}'], stderr=subprocess.DEVNULL, code = subprocess.run(['curl', '-m', '1', f'http://{LIVE_REP_SOCKET}'], stderr=subprocess.DEVNULL,
stdout=subprocess.DEVNULL).returncode stdout=subprocess.DEVNULL).returncode
logger.info(f'detect curl code: {code}') logger.debug(f'detect curl code: {code}')
match code: match code:
case 28 | 7: case 28 | 7:
self.send(DeviceOnlineMsg(False)) self.send(DeviceOnlineMsg(False))
@ -122,9 +129,15 @@ class Device(Node):
self.device_rep_socket.send(b'data') self.device_rep_socket.send(b'data')
return self.device_rep_socket.recv() 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): def custom_setup(self):
self.device_rep_socket = self.context.socket(zmq.REQ) self.device_rep_socket = self.context.socket(zmq.REQ)
self.device_rep_socket.connect(f"tcp://{LIVE_REP_SOCKET}") self.device_rep_socket.connect(f"tcp://{LIVE_REP_SOCKET}")
self.loop2_t = Thread(target=self.loop2)
self.loop2_t.start()
def loop(self): def loop(self):
arr = [] arr = []
@ -161,6 +174,9 @@ class Device(Node):
continue continue
_, sequence_id, encoder = struct.unpack_from('=iqi', braw) _, sequence_id, encoder = struct.unpack_from('=iqi', braw)
buffer = braw[4 + 8 + 4:] buffer = braw[4 + 8 + 4:]
# logger.debug('send')
self.send(RfFrameWithMetaMsg(0, RfFrameMeta( self.send(RfFrameWithMetaMsg(0, RfFrameMeta(
encoder=encoder, sequence_id=sequence_id encoder=encoder, sequence_id=sequence_id
), buffer)) ), buffer))
elif isinstance(msg, DeviceZero):
self.zero()

123
src/nodes/JoyStick.py Normal file
View File

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

View File

@ -1,10 +1,12 @@
import logging import logging
import platform import platform
import sys import sys
import time
import traceback import traceback
from enum import Enum, auto from enum import Enum, auto
from pathlib import Path from pathlib import Path
import zmq
from PyQt6 import QtCore, QtWidgets from PyQt6 import QtCore, QtWidgets
from PyQt6.QtCore import QByteArray from PyQt6.QtCore import QByteArray
from PyQt6.QtWidgets import QMainWindow, QApplication, QFrame, QMessageBox, QFileDialog, QLineEdit from PyQt6.QtWidgets import QMainWindow, QApplication, QFrame, QMessageBox, QFileDialog, QLineEdit
@ -16,7 +18,7 @@ from nodes.Node import Node
from utils.Msg import KillMsg, Msg, ImageArgMsg, SeqIdMinMax, MoveAxisMsg, SeqListMsg, SetBaseMsg, \ from utils.Msg import KillMsg, Msg, ImageArgMsg, SeqIdMinMax, MoveAxisMsg, SeqListMsg, SetBaseMsg, \
SetSeqMetaMsg, SetPlayMode, DeviceConnectedMsg, DeviceEnabledMsg, DeviceOnlineMsg, SetDeviceEnabledMsg, \ SetSeqMetaMsg, SetPlayMode, DeviceConnectedMsg, DeviceEnabledMsg, DeviceOnlineMsg, SetDeviceEnabledMsg, \
SetDeviceConnectedMsg, DeviceConfigListMsg, SetDeviceConfigMsg, SetRecordMsg, RobotRtsiMsg, RecordFrameMsg, \ SetDeviceConnectedMsg, DeviceConfigListMsg, SetDeviceConfigMsg, SetRecordMsg, RobotRtsiMsg, RecordFrameMsg, \
SeqIdList, SetWindowVisibleMsg, SetSidMsg, ImagingConfigNameListMsg SeqIdList, SetWindowVisibleMsg, SetSidMsg, ImagingConfigNameListMsg, DeviceZero
from utils.RfMeta import RfSequenceMeta from utils.RfMeta import RfSequenceMeta
logger = logging.getLogger(__name__) 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.b_new_imaging_config.clicked.connect(self.on_new_imaging_config)
self.c_imaging_config.currentIndexChanged.connect(self.on_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): def on_imaging_config(self, i):
name = self.c_imaging_config.itemText(i) name = self.c_imaging_config.itemText(i)
self.p.send(ImageArgMsg.from_path(IMAGING_CONFIG / f'{name}.json')) self.p.send(ImageArgMsg.from_path(IMAGING_CONFIG / f'{name}.json'))
@ -322,15 +342,29 @@ class Adv(QMainWindow, Ui_MainWindow):
if msg.value: if msg.value:
self.l_online.setStyleSheet("") self.l_online.setStyleSheet("")
self.l_online.setText("Device Online") self.l_online.setText("Device Online")
self.g_device.setDisabled(False)
else: else:
self.l_online.setStyleSheet("background-color: pink;") self.l_online.setStyleSheet("background-color: pink;")
self.l_online.setText("Device Offline") self.l_online.setText("Device Offline")
self.g_device.setDisabled(True)
elif isinstance(msg, DeviceConfigListMsg): elif isinstance(msg, DeviceConfigListMsg):
for name, txt in msg.arr: for name, txt in msg.arr:
self.c_live_seq_name.addItem(name, txt) self.c_live_seq_name.addItem(name, txt)
elif isinstance(msg, RobotRtsiMsg): elif isinstance(msg, RobotRtsiMsg):
self.l_robot_pos.setText(','.join([f'{v}' for v in msg.pos])) self.ln_x.display(f"{msg.pos[0] / 100:.2f}")
self.l_robot_force.setText(','.join([f'{v}' for v in msg.force])) 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): elif isinstance(msg, RecordFrameMsg):
self.record_frame_cnt += 1 self.record_frame_cnt += 1

66
src/nodes/Midi.py Normal file
View File

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

View File

@ -37,8 +37,9 @@ class Node:
def base_setup(self): def base_setup(self):
FORMAT = '[%(asctime)s] p%(process)s {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s' FORMAT = '[%(asctime)s] p%(process)s {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s'
FORMAT = '"%(pathname)s:%(lineno)d" %(levelname)s - %(message)s' FORMAT = '"%(pathname)s:%(lineno)d" [%(asctime)s.%(msecs)03d] %(levelname)s - %(message)s'
logging.basicConfig(level=self.level, format=FORMAT) logging.basicConfig(level=self.level, format=FORMAT,datefmt = '%Y-%m-%d %H:%M:%S',)
self.context = zmq.Context() self.context = zmq.Context()
if self.enable_init: if self.enable_init:
self.c = BusClient(*([KillMsg] + self.topics), poller=True, conflare=self.conflare) self.c = BusClient(*([KillMsg] + self.topics), poller=True, conflare=self.conflare)

View File

@ -12,91 +12,68 @@ from PyQt6 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object): class Ui_MainWindow(object):
def setupUi(self, MainWindow): def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow") MainWindow.setObjectName("MainWindow")
MainWindow.resize(1158, 805) MainWindow.resize(1158, 998)
self.centralwidget = QtWidgets.QWidget(parent=MainWindow) self.centralwidget = QtWidgets.QWidget(parent=MainWindow)
self.centralwidget.setObjectName("centralwidget") self.centralwidget.setObjectName("centralwidget")
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget) self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout.setObjectName("gridLayout") self.gridLayout.setObjectName("gridLayout")
self.gridLayout_3 = QtWidgets.QGridLayout() self.g_device = QtWidgets.QGroupBox(parent=self.centralwidget)
self.gridLayout_3.setObjectName("gridLayout_3") self.g_device.setEnabled(True)
self.horizontalLayout = QtWidgets.QHBoxLayout() self.g_device.setObjectName("g_device")
self.horizontalLayout.setObjectName("horizontalLayout") self.verticalLayout = QtWidgets.QVBoxLayout(self.g_device)
self.label_20 = QtWidgets.QLabel(parent=self.centralwidget) self.verticalLayout.setObjectName("verticalLayout")
self.label_20.setObjectName("label_20") self.l_online = QtWidgets.QLabel(parent=self.g_device)
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)
font = QtGui.QFont() font = QtGui.QFont()
font.setPointSize(15) font.setPointSize(15)
self.l_online.setFont(font) self.l_online.setFont(font)
self.l_online.setStyleSheet("background-color: pink;") self.l_online.setStyleSheet("background-color: pink;")
self.l_online.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) self.l_online.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
self.l_online.setObjectName("l_online") self.l_online.setObjectName("l_online")
self.gridLayout_3.addWidget(self.l_online, 0, 0, 1, 4) self.verticalLayout.addWidget(self.l_online)
self.lb_device_enable = QtWidgets.QLabel(parent=self.centralwidget) 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.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
self.lb_device_enable.setObjectName("lb_device_enable") self.lb_device_enable.setObjectName("lb_device_enable")
self.gridLayout_3.addWidget(self.lb_device_enable, 1, 3, 1, 1) self.gridLayout_8.addWidget(self.lb_device_enable, 0, 3, 1, 1)
self.label_21 = QtWidgets.QLabel(parent=self.centralwidget) 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.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
self.label_21.setObjectName("label_21") self.label_21.setObjectName("label_21")
self.gridLayout_3.addWidget(self.label_21, 1, 0, 2, 1) self.gridLayout_8.addWidget(self.label_21, 0, 0, 2, 1)
self.gridLayout_3.setColumnStretch(1, 1) self.gridLayout_8.setColumnStretch(1, 1)
self.gridLayout_3.setColumnStretch(3, 1) self.gridLayout_8.setColumnStretch(3, 1)
self.gridLayout.addLayout(self.gridLayout_3, 0, 0, 1, 1) self.verticalLayout.addLayout(self.gridLayout_8)
self.gridLayout_2 = QtWidgets.QGridLayout() self.horizontalLayout = QtWidgets.QHBoxLayout()
self.gridLayout_2.setObjectName("gridLayout_2") self.horizontalLayout.setObjectName("horizontalLayout")
self.l_robot_pos = QtWidgets.QLabel(parent=self.centralwidget) self.label_20 = QtWidgets.QLabel(parent=self.g_device)
font = QtGui.QFont() self.label_20.setObjectName("label_20")
font.setPointSize(15) self.horizontalLayout.addWidget(self.label_20)
self.l_robot_pos.setFont(font) self.c_live_seq_name = QtWidgets.QComboBox(parent=self.g_device)
self.l_robot_pos.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) self.c_live_seq_name.setEnabled(False)
self.l_robot_pos.setObjectName("l_robot_pos") self.c_live_seq_name.setObjectName("c_live_seq_name")
self.gridLayout_2.addWidget(self.l_robot_pos, 1, 1, 1, 1) self.c_live_seq_name.addItem("")
self.l_robot_force = QtWidgets.QLabel(parent=self.centralwidget) self.horizontalLayout.addWidget(self.c_live_seq_name)
font = QtGui.QFont() self.horizontalLayout.setStretch(1, 1)
font.setPointSize(15) self.verticalLayout.addLayout(self.horizontalLayout)
self.l_robot_force.setFont(font) self.b_device_zero = QtWidgets.QPushButton(parent=self.g_device)
self.l_robot_force.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) self.b_device_zero.setObjectName("b_device_zero")
self.l_robot_force.setObjectName("l_robot_force") self.verticalLayout.addWidget(self.b_device_zero)
self.gridLayout_2.addWidget(self.l_robot_force, 2, 1, 1, 1) self.gridLayout.addWidget(self.g_device, 0, 0, 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_4 = QtWidgets.QGridLayout() self.gridLayout_4 = QtWidgets.QGridLayout()
self.gridLayout_4.setObjectName("gridLayout_4") self.gridLayout_4.setObjectName("gridLayout_4")
self.label_14 = QtWidgets.QLabel(parent=self.centralwidget) self.label_14 = QtWidgets.QLabel(parent=self.centralwidget)
@ -179,7 +156,23 @@ class Ui_MainWindow(object):
self.horizontalSlider_8.setOrientation(QtCore.Qt.Orientation.Horizontal) self.horizontalSlider_8.setOrientation(QtCore.Qt.Orientation.Horizontal)
self.horizontalSlider_8.setObjectName("horizontalSlider_8") self.horizontalSlider_8.setObjectName("horizontalSlider_8")
self.gridLayout_4.addWidget(self.horizontalSlider_8, 6, 1, 1, 1) self.gridLayout_4.addWidget(self.horizontalSlider_8, 6, 1, 1, 1)
self.gridLayout.addLayout(self.gridLayout_4, 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 = QtWidgets.QGridLayout()
self.gridLayout_5.setObjectName("gridLayout_5") self.gridLayout_5.setObjectName("gridLayout_5")
self.spinBox_3 = QtWidgets.QSpinBox(parent=self.centralwidget) self.spinBox_3 = QtWidgets.QSpinBox(parent=self.centralwidget)
@ -247,7 +240,158 @@ class Ui_MainWindow(object):
self.horizontalLayout_3.addWidget(self.b_new_imaging_config) self.horizontalLayout_3.addWidget(self.b_new_imaging_config)
self.horizontalLayout_3.setStretch(1, 1) self.horizontalLayout_3.setStretch(1, 1)
self.gridLayout_5.addLayout(self.horizontalLayout_3, 2, 0, 1, 3) self.gridLayout_5.addLayout(self.horizontalLayout_3, 2, 0, 1, 3)
self.gridLayout.addLayout(self.gridLayout_5, 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 = QtWidgets.QGridLayout()
self.gridLayout_7.setObjectName("gridLayout_7") self.gridLayout_7.setObjectName("gridLayout_7")
self.s_sid = QtWidgets.QSlider(parent=self.centralwidget) self.s_sid = QtWidgets.QSlider(parent=self.centralwidget)
@ -299,76 +443,6 @@ class Ui_MainWindow(object):
self.horizontalLayout_5.setStretch(5, 1) self.horizontalLayout_5.setStretch(5, 1)
self.gridLayout_7.addLayout(self.horizontalLayout_5, 2, 0, 1, 3) self.gridLayout_7.addLayout(self.horizontalLayout_5, 2, 0, 1, 3)
self.gridLayout.addLayout(self.gridLayout_7, 1, 1, 1, 1) 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) MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(parent=MainWindow) self.menubar = QtWidgets.QMenuBar(parent=MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 1158, 30)) self.menubar.setGeometry(QtCore.QRect(0, 0, 1158, 30))
@ -384,20 +458,17 @@ class Ui_MainWindow(object):
def retranslateUi(self, MainWindow): def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate _translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "Scarlet Flandre Control Panel")) MainWindow.setWindowTitle(_translate("MainWindow", "Scarlet Flandre Control Panel"))
self.g_device.setTitle(_translate("MainWindow", "Device Status"))
self.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", "<html><head/><body><p style=\"line-height:0.3\" align=\"center\">Beam</p><p align=\"center\">Status</p></body></html>"))
self.label_21.setText(_translate("MainWindow", "<html><head/><body><p style=\"line-height:0.3\" align=\"center\">Connection</p><p align=\"center\">Status</p></body></html>"))
self.label_20.setText(_translate("MainWindow", "DeviceConfig")) self.label_20.setText(_translate("MainWindow", "DeviceConfig"))
self.c_live_seq_name.setItemText(0, _translate("MainWindow", "Empty")) self.c_live_seq_name.setItemText(0, _translate("MainWindow", "Empty"))
self.b_device_enable.setText(_translate("MainWindow", "Disconnect")) self.b_device_zero.setText(_translate("MainWindow", "Zero"))
self.b_device_connection.setText(_translate("MainWindow", "Connect"))
self.label_24.setText(_translate("MainWindow", "<html><head/><body><p style=\"line-height:0.3\" align=\"center\">Beam</p><p align=\"center\">Status</p></body></html>"))
self.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", "<html><head/><body><p style=\"line-height:0.3\" align=\"center\">Connection</p><p align=\"center\">Status</p></body></html>"))
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.label_14.setText(_translate("MainWindow", "Yal")) self.label_14.setText(_translate("MainWindow", "Yal"))
self.label_13.setText(_translate("MainWindow", "Pitch")) self.label_13.setText(_translate("MainWindow", "Pitch"))
self.label_3.setText(_translate("MainWindow", "Probe Position")) 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_12.setText(_translate("MainWindow", "Roll"))
self.label_11.setText(_translate("MainWindow", "E")) self.label_11.setText(_translate("MainWindow", "E"))
self.label_8.setText(_translate("MainWindow", "X")) self.label_8.setText(_translate("MainWindow", "X"))
self.label.setText(_translate("MainWindow", "Base Path"))
self.b_select_base.setText(_translate("MainWindow", "Select"))
self.b_base.setText(_translate("MainWindow", "Open"))
self.label_7.setText(_translate("MainWindow", "TextLabel")) self.label_7.setText(_translate("MainWindow", "TextLabel"))
self.label_2.setText(_translate("MainWindow", "Imaging")) self.label_2.setText(_translate("MainWindow", "Imaging"))
self.label_6.setText(_translate("MainWindow", "TextLabel")) 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_5.setText(_translate("MainWindow", "t_end"))
self.label_27.setText(_translate("MainWindow", "Profile")) self.label_27.setText(_translate("MainWindow", "Profile"))
self.b_new_imaging_config.setText(_translate("MainWindow", "New")) 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.b_play_playback.setText(_translate("MainWindow", "Playback"))
self.label_16.setText(_translate("MainWindow", "SeqName")) self.label_16.setText(_translate("MainWindow", "SeqName"))
self.label_4.setText(_translate("MainWindow", "Frame ID")) 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.l_seq_current.setText(_translate("MainWindow", "0"))
self.label_29.setText(_translate("MainWindow", "Max:")) self.label_29.setText(_translate("MainWindow", "Max:"))
self.l_seq_max.setText(_translate("MainWindow", "0")) self.l_seq_max.setText(_translate("MainWindow", "0"))
self.label.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"))

View File

@ -7,17 +7,103 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>1158</width> <width>1158</width>
<height>805</height> <height>998</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Scarlet Flandre Control Panel</string> <string>Scarlet Flandre Control Panel</string>
</property> </property>
<widget class="QWidget" name="centralwidget"> <widget class="QWidget" name="centralwidget">
<layout class="QGridLayout" name="gridLayout" rowstretch="0,0,0,0,0"> <layout class="QGridLayout" name="gridLayout" rowstretch="0,0,0,0,0,0">
<item row="0" column="0"> <item row="0" column="0">
<layout class="QGridLayout" name="gridLayout_3" columnstretch="0,1,0,1"> <widget class="QGroupBox" name="g_device">
<item row="3" column="0" colspan="4"> <property name="enabled">
<bool>true</bool>
</property>
<property name="title">
<string>Device Status</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="l_online">
<property name="font">
<font>
<pointsize>15</pointsize>
</font>
</property>
<property name="styleSheet">
<string notr="true">background-color: pink;</string>
</property>
<property name="text">
<string>Device Offline</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
</widget>
</item>
<item>
<layout class="QGridLayout" name="gridLayout_8" columnstretch="0,1,0,1">
<item row="1" column="1">
<widget class="QPushButton" name="b_device_connection">
<property name="text">
<string>Connect</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="lb_device_connection">
<property name="text">
<string>Disconnected</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QLabel" name="lb_device_enable">
<property name="text">
<string>Disabled</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QPushButton" name="b_device_enable">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Disconnect</string>
</property>
</widget>
</item>
<item row="0" column="2" rowspan="2">
<widget class="QLabel" name="label_24">
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p style=&quot;line-height:0.3&quot; align=&quot;center&quot;&gt;Beam&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;Status&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
</widget>
</item>
<item row="0" column="0" rowspan="2">
<widget class="QLabel" name="label_21">
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p style=&quot;line-height:0.3&quot; align=&quot;center&quot;&gt;Connection&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;Status&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout" stretch="0,1"> <layout class="QHBoxLayout" name="horizontalLayout" stretch="0,1">
<item> <item>
<widget class="QLabel" name="label_20"> <widget class="QLabel" name="label_20">
@ -40,150 +126,17 @@
</item> </item>
</layout> </layout>
</item> </item>
<item row="2" column="3"> <item>
<widget class="QPushButton" name="b_device_enable"> <widget class="QPushButton" name="b_device_zero">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text"> <property name="text">
<string>Disconnect</string> <string>Zero</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QPushButton" name="b_device_connection">
<property name="text">
<string>Connect</string>
</property>
</widget>
</item>
<item row="1" column="2" rowspan="2">
<widget class="QLabel" name="label_24">
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p style=&quot;line-height:0.3&quot; align=&quot;center&quot;&gt;Beam&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;Status&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="lb_device_connection">
<property name="text">
<string>Disconnected</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
</widget>
</item>
<item row="0" column="0" colspan="4">
<widget class="QLabel" name="l_online">
<property name="font">
<font>
<pointsize>15</pointsize>
</font>
</property>
<property name="styleSheet">
<string notr="true">background-color: pink;</string>
</property>
<property name="text">
<string>Device Offline</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QLabel" name="lb_device_enable">
<property name="text">
<string>Disabled</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
</widget>
</item>
<item row="1" column="0" rowspan="2">
<widget class="QLabel" name="label_21">
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p style=&quot;line-height:0.3&quot; align=&quot;center&quot;&gt;Connection&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;Status&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set>
</property> </property>
</widget> </widget>
</item> </item>
</layout> </layout>
</item>
<item row="0" column="1">
<layout class="QGridLayout" name="gridLayout_2" columnstretch="0,1">
<item row="1" column="1">
<widget class="QLabel" name="l_robot_pos">
<property name="font">
<font>
<pointsize>15</pointsize>
</font>
</property>
<property name="text">
<string>0,0,0,0,0,0</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
</widget> </widget>
</item> </item>
<item row="2" column="1"> <item row="3" column="1">
<widget class="QLabel" name="l_robot_force">
<property name="font">
<font>
<pointsize>15</pointsize>
</font>
</property>
<property name="text">
<string>0,0,0,0,0,0</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_22">
<property name="text">
<string>Position</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_23">
<property name="text">
<string>Force</string>
</property>
</widget>
</item>
<item row="0" column="0" colspan="2">
<widget class="QLabel" name="label_19">
<property name="font">
<font>
<pointsize>15</pointsize>
</font>
</property>
<property name="styleSheet">
<string notr="true">background-color: pink;</string>
</property>
<property name="text">
<string>Robot Offline</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
</widget>
</item>
</layout>
</item>
<item row="2" column="1">
<layout class="QGridLayout" name="gridLayout_4"> <layout class="QGridLayout" name="gridLayout_4">
<item row="6" column="0"> <item row="6" column="0">
<widget class="QLabel" name="label_14"> <widget class="QLabel" name="label_14">
@ -335,7 +288,39 @@
</item> </item>
</layout> </layout>
</item> </item>
<item row="2" column="0"> <item row="4" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Base Path</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="l_base">
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="b_select_base">
<property name="text">
<string>Select</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="b_base">
<property name="text">
<string>Open</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="3" column="0">
<layout class="QGridLayout" name="gridLayout_5"> <layout class="QGridLayout" name="gridLayout_5">
<item row="6" column="2"> <item row="6" column="2">
<widget class="QSpinBox" name="spinBox_3"/> <widget class="QSpinBox" name="spinBox_3"/>
@ -463,6 +448,307 @@
</item> </item>
</layout> </layout>
</item> </item>
<item row="5" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout_6">
<item>
<widget class="QCheckBox" name="cb_bscan">
<property name="text">
<string>BSCAN</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkBox">
<property name="text">
<string>FOCUS</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item row="1" column="0">
<layout class="QGridLayout" name="gridLayout_6">
<item row="1" column="1">
<widget class="QLineEdit" name="l_record_commit">
<property name="enabled">
<bool>false</bool>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_17">
<property name="text">
<string>RecordName</string>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QPushButton" name="b_record">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Record</string>
</property>
</widget>
</item>
<item row="2" column="0" colspan="3">
<layout class="QHBoxLayout" name="horizontalLayout_2" stretch="0,1,0,1,0,1">
<item>
<widget class="QLabel" name="label_18">
<property name="text">
<string>Record Frames:</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="l_record_frames">
<property name="text">
<string>0</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_25">
<property name="text">
<string>Record Size:</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="l_record_size">
<property name="text">
<string>0</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_26">
<property name="text">
<string>Max SeqId:</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="l_record_max_sid">
<property name="text">
<string>0</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="0" column="0" colspan="3">
<widget class="QPushButton" name="b_play_live">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Live</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="2" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout_7">
<item>
<widget class="QPushButton" name="b_probe_start">
<property name="text">
<string>Start</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="b_probe_stop">
<property name="text">
<string>Stop</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="l_probe_angle">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="b_probe_single">
<property name="text">
<string>Single</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="b_probe_orig">
<property name="text">
<string>Orig</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="0" column="1">
<layout class="QGridLayout" name="gridLayout_2" columnstretch="0,1,1,1,1,1,1">
<item row="1" column="2">
<widget class="QLCDNumber" name="ln_y">
<property name="digitCount">
<number>6</number>
</property>
<property name="segmentStyle">
<enum>QLCDNumber::SegmentStyle::Flat</enum>
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QLCDNumber" name="ln_z">
<property name="digitCount">
<number>6</number>
</property>
<property name="segmentStyle">
<enum>QLCDNumber::SegmentStyle::Flat</enum>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLCDNumber" name="ln_x">
<property name="digitCount">
<number>6</number>
</property>
<property name="segmentStyle">
<enum>QLCDNumber::SegmentStyle::Flat</enum>
</property>
</widget>
</item>
<item row="1" column="5">
<widget class="QLCDNumber" name="ln_ry">
<property name="digitCount">
<number>6</number>
</property>
<property name="segmentStyle">
<enum>QLCDNumber::SegmentStyle::Flat</enum>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_22">
<property name="text">
<string>Position</string>
</property>
</widget>
</item>
<item row="1" column="4">
<widget class="QLCDNumber" name="ln_rx">
<property name="digitCount">
<number>6</number>
</property>
<property name="segmentStyle">
<enum>QLCDNumber::SegmentStyle::Flat</enum>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_23">
<property name="text">
<string>Force</string>
</property>
</widget>
</item>
<item row="1" column="6">
<widget class="QLCDNumber" name="ln_rz">
<property name="digitCount">
<number>6</number>
</property>
<property name="segmentStyle">
<enum>QLCDNumber::SegmentStyle::Flat</enum>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLCDNumber" name="ln_fx">
<property name="segmentStyle">
<enum>QLCDNumber::SegmentStyle::Flat</enum>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QLCDNumber" name="ln_fy">
<property name="segmentStyle">
<enum>QLCDNumber::SegmentStyle::Flat</enum>
</property>
</widget>
</item>
<item row="2" column="3">
<widget class="QLCDNumber" name="ln_fz">
<property name="smallDecimalPoint">
<bool>false</bool>
</property>
<property name="segmentStyle">
<enum>QLCDNumber::SegmentStyle::Flat</enum>
</property>
<property name="value" stdset="0">
<double>0.010000000000000</double>
</property>
</widget>
</item>
<item row="2" column="4">
<widget class="QLCDNumber" name="ln_frx">
<property name="segmentStyle">
<enum>QLCDNumber::SegmentStyle::Flat</enum>
</property>
</widget>
</item>
<item row="2" column="5">
<widget class="QLCDNumber" name="ln_fry">
<property name="segmentStyle">
<enum>QLCDNumber::SegmentStyle::Flat</enum>
</property>
</widget>
</item>
<item row="2" column="6">
<widget class="QLCDNumber" name="ln_frz">
<property name="segmentStyle">
<enum>QLCDNumber::SegmentStyle::Flat</enum>
</property>
</widget>
</item>
<item row="0" column="0" colspan="7">
<widget class="QLabel" name="label_19">
<property name="font">
<font>
<pointsize>15</pointsize>
</font>
</property>
<property name="styleSheet">
<string notr="true">background-color: pink;</string>
</property>
<property name="text">
<string>Robot Offline</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="1"> <item row="1" column="1">
<layout class="QGridLayout" name="gridLayout_7"> <layout class="QGridLayout" name="gridLayout_7">
<item row="3" column="1"> <item row="3" column="1">
@ -565,156 +851,6 @@
</item> </item>
</layout> </layout>
</item> </item>
<item row="3" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Base Path</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="l_base">
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="b_select_base">
<property name="text">
<string>Select</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="b_base">
<property name="text">
<string>Open</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="0">
<layout class="QGridLayout" name="gridLayout_6">
<item row="1" column="1">
<widget class="QLineEdit" name="l_record_commit">
<property name="enabled">
<bool>false</bool>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_17">
<property name="text">
<string>RecordName</string>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QPushButton" name="b_record">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Record</string>
</property>
</widget>
</item>
<item row="2" column="0" colspan="3">
<layout class="QHBoxLayout" name="horizontalLayout_2" stretch="0,1,0,1,0,1">
<item>
<widget class="QLabel" name="label_18">
<property name="text">
<string>Record Frames:</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="l_record_frames">
<property name="text">
<string>0</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_25">
<property name="text">
<string>Record Size:</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="l_record_size">
<property name="text">
<string>0</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_26">
<property name="text">
<string>Max SeqId:</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="l_record_max_sid">
<property name="text">
<string>0</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="0" column="0" colspan="3">
<widget class="QPushButton" name="b_play_live">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Live</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="4" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout_6">
<item>
<widget class="QCheckBox" name="cb_bscan">
<property name="text">
<string>BSCAN</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkBox">
<property name="text">
<string>FOCUS</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout> </layout>
</widget> </widget>
<widget class="QMenuBar" name="menubar"> <widget class="QMenuBar" name="menubar">

View File

@ -40,6 +40,9 @@ class BG(Enum):
BytesMsg = auto() BytesMsg = auto()
BeamformerMsg = auto() BeamformerMsg = auto()
RequestRfFrameMsg = auto() RequestRfFrameMsg = auto()
MidiMsg = auto()
JoystickMsg = auto()
DeviceZero = auto()
class Msg: class Msg:
@ -308,6 +311,23 @@ class BeamformerMsg(BytesMsg):
pass 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 @dataclasses.dataclass
class RobotRtsiMsg(Msg): class RobotRtsiMsg(Msg):
pos: tuple[int, int, int, int, int, int] pos: tuple[int, int, int, int, int, int]

View File

@ -1,3 +1,4 @@
import click
from miio.miioprotocol import MiIOProtocol from miio.miioprotocol import MiIOProtocol
from config import SWITCH1_IP, SWITCH1_TOKEN, SWITCH2_IP, SWITCH2_TOKEN 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'] 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__': if __name__ == '__main__':
print(c2_connect()) cli()

View File

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

View File

@ -2,12 +2,35 @@ from miio.miioprotocol import MiIOProtocol
from config import SWITCH1_IP, SWITCH1_TOKEN, SWITCH2_IP, SWITCH2_TOKEN from config import SWITCH1_IP, SWITCH1_TOKEN, SWITCH2_IP, SWITCH2_TOKEN
from miio import Device 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__': if __name__ == '__main__':
# m = MiIOProtocol( cli()
# SWITCH1_IP, SWITCH1_TOKEN,
# )
# r = m.send('get_properties', [{'did': 'MYDID', 'siid': 2, 'piid': 1}])
# print(r[0]['value'])
c1_connect()

209
uv.lock
View File

@ -9,13 +9,6 @@ resolution-markers = [
"sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "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]] [[package]]
name = "aiohappyeyeballs" name = "aiohappyeyeballs"
version = "2.4.4" 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 }, { 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]] [[package]]
name = "aiosignal" name = "aiosignal"
version = "1.3.2" 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 }, { 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]] [[package]]
name = "babel" name = "babel"
version = "2.16.0" 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 }, { 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]] [[package]]
name = "executing" name = "executing"
version = "2.1.0" version = "2.1.0"
@ -589,13 +496,12 @@ version = "0.1.0"
source = { virtual = "." } source = { virtual = "." }
dependencies = [ dependencies = [
{ name = "aiohttp-cors" }, { name = "aiohttp-cors" },
{ name = "aiortc" }, { name = "click" },
{ 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 = "cupy-cuda12x" }, { name = "cupy-cuda12x" },
{ name = "jupyter" }, { name = "jupyter" },
{ name = "mido", extra = ["ports-rtmidi"] },
{ name = "opencv-python" }, { name = "opencv-python" },
{ name = "pyjoystick" },
{ name = "pyqt6" }, { name = "pyqt6" },
{ name = "pyqt6-fluent-widgets", extra = ["full"] }, { name = "pyqt6-fluent-widgets", extra = ["full"] },
{ name = "python-miio" }, { name = "python-miio" },
@ -608,13 +514,12 @@ dependencies = [
[package.metadata] [package.metadata]
requires-dist = [ requires-dist = [
{ name = "aiohttp-cors", specifier = ">=0.7.0" }, { name = "aiohttp-cors", specifier = ">=0.7.0" },
{ name = "aiortc", specifier = ">=1.9.0" }, { name = "click", specifier = ">=8.1.8" },
{ 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 = "cupy-cuda12x", specifier = ">=13.3.0" }, { name = "cupy-cuda12x", specifier = ">=13.3.0" },
{ name = "jupyter", specifier = ">=1.1.1" }, { name = "jupyter", specifier = ">=1.1.1" },
{ name = "mido", extras = ["ports-rtmidi"], specifier = ">=1.3.3" },
{ name = "opencv-python", specifier = ">=4.10.0.84" }, { name = "opencv-python", specifier = ">=4.10.0.84" },
{ name = "pyjoystick", specifier = ">=1.2.4" },
{ name = "pyqt6", specifier = ">=6.8.0" }, { name = "pyqt6", specifier = ">=6.8.0" },
{ name = "pyqt6-fluent-widgets", extras = ["full"], specifier = ">=1.7.4" }, { name = "pyqt6-fluent-widgets", extras = ["full"], specifier = ">=1.7.4" },
{ name = "python-miio", specifier = ">=0.5.12" }, { 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 }, { 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]] [[package]]
name = "h11" name = "h11"
version = "0.14.0" 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 } 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]] [[package]]
name = "mistune" name = "mistune"
version = "3.1.0" 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 }, { 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]] [[package]]
name = "pygments" name = "pygments"
version = "2.19.1" version = "2.19.1"
@ -1564,21 +1461,16 @@ wheels = [
] ]
[[package]] [[package]]
name = "pylibsrtp" name = "pyjoystick"
version = "0.10.0" version = "1.2.4"
source = { registry = "https://pypi.org/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ 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 = [ 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/a5/65/858dc1f7f4c65b9e9c8e769019cb156e6b8b96fd7f2f8f1f6bfef8717d95/pyjoystick-1.2.4-py3-none-any.whl", hash = "sha256:773989a5d796d7f32261d25338d583233ddae9a091c0c13c3fc09d250b0870a9", size = 1185266 },
{ 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 },
] ]
[[package]] [[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 }, { 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]] [[package]]
name = "pyparsing" name = "pyparsing"
version = "3.2.0" 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 }, { 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]] [[package]]
name = "python-dateutil" name = "python-dateutil"
version = "2.9.0.post0" 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 }, { 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]] [[package]]
name = "pytz" name = "pytz"
version = "2025.1" 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 }, { 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]] [[package]]
name = "rfc3339-validator" name = "rfc3339-validator"
version = "0.1.4" version = "0.1.4"