change RfFrameWithMetaMsg

This commit is contained in:
flandre 2025-04-12 21:25:45 +08:00
parent b96ef921f3
commit 7c0623ef43
4 changed files with 63 additions and 22 deletions

View File

@ -1 +1,3 @@
recursive-include flandre *.ui recursive-include flandre *.ui
recursive-include flandre/assets *.png
recursive-include flandre/assets *.svg

View File

@ -26,7 +26,7 @@ class Muxer(Node):
self.play_mode = None self.play_mode = None
self.rep_socket: zmq.Socket = None self.rep_socket: zmq.Socket = None
self.req_driver_socket: zmq.Socket = None self.req_driver_socket: zmq.Socket = None
self.record_rf_msg: RfFrameWithMetaMsg | None = None self.playback_rf_msg: RfFrameWithMetaMsg | None = None
self.device_enabled = False self.device_enabled = False
def custom_setup(self): def custom_setup(self):
@ -51,10 +51,10 @@ class Muxer(Node):
return return
match self.play_mode: match self.play_mode:
case 'playback': case 'playback':
if self.record_rf_msg is None: if self.playback_rf_msg is None:
self.rep_socket.send(BeamformerMsg(b'nop').encode_msg()) self.rep_socket.send(BeamformerMsg(b'nop').encode_msg())
return return
data_msg = self.record_rf_msg data_msg = self.playback_rf_msg
case 'live': case 'live':
if not self.device_enabled: if not self.device_enabled:
self.rep_socket.send(BeamformerMsg(b'init').encode_msg()) self.rep_socket.send(BeamformerMsg(b'init').encode_msg())
@ -122,7 +122,7 @@ class Muxer(Node):
msg.encode_msg() msg.encode_msg()
)) ))
elif msg.sender == 1: elif msg.sender == 1:
self.record_rf_msg = msg self.playback_rf_msg = msg
elif isinstance(msg, KillMsg): elif isinstance(msg, KillMsg):
if msg.name == '': if msg.name == '':

View File

@ -47,6 +47,7 @@ class BG(Enum):
DeviceZero = auto() DeviceZero = auto()
SetDeviceSwitchMsg = auto() SetDeviceSwitchMsg = auto()
DeviceSwitchMsg = auto() DeviceSwitchMsg = auto()
HeaderByteMsg = auto()
class Msg: class Msg:
@ -82,14 +83,36 @@ class Msg:
return self.magic() + self.eid() + self.encode() return self.magic() + self.eid() + self.encode()
class HeaderByteMsg(Msg):
header: dict
data: bytes
def __init__(self, header: dict, data: bytes):
self.header = header
self.data = data
def encode(self) -> bytes:
e = json.dumps(self.header).encode()
return struct.pack('I', e.__len__()) + e + self.data
@classmethod
def decode(cls, data: bytes) -> 'HeaderByteMsg':
header_len = struct.unpack('I', data[:4])[0]
header = json.loads(data[4:4 + header_len])
data = data[4 + header_len:]
return HeaderByteMsg(header, data)
@dataclasses.dataclass @dataclasses.dataclass
class Msg1(Msg): class Msg1(Msg):
a: int = 0 a: int = 0
b: int = 1 b: int = 1
class RefreshDeviceMsg(Msg): class RefreshDeviceMsg(Msg):
pass pass
@dataclasses.dataclass @dataclasses.dataclass
class KillMsg(Msg): class KillMsg(Msg):
name: str = '' name: str = ''
@ -149,6 +172,7 @@ class SetRecordMsg(Msg):
commit: str = '' commit: str = ''
base: str = '' base: str = ''
@dataclasses.dataclass @dataclasses.dataclass
class SetDeviceConfigMsg(Msg): class SetDeviceConfigMsg(Msg):
name: str name: str
@ -178,11 +202,13 @@ class SetSeqMetaMsg(Msg):
target: str target: str
name: str name: str
@dataclasses.dataclass @dataclasses.dataclass
class SeqMetaMsg(Msg): class SeqMetaMsg(Msg):
target: str target: str
name: str name: str
@dataclasses.dataclass @dataclasses.dataclass
class SeqIdMinMax(Msg): class SeqIdMinMax(Msg):
min: int min: int
@ -276,25 +302,29 @@ class RfFrameMsg(Msg):
) )
class RfFrameWithMetaMsg(Msg): class RfFrameWithMetaMsg(HeaderByteMsg):
SPLIT = struct.pack('I', 114514) @dataclasses.dataclass
class Header:
sender: int
meta: str
def __init__(self, sender: int, meta: RfFrameMeta, data: bytes): def __init__(self, sender: int, meta: RfFrameMeta, data: bytes):
self.sender = sender self._header = self.Header(sender, meta.name)
self.meta = meta super().__init__(self._header.__dict__, data)
self.data = data
def encode(self) -> bytes: @property
return struct.pack('I', self.sender) + self.meta.name.encode() + self.SPLIT + self.data def sender(self) -> int:
return self._header.sender
@property
def meta(self) -> RfFrameMeta:
return RfFrameMeta.from_name(self._header.meta)
@classmethod @classmethod
def decode(cls, data: bytes) -> 'RfFrameWithMetaMsg': def decode(cls, data) -> 'RfFrameWithMetaMsg':
id2 = data.index(cls.SPLIT) msg = super(RfFrameWithMetaMsg, cls).decode(data)
return cls( header = cls.Header(**msg.header)
sender=struct.unpack('I', data[:4])[0], return RfFrameWithMetaMsg(header.sender, RfFrameMeta.from_name(header.meta), msg.data)
meta=RfFrameMeta.from_name(data[4:id2].decode()),
data=data[id2 + 4:],
)
@dataclasses.dataclass @dataclasses.dataclass
@ -366,3 +396,12 @@ def test():
test() test()
if __name__ == '__main__':
c = HeaderByteMsg(dict(a=1, b='s'), b'asdasd')
c2 = c.decode(c.encode())
print(c2.header, c2.data)
c = RfFrameWithMetaMsg(1, RfFrameMeta(1, 11, 111), b'asdasdasdads')
c2 = c.decode(c.encode())
print(c2.sender, c2.meta, c2.data)

View File

@ -29,7 +29,7 @@ class RfFrame:
return self.data.read_bytes() return self.data.read_bytes()
def mat(self, device='gpu'): def mat(self, device='gpu'):
from utils.RfMat import RfMat from flandre.utils.RfMat import RfMat
if device == 'gpu': if device == 'gpu':
arr = cp.frombuffer(self.bytes, dtype=cp.int16) arr = cp.frombuffer(self.bytes, dtype=cp.int16)