Skip to content

Snapmaker U1

HelixScreen supports the Snapmaker U1 toolchanger as an alternative touchscreen UI. The U1 runs Klipper with Moonraker on a Rockchip ARM64 SoC, and HelixScreen can replace the stock display interface when deployed via SSH.

SpecValue
SoCRockchip RK3562 — quad Cortex-A53 @ 2GHz (aarch64)
GPUMali-G52 2EE (OpenGL ES 3.2)
RAM961MB
Display3.5” 480x320 32bpp capacitive touch, DRM/KMS (/dev/dri/card0, rockchipdrmfb)
Touch ControllerTLSC6x capacitive (tlsc6x_touch on /dev/input/event0)
Storage28GB eMMC (/userdata ext4 persistent, SquashFS rootfs read-only overlay)
RecoveryA/B firmware slots + Rockchip MaskRom (unbrickable)
FirmwareKlipper + Moonraker
OSDebian Trixie (ARM64)
DriversTMC2240 steppers
Filament4-channel RFID reader (FM175xx), OpenSpool NTAG215/216
CameraMIPI CSI + USB (Rockchip MPP/VPU)
Toolheads4 independent heads (SnapSwap system)
Max Speed500mm/s

The U1 is a 4-toolhead color printer. Each head has its own nozzle, extruder, heater, and filament sensor. Tool changes take approximately 5 seconds with no purging required.

The U1 does not use the standard viesturz/klipper-toolchanger module. Instead, it uses native multi-extruder with custom Klipper extensions. Extruders are named extruder, extruder1, extruder2, extruder3 with custom state fields (park_pin, active_pin, activating_move, state). HelixScreen has a dedicated AmsBackendSnapmaker that tracks tool state, RFID filament data, and supports tool switching via T0T3 gcodes.

HelixScreen needs exactly one thing from the firmware: SSH access (to deploy and to install its boot hook). Both stock and community firmware can provide it — HelixScreen does not require PAXX.

  • Stock Snapmaker firmware (1.2+) ships the dropbear SSH server. It is disabled by default and gated behind the printer’s root/developer-access mode: /etc/init.d/S50dropbear exits early unless custom_misc vertype reports dbg. Snapmaker added a user-facing Root access option in firmware V1.2.0; enabling it (or flashing debug mode via custom_misc gen-debug, which persists across upgrades) starts dropbear with the standard root / lava accounts, password snapmaker. That is the exact SSH path HelixScreen uses — stock firmware is supported.
  • PAXX Extended Firmware is repackaged stock firmware plus an overlay of patches. It removes the dropbear debug-mode gate (SSH on by default) and bundles extras HelixScreen does not use — Tailscale, OctoEverywhere, WebRTC camera, a /firmware-config/ web UI, RFID filament write-back, etc. It is the turnkey option if you’d rather not enable stock root access yourself, but it is not a HelixScreen requirement.
FirmwareSSHStatusBoot launcher HelixScreen hooks
Stock 1.2+dropbear, enabled via Root access / debug modeSupported (autostart newly added, see caveat)No display init script exists; HelixScreen hooks S99input-event-daemon (the only boot-glob launcher present on stock).
PAXX 1.2 / 1.3on by defaultTested/etc/init.d/S99screen (launches stock UI /usr/bin/gui).
PAXX 1.4on by defaultTested + hardware-validatedS99screen removed; HelixScreen hooks S99fb-http.

Stock-firmware caveat: deploy, SSH, WiFi-credential reuse, and display takeover (chmod -x /usr/bin/gui) all rely on the base rootfs, which is byte-identical between stock and PAXX — so they work on stock. The stock boot-time autostart (the S99input-event-daemon hook) is newly added and not yet verified on a stock device (development hardware runs PAXX). The hook is additive and idempotent, so it is a no-op on PAXX; see How HelixScreen takes over the display.

The only PAXX-specific endpoint HelixScreen ever calls is /printer/filament_detect/set (RFID write-back); on stock it returns 404 and HelixScreen degrades gracefully (filament edits persist in HelixScreen’s own store instead of mirroring back to firmware).

PAXX source: paxx12-snapmaker-u1/SnapmakerU1-Extended-Firmware.

The U1 root filesystem is a read-only SquashFS with a writable OverlayFS upper on /oem. /etc/init.d/S01aoverlayfs wipes that upper on every boot unless /oem/.debug exists, so the installer touches /oem/.debug to make its changes persist. (This overlay/.debug mechanism is byte-identical across firmware 1.2/1.3/1.4.)

