Reboot Kobo: 3 appuis bouton de page (evdev EV_KEY) au lieu du triple-tap tactile
L'ancien triple-tap via finger_trace dessinait des points noirs (outil de demo FBInk), ne respawnait pas (mort definitif si le process tombait) et le tactile ne reveille pas l'appareil. Le power, lui, n'emet que des scancodes MSC_SCAN parasites (etat de charge USB). Les boutons de page emettent des EV_KEY propres (codes 193/194). reboot_watcher.sh: lit l'evdev (FD persistant, pas de perte d'evenements), declenche sur 3 press EV_KEY < 3 s, boucle de respawn. Plus de finger_trace. Refresh: full force au (re)demarrage (reset=1 cote client -> oubli de prev_image cote serveur) pour eviter un refresh partiel pose sur un ecran efface par le reboot.
This commit is contained in:
@@ -48,12 +48,15 @@ async def image(fresh: int = 0, bat: int | None = None, chg: int = 0) -> Respons
|
||||
|
||||
|
||||
@app.get("/frame.meta", response_class=PlainTextResponse)
|
||||
async def frame_meta(client: str = "kobo", bat: int | None = None, chg: int = 0) -> Response:
|
||||
async def frame_meta(
|
||||
client: str = "kobo", bat: int | None = None, chg: int = 0, reset: int = 0
|
||||
) -> Response:
|
||||
# Refresh partiel : rend l'image, calcule la zone modifiée vs le dernier frame de ce client,
|
||||
# et renvoie une ligne "MODE X Y W H SEQ" triviale à parser en shell busybox.
|
||||
# MODE ∈ {full, partial, noop}. Le PNG correspondant est récupéré via /frame.png.
|
||||
# reset=1 (1er cycle après un (re)démarrage Kobo) -> oublie l'état et force un full refresh.
|
||||
kobo.record(bat, bool(chg))
|
||||
info = await frame.compute_frame(client)
|
||||
info = await frame.compute_frame(client, reset=bool(reset))
|
||||
line = f"{info['mode']} {info['x']} {info['y']} {info['w']} {info['h']} {info['seq']}"
|
||||
return PlainTextResponse(line, headers={"Cache-Control": "no-store"})
|
||||
|
||||
|
||||
@@ -42,11 +42,17 @@ def _changed_bbox(prev: Image.Image, cur: Image.Image) -> tuple[int, int, int, i
|
||||
return diff.getbbox()
|
||||
|
||||
|
||||
async def compute_frame(client: str) -> dict:
|
||||
async def compute_frame(client: str, reset: bool = False) -> dict:
|
||||
"""Rend le dashboard, calcule le diff vs l'image précédente du client, met à jour son état
|
||||
et renvoie {mode, x, y, w, h, seq}. Le PNG correspondant est stocké pour /frame.png."""
|
||||
et renvoie {mode, x, y, w, h, seq}. Le PNG correspondant est stocké pour /frame.png.
|
||||
|
||||
reset=True (envoyé par la Kobo au 1er cycle après un (re)démarrage) oublie l'image
|
||||
précédente : l'écran a été effacé par le reboot, un diff partiel se poserait sur une base
|
||||
erronée. On force alors un full refresh propre."""
|
||||
state = _clients.setdefault(client, _ClientState())
|
||||
async with state.lock:
|
||||
if reset:
|
||||
state.prev_image = None # -> force_full ci-dessous
|
||||
cur = await render.render_image()
|
||||
full_w, full_h = cur.size
|
||||
state.seq += 1
|
||||
|
||||
@@ -174,7 +174,7 @@
|
||||
</div>
|
||||
|
||||
<footer>
|
||||
<span>Monitorink · 3 taps = redémarrer</span>
|
||||
<span>Monitorink · 3 appuis bouton page = redémarrer</span>
|
||||
{% if kobo.ok %}<span class="{% if kobo.low %}stale{% endif %}">{% if kobo.charging %}⚡{% else %}🔋{% endif %} Kobo {{ kobo.percent }}%{% if kobo.stale %} · ?{% endif %}</span>{% endif %}
|
||||
<span class="{% if stale %}stale{% endif %}">maj {{ updated }}{% if stale %} · DONNÉE PÉRIMÉE{% endif %}</span>
|
||||
</footer>
|
||||
|
||||
Reference in New Issue
Block a user