61 lines
1.9 KiB
Python
61 lines
1.9 KiB
Python
import logging
|
|
import time
|
|
from datetime import datetime, timedelta
|
|
from pathlib import Path
|
|
from typing import Iterator
|
|
|
|
import h5py
|
|
|
|
from . import protocols
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class FileCSIPRoducer:
|
|
is_live = False
|
|
|
|
def __init__(self, path: Path) -> None:
|
|
self.path = path
|
|
if not self.path.exists():
|
|
raise FileNotFoundError(f"File {self.path} does not exist")
|
|
|
|
def __call__(self) -> Iterator[protocols.MergedCSI]:
|
|
"""
|
|
Replay the CSI data from the file.
|
|
"""
|
|
logger.info(f"Replaying CSI data from {self.path}")
|
|
with h5py.File(self.path, "r") as file:
|
|
try:
|
|
for key in file:
|
|
datetime.fromisoformat(key)
|
|
except ValueError as e:
|
|
logger.exception(
|
|
"The file provided was not generated using this software", e
|
|
)
|
|
|
|
start_time = datetime.fromisoformat(list(file.keys())[0])
|
|
target_offset = datetime.now() - start_time
|
|
for key in file:
|
|
logger.debug(f"Sending data from {key} at {datetime.now().isoformat()}")
|
|
|
|
# TODO: add raw frames
|
|
yield protocols.MergedCSI(
|
|
frames={},
|
|
matrix=file[key][:],
|
|
)
|
|
|
|
curr_time_virtual = datetime.fromisoformat(key)
|
|
new_offset = datetime.now() - curr_time_virtual
|
|
logger.debug(f"New offset {new_offset}, target is {target_offset}")
|
|
if new_offset > target_offset + timedelta(seconds=1):
|
|
logger.warning(
|
|
f"Data is {new_offset - target_offset} behind, lagging behind..."
|
|
)
|
|
time.sleep(max(0, (target_offset - new_offset).total_seconds()))
|
|
|
|
def stop(self) -> None:
|
|
"""
|
|
Stop the producer.
|
|
"""
|
|
logger.info("Stopping file CSI producer")
|