improved logging
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user