improved logging

This commit is contained in:
Ayzen
2026-06-06 00:52:52 +03:00
parent af6005d68f
commit aea49f6128
65 changed files with 1206 additions and 240 deletions
+13 -2
View File
@@ -3,6 +3,10 @@
from __future__ import annotations
from dataclasses import dataclass
import logging
logger = logging.getLogger(__name__)
@dataclass(slots=True, frozen=True)
class GeneratorSweepConfig:
@@ -85,8 +89,6 @@ def _validate_positive_float(value: float, label: str) -> None:
def _resolve_log_level(value: str) -> int:
"""Normalize logging level name to ``logging`` module integer constant."""
import logging
normalized = value.strip().upper()
if not normalized:
raise ValueError("generator_sweep.log_level must not be empty")
@@ -179,6 +181,15 @@ def resolve_generator_sweep_config(model: GeneratorSweepConfig) -> ResolvedGener
"generator_sweep.pwm_duty_cycle must be within (0, 1]",
)
logger.debug(
"Resolved generator sweep config: points=%d start=%dHz stop=%dHz loop=%s port=%d",
len(frequencies_hz),
frequencies_hz[0],
frequencies_hz[-1],
bool(model.loop),
int(model.port),
)
return ResolvedGeneratorSweepConfig(
log_level=log_level,
serial=(model.serial.strip() or None) if isinstance(model.serial, str) else model.serial,
+7
View File
@@ -3,8 +3,11 @@
from __future__ import annotations
from dataclasses import dataclass, field
import logging
from pathlib import Path
logger = logging.getLogger(__name__)
_PWM_CHANNEL_BY_PIN = {
12: 0,
@@ -53,12 +56,14 @@ class HardwarePwmGate:
self._pwm = HardwarePWM(pwm_channel=channel, hz=self.frequency_hz, chip=0)
except Exception as exc:
config_hint = _boot_config_hint()
logger.exception("Failed to initialize hardware PWM on GPIO%d (channel %d)", self.pin, channel)
raise RuntimeError(
"Failed to initialize Raspberry Pi hardware PWM. "
f"Enable the PWM overlay in {config_hint} by adding "
"'dtoverlay=pwm-2chan', then reboot the Raspberry Pi."
) from exc
self._running = False
logger.info("Hardware PWM opened on GPIO%d at %d Hz", self.pin, self.frequency_hz)
def enable(self) -> None:
"""Start PWM output when not already running."""
@@ -81,6 +86,8 @@ class HardwarePwmGate:
def close(self) -> None:
"""Stop PWM and release runtime state."""
self.disable()
if self._pwm is not None:
logger.info("Hardware PWM closed on GPIO%d", self.pin)
self._pwm = None
+3
View File
@@ -45,11 +45,13 @@ class _MarkerOutputs:
self._lines.open()
self._is_open = True
self.reset_to_idle()
logger.debug("Generator sweep marker GPIO lines opened")
def close(self) -> None:
"""Release GPIO lines."""
self._is_open = False
self._lines.close()
logger.debug("Generator sweep marker GPIO lines closed")
def begin_sweep(self) -> None:
"""Raise sweep marker while preserving current step level."""
@@ -170,6 +172,7 @@ class GeneratorSweepRunner:
self._markers.toggle_step()
self._wait_for_generator_ready()
self._emit_pwm_window()
logger.debug("Completed generator sweep pass over %d frequencies", len(self._config.frequencies_hz))
finally:
self._pwm.disable()
self._markers.end_sweep()