#include #include class XYMotionPlanner { public: XYMotionPlanner(FastAccelStepper* stepperX, FastAccelStepper* stepperY); // Basisparameter der "dominanten" Achse void setBaseLimits(uint32_t maxSpeedHz, uint32_t maxAccelStepsPerS2); // Minimale Werte vermeiden, dass eine kurze Achse mit 0 endet void setMinimums(uint32_t minSpeedHz, uint32_t minAccelStepsPerS2); // Aktuelle Positionen der Planner-Sicht setzen, z.B. nach Homing void setCurrentPosition(int32_t x, int32_t y); int32_t currentX() const; int32_t currentY() const; bool isRunning() const; // Optional blockierend warten void waitUntilFinished(); // Startet eine koordinierte lineare P2P-Bewegung // Rückgabe false = nichts zu tun oder ungültig bool moveTo(int32_t targetX, int32_t targetY); // Convenience: relative Bewegung bool moveBy(int32_t deltaX, int32_t deltaY); // Muss regelmäßig aufgerufen werden, wenn du die Planner-Position // nach abgeschlossener Bewegung sauber nachführen willst void update(); private: FastAccelStepper* m_x = nullptr; FastAccelStepper* m_y = nullptr; int32_t m_currentX = 0; int32_t m_currentY = 0; int32_t m_targetX = 0; int32_t m_targetY = 0; uint32_t m_baseSpeedHz = 2000; uint32_t m_baseAccel = 4000; uint32_t m_minSpeedHz = 1; uint32_t m_minAccel = 1; static uint32_t scaledValue(uint32_t base, float scale, uint32_t distance); };