1
0
This commit is contained in:
Aiden
2026-05-27 11:50:10 +10:00
parent 0d099235c5
commit c0304c575c
55 changed files with 26035 additions and 16 deletions

41
ccu_emulator/refresh.py Normal file
View File

@@ -0,0 +1,41 @@
from __future__ import annotations
import time
from dataclasses import dataclass, field
@dataclass
class PeriodicRefresh:
"""Small scheduler for optional CCU state-refresh frames."""
frames: list[bytes] = field(default_factory=list)
interval: float = 0.0
_next_due: float | None = None
_index: int = 0
@property
def enabled(self) -> bool:
return bool(self.frames) and self.interval > 0
def start(self, now: float | None = None) -> None:
if not self.enabled:
self._next_due = None
return
self._next_due = (time.monotonic() if now is None else now) + self.interval
def due_frames(self, now: float | None = None) -> list[bytes]:
if not self.enabled:
return []
current = time.monotonic() if now is None else now
if self._next_due is None:
self._next_due = current + self.interval
return []
if current < self._next_due:
return []
frame = self.frames[self._index % len(self.frames)]
self._index += 1
while self._next_due <= current:
self._next_due += self.interval
return [frame]