add das
This commit is contained in:
parent
4337b10a87
commit
5727df26c8
1
.gitignore
vendored
1
.gitignore
vendored
@ -2,3 +2,4 @@
|
|||||||
.venv
|
.venv
|
||||||
bak
|
bak
|
||||||
__pycache__
|
__pycache__
|
||||||
|
@DS
|
||||||
@ -15,6 +15,7 @@ dependencies = [
|
|||||||
"scipy>=1.14.1",
|
"scipy>=1.14.1",
|
||||||
"tqdm>=4.67.1",
|
"tqdm>=4.67.1",
|
||||||
"vtk>=9.4.0",
|
"vtk>=9.4.0",
|
||||||
|
"jupyter>=1.1.1",
|
||||||
]
|
]
|
||||||
|
|
||||||
[tool.uv]
|
[tool.uv]
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import zmq
|
import zmq
|
||||||
from zmq import Context
|
from zmq import Context
|
||||||
|
|
||||||
from Msg import Msg
|
from utils.Msg import Msg
|
||||||
|
|
||||||
|
|
||||||
class BusClient:
|
class BusClient:
|
||||||
|
|||||||
@ -1,15 +1,14 @@
|
|||||||
import fractions
|
import fractions
|
||||||
import logging
|
import logging
|
||||||
import math
|
|
||||||
from itertools import tee
|
from itertools import tee
|
||||||
from struct import pack, unpack_from
|
from struct import pack, unpack_from
|
||||||
from typing import Iterator, List, Optional, Sequence, Tuple, Type, TypeVar
|
from typing import Iterator, List, Optional, Sequence, Tuple, Type, TypeVar
|
||||||
|
|
||||||
import av
|
import av
|
||||||
|
import math
|
||||||
|
from aiortc.codecs.base import Decoder, Encoder
|
||||||
from aiortc.jitterbuffer import JitterFrame
|
from aiortc.jitterbuffer import JitterFrame
|
||||||
from aiortc.mediastreams import VIDEO_TIME_BASE, convert_timebase
|
from aiortc.mediastreams import VIDEO_TIME_BASE, convert_timebase
|
||||||
from aiortc.codecs.base import Decoder, Encoder
|
|
||||||
|
|
||||||
from av.frame import Frame
|
from av.frame import Frame
|
||||||
from av.packet import Packet
|
from av.packet import Packet
|
||||||
|
|
||||||
|
|||||||
@ -4,9 +4,9 @@ from typing import Callable
|
|||||||
import cupy as cp
|
import cupy as cp
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
|
||||||
from ds.Config import DeviceConfig
|
from beamformer.dist import refraction_dist, direct_dist
|
||||||
from imaging.dist import refraction_dist, direct_dist
|
from beamformer.kernels import dist_mat_to_yids, dist_mat_to_yids_pwi
|
||||||
from imaging.kernels import dist_mat_to_yids, dist_mat_to_yids_pwi
|
from utils.Config import DeviceConfig
|
||||||
|
|
||||||
|
|
||||||
def repeat_range_in_axis(shape: tuple, axis: int,p=cp):
|
def repeat_range_in_axis(shape: tuple, axis: int,p=cp):
|
||||||
|
|||||||
@ -5,8 +5,8 @@ where f(y,x) is the pixel distance in echo pulse RF signal between point(0,0) an
|
|||||||
import numpy as np
|
import numpy as np
|
||||||
from scipy.optimize import fsolve
|
from scipy.optimize import fsolve
|
||||||
|
|
||||||
from ds.Config import DeviceConfig
|
from config import DS
|
||||||
from utils.filename import DS
|
from utils.Config import DeviceConfig
|
||||||
|
|
||||||
|
|
||||||
def refraction_dist(dev_cfg=DeviceConfig()):
|
def refraction_dist(dev_cfg=DeviceConfig()):
|
||||||
|
|||||||
@ -7,9 +7,9 @@ xri: x receive index
|
|||||||
xrs: x receive shape
|
xrs: x receive shape
|
||||||
"""
|
"""
|
||||||
import cupy as cp
|
import cupy as cp
|
||||||
|
from beamformer.dist import direct_dist
|
||||||
|
|
||||||
from ds.Config import DeviceConfig
|
from utils.Config import DeviceConfig
|
||||||
from imaging.dist import direct_dist
|
|
||||||
|
|
||||||
|
|
||||||
def dist_mat_to_yids(dist_mat: cp.ndarray, dev_cfg=DeviceConfig()):
|
def dist_mat_to_yids(dist_mat: cp.ndarray, dev_cfg=DeviceConfig()):
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
from ds.Config import ImagingConfig
|
|
||||||
from imaging.ScanData import ScanData
|
|
||||||
import cupy as cp
|
import cupy as cp
|
||||||
|
|
||||||
from imaging.das import TFM
|
from beamformer.das import TFM
|
||||||
|
from utils.Config import ImagingConfig
|
||||||
|
from utils.ScanData import ScanData
|
||||||
|
|
||||||
tfm_cache = [None]
|
tfm_cache = [None]
|
||||||
|
|
||||||
|
|||||||
@ -1,3 +1,19 @@
|
|||||||
socket1 = '127.0.0.1:5003'
|
from pathlib import Path
|
||||||
video_height = 1920
|
|
||||||
video_width = 1080
|
SOCKET1 = '127.0.0.1:5003'
|
||||||
|
VIDEO_HEIGHT = 1920
|
||||||
|
VIDEO_WIDTH = 1080
|
||||||
|
|
||||||
|
BASE = Path(__file__).parent.parent
|
||||||
|
DS = BASE / '@DS'
|
||||||
|
DOC = BASE / 'doc'
|
||||||
|
DS.mkdir(exist_ok=True, parents=True)
|
||||||
|
DOC.mkdir(exist_ok=True, parents=True)
|
||||||
|
|
||||||
|
CONFIG_FOLDER = BASE / 'config'
|
||||||
|
LAST_CONFIG = BASE / 'config' / 'last_imaging_config.json'
|
||||||
|
|
||||||
|
CONFIG_FOLDER.mkdir(exist_ok=True)
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
print(BASE)
|
||||||
@ -1,10 +1,9 @@
|
|||||||
import cv2
|
import cv2
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import zmq
|
import zmq
|
||||||
import cupy as cp
|
|
||||||
|
|
||||||
from Msg import BMMsg, ImageArgMsg, KillMsg
|
from utils.Msg import BMMsg, ImageArgMsg, KillMsg
|
||||||
from config import socket1, video_width, video_height
|
from config import SOCKET1, VIDEO_WIDTH, VIDEO_HEIGHT
|
||||||
from nodes.Node import Node
|
from nodes.Node import Node
|
||||||
|
|
||||||
|
|
||||||
@ -26,14 +25,14 @@ class Beamformer(Node):
|
|||||||
b *= 255
|
b *= 255
|
||||||
b = b.astype(np.uint8)
|
b = b.astype(np.uint8)
|
||||||
b = cv2.rotate(b, cv2.ROTATE_90_CLOCKWISE)
|
b = cv2.rotate(b, cv2.ROTATE_90_CLOCKWISE)
|
||||||
b = cv2.resize(b, (video_width, video_height))
|
b = cv2.resize(b, (VIDEO_WIDTH, VIDEO_HEIGHT))
|
||||||
b = cv2.cvtColor(b, cv2.COLOR_GRAY2RGBA, b)
|
b = cv2.cvtColor(b, cv2.COLOR_GRAY2RGBA, b)
|
||||||
self.send(BMMsg(0, b.tobytes()))
|
self.send(BMMsg(0, b.tobytes()))
|
||||||
|
|
||||||
def loop(self):
|
def loop(self):
|
||||||
s2 = self.context.socket(zmq.PULL)
|
s2 = self.context.socket(zmq.PULL)
|
||||||
s2.setsockopt(zmq.CONFLATE, 1)
|
s2.setsockopt(zmq.CONFLATE, 1)
|
||||||
s2.connect(f"tcp://{socket1}")
|
s2.connect(f"tcp://{SOCKET1}")
|
||||||
self.c.poller.register(s2, zmq.POLLIN)
|
self.c.poller.register(s2, zmq.POLLIN)
|
||||||
buffer = None
|
buffer = None
|
||||||
while True:
|
while True:
|
||||||
|
|||||||
@ -4,7 +4,7 @@ import zmq
|
|||||||
from zmq import ContextTerminated
|
from zmq import ContextTerminated
|
||||||
|
|
||||||
from nodes.Node import Node
|
from nodes.Node import Node
|
||||||
from Msg import KillMsg
|
from utils.Msg import KillMsg
|
||||||
|
|
||||||
|
|
||||||
class Broker(Node):
|
class Broker(Node):
|
||||||
|
|||||||
@ -1,15 +1,9 @@
|
|||||||
import sys
|
|
||||||
|
|
||||||
import cv2
|
import cv2
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import zmq
|
import zmq
|
||||||
|
|
||||||
from PyQt6.QtWidgets import QMainWindow, QApplication
|
from utils.Msg import BMMsg
|
||||||
|
from config import VIDEO_HEIGHT, VIDEO_WIDTH
|
||||||
from Image import Ui_MainWindow
|
|
||||||
from RfFile import RfFolder
|
|
||||||
from Msg import StrMsg, MoveAxisMsg, KillMsg, Msg, ImageArgMsg, BMMsg
|
|
||||||
from config import video_height, video_width
|
|
||||||
from nodes.Node import Node
|
from nodes.Node import Node
|
||||||
|
|
||||||
|
|
||||||
@ -18,7 +12,7 @@ class ImageCV(Node):
|
|||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.buffer = np.zeros((video_height, video_width, 3), dtype=np.uint8) + 128
|
self.buffer = np.zeros((VIDEO_HEIGHT, VIDEO_WIDTH, 3), dtype=np.uint8) + 128
|
||||||
|
|
||||||
def loop(self):
|
def loop(self):
|
||||||
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
|
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
|
||||||
@ -28,7 +22,7 @@ class ImageCV(Node):
|
|||||||
r = self.recv()
|
r = self.recv()
|
||||||
if isinstance(r, BMMsg):
|
if isinstance(r, BMMsg):
|
||||||
b = np.frombuffer(r.data, dtype=np.uint8)
|
b = np.frombuffer(r.data, dtype=np.uint8)
|
||||||
b = np.reshape(b, (video_height, video_width, 4))
|
b = np.reshape(b, (VIDEO_HEIGHT, VIDEO_WIDTH, 4))
|
||||||
self.buffer = b
|
self.buffer = b
|
||||||
cv2.imshow('image', self.buffer)
|
cv2.imshow('image', self.buffer)
|
||||||
cv2.waitKey(1)
|
cv2.waitKey(1)
|
||||||
|
|||||||
@ -1,17 +1,14 @@
|
|||||||
import sys
|
import sys
|
||||||
|
|
||||||
import numpy as np
|
|
||||||
import zmq
|
|
||||||
from PyQt6 import QtCore
|
from PyQt6 import QtCore
|
||||||
from PyQt6.QtCore import QByteArray
|
from PyQt6.QtCore import QByteArray
|
||||||
from PyQt6.QtGui import QImage, QPixmap
|
from PyQt6.QtGui import QImage, QPixmap
|
||||||
from PyQt6.QtWidgets import QMainWindow, QApplication
|
from PyQt6.QtWidgets import QMainWindow, QApplication
|
||||||
|
|
||||||
from Image import Ui_MainWindow
|
from Image import Ui_MainWindow
|
||||||
from RfFile import RfFolder
|
from utils.Msg import KillMsg, Msg, ImageArgMsg, BMMsg
|
||||||
from Msg import StrMsg, MoveAxisMsg, KillMsg, Msg, ImageArgMsg, BMMsg
|
|
||||||
from ZMQReceiver import ZMQReceiver
|
from ZMQReceiver import ZMQReceiver
|
||||||
from config import video_height, video_width
|
from config import VIDEO_HEIGHT, VIDEO_WIDTH
|
||||||
from nodes.Node import Node
|
from nodes.Node import Node
|
||||||
|
|
||||||
|
|
||||||
@ -34,7 +31,7 @@ class Adv(QMainWindow, Ui_MainWindow):
|
|||||||
# height, width, channel = cvImg.shape
|
# height, width, channel = cvImg.shape
|
||||||
# bytesPerLine = 3 * width
|
# bytesPerLine = 3 * width
|
||||||
# qImg = QImage(cvImg.data, width, height, bytesPerLine, QImage.Format.Format_RGB888).rgbSwapped()
|
# qImg = QImage(cvImg.data, width, height, bytesPerLine, QImage.Format.Format_RGB888).rgbSwapped()
|
||||||
qImg = QImage(msg.data, video_width, video_height, 4 * video_width, QImage.Format.Format_RGB888).rgbSwapped()
|
qImg = QImage(msg.data, VIDEO_WIDTH, VIDEO_HEIGHT, 4 * VIDEO_WIDTH, QImage.Format.Format_RGB888).rgbSwapped()
|
||||||
self.label.setPixmap(QPixmap(qImg))
|
self.label.setPixmap(QPixmap(qImg))
|
||||||
|
|
||||||
@QtCore.pyqtSlot(int)
|
@QtCore.pyqtSlot(int)
|
||||||
|
|||||||
@ -1,8 +1,7 @@
|
|||||||
import numpy as np
|
|
||||||
import zmq
|
import zmq
|
||||||
|
|
||||||
from RfFile import RfFolder
|
from utils.RfFile import RfFolder
|
||||||
from Msg import StrMsg, MoveAxisMsg, KillMsg
|
from utils.Msg import MoveAxisMsg, KillMsg
|
||||||
from nodes.Node import Node
|
from nodes.Node import Node
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -1,14 +1,11 @@
|
|||||||
import sys
|
import sys
|
||||||
|
|
||||||
import numpy as np
|
|
||||||
import zmq
|
|
||||||
from PyQt6 import QtCore
|
from PyQt6 import QtCore
|
||||||
from PyQt6.QtCore import QByteArray
|
from PyQt6.QtCore import QByteArray
|
||||||
from PyQt6.QtWidgets import QMainWindow, QApplication
|
from PyQt6.QtWidgets import QMainWindow, QApplication
|
||||||
|
|
||||||
from Main import Ui_MainWindow
|
from Main import Ui_MainWindow
|
||||||
from RfFile import RfFolder
|
from utils.Msg import KillMsg, Msg, ImageArgMsg
|
||||||
from Msg import StrMsg, MoveAxisMsg, KillMsg, Msg, ImageArgMsg
|
|
||||||
from ZMQReceiver import ZMQReceiver
|
from ZMQReceiver import ZMQReceiver
|
||||||
from nodes.Node import Node
|
from nodes.Node import Node
|
||||||
|
|
||||||
|
|||||||
@ -4,7 +4,7 @@ from abc import abstractmethod
|
|||||||
import zmq
|
import zmq
|
||||||
|
|
||||||
from BusClient import BusClient
|
from BusClient import BusClient
|
||||||
from Msg import Msg, KillMsg
|
from utils.Msg import Msg, KillMsg
|
||||||
|
|
||||||
|
|
||||||
class Node:
|
class Node:
|
||||||
|
|||||||
@ -9,7 +9,6 @@ from fractions import Fraction
|
|||||||
import aiohttp
|
import aiohttp
|
||||||
import aiohttp_cors
|
import aiohttp_cors
|
||||||
import aiortc.rtcrtpsender
|
import aiortc.rtcrtpsender
|
||||||
import cv2
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import zmq
|
import zmq
|
||||||
from aiohttp import web, WSMessage
|
from aiohttp import web, WSMessage
|
||||||
@ -19,8 +18,8 @@ from av import VideoFrame
|
|||||||
|
|
||||||
import H264NV
|
import H264NV
|
||||||
from BusClient import BusClient
|
from BusClient import BusClient
|
||||||
from Msg import BMMsg, Msg, TickMsg, KillMsg, StrMsg, MoveAxisMsg, ImageArgMsg
|
from utils.Msg import BMMsg, Msg, KillMsg, MoveAxisMsg, ImageArgMsg
|
||||||
from config import video_width, video_height
|
from config import VIDEO_WIDTH, VIDEO_HEIGHT
|
||||||
|
|
||||||
ROOT = os.path.dirname(__file__)
|
ROOT = os.path.dirname(__file__)
|
||||||
from nodes.Node import Node
|
from nodes.Node import Node
|
||||||
@ -29,7 +28,7 @@ web.WebSocketResponse()
|
|||||||
|
|
||||||
|
|
||||||
def generate_placeholder():
|
def generate_placeholder():
|
||||||
z = np.zeros((video_height, video_width, 4), dtype=np.uint8)
|
z = np.zeros((VIDEO_HEIGHT, VIDEO_WIDTH, 4), dtype=np.uint8)
|
||||||
z[:, :, 3] = 0
|
z[:, :, 3] = 0
|
||||||
z[:, :, :3] = 128
|
z[:, :, :3] = 128
|
||||||
return z.tobytes()
|
return z.tobytes()
|
||||||
@ -58,7 +57,7 @@ class WebRTC(Node):
|
|||||||
msg: BMMsg = Msg.decode_msg(events[0][0].recv())
|
msg: BMMsg = Msg.decode_msg(events[0][0].recv())
|
||||||
self.buffer = msg.data
|
self.buffer = msg.data
|
||||||
|
|
||||||
frame = VideoFrame.from_bytes(self.buffer, video_width, video_height)
|
frame = VideoFrame.from_bytes(self.buffer, VIDEO_WIDTH, VIDEO_HEIGHT)
|
||||||
frame.time_base = Fraction(1, 60)
|
frame.time_base = Fraction(1, 60)
|
||||||
frame.pts = self.pts
|
frame.pts = self.pts
|
||||||
self.pts += 1
|
self.pts += 1
|
||||||
|
|||||||
103
src/rtcserver.py
103
src/rtcserver.py
@ -1,103 +0,0 @@
|
|||||||
import asyncio
|
|
||||||
import json
|
|
||||||
import logging
|
|
||||||
import os
|
|
||||||
from fractions import Fraction
|
|
||||||
|
|
||||||
import aiohttp_cors
|
|
||||||
import aiortc.rtcrtpsender
|
|
||||||
import zmq
|
|
||||||
from aiohttp import web
|
|
||||||
from aiortc import MediaStreamTrack, RTCPeerConnection, RTCSessionDescription, RTCConfiguration, RTCRtpCodecCapability
|
|
||||||
|
|
||||||
from av import VideoFrame
|
|
||||||
|
|
||||||
import H264NV
|
|
||||||
|
|
||||||
ROOT = os.path.dirname(__file__)
|
|
||||||
|
|
||||||
|
|
||||||
class PlayerStreamTrackx(MediaStreamTrack):
|
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
context = zmq.Context()
|
|
||||||
self.socket = context.socket(zmq.PULL)
|
|
||||||
self.socket.bind("tcp://*:5555")
|
|
||||||
self.kind = 'video'
|
|
||||||
self.pts = 0
|
|
||||||
|
|
||||||
async def recv(self):
|
|
||||||
frame = VideoFrame.from_bytes(self.socket.recv(), 1920, 1080)
|
|
||||||
frame.time_base = Fraction(1, 120)
|
|
||||||
frame.pts = self.pts
|
|
||||||
self.pts += 1
|
|
||||||
return frame
|
|
||||||
|
|
||||||
|
|
||||||
pcs = set()
|
|
||||||
px = PlayerStreamTrackx()
|
|
||||||
|
|
||||||
|
|
||||||
async def offer(request):
|
|
||||||
params = await request.json()
|
|
||||||
offer = RTCSessionDescription(sdp=params["sdp"], type=params["type"])
|
|
||||||
pc = RTCPeerConnection(RTCConfiguration([]))
|
|
||||||
# print(request.remote)
|
|
||||||
pcs.add(pc)
|
|
||||||
rc = pc.addTransceiver(px, 'sendonly')
|
|
||||||
rc.setCodecPreferences([RTCRtpCodecCapability(mimeType='video/H264',
|
|
||||||
clockRate=90000,
|
|
||||||
channels=None,
|
|
||||||
parameters={
|
|
||||||
'level-asymmetry-allowed': '1',
|
|
||||||
'packetization-mode': '1',
|
|
||||||
'profile-level-id': '42e01f'
|
|
||||||
})])
|
|
||||||
await pc.setRemoteDescription(offer)
|
|
||||||
answer = await pc.createAnswer()
|
|
||||||
await pc.setLocalDescription(answer)
|
|
||||||
return web.Response(
|
|
||||||
content_type="application/json",
|
|
||||||
text=json.dumps(
|
|
||||||
{"sdp": pc.localDescription.sdp, "type": pc.localDescription.type}
|
|
||||||
),
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
async def on_shutdown(app):
|
|
||||||
# close peer connections
|
|
||||||
coros = [pc.close() for pc in pcs]
|
|
||||||
await asyncio.gather(*coros)
|
|
||||||
pcs.clear()
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
f0 = aiortc.RTCRtpSender.__init__
|
|
||||||
|
|
||||||
|
|
||||||
def f1(*args, **kwargs):
|
|
||||||
f0(*args, **kwargs)
|
|
||||||
if not args[1] == 'audio':
|
|
||||||
args[0]._RTCRtpSender__encoder = H264NV.H264NVENCEncoder()
|
|
||||||
|
|
||||||
|
|
||||||
aiortc.RTCRtpSender.__init__ = f1
|
|
||||||
logging.basicConfig(level=logging.INFO)
|
|
||||||
app = web.Application()
|
|
||||||
app.on_shutdown.append(on_shutdown)
|
|
||||||
app.router.add_post("/offer", offer)
|
|
||||||
|
|
||||||
cors = aiohttp_cors.setup(app, defaults={
|
|
||||||
"*": aiohttp_cors.ResourceOptions(
|
|
||||||
allow_credentials=True,
|
|
||||||
expose_headers="*",
|
|
||||||
allow_headers="*"
|
|
||||||
)
|
|
||||||
})
|
|
||||||
|
|
||||||
for route in list(app.router.routes()):
|
|
||||||
cors.add(route)
|
|
||||||
|
|
||||||
web.run_app(
|
|
||||||
app, access_log=None, host='0.0.0.0', port=8081
|
|
||||||
)
|
|
||||||
@ -1,7 +1,7 @@
|
|||||||
import dataclasses
|
import dataclasses
|
||||||
import json
|
import json
|
||||||
|
|
||||||
from utils.filename import LAST_CONFIG, CONFIG_FOLDER
|
from config import CONFIG_FOLDER
|
||||||
|
|
||||||
|
|
||||||
@dataclasses.dataclass
|
@dataclasses.dataclass
|
||||||
|
|||||||
@ -1,7 +1,6 @@
|
|||||||
import dataclasses
|
import dataclasses
|
||||||
import json
|
import json
|
||||||
import struct
|
import struct
|
||||||
import time
|
|
||||||
from enum import auto, Enum
|
from enum import auto, Enum
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,7 @@
|
|||||||
|
from enum import Enum, auto
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
import inspect
|
||||||
|
from typing import Annotated, get_type_hints
|
||||||
|
|
||||||
from attr import dataclass
|
from attr import dataclass
|
||||||
|
|
||||||
@ -9,6 +12,7 @@ class RfFolder:
|
|||||||
D: str
|
D: str
|
||||||
L: int = 30
|
L: int = 30
|
||||||
C: str = 'PAR'
|
C: str = 'PAR'
|
||||||
|
SHAPE = (1500, 256)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def from_path(p: Path | str) -> 'RfFolder':
|
def from_path(p: Path | str) -> 'RfFolder':
|
||||||
@ -59,11 +63,144 @@ class RfFile:
|
|||||||
# print(filename)
|
# print(filename)
|
||||||
return self.folder.path / filename
|
return self.folder.path / filename
|
||||||
|
|
||||||
|
@property
|
||||||
|
def bin(self):
|
||||||
|
return self.path.read_bytes()
|
||||||
|
|
||||||
|
|
||||||
def test2():
|
def test2():
|
||||||
r = RfFile.from_path('/run/media/lambda/b86dccdc-f134-464b-a310-6575ee9ae85c/cap4/TEST1,L=30,C=PAR/S=925,E=4.bin')
|
r = RfFile.from_path('/run/media/lambda/b86dccdc-f134-464b-a310-6575ee9ae85c/cap4/TEST1,L=30,C=PAR/S=925,E=4.bin')
|
||||||
print(r)
|
print(r)
|
||||||
|
|
||||||
|
|
||||||
|
COMMIT_KEY = 'COMMIT'
|
||||||
|
|
||||||
|
|
||||||
|
class SM:
|
||||||
|
@classmethod
|
||||||
|
@property
|
||||||
|
def p2a(clz):
|
||||||
|
gh = get_type_hints(clz, include_extras=True)
|
||||||
|
return {k: gh[k].__metadata__[0] for k in gh}
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
@property
|
||||||
|
def p2t(clz):
|
||||||
|
return get_type_hints(clz)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
@property
|
||||||
|
def a2p(clz):
|
||||||
|
return {v: k for k, v in clz.p2a.items()}
|
||||||
|
|
||||||
|
@property
|
||||||
|
def name(self):
|
||||||
|
p2a = self.p2a
|
||||||
|
p2t = self.p2t
|
||||||
|
a2p = self.a2p
|
||||||
|
arr = []
|
||||||
|
if COMMIT_KEY in a2p:
|
||||||
|
cp = a2p[COMMIT_KEY]
|
||||||
|
del p2a[cp]
|
||||||
|
arr.append(f'{self.__getattribute__(cp)}')
|
||||||
|
for p in p2a:
|
||||||
|
t = p2t[p]
|
||||||
|
v = self.__getattribute__(p)
|
||||||
|
if issubclass(t, Enum):
|
||||||
|
vs = v.name
|
||||||
|
elif issubclass(t, tuple):
|
||||||
|
vs = f'({' '.join([str(vv) for vv in v])})'
|
||||||
|
else:
|
||||||
|
vs = str(v)
|
||||||
|
arr.append(f'{p2a[p]}={vs}')
|
||||||
|
return ",".join(arr) + '.bin'
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_name(clz, name: str):
|
||||||
|
p2t = clz.p2t
|
||||||
|
a2p = clz.a2p
|
||||||
|
c = clz()
|
||||||
|
sp = Path(name).stem.split(',')
|
||||||
|
if COMMIT_KEY in a2p:
|
||||||
|
c.__setattr__(a2p[COMMIT_KEY], sp.pop(0))
|
||||||
|
for pv in sp:
|
||||||
|
a, v = pv.split('=')
|
||||||
|
p = a2p[a]
|
||||||
|
t = p2t[p]
|
||||||
|
if issubclass(t, Enum):
|
||||||
|
c.__setattr__(p, t[v])
|
||||||
|
elif issubclass(t, tuple):
|
||||||
|
c.__setattr__(p, tuple(int(i) for i in v[1:-1].split(' ')))
|
||||||
|
else:
|
||||||
|
c.__setattr__(p, t(v))
|
||||||
|
|
||||||
|
return c
|
||||||
|
|
||||||
|
|
||||||
|
class RfFrame:
|
||||||
|
@dataclass
|
||||||
|
class RfFrameMeta(SM):
|
||||||
|
encoder: Annotated[int, 'E'] = None
|
||||||
|
sequence_id: Annotated[int, 'S'] = None # test3
|
||||||
|
robot_x: Annotated[int, 'X'] = None
|
||||||
|
robot_y: Annotated[int, 'Y'] = None
|
||||||
|
robot_z: Annotated[int, 'Z'] = None
|
||||||
|
|
||||||
|
def __init__(self, data: bytes | Path, meta: RfFrameMeta):
|
||||||
|
self.data = data
|
||||||
|
self.meta = meta
|
||||||
|
|
||||||
|
def save(self, folder: Path):
|
||||||
|
(folder / self.meta.name).write_bytes(self.bytes)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def bytes(self):
|
||||||
|
if isinstance(self.data, bytes):
|
||||||
|
return self.data
|
||||||
|
if isinstance(self.data, Path):
|
||||||
|
return self.data.read_bytes()
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class RfSequenceMeta(SM):
|
||||||
|
class RfSequenceMode(Enum):
|
||||||
|
PWI = auto()
|
||||||
|
TFM = auto()
|
||||||
|
|
||||||
|
commit: Annotated[int, COMMIT_KEY] = None
|
||||||
|
shape: Annotated[tuple, 'S'] = None
|
||||||
|
mode: Annotated[RfSequenceMode, 'M'] = RfSequenceMode.PWI
|
||||||
|
us: Annotated[int, 'U'] = None
|
||||||
|
|
||||||
|
|
||||||
|
class RfSequence:
|
||||||
|
def __init__(self, frames: list[RfFrame], meta: RfSequenceMeta):
|
||||||
|
self.frames = frames
|
||||||
|
self.meta = meta
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_folder(cls, folder: Path | str) -> 'RfSequence':
|
||||||
|
folder = Path(folder)
|
||||||
|
meta = RfSequenceMeta.from_name(folder.name)
|
||||||
|
arr = []
|
||||||
|
for f in folder.glob('*.bin'):
|
||||||
|
arr.append(RfFrame(f, RfFrame.RfFrameMeta.from_name(f.name)))
|
||||||
|
return RfSequence(arr, meta)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def all(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def query(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
test2()
|
t = (1, 2)
|
||||||
|
f = RfSequenceMeta.from_name('123123,U=321,S=(1 2 3),M=PWI')
|
||||||
|
# print(f.commit)
|
||||||
|
print(f.name)
|
||||||
|
# print(RfSequence.RfSequenceMeta.p2t)
|
||||||
|
# f = RfFrame.RfFrameMeta(123, 345)
|
||||||
|
# print(f.name)
|
||||||
|
rs = RfSequence([], RfSequenceMeta())
|
||||||
|
|||||||
@ -2,7 +2,7 @@ import time
|
|||||||
|
|
||||||
|
|
||||||
from BusClient import BusClient
|
from BusClient import BusClient
|
||||||
from Msg import KillMsg
|
from utils.Msg import KillMsg
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
c = BusClient()
|
c = BusClient()
|
||||||
|
|||||||
@ -2,15 +2,45 @@
|
|||||||
"cells": [
|
"cells": [
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": null,
|
|
||||||
"id": "initial_id",
|
"id": "initial_id",
|
||||||
"metadata": {
|
"metadata": {
|
||||||
"collapsed": true
|
"collapsed": true,
|
||||||
|
"ExecuteTime": {
|
||||||
|
"end_time": "2025-01-12T12:27:14.384233Z",
|
||||||
|
"start_time": "2025-01-12T12:27:13.172285Z"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"outputs": [],
|
|
||||||
"source": [
|
"source": [
|
||||||
""
|
"from beamformer.process import pwi_process\n",
|
||||||
|
"from utils.RfFile import RfFile\n",
|
||||||
|
"from utils.ScanData import ScanData\n",
|
||||||
|
"\n",
|
||||||
|
"f = RfFile.from_path('/run/media/lambda/b86dccdc-f134-464b-a310-6575ee9ae85c/cap4/trim/R1,L=30,C=PAR/S=1063,E=4.bin')\n",
|
||||||
|
"s = ScanData.from_file(f)\n",
|
||||||
|
"pwi_process()"
|
||||||
|
],
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stderr",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"/home/lambda/source/scarlet/flandre/.venv/lib/python3.12/site-packages/cupyx/jit/_interface.py:173: FutureWarning: cupyx.jit.rawkernel is experimental. The interface can change in the future.\n",
|
||||||
|
" cupy._util.experimental('cupyx.jit.rawkernel')\n"
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ename": "TypeError",
|
||||||
|
"evalue": "ScanData.from_file() missing 1 required positional argument: 'shape'",
|
||||||
|
"output_type": "error",
|
||||||
|
"traceback": [
|
||||||
|
"\u001B[0;31m---------------------------------------------------------------------------\u001B[0m",
|
||||||
|
"\u001B[0;31mTypeError\u001B[0m Traceback (most recent call last)",
|
||||||
|
"Cell \u001B[0;32mIn[2], line 6\u001B[0m\n\u001B[1;32m 3\u001B[0m \u001B[38;5;28;01mfrom\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[38;5;21;01mutils\u001B[39;00m\u001B[38;5;21;01m.\u001B[39;00m\u001B[38;5;21;01mScanData\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[38;5;28;01mimport\u001B[39;00m ScanData\n\u001B[1;32m 5\u001B[0m f \u001B[38;5;241m=\u001B[39m RfFile\u001B[38;5;241m.\u001B[39mfrom_path(\u001B[38;5;124m'\u001B[39m\u001B[38;5;124m/run/media/lambda/b86dccdc-f134-464b-a310-6575ee9ae85c/cap4/trim/R1,L=30,C=PAR/S=1063,E=4.bin\u001B[39m\u001B[38;5;124m'\u001B[39m)\n\u001B[0;32m----> 6\u001B[0m s \u001B[38;5;241m=\u001B[39m \u001B[43mScanData\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mfrom_file\u001B[49m\u001B[43m(\u001B[49m\u001B[43mf\u001B[49m\u001B[43m)\u001B[49m\n\u001B[1;32m 7\u001B[0m pwi_process()\n",
|
||||||
|
"\u001B[0;31mTypeError\u001B[0m: ScanData.from_file() missing 1 required positional argument: 'shape'"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"execution_count": 2
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"metadata": {
|
"metadata": {
|
||||||
|
|||||||
@ -0,0 +1,2 @@
|
|||||||
|
if __name__ == '__main__':
|
||||||
|
print(tuple(str((1, 2, 3))))
|
||||||
@ -10,12 +10,11 @@ from tqdm import tqdm
|
|||||||
from nodes.Beamformer import Beamformer
|
from nodes.Beamformer import Beamformer
|
||||||
from nodes.Broker import Broker
|
from nodes.Broker import Broker
|
||||||
from nodes.ImageCV import ImageCV
|
from nodes.ImageCV import ImageCV
|
||||||
from nodes.ImageQt import ImageQt
|
|
||||||
from nodes.Loader import Loader
|
from nodes.Loader import Loader
|
||||||
from nodes.MainUI import MainUI
|
from nodes.MainUI import MainUI
|
||||||
from nodes.Node import Node
|
from nodes.Node import Node
|
||||||
from BusClient import BusClient
|
from BusClient import BusClient
|
||||||
from Msg import Msg1, Msg2, BMMsg, TickMsg, StrMsg, KillMsg
|
from utils.Msg import Msg1, Msg2, BMMsg, TickMsg, StrMsg, KillMsg
|
||||||
from nodes.WebRTC import WebRTC
|
from nodes.WebRTC import WebRTC
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user