import json import logging import os from logging.handlers import RotatingFileHandler from pathlib import Path APP_ROOT = Path(__file__).resolve().parents[1] SETTINGS_PATH = APP_ROOT / "settings.json" DEFAULTS = { "can": { "interface": "vcan0", "resp_id": "0x7E8", "timeout_ms": 200 }, "ui": { "font_family": "DejaVu Sans", "font_size": 10, "window": { "width": 1100, "height": 720 } }, "logging": { "level": "INFO", "file": "logs/app.log" } } def load_settings(): cfg = DEFAULTS.copy() if SETTINGS_PATH.exists(): try: with open(SETTINGS_PATH, "r", encoding="utf-8") as f: data = json.load(f) # shallow merge for k, v in data.items(): if isinstance(v, dict) and k in cfg: cfg[k].update(v) else: cfg[k] = v except Exception as e: print("WARN: konnte settings.json nicht laden:", e) return cfg def setup_logging(cfg): level = getattr(logging, cfg["logging"].get("level", "INFO").upper(), logging.INFO) log_file = cfg["logging"].get("file", "logs/app.log") log_path = (APP_ROOT / log_file).resolve() log_path.parent.mkdir(parents=True, exist_ok=True) logger = logging.getLogger("configapp") logger.setLevel(level) handler = RotatingFileHandler(log_path, maxBytes=1_000_000, backupCount=2, encoding="utf-8") fmt = logging.Formatter("%(asctime)s [%(levelname)s] %(message)s") handler.setFormatter(fmt) logger.addHandler(handler) sh = logging.StreamHandler() sh.setFormatter(fmt) logger.addHandler(sh) return logger