# ========================================================
# S-CURVE MOTION PLANNING CONFIGURATION EXAMPLE
# ========================================================
#
# This file demonstrates how to configure S-curve (jerk-limited)
# motion planning in LinuxCNC. S-curve planning produces smoother
# acceleration profiles that can reduce machine vibration and
# improve surface finish.
#
# IMPORTANT: S-curve planning is OPTIONAL.
# Traditional trapezoidal acceleration is used when:
#   - PLANNER_TYPE = 0, OR
#   - MAX_LINEAR_JERK = 0
#
# NOTE: If MAX_LINEAR_JERK is not specified, it defaults to 1e9 (1 billion),
# which effectively disables jerk limiting while still using S-curve calculations.
# This produces motion similar to trapezoidal but not identical.
#
# ========================================================
[EMC]
VERSION = 1.1
MACHINE = scurve_example
DEBUG = 0

[DISPLAY]
JOG_AXES = XYZ
GEOMETRY = XYZ
DISPLAY = axis
CYCLE_TIME = 0.200
POSITION_OFFSET = RELATIVE
POSITION_FEEDBACK = ACTUAL
MAX_FEED_OVERRIDE = 2.0
PROGRAM_PREFIX = M-Codes
INTRO_GRAPHIC = linuxcnc.gif
INTRO_TIME = 5
EDITOR = gedit

[EMCMOT]
EMCMOT = motmod
COMM_TIMEOUT = 1.0
COMM_WAIT = 0.010
BASE_PERIOD =   150000
SERVO_PERIOD = 1000000

[TASK]
TASK = milltask
CYCLE_TIME = 0.010

[HAL]
HALUI = halui
HALFILE = axis_mm_scurve.hal

[TRAJ]
# --------------------------------------------------------
# S-curve Planner Configuration
# --------------------------------------------------------

# PLANNER_TYPE: Select the acceleration profile shape
#   0 = Trapezoidal (traditional - constant acceleration)
#   1 = S-curve (smoother - limited jerk/derivative of acceleration)
# Default: 0 (trapezoidal)
#
# NOTE: This parameter can be changed at RUNTIME via HAL pin:
#       ini.traj_planner_type (allows switching on-the-fly)
PLANNER_TYPE = 1

# MAX_LINEAR_JERK: Maximum rate of change of acceleration
# Units: machine-units/second^3 (e.g., mm/s^3 or inch/s^3)
#
# Setting this to 0 disables S-curve planning regardless of PLANNER_TYPE
# If not specified, defaults to 1e9 (effectively no jerk limiting)
# Maximum allowed value is 1e9 (values above are automatically clamped)
#
# Recommended starting values (adjust based on your machine):
#   - Light/rigid machines: 1000-10000
#   - Heavy/flexible machines: 100-1000
#   - Very rigid machines: 10000-100000
#
# Higher values = sharper acceleration changes (closer to trapezoidal)
# Lower values = smoother acceleration changes (more gradual)
#
# NOTE: This parameter can be changed at RUNTIME via HAL pin:
#       ini.traj_max_jerk (allows tuning on-the-fly)
MAX_LINEAR_JERK = 10000.0

# --------------------------------------------------------
# Standard TRAJ parameters (still required with S-curve)
# --------------------------------------------------------
COORDINATES = X Y Z
LINEAR_UNITS = 1.0
ANGULAR_UNITS = 1.0
CYCLE_TIME = 0.010
DEFAULT_LINEAR_VELOCITY = 100.0
MAX_LINEAR_VELOCITY = 300.0
DEFAULT_LINEAR_ACCELERATION = 500.0
MAX_LINEAR_ACCELERATION = 1000.0
NO_FORCE_HOMING = 1 #to be able to run gcodes and MDI without homing


ARC_BLEND_ENABLE = 1
ARC_BLEND_FALLBACK_ENABLE = 0
ARC_BLEND_OPTIMIZATION_DEPTH = 50
ARC_BLEND_RAMP_FREQ = 20
ARC_BLEND_GAP_CYCLES = 4



[EMCIO]
EMCIO = io
CYCLE_TIME = 0.100


[KINS]
# 5axiskins misnomer 1 more joint for W
KINEMATICS = trivkins
JOINTS = 3

[RS274NGC]
# File containing interpreter variables
PARAMETER_FILE = scurve_example.var

# ========================================================
# JOINT CONFIGURATION
# ========================================================
# Each joint can have its own jerk limit. If not specified,
# the joint uses the axis/trajectory jerk limits.

[JOINT_0]
TYPE = LINEAR
HOME = 0.0
MAX_VELOCITY = 300.0
MAX_ACCELERATION = 1000.0
HOME_SEQUENCE = 0

# MAX_JERK: Maximum jerk for this joint
# Units: machine-units/second^3
# Default: 0.0 (disabled, uses trapezoidal)
#
# This should match or be higher than the trajectory jerk
# to avoid limiting coordinated motion.
MAX_JERK = 10000.0

#MIN_LIMIT = -200.0 #disabled to give more space for testing g-codes
#MAX_LIMIT = 200.0 #disabled to give more space for testing g-codes

