initial Commit
This commit is contained in:
47
backend/services/pico.py
Normal file
47
backend/services/pico.py
Normal file
@@ -0,0 +1,47 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
from dataclasses import dataclass
|
||||
from typing import Any
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class PicoEvent:
|
||||
button: int
|
||||
pin: int
|
||||
event: str
|
||||
pressed: bool
|
||||
|
||||
def to_dict(self) -> dict[str, Any]:
|
||||
return {
|
||||
"button": self.button,
|
||||
"pin": self.pin,
|
||||
"event": self.event,
|
||||
"pressed": self.pressed,
|
||||
}
|
||||
|
||||
|
||||
def parse_pico_line(raw_line: str) -> PicoEvent | None:
|
||||
try:
|
||||
payload = json.loads(raw_line)
|
||||
except json.JSONDecodeError:
|
||||
return None
|
||||
|
||||
if not isinstance(payload, dict):
|
||||
return None
|
||||
if not {"button", "pin", "event", "pressed"}.issubset(payload):
|
||||
return None
|
||||
if payload["event"] not in {"down", "up"}:
|
||||
return None
|
||||
|
||||
try:
|
||||
button = int(payload["button"])
|
||||
pin = int(payload["pin"])
|
||||
except (TypeError, ValueError):
|
||||
return None
|
||||
|
||||
if button < 1 or button > 10:
|
||||
return None
|
||||
|
||||
return PicoEvent(button=button, pin=pin, event=payload["event"], pressed=bool(payload["pressed"]))
|
||||
|
||||
Reference in New Issue
Block a user