Refresh e-ink: multi-régions + full toutes les 2h (basé temps)

Le full refresh apparaissait trop souvent: getbbox() renvoyait un seul
rectangle englobant tous les pixels modifiés, donc météo (haut) + heure de
MaJ (ailleurs) qui changeaient au même cycle produisaient un rectangle
quasi plein écran -> ratio > partial_max_ratio -> full forcé.

- frame.py: détection des bandes horizontales modifiées disjointes
  (_changed_regions), refresh partiel serré par zone. Full basé sur le
  temps écoulé (last_full_at + time.monotonic) au lieu d'un compteur de
  cycles. État pngs/regions en liste, get_png(client, region).
- config.py: full_refresh_interval_minutes (MONITORINK_FULL_INTERVAL_MIN,
  défaut 120). Suppression de partial_max_ratio.
- app.py: /frame.meta renvoie un bloc multi-ligne "MODE SEQ N" + N régions
  "i x y w h"; /frame.png?region=i.
- monitorinkloop.sh: display_meta parse le bloc et fait N fbink partiels.
This commit is contained in:
jerem
2026-06-16 14:06:49 +02:00
parent d7f52210e7
commit ca4febbc44
6 changed files with 140 additions and 83 deletions

View File

@@ -16,8 +16,8 @@ cd "$BASE" || exit 1
# --- Configuration ---
export MONITORINK_URL="http://192.168.0.43:8899/image.png"
export MONITORINK_REFRESH=900 # PROD: refresh partiel 15 min (moins de réveils = batterie)
# Cadence du full refresh : côté SERVEUR via MONITORINK_FULL_EVERY. À 15 min/cycle, FULL_EVERY=4
# -> full refresh ~1 h (ajuster côté backend si besoin pour limiter le ghosting).
# Cadence du full refresh : côté SERVEUR via MONITORINK_FULL_INTERVAL_MIN (défaut 120 = 2 h),
# indépendante du cycle. Entre deux fulls, seuls les blocs modifiés sont rafraîchis (partiel).
echo "===== monitorink start $(date) =====" >> "$LOG"; sync

View File

@@ -97,20 +97,38 @@ offline() {
"$FBINK" -pmh "Monitorink hors ligne ($(date '+%H:%M'))"
}
show_frame() {
# Récupère le crop/full image stocké côté serveur et l'affiche selon le mode.
# $1=mode $2=x $3=y
if ! http_get "$FRAME_URL?client=$CLIENT" "$TMP"; then
log "frame.png KO (mode=$1)"
[ "$1" = "full" ] && offline
return 1
fi
log "frame.png OK ($(wc -c < "$TMP" 2>/dev/null) octets)"
if [ "$1" = "partial" ]; then
display_partial "$2" "$3"
else
display_full
fetch_region() {
# Récupère le PNG de la région $1 stocké côté serveur dans $TMP. 0 = OK.
if http_get "$FRAME_URL?client=$CLIENT&region=$1" "$TMP"; then
log "frame.png OK region=$1 ($(wc -c < "$TMP" 2>/dev/null) octets)"
return 0
fi
log "frame.png KO region=$1"
return 1
}
display_meta() {
# Parse le bloc meta multi-ligne et affiche selon le mode :
# MODE SEQ N
# i x y w h (N lignes ; i = index région pour /frame.png?region=i)
# Lecture ligne-à-ligne : read consomme l'en-tête, le while lit les régions restantes (même
# stdin). Le sous-shell de pipe convient : chaque région est fetch + affichée sur place.
printf '%s\n' "$1" | {
read mode seq n
log "meta: mode=$mode seq=$seq regions=$n"
case "$mode" in
noop) log "aucun changement -> pas de refresh" ;;
partial)
while read idx x y w h; do
[ -n "$idx" ] || continue
fetch_region "$idx" && display_partial "$x" "$y"
done
;;
*) # full ou valeur inattendue -> full refresh sûr (région 0 = image pleine)
if fetch_region 0; then display_full; else offline; fi
;;
esac
}
}
frontlight_off() {
@@ -213,15 +231,7 @@ while true; do
fi
if [ -n "$meta" ]; then
# shellcheck disable=SC2086
set -- $meta # MODE X Y W H SEQ
mode="$1"; mx="$2"; my="$3"
log "meta: mode=$mode x=$mx y=$my w=$4 h=$5 seq=$6"
case "$mode" in
noop) log "aucun changement -> pas de refresh" ;;
partial) show_frame partial "$mx" "$my" ;;
*) show_frame full ;; # full ou valeur inattendue -> full refresh sûr
esac
display_meta "$meta"
FIRST=0 # meta obtenue : le reset n'a plus lieu d'être pour les cycles suivants
else
log "meta ECHEC"