To own the display and auto-start at boot, the installer:

  1. Hooks a boot-time launcher — installs a HelixScreen delegate into whichever boot-glob init scripts ship in the firmware’s read-only SquashFS, each preserved as *.stock for the helix-not-installed fallback and for uninstall:
    • PAXX 1.2 / 1.3/etc/init.d/S99screen (the stock display launcher); delegate is helix-instead-of-stock-UI.
    • PAXX 1.4/etc/init.d/S99fb-http (S99screen was removed); delegate is helix-instead-of-stock-UI.
    • Stock firmware/etc/init.d/S99input-event-daemon. Stock ships no display launcher in /etc/init.d (the stock UI is started by a supervisor binary), so there is nothing UI-shaped to hook. S99input-event-daemon is the one squashfs-resident, late-running script present on stock; the delegate preserves its function (runs the saved .stock to keep input-event-daemon going) and then starts HelixScreen. Because helixscreen.init start is idempotent, this same hook is harmless on PAXX (where an earlier launcher already started HelixScreen).
  2. Disables the stock UI binary itself with chmod -x /usr/bin/gui (launcher-independent belt-and-suspenders so nothing can re-grab the framebuffer/DRM, regardless of which launcher or supervisor starts it). The uninstaller restores the exec bit.

Both changes live in the persistent overlay upper and survive reboot via /oem/.debug. A firmware upgrade re-flashes the rootfs and removes /oem/.debug, so HelixScreen must be reinstalled after any firmware update (stock or PAXX).

CRITICAL — the boot-glob trap that dictates which script we hook. busybox init runs /etc/init.d/rcS from the read-only SquashFS and expands its for i in /etc/init.d/S??* boot loop once, before S01aoverlayfs does its pivot_root onto the .debug overlay. So the list of script names is frozen from the SquashFS; a script created only in the overlay upper (not present in the SquashFS) is not in that frozen glob → it never runs at boot (only at shutdown, via rcK, once the overlay is active — a boot/shutdown asymmetry). This is why an installer-created /etc/init.d/S99screen does not autostart on PAXX 1.4 or stock (neither ships S99screen in its SquashFS). The fix is to delegate from a script that does ship in the SquashFS and runs after S01aoverlayfs (so rcS executes its overlay copy, post-pivot): S99fb-http on PAXX 1.4, S99input-event-daemon on stock. Each hook is conditional ([ -f ]) and idempotent, so installing all of them is safe across every firmware variant.

The U1 target uses the same aarch64 cross-compiler as the Raspberry Pi, with fully static linking to avoid glibc version dependencies.

Terminal window
# Build the Docker toolchain (first time only — cached after)
make snapmaker-u1-docker

The Docker image (docker/Dockerfile.snapmaker-u1) is based on Debian Trixie with crossbuild-essential-arm64. It uses Debian’s aarch64-linux-gnu toolchain with static linking for a self-contained binary.

Terminal window
make PLATFORM_TARGET=snapmaker-u1 -j
SettingValue
Architectureaarch64 (ARMv8-A)
Toolchainaarch64-linux-gnu-gcc (Debian cross)
LinkingHybrid (static libstdc++/libgcc, dynamic libc/libdrm)
Display backendDRM/KMS (/dev/dri/card0, double-buffered page flipping)
Inputevdev (auto-detected)
SSLEnabled
Optimization-Os (size-optimized)
Platform defineHELIX_PLATFORM_SNAPMAKER_U1

The snapmaker-u1 target is included in release-all, package-all, and the GitHub Actions release workflow. Binaries are built on every tagged release.

Manual packaging is also available:

Terminal window
make package-snapmaker-u1
  1. Snapmaker U1 on the network (Ethernet or WiFi)
  2. SSH access — via either firmware path:
    • Stock firmware (1.2+): enable the printer’s Root access option (added in V1.2.0), or flash persistent debug mode (custom_misc gen-debug). This starts dropbear.
    • PAXX Extended Firmware: SSH is on by default. Download from paxx12-snapmaker-u1/SnapmakerU1-Extended-Firmware, flash via USB (FAT32, .bin in root). To toggle SSH explicitly: curl -X POST http://<printer-ip>/firmware-config/api/settings/ssh/true.
  3. SSH access verified — connect as root (works on both):
    Terminal window
    ssh root@<printer-ip> # password: snapmaker

