{ config, pkgs, ... }: let inherit (pkgs) writeText klipperscreen; ksConfig = let inherit (config.services.moonraker) address port; in writeText "KlipperScreen.conf" '' [printer fourmi] moonraker_host: ${address} moonraker_port: ${toString port} ''; in { # avoid conflict between console and cage. console.enable = false; # without this the kiosk doesn't even want to get loaded :) systemd.defaultUnit = "graphical.target"; services.cage = { enable = true; program = "${klipperscreen}/bin/KlipperScreen -c ${ksConfig}"; extraArguments = [ "-d" ]; environment = { # don't fail with no devices found. "WLR_LIBINPUT_NO_DEVICES" = "1"; # render onto the SPI panel (see modules/hardware/ili9486.nix), not # the firmware/HDMI framebuffer. by-path is stable across boots, # unlike cardN numbering. "WLR_DRM_DEVICES" = "/dev/dri/by-path/platform-fe204000.spi-cs-0-card"; # the SPI panel has no GPU render node, so GLES cannot initialize; # software rendering into dumb buffers works fine at 480x320. "WLR_RENDERER" = "pixman"; }; user = "klipper"; }; # auto-restart cage. systemd.services."cage-tty1" = { startLimitBurst = 5; startLimitIntervalSec = 500; serviceConfig = { RestartSec = 5; Restart = "on-failure"; }; }; }