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:
@@ -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®ion=$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"
|
||||
|
||||
Reference in New Issue
Block a user