Refactor into modular app structure
Split monolithic files into focused modules: - app/core: settings, logging, lifecycle - app/signaling: websocket server, ICE parser, message models - app/webrtc: peer session, video receiver, frame source - app/vision: pose landmarker wrapper, model config, pose types - app/exercises/dead_bug: detector, metrics, rules, state machine, types - app/rendering: skeleton renderer, status overlay, window display - app/audio: rep announcer - app/diagnostics: perf timer, crash handler - configs: environment-based settings - tests: unit tests for rules, state machine, ICE parser - run.py: entry point
This commit is contained in:
@@ -0,0 +1,11 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import faulthandler
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
def enable_crash_handler(log_dir: str | Path) -> None:
|
||||
log_dir = Path(log_dir)
|
||||
log_dir.mkdir(parents=True, exist_ok=True)
|
||||
crash_log = open(log_dir / "posefit-crash.log", "a", buffering=1)
|
||||
faulthandler.enable(file=crash_log, all_threads=True)
|
||||
@@ -0,0 +1,34 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import time
|
||||
from contextlib import contextmanager
|
||||
|
||||
from loguru import logger
|
||||
|
||||
|
||||
class PerfTimer:
|
||||
def __init__(self, name: str = "") -> None:
|
||||
self.name = name
|
||||
self._start = 0.0
|
||||
self._elapsed = 0.0
|
||||
|
||||
def start(self) -> PerfTimer:
|
||||
self._start = time.perf_counter()
|
||||
return self
|
||||
|
||||
def stop(self) -> float:
|
||||
self._elapsed = time.perf_counter() - self._start
|
||||
return self._elapsed
|
||||
|
||||
@property
|
||||
def elapsed_ms(self) -> float:
|
||||
return self._elapsed * 1000
|
||||
|
||||
|
||||
@contextmanager
|
||||
def measure(name: str = ""):
|
||||
timer = PerfTimer(name).start()
|
||||
yield timer
|
||||
elapsed = timer.stop()
|
||||
if name:
|
||||
logger.debug("{} took {:.1f}ms", name, timer.elapsed_ms)
|
||||
Reference in New Issue
Block a user