Updates
This commit is contained in:
Binary file not shown.
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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")
|
||||||
|
|||||||
Reference in New Issue
Block a user