For end users with Extended Firmware already installed, the easiest path is the hosted installer:

Terminal window
# Install on U1 (requires extended firmware and SSH access)
curl -sSL https://releases.helixscreen.org/install.sh | sh

The installer auto-detects the U1 platform, downloads the correct aarch64 binary from the release CDN, deploys platform hooks, and starts HelixScreen. Re-run to upgrade.

Terminal window
# Build the Docker toolchain and cross-compile (first time builds the toolchain image)
make snapmaker-u1-docker

Output: build/snapmaker-u1/bin/helix-screen (~13MB stripped aarch64 binary)

Terminal window
# Full deploy (binary + assets + platform hooks) — stops stock UI, starts HelixScreen
make deploy-snapmaker-u1 SNAPMAKER_U1_HOST=<printer-ip>
# Deploy and run in foreground with debug logging (recommended for first run)
make deploy-snapmaker-u1-fg SNAPMAKER_U1_HOST=<printer-ip>
# Deploy binary only (fast iteration during development)
make deploy-snapmaker-u1-bin SNAPMAKER_U1_HOST=<printer-ip>
# SSH into the printer
make snapmaker-u1-ssh SNAPMAKER_U1_HOST=<printer-ip>

Default SSH user is root (override with SNAPMAKER_U1_USER). Default deploy directory is /userdata/helixscreen (override with SNAPMAKER_U1_DEPLOY_DIR).

The deploy target automatically:

  • Copies the binary, assets, and platform hooks to /userdata/helixscreen/
  • Deploys the init script (helixscreen.init) and DRM keepalive hooks
  • Starts HelixScreen via the init script (which sources the hooks)
  1. DRM keepalive: a background process opens /dev/dri/card0 to prevent CRTC teardown
  2. The stock UI process (gui) is killed, and the installer disables its binary (chmod -x /usr/bin/gui) so no launcher can relaunch it. lmd (the camera/timelapse supervisor) is left running — killing it would break timelapse.
  3. HelixScreen starts as DRM master with double-buffered page flipping
  4. The DRM keepalive process exits once HelixScreen has the DRM device open
  5. The first-run wizard appears (language selection, printer connection setup)

To restore the stock Snapmaker touchscreen UI, run the uninstaller — it re-enables the stock UI binary (/usr/bin/gui) and restores the stock S99screen launcher (firmware 1.3) or removes the HelixScreen-created one (firmware 1.4):

Terminal window
ssh root@<printer-ip> "curl -sSL https://raw.githubusercontent.com/prestonbrown/helixscreen/main/scripts/install.sh | sh -s -- --uninstall; reboot"

A bare rm -rf /userdata/helixscreen is no longer sufficient. The installer disables the stock UI binary (chmod -x /usr/bin/gui) so neither firmware’s launcher can start it; removing HelixScreen without re-enabling the binary leaves a black screen. If you can’t run the uninstaller, revert manually:

Terminal window
ssh root@<printer-ip> "killall helix-screen helix-watchdog 2>/dev/null; chmod +x /usr/bin/gui; rm -rf /userdata/helixscreen; reboot"

The stock UI binary lives on the read-only SquashFS rootfs and is only disabled, never deleted — it cannot be damaged by HelixScreen deployment.

HelixScreen can be deployed to the U1 without modifying the read-only base firmware — all changes live in the writable overlay and are fully reversible.

Level 1: Manual SSH Deployment (Current, Fully Reversible)

Section titled “Level 1: Manual SSH Deployment (Current, Fully Reversible)”

This is the current deployment method used by make deploy-snapmaker-u1:

  1. Install PAXX Extended Firmware for SSH access
  2. Enable SSH via firmware config web UI
  3. Deploy via make deploy-snapmaker-u1 SNAPMAKER_U1_HOST=<ip>
  4. The installer disables the stock UI binary (chmod -x /usr/bin/gui) and installs a HelixScreen launcher at /etc/init.d/S99screen (in the writable overlay); HelixScreen starts on /dev/fb0. lmd (camera/timelapse supervisor) keeps running.

To revert: run the uninstaller (re-enables /usr/bin/gui and restores the launcher), or manually chmod +x /usr/bin/gui && rm -rf /userdata/helixscreen, then reboot. The stock UI binary is on the read-only SquashFS rootfs and is only disabled, never deleted — but note that the init-script changes and the binary’s exec bit are modified (in the reversible overlay), so a plain reboot alone will not bring the stock UI back.

