#!/bin/bash
# Galaxy Watch resource stats over adb. Usage: watchstat.sh [-w]  (-w = watch mode, refresh 5s)
export PATH="$HOME/Library/Android/sdk/platform-tools:$PATH"
SERIAL="${WATCH_SERIAL:?set WATCH_SERIAL to your watch adb serial (see adb devices)}"

stat() {
  adb -s "$SERIAL" shell '
    read -r _ total _ < /proc/meminfo
    avail=$(awk "/MemAvailable/{print \$2}" /proc/meminfo)
    free=$(awk "/MemFree/{print \$2}" /proc/meminfo)
    load=$(cut -d" " -f1-3 /proc/loadavg)
    df -h /data | tail -1 | awk "{print \$2\" total, \"\$4\" free (\"\$5\" used)\"}" > /tmp/.ws_df
    bat=$(dumpsys battery | awk "/level:/{print \$2}")
    procs=$(ps -A | wc -l)
    sw_t=$(awk "/SwapTotal/{print \$2}" /proc/meminfo)
    sw_f=$(awk "/SwapFree/{print \$2}" /proc/meminfo)
    echo "MEM|$total|$avail|$free"
    echo "SWAP|$sw_t|$sw_f"
    echo "LOAD|$load"
    echo "DISK|$(cat /tmp/.ws_df)"
    echo "BAT|$bat"
    echo "PROC|$procs"
  ' 2>/dev/null | tr -d '\r'
}

render() {
  local out; out=$(stat)
  [ -z "$out" ] && { echo "watch not reachable ($SERIAL)"; return 1; }
  local total avail free
  IFS='|' read -r _ total avail free <<< "$(grep '^MEM' <<< "$out")"
  printf 'RAM    %4d MB free / %4d MB available / %4d MB total  (%d%% available)\n' \
    $((free/1024)) $((avail/1024)) $((total/1024)) $((avail*100/total))
  local swt swf
  IFS='|' read -r _ swt swf <<< "$(grep '^SWAP' <<< "$out")"
  if [ "${swt:-0}" -gt 0 ]; then
    printf 'SWAP   %4d MB used / %4d MB total  (%d%%)' \
      $(((swt-swf)/1024)) $((swt/1024)) $(((swt-swf)*100/swt))
    [ $(((swt-swf)*100/swt)) -ge 30 ] && printf '   <-- memory pressure'
    printf '\n'
  fi
  printf 'LOAD   %s   (1m / 5m / 15m)  [load counts swap-wait, not just CPU]\n' "$(grep '^LOAD' <<< "$out" | cut -d'|' -f2)"
  printf 'DISK   %s\n' "$(grep '^DISK' <<< "$out" | cut -d'|' -f2)"
  printf 'BATT   %s%%\n' "$(grep '^BAT' <<< "$out" | cut -d'|' -f2)"
  printf 'PROCS  %s\n' "$(grep '^PROC' <<< "$out" | cut -d'|' -f2)"
}

if [ "$1" = "-w" ]; then
  while true; do clear; date '+%H:%M:%S'; echo; render; sleep 5; done
else
  render
fi
