diff --git a/family/how-to/htpc-access.md b/family/how-to/htpc-access.md new file mode 100644 index 00000000..4c4ebc87 --- /dev/null +++ b/family/how-to/htpc-access.md @@ -0,0 +1,67 @@ +# HTPC — Доступ и управление + +## SSH +```bash +ssh -i ~/.ssh/id_rsa bazzite@192.168.1.86 +``` +Пароль sudo: `bazzite` + +## Go (на HTPC) +Go установлен в `/usr/local/go/bin/go` (не в PATH по умолчанию). +Сборка: `cd ~/magic4pc && /usr/local/go/bin/go build -o magic4pc_new .` + +## Git workflow (magic4pc) +- Mac: `~/Developer/magic4pc_altclient`, бранч `bazzite-linux` +- Remote `linux` → `ssh://bazzite@192.168.1.86/var/home/bazzite/magic4pc.git` (bare repo) +- Worktree на HTPC: `/home/bazzite/magic4pc` +- Remote `origin` → `https://github.com/mallexxx/magic4pc_altclient.git` + +Деплой: +```bash +# На Mac: +git push linux bazzite-linux + +# На HTPC: +cd ~/magic4pc && git pull && /usr/local/go/bin/go build -o magic4pc_new . +sudo systemctl stop magic4pc +sudo rm /usr/local/bin/magic4pc +sudo cp magic4pc_new /usr/local/bin/magic4pc +sudo systemctl start magic4pc +``` + +> ⚠️ Нельзя `cp` поверх работающего бинаря — "Text file busy". Всегда сначала `stop` → `rm` → `cp` → `start`. + +## systemd сервис +Файл: `/etc/systemd/system/magic4pc.service` +```ini +[Unit] +Description=Magic Remote client for LG TV +After=network.target + +[Service] +User=bazzite +Group=bazzite +ExecStart=/usr/local/bin/magic4pc-run.sh +Restart=always +RestartSec=5 +StartLimitIntervalSec=0 + +[Install] +WantedBy=multi-user.target +``` + +`StartLimitIntervalSec=0` — без лимита рестартов (иначе при crash-loop убивается). + +## Run script +`/usr/local/bin/magic4pc-run.sh` — ждёт X display, делает `xhost +local:`, запускает бинарь. + +## ydotoold +User-юнит: `~/.config/systemd/user/ydotoold.service` +Socket: `/run/user/1000/.ydotool_socket` +Управление: `systemctl --user status ydotoold` + +## Логи +```bash +journalctl -u magic4pc -n 50 --no-pager +journalctl -u magic4pc -f # live +``` diff --git a/family/how-to/htpc-gaming-plans.md b/family/how-to/htpc-gaming-plans.md new file mode 100644 index 00000000..22a6cfd3 --- /dev/null +++ b/family/how-to/htpc-gaming-plans.md @@ -0,0 +1,65 @@ +# HTPC — Планы: Игры и Эмуляторы + +## Статус системы +- [x] Bazzite установлен, автологин в Gaming Mode +- [x] 1080p@60Hz, аудио LPCM работает +- [x] LG Magic Remote работает (magic4pc) +- [x] Без пароля при входе +- [ ] EmuDeck +- [ ] Proton-GE +- [ ] MangoHud +- [ ] Эмуляторы + +## Следующие шаги + +### 1. EmuDeck +Установка через официальный скрипт: +```bash +# В KDE Desktop Mode (не gamescope): +curl -L https://raw.githubusercontent.com/dragoonDorise/EmuDeck/main/install.sh | bash +``` +Настроит RetroArch, PCSX2, Yuzu/Ryujinx и др. автоматически. +ROM-и класть в `~/Emulation/roms//` + +### 2. Proton-GE +Через ProtonUp-Qt (устанавливается из Discover или Flatpak): +```bash +flatpak install flathub net.davidotek.pupgui2 +``` +Или через EmuDeck — он включает ProtonUp-Qt. + +### 3. MangoHud (FPS overlay) +Уже есть в Bazzite. Включить для игры: +- В Steam: Properties → Launch Options: `mangohud %command%` +- Глобально: `MANGOHUD=1` в environment + +### 4. Эмуляторы (план) + +| Платформа | Эмулятор | Статус | +|-----------|----------|--------| +| NES | RetroArch (Nestopia) | Через EmuDeck | +| SNES | RetroArch (bsnes/Snes9x) | Через EmuDeck | +| Sega Mega Drive | RetroArch (Genesis Plus GX) | Через EmuDeck | +| PS2 | PCSX2 | Через EmuDeck | +| N64 | RetroArch (Mupen64Plus) | Через EmuDeck | +| Switch | Ryujinx (или Suyu) | Через EmuDeck | + +### 5. ROM-и +Скопировать в `~/Emulation/roms/` по папкам после установки EmuDeck. +EmuDeck сам создаст структуру директорий. + +### 6. Steam ROM Manager +Входит в EmuDeck — добавляет эмуляторные игры в Steam библиотеку с обложками. +После добавления они появятся в Gaming Mode как обычные Steam игры. + +## Железо — ограничения +- RX 570: Switch эмуляция может быть медленной (Vulkan поддерживается) +- i7-6800K (Broadwell-E): PS2 и Switch — проверить производительность +- 32GB RAM: достаточно для всего + +## Управление в эмуляторах +Magic Remote (magic4pc) работает как мышь + клавиатура. +Для эмуляторов нужен геймпад — варианты: +- Bluetooth геймпад (PS4/PS5/Xbox) +- USB геймпад +- Настроить маппинг Magic Remote кнопок на gamepad через Steam Input (если эмулятор в Steam) diff --git a/family/how-to/htpc-magic4pc.md b/family/how-to/htpc-magic4pc.md new file mode 100644 index 00000000..aaeab6db --- /dev/null +++ b/family/how-to/htpc-magic4pc.md @@ -0,0 +1,60 @@ +# magic4pc — LG Magic Remote для HTPC + +## Что это +Go-клиент для LG Magic Remote (webOS приложение на TV). +Форк: https://github.com/mallexxx/magic4pc_altclient (бранч `bazzite-linux`) +Оригинал: https://github.com/netham45/magic4pc_altclient + +## Архитектура +- **TV сервер**: webOS приложение на LG TV (192.168.1.75:42831), шлёт UDP +- **HTPC клиент**: `/usr/local/bin/magic4pc`, UDP-клиент на фиксированном source port **9106** +- **xdotool**: единый persistent процесс через stdin pipe — мышь и клавиши +- **ydotool**: для gamescope-специфичных команд (Ctrl+1, Ctrl+2) через `/run/user/1000/.ydotool_socket` + +## Ключевые фиксы (история) +| Проблема | Решение | +|----------|---------| +| TV "service error" / не реконнектится | Фиксированный source UDP port 9106 (`ListenUDP(":9106")`) | +| TV зависает в "waiting for client" | Server keepalive timeout 10s → auto-reconnect | +| KDE XTest диалог при каждом клике | Единый xdotool процесс (не новый на каждую кнопку) | +| KDE XTest диалог при рестарте xdotool | `XwaylandEisNoPrompt=true` в kwinrc | +| Кривые координаты мыши | Динамический scale через `xdotool getdisplaygeometry` | +| Крестик слал Ctrl/a/s/d | TV keycodes 37-40 → `Left/Up/Right/Down` keysym | +| Цифры слали мусор | ASCII keycodes → `string(rune(key))` | + +## Маппинг кнопок +| Кнопка | Keycode | Gaming Mode (gamescope) | KDE Desktop | +|--------|---------|------------------------|-------------| +| Красная | 403 | Ctrl+1 (Steam меню) | Super (Win) | +| Зелёная | 404 | Escape | Escape | +| Жёлтая | 405 | Ctrl+2 (Steam QAM) | Средняя кнопка мыши | +| Синяя | 406 | Правый клик | Правый клик | +| Back | 461 | Mouse X1 (back) | Mouse X1 (back) | +| Enter/OK | 13 | Return | Return | +| Ch Up | 33 | PageUp | PageUp | +| Ch Down | 34 | PageDown | PageDown | +| D-pad Left | 37 | Left | Left | +| D-pad Up | 38 | Up | Up | +| D-pad Right | 39 | Right | Right | +| D-pad Down | 40 | Down | Down | +| Play | 415 | XF86AudioPlay | XF86AudioPlay | +| Stop | 413 | XF86AudioStop | XF86AudioStop | +| Pause | 19 | XF86AudioPause | XF86AudioPause | +| Цифры 0-9 | 48-57 | 0-9 | 0-9 | +| GUIDE | 458 | Правый клик | Правый клик | +| Мышь (тач) | — | mousemove (scaled) | mousemove (scaled) | +| Тап | mousedown/up | Left click | Left click | +| Скролл | wheel | scroll 4/5 | scroll 4/5 | + +## Определение сессии +`isGamescopeSession()` — читает `/proc/*/cmdline`, ищет `kwin_wayland`. Если нет → gamescope. + +## Koordinаты мыши +TV шлёт координаты в пространстве 0–1920 × 0–1080. +При старте xdotool запрашивается `xdotool getdisplaygeometry` → вычисляется scale. +Работает корректно при любом разрешении экрана. + +## Проблемы которые могут вернуться +- **xdotool умирает** (write error) → KDE показывает XTest диалог. Разрешить и включить `XwaylandEisNoPrompt=true`. +- **TV "service error"** — если висит намертво, cold reboot TV (выдернуть из розетки). +- **Бинарь слетает** после `rpm-ostree upgrade` → пересобрать и скопировать. diff --git a/family/how-to/htpc-system.md b/family/how-to/htpc-system.md new file mode 100644 index 00000000..aced5a8f --- /dev/null +++ b/family/how-to/htpc-system.md @@ -0,0 +1,65 @@ +# HTPC — Система (Bazzite Linux) + +## Железо +- CPU: Intel Core i7-6800K +- RAM: 32 GB +- GPU: AMD Radeon RX 570 +- Подключение к TV: HDMI +- TV: LG webOS (192.168.1.75) +- HTPC IP: 192.168.1.86 + +## ОС +- **Bazzite 44** (Fedora-based, immutable OSTree) +- Вариант: `bazzite-deck` (Steam Gaming Mode / gamescope) +- Пользователь: `bazzite` +- Hostname: `htpc` + +## Режимы запуска +- **Gaming Mode (gamescope-session-steam)** — автологин по умолчанию, Steam Big Picture +- **KDE Desktop** — переключение из меню Steam → "Switch to Desktop" + +## Автологин +Файл: `/etc/gdm/custom.conf` +```ini +[daemon] +AutomaticLoginEnable=True +AutomaticLogin=bazzite +Session=gamescope-session-steam +``` + +## Переменные окружения +`/etc/environment`: +``` +GAMESCOPE_DISABLE_HDR=1 +``` + +`~/.config/environment.d/gamescope.conf`: +``` +GAMESCOPE_WIDTH=1920 +GAMESCOPE_HEIGHT=1080 +GAMESCOPE_REFRESH=60 +``` + +## Разрешение +- **1080p @ 60Hz** — рабочий режим +- 4K вызывает AMD HDA audio clock bug: пиксельный клок ~594 MHz → HDMI audio 880 Hz вместо 440 Hz + +## Аудио +TV поддерживает только LPCM 2ch, 32000/44100/48000/96000/192000 Hz, 16/20/24 bit. + +`~/.config/wireplumber/wireplumber.conf.d/fix-hdmi.conf` — S16LE, 48000 Hz, no suspend +`~/.config/pipewire/pipewire.conf.d/99-hdmi-fix.conf` — allowed-rates [44100, 48000] + +## OSTree / Обновления +- `/usr/local/bin` слетает при `rpm-ostree` upgrade (новый `/usr` overlay) +- Бинари держать в `/home/bazzite/` или пересобирать после обновлений +- Проверить после апдейта: `systemctl status magic4pc` + +## KDE Xwayland настройки +`~/.config/kwinrc`: +```ini +[Xwayland] +EavesdropMode=2 +XwaylandEisNoPrompt=true +``` +`XwaylandEisNoPrompt=true` — отключает диалог разрешения XTest (нужен для magic4pc/xdotool).