def __init__(self, name="Sensor Engine"): self.readouts_by_name: Dict[str, str] = {} self.readouts_table: Dict[str, Readout[Any]] = {} self.predicates_table: Dict[str, Predicate] = {} self.events_table: Dict[str, Event] = {} self.events_by_name: Dict[str, str] = {} self.events_by_predicate: Dict[str, List[str]] = {} self.handlers_table: Dict[str, List[EventHandler]] = {} self.predicates_by_signature: Dict[str, str] = {} self.machine_table: Dict[str, StateMachine] = {} self.name = name self.log = ansilog.getLogger("sensors.Engine") self.log.setLevel(logging.DEBUG) self._alive = True
class Readout(Generic[T]): name: str freq: timedelta timeout = timedelta(seconds=5) last_updated_time = datetime(1900, 1, 1) value: Optional[T] = None id: str = field(default_factory=get_id) log = ansilog.getLogger("sensors.Readout") def scheduled_for(self) -> datetime: return self.last_updated_time + self.freq async def get_value(self) -> T: raise NotImplementedError() def read(self) -> T: if self.value is not None: return self.value raise ValueError("The sensor has never been updated.") async def update(self) -> bool: self.last_updated_time = datetime.now() old_value = self.value try: self.value = await self.get_value() if self.value != old_value: self.log.debug( f"Readout changed: '{self.name}' ({old_value} -> {self.value})" ) return self.value != old_value except asyncio.TimeoutError: self.log.error( f"Timed out waiting for readout '{self.name}' to update.") return False except Exception: self.log.exception( f"Failed to update readout '{self.name}' due to an exception.") return False def __repr__(self): return f"Readout<name={self.name}, id={str(self.id)}"
CONFIG_DEFAULTS = { 'cooldown_freq': 2000000, 'battery_freq': 1500000, 'max_freq': 9999999, 'hot_threshold': 90, 'cool_threshold': 70, 'cpu_base_path': '/sys/devices/system/cpu', 'cpu_freq_max_path': 'cpufreq/scaling_max_freq', 'temperature_path': '/sys/class/thermal/thermal_zone0/temp', 'ac_status_path': '/sys/class/power_supply/AC/online', 'kill_nvidia_on_battery': False, 'nvidia_kill_command': '/usr/bin/disable-nvidia' } log = ansilog.getLogger("x1e2-custodian") # -------------------------------------------------------------------- class CPU: BASE_PATH = Path("/sys/devices/system/cpu") FREQ_MAX = Path("cpufreq/scaling_max_freq") @classmethod def get_all(cls): return (CPU(n) for n in range(psutil.cpu_count())) @classmethod def set_all_max_freq(cls, freq: int): for cpu in cls.get_all(): cpu.set_max_freq(freq)
from argparse import ArgumentParser, Namespace from dataclasses import dataclass, field from pathlib import Path from subprocess import check_call from typing import Dict, List, Optional, Type from ansilog import fg, getLogger from .zettel import Zettel, Zettelkasten, ShellError # -------------------------------------------------------------------- DEFAULT_ZK_PATH = Path.home() / "zk" DEFAULT_ZETTEL = "index" # -------------------------------------------------------------------- log = getLogger("zk") # -------------------------------------------------------------------- error = log.error info = log.info # -------------------------------------------------------------------- class UnknownActionError(Exception): def __init__(self, action): self.action = action # -------------------------------------------------------------------- @dataclass class ActionMap:
def get_logger(name="bakery"): logger = ansilog.getLogger(name) if DEBUG: ansilog.handler.setLevel(logging.DEBUG) logger.setLevel(logging.DEBUG) return logger