mirror of
https://github.com/DeeJanuz/frametop.git
synced 2026-10-06 01:00:06 +02:00
frame-eyes, a separate project until now, becomes gaze/tracker:
- ft-eyegrab (was fe-bufprobe) copies the eye-camera frames, read-only, out of
SteamVR's eyetracking process. It runs as the system service
frametop-eyegrab.service, which gaze/tracker/install.sh installs to
/etc/frametop with sudo. It keeps only CAP_SYS_PTRACE, CAP_DAC_READ_SEARCH, and
CAP_CHOWN, and copies frames only while /dev/shm/frametop-eyes-want is fresh,
holding none of the tracker's buffers otherwise.
- ft-eyes (was fe-trackd) runs under ft-gazed in the dev container, with
build/venv's pinned numpy and OpenCV: while Eye tracker is Own tracker, or on
the probe's lease ("eyes SECONDS"). No sudo password or fe-live script at
run time any more.
- lab/ holds the research tools (ft-eyes-score, -e2e, -record, -replay,
-session) and findings.md. Recordings live outside the repo, in
~/.local/share/frametop/eyes/captures; .gitignore catches stray frame dumps.
Its socket is now @ft_eyes, its output /dev/shm/frametop-eyes-gaze, and its state
~/.local/state/frametop/gaze/eyes. On practice1 -> practice2 the whole live path
(ft-eyes-e2e) gives 1.30 deg median and 3.18 for the worst tenth, as before the
move (1.30, 3.21).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
59 lines
2.6 KiB
Bash
Executable File
59 lines
2.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Install (or remove) the frame grabber our own eye tracker needs: ft-eyegrab, as the system
|
|
# service frametop-eyegrab.service. It copies the eye-camera frames, read-only, out of
|
|
# SteamVR's eyetracking process into /dev/shm/frametop-eyes-cams for ft-eyes, and only while
|
|
# ft-eyes wants them. The gaze service (gaze/ft-gazed) runs ft-eyes itself, when Eye tracker
|
|
# is Own tracker or the gaze probe uses it.
|
|
# Needs host sudo, for the binary (/etc/frametop/ft-eyegrab, root's) and the unit. On the
|
|
# Frame, sudo asks for the password in the terminal, or runs SUDO_ASKPASS when that's set.
|
|
# From a PC (or with no terminal), the password comes from steamos_root_pwd in the repo's .env
|
|
# and is sent to sudo -S on stdin, never on a command line.
|
|
# Usage: gaze/tracker/install.sh [install|uninstall|status|log [lines]]
|
|
set -euo pipefail
|
|
|
|
root=$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)
|
|
. "$root/scripts/_env.sh"
|
|
src=$FRAME_REPO/gaze/tracker
|
|
unit=frametop-eyegrab.service
|
|
|
|
sudo_run() {
|
|
if [ "$FRAME_LOCAL" = 1 ] && [ -n "${SUDO_ASKPASS:-}" ]; then
|
|
sudo -A bash -c "$1" # SUDO_ASKPASS supplies the password
|
|
return
|
|
fi
|
|
if [ "$FRAME_LOCAL" = 1 ] && [ -t 0 ]; then
|
|
sudo bash -c "$1" # asks for the password here
|
|
return
|
|
fi
|
|
local pw
|
|
pw=$(sed -n 's/^steamos_root_pwd=//p' "$root/.env" 2>/dev/null)
|
|
pw=${pw#[\"\']}; pw=${pw%[\"\']} # .env values may be quoted
|
|
[ -n "$pw" ] || { echo "no terminal for sudo, and steamos_root_pwd is missing from $root/.env" >&2; exit 1; }
|
|
printf '%s\n' "$pw" | on_frame "sudo -S -p '' bash -c $(printf %q "$1")"
|
|
}
|
|
|
|
case ${1:-install} in
|
|
install)
|
|
"$root/gaze/tracker/build.sh"
|
|
ids=$(on_frame 'echo "$(id -u):$(id -g)"')
|
|
fill_template "$root/gaze/tracker/$unit" | sed "s|@UID@|${ids%:*}|g; s|@GID@|${ids#*:}|g" |
|
|
on_frame "cat > /tmp/$unit"
|
|
sudo_run "set -e
|
|
install -D -m 0755 -o root -g root $src/build/ft-eyegrab /etc/frametop/ft-eyegrab
|
|
install -D -m 0644 -o root -g root /tmp/$unit /etc/systemd/system/$unit
|
|
rm -f /tmp/$unit
|
|
systemctl daemon-reload
|
|
systemctl enable $unit
|
|
systemctl restart $unit
|
|
sleep 1
|
|
echo \"$unit: \$(systemctl is-active $unit)\""
|
|
;;
|
|
uninstall)
|
|
sudo_run "systemctl disable --now $unit 2>/dev/null
|
|
rm -f /etc/systemd/system/$unit /etc/frametop/ft-eyegrab
|
|
rmdir /etc/frametop 2>/dev/null; systemctl daemon-reload; echo removed" ;;
|
|
status) on_frame "systemctl is-active $unit; ls -l /dev/shm/frametop-eyes-cams 2>/dev/null" || true ;;
|
|
log) on_frame "journalctl -u $unit --no-pager -o cat -n ${2:-20}" ;;
|
|
*) echo "usage: $0 [install|uninstall|status|log [lines]]" >&2; exit 2 ;;
|
|
esac
|