flandre/src/nodes/Loader.py

60 lines
2.1 KiB
Python
Raw Normal View History

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