2025-01-19 18:27:26 +08:00
|
|
|
import io
|
|
|
|
|
import logging
|
|
|
|
|
import struct
|
|
|
|
|
from pathlib import Path
|
|
|
|
|
|
2025-01-06 11:21:04 +08:00
|
|
|
import zmq
|
|
|
|
|
|
2025-02-14 11:29:55 +08:00
|
|
|
from config import PLAYBACK_SOCKET_PORT, SOFTWARE_CONFIG
|
2025-01-06 11:21:04 +08:00
|
|
|
from nodes.Node import Node
|
2025-02-19 00:05:14 +08:00
|
|
|
from utils.Msg import MoveAxisMsg, KillMsg, SetSeqMetaMsg, SeqIdMinMax, SetBaseMsg, SeqListMsg, SeqIdList, \
|
2025-02-18 23:31:44 +08:00
|
|
|
SetSidMsg
|
2025-01-19 19:05:56 +08:00
|
|
|
from utils.RfFile import RfSequence
|
2025-01-06 11:21:04 +08:00
|
|
|
|
2025-01-19 18:27:26 +08:00
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
2025-01-06 11:21:04 +08:00
|
|
|
|
|
|
|
|
class Loader(Node):
|
2025-02-19 00:05:14 +08:00
|
|
|
topics = [MoveAxisMsg, SetSeqMetaMsg, SetBaseMsg, SetSidMsg]
|
2025-01-06 11:21:04 +08:00
|
|
|
|
|
|
|
|
def loop(self):
|
2025-02-14 11:29:55 +08:00
|
|
|
playback_socket = self.context.socket(zmq.PUSH)
|
|
|
|
|
playback_socket.bind(f"tcp://*:{PLAYBACK_SOCKET_PORT}")
|
2025-01-19 18:27:26 +08:00
|
|
|
|
|
|
|
|
# base = Path('/mnt/16T/private_dataset/us/')
|
|
|
|
|
base: Path | None = None
|
2025-01-06 11:21:04 +08:00
|
|
|
|
2025-01-19 18:27:26 +08:00
|
|
|
rff = None
|
2025-01-06 11:21:04 +08:00
|
|
|
while True:
|
2025-02-14 11:29:55 +08:00
|
|
|
msg = self.recv()
|
|
|
|
|
if isinstance(msg, MoveAxisMsg) and rff is not None:
|
|
|
|
|
logger.debug(f'Move axis: {msg}')
|
|
|
|
|
if msg.axis == 'S':
|
2025-02-18 23:31:44 +08:00
|
|
|
pass
|
|
|
|
|
elif isinstance(msg, SetSidMsg):
|
|
|
|
|
frame = rff.frames[msg.value]
|
|
|
|
|
buffer = io.BytesIO()
|
|
|
|
|
buffer.write(struct.pack('=iqi', 114514, frame.meta.sequence_id, frame.meta.encoder))
|
|
|
|
|
buffer.write(frame.bytes)
|
|
|
|
|
playback_socket.send(buffer.getvalue())
|
2025-02-19 00:05:14 +08:00
|
|
|
elif isinstance(msg, SetSeqMetaMsg):
|
2025-01-19 18:27:26 +08:00
|
|
|
if base is None:
|
|
|
|
|
continue
|
2025-02-19 00:05:14 +08:00
|
|
|
if msg.target == 'playback':
|
|
|
|
|
rff = RfSequence.from_folder(base / msg.name)
|
|
|
|
|
self.send(SeqIdMinMax(*rff.seq_id_minmax))
|
|
|
|
|
self.send(SeqIdList([f.meta.sequence_id for f in rff.frames]))
|
|
|
|
|
self.send(SetSidMsg(0))
|
2025-02-14 11:29:55 +08:00
|
|
|
elif isinstance(msg, SetBaseMsg):
|
|
|
|
|
base = Path(msg.value)
|
|
|
|
|
seq_list = [f.name for f in base.glob('*')]
|
|
|
|
|
if not seq_list:
|
|
|
|
|
logger.warning(f'No sequences found in {base}')
|
|
|
|
|
else:
|
|
|
|
|
SOFTWARE_CONFIG.base_dir = base
|
|
|
|
|
SOFTWARE_CONFIG.write_config()
|
|
|
|
|
self.send(SeqListMsg(seq_list))
|
|
|
|
|
elif isinstance(msg, KillMsg):
|
|
|
|
|
if msg.name == '':
|
2025-01-06 11:21:04 +08:00
|
|
|
break
|