from fastapi import FastAPI, Path, HTTPException, status from projectorpi.cli import ProjectorSerial, ExtronSerial from pydantic import BaseModel from requests import Response app = FastAPI() extron = ExtronSerial() projector = ProjectorSerial() class Response(BaseModel): status: str error: str | None = None @app.post("/sleep", response_model=Response) async def sleep() -> Response: extron.sleep() projector.power_off() return Response(status="ok") @app.post("/select/{input_id}", response_model=Response) async def select( input_id: int = Path(title="The input to select", ge=1, le=4), ) -> Response: if extron.check_sleep(): extron.wake() sleep(1) extron.change_input(input_id) if not projector.is_on(): projector.power_on() return Response(status="ok") @app.post("/control/{direction}", response_model=Response) async def control(direction: str) -> Response: match direction: case "vol_up": extron.volume_up() case "vol_down": extron.volume_down() case "up": extron.menu_up() case "right": extron.menu_right() case "down": extron.menu_down() case "left": extron.menu_left() case "enter": extron.menu_enter() case "menu": extron.menu_toggle() case _: raise HTTPException(status.HTTP_400_BAD_REQUEST, "invalid control") return Response(status="ok")