Skip to content

Rebort-a/printer_control

Repository files navigation

🖨️ Printer Control

Cross-platform 3D printer management & slicing app built with Flutter + Rust

Flutter Rust Platform i18n License

OverviewFeaturesArchitectureGetting StartedBuildStructure


Overview

Printer Control is an end-to-end 3D printing workflow app that covers the entire pipeline — from importing STL/3MF models, adjusting slicer parameters, generating G-code, to remotely controlling Klipper printers over LAN via the Moonraker protocol.

The core slicing engine is written in Rust for performance, called from Dart via FFI through background isolates, ensuring fast cross-platform slicing without ever blocking the UI thread.

Features

Feature Description
🔍 LAN Discovery Auto-scan local subnets for Moonraker printers with per-interface progress
🖨️ Multi-printer Management Connect and control multiple Klipper printers simultaneously
✂️ Built-in Slicer Import STL/3MF → configure parameters → slice → export G-code
📦 Batch Print Upload + start print on multiple printers in one action
📁 Model Library Manage local model and G-code files with quick slice/print shortcuts
📊 Real-time Monitoring Live temperature charts, print progress, and status via WebSocket
🎮 Printer Control XY/Z movement pad, extruder control, temperature presets, G-code console
🌐 Internationalization Full Chinese & English localization
🌙 Dark Mode System-following / light / dark theme

Architecture

┌───────────────────────────────────────────────────────┐
│                     UI Layer                           │
│    Screens · Widgets · Responsive Layout               │
├───────────────────────────────────────────────────────┤
│               State Layer (Provider)                   │
│    Connection · PrinterState · Slicer · BatchPrint     │
│    ModelLibrary · Settings                             │
├───────────────────────────────────────────────────────┤
│                 Service Layer                          │
│    MoonrakerService  — WebSocket JSON-RPC              │
│    SlicerService     — Rust FFI via Isolate            │
│    LanScanner        — Subnet-aware TCP scan           │
├───────────────────────────────────────────────────────┤
│                Native Layer (Rust)                     │
│    slicer_core — mesh parsing · slicing · G-code gen   │
└───────────────────────────────────────────────────────┘

Key design decisions:

  • Provider + ChangeNotifier with 50ms debounce on high-frequency state updates
  • Isolate-based FFI — all Rust calls run in background isolates, never blocking UI
  • Semaphore-controlled concurrency — LAN scan uses 50 concurrent TCP connections with exponential backoff retry
  • Moonraker WebSocket JSON-RPC 2.0 — real-time printer communication with auto-reconnect

Getting Started

Prerequisites

Install & Run

git clone https://github.com/Rebort-a/printer_control.git
cd printer_control
flutter pub get
flutter gen-l10n
flutter run

Build

Rust library compilation is integrated into each platform's build pipeline — no manual steps needed.

flutter build windows   # → slicer_core.dll
flutter build apk       # → libslicer_core.so (arm64-v8a)
flutter build web       # → web bundle (slicer disabled — no FFI on web)
Manual Rust build (optional)
cd slicer_core
cargo build --release
# Windows: target/release/slicer_core.dll
# Linux:   target/release/libslicer_core.so
# Android: cargo ndk -t arm64-v8a --release

Project Structure

lib/
├── main.dart                     # Entry + Provider init
├── app.dart                      # MaterialApp (theme, locale)
├── screens/
│   ├── main_shell.dart           # Responsive NavigationRail / Bar
│   ├── device_list_screen.dart   # Printer list, LAN discovery, batch print
│   ├── printer_detail_screen.dart  # Printer dashboard (tabs)
│   ├── model_library_screen.dart   # Model & G-code file management
│   ├── slicer_screen.dart        # Model loading, slice settings, export
│   └── settings_screen.dart      # Global settings
├── providers/                    # State management (ChangeNotifier)
├── service/
│   ├── moonraker_service.dart    # WebSocket JSON-RPC client
│   ├── slicer_service.dart       # Rust FFI bindings
│   ├── lan_scanner.dart          # Subnet-aware LAN scanner
│   └── debug_log.dart            # Debug-only logger
├── models/                       # Data models
├── widgets/                      # MovementPad, TempChart
└── l10n/                         # Localization (en + zh)

slicer_core/                      # Rust slicing engine
├── src/
│   ├── lib.rs                    # FFI exports
│   ├── mesh/                     # STL/3MF parsing, geometry
│   ├── slicer/                   # Layer generation, infill
│   └── gcode/                    # G-code writer
└── Cargo.toml

Tech Stack

Layer Technology
UI Flutter 3.x, Material 3
State Provider (ChangeNotifier)
Network web_socket_channel, http
Native Rust (slicer_core via dart:ffi)
Storage shared_preferences, file system
i18n flutter_gen_l10n (ARB)

Moonraker Protocol

Printer communication uses Moonraker's WebSocket JSON-RPC 2.0:

Operation Method
Connect ws://<ip>:<port>/websocket
Identify server.connection.identify
Subscribe printer.objects.subscribe
Send G-code printer.gcode.script
Upload file HTTP POST /server/files/upload

License

MIT

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors