64 lines
1.5 KiB
Python
64 lines
1.5 KiB
Python
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")
|