This commit is contained in:
david rice
2026-04-21 15:38:17 +01:00
parent ca0faf79d8
commit 54103e7b66
3 changed files with 18 additions and 8 deletions

View File

@@ -10,6 +10,7 @@ Add addresses to REGISTER_COMMANDS to capture more register ranges.
import os import os
import re import re
import signal
import subprocess import subprocess
import threading import threading
@@ -20,7 +21,7 @@ app = Flask(__name__)
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# Video playback state (managed as a subprocess) # Video playback state (managed as a subprocess)
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
KIOSK_SCRIPT = "/root/python/display_test_nexio.py" KIOSK_SCRIPT = "/root/display_test_nexio.py"
_video_proc: subprocess.Popen | None = None _video_proc: subprocess.Popen | None = None
_video_lock = threading.Lock() _video_lock = threading.Lock()
@@ -88,14 +89,19 @@ def _parse_memtool_output(raw: str) -> list:
@app.route("/display", methods=["PUT"]) @app.route("/display", methods=["PUT"])
def control_display(): def control_display():
data = request.get_json() data = request.get_json(force=True) or {}
state = data.get("state", "").lower() state = data.get("state", "").lower()
if state == "off": if state == "on":
os.system("echo 4 > /sys/class/graphics/fb0/blank") with _video_lock:
return jsonify({"status": "Display OFF"}), 200 if _video_proc is not None and _video_proc.poll() is None:
elif state == "on": _video_proc.send_signal(signal.SIGUSR1)
return jsonify({"status": "video switched"}), 200
# fallback when video is not running
os.system("echo 0 > /sys/class/graphics/fb0/blank") os.system("echo 0 > /sys/class/graphics/fb0/blank")
return jsonify({"status": "Display ON"}), 200 return jsonify({"status": "Display ON"}), 200
elif state == "off":
# nothing to do while video is managing the display
return jsonify({"status": "ok"}), 200
else: else:
return jsonify({"error": "Invalid state. Use 'on' or 'off'"}), 400 return jsonify({"error": "Invalid state. Use 'on' or 'off'"}), 400
@@ -205,8 +211,8 @@ def control_video():
return jsonify({"status": "already_running", "pid": _video_proc.pid}), 200 return jsonify({"status": "already_running", "pid": _video_proc.pid}), 200
_video_proc = subprocess.Popen( _video_proc = subprocess.Popen(
["python3", KIOSK_SCRIPT], ["python3", KIOSK_SCRIPT],
stdout=subprocess.DEVNULL, stdout=open("/tmp/kiosk.log", "w"),
stderr=subprocess.DEVNULL, stderr=subprocess.STDOUT,
) )
return jsonify({"status": "started", "pid": _video_proc.pid}), 200 return jsonify({"status": "started", "pid": _video_proc.pid}), 200

View File

@@ -1,4 +1,5 @@
import gi import gi
import signal
import struct import struct
import os import os
@@ -129,6 +130,9 @@ def play_kiosk():
manager = KioskManager(pipeline) manager = KioskManager(pipeline)
pipeline.set_property("uri", manager.videos[0]) pipeline.set_property("uri", manager.videos[0])
# SIGUSR1 → switch video (used by device_server PUT /display {"state":"on"})
signal.signal(signal.SIGUSR1, lambda sig, frame: manager.switch_video())
# --- INPUT MONITORING --- # --- INPUT MONITORING ---
try: try:
btn_fd = open("/dev/input/event1", "rb") btn_fd = open("/dev/input/event1", "rb")