Level 2: SysV Init Override (Persistent, Reversible)

Section titled “Level 2: SysV Init Override (Persistent, Reversible)”

The U1 uses SysV init (not systemd). A persistent override would:

  1. Create a HelixScreen init script in /etc/init.d/ (writable overlay)
  2. Optionally chmod -x the stock S99screen script (reversible since overlay)
  3. HelixScreen starts on boot; stock UI stays dormant

To revert: Remove the init script override and reboot. Stock UI resumes from the read-only base.

Level 3: Extended Firmware Overlay (Cleanest, Reversible)

Section titled “Level 3: Extended Firmware Overlay (Cleanest, Reversible)”

Package HelixScreen as an overlay in paxx12’s Extended Firmware build system:

  1. Add a HelixScreen overlay that deploys the binary and init script
  2. Build a custom firmware .bin with the overlay included
  3. Flash via USB like any firmware update

To revert: Flash stock firmware (or Extended Firmware without the HelixScreen overlay) via USB. A/B firmware slots ensure the previous firmware is preserved.

RiskMitigation
Bricked deviceImpossible — Rockchip MaskRom mode provides hardware-level recovery
Lost stock UIStock UI lives on read-only SquashFS — cannot be accidentally deleted
Klipper/Moonraker disruptedHelixScreen only replaces the display UI; Klipper (S60klipper) and Moonraker (S61moonraker) are independent services
Can’t revertMultiple revert paths: reboot, kill process, remove override, reflash firmware
Firmware slot corruptionA/B slots — switch with updateEngine --misc=other --reboot

Display Backend — DRM/KMS with CRTC Keepalive

Section titled “Display Backend — DRM/KMS with CRTC Keepalive”

HelixScreen uses the DRM backend for double-buffered page flipping on /dev/dri/card0 (rockchipdrmfb). The 480x320 MCU panel runs on a DPI/RGB parallel interface via the Rockchip VOP2 display controller.

The CRTC keepalive problem: The stock UI (/usr/bin/gui) holds DRM master. When gui exits, the kernel’s VOP2 driver calls vop2_crtc_atomic_disable, permanently disabling the display until reboot. The MCU panel driver only creates modes during the initial boot sequence — once the CRTC is disabled, there’s no way to re-enable it.

The solution: The platform hooks (config/platform/hooks-snapmaker-u1.sh) spawn a background process that holds /dev/dri/card0 open before killing gui. This prevents the kernel from tearing down the CRTC when gui exits. HelixScreen then opens the DRM device itself and becomes DRM master. The keepalive process detects that HelixScreen has the device open and exits — but the CRTC stays active because HelixScreen now holds the fd.

