Refactor installer

This commit is contained in:
Michael Hansen
2024-01-14 15:15:44 -06:00
parent 03bd01ab1f
commit 316427948e
10 changed files with 1680 additions and 130 deletions
+85
View File
@@ -0,0 +1,85 @@
"""Constants and dataclasses."""
import logging
import json
from enum import Enum
from dataclasses import dataclass, fields, asdict, field
from typing import Any, Dict, Optional, List
from pathlib import Path
_DIR = Path(__file__).parent
_LOGGER = logging.getLogger()
PROGRAM_DIR = _DIR.parent
LOCAL_DIR = PROGRAM_DIR / "local"
SETTINGS_PATH = LOCAL_DIR / "settings.json"
SERVICES_DIR = LOCAL_DIR / "services"
RECORD_SECONDS = 8
RECORD_RMS_MIN = 30
TITLE = "Wyoming Satellite"
WIDTH = "75"
HEIGHT = "20"
LIST_HEIGHT = "12"
class SatelliteType(str, Enum):
ALWAYS_STREAMING = "always"
VAD = "vad"
WAKE = "wake"
class WakeWordSystem(str, Enum):
OPENWAKEWORD = "openWakeWord"
PORCUPINE1 = "porcupine1"
SNOWBOY = "snowboy"
@dataclass
class Settings:
microphone_device: Optional[str] = None
noise_suppression_level: int = 0
auto_gain: int = 0
mic_volume_multiplier: float = 1.0
sound_device: Optional[str] = None
feedback_sounds: List[str] = field(default_factory=list)
wake_word_system: Optional[WakeWordSystem] = None
wake_word: Dict[WakeWordSystem, str] = field(
default_factory=lambda: {
WakeWordSystem.OPENWAKEWORD: "ok_nabu",
WakeWordSystem.PORCUPINE1: "porcupine",
WakeWordSystem.SNOWBOY: "snowboy",
}
)
satellite_name: str = "Wyoming Satellite"
satellite_type: SatelliteType = SatelliteType.ALWAYS_STREAMING
debug_enabled: bool = False
@staticmethod
def load() -> "Settings":
kwargs: Dict[str, Any] = {}
if SETTINGS_PATH.exists():
_LOGGER.debug("Loading settings from %s", SETTINGS_PATH)
with open(SETTINGS_PATH, "r", encoding="utf-8") as settings_file:
settings_dict = json.load(settings_file)
for settings_field in fields(Settings):
value = settings_dict.get(settings_field.name)
if value is not None:
kwargs[settings_field.name] = value
return Settings(**kwargs)
def save(self) -> None:
_LOGGER.debug("Saving settings to %s", SETTINGS_PATH)
settings_dict = asdict(self)
SETTINGS_PATH.parent.mkdir(parents=True, exist_ok=True)
with open(SETTINGS_PATH, "w", encoding="utf-8") as settings_file:
json.dump(settings_dict, settings_file, ensure_ascii=False, indent=2)