74 lines
2.4 KiB
Python
74 lines
2.4 KiB
Python
import json
|
|
from pathlib import Path
|
|
|
|
from led_platform.domain import PhysicalOutput, Tile
|
|
|
|
|
|
class TileStore:
|
|
def __init__(self, config_path: Path, wall_width: int, wall_height: int) -> None:
|
|
self.config_path = config_path
|
|
self.wall_width = wall_width
|
|
self.wall_height = wall_height
|
|
self._tiles: dict[str, Tile] = {}
|
|
self.reload()
|
|
|
|
def reload(self) -> None:
|
|
if self.config_path.exists():
|
|
data = json.loads(self.config_path.read_text(encoding="utf-8"))
|
|
tiles = [Tile(**item) for item in data["tiles"]]
|
|
else:
|
|
tiles = self._default_tiles()
|
|
self._tiles = {tile.id: tile for tile in tiles}
|
|
|
|
def all(self) -> list[Tile]:
|
|
return list(self._tiles.values())
|
|
|
|
def get(self, tile_id: str) -> Tile:
|
|
if tile_id not in self._tiles:
|
|
raise KeyError(tile_id)
|
|
return self._tiles[tile_id]
|
|
|
|
def ids(self) -> list[str]:
|
|
return list(self._tiles.keys())
|
|
|
|
def _default_tiles(self) -> list[Tile]:
|
|
half_width = self.wall_width // 2
|
|
return [
|
|
Tile(
|
|
id="left",
|
|
name="Left output server",
|
|
x=0,
|
|
y=0,
|
|
width=half_width,
|
|
height=self.wall_height,
|
|
wall_width=self.wall_width,
|
|
wall_height=self.wall_height,
|
|
desktop_width=7680,
|
|
desktop_height=4320,
|
|
physical_outputs=self._default_outputs("left"),
|
|
),
|
|
Tile(
|
|
id="right",
|
|
name="Right output server",
|
|
x=half_width,
|
|
y=0,
|
|
width=self.wall_width - half_width,
|
|
height=self.wall_height,
|
|
wall_width=self.wall_width,
|
|
wall_height=self.wall_height,
|
|
desktop_width=7680,
|
|
desktop_height=4320,
|
|
physical_outputs=self._default_outputs("right"),
|
|
),
|
|
]
|
|
|
|
@staticmethod
|
|
def _default_outputs(prefix: str) -> list[PhysicalOutput]:
|
|
return [
|
|
PhysicalOutput(id=f"{prefix}-1", index=1, x=0, y=0),
|
|
PhysicalOutput(id=f"{prefix}-2", index=2, x=3840, y=0),
|
|
PhysicalOutput(id=f"{prefix}-3", index=3, x=0, y=2160),
|
|
PhysicalOutput(id=f"{prefix}-4", index=4, x=3840, y=2160),
|
|
]
|
|
|