From ada8ebfa1375b06f4f0e7f857c290906fb0e0e7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesus=20Zen=20Dro=C3=AFd?= Date: Sat, 9 Mar 2024 14:11:05 +0100 Subject: [PATCH] better subclassin for Marlin. fixed missing six import for LinuxCNC --- README.md | 2 + src/pygcode/__init__.py | 18 +- src/pygcode/gcodes.py | 4 +- src/pygcode/gcodes_base.py | 64 +- .../{gcodes_legacy.py => gcodes_linuxcnc.py} | 22 +- src/pygcode/gcodes_marlin.patch | 105 +-- src/pygcode/gcodes_marlin.py | 641 ++++++------------ src/pygcode/gcodes_prusa.py | 2 +- src/pygcode/machine.py | 2 +- .../tools/marlin_parse_MarlinDocumentation.py | 368 +++++----- 10 files changed, 485 insertions(+), 743 deletions(-) rename src/pygcode/{gcodes_legacy.py => gcodes_linuxcnc.py} (98%) diff --git a/README.md b/README.md index a29dd1d..c158621 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,8 @@ for python. pip install -e . ``` +Make sure you set `_DEFAULT_` to the dialect you want to use in `src/pygcode/dialects/__init__.py` + # Documentation diff --git a/src/pygcode/__init__.py b/src/pygcode/__init__.py index a5a36c9..6f2cb6c 100644 --- a/src/pygcode/__init__.py +++ b/src/pygcode/__init__.py @@ -60,7 +60,7 @@ __all__ = [ 'GCodeCannedCycleReturnPrevLevel', 'GCodeCannedCycleReturnToR', 'GCodeCannedReturnMode', - 'GCodeCoolant', + 'GCodeCoolantHeaters', 'GCodeCoolantFloodOn', 'GCodeCoolantMistOn', 'GCodeCoolantOff', @@ -143,7 +143,7 @@ __all__ = [ 'GCodeSetPredefinedPosition', 'GCodeSpeedAndFeedOverrideOff', 'GCodeSpeedAndFeedOverrideOn', - 'GCodeSpindle', + 'GCodeToolState', 'GCodeSpindleConstantSurfaceSpeedMode', 'GCodeSpindleRPMMode', 'GCodeSpindleSpeed', @@ -157,7 +157,7 @@ __all__ = [ 'GCodeStraightProbe', 'GCodeThreadingCycle', 'GCodeToolChange', - 'GCodeToolLength', + 'GCodeToolGeometry', 'GCodeToolLengthOffset', 'GCodeToolSetCurrent', 'GCodeUnit', @@ -212,7 +212,7 @@ match get_default_dialect(): # - GCodeCannedReturnMode: # G98 - GCodeCannedCycleReturnPrevLevel: G98: Canned Cycle Return to the level set prior to cycle start # G99 - GCodeCannedCycleReturnToR: G99: Canned Cycle Return to the level set by R - # - GCodeCoolant: + # - GCodeCoolantHeaters: # M08 - GCodeCoolantFloodOn: M8: turn flood coolant on # M07 - GCodeCoolantMistOn: M7: turn mist coolant on # M09 - GCodeCoolantOff: M9: turn all coolant off @@ -309,7 +309,7 @@ match get_default_dialect(): # M60 - GCodePalletChangePause: M60: Pallet Change Pause # M00 - GCodePauseProgram: M0: Program Pause # M01 - GCodePauseProgramOptional: M1: Program Pause (optional) - # - GCodeSpindle: + # - GCodeToolState: # M19 - GCodeOrientSpindle: M19: Orient Spindle # - GCodeSpindleSpeedMode: # G96 - GCodeSpindleConstantSurfaceSpeedMode: G96: Spindle Constant Surface Speed @@ -318,7 +318,7 @@ match get_default_dialect(): # M04 - GCodeStartSpindleCCW: M4: Start Spindle Counter-Clockwise # M03 - GCodeStartSpindleCW: M3: Start Spindle Clockwise # M05 - GCodeStopSpindle: M5: Stop Spindle - # - GCodeToolLength: + # - GCodeToolGeometry: # G43.2 - GCodeAddToolLengthOffset: G43.2: Appkly Additional Tool Length Offset # G49 - GCodeCancelToolLengthOffset: G49: Cancel Tool Length Compensation # G43.1 - GCodeDynamicToolLengthOffset: G43.1: Dynamic Tool Length Offset @@ -347,7 +347,7 @@ match get_default_dialect(): GCodeCannedCycleReturnPrevLevel, GCodeCannedCycleReturnToR, GCodeCannedReturnMode, - GCodeCoolant, + GCodeCoolantHeaters, GCodeCoolantFloodOn, GCodeCoolantMistOn, GCodeCoolantOff, @@ -430,7 +430,7 @@ match get_default_dialect(): GCodeSetPredefinedPosition, GCodeSpeedAndFeedOverrideOff, GCodeSpeedAndFeedOverrideOn, - GCodeSpindle, + GCodeToolState, GCodeSpindleConstantSurfaceSpeedMode, GCodeSpindleRPMMode, GCodeSpindleSpeed, @@ -444,7 +444,7 @@ match get_default_dialect(): GCodeStraightProbe, GCodeThreadingCycle, GCodeToolChange, - GCodeToolLength, + GCodeToolGeometry, GCodeToolLengthOffset, GCodeToolSetCurrent, GCodeUnit, diff --git a/src/pygcode/gcodes.py b/src/pygcode/gcodes.py index bd54a13..2991ba9 100644 --- a/src/pygcode/gcodes.py +++ b/src/pygcode/gcodes.py @@ -1,4 +1,4 @@ -# vim: ts=4, number +# vim: ts=4 number import sys from collections import defaultdict from copy import copy @@ -151,7 +151,7 @@ match get_default_dialect(): case 'prusa': from .gcodes_prusa import * case _: - from .gcodes_legacy import * + from .gcodes_linuxcnc import * # ======================= Utilities ======================= diff --git a/src/pygcode/gcodes_base.py b/src/pygcode/gcodes_base.py index 2abc978..8f1a92a 100644 --- a/src/pygcode/gcodes_base.py +++ b/src/pygcode/gcodes_base.py @@ -1,7 +1,20 @@ from .gcodes import MODAL_GROUP_MAP from .words import Word, text2words +import six + +""" + These class types can be used by external programs to classify the type of instructions + see class comments and marlin_gcode.py for examples. + + The granularity of the class naming, while it has no functional use while parsing, can however + be useful when it will come to translating from one dialect to another. + + When unsure what class a command should be a (semantic) subclass off, we try to keeps together + things that are related to each other (ie. SD card stuff) +""" class GCode(object): + """ base gcode class ; prefer not to use it """ # Defining Word word_key = None # Word instance to use in lookup word_matches = None # function (secondary) @@ -254,6 +267,8 @@ class GCodeProgramName(GCodeDefinition): # ======================= Motion ======================= class GCodeMotion(GCode): + """ any command that will move the machine and has XYZ... parameters attached + ie. the host is able to kow the machine position after such a command """ param_letters = set('XYZABCUVW') modal_group = MODAL_GROUP_MAP['motion'] exec_order = 242 @@ -315,32 +330,42 @@ class GCodeCannedCycle(GCode): machine.move_to(**moveto_coords) +# ======================= Return Mode in Canned Cycles ======================= +class GCodeCannedReturnMode(GCode): + modal_group = MODAL_GROUP_MAP['canned_cycles_return'] + exec_order = 220 + + # ======================= Distance Mode ======================= class GCodeDistanceMode(GCode): + """ for points of reference to use, and things such as working by radius or diameter (somewhat modal) """ exec_order = 210 # ======================= Feed Rate Mode ======================= class GCodeFeedRateMode(GCode): + """ how feedrates will be interpreted """ modal_group = MODAL_GROUP_MAP['feed_rate_mode'] exec_order = 30 -# ======================= Spindle Control ======================= -class GCodeSpindle(GCode): +# ======================= Spindle/Tool Control ======================= +class GCodeToolState(GCode): word_letter = 'M' exec_order = 90 -# ======================= Coolant ======================= -class GCodeCoolant(GCode): +# ======================= Coolant & Heaters ======================= +class GCodeCoolantHeaters(GCode): + """ all cooling, heating and ventilation systems EXCEPT nozzle temperatures (see GCodeToolState) """ word_letter = 'M' modal_group = MODAL_GROUP_MAP['coolant'] exec_order = 110 -# ======================= Tool Length ======================= -class GCodeToolLength(GCode): +# ======================= Tool Geometry ======================= +class GCodeToolGeometry(GCode): + """ tool lengths and offsets """ modal_group = MODAL_GROUP_MAP['tool_length_offset'] exec_order = 180 @@ -353,6 +378,7 @@ class GCodeProgramControl(GCode): # ======================= Units ======================= class GCodeUnit(GCode): + """ selects a unit system (somewhat modal) """ modal_group = MODAL_GROUP_MAP['units'] exec_order = 160 @@ -381,21 +407,17 @@ class GCodePlaneSelect(GCode): normal = None # Vector3 # ======================= Cutter Radius Compensation ======================= -class GCodeCutterRadiusComp(GCode): +class GCodeCutterRadiusComp(GCodeToolGeometry): modal_group = MODAL_GROUP_MAP['cutter_diameter_comp'] exec_order = 170 # ======================= Path Control Mode ======================= class GCodePathControlMode(GCode): + """ codes that will affect the path and motion either by allowing greater deviation + from the theoretical path or by inducing greater deviation (includes acceleration and jerk)""" modal_group = MODAL_GROUP_MAP['control_mode'] exec_order = 200 -# ======================= Return Mode in Canned Cycles ======================= -class GCodeCannedReturnMode(GCode): - modal_group = MODAL_GROUP_MAP['canned_cycles_return'] - exec_order = 220 - - # ======================= Other Modal Codes ======================= class GCodeOtherModal(GCode): pass @@ -410,6 +432,7 @@ class GCodeSelectCoordinateSystem(GCodeOtherModal): # ======================= Flow-control Codes ======================= class GCodeIO(GCode): + """ pretty much anything that reads and writes on digital pins and not related to motion and temperatures """ word_letter = 'M' exec_order = 70 @@ -424,3 +447,18 @@ class GCodeNonModal(GCode): pass +# ======================= Machine Configuration and Calibration Codes ======================= +class GCodeMachineRoutines(GCode): + """ standard routines that WILL induce movement such as homing, tool changes.. """ + +class GCodeAssistedRoutines(GCodeMachineRoutines): + """ machine routines that require user intervention """ + +class GCodeCalibrationRoutines(GCode): + """ machine routines that are used for calibration purposes """ + +class GCodeMachineConfig(GCode): + """ configuration parameters that will not significantly alter the machine behaviour """ + +class GCodeMachineState(GCode): + """ mostly for commands that report the machine state to the host """ diff --git a/src/pygcode/gcodes_legacy.py b/src/pygcode/gcodes_linuxcnc.py similarity index 98% rename from src/pygcode/gcodes_legacy.py rename to src/pygcode/gcodes_linuxcnc.py index f4245f6..ee72807 100644 --- a/src/pygcode/gcodes_legacy.py +++ b/src/pygcode/gcodes_linuxcnc.py @@ -237,7 +237,7 @@ class GCodeUnitsPerRevolution(GCodeFeedRateMode): # M19 Orient Spindle # G96, G97 S D Spindle Control Mode -class GCodeStartSpindle(GCodeSpindle): +class GCodeStartSpindle(GCodeToolState): """M3,M4: Start Spindle Clockwise""" modal_group = MODAL_GROUP_MAP['spindle'] @@ -253,19 +253,19 @@ class GCodeStartSpindleCCW(GCodeStartSpindle): word_key = Word('M', 4) -class GCodeStopSpindle(GCodeSpindle): +class GCodeStopSpindle(GCodeToolState): """M5: Stop Spindle""" #param_letters = set('S') # S is it's own gcode, makes no sense to be here word_key = Word('M', 5) modal_group = MODAL_GROUP_MAP['spindle'] -class GCodeOrientSpindle(GCodeSpindle): +class GCodeOrientSpindle(GCodeToolState): """M19: Orient Spindle""" word_key = Word('M', 19) -class GCodeSpindleSpeedMode(GCodeSpindle): +class GCodeSpindleSpeedMode(GCodeToolState): word_letter = 'G' modal_group = MODAL_GROUP_MAP['spindle_speed_mode'] @@ -287,17 +287,17 @@ class GCodeSpindleRPMMode(GCodeSpindleSpeedMode): # CODE PARAMETERS DESCRIPTION # M7, M8, M9 Coolant Control -class GCodeCoolantMistOn(GCodeCoolant): +class GCodeCoolantMistOn(GCodeCoolantHeaters): """M7: turn mist coolant on""" word_key = Word('M', 7) -class GCodeCoolantFloodOn(GCodeCoolant): +class GCodeCoolantFloodOn(GCodeCoolantHeaters): """M8: turn flood coolant on""" word_key = Word('M', 8) -class GCodeCoolantOff(GCodeCoolant): +class GCodeCoolantOff(GCodeCoolantHeaters): """M9: turn all coolant off""" word_key = Word('M', 9) @@ -309,24 +309,24 @@ class GCodeCoolantOff(GCodeCoolant): # G43.2 H Apply additional Tool Length Offset # G49 Cancel Tool Length Compensation -class GCodeToolLengthOffset(GCodeToolLength): +class GCodeToolLengthOffset(GCodeToolGeometry): """G43: Tool Length Offset""" param_letters = set('H') word_key = Word('G', 43) -class GCodeDynamicToolLengthOffset(GCodeToolLength): +class GCodeDynamicToolLengthOffset(GCodeToolGeometry): """G43.1: Dynamic Tool Length Offset""" word_key = Word('G', 43.1) -class GCodeAddToolLengthOffset(GCodeToolLength): +class GCodeAddToolLengthOffset(GCodeToolGeometry): """G43.2: Appkly Additional Tool Length Offset""" param_letters = set('H') word_key = Word('G', 43.2) -class GCodeCancelToolLengthOffset(GCodeToolLength): +class GCodeCancelToolLengthOffset(GCodeToolGeometry): """G49: Cancel Tool Length Compensation""" word_key = Word('G', 49) diff --git a/src/pygcode/gcodes_marlin.patch b/src/pygcode/gcodes_marlin.patch index 2df6b66..84f244c 100644 --- a/src/pygcode/gcodes_marlin.patch +++ b/src/pygcode/gcodes_marlin.patch @@ -1,137 +1,70 @@ -100,104c100,104 -< class GCodeBedLevelingPointg1(GCodeMotion): +86,89c86,89 +< class GCodeBedLeveling3Pointg1(GCodeMachineRoutines): < """G29: Probe the bed and enable leveling compensation.""" < param_letters = "ACOQEDJV" -< dialects = ['marlin2'] < word_key = Word('G', 29) --- -> #class GCodeBedLevelingPointg1(GCodeMotion): +> #class GCodeBedLeveling3Pointg1(GCodeMachineRoutines): > # """G29: Probe the bed and enable leveling compensation.""" > # param_letters = "ACOQEDJV" -> # dialects = ['marlin2'] > # word_key = Word('G', 29) -112,134c112,134 -< class GCodeBedLevelingLinearg2(GCodeMotion): +96,109c96,109 +< class GCodeBedLevelingLinearg2(GCodeMachineRoutines): < """G29: Probe the bed and enable leveling compensation.""" < param_letters = "ACOQXYPSEDTHFBLRJV" -< dialects = ['marlin2'] < word_key = Word('G', 29) < -< class GCodeBedLevelingManualm1(GCodeMotion): +< class GCodeBedLevelingManualm1(GCodeMachineRoutines): < """G29: Measure Z heights in a grid, enable leveling compensation""" < param_letters = "SIJXYZ" -< dialects = ['marlin2'] < word_key = Word('G', 29) < -< class GCodeBedLeveling(GCodeMotion): +< class GCodeBedLeveling(GCodeMachineRoutines): < """G29: Probe the bed and enable leveling compensation""" < param_letters = "" -< dialects = ['marlin2'] -< word_key = Word('G', 29) -< -< class GCodeBedLevelingUnifiedm3(GCodeMotion): -< """G29: Probe the bed and enable leveling compensation.""" -< param_letters = "ABCDEFHIJKLPQRSTUVWXY" -< dialects = ['marlin2'] < word_key = Word('G', 29) --- -> #class GCodeBedLevelingLinearg2(GCodeMotion): +> #class GCodeBedLevelingLinearg2(GCodeMachineRoutines): > # """G29: Probe the bed and enable leveling compensation.""" > # param_letters = "ACOQXYPSEDTHFBLRJV" -> # dialects = ['marlin2'] > # word_key = Word('G', 29) > -> #class GCodeBedLevelingManualm1(GCodeMotion): +> #class GCodeBedLevelingManualm1(GCodeMachineRoutines): > # """G29: Measure Z heights in a grid, enable leveling compensation""" > # param_letters = "SIJXYZ" -> # dialects = ['marlin2'] > # word_key = Word('G', 29) > -> #class GCodeBedLeveling(GCodeMotion): +> #class GCodeBedLeveling(GCodeMachineRoutines): > # """G29: Probe the bed and enable leveling compensation""" > # param_letters = "" -> # dialects = ['marlin2'] > # word_key = Word('G', 29) -> -> #class GCodeBedLevelingUnifiedm3(GCodeMotion): -> # """G29: Probe the bed and enable leveling compensation.""" -> # param_letters = "ABCDEFHIJKLPQRSTUVWXY" -> # dialects = ['marlin2'] -> # word_key = Word('G', 29) -160,164c160,164 -< class GCodeMechanicalGantryCalibrationb(GCodeMotion): +136,139c136,139 +< class GCodeMechanicalGantryCalibrationb(GCodeMachineRoutines): < """G34: Modern replacement for Průša's TMC_Z_CALIBRATION""" < param_letters = "SZ" -< dialects = ['marlin2'] < word_key = Word('G', 34) --- -> #class GCodeMechanicalGantryCalibrationb(GCodeMotion): +> #class GCodeMechanicalGantryCalibrationb(GCodeMachineRoutines): > # """G34: Modern replacement for Průša's TMC_Z_CALIBRATION""" > # param_letters = "SZ" -> # dialects = ['marlin2'] > # word_key = Word('G', 34) -425,432c425,426 -< """M43: Get information about pins.""" -< param_letters = "PWETSI" -< dialects = ['marlin2'] -< word_key = Word('M', 43) -< -< class GCodeTogglePinsb(GCodeDigitalOutput): -< """M43T: Get information about pins.""" -< param_letters = "SLIRW" ---- -> """M43: Get information about pins / set pins""" -> param_letters = "PWETSIRL" -652c646 -< class GCodeBaricudaOpen(GCodeDigitalOutput): ---- -> class GCodeBaricuda1Open(GCodeDigitalOutput): -658c652 -< class GCodeBaricudaClose(GCodeDigitalOutput): ---- -> class GCodeBaricuda1Close(GCodeDigitalOutput): -664,665c658 -< # TODO: duplicate class name BaricudaOpen -< class GCodeBaricudaOpen(GCodeDigitalOutput): ---- -> class GCodeBaricuda2Open(GCodeDigitalOutput): -671,672c664 -< # TODO: duplicate class name BaricudaClose -< class GCodeBaricudaClose(GCodeDigitalOutput): ---- -> class GCodeBaricuda2Close(GCodeDigitalOutput): -768,769c760 -< # TODO: duplicate class name SetLaserCoolerTemperature -< class GCodeSetLaserCoolerTemperature(GCodeCoolant): ---- -> class GCodeWaitForLaserCoolerTemperature(GCodeCoolant): -775c766 -< class GCodeSetFilamentDiameter(GCodeOtherModal): ---- -> class GCodeSetFilamentDiameterVolumetric(GCodeOtherModal): -1051d1041 -< # TODO: duplicate class name SetFilamentDiameter -1250,1254c1240,1244 -< class GCodeDeltaConfiguration(GCodeOtherModal): +1045,1048c1045,1048 +< class GCodeDeltaConfiguration(GCodeMachineConfig): < """M665: Set delta geometry values""" < param_letters = "HLRSXYZABC" -< dialects = ['marlin2'] < word_key = Word('M', 665) --- -> #class GCodeDeltaConfiguration(GCodeOtherModal): +> #class GCodeDeltaConfiguration(GCodeMachineConfig): > # """M665: Set delta geometry values""" > # param_letters = "HLRSXYZABC" -> # dialects = ['marlin2'] > # word_key = Word('M', 665) -1268,1272c1258,1262 -< class GCodeSetDeltaEndstopAdjustmentsa(GCodeOtherModal): +1060,1063c1060,1063 +< class GCodeSetDeltaEndstopAdjustmentsa(GCodeMachineConfig): < """M666: Set Delta endstop adjustments""" < param_letters = "XYZ" -< dialects = ['marlin2'] < word_key = Word('M', 666) --- -> #class GCodeSetDeltaEndstopAdjustmentsa(GCodeOtherModal): +> #class GCodeSetDeltaEndstopAdjustmentsa(GCodeMachineConfig): > # """M666: Set Delta endstop adjustments""" > # param_letters = "XYZ" -> # dialects = ['marlin2'] > # word_key = Word('M', 666) diff --git a/src/pygcode/gcodes_marlin.py b/src/pygcode/gcodes_marlin.py index 4e3008a..2019512 100644 --- a/src/pygcode/gcodes_marlin.py +++ b/src/pygcode/gcodes_marlin.py @@ -4,7 +4,6 @@ from .gcodes_base import * class GCodeLinearMove(GCodeMotion): """G0, G1: Add a straight line movement to the planner""" param_letters = "XYZEFS" - dialects = ['marlin2'] @classmethod def word_matches(cls, w): @@ -14,7 +13,6 @@ class GCodeLinearMove(GCodeMotion): class GCodeArcOrCircleMove(GCodeArcMove): """G2, G3: Add an arc or circle movement to the planner""" param_letters = "XYZIJREFPS" - dialects = ['marlin2'] @classmethod def word_matches(cls, w): @@ -24,43 +22,36 @@ class GCodeArcOrCircleMove(GCodeArcMove): class GCodeDwell(GCode): """G4: Pause the planner""" param_letters = "SP" - dialects = ['marlin2'] word_key = Word('G', 4) -class GCodeBzierCubicSpline(GCodeMotion): - """G5: Cubic B-spline with XYE destination and IJPQ offsets""" +class GCodeBezierCubicSpline(GCodeMotion): + """G5: Cubic Bézier spline with XYE destination and IJPQ offsets""" param_letters = "XYEFIJPQS" - dialects = ['marlin2'] word_key = Word('G', 5) class GCodeDirectStepperMove(GCodeMotion): """G6: Perform a direct, uninterpolated, and non-kinematic synchronized move""" param_letters = "IRSXYZE" - dialects = ['marlin2'] word_key = Word('G', 6) -class GCodeRetract(GCode): +class GCodeRetract(GCodeMachineRoutines): """G10: Retract the filament""" param_letters = "S" - dialects = ['marlin2'] word_key = Word('G', 10) -class GCodeRecover(GCode): +class GCodeRecover(GCodeMachineRoutines): """G11: Recover the filament with firmware-based retract.""" param_letters = "" - dialects = ['marlin2'] word_key = Word('G', 11) -class GCodeCleanTheNozzle(GCodeMotion): +class GCodeCleanTheNozzle(GCodeMachineRoutines): """G12: Perform the nozzle cleaning procedure.""" param_letters = "PRSTXYZ" - dialects = ['marlin2'] word_key = Word('G', 12) -class GCodeCncWorkspacePlanes(GCodePlaneSelect): +class GCodeCNCWorkspacePlanes(GCodePlaneSelect): """G17, G18, G19: Select CNC workspace plane""" param_letters = "" - dialects = ['marlin2'] @classmethod def word_matches(cls, w): @@ -70,233 +61,197 @@ class GCodeCncWorkspacePlanes(GCodePlaneSelect): class GCodeInchUnits(GCodeUnit): """G20: Set Units to Inches.""" param_letters = "" - dialects = ['marlin2'] word_key = Word('G', 20) unit_id = 0 class GCodeMillimeterUnits(GCodeUnit): """G21: Set Units to Millimeters.""" param_letters = "" - dialects = ['marlin2'] word_key = Word('G', 21) unit_id = 1 -class GCodeMeshValidationPattern(GCodeMotion): +class GCodeMeshValidationPattern(GCodeAssistedRoutines): """G26: Test the mesh and adjust.""" param_letters = "BCDFHIKLOPQRSUXY" - dialects = ['marlin2'] word_key = Word('G', 26) -class GCodeParkToolhead(GCodeMotion): +class GCodeParkToolhead(GCodeMachineRoutines): """G27: Park the current toolhead""" param_letters = "P" - dialects = ['marlin2'] word_key = Word('G', 27) -class GCodeAutoHome(GCodeMotion): +class GCodeAutoHome(GCodeMachineRoutines): """G28: Auto home one or more axes.""" param_letters = "LORXYZ" - dialects = ['marlin2'] word_key = Word('G', 28) -#class GCodeBedLevelingPointg1(GCodeMotion): +#class GCodeBedLeveling3Pointg1(GCodeMachineRoutines): # """G29: Probe the bed and enable leveling compensation.""" # param_letters = "ACOQEDJV" -# dialects = ['marlin2'] # word_key = Word('G', 29) -class GCodeBedLevelingBilinearm2(GCodeMotion): +class GCodeBedLevelingBilinearm2(GCodeMachineRoutines): """G29: Probe the bed and enable leveling compensation.""" param_letters = "ACOQXYZWSEDHFBLRJV" - dialects = ['marlin2'] word_key = Word('G', 29) -#class GCodeBedLevelingLinearg2(GCodeMotion): +#class GCodeBedLevelingLinearg2(GCodeMachineRoutines): # """G29: Probe the bed and enable leveling compensation.""" # param_letters = "ACOQXYPSEDTHFBLRJV" -# dialects = ['marlin2'] # word_key = Word('G', 29) -#class GCodeBedLevelingManualm1(GCodeMotion): +#class GCodeBedLevelingManualm1(GCodeMachineRoutines): # """G29: Measure Z heights in a grid, enable leveling compensation""" # param_letters = "SIJXYZ" -# dialects = ['marlin2'] # word_key = Word('G', 29) -#class GCodeBedLeveling(GCodeMotion): +#class GCodeBedLeveling(GCodeMachineRoutines): # """G29: Probe the bed and enable leveling compensation""" # param_letters = "" -# dialects = ['marlin2'] # word_key = Word('G', 29) -#class GCodeBedLevelingUnifiedm3(GCodeMotion): -# """G29: Probe the bed and enable leveling compensation.""" -# param_letters = "ABCDEFHIJKLPQRSTUVWXY" -# dialects = ['marlin2'] -# word_key = Word('G', 29) +class GCodeBedLevelingUnifiedm3(GCodeMachineRoutines): + """G29: Probe the bed and enable leveling compensation.""" + param_letters = "ABCDEFHIJKLPQRSTUVWXY" + word_key = Word('G', 29) -class GCodeSingleZProbe(GCodeMotion): +class GCodeSingleZProbe(GCodeMachineRoutines): """G30: Probe bed at current XY location""" param_letters = "CXYE" - dialects = ['marlin2'] word_key = Word('G', 30) -class GCodeDockSled(GCodeMotion): +class GCodeDockSled(GCodeMachineRoutines): """G31: Dock the Z probe sled.""" param_letters = "" - dialects = ['marlin2'] word_key = Word('G', 31) -class GCodeUndockSled(GCodeMotion): +class GCodeUndockSled(GCodeMachineRoutines): """G32: Undock the Z probe sled.""" param_letters = "" - dialects = ['marlin2'] word_key = Word('G', 32) -class GCodeDeltaAutoCalibration(GCodeMotion): +class GCodeDeltaAutoCalibration(GCodeMachineRoutines): """G33: Calibrate various Delta parameters""" param_letters = "CEFPTVOR" - dialects = ['marlin2'] word_key = Word('G', 33) -#class GCodeMechanicalGantryCalibrationb(GCodeMotion): +#class GCodeMechanicalGantryCalibrationb(GCodeMachineRoutines): # """G34: Modern replacement for Průša's TMC_Z_CALIBRATION""" # param_letters = "SZ" -# dialects = ['marlin2'] # word_key = Word('G', 34) -class GCodeZSteppersAutoAlignmenta(GCodeMotion): +class GCodeZSteppersAutoAlignmenta(GCodeMachineRoutines): """G34: Align multiple Z steppers using a bed probe""" param_letters = "ITAE" - dialects = ['marlin2'] word_key = Word('G', 34) -class GCodeTrammingAssistant(GCodeMotion): +class GCodeTrammingAssistant(GCodeAssistedRoutines): """G35: Run a procedure to tram the bed""" param_letters = "S" - dialects = ['marlin2'] word_key = Word('G', 35) -class GCodeProbeTarget(GCodeMotion): +class GCodeProbeTarget(GCodeMachineRoutines): """G38.2, G38.3, G38.4, G38.5: Probe towards (or away from) a workpiece""" param_letters = "XYZF" - dialects = ['marlin2'] @classmethod def word_matches(cls, w): return (w.letter == 'G') and (w.value in [38.2, 38.3, 38.4, 38.5]) default_word = Word('G', 38) -class GCodeMoveToMeshCoordinate(GCodeSelectCoordinateSystem): +class GCodeMoveToMeshCoordinate(GCodeMotion): """G42: Move to a specific point in the leveling mesh""" param_letters = "IJF" - dialects = ['marlin2'] word_key = Word('G', 42) -class GCodeMoveInMachineCoordinates(GCodeSelectCoordinateSystem): +class GCodeMoveInMachineCoordinates(GCodeMotion): """G53: Apply native workspace to the current move.""" param_letters = "" - dialects = ['marlin2'] word_key = Word('G', 53) class GCodeWorkspaceCoordinateSystem(GCodeSelectCoordinateSystem): """G54, G55, G56, G57, G58, G59, G59.1, G59.2, G59.3: Select a workspace coordinate system""" param_letters = "" - dialects = ['marlin2'] @classmethod def word_matches(cls, w): return (w.letter == 'G') and (w.value in [54, 55, 56, 57, 58, 59, 59.1, 59.2, 59.3]) default_word = Word('G', 54) -class GCodeSaveCurrentPosition(GCode): +class GCodeSaveCurrentPosition(GCodeOtherModal): """G60: Save current position to specified slot""" param_letters = "S" - dialects = ['marlin2'] word_key = Word('G', 60) class GCodeReturnToSavedPosition(GCodeMotion): """G61: Return to saved position of specified slot""" param_letters = "FSXYZE" - dialects = ['marlin2'] word_key = Word('G', 61) -class GCodeProbeTemperatureCalibration(GCodeOtherModal): +class GCodeProbeTemperatureCalibration(GCodeMachineRoutines): """G76: Calibrate probe temperature compensation""" param_letters = "BP" - dialects = ['marlin2'] word_key = Word('G', 76) -class GCodeCancelCurrentMotionMode(GCode): +class GCodeCancelCurrentMotionMode(GCodeOtherModal): """G80: Cancel the current motion mode""" param_letters = "" - dialects = ['marlin2'] word_key = Word('G', 80) class GCodeAbsolutePositioning(GCodeOtherModal): """G90: Set the interpreter to absolute positions""" param_letters = "" - dialects = ['marlin2'] word_key = Word('G', 90) class GCodeRelativePositioning(GCodeOtherModal): """G91: Set the interpreter to relative positions""" param_letters = "" - dialects = ['marlin2'] word_key = Word('G', 91) class GCodeSetPosition(GCodeOtherModal): """G92: Set the current position of one or more axes.""" param_letters = "XYZE" - dialects = ['marlin2'] word_key = Word('G', 92) -class GCodeBacklashCalibration(GCodeOtherModal): +class GCodeBacklashCalibration(GCodeMachineRoutines): """G425: Use a conductive object to calibrate XYZ backlash""" param_letters = "BTVU" - dialects = ['marlin2'] word_key = Word('G', 425) -class GCodeUnconditionalStop(GCodeOtherModal): +class GCodeUnconditionalStop(GCodeProgramControl): """M0, M1: Stop and wait for user""" param_letters = "SPg" - dialects = ['marlin2'] @classmethod def word_matches(cls, w): return (w.letter == 'M') and (w.value in [0, 1]) default_word = Word('M', 0) -class GCodeSpindleCwLaserOn(GCodeSpindle): +class GCodeSpindleCWLaserOn(GCodeToolState): """M3: Set the spindle CW speed or laser power""" param_letters = "SOI" - dialects = ['marlin2'] word_key = Word('M', 3) -class GCodeSpindleCcwLaserOn(GCodeSpindle): +class GCodeSpindleCCWLaserOn(GCodeToolState): """M4: Set the spindle CCW speed or laser power""" param_letters = "SOI" - dialects = ['marlin2'] word_key = Word('M', 4) -class GCodeSpindleLaserOff(GCodeSpindle): +class GCodeSpindleLaserOff(GCodeToolState): """M5: Turn off spindle or laser""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 5) -class GCodeCoolantControls(GCodeCoolant): +class GCodeCoolantControls(GCodeCoolantHeaters): """M7, M8, M9: Turn mist or flood coolant on / off""" param_letters = "" - dialects = ['marlin2'] @classmethod def word_matches(cls, w): return (w.letter == 'M') and (w.value in [7, 8, 9]) default_word = Word('M', 7) -class GCodeVacuumBlowerControl(GCodeDigitalOutput): +class GCodeVacuumBlowerControl(GCodeIO): """M10, M11: Enable and disable the Cutter Vacuum or Laser Blower Motor.""" param_letters = "" - dialects = ['marlin2'] @classmethod def word_matches(cls, w): @@ -306,1187 +261,997 @@ class GCodeVacuumBlowerControl(GCodeDigitalOutput): class GCodeExpectedPrinterCheck(GCodeOtherModal): """M16: Prevent G-code usage on the wrong machine""" param_letters = "g" - dialects = ['marlin2'] word_key = Word('M', 16) class GCodeEnableSteppers(GCodeOtherModal): """M17: Enable steppers""" param_letters = "'" - dialects = ['marlin2'] word_key = Word('M', 17) class GCodeDisableSteppers(GCodeOtherModal): """M18, M84: Disable steppers (same as M84).""" param_letters = "S'" - dialects = ['marlin2'] @classmethod def word_matches(cls, w): return (w.letter == 'M') and (w.value in [18, 84]) default_word = Word('M', 18) -class GCodeListSdCard(GCodeIO): +class GCodeListSDCard(GCodeIO): """M20: List the contents of the SD Card.""" param_letters = "FLT" - dialects = ['marlin2'] word_key = Word('M', 20) -class GCodeInitSdCard(GCodeIO): +class GCodeInitSDCard(GCodeIO): """M21: Attempt to detect an SD card in the slot.""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 21) -class GCodeReleaseSdCard(GCodeIO): +class GCodeReleaseSDCard(GCodeIO): """M22: Simulate ejection of the SD card""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 22) -class GCodeSelectSdFile(GCodeIO): +class GCodeSelectSDFile(GCodeIO): """M23: Select an SD file to be executed""" param_letters = "e" - dialects = ['marlin2'] word_key = Word('M', 23) -class GCodeStartOrResumeSdPrint(GCodeOtherModal): +class GCodeStartOrResumeSDPrint(GCodeProgramControl): """M24: Start or resume a file selected with M23""" param_letters = "ST" - dialects = ['marlin2'] word_key = Word('M', 24) -class GCodePauseSdPrint(GCodeOtherModal): +class GCodePauseSDPrint(GCodeProgramControl): """M25: Pause printing from the SD card""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 25) -class GCodeSetSdPosition(GCodeIO): +class GCodeSetSDPosition(GCodeProgramControl): """M26: Set the SD read position""" param_letters = "S" - dialects = ['marlin2'] word_key = Word('M', 26) -class GCodeReportSdPrintStatus(GCodeNonModal): +class GCodeReportSDPrintStatus(GCodeMachineState): """M27: Print SD progress to serial""" param_letters = "SC" - dialects = ['marlin2'] word_key = Word('M', 27) -class GCodeStartSdWrite(GCodeIO): +class GCodeStartSDWrite(GCodeIO): """M28: Start writing to a file on the SD card""" param_letters = "1e" - dialects = ['marlin2'] word_key = Word('M', 28) -class GCodeStopSdWrite(GCodeIO): +class GCodeStopSDWrite(GCodeIO): """M29: Stop writing the file, end logging.""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 29) -class GCodeDeleteSdFile(GCodeIO): +class GCodeDeleteSDFile(GCodeIO): """M30: Delete a specified file from SD.""" param_letters = "e" - dialects = ['marlin2'] word_key = Word('M', 30) -class GCodePrintTime(GCode): +class GCodeReportPrintTime(GCodeMachineState): """M31: Report the current print time.""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 31) -class GCodeSelectAndStart(GCodeIO): +class GCodeSelectAndStart(GCodeProgramControl): """M32: Begin an SD print from a file.""" param_letters = "PS" - dialects = ['marlin2'] word_key = Word('M', 32) class GCodeGetLongPath(GCodeIO): """M33: Convert a short pathname to a long pathname.""" param_letters = "h" - dialects = ['marlin2'] word_key = Word('M', 33) -class GCodeSdcardSorting(GCodeIO): +class GCodeSDCardSorting(GCodeIO): """M34: Set SDCard file sorting options.""" param_letters = "SF" - dialects = ['marlin2'] word_key = Word('M', 34) -class GCodeSetPinState(GCodeDigitalOutput): +class GCodeSetPinState(GCodeIO): """M42: Set an analog or digital pin to a specified state.""" param_letters = "ITPS" - dialects = ['marlin2'] word_key = Word('M', 42) class GCodeDebugPins(GCodeIO): - """M43: Get information about pins / set pins""" - param_letters = "PWETSIRL" - dialects = ['marlin2'] + """M43: Get information about pins ; set/get pins states""" + param_letters = "PWETSI" word_key = Word('M', 43) -class GCodeProbeRepeatabilityTest(GCodeMotion): +class GCodeTogglePinsb(GCodeIO): + """M43T: Toggle pins states""" + param_letters = "SLIRW" + word_key = Word('M', 43) + +class GCodeProbeRepeatabilityTest(GCodeMachineRoutines): """M48: Measure Z Probe repeatability.""" param_letters = "CELPSVXY" - dialects = ['marlin2'] word_key = Word('M', 48) -class GCodeSetPrintProgress(GCode): +class GCodeSetPrintProgress(GCodeNonModal): """M73: Set current print progress percentage for LCD.""" param_letters = "PR" - dialects = ['marlin2'] word_key = Word('M', 73) -class GCodeStartPrintJobTimer(GCodeOtherModal): +class GCodeStartPrintJobTimer(GCodeProgramControl): """M75: Start the print job timer.""" param_letters = "g" - dialects = ['marlin2'] word_key = Word('M', 75) -class GCodePausePrintJobTimer(GCodeOtherModal): +class GCodePausePrintJobTimer(GCodeProgramControl): """M76: Pause the print job timer.""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 76) -class GCodeStopPrintJobTimer(GCodeOtherModal): +class GCodeStopPrintJobTimer(GCodeProgramControl): """M77: Stop the print job timer.""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 77) -class GCodePrintJobStats(GCode): +class GCodePrintJobStats(GCodeMachineState): """M78: Print statistics about print jobs.""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 78) class GCodePowerOn(GCodeOtherModal): """M80: Turn on the power supply""" param_letters = "S" - dialects = ['marlin2'] word_key = Word('M', 80) class GCodePowerOff(GCodeOtherModal): """M81: Turn off the power supply.""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 81) class GCodeEAbsolute(GCodeOtherModal): """M82: Set E to absolute positioning.""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 82) class GCodeERelative(GCodeOtherModal): """M83: Set E to relative positioning.""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 83) class GCodeInactivityShutdown(GCodeOtherModal): """M85: Set the inactivity timeout.""" param_letters = "S" - dialects = ['marlin2'] word_key = Word('M', 85) class GCodeHotendIdleTimeout(GCodeOtherModal): """M86: Set the hotend idle timeout.""" param_letters = "STEB" - dialects = ['marlin2'] word_key = Word('M', 86) class GCodeDisableHotendIdleTimeout(GCodeOtherModal): """M87: Disable the hotend idle timeout.""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 87) -class GCodeSetAxisStepsPerUnit(GCodeUnit): +class GCodeSetAxisStepsperunit(GCodeOtherModal): """M92: Set the number of steps-per-mm, per-inch, or per-degree""" param_letters = "XYZET" - dialects = ['marlin2'] word_key = Word('M', 92) -class GCodeFreeMemory(GCodeNonModal): +class GCodeFreeMemory(GCodeMachineState): """M100: Observe memory used by code""" param_letters = "DFIC" - dialects = ['marlin2'] word_key = Word('M', 100) -class GCodeConfigureBedDistanceSensor(GCodeOtherModal): +class GCodeConfigureBedDistanceSensor(GCodeMachineRoutines): """M102: Set parameters for the Bed Distance Sensor.""" param_letters = "S" - dialects = ['marlin2'] word_key = Word('M', 102) -class GCodeSetHotendTemperature(GCodeOtherModal): +class GCodeSetHotendTemperature(GCodeToolState): """M104: Set a new target hot end temperature.""" param_letters = "ISFBT" - dialects = ['marlin2'] word_key = Word('M', 104) -class GCodeReportTemperatures(GCodeNonModal): +class GCodeReportTemperatures(GCodeMachineState): """M105: Send a temperature report to the host.""" param_letters = "RT" - dialects = ['marlin2'] word_key = Word('M', 105) -class GCodeSetFanSpeed(GCodeDigitalOutput): +class GCodeSetFanSpeed(GCodeCoolantHeaters): """M106: Turn on fan and set speed""" param_letters = "ISPT" - dialects = ['marlin2'] word_key = Word('M', 106) -class GCodeFanOff(GCodeDigitalOutput): +class GCodeFanOff(GCodeCoolantHeaters): """M107: Turn off a fan""" param_letters = "P" - dialects = ['marlin2'] word_key = Word('M', 107) -class GCodeBreakAndContinue(GCodeOtherModal): +class GCodeBreakAndContinue(GCodeProgramControl): """M108: Break out of the current waiting loop""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 108) -class GCodeWaitForHotendTemperature(GCode): +class GCodeWaitForHotendTemperature(GCodeToolState): """M109: Wait for the hot end to reach its target.""" param_letters = "ISRFBT" - dialects = ['marlin2'] word_key = Word('M', 109) class GCodeSetLineNumber(GCodeOtherModal): """M110: Set the current line number.""" param_letters = "N" - dialects = ['marlin2'] word_key = Word('M', 110) class GCodeDebugLevel(GCodeOtherModal): """M111: Report and optionally set the debug flags.""" param_letters = "S" - dialects = ['marlin2'] word_key = Word('M', 111) class GCodeFullShutdown(GCodeOtherModal): """M112: Shut everything down and halt the machine.""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 112) -class GCodeHostKeepalive(GCode): +class GCodeHostKeepalive(GCodeMachineState): """M113: Get or set the host keepalive interval.""" param_letters = "S" - dialects = ['marlin2'] word_key = Word('M', 113) -class GCodeGetCurrentPosition(GCodeNonModal): +class GCodeGetCurrentPosition(GCodeMachineState): """M114: Report the current tool position to the host.""" param_letters = "DER" - dialects = ['marlin2'] word_key = Word('M', 114) -class GCodeFirmwareInfo(GCodeNonModal): +class GCodeFirmwareInfo(GCodeMachineState): """M115: Print the firmware info and capabilities.""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 115) -class GCodeSetLcdMessage(GCodeIO): +class GCodeSetLCDMessage(GCodeMachineState): """M117: Set the message line on the LCD.""" param_letters = "g" - dialects = ['marlin2'] word_key = Word('M', 117) -class GCodeSerialPrint(GCodeIO): +class GCodeSerialPrint(GCodeMachineState): """M118: Send text to serial""" param_letters = "g11n" - dialects = ['marlin2'] word_key = Word('M', 118) -class GCodeEndstopStates(GCodeIO): +class GCodeEndstopStates(GCodeMachineState): """M119: Report endstop and probe states to the host.""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 119) -class GCodeEnableEndstops(GCodeIO): +class GCodeEnableEndstops(GCodeOtherModal): """M120: Enable endstops and keep them enabled even when not homing.""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 120) -class GCodeDisableEndstops(GCodeIO): +class GCodeDisableEndstops(GCodeOtherModal): """M121: Disable endstops and keep them disabled when not homing.""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 121) -class GCodeTmcDebugging(GCodeIO): +class GCodeTMCDebugging(GCodeMachineState): """M122: Get TMC Debug Info""" param_letters = "IXYZEVSP" - dialects = ['marlin2'] word_key = Word('M', 122) -class GCodeFanTachometers(GCodeIO): +class GCodeFanTachometers(GCodeMachineState): """M123: Report fan speeds from tachometers""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 123) -class GCodeParkHead(GCodeMotion): +class GCodeParkHead(GCodeMachineRoutines): """M125: Save current position and move to filament change position.""" param_letters = "LXYZP" - dialects = ['marlin2'] word_key = Word('M', 125) class GCodeBaricuda1Open(GCodeDigitalOutput): """M126: Open the valve for Baricuda 1.""" param_letters = "S" - dialects = ['marlin2'] word_key = Word('M', 126) class GCodeBaricuda1Close(GCodeDigitalOutput): """M127: Close the valve for Baricuda 1.""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 127) class GCodeBaricuda2Open(GCodeDigitalOutput): """M128: Open the valve for Baricuda 2.""" param_letters = "S" - dialects = ['marlin2'] word_key = Word('M', 128) class GCodeBaricuda2Close(GCodeDigitalOutput): """M129: Close the valve for Baricuda 2.""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 129) -class GCodeSetBedTemperature(GCodeOtherModal): +class GCodeSetBedTemperature(GCodeCoolantHeaters): """M140: Set a new target bed temperature.""" param_letters = "IS" - dialects = ['marlin2'] word_key = Word('M', 140) -class GCodeSetChamberTemperature(GCodeOtherModal): +class GCodeSetChamberTemperature(GCodeCoolantHeaters): """M141: Set a new target chamber temperature.""" param_letters = "S" - dialects = ['marlin2'] word_key = Word('M', 141) -class GCodeSetLaserCoolerTemperature(GCodeCoolant): +class GCodeSetLaserCoolerTemperature(GCodeCoolantHeaters): """M143: Set a new target laser coolant temperature.""" param_letters = "S" - dialects = ['marlin2'] word_key = Word('M', 143) -class GCodeSetMaterialPreset(GCodeOtherModal): +class GCodeSetMaterialPreset(GCodeNonModal): """M145: Set material presets in the LCD menu.""" param_letters = "SHBF" - dialects = ['marlin2'] word_key = Word('M', 145) class GCodeSetTemperatureUnits(GCodeUnit): - """M149: Set temperature units to Celsius, Fahrenheit, or Kelvin.""" + """M149: Set/get temperature units to Celsius, Fahrenheit, or Kelvin.""" param_letters = "CFK" - dialects = ['marlin2'] word_key = Word('M', 149) -class GCodeSetRgbWColor(GCodeDigitalOutput): +class GCodeSetRGBWColor(GCodeDigitalOutput): """M150: Set the color of the RGB(W) LED, backlight, or LED strip.""" param_letters = "RUBWPISK" - dialects = ['marlin2'] word_key = Word('M', 150) class GCodePositionAutoReport(GCodeNonModal): """M154: Periodically auto-report position to serial""" param_letters = "S" - dialects = ['marlin2'] word_key = Word('M', 154) -class GCodeTemperatureAutoReport(GCodeNonModal): +class GCodeTemperatureAutoReport(GCodeMachineState): """M155: Auto-report temperatures to host periodically.""" param_letters = "S" - dialects = ['marlin2'] word_key = Word('M', 155) class GCodeSetMixFactor(GCodeOtherModal): """M163: Set a single mix factor for a mixing extruder.""" param_letters = "SP" - dialects = ['marlin2'] word_key = Word('M', 163) class GCodeSaveMix(GCodeOtherModal): """M164: Save the current mix as a virtual tool.""" param_letters = "S" - dialects = ['marlin2'] word_key = Word('M', 164) class GCodeSetMix(GCodeOtherModal): """M165: Set all mix factors for the mixing extruder.""" param_letters = "ABCDHI" - dialects = ['marlin2'] word_key = Word('M', 165) class GCodeGradientMix(GCodeOtherModal): """M166: Set a Gradient Mix""" param_letters = "AZIJST" - dialects = ['marlin2'] word_key = Word('M', 166) -class GCodeWaitForBedTemperature(GCode): +class GCodeWaitForBedTemperature(GCodeCoolantHeaters): """M190: Wait for the bed to reach target temperature.""" param_letters = "ISRT" - dialects = ['marlin2'] word_key = Word('M', 190) -class GCodeWaitForChamberTemperature(GCode): +class GCodeWaitForChamberTemperature(GCodeCoolantHeaters): """M191: Wait for the chamber to reach target temperature.""" param_letters = "SR" - dialects = ['marlin2'] word_key = Word('M', 191) -class GCodeWaitForProbeTemperature(GCode): +class GCodeWaitForProbeTemperature(GCodeToolState): """M192: Wait for the probe temperature sensor to reach a target""" param_letters = "RS" - dialects = ['marlin2'] word_key = Word('M', 192) -class GCodeWaitForLaserCoolerTemperature(GCodeCoolant): - """M193: Set a new target laser coolant temperature.""" +class GCodeWaitForLaserCoolerTemperature(GCodeCoolantHeaters): + """M193: Set a new target laser coolant temperature and wait until it is equal to or below the target.""" param_letters = "S" - dialects = ['marlin2'] word_key = Word('M', 193) -class GCodeSetFilamentDiameterVolumetric(GCodeOtherModal): +class GCodeSetFilamentDiameterVolumetricExtrusion(GCodeOtherModal): """M200: Set the diameter for volumetric extrusion.""" param_letters = "DLST" - dialects = ['marlin2'] word_key = Word('M', 200) -class GCodePrintTravelMoveLimits(GCodeNonModal): +class GCodePrintTravelMoveLimits(GCodePathControlMode): """M201: Set acceleration / frequency limits for print and travel moves.""" param_letters = "XYZETFS" - dialects = ['marlin2'] word_key = Word('M', 201) -class GCodeSetMaxFeedrate(GCodeFeedRateMode): +class GCodeSetMaxFeedrate(GCodePathControlMode): """M203: Set maximum feedrate for one or more axes.""" param_letters = "XYZET" - dialects = ['marlin2'] word_key = Word('M', 203) -class GCodeSetStartingAcceleration(GCodeOtherModal): +class GCodeSetStartingAcceleration(GCodePathControlMode): """M204: Set the starting acceleration for moves by type.""" param_letters = "PRTS" - dialects = ['marlin2'] word_key = Word('M', 204) -class GCodeSetAdvancedSettings(GCodeOtherModal): +class GCodeSetAdvancedSettings(GCodePathControlMode): """M205: Set some advanced settings related to movement.""" param_letters = "XYZEBSTJ" - dialects = ['marlin2'] word_key = Word('M', 205) -class GCodeSetHomeOffsets(GCodeOtherModal): +class GCodeSetHomeOffsets(GCodeMachineConfig): """M206: Apply a persistent offset""" param_letters = "PTXYZ" - dialects = ['marlin2'] word_key = Word('M', 206) -class GCodeSetFirmwareRetraction(GCodeOtherModal): - """M207: Set options for firmware-based retraction.""" +class GCodeFirmwareRetractionSettings(GCodeMachineConfig): + """M207: Set/get options for firmware-based retraction.""" param_letters = "SWFZ" - dialects = ['marlin2'] word_key = Word('M', 207) -class GCodeFirmwareRecover(GCodeOtherModal): - """M208: Firmware-retraction recover settings.""" +class GCodeFirmwareRecoverSettings(GCodeMachineConfig): + """M208: Set/get firmware-retraction recover settings.""" param_letters = "SWFR" - dialects = ['marlin2'] word_key = Word('M', 208) -class GCodeSetAutoRetract(GCodeOtherModal): +class GCodeSetAutoRetract(GCodeMachineConfig): """M209: Enable / disable auto-retraction.""" param_letters = "S" - dialects = ['marlin2'] word_key = Word('M', 209) class GCodeSoftwareEndstops(GCodeOtherModal): """M211: Set and/or get the software endstops state""" param_letters = "S" - dialects = ['marlin2'] word_key = Word('M', 211) -class GCodeFilamentSwapParameters(GCodeOtherModal): +class GCodeFilamentSwapParameters(GCodeMachineConfig): """M217: Set length and speed for filament swapping""" param_letters = "QSBEPRUFGALWXYVZ" - dialects = ['marlin2'] word_key = Word('M', 217) -class GCodeSetHotendOffset(GCodeOtherModal): +class GCodeSetHotendOffset(GCodeToolGeometry): """M218: Set the offset of a hotend (from hotend 0).""" param_letters = "TXYZ" - dialects = ['marlin2'] word_key = Word('M', 218) class GCodeSetFeedratePercentage(GCodeFeedRateMode): """M220: Set the global feedrate percentage.""" param_letters = "SBR" - dialects = ['marlin2'] word_key = Word('M', 220) -class GCodeSetFlowPercentage(GCodeOtherModal): +class GCodeSetFlowPercentage(GCodeFeedRateMode): """M221: Set the flow percentage, which applies to all E moves.""" param_letters = "ST" - dialects = ['marlin2'] word_key = Word('M', 221) class GCodeWaitForPinState(GCodeIO): """M226: Wait for a pin to have a given state.""" param_letters = "PS" - dialects = ['marlin2'] word_key = Word('M', 226) -class GCodeTriggerCamera(GCodeIO): +class GCodeTriggerCamera(GCodeDigitalOutput): """M240: Trigger a camera shutter""" param_letters = "ABDFIJPRSXYZ" - dialects = ['marlin2'] word_key = Word('M', 240) -class GCodeLcdContrast(GCodeIO): +class GCodeLCDContrast(GCodeDigitalOutput): """M250: Set and/or get the LCD contrast.""" param_letters = "C" - dialects = ['marlin2'] word_key = Word('M', 250) -class GCodeLcdSleepBacklightTimeout(GCodeIO): +class GCodeLCDSleepBacklightTimeout(GCodeDigitalOutput): """M255: Set and/or get the LCD Sleep Timeout.""" param_letters = "S" - dialects = ['marlin2'] word_key = Word('M', 255) -class GCodeLcdBrightness(GCodeIO): +class GCodeLCDBrightness(GCodeDigitalOutput): """M256: Set and/or get the LCD brightness.""" param_letters = "B" - dialects = ['marlin2'] word_key = Word('M', 256) -class GCodeICSend(GCodeDigitalOutput): +class GCodeI2CSend(GCodeIO): """M260: Send data to the I2C bus.""" param_letters = "ABRS" - dialects = ['marlin2'] word_key = Word('M', 260) -class GCodeICRequest(GCodeIO): +class GCodeI2CRequest(GCodeIO): """M261: Request and echo bytes from the I2C bus.""" param_letters = "ABS" - dialects = ['marlin2'] word_key = Word('M', 261) class GCodeServoPosition(GCodeIO): """M280: Set or get a servo position.""" param_letters = "PS" - dialects = ['marlin2'] word_key = Word('M', 280) -class GCodeEditServoAngles(GCodeOtherModal): +class GCodeEditServoAngles(GCodeIO): """M281: Set servo deploy and/or stow angles""" param_letters = "PLU" - dialects = ['marlin2'] word_key = Word('M', 281) -class GCodeDetachServo(GCodeOtherModal): +class GCodeDetachServo(GCodeIO): """M282: Detach a servo until its next move""" param_letters = "P" - dialects = ['marlin2'] word_key = Word('M', 282) class GCodeBabystep(GCodeMotion): """M290: Babystep one or more axes""" param_letters = "XYZSP" - dialects = ['marlin2'] word_key = Word('M', 290) class GCodePlayTone(GCodeDigitalOutput): """M300: Play a single tone, buzz, or beep.""" param_letters = "PS" - dialects = ['marlin2'] word_key = Word('M', 300) -class GCodeSetHotendPid(GCodeOtherModal): +class GCodeSetHotendPID(GCodeMachineConfig): """M301: Set PID values for a hotend.""" param_letters = "EPIDCLF" - dialects = ['marlin2'] word_key = Word('M', 301) class GCodeColdExtrude(GCodeOtherModal): """M302: Set minimum extrusion temperature, allow cold extrusion.""" param_letters = "SP" - dialects = ['marlin2'] word_key = Word('M', 302) -class GCodePidAutotune(GCodeOtherModal): +class GCodePIDAutotune(GCodeCalibrationRoutines): """M303: Auto-tune the PID system to find stable values.""" param_letters = "ECSUD" - dialects = ['marlin2'] word_key = Word('M', 303) -class GCodeSetBedPid(GCodeOtherModal): +class GCodeSetBedPID(GCodeMachineConfig): """M304: Set PID values for the heated bed.""" param_letters = "PID" - dialects = ['marlin2'] word_key = Word('M', 304) -class GCodeUserThermistorParameters(GCodeOtherModal): +class GCodeUserThermistorParameters(GCodeMachineConfig): """M305: Set (or report) custom thermistor parameters""" param_letters = "PRTBC" - dialects = ['marlin2'] word_key = Word('M', 305) -class GCodeModelPredictiveTempControl(GCodeOtherModal): +class GCodeModelPredictiveTempControl(GCodeMachineConfig): """M306: Set MPC values for a hotend.""" param_letters = "ACEFHPRST" - dialects = ['marlin2'] word_key = Word('M', 306) -class GCodeSetMicroStepping(GCodeOtherModal): +class GCodeSetMicrostepping(GCodeMachineConfig): """M350: Set micro-stepping for drivers that support it""" param_letters = "BSXYZE" - dialects = ['marlin2'] word_key = Word('M', 350) -class GCodeSetMicrostepPins(GCodeOtherModal): +class GCodeSetMicrostepPins(GCodeMachineConfig): """M351: Directly set the micro-stepping pins""" param_letters = "SBXYZE" - dialects = ['marlin2'] word_key = Word('M', 351) class GCodeCaseLightControl(GCodeDigitalOutput): """M355: Turn the case light on or off, set brightness""" param_letters = "PS" - dialects = ['marlin2'] word_key = Word('M', 355) -class GCodeScaraThetaA(GCodeMotion): +class GCodeSCARAThetaA(GCodeCalibrationRoutines): """M360: Move to Theta A""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 360) -class GCodeScaraThetaB(GCodeMotion): +class GCodeSCARAThetaB(GCodeCalibrationRoutines): """M361: Move to Theta-B""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 361) -class GCodeScaraPsiA(GCodeMotion): +class GCodeSCARAPsiA(GCodeCalibrationRoutines): """M362: Move to Psi-A""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 362) -class GCodeScaraPsiB(GCodeMotion): +class GCodeSCARAPsiB(GCodeCalibrationRoutines): """M363: Move to Psi-B""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 363) -class GCodeScaraPsiC(GCodeMotion): +class GCodeSCARAPsiC(GCodeCalibrationRoutines): """M364: Move to Psi-C""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 364) class GCodeActivateSolenoid(GCodeDigitalOutput): """M380: Activate""" param_letters = "S" - dialects = ['marlin2'] word_key = Word('M', 380) class GCodeDeactivateSolenoids(GCodeDigitalOutput): """M381: Deactivate all extruder solenoids""" param_letters = "S" - dialects = ['marlin2'] word_key = Word('M', 381) -class GCodeFinishMoves(GCodeOtherModal): +class GCodeFinishMoves(GCodeNonModal): """M400: Wait for all moves to finish""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 400) class GCodeDeployProbe(GCodeDigitalOutput): """M401: Deploy the bed probe""" param_letters = "HS" - dialects = ['marlin2'] word_key = Word('M', 401) class GCodeStowProbe(GCodeDigitalOutput): """M402: Stow the bed probe""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 402) -class GCodeMmuFilamentType(GCodeOtherModal): +class GCodeMMU2FilamentType(GCodeMachineConfig): """M403: Set filament type for Multi-Material Unit 2.0""" param_letters = "EF" - dialects = ['marlin2'] word_key = Word('M', 403) -class GCodeSetFilamentDiameter(GCodeOtherModal): +class GCodeSetFilamentDiameter(GCodeMachineConfig): """M404: Set the nominal diameter for filament width sensor auto-flow""" param_letters = "W" - dialects = ['marlin2'] word_key = Word('M', 404) -class GCodeFilamentWidthSensorOn(GCodeOtherModal): +class GCodeFilamentWidthSensorOn(GCodeMachineConfig): """M405: Enable filament width sensor flow control""" param_letters = "D" - dialects = ['marlin2'] word_key = Word('M', 405) -class GCodeFilamentWidthSensorOff(GCodeOtherModal): +class GCodeFilamentWidthSensorOff(GCodeMachineConfig): """M406: Disable filament width sensor flow control""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 406) -class GCodeFilamentWidth(GCodeNonModal): +class GCodeReportFilamentWidth(GCodeMachineConfig): """M407: Report the measured filament width""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 407) -class GCodeQuickstop(GCodeOtherModal): +class GCodeQuickstop(GCodeProgramControl): """M410: Stop all steppers instantly""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 410) -class GCodeFilamentRunout(GCodeOtherModal): +class GCodeFilamentRunout(GCodeMachineConfig): """M412: Get/set filament runout detection parameters""" param_letters = "DHSR" - dialects = ['marlin2'] word_key = Word('M', 412) -class GCodePowerLossRecovery(GCodeOtherModal): +class GCodePowerlossRecovery(GCodeMachineConfig): """M413: Enable / disable power-loss recovery""" param_letters = "S" - dialects = ['marlin2'] word_key = Word('M', 413) -class GCodeBedLevelingState(GCodeNonModal): +class GCodeBedLevelingState(GCodeMachineConfig): """M420: Get and/or set bed leveling state and parameters""" param_letters = "LSVTZC" - dialects = ['marlin2'] word_key = Word('M', 420) -class GCodeSetMeshValue(GCodeOtherModal): +class GCodeSetMeshValue(GCodeMachineConfig): """M421: Set a single mesh Z height""" param_letters = "IJXYZQCN" - dialects = ['marlin2'] word_key = Word('M', 421) -class GCodeSetZMotorXy(GCodeOtherModal): +class GCodeSetZMotorXY(GCodeMachineConfig): """M422: Set a Z motor position for G34 Auto-Alignment""" param_letters = "RSWXY" - dialects = ['marlin2'] word_key = Word('M', 422) -class GCodeXTwistCompensation(GCodeOtherModal): +class GCodeXTwistCompensation(GCodeMachineConfig): """M423: Modify, reset, and report X-Axis Twist Compensation data""" param_letters = "RAIXZ" - dialects = ['marlin2'] word_key = Word('M', 423) -class GCodeBacklashCompensation(GCodeOtherModal): +class GCodeBacklashCompensation(GCodeMachineConfig): """M425: Enable and tune backlash compensation""" param_letters = "FSXYZZ" - dialects = ['marlin2'] word_key = Word('M', 425) -class GCodeHomeOffsetsHere(GCodeOtherModal): +class GCodeHomeOffsetsHere(GCodeMachineConfig): """M428: Set home offsets based on current position""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 428) -class GCodePowerMonitor(GCodeOtherModal): +class GCodePowerMonitor(GCodeNonModal): """M430: Read and display current (A), voltage (V), and power (W)""" param_letters = "IVW" - dialects = ['marlin2'] word_key = Word('M', 430) -class GCodeCancelObjects(GCodeOtherModal): +class GCodeCancelObjects(GCodeProgramControl): """M486: Identify and cancel objects""" param_letters = "CPSTU" - dialects = ['marlin2'] word_key = Word('M', 486) -class GCodeFixedTimeMotion(GCodeOtherModal): +class GCodeFixedTimeMotion(GCodePathControlMode): """M493: Enable/disable and configure Fixed-Time Motion, Linear Advance, and Input Shaping""" param_letters = "SPKDABFH" - dialects = ['marlin2'] word_key = Word('M', 493) -class GCodeSaveSettings(GCodeNonModal): +class GCodeSaveSettings(GCodeMachineConfig): """M500: Save settings to EEPROM.""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 500) -class GCodeRestoreSettings(GCodeOtherModal): +class GCodeRestoreSettings(GCodeMachineConfig): """M501: Restore settings from EEPROM.""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 501) -class GCodeFactoryReset(GCodeOtherModal): +class GCodeFactoryReset(GCodeMachineConfig): """M502: Restore all settings to factory defaults.""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 502) -class GCodeReportSettings(GCodeNonModal): +class GCodeReportSettings(GCodeMachineConfig): """M503: Report all settings that may be saved to EEPROM.""" param_letters = "SC" - dialects = ['marlin2'] word_key = Word('M', 503) -class GCodeValidateEepromContents(GCodeNonModal): +class GCodeValidateEEPROMContents(GCodeNonModal): """M504: Validate the contents of the EEPROM.""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 504) class GCodeLockMachine(GCodeOtherModal): """M510: Lock the machine if it has a passcode""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 510) class GCodeUnlockMachine(GCodeOtherModal): """M511: Unlock the machine if it has a passcode""" param_letters = "P" - dialects = ['marlin2'] word_key = Word('M', 511) -class GCodeSetPasscode(GCodeNonModal): +class GCodeSetPasscode(GCodeMachineConfig): """M512: Set a numeric passcode for locking the machine""" param_letters = "PS" - dialects = ['marlin2'] word_key = Word('M', 512) -class GCodeAbortSdPrint(GCodeOtherModal): +class GCodeAbortSDPrint(GCodeProgramControl): """M524: Abort an SD print started with [`M24`](/docs/gcode/M024.html)""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 524) -class GCodeEndstopsAbortSd(GCodeNonModal): +class GCodeEndstopsAbortSD(GCodeMachineConfig): """M540: Abort SD printing when an endstop is triggered.""" param_letters = "S" - dialects = ['marlin2'] word_key = Word('M', 540) -class GCodeSetTmcSteppingMode(GCodeOtherModal): +class GCodeSetTMCSteppingMode(GCodeMachineConfig): """M569: Toggle stealthChop""" param_letters = "XYZEIT" - dialects = ['marlin2'] word_key = Word('M', 569) -class GCodeSerialBaudRate(GCodeOtherModal): +class GCodeSerialBaudRate(GCodeMachineConfig): """M575: Change the serial baud rate""" param_letters = "PB" - dialects = ['marlin2'] word_key = Word('M', 575) -class GCodeNonlinearExtrusionControl(GCodeOtherModal): +class GCodeNonlinearExtrusionControl(GCodeMachineConfig): """M592: Get or set Nonlinear Extrusion parameters""" param_letters = "ABC" - dialects = ['marlin2'] word_key = Word('M', 592) -class GCodeZvInputShaping(GCodeOtherModal): +class GCodeZVInputShaping(GCodeCalibrationRoutines): """M593: Get or set Marlin's integrated ZV Input Shaping parameters""" param_letters = "DFXY" - dialects = ['marlin2'] word_key = Word('M', 593) -class GCodeFilamentChange(GCode): +class GCodeFilamentChange(GCodeMachineRoutines): """M600: Automatically change filament""" param_letters = "TEULXYZBR" - dialects = ['marlin2'] word_key = Word('M', 600) -class GCodeConfigureFilamentChange(GCodeOtherModal): +class GCodeConfigureFilamentChange(GCodeMachineConfig): """M603: Configure automatic filament change parameters""" param_letters = "TUL" - dialects = ['marlin2'] word_key = Word('M', 603) -class GCodeMultiNozzleMode(GCodeOtherModal): +class GCodeMultiNozzleMode(GCodeMachineConfig): """M605: Set the behavior mode for a multiple nozzle setup""" param_letters = "SXRPE" - dialects = ['marlin2'] word_key = Word('M', 605) -#class GCodeDeltaConfiguration(GCodeOtherModal): +#class GCodeDeltaConfiguration(GCodeMachineConfig): # """M665: Set delta geometry values""" # param_letters = "HLRSXYZABC" -# dialects = ['marlin2'] # word_key = Word('M', 665) -class GCodeScaraConfigurationb(GCodeOtherModal): +class GCodeSCARAConfigurationb(GCodeMachineConfig): """M665: Set SCARA geometry values""" param_letters = "SPTAXBY" - dialects = ['marlin2'] word_key = Word('M', 665) -class GCodeSetDualEndstopOffsetsb(GCodeOtherModal): +class GCodeSetDualEndstopOffsetsb(GCodeMachineConfig): """M666: Set dual endstop offsets""" param_letters = "XYZ" - dialects = ['marlin2'] word_key = Word('M', 666) -#class GCodeSetDeltaEndstopAdjustmentsa(GCodeOtherModal): +#class GCodeSetDeltaEndstopAdjustmentsa(GCodeMachineConfig): # """M666: Set Delta endstop adjustments""" # param_letters = "XYZ" -# dialects = ['marlin2'] # word_key = Word('M', 666) -class GCodeDuetSmartEffectorSensitivity(GCodeOtherModal): +class GCodeDuetSmartEffectorSensitivity(GCodeMachineConfig): """M672: Set Duet Smart Effector sensitivity""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 672) -class GCodeLoadFilament(GCodeOtherModal): +class GCodeLoadFilament(GCodeMachineRoutines): """M701: Load filament""" param_letters = "TZL" - dialects = ['marlin2'] word_key = Word('M', 701) -class GCodeUnloadFilament(GCodeOtherModal): +class GCodeUnloadFilament(GCodeMachineRoutines): """M702: Unload filament""" param_letters = "TZU" - dialects = ['marlin2'] word_key = Word('M', 702) -class GCodeControllerFanSettings(GCodeOtherModal): +class GCodeControllerFanSettings(GCodeMachineConfig): """M710: Set or report controller fan settings""" param_letters = "SIARD" - dialects = ['marlin2'] word_key = Word('M', 710) -class GCodeMaxControl(GCodeDigitalOutput): +class GCodeMAX7219Control(GCodeDigitalOutput): """M7219: Control Max7219 Segmented LEDs""" param_letters = "CDRIFPUVXY" - dialects = ['marlin2'] word_key = Word('M', 7219) -class GCodeRepeatMarker(GCodeOtherModal): +class GCodeRepeatMarker(GCodeProgramControl): """M808: Set or go to a marker for looping G-code""" param_letters = "L" - dialects = ['marlin2'] word_key = Word('M', 808) -class GCodeGCodeMacros(GCodeOtherModal): +class GCodeGcodeMacros(GCodeProgramControl): """M810, M811, M812, M813, M814, M815, M816, M817, M818, M819: Set/execute one of ten G-code macros""" param_letters = "g" - dialects = ['marlin2'] @classmethod def word_matches(cls, w): return (w.letter == 'M') and (w.value in [810, 811, 812, 813, 814, 815, 816, 817, 818, 819]) default_word = Word('M', 810) -class GCodeXyzProbeOffset(GCodeOtherModal): +class GCodeXYZProbeOffset(GCodeToolGeometry): """M851: Set the Z probe XYZ offset from nozzle""" param_letters = "XYZ" - dialects = ['marlin2'] word_key = Word('M', 851) -class GCodeBedSkewCompensation(GCodeOtherModal): +class GCodeBedSkewCompensation(GCodeMachineConfig): """M852: Misalignment in the XYZ axes.""" param_letters = "IJKS" - dialects = ['marlin2'] word_key = Word('M', 852) -class GCodeICPositionEncoders(GCodeOtherModal): +class GCodeI2CPositionEncoders(GCodeMachineConfig): """M860, M861, M862, M863, M864, M865, M866, M867, M868, M869: I2C position encoders for closed loop control""" param_letters = "IOXYZEUPSRST" - dialects = ['marlin2'] @classmethod def word_matches(cls, w): return (w.letter == 'M') and (w.value in [860, 861, 862, 863, 864, 865, 866, 867, 868, 869]) default_word = Word('M', 860) -class GCodeProbeTemperatureConfig(GCodeOtherModal): +class GCodeProbeTemperatureConfig(GCodeMachineConfig): """M871: Configure probe temperature compensation""" param_letters = "VIBPER" - dialects = ['marlin2'] word_key = Word('M', 871) -class GCodeHandlePromptResponse(GCode): +class GCodeHandlePromptResponse(GCodeMachineConfig): """M876: Handle Host prompt responses""" param_letters = "S" - dialects = ['marlin2'] word_key = Word('M', 876) -class GCodeLinearAdvanceFactor(GCodeOtherModal): +class GCodeLinearAdvanceFactor(GCodeMachineConfig): """M900: Get and set Linear Advance K value""" param_letters = "KLST" - dialects = ['marlin2'] word_key = Word('M', 900) -class GCodeStepperMotorCurrent(GCodeOtherModal): +class GCodeTrinamicStepperMotorCurrent(GCodeMachineConfig): """M906: Set the motor current (in milliamps)""" param_letters = "EITXYZ" - dialects = ['marlin2'] word_key = Word('M', 906) -class GCodeSetMotorCurrent(GCodeOtherModal): +class GCodeTrimpotStepperMotorCurrent(GCodeMachineConfig): """M907: Set motor current via digital trimpot""" param_letters = "BCDESXYZ" - dialects = ['marlin2'] word_key = Word('M', 907) -class GCodeSetTrimpotPins(GCodeOtherModal): +class GCodeSetTrimpotPins(GCodeMachineConfig): """M908: Set a digital trimpot directly""" param_letters = "PS" - dialects = ['marlin2'] word_key = Word('M', 908) -class GCodeDacPrintValues(GCodeNonModal): +class GCodeReportDACStepperCurrent(GCodeMachineState): """M909: Report DAC current values to host""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 909) -class GCodeCommitDacToEeprom(GCodeNonModal): +class GCodeCommitDACToEEPROM(GCodeMachineState): """M910: Commit digipot/DAC value to external EEPROM""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 910) -class GCodeTmcOtPreWarnCondition(GCode): +class GCodeTMCOTPreWarnCondition(GCodeMachineState): """M911: Driver overtemperature pre-warn condition""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 911) -class GCodeClearTmcOtPreWarn(GCode): +class GCodeClearTMCOTPreWarn(GCodeMachineState): """M912: Clear overtemperature pre-warn condition flag""" param_letters = "IXYZE" - dialects = ['marlin2'] word_key = Word('M', 912) -class GCodeSetHybridThresholdSpeed(GCodeOtherModal): +class GCodeSetHybridThresholdSpeed(GCodeMachineConfig): """M913: TMC driver switching to spreadCycle""" param_letters = "ITXYZE" - dialects = ['marlin2'] word_key = Word('M', 913) -class GCodeTmcBumpSensitivity(GCodeOtherModal): +class GCodeTMCBumpSensitivity(GCodeMachineConfig): """M914: Set sensorless homing sensitivity""" param_letters = "IXYZ" - dialects = ['marlin2'] word_key = Word('M', 914) -class GCodeTmcZAxisCalibration(GCode): +class GCodeTMCZAxisCalibration(GCodeCalibrationRoutines): """M915: Align ends of the Z axis and test torque""" param_letters = "SZ" - dialects = ['marlin2'] word_key = Word('M', 915) -class GCodeLThermalWarningTest(GCode): +class GCodeL6474ThermalWarningTest(GCodeCalibrationRoutines): """M916: Find L6474 drive level (KVAL_HOLD) threshold""" param_letters = "JXYZEFTKD" - dialects = ['marlin2'] word_key = Word('M', 916) -class GCodeLOvercurrentWarningTest(GCode): +class GCodeL6474OvercurrentWarningTest(GCodeCalibrationRoutines): """M917: Find L6474 minimum current thresholds""" param_letters = "JXYZEFITK" - dialects = ['marlin2'] word_key = Word('M', 917) -class GCodeLSpeedWarningTest(GCode): +class GCodeL6474SpeedWarningTest(GCodeCalibrationRoutines): """M918: Find L6474 speed threshold""" param_letters = "JXYZEITKM" - dialects = ['marlin2'] word_key = Word('M', 918) -class GCodeTmcChopperTiming(GCodeOtherModal): +class GCodeTMCChopperTiming(GCodeMachineConfig): """M919: Set Chopper Timing values for TMC stepper drivers""" param_letters = "OPSITXYZABCUVW" - dialects = ['marlin2'] word_key = Word('M', 919) -class GCodeStartSdLogging(GCodeIO): +class GCodeStartSDLogging(GCodeIO): """M928: Log serial input to an SD file""" param_letters = "e" - dialects = ['marlin2'] word_key = Word('M', 928) -class GCodeMagneticParkingExtruder(GCodeOtherModal): +class GCodeMagneticParkingExtruder(GCodeMachineConfig): """M951: Set / report Magnetic Parking Extruder settings""" param_letters = "LRIJHDC" - dialects = ['marlin2'] word_key = Word('M', 951) -class GCodeBackUpFlashSettingsToSd(GCodeIO): +class GCodeBackUpFlashSettingsToSD(GCodeIO): """M993: Create a backup of SPI Flash to SD""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 993) -class GCodeRestoreFlashFromSd(GCodeIO): +class GCodeRestoreFlashFromSD(GCodeIO): """M994: Restore a backup from SD to SPI Flash""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 994) class GCodeTouchScreenCalibration(GCodeIO): """M995: Touch screen calibration for TFT display""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 995) -class GCodeFirmwareUpdate(GCode): +class GCodeFirmwareUpdate(GCodeMachineConfig): """M997: Perform in-application firmware update""" param_letters = "" - dialects = ['marlin2'] word_key = Word('M', 997) -class GCodeStopRestart(GCodeOtherModal): +class GCodeSTOPRestart(GCodeOtherModal): """M999: Return the machine to Running state""" param_letters = "S" - dialects = ['marlin2'] word_key = Word('M', 999) class GCodeSelectOrReportTool(GCodeOtherModal): """T0, T1, T2, T3, T4, T5, T6, T7: Set or report the current extruder or other tool""" param_letters = "FS" - dialects = ['marlin2'] @classmethod def word_matches(cls, w): return (w.letter == 'T') and (w.value in [0, 1, 2, 3, 4, 5, 6, 7]) default_word = Word('T', 0) -class GCodeMmuSpecialCommands(GCode): +class GCodeMMU2SpecialCommands(GCodeOtherModal): """'T?', Tc, Tx: MMU2 special filament loading commands""" param_letters = "" - dialects = ['marlin2'] @classmethod def word_matches(cls, w): diff --git a/src/pygcode/gcodes_prusa.py b/src/pygcode/gcodes_prusa.py index e9a3b02..4436df1 100644 --- a/src/pygcode/gcodes_prusa.py +++ b/src/pygcode/gcodes_prusa.py @@ -1,6 +1,6 @@ from .gcodes_base import * -from .gcodes_legacy import * +from .gcodes_linuxcnc import * # ======================= Prusa ======================= # CODE PARAMETERS DESCRIPTION diff --git a/src/pygcode/machine.py b/src/pygcode/machine.py index 7b61899..5a29689 100644 --- a/src/pygcode/machine.py +++ b/src/pygcode/machine.py @@ -27,7 +27,7 @@ match get_default_dialect(): GCodeMillimeterUnits as GCodeUseMillimeters, ) case _: - from .gcodes_legacy import ( + from .gcodes_linuxcnc import ( GCodeIncrementalDistanceMode, GCodeUseInches, GCodeUseMillimeters, ) diff --git a/src/pygcode/tools/marlin_parse_MarlinDocumentation.py b/src/pygcode/tools/marlin_parse_MarlinDocumentation.py index a2d59e1..b1bd338 100755 --- a/src/pygcode/tools/marlin_parse_MarlinDocumentation.py +++ b/src/pygcode/tools/marlin_parse_MarlinDocumentation.py @@ -10,50 +10,50 @@ class_types = { # unused: GCodePathControlMode # unused: GCodeProgramControl 'g000': 'GCodeMotion', # LinearMove - 'g002': 'GCodeArcMove', # ArcOrCircleMove + 'g002': 'GCodeArcMove', # GCodeMotion > ArcOrCircleMove 'g004': 'GCode', # Dwell - 'g005': 'GCodeMotion', # BzierCubicSpline + 'g005': 'GCodeMotion', # BezierCubicSpline 'g006': 'GCodeMotion', # DirectStepperMove - 'g010': 'GCode', # Retract - 'g011': 'GCode', # Recover - 'g012': 'GCodeMotion', # CleanTheNozzle + 'g010': 'GCodeMachineRoutines', # Retract + 'g011': 'GCodeMachineRoutines', # Recover + 'g012': 'GCodeMachineRoutines', # CleanTheNozzle 'g017': 'GCodePlaneSelect', # CncWorkspacePlanes 'g020': 'GCodeUnit', # InchUnits 'g021': 'GCodeUnit', # MillimeterUnits - 'g026': 'GCodeMotion', # MeshValidationPattern - 'g027': 'GCodeMotion', # ParkToolhead - 'g028': 'GCodeMotion', # AutoHome - 'g029': 'GCodeMotion', # BedLeveling - 'g029g1': 'GCodeMotion', # BedLevelingPoint - 'g029m2': 'GCodeMotion', # BedLevelingBilinear - 'g029g2': 'GCodeMotion', # BedLevelingLinear - 'g029m1': 'GCodeMotion', # BedLevelingManual - 'g029m3': 'GCodeMotion', # BedLevelingUnified - 'g030': 'GCodeMotion', # SingleZProbe - 'g031': 'GCodeMotion', # DockSled - 'g032': 'GCodeMotion', # UndockSled - 'g033': 'GCodeMotion', # DeltaAutoCalibration - 'g034b': 'GCodeMotion', # MechanicalGantryCalibration - 'g034a': 'GCodeMotion', # ZSteppersAutoAlignment - 'g035': 'GCodeMotion', # TrammingAssistant - 'g038': 'GCodeMotion', # ProbeTarget - 'g042': 'GCodeSelectCoordinateSystem', # MoveToMeshCoordinate - 'g053': 'GCodeSelectCoordinateSystem', # MoveInMachineCoordinates + 'g026': 'GCodeAssistedRoutines', # MeshValidationPattern + 'g027': 'GCodeMachineRoutines', # ParkToolhead + 'g028': 'GCodeMachineRoutines', # AutoHome + 'g029': 'GCodeMachineRoutines', # BedLeveling + 'g029g1': 'GCodeMachineRoutines', # BedLevelingPoint + 'g029m2': 'GCodeMachineRoutines', # BedLevelingBilinear + 'g029g2': 'GCodeMachineRoutines', # BedLevelingLinear + 'g029m1': 'GCodeMachineRoutines', # BedLevelingManual + 'g029m3': 'GCodeMachineRoutines', # BedLevelingUnified + 'g030': 'GCodeMachineRoutines', # SingleZProbe + 'g031': 'GCodeMachineRoutines', # DockSled + 'g032': 'GCodeMachineRoutines', # UndockSled + 'g033': 'GCodeMachineRoutines', # DeltaAutoCalibration + 'g034b': 'GCodeMachineRoutines', # MechanicalGantryCalibration + 'g034a': 'GCodeMachineRoutines', # ZSteppersAutoAlignment + 'g035': 'GCodeAssistedRoutines', # TrammingAssistant + 'g038': 'GCodeMachineRoutines', # ProbeTarget + 'g042': 'GCodeMotion', # MoveToMeshCoordinate + 'g053': 'GCodeMotion', # MoveInMachineCoordinates 'g054': 'GCodeSelectCoordinateSystem', # WorkspaceCoordinateSystem - 'g060': 'GCode', # SaveCurrentPosition + 'g060': 'GCodeOtherModal', # SaveCurrentPosition 'g061': 'GCodeMotion', # ReturnToSavedPosition - 'g076': 'GCodeOtherModal', # ProbeTemperatureCalibration - 'g080': 'GCode', # CancelCurrentMotionMode + 'g076': 'GCodeMachineRoutines', # ProbeTemperatureCalibration + 'g080': 'GCodeOtherModal', # CancelCurrentMotionMode 'g090': 'GCodeOtherModal', # AbsolutePositioning 'g091': 'GCodeOtherModal', # RelativePositioning 'g092': 'GCodeOtherModal', # SetPosition - 'g425': 'GCodeOtherModal', # BacklashCalibration - 'm0000': 'GCodeOtherModal', # UnconditionalStop - 'm0003': 'GCodeSpindle', # SpindleCwLaserOn - 'm0004': 'GCodeSpindle', # SpindleCcwLaserOn - 'm0005': 'GCodeSpindle', # SpindleLaserOff - 'm0007': 'GCodeCoolant', # CoolantControls - 'm0010': 'GCodeDigitalOutput', # VacuumBlowerControl + 'g425': 'GCodeMachineRoutines', # BacklashCalibration + 'm0000': 'GCodeProgramControl', # UnconditionalStop + 'm0003': 'GCodeToolState', # SpindleCwLaserOn + 'm0004': 'GCodeToolState', # SpindleCcwLaserOn + 'm0005': 'GCodeToolState', # SpindleLaserOff + 'm0007': 'GCodeCoolantHeaters', # CoolantControls + 'm0010': 'GCodeIO', # VacuumBlowerControl 'm0016': 'GCodeOtherModal', # ExpectedPrinterCheck 'm0017': 'GCodeOtherModal', # EnableSteppers 'm0018': 'GCodeOtherModal', # DisableSteppers @@ -61,26 +61,26 @@ class_types = { 'm0021': 'GCodeIO', # InitSdCard 'm0022': 'GCodeIO', # ReleaseSdCard 'm0023': 'GCodeIO', # SelectSdFile - 'm0024': 'GCodeOtherModal', # StartOrResumeSdPrint - 'm0025': 'GCodeOtherModal', # PauseSdPrint - 'm0026': 'GCodeIO', # SetSdPosition - 'm0027': 'GCodeNonModal', # ReportSdPrintStatus + 'm0024': 'GCodeProgramControl', # StartOrResumeSdPrint + 'm0025': 'GCodeProgramControl', # PauseSdPrint + 'm0026': 'GCodeProgramControl', # SetSdPosition + 'm0027': 'GCodeMachineState', # ReportSdPrintStatus 'm0028': 'GCodeIO', # StartSdWrite 'm0029': 'GCodeIO', # StopSdWrite 'm0030': 'GCodeIO', # DeleteSdFile - 'm0031': 'GCode', # PrintTime - 'm0032': 'GCodeIO', # SelectAndStart + 'm0031': 'GCodeMachineState', # ReportPrintTime + 'm0032': 'GCodeProgramControl', # SelectAndStart 'm0033': 'GCodeIO', # GetLongPath 'm0034': 'GCodeIO', # SdcardSorting - 'm0042': 'GCodeDigitalOutput', # SetPinState + 'm0042': 'GCodeIO', # SetPinState 'm0043': 'GCodeIO', # DebugPins - 'm0043b': 'GCodeDigitalOutput', # TogglePins - 'm0048': 'GCodeMotion', # ProbeRepeatabilityTest - 'm0073': 'GCode', # SetPrintProgress - 'm0075': 'GCodeOtherModal', # StartPrintJobTimer - 'm0076': 'GCodeOtherModal', # PausePrintJobTimer - 'm0077': 'GCodeOtherModal', # StopPrintJobTimer - 'm0078': 'GCode', # PrintJobStats + 'm0043b': 'GCodeIO', # TogglePins + 'm0048': 'GCodeMachineRoutines', # ProbeRepeatabilityTest + 'm0073': 'GCodeNonModal', # SetPrintProgress + 'm0075': 'GCodeProgramControl', # StartPrintJobTimer + 'm0076': 'GCodeProgramControl', # PausePrintJobTimer + 'm0077': 'GCodeProgramControl', # StopPrintJobTimer + 'm0078': 'GCodeMachineState', # PrintJobStats 'm0080': 'GCodeOtherModal', # PowerOn 'm0081': 'GCodeOtherModal', # PowerOff 'm0082': 'GCodeOtherModal', # EAbsolute @@ -88,168 +88,168 @@ class_types = { 'm0085': 'GCodeOtherModal', # InactivityShutdown 'm0086': 'GCodeOtherModal', # HotendIdleTimeout 'm0087': 'GCodeOtherModal', # DisableHotendIdleTimeout - 'm0092': 'GCodeUnit', # SetAxisStepsPerUnit - 'm0100': 'GCodeNonModal', # FreeMemory - 'm0102': 'GCodeOtherModal', # ConfigureBedDistanceSensor - 'm0104': 'GCodeOtherModal', # SetHotendTemperature - 'm0105': 'GCodeNonModal', # ReportTemperatures - 'm0106': 'GCodeDigitalOutput', # SetFanSpeed - 'm0107': 'GCodeDigitalOutput', # FanOff - 'm0108': 'GCodeOtherModal', # BreakAndContinue - 'm0109': 'GCode', # WaitForHotendTemperature + 'm0092': 'GCodeOtherModal', # SetAxisStepsPerUnit + 'm0100': 'GCodeMachineState', # FreeMemory + 'm0102': 'GCodeMachineRoutines', # ConfigureBedDistanceSensor + 'm0104': 'GCodeToolState', # SetHotendTemperature + 'm0105': 'GCodeMachineState', # ReportTemperatures + 'm0106': 'GCodeCoolantHeaters', # SetFanSpeed + 'm0107': 'GCodeCoolantHeaters', # FanOff + 'm0108': 'GCodeProgramControl', # BreakAndContinue + 'm0109': 'GCodeToolState', # WaitForHotendTemperature 'm0110': 'GCodeOtherModal', # SetLineNumber 'm0111': 'GCodeOtherModal', # DebugLevel 'm0112': 'GCodeOtherModal', # FullShutdown - 'm0113': 'GCode', # HostKeepalive - 'm0114': 'GCodeNonModal', # GetCurrentPosition - 'm0115': 'GCodeNonModal', # FirmwareInfo - 'm0117': 'GCodeIO', # SetLcdMessage - 'm0118': 'GCodeIO', # SerialPrint - 'm0119': 'GCodeIO', # EndstopStates - 'm0120': 'GCodeIO', # EnableEndstops - 'm0121': 'GCodeIO', # DisableEndstops - 'm0122': 'GCodeIO', # TmcDebugging - 'm0123': 'GCodeIO', # FanTachometers - 'm0125': 'GCodeMotion', # ParkHead - 'm0126': 'GCodeDigitalOutput', # BaricudaOpen - 'm0127': 'GCodeDigitalOutput', # BaricudaClose - 'm0128': 'GCodeDigitalOutput', # BaricudaOpen - 'm0129': 'GCodeDigitalOutput', # BaricudaClose - 'm0140': 'GCodeOtherModal', # SetBedTemperature - 'm0141': 'GCodeOtherModal', # SetChamberTemperature - 'm0143': 'GCodeCoolant', # SetLaserCoolerTemperature - 'm0145': 'GCodeOtherModal', # SetMaterialPreset + 'm0113': 'GCodeMachineState', # HostKeepalive + 'm0114': 'GCodeMachineState', # GetCurrentPosition + 'm0115': 'GCodeMachineState', # FirmwareInfo + 'm0117': 'GCodeMachineState', # SetLcdMessage + 'm0118': 'GCodeMachineState', # SerialPrint + 'm0119': 'GCodeMachineState', # EndstopStates + 'm0120': 'GCodeOtherModal', # EnableEndstops + 'm0121': 'GCodeOtherModal', # DisableEndstops + 'm0122': 'GCodeMachineState', # TmcDebugging + 'm0123': 'GCodeMachineState', # FanTachometers + 'm0125': 'GCodeMachineRoutines', # ParkHead + 'm0126': 'GCodeDigitalOutput', # Baricuda1Open + 'm0127': 'GCodeDigitalOutput', # Baricuda1Close + 'm0128': 'GCodeDigitalOutput', # Baricuda2Open + 'm0129': 'GCodeDigitalOutput', # Baricuda2Close + 'm0140': 'GCodeCoolantHeaters', # SetBedTemperature + 'm0141': 'GCodeCoolantHeaters', # SetChamberTemperature + 'm0143': 'GCodeCoolantHeaters', # SetLaserCoolerTemperature + 'm0145': 'GCodeNonModal', # SetMaterialPreset 'm0149': 'GCodeUnit', # SetTemperatureUnits 'm0150': 'GCodeDigitalOutput', # SetRgbWColor 'm0154': 'GCodeNonModal', # PositionAutoReport - 'm0155': 'GCodeNonModal', # TemperatureAutoReport + 'm0155': 'GCodeMachineState', # TemperatureAutoReport 'm0163': 'GCodeOtherModal', # SetMixFactor 'm0164': 'GCodeOtherModal', # SaveMix 'm0165': 'GCodeOtherModal', # SetMix 'm0166': 'GCodeOtherModal', # GradientMix - 'm0190': 'GCode', # WaitForBedTemperature - 'm0191': 'GCode', # WaitForChamberTemperature - 'm0192': 'GCode', # WaitForProbeTemperature - 'm0193': 'GCodeCoolant', # SetLaserCoolerTemperature + 'm0190': 'GCodeCoolantHeaters', # WaitForBedTemperature + 'm0191': 'GCodeCoolantHeaters', # WaitForChamberTemperature + 'm0192': 'GCodeToolState', # WaitForProbeTemperature + 'm0193': 'GCodeCoolantHeaters', # SetLaserCoolerTemperature 'm0200': 'GCodeOtherModal', # SetFilamentDiameter - 'm0201': 'GCodeNonModal', # PrintTravelMoveLimits - 'm0203': 'GCodeFeedRateMode', # SetMaxFeedrate - 'm0204': 'GCodeOtherModal', # SetStartingAcceleration - 'm0205': 'GCodeOtherModal', # SetAdvancedSettings - 'm0206': 'GCodeOtherModal', # SetHomeOffsets - 'm0207': 'GCodeOtherModal', # SetFirmwareRetraction - 'm0208': 'GCodeOtherModal', # FirmwareRecover - 'm0209': 'GCodeOtherModal', # SetAutoRetract + 'm0201': 'GCodePathControlMode', # PrintTravelMoveLimits + 'm0203': 'GCodePathControlMode', # SetMaxFeedrate + 'm0204': 'GCodePathControlMode', # SetStartingAcceleration + 'm0205': 'GCodePathControlMode', # SetAdvancedSettings + 'm0206': 'GCodeMachineConfig', # SetHomeOffsets + 'm0207': 'GCodeMachineConfig', # FirmwareRetractionSettings + 'm0208': 'GCodeMachineConfig', # FirmwareRecoverSettings + 'm0209': 'GCodeMachineConfig', # SetAutoRetract 'm0211': 'GCodeOtherModal', # SoftwareEndstops - 'm0217': 'GCodeOtherModal', # FilamentSwapParameters - 'm0218': 'GCodeOtherModal', # SetHotendOffset + 'm0217': 'GCodeMachineConfig', # FilamentSwapParameters + 'm0218': 'GCodeToolGeometry', # SetHotendOffset 'm0220': 'GCodeFeedRateMode', # SetFeedratePercentage - 'm0221': 'GCodeOtherModal', # SetFlowPercentage + 'm0221': 'GCodeFeedRateMode', # SetFlowPercentage 'm0226': 'GCodeIO', # WaitForPinState - 'm0240': 'GCodeIO', # TriggerCamera - 'm0250': 'GCodeIO', # LcdContrast - 'm0255': 'GCodeIO', # LcdSleepBacklightTimeout - 'm0256': 'GCodeIO', # LcdBrightness - 'm0260': 'GCodeDigitalOutput', # ICSend - 'm0261': 'GCodeIO', # ICRequest + 'm0240': 'GCodeDigitalOutput', # TriggerCamera + 'm0250': 'GCodeDigitalOutput', # LcdContrast + 'm0255': 'GCodeDigitalOutput', # LcdSleepBacklightTimeout + 'm0256': 'GCodeDigitalOutput', # LcdBrightness + 'm0260': 'GCodeIO', # I2CSend + 'm0261': 'GCodeIO', # I2CRequest 'm0280': 'GCodeIO', # ServoPosition - 'm0281': 'GCodeOtherModal', # EditServoAngles - 'm0282': 'GCodeOtherModal', # DetachServo + 'm0281': 'GCodeIO', # EditServoAngles + 'm0282': 'GCodeIO', # DetachServo 'm0290': 'GCodeMotion', # Babystep 'm0300': 'GCodeDigitalOutput', # PlayTone - 'm0301': 'GCodeOtherModal', # SetHotendPid + 'm0301': 'GCodeMachineConfig', # SetHotendPid 'm0302': 'GCodeOtherModal', # ColdExtrude - 'm0303': 'GCodeOtherModal', # PidAutotune - 'm0304': 'GCodeOtherModal', # SetBedPid - 'm0305': 'GCodeOtherModal', # UserThermistorParameters - 'm0306': 'GCodeOtherModal', # ModelPredictiveTempControl - 'm0350': 'GCodeOtherModal', # SetMicroStepping - 'm0351': 'GCodeOtherModal', # SetMicrostepPins + 'm0303': 'GCodeCalibrationRoutines', # PidAutotune + 'm0304': 'GCodeMachineConfig', # SetBedPid + 'm0305': 'GCodeMachineConfig', # UserThermistorParameters + 'm0306': 'GCodeMachineConfig', # ModelPredictiveTempControl + 'm0350': 'GCodeMachineConfig', # SetMicroStepping + 'm0351': 'GCodeMachineConfig', # SetMicrostepPins 'm0355': 'GCodeDigitalOutput', # CaseLightControl - 'm0360': 'GCodeMotion', # ScaraThetaA - 'm0361': 'GCodeMotion', # ScaraThetaB - 'm0362': 'GCodeMotion', # ScaraPsiA - 'm0363': 'GCodeMotion', # ScaraPsiB - 'm0364': 'GCodeMotion', # ScaraPsiC + 'm0360': 'GCodeCalibrationRoutines', # ScaraThetaA + 'm0361': 'GCodeCalibrationRoutines', # ScaraThetaB + 'm0362': 'GCodeCalibrationRoutines', # ScaraPsiA + 'm0363': 'GCodeCalibrationRoutines', # ScaraPsiB + 'm0364': 'GCodeCalibrationRoutines', # ScaraPsiC 'm0380': 'GCodeDigitalOutput', # ActivateSolenoid 'm0381': 'GCodeDigitalOutput', # DeactivateSolenoids - 'm0400': 'GCodeOtherModal', # FinishMoves + 'm0400': 'GCodeNonModal', # FinishMoves 'm0401': 'GCodeDigitalOutput', # DeployProbe 'm0402': 'GCodeDigitalOutput', # StowProbe - 'm0403': 'GCodeOtherModal', # MmuFilamentType - 'm0404': 'GCodeOtherModal', # SetFilamentDiameter - 'm0405': 'GCodeOtherModal', # FilamentWidthSensorOn - 'm0406': 'GCodeOtherModal', # FilamentWidthSensorOff - 'm0407': 'GCodeNonModal', # FilamentWidth - 'm0410': 'GCodeOtherModal', # Quickstop - 'm0412': 'GCodeOtherModal', # FilamentRunout - 'm0413': 'GCodeOtherModal', # PowerLossRecovery - 'm0420': 'GCodeNonModal', # BedLevelingState - 'm0421': 'GCodeOtherModal', # SetMeshValue - 'm0422': 'GCodeOtherModal', # SetZMotorXy - 'm0423': 'GCodeOtherModal', # XTwistCompensation - 'm0425': 'GCodeOtherModal', # BacklashCompensation - 'm0428': 'GCodeOtherModal', # HomeOffsetsHere - 'm0430': 'GCodeOtherModal', # PowerMonitor - 'm0486': 'GCodeOtherModal', # CancelObjects - 'm0493': 'GCodeOtherModal', # FixedTimeMotion - 'm0500': 'GCodeNonModal', # SaveSettings - 'm0501': 'GCodeOtherModal', # RestoreSettings - 'm0502': 'GCodeOtherModal', # FactoryReset - 'm0503': 'GCodeNonModal', # ReportSettings + 'm0403': 'GCodeMachineConfig', # Mmu2FilamentType + 'm0404': 'GCodeMachineConfig', # SetFilamentDiameter + 'm0405': 'GCodeMachineConfig', # FilamentWidthSensorOn + 'm0406': 'GCodeMachineConfig', # FilamentWidthSensorOff + 'm0407': 'GCodeMachineConfig', # FilamentWidth + 'm0410': 'GCodeProgramControl', # Quickstop + 'm0412': 'GCodeMachineConfig', # FilamentRunout + 'm0413': 'GCodeMachineConfig', # PowerLossRecovery + 'm0420': 'GCodeMachineConfig', # BedLevelingState + 'm0421': 'GCodeMachineConfig', # SetMeshValue + 'm0422': 'GCodeMachineConfig', # SetZMotorXy + 'm0423': 'GCodeMachineConfig', # XTwistCompensation + 'm0425': 'GCodeMachineConfig', # BacklashCompensation + 'm0428': 'GCodeMachineConfig', # HomeOffsetsHere + 'm0430': 'GCodeNonModal', # PowerMonitor + 'm0486': 'GCodeProgramControl', # CancelObjects + 'm0493': 'GCodePathControlMode', # FixedTimeMotion + 'm0500': 'GCodeMachineConfig', # SaveSettings + 'm0501': 'GCodeMachineConfig', # RestoreSettings + 'm0502': 'GCodeMachineConfig', # FactoryReset + 'm0503': 'GCodeMachineConfig', # ReportSettings 'm0504': 'GCodeNonModal', # ValidateEepromContents 'm0510': 'GCodeOtherModal', # LockMachine 'm0511': 'GCodeOtherModal', # UnlockMachine - 'm0512': 'GCodeNonModal', # SetPasscode - 'm0524': 'GCodeOtherModal', # AbortSdPrint - 'm0540': 'GCodeNonModal', # EndstopsAbortSd - 'm0569': 'GCodeOtherModal', # SetTmcSteppingMode - 'm0575': 'GCodeOtherModal', # SerialBaudRate - 'm0592': 'GCodeOtherModal', # NonlinearExtrusionControl - 'm0593': 'GCodeOtherModal', # ZvInputShaping - 'm0600': 'GCode', # FilamentChange - 'm0603': 'GCodeOtherModal', # ConfigureFilamentChange - 'm0605': 'GCodeOtherModal', # MultiNozzleMode - 'm0665': 'GCodeOtherModal', # DeltaConfiguration - 'm0665b': 'GCodeOtherModal', # ScaraConfiguration - 'm0666b': 'GCodeOtherModal', # SetDualEndstopOffsets - 'm0666a': 'GCodeOtherModal', # SetDeltaEndstopAdjustments - 'm0672': 'GCodeOtherModal', # DuetSmartEffectorSensitivity - 'm0701': 'GCodeOtherModal', # LoadFilament - 'm0702': 'GCodeOtherModal', # UnloadFilament - 'm0710': 'GCodeOtherModal', # ControllerFanSettings - 'm7219': 'GCodeDigitalOutput', # MaxControl - 'm0808': 'GCodeOtherModal', # RepeatMarker - 'm0810': 'GCodeOtherModal', # GCodeMacros - 'm0851': 'GCodeOtherModal', # XyzProbeOffset - 'm0852': 'GCodeOtherModal', # BedSkewCompensation - 'm0860': 'GCodeOtherModal', # ICPositionEncoders - 'm0871': 'GCodeOtherModal', # ProbeTemperatureConfig - 'm0876': 'GCode', # HandlePromptResponse - 'm0900': 'GCodeOtherModal', # LinearAdvanceFactor - 'm0906': 'GCodeOtherModal', # StepperMotorCurrent - 'm0907': 'GCodeOtherModal', # SetMotorCurrent - 'm0908': 'GCodeOtherModal', # SetTrimpotPins - 'm0909': 'GCodeNonModal', # DacPrintValues - 'm0910': 'GCodeNonModal', # CommitDacToEeprom - 'm0911': 'GCode', # TmcOtPreWarnCondition - 'm0912': 'GCode', # ClearTmcOtPreWarn - 'm0913': 'GCodeOtherModal', # SetHybridThresholdSpeed - 'm0914': 'GCodeOtherModal', # TmcBumpSensitivity - 'm0915': 'GCode', # TmcZAxisCalibration - 'm0916': 'GCode', # LThermalWarningTest - 'm0917': 'GCode', # LOvercurrentWarningTest - 'm0918': 'GCode', # LSpeedWarningTest - 'm0919': 'GCodeOtherModal', # TmcChopperTiming + 'm0512': 'GCodeMachineConfig', # SetPasscode + 'm0524': 'GCodeProgramControl', # AbortSdPrint + 'm0540': 'GCodeMachineConfig', # EndstopsAbortSd + 'm0569': 'GCodeMachineConfig', # SetTmcSteppingMode + 'm0575': 'GCodeMachineConfig', # SerialBaudRate + 'm0592': 'GCodeMachineConfig', # NonlinearExtrusionControl + 'm0593': 'GCodeCalibrationRoutines', # ZvInputShaping + 'm0600': 'GCodeMachineRoutines', # FilamentChange + 'm0603': 'GCodeMachineConfig', # ConfigureFilamentChange + 'm0605': 'GCodeMachineConfig', # MultiNozzleMode + 'm0665': 'GCodeMachineConfig', # DeltaConfiguration + 'm0665b': 'GCodeMachineConfig', # ScaraConfiguration + 'm0666b': 'GCodeMachineConfig', # SetDualEndstopOffsets + 'm0666a': 'GCodeMachineConfig', # SetDeltaEndstopAdjustments + 'm0672': 'GCodeMachineConfig', # DuetSmartEffectorSensitivity + 'm0701': 'GCodeMachineRoutines', # LoadFilament + 'm0702': 'GCodeMachineRoutines', # UnloadFilament + 'm0710': 'GCodeMachineConfig', # ControllerFanSettings + 'm7219': 'GCodeDigitalOutput', # MAX7219Control + 'm0808': 'GCodeProgramControl', # RepeatMarker + 'm0810': 'GCodeProgramControl', # GCodeMacros + 'm0851': 'GCodeToolGeometry', # XyzProbeOffset + 'm0852': 'GCodeMachineConfig', # BedSkewCompensation + 'm0860': 'GCodeMachineConfig', # I2CPositionEncoders + 'm0871': 'GCodeMachineConfig', # ProbeTemperatureConfig + 'm0876': 'GCodeMachineConfig', # HandlePromptResponse + 'm0900': 'GCodeMachineConfig', # LinearAdvanceFactor + 'm0906': 'GCodeMachineConfig', # TrinamicStepperMotorCurrent + 'm0907': 'GCodeMachineConfig', # TrimpotStepperMotorCurrent + 'm0908': 'GCodeMachineConfig', # SetTrimpotPins + 'm0909': 'GCodeMachineState', # ReportDacStepperCurrent + 'm0910': 'GCodeMachineState', # CommitDacToEeprom + 'm0911': 'GCodeMachineState', # TmcOtPreWarnCondition + 'm0912': 'GCodeMachineState', # ClearTmcOtPreWarn + 'm0913': 'GCodeMachineConfig', # SetHybridThresholdSpeed + 'm0914': 'GCodeMachineConfig', # TmcBumpSensitivity + 'm0915': 'GCodeCalibrationRoutines', # TmcZAxisCalibration + 'm0916': 'GCodeCalibrationRoutines', # L6474ThermalWarningTest + 'm0917': 'GCodeCalibrationRoutines', # L6474OvercurrentWarningTest + 'm0918': 'GCodeCalibrationRoutines', # L6474SpeedWarningTest + 'm0919': 'GCodeMachineConfig', # TmcChopperTiming 'm0928': 'GCodeIO', # StartSdLogging - 'm0951': 'GCodeOtherModal', # MagneticParkingExtruder + 'm0951': 'GCodeMachineConfig', # MagneticParkingExtruder 'm0993': 'GCodeIO', # BackUpFlashSettingsToSd 'm0994': 'GCodeIO', # RestoreFlashFromSd 'm0995': 'GCodeIO', # TouchScreenCalibration - 'm0997': 'GCode', # FirmwareUpdate + 'm0997': 'GCodeMachineConfig', # FirmwareUpdate 'm0999': 'GCodeOtherModal', # StopRestart 't0000': 'GCodeOtherModal', # SelectOrReportTool - 't0001': 'GCode', # MmuSpecialCommands + 't0001': 'GCodeOtherModal', # MmuSpecialCommands } extra_attributes = { @@ -257,8 +257,13 @@ extra_attributes = { 'g021': ['unit_id = 1'], # MillimeterUnits } +valid_chars = ascii_letters + '_' + ''.join(str(i) for i in range(10)) + def sanitize(string): - return ''.join([char if char in ascii_letters else '' for char in string]) + """ clean a string so it's suitable to act as a class name + NOTE: does not replace accented characters by their closest equivalent """ + x = lambda w: w[0].upper() + w[1:] + return ''.join([char if char in valid_chars else '' for char in ''.join([x(word) for word in string.split(' ')])]) def code_val(string): try: @@ -291,7 +296,7 @@ def extract_data(filename): code = int(code) elif line.startswith('title: '): title = line[7:].rstrip() - class_name = sanitize(title.title()) + class_name = sanitize(title) elif line.startswith('codes: '): codes = line[8:-2].replace(' ','').split(',') elif line.startswith('brief: '): @@ -305,7 +310,6 @@ def extract_data(filename): out += f'''class {comment}GCode{class_name}{name_suffix}({class_types[tag]}): """{', '.join(codes)}: {brief}""" param_letters = "{''.join(param_letters)}" - dialects = ['marlin2'] ''' if len(codes) > 1: @@ -333,7 +337,7 @@ if __name__ == '__main__': all_classes = [] print("# DO NOT EDIT - file generated with pygcode/src/pygcode/tools/marlin_parse_MarlinDocumentation.py\nfrom .gcodes_base import *\n") - print("# TODO: manual changes have been made! see pygcode/src/pygcode/gcode_marlin.patch", file=stderr) + print("# NOTE: it is likely manual changes have been made to the previous output! see pygcode/src/pygcode/gcode_marlin.patch", file=stderr) for filename in argv[1:]: name, body = extract_data(filename)