# ========================================================
# HOMING CONFIGURATION FOR S-CURVE
# ========================================================
# WARNING: When using S-curve motion (PLANNER_TYPE=1), you MUST set
# HOME_SEARCH_VEL and HOME_LATCH_VEL significantly SLOWER than you
# would with trapezoidal motion planning.
#
# S-curve motion requires MORE DISTANCE to decelerate due to the
# jerk-limited acceleration profile. If homing velocities are too
# high, the axis may overshoot and hit hard limits or sensor limits.
#
# RECOMMENDED: Start with 50% or less of the velocities you would
# use with trapezoidal planning, then increase cautiously.
#
# Example homing configuration (adjust for your machine):
#HOME_SEARCH_VEL = 5.0       # Velocity for initial limit switch search
#HOME_LATCH_VEL = 1.0        # Velocity for precise homing (slower)
#HOME_OFFSET = 0.0           # Distance from switch to home position
#HOME_USE_INDEX = NO         # Use encoder index pulse for homing
#HOME_IGNORE_LIMITS = NO     # Ignore limit switches during homing move
# ========================================================

[JOINT_1]
TYPE = LINEAR
HOME = 0.0
MAX_VELOCITY = 300.0
MAX_ACCELERATION = 1000.0
MAX_JERK = 10000.0
#MIN_LIMIT = -200.0 #disabled to give more space for testing g-codes
#MAX_LIMIT = 200.0 #disabled to give more space for testing g-codes
HOME_SEQUENCE = 0

# WARNING: S-curve homing requires SLOWER velocities than trapezoidal!
# See JOINT_0 for detailed homing configuration examples.
#HOME_SEARCH_VEL = 5.0
#HOME_LATCH_VEL = 1.0

[JOINT_2]
TYPE = LINEAR
HOME = 0.0
MAX_VELOCITY = 200.0
MAX_ACCELERATION = 800.0
MAX_JERK = 10000.0
#MIN_LIMIT = -100.0 #disabled to give more space for testing g-codes
#MAX_LIMIT = 100.0 #disabled to give more space for testing g-codes
HOME_SEQUENCE = 0

# WARNING: S-curve homing requires SLOWER velocities than trapezoidal!
# See JOINT_0 for detailed homing configuration examples.
#HOME_SEARCH_VEL = 4.0
#HOME_LATCH_VEL = 0.8

# ========================================================
# AXIS CONFIGURATION
# ========================================================

[AXIS_X]
#MIN_LIMIT = -200.0 #disabled to give more space for testing g-codes
#MAX_LIMIT = 200.0 #disabled to give more space for testing g-codes
MAX_VELOCITY = 300.0
MAX_ACCELERATION = 1000.0

# MAX_JERK: Maximum jerk for coordinated motion on this axis
# Units: machine-units/second^3
# Default: 0.0 (disabled)
MAX_JERK = 10000.0

[AXIS_Y]
#MIN_LIMIT = -200.0 #disabled to give more space for testing g-codes
#MAX_LIMIT = 200.0 #disabled to give more space for testing g-codes
MAX_VELOCITY = 300.0
MAX_ACCELERATION = 1000.0
MAX_JERK = 10000.0

[AXIS_Z]
#MIN_LIMIT = -100.0 #disabled to give more space for testing g-codes
#MAX_LIMIT = 100.0 #disabled to give more space for testing g-codes
MAX_VELOCITY = 200.0
MAX_ACCELERATION = 800.0
MAX_JERK = 10000.0

# ========================================================
# TUNING GUIDELINES
# ========================================================
#
# 1. START WITH TRAPEZOIDAL (PLANNER_TYPE=0)
#    - Verify your machine works correctly with traditional planning
#    - Note any vibration or resonance issues
#
# 2. ENABLE S-CURVE WITH CONSERVATIVE VALUES
#    - Set PLANNER_TYPE = 1
#    - Start with low MAX_LINEAR_JERK (e.g., 100-500)
#    - Jerk should typically be 10-100x your acceleration value
#
# 3. GRADUALLY INCREASE JERK
#    - Increase MAX_LINEAR_JERK in steps of 2-3x
#    - Test with simple moves and observe:
#      * Motor current/torque
#      * Vibration levels
#      * Following errors
#      * Surface finish quality
#
# 4. FIND OPTIMAL VALUE
#    - Too low: Motion becomes sluggish, cycle time increases
#    - Too high: Approaches trapezoidal behavior, loses smoothness
#    - Optimal: Smooth motion without excessive deceleration
#
# 5. VERIFY COORDINATED MOTION
#    - Test circular interpolation (G2/G3)
#    - Check complex 3D toolpaths
#    - Verify axis jerk limits don't constrain trajectory jerk
#
# ========================================================
# TROUBLESHOOTING
# ========================================================
#
# SYMPTOM: No difference between PLANNER_TYPE=0 and PLANNER_TYPE=1
# SOLUTION: Verify MAX_LINEAR_JERK > 0 and MAX_JERK > 0 for all joints/axes
#
# SYMPTOM: Motion is too slow with S-curve enabled
# SOLUTION: Increase MAX_LINEAR_JERK value
#
# SYMPTOM: Following errors increase with S-curve
# SOLUTION: Decrease MAX_LINEAR_JERK or increase PID I-gain
#
# SYMPTOM: Vibration/resonance at certain speeds
# SOLUTION: Adjust MAX_LINEAR_JERK to avoid resonant frequencies
#          Consider using different jerk values for different axes
#
# ========================================================
