Cause racine de l'autonomie médiocre : la liseuse ne suspendait JAMAIS.
Juste après un refresh e-ink, le pilote EPDC (20f4000.epdc) refuse de
suspendre tant que la haute tension VEE n'est pas redescendue
("waiting for VEE stable ... please retry suspend later", error -2) :
le noyau avorte tout le suspend, on tombait dans le repli `sleep` et le
CPU tournait 24h/24 (0 suspend réussi sur 261 itérations dans les logs).
Correctif (suspend_for) : on laisse l'EPDC décharger VEE (~8 s) puis on
RÉESSAIE le suspend jusqu'à ce qu'il prenne, comme le suggère le noyau.
Résultat : rtcwake elapsed ~= REFRESH (vrai sommeil entre les refresh),
duty cycle éveillé ~100% -> ~3%.
Aussi :
- intervalle 5 min -> 15 min (moins de réveils).
- suspend_diag() one-shot conservé comme filet (ne se déclenche qu'en
cas d'échec total après les retries) — à retirer après validation 24 h.
67 lines
3.1 KiB
Bash
Executable File
67 lines
3.1 KiB
Bash
Executable File
#!/bin/sh
|
|
# Monitorink — point d'entrée lancé par NickelMenu.
|
|
#
|
|
# Prend le contrôle complet de l'appareil en TUANT Nickel (sinon Nickel auto-suspend
|
|
# l'appareil et coupe le WiFi, en conflit avec notre boucle). On siphonne d'abord les
|
|
# variables d'environnement WiFi de Nickel (WIFI_MODULE/PLATFORM/INTERFACE) pour pouvoir
|
|
# gérer le WiFi nous-mêmes. À l'arrêt (entrée « Monitorink STOP »), on REBOOT pour
|
|
# restaurer Nickel et l'usage normal de la liseuse.
|
|
export LC_ALL="en_US.UTF-8"
|
|
export PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:$PATH"
|
|
|
|
BASE="/mnt/onboard/.adds/Monitorink"
|
|
LOG="$BASE/monitorink.log"
|
|
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).
|
|
|
|
echo "===== monitorink start $(date) =====" >> "$LOG"; sync
|
|
|
|
# --- Gouverneur CPU économe ---
|
|
CPUFREQ="/sys/devices/system/cpu/cpufreq/policy0"
|
|
[ -d "$CPUFREQ" ] || CPUFREQ="/sys/devices/system/cpu/cpu0/cpufreq"
|
|
if grep -q ondemand "$CPUFREQ/scaling_available_governors" 2>/dev/null; then
|
|
echo ondemand > "$CPUFREQ/scaling_governor" 2>/dev/null
|
|
fi
|
|
|
|
# --- Prendre le contrôle : siphonner l'env Nickel (WiFi) puis tuer Nickel ---
|
|
if pkill -0 nickel 2>/dev/null; then
|
|
NICKEL_PID="$(pidof -s nickel)"
|
|
if [ -n "$NICKEL_PID" ]; then
|
|
NENV=$(tr '\0' '\n' < "/proc/$NICKEL_PID/environ" 2>/dev/null \
|
|
| grep -E '^(WIFI_MODULE|INTERFACE|NICKEL_HOME|DBUS_SESSION_BUS_ADDRESS|LANG|PLATFORM|PRODUCT)=')
|
|
[ -n "$NENV" ] && export $NENV
|
|
fi
|
|
UDEV_PID="$(pidof -s udevd)"
|
|
if [ -n "$UDEV_PID" ]; then
|
|
[ -z "$PRODUCT" ] && { V=$(tr '\0' '\n' < "/proc/$UDEV_PID/environ" 2>/dev/null | grep -E '^PRODUCT='); [ -n "$V" ] && export $V; }
|
|
[ -z "$PLATFORM" ] && { V=$(tr '\0' '\n' < "/proc/$UDEV_PID/environ" 2>/dev/null | grep -E '^PLATFORM='); [ -n "$V" ] && export $V; }
|
|
fi
|
|
[ -z "$INTERFACE" ] && export INTERFACE="eth0"
|
|
echo "[monitorink] WIFI_MODULE=$WIFI_MODULE PLATFORM=$PLATFORM INTERFACE=$INTERFACE PRODUCT=$PRODUCT" >> "$LOG"; sync
|
|
|
|
sync
|
|
killall -q -TERM nickel hindenburg sickel fickel fontickel adobehost foxitpdf iink dhcpcd-dbus dhcpcd 2>/dev/null
|
|
t=0; while pkill -0 nickel 2>/dev/null; do [ "$t" -ge 16 ] && break; usleep 250000; t=$((t + 1)); done
|
|
rm -f /tmp/nickel-hardware-status
|
|
fi
|
|
[ -z "$INTERFACE" ] && export INTERFACE="eth0"
|
|
|
|
# Synchronise l'horloge RTC (sinon rtcwake calcule mal le réveil).
|
|
hwclock -w -u 2>/dev/null
|
|
|
|
# Watcher bouton power -> reboot logiciel (en arrière-plan, Nickel mort).
|
|
# Premier calage : préfixer par MONITORINK_PWR_DEBUG=1 pour logger device/format dans le log.
|
|
sh "$BASE/reboot_watcher.sh" &
|
|
|
|
# Boucle bloquante. À la sortie (STOP tue monitorinkloop.sh), on reboot pour restaurer Nickel.
|
|
sh "$BASE/monitorinkloop.sh" >> "$LOG" 2>&1
|
|
|
|
echo "===== monitorink stop $(date) — reboot =====" >> "$LOG"; sync
|
|
sleep 1
|
|
reboot
|