File indexing completed on 2024-05-12 04:41:10

0001 /* AtCore KDE Libary for 3D Printers
0002     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0003     SPDX-FileCopyrightText: 2016 Lays Rodrigues <lays.rodrigues@kde.org>
0004     SPDX-FileCopyrightText: 2016, 2018 Tomaz Canabrava <tcanabrava@kde.org>
0005     SPDX-FileCopyrightText: 2016 Patrick José Pereira <patrickjp@kde.org>
0006     SPDX-FileCopyrightText: 2016-2020 Chris Rizzitello <rizzitello@kde.org>
0007 */
0008 
0009 #include "gcodecommands.h"
0010 #include <QString>
0011 
0012 const QString GCode::commandRequiresArgument = QObject::tr("%1%2: requires an argument");
0013 const QString GCode::commandNotSupported = QObject::tr("Not implemented or not supported!");
0014 
0015 QString GCode::description(GCommands gcode)
0016 {
0017     switch (gcode) {
0018     case G0: // Teacup - Sprinter - Marlin - Repetier - Smoothie - RepRap Firmware - MakerBot
0019         return QObject::tr("G0: Rapid linear move");
0020     case G1: // Teacup - Sprinter - Marlin - Repetier - Smoothie - RepRap Firmware
0021         return QObject::tr("G1: Linear move");
0022     case G2: // Sprinter - Marlin - Repetier - Smoothie
0023         return QObject::tr("G2: Controlled Arc Move clockwise");
0024     case G3: // Sprinter - Marlin - Repetier - Smoothie
0025         return QObject::tr("G3: Controlled Arc Move counterclockwise");
0026     case G4: // Teacup - Sprinter - Marlin - Repetier - Smoothie - RepRap Firmware - MakerBot
0027         return QObject::tr("G4: Dwell");
0028     case G10: // Marlin - Repetier > 0.92 - Smoothie
0029         return QObject::tr("G10: Retract");
0030     case G11: // Marlin - Repetier > 0.92 - Smoothie
0031         return QObject::tr("G11: Unretract");
0032     case G20: // Teacup - Sprinter - Repetier - Smoothie - RepRap Firmware
0033         return QObject::tr("G20: Set units to inches");
0034     case G21: // Teacup - Sprinter - Repetier - Smoothie - RepRap Firmware
0035         return QObject::tr("G21: Set units to millimeters");
0036     case G28: // Teacup - Sprinter - Marlin - Repetier - Smoothie - RepRap Firmware - MakerBot
0037         return QObject::tr("G28: Move to Origin Home");
0038     case G29: // Marlin - Repetier 0.91.7
0039         return QObject::tr("G29: Detailed Z-Probe");
0040     case G30: // Marlin - Repetier - Smoothie - RepRap Firmware
0041         return QObject::tr("G30: Single Z-Probe");
0042     case G31: // Repetier 0.91.7 - Smoothie - RepRap Firmware - Marlin
0043         return QObject::tr("G31: Set or report current probe status / Dock Z Probe sled for Marlin");
0044     case G32: // Repetier 0.92.8 - Smoothie - RepRap Firmware - Marlin
0045         return QObject::tr("G32: Probe Z and calculate Z plane(Bed Leveling)/ UnDoc Z Probe sled for Marlin");
0046     case G33: // Repetier 0.92.8
0047         return QObject::tr("G33: Measure/List/Adjust Distortion Matrix");
0048     case G90: // Teacup - Sprinter - Marlin - Repetier - Smoothie - RepRap Firmware - MakerBot
0049         return QObject::tr("G90: Set to absolute positioning");
0050     case G91: // Teacup - Sprinter - Marlin - Repetier - Smoothie - RepRap Firmware - MakerBot
0051         return QObject::tr("G91: Set to relative positioning");
0052     case G92: // Teacup - Sprinter - Marlin - Repetier - Smoothie - RepRap Firmware - MakerBot
0053         return QObject::tr("G92: Set position");
0054     case G100: // Repetier 0.92
0055         return QObject::tr("G100: Calibrate floor or rod radius");
0056     case G130: // MakerBot
0057         return QObject::tr("G130: Set digital potentiometer value");
0058     case G131: // Repetier 0.91
0059         return QObject::tr("G131: Recase Move offset");
0060     case G132: // Repetier 0.91
0061         return QObject::tr("G132: Calibrate endstops offsets");
0062     case G133: // Repetier 0.91
0063         return QObject::tr("G133: Measure steps to top");
0064     case G161: // Teacup - MakerBot
0065         return QObject::tr("G161: Home axis to minimum");
0066     case G162: // Teacup - MakerBot
0067         return QObject::tr("G162: Home axis to maximum");
0068     default:
0069         return commandNotSupported;
0070     }
0071 }
0072 
0073 QString GCode::toCommand(GCommands gcode, const QString &value1)
0074 {
0075     QString code = QStringLiteral("G%1").arg(QString::number(gcode));
0076     switch (gcode) {
0077     case G29:
0078     case G90:
0079     case G91:
0080         return code;
0081 
0082     case G32:
0083         return code.append(QStringLiteral(" S1"));
0084     case G0:
0085     case G1:
0086     case G28:
0087         code = value1.isEmpty() ? code : code.append(QStringLiteral(" %1").arg(value1));
0088         return code;
0089 
0090     default:
0091         return commandNotSupported;
0092     }
0093 }
0094 
0095 QString GCode::description(MCommands gcode)
0096 {
0097     switch (gcode) {
0098     case M0: // Marlin - Teacup - RepRap Firmware
0099         return QObject::tr("M0: Stop or unconditional stop");
0100     case M1: // Marlin - RepRap Firmware
0101         return QObject::tr("M1: Sleep or unconditional stop");
0102     case M2: // Teacup - Maker Bot
0103         return QObject::tr("M2: Program End");
0104     case M6: // Teacup
0105         return QObject::tr("M6: Tool Change");
0106     case M17: // Teacup - Marlin - Smoothie
0107         return QObject::tr("M17: Enable/power all steppers motors");
0108     case M18: // Teacup - Marlin(M84) - Smoothie -RepRap Firmware
0109         return QObject::tr("M18: Disable all steppers motors");
0110     case M20: // Teacup - Sprinter - Marlin - Repetier - Smoothie - RepRap Firmware
0111         return QObject::tr("M20: List SDCard");
0112     case M21: // Teacup - Sprinter - Marlin - Repetier - Smoothie - RepRap Firmware
0113         return QObject::tr("M21: Initialize SDCard");
0114     case M22: // Teacup - Sprinter - Marlin - Repetier - RepRap Firmware
0115         return QObject::tr("M22: Release SDCard");
0116     case M23: // Teacup - Sprinter - Marlin - Repetier - Smoothie - RepRap Firmware
0117         return QObject::tr("M23: Select SD file");
0118     case M24: // Teacup - Sprinter - Marlin - Repetier - Smoothie - RepRap Firmware
0119         return QObject::tr("M24: Start/resume SD print");
0120     case M25: // Teacup - Sprinter - Marlin - Repetier - Smoothie - RepRap Firmware
0121         return QObject::tr("M25: Pause SD print");
0122     case M26: // Sprinter - Marlin - Repetier - Smoothie(abort) - RepRap Firmware
0123         return QObject::tr("M26: Set SD position");
0124     case M27: // Sprinter - Marlin - Repetier - Smoothie - RepRap Firmware
0125         return QObject::tr("M27: Report SD print status");
0126     case M28: // Sprinter - Marlin - Repetier - Smoothie - RepRap Firmware
0127         return QObject::tr("M28: Begin write to SD card");
0128     case M29: // Sprinter - Marlin - Repetier - RepRap Firmware
0129         return QObject::tr("M29: Stop writing to SD card");
0130     case M30: // Sprinter - Marlin - Repetier - Smoothie - RepRap Firmware
0131         return QObject::tr("M30: Delete a file on the SD card");
0132     case M31: // Marlin
0133         return QObject::tr("M31: Output time since last M109 or SD card start to serial");
0134     case M32: // Marlin - Smoothie - RepRap Firmware
0135         return QObject::tr("M32: Select file and start SD print");
0136     case M33: // Marlin
0137         return QObject::tr("M33: Get the long name for an SD card file or folder");
0138     case M34: // Marlin
0139         return QObject::tr("M34: Set SD file sorting options");
0140     case M36: // RepRap Firmware
0141         return QObject::tr("M36: Return file information");
0142     case M42: // Sprinter - Marlin - Repetier - RepRap Firmware
0143         return QObject::tr("M42: Switch I/O pin");
0144     case M48: // Marlin
0145         return QObject::tr("M48: Measure Z-Probe repeatability");
0146     case M70: // MakerBot
0147         return QObject::tr("M70: Display message");
0148     case M72: // MakerBot
0149         return QObject::tr("M72: Play a tone or song");
0150     case M73: // MakerBot
0151         return QObject::tr("M73: Set build percentage");
0152     case M80: // Teacup(automatic) - Sprinter - Marlin - Repetier - RepRap Firmware
0153         return QObject::tr("M80: ATX Power On");
0154     case M81: // Teacup(automatic) - Sprinter - Marlin - Repetier  - RepRap Firmware
0155         return QObject::tr("M81: ATX Power Off");
0156     case M82: // Teacup - Sprinter - Marlin - Repetier - Smoothie - RepRap Firmware
0157         return QObject::tr("M82: Set extruder to absolute mode");
0158     case M83: // Teacup - Sprinter - Marlin - Repetier - Smoothie - RepRap Firmware
0159         return QObject::tr("M83: Set extruder to relative mode");
0160     case M84: // Teacup - Sprinter - Marlin - Repetier - Smoothie - RepRap Firmware
0161         return QObject::tr("M84: Stop idle hold");
0162     case M85: // Sprinter - Marlin - Repetier
0163         return QObject::tr("M85: Set Inactivity shutdown timer");
0164     case M92: // Sprinter - Marlin - Repetier - Smoothie - RepRap Firmware
0165         return QObject::tr("M92: Set axis steps per unit");
0166     case M93: // Sprinter
0167         return QObject::tr("M93: Send axis steps per unit");
0168     case M98: // RepRap Firmware
0169         return QObject::tr("M98: Call Macro/Subprogram");
0170     case M99: // RepRap Firmware
0171         return QObject::tr("M99: Return from Macro/Subprogram");
0172     case M101: // Teacup
0173         return QObject::tr("M101: Turn extruder 1 on Forward, Undo Retraction");
0174     case M103: // Teacup
0175         return QObject::tr("M103: Turn all extruders off - Extruder Retraction");
0176     case M104: // Teacup - Sprinter - Marlin - Repetier - Smoothie - RepRap Firmware - MakerBot
0177         return QObject::tr("M104: Set Extruder Temperature");
0178     case M105: // Teacup - Sprinter - Marlin - Repetier - Smoothie - RepRap Firmware - MakerBot
0179         return QObject::tr("M105: Get Extruder Temperature");
0180     case M106: // Teacup - Sprinter - Marlin - Repetier - Smoothie - RepRap Firmware
0181         return QObject::tr("M106: Fan On");
0182     case M107: // Sprinter - Marlin - Repetier - Smoothie - RepRap Firmware
0183         return QObject::tr("M107: Fan Off");
0184     case M108: // Marlin
0185         return QObject::tr("M108: Cancel Heating");
0186     case M109: // Sprinter - Marlin - Repetier - Smoothie - RepRap Firmware - MakerBot
0187         return QObject::tr("M109: Set Extruder Temperature and Wait");
0188     case M110: // Marlin - Repetier - Smoothie - RepRap Firmware
0189         return QObject::tr("M110: Set Current Line Number");
0190     case M111: // Teacup -  Marlin - Repetier - RepRap Firmware
0191         return QObject::tr("M111: Set Debug Level");
0192     case M112: // Teacup - Marlin - Repetier - Smoothie - RepRap Firmware
0193         return QObject::tr("M112: Emergency Stop");
0194     case M114: // Teacup - Sprinter - Marlin - Repetier - Smoothie - RepRap Firmware - MakerBot
0195         return QObject::tr("M114: Get Current Position");
0196     case M115: // Teacup - Sprinter - Marlin - Repetier - RepRap Firmware
0197         return QObject::tr("M115: Get Firmware Version and Capabilities");
0198     case M116: // Teacup - Repetier - RepRap Firmware - MakerBot
0199         return QObject::tr("M116: Wait");
0200     case M117: // Marlin - Repetier - Smoothie - RepRap Firmware
0201         return QObject::tr("M117: Display Message");
0202     case M119: // Teacup - Sprinter - Marlin - Repetier - Smoothie - RepRap Firmware
0203         return QObject::tr("M119: Get Endstop Status");
0204     case M120: // Marlin - Smoothie - RepRap Firmware
0205         return QObject::tr("M120: Push for Smoothie and RepRap Firmware / Enable Endstop detection for Marlin");
0206     case M121: // Marlin - Smoothie - RepRap Firmware
0207         return QObject::tr("M121: Pop for Smoothie and RepRap Firmware / Disable Endstop detection for Marlin");
0208     case M122: // RepRap Firmware
0209         return QObject::tr("M122: Diagnose");
0210     case M126: // Marlin - MakerBot
0211         return QObject::tr("M126: Open valve");
0212     case M127: // Marlin - MakerBot
0213         return QObject::tr("M127: Close valve");
0214     case M130: // Teacup
0215         return QObject::tr("M130: Set PID P value");
0216     case M131: // Teacup
0217         return QObject::tr("M131: Set PID I value");
0218     case M132: // Teacup - MakerBot
0219         return QObject::tr("M132: Set PID D value");
0220     case M133: // Teacup - MakerBot
0221         return QObject::tr("M133: Set PID I limit value");
0222     case M134: // Teacup - MakerBot
0223         return QObject::tr("M134: Write PID values to EEPROM");
0224     case M135: // RepRap Firmware - MakerBot
0225         return QObject::tr("M135: Set PID sample interval");
0226     case M140: // Teacup - Sprinter - Marlin - Repetier - Smoothie - RepRap Firmware - MakerBot
0227         return QObject::tr("M140: Set Bed Temperature - Fast");
0228     case M141: // RepRap Firmware
0229         return QObject::tr("M141: Set Chamber Temperature - Fast");
0230     case M143: // RepRap Firmware
0231         return QObject::tr("M143: Maximum hot-end temperature");
0232     case M144: // RepRap Firmware
0233         return QObject::tr("M144: Stand by your bed");
0234     case M150: // Marlin
0235         return QObject::tr("M150: Set display color");
0236     case M155: // Look for Cap:AUTOREPORT_TEMP:1 in M115 to check for support
0237         return QObject::tr("M155: Set Temperature auto report");
0238     case M163: // Repetier > 0.92
0239         return QObject::tr("M163: Set weight of mixed material");
0240     case M164: // Repetier > 0.92
0241         return QObject::tr("M164: Store weights");
0242     case M190: // Sprinter - Marlin - Repetier - Smoothie - RepRap Firmware
0243         return QObject::tr("M190: Wait for bed temperature to reach target temp");
0244     case M200: // Marlin - Repetier - Smoothie
0245         return QObject::tr("M200: Set filament diameter");
0246     case M201: // Sprinter - Marlin - Repetier - RepRap Firmware
0247         return QObject::tr("M201: Set max printing acceleration");
0248     case M202: // Marlin - Repetier
0249         return QObject::tr("M202: Set max travel acceleration");
0250     case M203: // Marlin - Repetier - Smoothie - RepRap Firmware
0251         return QObject::tr("M203: Set maximum feedrate");
0252     case M204: // Sprinter - Marlin - Repetier - Smoothie
0253         return QObject::tr("M204: Set default acceleration");
0254     case M205: // Sprinter - Marlin - Repetier - Smoothie
0255         return QObject::tr("M205: Advanced settings");
0256     case M206: // Sprinter - Marlin - Repetier - Smoothie - RepRap Firmware
0257         return QObject::tr("M206: Offset axes for Sprinter, Marlin, Smoothie, RepRap Firmware / Set eeprom value for Repetier");
0258     case M207: // Marlin - Smoothie
0259         return QObject::tr("M207: Set retract length");
0260     case M208: // Marlin - Smoothie
0261         return QObject::tr("M208: Set unretract length");
0262     case M209: // Marlin - Repetier
0263         return QObject::tr("M209: Enable automatic retract");
0264     case M212: // Marlin
0265         return QObject::tr("M212: Set Bed Level Sensor Offset");
0266     case M218: // Marlin
0267         return QObject::tr("M218: Set Hotend Offset");
0268     case M220: // Teacup - Sprinter - Marlin - Repetier - Smoothie - RepRap Firmware
0269         return QObject::tr("M220: Set speed factor override percentage");
0270     case M221: // Teacup - Sprinter - Marlin - Repetier - Smoothie - RepRap Firmware
0271         return QObject::tr("M221: Set extrude factor override percentage");
0272     case M226: // Marlin - Repetier
0273         return QObject::tr("M226: Wait for pin state");
0274     case M231: // Repetier
0275         return QObject::tr("M231: Set OPS parameter");
0276     case M232: // Repetier
0277         return QObject::tr("M232: Read and reset max. advance values");
0278     case M240: // Marlin
0279         return QObject::tr("M240: Trigger camera");
0280     case M250: // Marlin
0281         return QObject::tr("M250: Set LCD contrast");
0282     case M251: // Repetier
0283         return QObject::tr("M251: Measure Z steps from homing stop (Delta printers)");
0284     case M280: // Marlin
0285         return QObject::tr("M280: Set servo position");
0286     case M300: // Marlin - Repetier - RepRap Firmware - MakerBot
0287         return QObject::tr("M300: Play beep sound");
0288     case M301: // Sprinter - Marlin - Repetier - Smoothie - RepRap Firmware
0289         return QObject::tr("M301: Set PID parameters");
0290     case M302: // Marlin - Repetier > 0.92 - RepRap Firmware
0291         return QObject::tr("M302: Allow cold extrudes ");
0292     case M303: // Sprinter - Marlin - Repetier - Smoothie
0293         return QObject::tr("M303: Run PID tuning");
0294     case M304: // Marlin - RepRap Firmware
0295         return QObject::tr("M304: Set PID parameters - Bed");
0296     case M305: // Smoothie - RepRap Firmware
0297         return QObject::tr("M305: Set thermistor and ADC parameters");
0298     case M306: // Smoothie
0299         return QObject::tr("M306: set home offset calculated from toolhead position");
0300     case M320: // Repeier
0301         return QObject::tr("M320: Activate autolevel (Repetier)");
0302     case M321: // Repetier
0303         return QObject::tr("M321: Deactivate autolevel (Repetier)");
0304     case M322: // Repetier
0305         return QObject::tr("M322: Reset autolevel matrix (Repetier)");
0306     case M323: // Repetier
0307         return QObject::tr("M323: Distortion correction on/off (Repetier)");
0308     case M340: // Repetier
0309         return QObject::tr("M340: Control the servos");
0310     case M350: // Marlin - Repetier - RepRap Firmware
0311         return QObject::tr("M350: Set microstepping mode");
0312     case M351: // Marlin
0313         return QObject::tr("M351: Toggle MS1 MS2 pins directly");
0314     case M355: // Repetier > 0.92.2
0315         return QObject::tr("M355: Turn case lights on/off");
0316     case M360: // Repetier > 9.92.2
0317         return QObject::tr("M360: Report firmware configuration");
0318     case M361: // Smoothie
0319         return QObject::tr("M361: Move to Theta 90 degree position");
0320     case M362: // Smoothie
0321         return QObject::tr("M362: Move to Psi 0 degree position");
0322     case M363: // Smoothie
0323         return QObject::tr("M363: Move to Psi 90 degree position");
0324     case M364: // Smoothie
0325         return QObject::tr("M364: Move to Psi + Theta 90 degree position");
0326     case M365: // Smoothie
0327         return QObject::tr("M365: SCARA scaling factor");
0328     case M366: // Smoothie
0329         return QObject::tr("M366: SCARA convert trim");
0330     case M370: // Smoothie
0331         return QObject::tr("M370: Morgan manual bed level - clear map");
0332     case M371: // Smoothie
0333         return QObject::tr("M371: Move to next calibration position");
0334     case M372: // Smoothie
0335         return QObject::tr("M372: Record calibration value, and move to next position");
0336     case M373: // Smoothie
0337         return QObject::tr("M373: End bed level calibration mode");
0338     case M374: // Smoothie
0339         return QObject::tr("M374: Save calibration grid");
0340     case M375: // Smoothie
0341         return QObject::tr("M375: Display matrix / Load Matrix");
0342     case M380: // Marlin
0343         return QObject::tr("M380: Activate solenoid");
0344     case M381: // Marlin
0345         return QObject::tr("M381: Disable all solenoids");
0346     case M400: // Sprinter - Marlin - Repetier - Smoothie - RepRap Firmware
0347         return QObject::tr("M400: Wait for current moves to finish");
0348     case M401: // Marlin
0349         return QObject::tr("M401: Lower z-probe");
0350     case M402: // Marlin
0351         return QObject::tr("M402: Raise z-probe");
0352     case M404: // Marlin - RepRap Firmware
0353         return QObject::tr("M404: Filament width and nozzle diameter");
0354     case M405: // Marlin
0355         return QObject::tr("M405: Filament Sensor on");
0356     case M406: // Marlin
0357         return QObject::tr("M406: Filament Sensor off");
0358     case M407: // Marlin - RepRap Firmware
0359         return QObject::tr("M407: Display filament diameter");
0360     case M408: // RepRap Firmware
0361         return QObject::tr("M408: Report JSON-style response");
0362     case M420:
0363         return QObject::tr("M420: Enable/Disable Mesh Leveling (Marlin)");
0364     case M450: // Repetier
0365         return QObject::tr("M450: Report Printer Mode");
0366     case M451: // Repetier
0367         return QObject::tr("M451: Select FFF Printer Mode");
0368     case M452: // Repetier
0369         return QObject::tr("M452: Select Laser Printer Mode");
0370     case M453: // Repetier
0371         return QObject::tr("M453: Select CNC Printer Mode");
0372     case M460: // Repetier
0373         return QObject::tr("M460: Define temperature range for thermistor controlled fan");
0374     case M500: // Sprinter - Marlin - Repetier - RepRap Firmware
0375         return QObject::tr("M500: Store parameters in EEPROM");
0376     case M501: // Sprinter - Marlin - Repetier - RepRap Firmware
0377         return QObject::tr("M501: Read parameters from EEPROM");
0378     case M502: // Sprinter - Marlin - Repetier - RepRap Firmware
0379         return QObject::tr("M502: Revert to the default 'factory settings'.");
0380     case M503: // Sprinter - Marlin - RepRap Firmware
0381         return QObject::tr("M503: Print settings ");
0382     case M540: // Marlin
0383         return QObject::tr("M540: Enable/Disable 'Stop SD Print on Endstop Hit'");
0384     case M550: // RepRap Firmware
0385         return QObject::tr("M550: Set Name");
0386     case M551: // RepRap Firmware
0387         return QObject::tr("M551: Set Password");
0388     case M552: // RepRap Firmware
0389         return QObject::tr("M552: Set IP address");
0390     case M553: // RepRap Firmware
0391         return QObject::tr("M553: Set Netmask");
0392     case M554: // RepRap Firmware
0393         return QObject::tr("M554: Set Gateway");
0394     case M555: // RepRap Firmware
0395         return QObject::tr("M555: Set compatibility");
0396     case M556: // RepRap Firmware
0397         return QObject::tr("M556: Axis compensation");
0398     case M557: // Smoothie - RepRap Firmware
0399         return QObject::tr("M557: Set Z probe point");
0400     case M558: // RepRap Firmware
0401         return QObject::tr("M558: Set Z probe type");
0402     case M559: // RepRap Firmware
0403         return QObject::tr("M559: Upload configuration file");
0404     case M560: // RepRap Firmware
0405         return QObject::tr("M560: Upload web page file");
0406     case M561: // Smoothie - RepRap Firmware
0407         return QObject::tr("M561: Set Identity Transform");
0408     case M562: // RepRap Firmware
0409         return QObject::tr("M562: Reset temperature fault");
0410     case M563: // RepRap Firmware
0411         return QObject::tr("M563: Define or remove a tool");
0412     case M564: // RepRap Firmware
0413         return QObject::tr("M564: Limit axes");
0414     case M565: // Smoothie
0415         return QObject::tr("M565: Set Z probe offset");
0416     case M566: // RepRap Firmware
0417         return QObject::tr("M566: Set allowable instantaneous speed change");
0418     case M567: // RepRap Firmware
0419         return QObject::tr("M567: Set tool mix ratio");
0420     case M568: // RepRap Firmware
0421         return QObject::tr("M568: Turn off/on tool mix ratio");
0422     case M569: // RepRap Firmware
0423         return QObject::tr("M569: Set axis direction and enable values");
0424     case M570: // RepRap Firmware
0425         return QObject::tr("M570: Set heater timeout");
0426     case M571: // RepRap Firmware
0427         return QObject::tr("M571: Set output on extrude");
0428     case M573: // RepRap Firmware
0429         return QObject::tr("M573: Report heater PWM");
0430     case M574: // RepRap Firmware
0431         return QObject::tr("M574: Set endstop configuration");
0432     case M575: // RepRap Firmware
0433         return QObject::tr("M575: Set serial comms parameters");
0434     case M577: // RepRap Firmware
0435         return QObject::tr("M577: Wait until endstop is triggered");
0436     case M578: // RepRap Firmware
0437         return QObject::tr("M578: Fire inkjet bits");
0438     case M579: // RepRap Firmware
0439         return QObject::tr("M579: Scale Cartesian axes");
0440     case M580: // RepRap Firmware
0441         return QObject::tr("M580: Select Roland");
0442     case M600: // Marlin
0443         return QObject::tr("M600: Filament change pause");
0444     case M605: // Marlin
0445         return QObject::tr("M605: Set dual x-carriage movement mode");
0446     case M665: // Marlin - Smoothie - RepRap Firmware
0447         return QObject::tr("M665: Set delta configuration");
0448     case M666: // Marlin - Repetier - Smoothie - RepRap Firmware
0449         return QObject::tr("M666: Set delta endstop adjustment");
0450     case M667: // RepRap Firmware
0451         return QObject::tr("M667: Select CoreXY mode");
0452     case M851: // Marlin
0453         return QObject::tr("M851: Set Z-Probe Offset");
0454     case M906: // RepRap Firmware
0455         return QObject::tr("M906: Set motor currents");
0456     case M907: // Marlin - Repetier - Smoothie
0457         return QObject::tr("M907: Set digital trimpot motor");
0458     case M908: // Marlin - Repetier > 0.92
0459         return QObject::tr("M908: Control digital trimpot directly");
0460     case M911: // RepRap Firmware
0461         return QObject::tr("M911: Set power monitor threshold voltages");
0462     case M912: // RepRap Firmware
0463         return QObject::tr("M912: Set electronics temperature monitor adjustment");
0464     case M913: // RepRap Firmware
0465         return QObject::tr("M913: Set motor percentage of normal current");
0466     case M928: // Marlin
0467         return QObject::tr("M928: Start SD logging");
0468     case M997: // RepRap Firmware
0469         return QObject::tr("M997: Perform in-application firmware update");
0470     case M998: // RepRap Firmware
0471         return QObject::tr("M998: Request resend of line");
0472     case M999: // Marlin - Smoothie - RepRap Firmware
0473         return QObject::tr("M999: Restart after being stopped by error");
0474     default:
0475         return commandNotSupported;
0476     }
0477 }
0478 
0479 QString GCode::toCommand(MCommands gcode, const QString &value1, const QString &value2)
0480 {
0481     QString code = QStringLiteral("M%1").arg(QString::number(gcode));
0482     switch (gcode) {
0483     case M20:
0484     case M24:
0485     case M25:
0486     case M27:
0487     case M105:
0488     case M107:
0489     case M112:
0490     case M114:
0491     case M115:
0492     case M116:
0493     case M119:
0494         return code;
0495 
0496     case M21:
0497     case M22:
0498         code = value1.isEmpty() ? code : code.append(QStringLiteral(" P%1").arg(value1));
0499         return code;
0500 
0501     case M23:
0502     case M28:
0503     case M29:
0504     case M30:
0505     case M117:
0506         code = value1.isEmpty() ? GCode::commandRequiresArgument.arg(QStringLiteral("M"), QString::number(gcode)) : code.append(QStringLiteral(" %1").arg(value1));
0507         return code;
0508 
0509     case M109:
0510     case M140:
0511     case M155:
0512     case M190:
0513     case M220:
0514     case M221:
0515         code = value1.isEmpty() ? GCode::commandRequiresArgument.arg(QStringLiteral("M"), QString::number(gcode)) : code.append(QStringLiteral(" S%1").arg(value1));
0516         return code;
0517 
0518     case M84:
0519         code = value1.isEmpty() ? code : code.append(QStringLiteral(" S%1").arg(value1));
0520         return code;
0521 
0522     case M104:
0523         code = value2.isEmpty() ? code.append(QStringLiteral(" S%1").arg(value1)) : code.append(QStringLiteral(" P%1 S%2").arg(value1, value2));
0524         code = value1.isEmpty() ? GCode::commandRequiresArgument.arg(QStringLiteral("M"), QString::number(gcode)) : code;
0525         return code;
0526 
0527     case M106:
0528         code = value2.isEmpty() ? code.append(QStringLiteral(" S%1").arg(value1)) : code.append(QStringLiteral(" P%1 S%2").arg(value1, value2));
0529         code = value1.isEmpty() ? QStringLiteral("M106") : code;
0530         return code;
0531 
0532     /// For M26 values that end with %. AtCore will send the percentage verison of the command (optional in firmwares)
0533     /// For all values not ending in % it will start on that byte. This is the standard Sd resume supported by all reprap based firmware.
0534     case M26: {
0535         if (!value1.isEmpty()) {
0536             if (value1.endsWith(QStringLiteral("%"))) {
0537                 QString temp = value1;
0538                 temp.replace(QStringLiteral("%"), QLatin1String(""));
0539                 return code.append(QStringLiteral(" P%1").arg(temp.toDouble() / 100));
0540             }
0541             return code.append(QStringLiteral(" S%1").arg(value1));
0542         }
0543         return GCode::commandRequiresArgument.arg(QStringLiteral("M"), QString::number(gcode));
0544     }
0545 
0546     default:
0547         return commandNotSupported;
0548     }
0549 }