Critical implementation notes:

  • The keepalive MUST be a background subshell ((exec 3>/dev/dri/card0; ...) &), not a shell fd (exec 7>). Shell fds die when the init script exits, but background processes survive.
  • The keepalive polls /proc/*/fd until it sees helix-screen with /dev/dri/card0 open, then exits.
  • HELIX_DRM_DEVICE=/dev/dri/card0 is set in platform_pre_start() to skip auto-detection.
  • No libinput is needed — touch input uses evdev directly.

Filesystem note: /opt/ is an overlay filesystem wiped on reboot. All persistent data lives on /userdata/ (ext4, 28GB). /home/lava/ is also part of the overlay and is NOT persistent.

Touch input is provided by a TLSC6x capacitive controller (tlsc6x_touch) on /dev/input/event0. HelixScreen auto-detects this device and uses multitouch (MT) axis ranges (0-480, 0-320). No touch calibration is required — the capacitive controller is factory-calibrated.

HelixScreen auto-detects the sysfs backlight device (/sys/class/backlight/backlight, max brightness 255) for sleep/wake control.

HelixScreen auto-detects the Snapmaker U1 using 17 heuristics from config/printer_database.json:

HeuristicConfidenceDescription
fm175xx_reader object99FM175xx RFID reader — definitive U1 signature
FILAMENT_DT_UPDATE macro95RFID filament detection macro (extended firmware)
FILAMENT_DT_QUERY macro95RFID filament query macro (extended firmware)
Hostname u190Hostname contains “u1”
Hostname snapmaker85Hostname contains “snapmaker”
tmc2240 object60TMC2240 stepper driver presence
CoreXY kinematics40CoreXY motion system
Cartesian kinematics20Cartesian motion system
(+9 additional heuristics)variousTool state, extruder naming, custom macros, motion parameters, etc.

No manual printer configuration is needed in most cases. The FM175xx RFID reader is the strongest signal — it is unique to the U1 and provides near-certain identification.

When the U1 is detected, the printer database record provides these metadata fields:

FieldValue
probe_typeeddy_current
toolhead_stylesnapmaker_u1
presetsnapmaker_u1
z_offset_calibration_strategyprobe_calibrate

The snapmaker_u1 preset causes the first-run wizard to auto-skip hardware steps that do not apply to the U1 (e.g., probe wiring, toolhead identification).

HelixScreen uses the snapmaker_u1 print start profile (config/print_start_profiles/snapmaker_u1.json) to track progress through the startup sequence. The profile uses weighted progress mode with these phases:

  1. Homing (10%)
  2. Bed heating (20%)
  3. Nozzle heating (20%)
  4. Z tilt adjust (15%)
  5. Bed mesh calibration (15%)
  6. Nozzle cleaning (10%)
  7. Purging (10%)

The progress bar updates as each phase completes, so you can see exactly where your printer is in its startup routine.

The U1’s 480x320 display uses the TINY layout preset. This is the smallest resolution HelixScreen supports, and several UI panels have known layout issues at this size. See the 480x320 UI Audit for a panel-by-panel breakdown. Key issues:

  • Navbar icons clipped at screen edges
  • Controls panel labels overlapping, z-offset value wrapping
  • Print select list view fundamentally broken at this size
  • Numeric keypad overlay too tall, bottom rows cut off
  • Filament panel cards pushed off-screen

These are resolution-specific issues, not Snapmaker-specific. Any 480x320 device benefits from the same fixes.

  • 480x320 UI needs work — Multiple panels have layout issues at this resolution (see above).
  • SSH access required — deployment needs SSH. Stock firmware (1.2+) provides it via the Root access option / debug mode; the community Extended Firmware enables it by default. Either works — PAXX is not required. (Stock boot-time autostart is newly added and pending verification on stock hardware; see Firmware Requirements.)
  • Auto-start requires /oem/.debug — The overlay filesystem is wiped on boot unless /oem/.debug exists. This flag must be created once during installation to persist the boot-launcher hook (see How HelixScreen takes over the display).
  • WiFi management — Stopping unisrv (stock UI) does not affect WiFi — the U1 uses standard wpa_supplicant managed by the OS. HelixScreen has its own WiFi manager with wpa_supplicant support.
  • Remote screen (“gui” webcam) not yet wired up — The firmware ships a screen-capture daemon (/usr/local/bin/fb-http.py, PNG snapshot on 127.0.0.1:8092, reads /dev/fb0 via mmap), an nginx /screen/ route (/etc/nginx/fluidd.d/remote-screen.conf), and a [webcam gui] Moonraker slot. Two gaps make it show “No Signal — maybe not enabled?”: (1) the daemon has no service unit and isn’t running, and (2) HelixScreen renders into its own DRM dumb buffer and never writes /dev/fb0, so even when the daemon runs it serves a stale boot-leftover frame. Note /dev/fb0 is not unreadable under DRM — it’s a separate, idle buffer decoupled from scanout (bench-confirmed: a magenta write to fb0 was served by the daemon while the panel kept showing HelixScreen untouched). See Future Work for the fix.
  • Two benign Moonraker warnings on buildroot — After install, Mainsail/Fluidd surface “Unable to find DBus PolKit Interface” (Moonraker’s always-loaded machine component on a no-PolKit OS) and “Unable to initialize System Update Provider for distribution: buildroot” (Moonraker’s update_manager initializes a system/OS package provider by default, which can’t detect apt/PackageKit on buildroot). The PolKit one is not ours — it’s inherent to Moonraker on buildroot and re-surfaces because our installer restarts Moonraker. The system-update one is triggered by us adding [update_manager helixscreen] (loading the component pulls in the default system provider); it can be silenced with a top-level [update_manager] / enable_system_updates: False, which doesn’t affect HelixScreen’s own one-click updater. Both are harmless. Same condition applies to K1/K2 (also buildroot).

Remote screen / “gui” webcam streaming

Section titled “Remote screen / “gui” webcam streaming”

Serve the HelixScreen UI as the [webcam gui] feed so it shows in Mainsail/Fluidd. Validated approach (bench-tested 2026-06-14): the “fb0 mailbox.” Don’t build an in-process server — reuse the firmware’s existing capture daemon (fb-http.py on :8092, nginx /screen/, [webcam gui] slot). The daemon mmaps and reads /dev/fb0, PNG-encodes on demand (md5/ETag-cached, so a static screen is nearly free), and does its own work on the device’s CPU — we add no server and no encoder.

Our only job is to keep /dev/fb0 current. fb0 is a separate buffer decoupled from our DRM scanout (proven: writing magenta to fb0 was served by the daemon while the panel stayed on HelixScreen). Implementation:

  1. Mirror frames into fb0. Open /dev/fb0 once, mmap MAP_SHARED|PROT_WRITE. In the existing flush hook (DisplayManager::install_color_transform_hook(), src/application/display_manager.cpp), copy rendered (dirty) regions into fb0 — BGRA, stride 1920 (480×320×4), throttled to a few fps to match the daemon’s poll rate. One main-thread memcpy, no encode. We write post-rotation pixels, so the remote view matches the panel automatically.
  2. Enable the daemon. It currently has no service unit and isn’t running. Ship a systemd unit (or installer step) that starts python3 /usr/local/bin/fb-http.py, and ensure the [webcam gui] Moonraker entry points at /screen/snapshot.

Caveats: occasional tearing if we write mid-poll (acceptable for a remote view, or double-buffer); throttle the mirror cadence to bound CPU. Bonus — remote control: fb-http.py also injects touch to /dev/input/event0 via its /touch endpoint, so this gets remote control nearly for free — pending a check that HelixScreen reads event0 (separate follow-up). PNG snapshot is poll-based, not a continuous MJPEG stream.

Package HelixScreen as an Extended Firmware overlay for one-click installation via paxx12’s build system.

The AmsBackendSnapmaker backend parses RFID data from filament_detect.info when the RFID reader is enabled. With the RFID reader disabled (default on Extended Firmware via disable-rfid-reader.cfg), all RFID fields return "NONE" and print_task_config is the authoritative filament data source.

The U1 supports an extruder_map_table with 32 virtual slots mapped to 4 physical extruders. This could enable more advanced filament management workflows.

The U1’s Klipper exposes several custom objects. AmsBackendSnapmaker subscribes to and parses these during the Moonraker subscription phase.

Section titled “print_task_config — Authoritative filament data (HANDLED)”

The primary source for filament info. Populated by the stock firmware’s task manager regardless of RFID reader state.

FieldExampleHandledNotes
filament_type["PLA","PLA","PLA","PLA"]Material per slot
filament_sub_type["SnapSpeed",...]Appended to type (e.g., “PLA SnapSpeed”)
filament_vendor["Snapmaker",...]Brand per slot
filament_color_rgba["080A0DFF",...]RGBA hex → RGB uint32
filament_exist[true,true,true,true]Slot presence
filament_color[4278716941,...]Redundant with _rgba, not parsed
filament_official[true,...]Could show official/third-party badge
filament_sku[900001,...]Snapmaker product SKU
filament_soft[false,...]Soft filament flag (TPU etc.)
filament_edit[false,...]Whether user has edited filament info
extruder_map_table[0,1,2,3,0,...(x32)]Virtual→physical slot mapping for multi-material
extruders_used[false,...]Which extruders are used in current print
extruders_replenished[0,1,2,3]Auto-replenish mapping
auto_replenish_filamenttrueAuto-replenish enabled
filament_entangle_detectfalseEntangle detection enabled
filament_entangle_sen"medium"Sensitivity level
flow_calibratefalseFlow calibration pre-print option
shaper_calibratefalseInput shaper calibration pre-print option
time_lapse_camerafalseTimelapse pre-print option
auto_bed_levelingfalseABL pre-print option

filament_detect — RFID tag data (HANDLED)

Section titled “filament_detect — RFID tag data (HANDLED)”

Per-channel RFID tag reads. All fields return "NONE"/0 when the RFID reader is disabled.

FieldExampleHandledNotes
state[1,1,1,1]1=filament present, 0=empty
info[].MAIN_TYPE"NONE" or "PLA"Skipped when "NONE"
info[].SUB_TYPE"NONE" or "Silk"Skipped when "NONE"
info[].MANUFACTURER"NONE" or "Snapmaker"
info[].VENDOR"NONE"Fallback for brand
info[].ARGB_COLOR4294967295ARGB → RGB mask
info[].HOTEND_MIN/MAX_TEMP0
info[].BED_TEMP0
info[].WEIGHT0
info[].DIAMETER0Filament diameter (1.75mm)
info[].LENGTH0Spool length
info[].DRYING_TEMP/TIME0Recommended drying params
info[].OFFICIALfalseOfficial Snapmaker filament
info[].CARD_UID0RFID tag unique ID
info[].SKU0Product SKU
config.startup_stayfalseUnknown purpose

filament_feed left / filament_feed right — Feed module state (HANDLED)

Section titled “filament_feed left / filament_feed right — Feed module state (HANDLED)”

Per-extruder filament feed state. Left module serves extruder0/1, right serves extruder2/3.

FieldExampleHandledNotes
extruderN.filament_detectedtrueFilament presence
extruderN.channel_state"load_finish"Load/unload progress
extruderN.channel_error"ok"Error detection
extruderN.channel_error_state"none"Error sub-state
extruderN.channel_action_state"load_finish"Redundant with channel_state
extruderN.module_existtrueFeed module physically present
extruderN.disable_autofalseAuto-feed disabled

Known channel_state values: "idle", "preloading", "loading", "load_finish", "unloading"

machine_state_manager — Machine state (NOT HANDLED)

Section titled “machine_state_manager — Machine state (NOT HANDLED)”
FieldExampleHandledNotes
main_state0Top-level machine state (0=idle)
action_code0Current action code

Likely redundant with print_stats.state for most purposes.

defect_detection — Print defect detection (NOT SUBSCRIBED)

Section titled “defect_detection — Print defect detection (NOT SUBSCRIBED)”

AI-based print defect detection system. Not subscribed because it’s not directly relevant to AMS/filament management.

FieldExampleNotes
main_enabletrueMaster enable
clean_bed.enabletrueDirty bed detection
noodle.enabletrueSpaghetti/noodle detection
residue.enablefalseResidue detection
nozzle.enablefalseNozzle clog detection

purifier — Air purifier (NOT SUBSCRIBED)

Section titled “purifier — Air purifier (NOT SUBSCRIBED)”

Built-in HEPA/carbon air purifier. Not subscribed because we don’t have UI for it yet.

FieldExampleNotes
fan_speed0.0Purifier fan speed (0-1)
fan_rpm0.0Actual RPM
work_time0Total runtime (seconds)
power_detectedfalseExternal power connected
delay_time180Post-print run time (seconds)

filament_entangle_detect — Tangle detection (NOT SUBSCRIBED)

Section titled “filament_entangle_detect — Tangle detection (NOT SUBSCRIBED)”

Per-extruder filament tangle detection. Not subscribed.

FieldExampleNotes
detect_factor1.0Tangle confidence (0-1, lower=tangled)

HelixScreen has been tested on a Snapmaker U1 with Extended Firmware. Confirmed working:

  • DRM display at 480x320 via rockchipdrmfb with double-buffered page flipping
  • DRM CRTC keepalive works — gui killed cleanly, no SIGSTOP hack needed
  • Touch input via TLSC6x capacitive controller (no calibration needed)
  • Backlight control via sysfs
  • Stock UI stops and restarts cleanly via init script hooks
  • SSH session survives stopping gui (WiFi unaffected)
  • First-run wizard displays correctly at TINY breakpoint
  • Memory monitor reports 961MB total with appropriate thresholds
  • Persistent deployment on /userdata/ survives reboots

We welcome additional testers with Snapmaker U1 hardware — especially anyone running STOCK firmware (with Root access enabled), since stock boot-time autostart is implemented but not yet verified on a stock device:

  1. Enable SSH — stock firmware: turn on the Root access option in printer settings; or install the Extended Firmware (SSH on by default, then curl -X POST http://<ip>/firmware-config/api/settings/ssh/true if needed)
  2. Install via one-liner (easiest): curl -sSL https://releases.helixscreen.org/install.sh | sh
  3. Stock testers: after install, reboot and confirm HelixScreen comes back up on its own (this exercises the S99input-event-daemon boot hook) — please report success/failure.
    • Or build from source: make snapmaker-u1-docker then make deploy-snapmaker-u1-fg SNAPMAKER_U1_HOST=<ip>
  4. Report: Does the wizard appear? Does touch work? Can you connect to Moonraker? Do tool changes work?
  5. File issues at the HelixScreen GitHub repository