You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
117 lines
4.5 KiB
Python
117 lines
4.5 KiB
Python
from __future__ import annotations
|
|
|
|
import argparse
|
|
import json
|
|
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
|
|
|
|
|
|
def main() -> int:
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument("--port", type=int, default=8080)
|
|
args = parser.parse_args()
|
|
|
|
latest = {"count": 0, "last_payload": None, "accept_writes": True}
|
|
|
|
class Handler(BaseHTTPRequestHandler):
|
|
def log_message(self, format: str, *args2) -> None:
|
|
return
|
|
|
|
def do_GET(self) -> None:
|
|
if self.path == "/status":
|
|
raw = json.dumps(
|
|
{
|
|
"status": "ok",
|
|
"accept_writes": bool(latest["accept_writes"]),
|
|
"count": int(latest["count"]),
|
|
}
|
|
).encode("utf-8")
|
|
self.send_response(200)
|
|
self.send_header("Content-Type", "application/json")
|
|
self.send_header("Content-Length", str(len(raw)))
|
|
self.end_headers()
|
|
self.wfile.write(raw)
|
|
return
|
|
|
|
if self.path != "/latest":
|
|
self.send_response(404)
|
|
self.end_headers()
|
|
return
|
|
raw = json.dumps(latest).encode("utf-8")
|
|
self.send_response(200)
|
|
self.send_header("Content-Type", "application/json")
|
|
self.send_header("Content-Length", str(len(raw)))
|
|
self.end_headers()
|
|
self.wfile.write(raw)
|
|
|
|
def do_POST(self) -> None:
|
|
if self.path == "/control":
|
|
content_length = int(self.headers.get("Content-Length", "0"))
|
|
body = self.rfile.read(content_length) if content_length > 0 else b"{}"
|
|
try:
|
|
payload = json.loads(body.decode("utf-8"))
|
|
except json.JSONDecodeError:
|
|
payload = {}
|
|
accept_writes = payload.get("accept_writes")
|
|
if not isinstance(accept_writes, bool):
|
|
raw = json.dumps(
|
|
{"status": "error", "error": "field 'accept_writes' must be boolean"}
|
|
).encode("utf-8")
|
|
self.send_response(400)
|
|
self.send_header("Content-Type", "application/json")
|
|
self.send_header("Content-Length", str(len(raw)))
|
|
self.end_headers()
|
|
self.wfile.write(raw)
|
|
return
|
|
latest["accept_writes"] = accept_writes
|
|
raw = json.dumps(
|
|
{"status": "ok", "accept_writes": bool(latest["accept_writes"])}
|
|
).encode("utf-8")
|
|
self.send_response(200)
|
|
self.send_header("Content-Type", "application/json")
|
|
self.send_header("Content-Length", str(len(raw)))
|
|
self.end_headers()
|
|
self.wfile.write(raw)
|
|
return
|
|
|
|
if self.path != "/triangulation":
|
|
self.send_response(404)
|
|
self.end_headers()
|
|
return
|
|
|
|
if not bool(latest["accept_writes"]):
|
|
raw = json.dumps(
|
|
{"status": "error", "error": "output sink receive is paused"}
|
|
).encode("utf-8")
|
|
self.send_response(503)
|
|
self.send_header("Content-Type", "application/json")
|
|
self.send_header("Content-Length", str(len(raw)))
|
|
self.end_headers()
|
|
self.wfile.write(raw)
|
|
return
|
|
|
|
content_length = int(self.headers.get("Content-Length", "0"))
|
|
body = self.rfile.read(content_length) if content_length > 0 else b"{}"
|
|
payload = json.loads(body.decode("utf-8"))
|
|
x = payload.get("x")
|
|
y = payload.get("y")
|
|
z = payload.get("z")
|
|
latest["count"] = int(latest["count"]) + 1
|
|
latest["last_payload"] = payload
|
|
print(f"received payload, x={x}, y={y}, z={z}")
|
|
|
|
raw = json.dumps({"status": "ok"}).encode("utf-8")
|
|
self.send_response(200)
|
|
self.send_header("Content-Type", "application/json")
|
|
self.send_header("Content-Length", str(len(raw)))
|
|
self.end_headers()
|
|
self.wfile.write(raw)
|
|
|
|
server = ThreadingHTTPServer(("0.0.0.0", args.port), Handler)
|
|
print(f"mock_output_sink listening on :{args.port}")
|
|
server.serve_forever()
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main())
|