├── .eslintignore ├── .eslintrc.js ├── .gitignore ├── .npmignore ├── .travis.yml ├── HACKS ├── LICENSE ├── README.md ├── app ├── common.js ├── console.js ├── git-tool.js ├── github.js ├── helpers.js ├── hints.js ├── mc-tool.js ├── mc.js ├── pio-inst.js ├── pio.js ├── server.js ├── services │ ├── editor.js │ ├── git.js │ ├── index.js │ ├── ot.js │ ├── pub.js │ ├── serial.js │ ├── snippets.js │ ├── sse.js │ ├── store.js │ └── upnp.js ├── state-storage.js ├── store-tool.js └── store.js ├── bin ├── mct └── mctd ├── build ├── icon.icns └── icons │ ├── icon_128x128.png │ ├── icon_256x256.png │ ├── icon_256x256.png.ico │ └── icon_64x64.png ├── index.js ├── package.json ├── rtcmc-v3 ├── Scalable-Broadcast.js └── Signaling-Server.js ├── sslcert ├── gen ├── server.crt ├── server.csr ├── server.key ├── server.key.org └── test_policy.json ├── start.js ├── static ├── .eslintrc.js ├── cam │ ├── i.html │ ├── index.html │ ├── main.css │ ├── main.js │ └── main0.js ├── consoles.html ├── consoles.js ├── css │ ├── favicon.ico │ ├── input-expand-group.css │ ├── spinner.css │ ├── text-25.png │ └── toggle.css ├── editor │ ├── diff.js │ ├── editor.css │ ├── editor.js │ ├── fsbrowser.js │ ├── helpers.js │ ├── index.html │ ├── marker.js │ ├── marker_tooltip.js │ ├── ot.js │ └── to-the-point.mp3 ├── git │ ├── ThreeCSG.js │ ├── ThreeCSG.url │ ├── bootstrap-treeview │ │ ├── bootstrap-treeview.min.css │ │ └── bootstrap-treeview.min.js │ └── three │ │ ├── build │ │ ├── three.js │ │ ├── three.min.js │ │ └── three.module.js │ │ └── examples │ │ ├── fonts │ │ ├── helvetiker_bold.typeface.json │ │ └── helvetiker_regular.typeface.json │ │ └── js │ │ ├── controls │ │ ├── DeviceOrientationControls.js │ │ ├── DragControls.js │ │ ├── EditorControls.js │ │ ├── FirstPersonControls.js │ │ ├── FlyControls.js │ │ ├── OrbitControls.js │ │ ├── OrthographicTrackballControls.js │ │ ├── PointerLockControls.js │ │ ├── TrackballControls.js │ │ ├── TransformControls.js │ │ └── VRControls.js │ │ ├── exporters │ │ ├── MMDExporter.js │ │ ├── OBJExporter.js │ │ ├── STLBinaryExporter.js │ │ ├── STLExporter.js │ │ └── TypedGeometryExporter.js │ │ └── renderers │ │ ├── CSS2DRenderer.js │ │ ├── CSS3DRenderer.js │ │ ├── CanvasRenderer.js │ │ ├── Projector.js │ │ ├── RaytracingRenderer.js │ │ ├── RaytracingWorker.js │ │ ├── SVGRenderer.js │ │ ├── SoftwareRenderer.js │ │ └── WebGLDeferredRenderer.js ├── index.html ├── js │ ├── head.min.js │ ├── jquery.ba-throttle-debounce.js │ └── sheetrock.min.js ├── main.js ├── snippets.js └── ui.js ├── test ├── Configuration.h └── Configuration_adv.h └── views ├── _Bootscreen.h ├── configuration.md ├── gcode-info.html ├── gcode ├── G000-G001.md ├── G002-G003.md ├── G004.md ├── G005.md ├── G010.md ├── G011.md ├── G012.md ├── G020.md ├── G021.md ├── G026.md ├── G027.md ├── G028.md ├── G029-abl.md ├── G029-mbl.md ├── G029-ubl.md ├── G030.md ├── G031.md ├── G032.md ├── G033.md ├── G038.md ├── G042.md ├── G090.md ├── G091.md ├── G092.md ├── M000-M001.md ├── M003.md ├── M004.md ├── M005.md ├── M017.md ├── M018.md ├── M020.md ├── M021.md ├── M022.md ├── M023.md ├── M024.md ├── M025.md ├── M026.md ├── M027.md ├── M028.md ├── M029.md ├── M030.md ├── M031.md ├── M032.md ├── M033.md ├── M034.md ├── M042.md ├── M043-T.md ├── M043.md ├── M048.md ├── M073.md ├── M075.md ├── M076.md ├── M077.md ├── M078.md ├── M080.md ├── M081.md ├── M082.md ├── M083.md ├── M085.md ├── M092.md ├── M100.md ├── M104.md ├── M105.md ├── M106.md ├── M107.md ├── M108.md ├── M109.md ├── M110.md ├── M111.md ├── M112.md ├── M113.md ├── M114.md ├── M115.md ├── M117.md ├── M118.md ├── M119.md ├── M120.md ├── M121.md ├── M122.md ├── M125.md ├── M126.md ├── M127.md ├── M128.md ├── M129.md ├── M140.md ├── M145.md ├── M149.md ├── M150.md ├── M155.md ├── M163.md ├── M164.md ├── M165.md ├── M190.md ├── M200.md ├── M201.md ├── M203.md ├── M204.md ├── M205.md ├── M206.md ├── M207.md ├── M208.md ├── M209.md ├── M211.md ├── M218.md ├── M220.md ├── M221.md ├── M226.md ├── M240.md ├── M250.md ├── M260.md ├── M261.md ├── M280.md ├── M290.md ├── M300.md ├── M301.md ├── M302.md ├── M303.md ├── M304.md ├── M350.md ├── M351.md ├── M355.md ├── M360.md ├── M361.md ├── M362.md ├── M363.md ├── M364.md ├── M380.md ├── M381.md ├── M400.md ├── M401.md ├── M402.md ├── M404.md ├── M405.md ├── M406.md ├── M407.md ├── M410.md ├── M420.md ├── M421.md ├── M428.md ├── M500.md ├── M501.md ├── M502.md ├── M503.md ├── M504.md ├── M540.md ├── M600.md ├── M603.md ├── M605.md ├── M665-scara.md ├── M665.md ├── M666-dual.md ├── M666.md ├── M851.md ├── M852.md ├── M900.md ├── M906.md ├── M907.md ├── M908.md ├── M909.md ├── M910.md ├── M911.md ├── M912.md ├── M913.md ├── M914.md ├── M915.md ├── M928.md └── M999.md ├── gt.html ├── snippets ├── 00-upnp.html ├── 01-cam.html ├── bs-0default.html ├── bs-custom.html ├── stepperE.html ├── stepperXY.html └── stepperZ.html ├── start.html └── version.html /.eslintignore: -------------------------------------------------------------------------------- 1 | # /node_modules/* and /bower_components/* ignored by default 2 | 3 | build 4 | dist 5 | static/* 6 | !static/main.js 7 | !static/consoles.js -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | "env": { 3 | "es6": true, 4 | "node": true 5 | }, 6 | "extends": "eslint:recommended", 7 | "parserOptions": { 8 | "sourceType": "module" 9 | }, 10 | "rules": { 11 | "indent": [ 12 | "warn", 13 | 2 14 | ], 15 | "linebreak-style": [ 16 | "error", 17 | "unix" 18 | ], 19 | "quotes": [ 20 | "warn", 21 | "single" 22 | ], 23 | "no-console": [ 24 | "warn" 25 | ], 26 | "semi": [ 27 | "warn", 28 | "always" 29 | ] 30 | } 31 | }; -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | 6 | # Runtime data 7 | pids 8 | *.pid 9 | *.seed 10 | 11 | # Directory for instrumented libs generated by jscoverage/JSCover 12 | lib-cov 13 | 14 | # Coverage directory used by tools like istanbul 15 | coverage 16 | 17 | # nyc test coverage 18 | .nyc_output 19 | 20 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 21 | .grunt 22 | 23 | # node-waf configuration 24 | .lock-wscript 25 | 26 | # Compiled binary addons (http://nodejs.org/api/addons.html) 27 | build/Release 28 | dist 29 | 30 | # Dependency directories 31 | node_modules 32 | jspm_packages 33 | bower_components 34 | 35 | # Optional npm cache directory 36 | .npm 37 | 38 | # Optional REPL history 39 | .node_repl_history 40 | 41 | **/test 42 | package-lock.json 43 | unused 44 | .DS_Store 45 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | test 2 | build 3 | dist 4 | **/test -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "node" 4 | - "iojs" 5 | - "7" 6 | - "6" 7 | - "5" 8 | - "4" 9 | - "0.12" 10 | - "0.10" 11 | sudo: false -------------------------------------------------------------------------------- /HACKS: -------------------------------------------------------------------------------- 1 | nat-upnp/lib/nat-upnp/client.js 2 | @@ -119,3 +119,3 @@ 3 | - protocol: data.NewProtocol.toLowerCase(), 4 | + protocol: (data.NewProtocol || '').toLowerCase(), 5 | 6 | used updated version from: 7 | https://github.com/MelvinTo/node-nat-upnp 8 | 9 | cd node_modules/ot 10 | npm i 11 | node_modules/.bin/grunt --force 12 | rm -r node_modules 13 | -------------------------------------------------------------------------------- /app/github.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs'); 2 | var path = require('path'); 3 | var http = require('https'); 4 | var url = require('url'); 5 | 6 | var getGHList=(uri)=>new Promise((done,fail)=>{ 7 | var options=url.parse(uri); 8 | options.headers={ 9 | Accept: 'application/json', 10 | "User-Agent":"Mozilla/5.0", 11 | }; 12 | http.get(options,res=>{ 13 | res.setEncoding('utf8'); 14 | var text=''; 15 | res.on('data', function (chunk) { 16 | text+=chunk; 17 | }) 18 | res.on('end', function () { 19 | done(JSON.parse(text)); 20 | }); 21 | }) 22 | }) 23 | 24 | var getFile=(url,name)=>new Promise((done,fail)=>{ 25 | var file = fs.createWriteStream(name); 26 | var request = http.get(url, function(response) { 27 | response.pipe(file); 28 | response.on('end',()=>done(name)); 29 | }); 30 | }) 31 | 32 | exports.getGCodes=verbose=> 33 | getGHList('https://api.github.com/repos/MarlinFirmware/MarlinDocumentation/contents/_gcode') 34 | //.then(a=>a.filter((i,ind)=>ind<2)) 35 | .then(a=>a.filter(i=>i.type=='file')) 36 | .then(a=>a.map(i=>getFile(i.download_url,path.join(__dirname,'..','views','gcode',i.name)))) 37 | .then(aw=>Promise.all(aw)) 38 | .then(a=>(verbose&&console.log('loaded files:',a),a)) 39 | 40 | exports.getConfig=verbose=> 41 | getGHList('https://api.github.com/repos/MarlinFirmware/MarlinDocumentation/contents/_configuration') 42 | .then(a=>a.filter(i=>i.name=='configuration.md')) 43 | .then(a=>a.filter(i=>i.type=='file')) 44 | .then(a=>a.map(i=>getFile(i.download_url,path.join(__dirname,'..','views',i.name)))) 45 | .then(aw=>Promise.all(aw)) 46 | .then(a=>(verbose&&console.log('loaded files:',a),a)) 47 | -------------------------------------------------------------------------------- /app/helpers.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | var fs = require('fs'); 3 | var path = require('path'); 4 | 5 | Object.prototype.filter = function( predicate, obj ) { 6 | var result = { }; 7 | obj = obj || this 8 | for (var key in obj) { 9 | if( obj.hasOwnProperty(key) && predicate( obj[key], key, obj ) ) { 10 | result[key] = obj[key]; 11 | } 12 | } 13 | return result; 14 | }; 15 | 16 | function atob(b64) { 17 | return process.version < "v6.0.0" ? Buffer.from(b64, 'base64') : new Buffer(b64, 'base64'); 18 | } 19 | 20 | function promisify(func,that) { 21 | return function() { 22 | return new Promise((resolve, reject) => { 23 | const args = Array.prototype.slice.apply(arguments); 24 | args.push((err, data) => { 25 | if (err) { 26 | return reject(err); 27 | } 28 | resolve(data); 29 | }); 30 | (that&&that[func]||func).apply(that||null, args); 31 | }); 32 | }; 33 | } 34 | var walk = function(dir){ 35 | return new Promise(function(done,fail) { 36 | var results = []; 37 | fs.readdir(dir, function(err, list) { 38 | if (err) return fail(err); 39 | var pending = list.length; 40 | if (!pending) return done(results); 41 | list.forEach(function(file) { 42 | file = path.resolve(dir, file); 43 | fs.stat(file, function(err, stat) { 44 | if (stat && stat.isDirectory()) { 45 | walk(file).then(function(res) { 46 | results = results.concat(res); 47 | if (!--pending) done(results); 48 | }); 49 | } else { 50 | results.push(file); 51 | if (!--pending) done(results); 52 | } 53 | }); 54 | }); 55 | }); 56 | }) 57 | }; 58 | 59 | function getFirstFile(paths) { 60 | if (!paths || paths.length == 0) 61 | return Promise.reject(); 62 | var filePath = paths.shift(); 63 | return promisify(fs.access)(filePath, fs.constants.R_OK) 64 | .then(a => filePath) 65 | .catch(e => getFirstFile(paths) ); 66 | } 67 | 68 | const unique = a => a.filter((elem, index, self) => index == self.indexOf(elem)) 69 | 70 | module.exports = { 71 | promisify, 72 | walk, 73 | atob, 74 | getFirstFile, 75 | unique, 76 | }; -------------------------------------------------------------------------------- /app/pio-inst.js: -------------------------------------------------------------------------------- 1 | const PIO_CORE_MIN_VERSION = '3.5.2-rc.3'; 2 | const STORAGE_STATE_KEY = 'platformio-ide:installer-state'; 3 | 4 | const pioNodeHelpers = require('platformio-node-helpers'); 5 | const StateStorage = require('./state-storage'); 6 | 7 | class PythonPrompt { 8 | constructor() { 9 | this.STATUS_TRY_AGAIN = 0; 10 | this.STATUS_ABORT = 1; 11 | this.STATUS_CUSTOMEXE = 2; 12 | } 13 | async prompt(){ 14 | return { status: this.STATUS_ABORT }; 15 | } 16 | } 17 | 18 | function installer() { 19 | var obj = {}; 20 | obj.stateStorage = new StateStorage(STORAGE_STATE_KEY); 21 | obj.onDidStatusChange = function () { console.log('onDidStatusChange', arguments)} 22 | 23 | var i = new pioNodeHelpers.installer.PlatformIOCoreStage(obj.stateStorage, obj.onDidStatusChange, { 24 | pioCoreMinVersion: PIO_CORE_MIN_VERSION, 25 | useBuiltinPIOCore: true, 26 | setUseBuiltinPIOCore: (value) => console.log('platformio-ide.advanced.useBuiltinPIOCore', value), 27 | useDevelopmentPIOCore: false, 28 | pythonPrompt: new PythonPrompt() 29 | }) 30 | if(process.platform.startsWith('win') && process.env.PATH.indexOf('.platformio') < 0) 31 | process.env.PATH+=";"+process.env.USERPROFILE+"\\.platformio\\penv\\Scripts;"; 32 | return i; 33 | } 34 | module.exports=installer(); 35 | //i.check().then(console.log).catch(console.error); 36 | //installer().install().then(console.log).catch(console.error); 37 | -------------------------------------------------------------------------------- /app/pio.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs'); 2 | var which = require('which'); 3 | var exec = require('child_process').exec; 4 | var spawn = require('child_process').spawn; 5 | var promisify = require('./helpers').promisify; 6 | 7 | require('fix-path')(); 8 | 9 | exports.isPIO = () => promisify(which)('platformio'); 10 | 11 | exports.list=name=>new Promise((done,fail)=>{ 12 | var stdout=[]; 13 | var cmd = exec('platformio device list --json-output'); 14 | cmd.stdout.on('data', (data) => { 15 | stdout.push(data) 16 | // console.log('data',data.toString()); 17 | }); 18 | cmd.stderr.on('data', (data) => { 19 | console.error('error',data.toString()); 20 | }); 21 | cmd.on('close', (code) => { 22 | code?fail(code):done(JSON.parse(stdout.join())); 23 | }); 24 | }) 25 | var tty2html = require('tty2html'); 26 | 27 | var compile=(commands, res, cwd)=>{ 28 | var env = Object.assign({}, process.env, { PLATFORMIO_FORCE_COLOR: true}); 29 | var verbose=0; 30 | res.writeHead(200, { "Content-Type": "text/event-stream", "Cache-control": "no-cache" }); 31 | var cmd = spawn('platformio', commands, {env: env, cwd: cwd || process.cwd() }); 32 | var mw=tty2html() 33 | mw.pipe(res); 34 | cmd.stdout.pipe(mw); 35 | cmd.stderr.pipe(mw); 36 | if(verbose){ 37 | cmd.stdout.on('data', (data) => { 38 | console.log('data',data.toString()); 39 | }); 40 | cmd.stderr.on('data', (data) => { 41 | console.error('error',data.toString()); 42 | }); 43 | } 44 | cmd.on('error', (data) => { 45 | res.write('command error'); 46 | console.error('cmd error',data); 47 | }); 48 | cmd.on('close', (code) => { 49 | res.end() 50 | }); 51 | return cmd; 52 | } 53 | exports.run=compile; 54 | exports.main=()=>{ 55 | console.log(process.cwd()); 56 | compile('platformio run').then(a=>console.log(a)); 57 | } 58 | //platformio run -t upload --upload-port /dev/ttyS0 -------------------------------------------------------------------------------- /app/services/git.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const fs = require('fs'); 3 | const router = module.exports = require('express').Router(); 4 | const git = require('../git-tool'); 5 | const store = require('../store'); 6 | const {atob, promisify} = require('../helpers'); 7 | const {seek4File, configFilesList, copyFile} = require('../common'); 8 | 9 | router.get('/tags', function (req, res) { 10 | git.Tags() 11 | .then(data => res.send(data)) 12 | .catch(a => res.status(403).send(a)) 13 | }); 14 | 15 | router.get('/branches', function (req, res) { 16 | git.Branches() 17 | .then(data => res.send(data)) 18 | .catch(a => res.status(403).send(a)) 19 | }); 20 | 21 | router.get('/checkout/:branch', function (req, res) { 22 | return Promise.resolve(atob(decodeURI(req.params.branch)).toString()) 23 | .then(a=>(console.log(a),a)) 24 | .then(git.Checkout) 25 | .then(data => res.send(data)) 26 | .catch(a => res.status(403).send(a)) 27 | }); 28 | 29 | router.get('/status', function (req, res) { 30 | git.Status() 31 | .then(a => res.send(a)) 32 | .catch(a => res.status(403).send(a)) 33 | }); 34 | 35 | router.get('/checkout-force', function (req, res) { 36 | var cp = () => git.root() 37 | .then(root => Promise.all( 38 | configFilesList 39 | .map(f => 40 | copyFile(path.join(root, store.state.baseCfg, f), path.join(root, 'Marlin', f)) 41 | .catch(e => 'not found') 42 | ) 43 | )) 44 | 45 | var rm = () => Promise.all( 46 | ['_Bootscreen.h', '_Statusscreen.h'] 47 | .map(f => 48 | seek4File(f, [path.join('Marlin', 'src', 'config'), 'Marlin']) 49 | .then(file => file && promisify(fs.unlink)(file)) 50 | .catch(a=>a) 51 | ) 52 | ); 53 | 54 | git.Checkout('--force') 55 | .then(rm) 56 | .then(a => store.state.baseCfg == 'Marlin' ? a : cp()) 57 | .then(a => res.send(a)) 58 | .catch(e => res.status(403).send(e)) 59 | }); 60 | 61 | router.get('/fetch', function (req, res) { 62 | git.Fetch() 63 | .then(a => res.end(JSON.stringify(a))) 64 | .catch(e => res.status(403).send(e)) 65 | }); 66 | -------------------------------------------------------------------------------- /app/services/index.js: -------------------------------------------------------------------------------- 1 | const router = module.exports = require('express').Router(); 2 | const store = require('../store'); 3 | 4 | router.use('/', require('./sse')); 5 | if (store.mods.editor) 6 | router.use('/s/editor', require('./editor')); 7 | if (store.mods.upnp) 8 | router.use('/upnp', require('./upnp')); 9 | if (store.mods.serial) 10 | router.use('/', require('./serial')); 11 | router.use('/', require('./git')); 12 | router.use('/', require('./snippets')); 13 | router.use('/', require('./pub')); 14 | router.use('/', require('./store')); 15 | -------------------------------------------------------------------------------- /app/services/ot.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const path = require('path'); 3 | const sio = require('socket.io'); 4 | const ot = require('ot'); 5 | const store = require('../store').mods.editor; 6 | const promisify = require('../helpers').promisify; 7 | 8 | var ns = {}; 9 | const getFile = file => store.root().then(root => promisify(fs.readFile)(path.join(root, file))) 10 | const setFile = (file, data) => store.root().then(root => promisify(fs.writeFile)(path.join(root, file), data)) 11 | 12 | exports.init = (server, url) => { 13 | const io = new sio(server, {path: url}); 14 | io.on('connection', function(socket) { 15 | socket.on('ns', function (docId) { 16 | if (ns[docId]) 17 | socket.emit('ns', docId); 18 | else { 19 | getFile(docId) 20 | .then(text => { 21 | var doc = ns[docId] = new ot.EditorSocketIOServer(text.toString(), 0, docId) 22 | socket.emit('ns', docId); 23 | io.of(docId) 24 | .on('connection', function(socket) { 25 | function clients(mode) { 26 | socket.broadcast.in(docId).emit('clients', {clients: doc.users, mode: mode}); 27 | } 28 | doc.getClient(socket.id); 29 | doc.addClient(socket); 30 | clients('enter'); 31 | socket.in(docId) 32 | .on('disconnect', function() { 33 | console.log('disconnect'); 34 | delete doc.users[socket.id]; 35 | clients('leave'); 36 | }) 37 | .on('name', function (name) { 38 | doc.setName(socket, name); 39 | console.log('set name') 40 | clients('name'); 41 | }) 42 | .on('operation', function (name) { 43 | console.log('saving...'); 44 | setFile(docId, doc.document); 45 | }); 46 | }) 47 | }) 48 | } 49 | }); 50 | }); 51 | } -------------------------------------------------------------------------------- /app/services/serial.js: -------------------------------------------------------------------------------- 1 | const router = module.exports = require('express').Router(); 2 | const store = require('../store'); 3 | const serial = require('../console'); 4 | 5 | var server; 6 | 7 | function serial_init(_server) { 8 | server = _server; 9 | return serial.changesPoll().then(monitor => { 10 | monitor.on("created", function (f, stat) { 11 | store.mods.sse.send('created', f) 12 | }) 13 | monitor.on("deleted", function (f, stat) { 14 | store.mods.sse.send('deleted', f) 15 | }) 16 | monitor.on("opened", function (f, stat) { 17 | store.mods.sse.send('opened', f) 18 | }) 19 | monitor.on("closed", function (f, stat) { 20 | store.mods.sse.send('closed', f) 21 | }) 22 | }) 23 | .catch(a => console.error(a)); 24 | } 25 | 26 | store.mods.serial.ctor = serial_init; 27 | store.mods.serial.close = serial.close; 28 | store.mods.serial.list = serial.list; 29 | 30 | router.get('/port/:port/:speed', function (req, res) { 31 | serial.init(server, req.params.port, req.params.speed) 32 | .then(data => res.send(data)) 33 | .catch(a=>res.status(403).send(a)) 34 | }); 35 | 36 | router.get('/port-close/:port', function (req, res) { 37 | serial.close(req.params.port) 38 | .then(data => res.send(data)) 39 | .catch(a=>res.status(403).send(a)) 40 | }); 41 | -------------------------------------------------------------------------------- /app/services/sse.js: -------------------------------------------------------------------------------- 1 | const router = module.exports = require('express').Router(); 2 | const store = require('../store'); 3 | 4 | var clients = []; 5 | 6 | function SSEsend(event, data) { 7 | clients.forEach(function(res) { 8 | res.write("event: " + event + "\n"); 9 | res.write("data: " + JSON.stringify(data) + "\n\n"); 10 | }); 11 | } 12 | 13 | store.mods.sse.send = SSEsend; 14 | 15 | router.get('/ports', function (req, res) { 16 | req.socket.setTimeout(Number.MAX_SAFE_INTEGER); 17 | console.log('SSE conected'); 18 | res.writeHead(200, { 19 | 'Content-Type': 'text/event-stream', 20 | 'Cache-Control': 'no-cache', 21 | 'Connection': 'keep-alive' 22 | }); 23 | clients.push(res); 24 | if(store.mods.serial) { 25 | store.mods.serial.list().then(a => SSEsend('list', a)); 26 | console.log('list sent'); 27 | } 28 | req.on('close',function(){ 29 | var i = clients.indexOf(res); 30 | if (i >= 0) 31 | clients.splice(i,1); 32 | console.log('SSE removed'); 33 | }) 34 | }); 35 | -------------------------------------------------------------------------------- /app/services/upnp.js: -------------------------------------------------------------------------------- 1 | const router = module.exports = require('express').Router(); 2 | 3 | const os = require('os'); 4 | const natUpnp = require('nat-upnp'); 5 | const promisify = require('../helpers').promisify; 6 | const vars = require('../store').vars; 7 | 8 | var natClient; 9 | 10 | function init() { 11 | if (!natClient) { 12 | natClient = natUpnp.createClient(); 13 | natClient.timeout = 10*1000; 14 | } 15 | } 16 | /* UPNP */ 17 | 18 | function getIP() { 19 | var ifaces = os.networkInterfaces(); 20 | return Object.keys(ifaces).reduce((p, c) => 21 | p.concat(ifaces[c].filter(i => !i.internal && 'IPv4' == i.family).map(i => i.address)), []); 22 | } 23 | 24 | router.get('/open', function (req, res) { 25 | init(); 26 | promisify('portMapping', natClient)({ 27 | public: vars.httpPort, 28 | private: vars.httpPort, 29 | ttl: 0, 30 | description: 'Marlin-conf public port' 31 | }) 32 | .then(a => promisify('externalIp', natClient)()) 33 | .then(ip => res.send({ip: ip, port: vars.httpPort})) 34 | .catch(e => res.status(403).send(e)); 35 | }) 36 | 37 | router.get('/local', function (req, res) { 38 | res.send({ip: getIP()[0], port: vars.httpPort, https: vars.httpsPort}); 39 | }) 40 | 41 | router.get('/check', function (req, res) { 42 | init(); 43 | Promise.all([ 44 | promisify('getMappings', natClient)(), 45 | promisify('externalIp', natClient)() 46 | ]) 47 | .then(p => p[0].filter(i => i.public.port == vars.httpPort).map(i => ({ip: p[1], port: i.public.port}))) 48 | .then(data => (data.length && console.log('Opened external access at http://' + data[0].ip + ':' + data[0].port, '!!!'), data)) 49 | .then(data => res.send(data)) 50 | .catch(e => res.status(403).send(e)); 51 | }) 52 | 53 | router.get('/close', function (req, res) { 54 | init(); 55 | promisify('portUnmapping', natClient)({ 56 | public: vars.httpPort, 57 | }) 58 | .then(data => res.send()) 59 | .catch(e => res.status(403).send(e)); 60 | }) 61 | -------------------------------------------------------------------------------- /app/state-storage.js: -------------------------------------------------------------------------------- 1 | 2 | /** @babel */ 3 | 4 | /** 5 | * Copyright (c) 2017-present PlatformIO 6 | * All rights reserved. 7 | * 8 | * This source code is licensed under the license found in the LICENSE file in 9 | * the root directory of this source tree. 10 | */ 11 | 12 | module.exports = class StateStorage { 13 | 14 | constructor(stateKey) { 15 | this.stateKey = stateKey; 16 | } 17 | 18 | _loadState() { 19 | const value = localStorage.getItem(this.stateKey); 20 | if (!value) { 21 | return {}; 22 | } 23 | try { 24 | return JSON.parse(value); 25 | } catch (err) { 26 | console.error(err); 27 | } 28 | return {}; 29 | } 30 | 31 | getValue(key) { 32 | const data = this._loadState(); 33 | if (data && data.hasOwnProperty(key)) { 34 | return data[key]; 35 | } 36 | return null; 37 | } 38 | 39 | setValue(key, value) { 40 | const data = this._loadState(); 41 | data[key] = value; 42 | localStorage.setItem(this.stateKey, JSON.stringify(data)); 43 | } 44 | 45 | } -------------------------------------------------------------------------------- /app/store-tool.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const path = require('path'); 3 | 4 | const { promisify } = require('./helpers'); 5 | const git = require('./git-tool'); 6 | const store = require('./store'); 7 | 8 | exports.write = () => 9 | git.root() 10 | .then(root => promisify(fs.writeFile)(path.join(root, store.config.store, 'config.json'), JSON.stringify({state: store.state}, 0, 2))) 11 | 12 | exports.read = () => 13 | git.root() 14 | .then(root => promisify(fs.readFile)(path.join(root, store.config.store, 'config.json'), 'utf8')) 15 | .then(data => JSON.parse(data)) 16 | .then(a=>(console.log('read', a),a)) 17 | .then(data => Object.assign(store, data)) 18 | .catch(e => e) 19 | -------------------------------------------------------------------------------- /app/store.js: -------------------------------------------------------------------------------- 1 | exports.vars = { 2 | httpPort: 3000, 3 | httpsPort: 3002, 4 | }; 5 | 6 | exports.state = { 7 | baseCfg: 'Marlin', 8 | } 9 | exports.config = { 10 | store: '.mct.bak', 11 | }; 12 | 13 | exports.mods = { 14 | sse: {}, 15 | editor: { 16 | root(req) {}, //replace it! 17 | name(req) { return 'marlin-conf' }, 18 | }, 19 | serial: {}, // comment for disabling 20 | upnp: {}, // comment for disabling 21 | }; 22 | -------------------------------------------------------------------------------- /bin/mct: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env node 2 | var cmd=require('../start'); 3 | cmd.main(); 4 | -------------------------------------------------------------------------------- /bin/mctd: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env node 2 | //var cmd=require('../start'); 3 | var path=require('path'); 4 | //var server=require('../server'); 5 | var nodemon = require('nodemon'); 6 | function nd(){ 7 | nodemon({ 8 | script: path.resolve(__dirname, '..','app','server.js'), 9 | watch: path.resolve(__dirname, '..'), 10 | ext: 'js json', 11 | ignore: ['tools.js','dist','build'], 12 | }); 13 | 14 | nodemon.on('start', function () { 15 | console.log('App has started'); 16 | }).on('quit', function () { 17 | console.log('App has quit'); 18 | }).on('restart', function (files) { 19 | console.log('App restarted due to: ', files); 20 | }); 21 | } 22 | //if (process.argv.indexOf('www')<0) 23 | // cmd.main(); 24 | //else 25 | nd();//server.main(); 26 | -------------------------------------------------------------------------------- /build/icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akaJes/marlin-config/d51e52eaa1bf6a1132ef2c2870a320b096441ce5/build/icon.icns -------------------------------------------------------------------------------- /build/icons/icon_128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akaJes/marlin-config/d51e52eaa1bf6a1132ef2c2870a320b096441ce5/build/icons/icon_128x128.png -------------------------------------------------------------------------------- /build/icons/icon_256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akaJes/marlin-config/d51e52eaa1bf6a1132ef2c2870a320b096441ce5/build/icons/icon_256x256.png -------------------------------------------------------------------------------- /build/icons/icon_256x256.png.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akaJes/marlin-config/d51e52eaa1bf6a1132ef2c2870a320b096441ce5/build/icons/icon_256x256.png.ico -------------------------------------------------------------------------------- /build/icons/icon_64x64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akaJes/marlin-config/d51e52eaa1bf6a1132ef2c2870a320b096441ce5/build/icons/icon_64x64.png -------------------------------------------------------------------------------- /sslcert/gen: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | openssl genrsa -des3 -out server.key 1024 3 | openssl req -new -key server.key -out server.csr 4 | cp server.key server.key.org 5 | openssl rsa -in server.key.org -out server.key 6 | openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt 7 | #openssl x509 -in server.crt -outform DER -out server.der -------------------------------------------------------------------------------- /sslcert/server.crt: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIICMzCCAZwCCQDoaPK/s7i1ZDANBgkqhkiG9w0BAQsFADBeMQswCQYDVQQGEwJB 3 | VTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0 4 | cyBQdHkgTHRkMRcwFQYDVQQDDA4xOTIuMTY4LjIwNi4zMjAeFw0xNzA2MjYxMjA4 5 | MTRaFw0yNzA2MjQxMjA4MTRaMF4xCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21l 6 | LVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxFzAVBgNV 7 | BAMMDjE5Mi4xNjguMjA2LjMyMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC9 8 | gUMPCJ7rrv/8PYgoL/rEjmffr8iKTxGYSey7Ig0mji1VH8MrlDF660p2nzfeewJq 9 | Lfu57uAha6Bs97iJ6womRa5EW8Gbsaum24MxXEo9EjPXyN9d3ueidxvpz1pvILQC 10 | xe4Dl+fdZXy9ZDdBqj2RPzKF21pSPoprXKqFuMTKOQIDAQABMA0GCSqGSIb3DQEB 11 | CwUAA4GBAJZKReXrxMB/gEjoDAg0i1bIilLKzutMSg4RIR3qF7qeOZhLI91vzV8q 12 | /s8vekcxLb22LggJv8bN/toWDp6X/Al1AvVNjpdAIJXjUOJklhvAawBp92QNsGzJ 13 | YTJY6FBLN9ZrphoQeLbya6yAN0Kb3YRQjlTE4CXwmoEgcFJQC8+P 14 | -----END CERTIFICATE----- 15 | -------------------------------------------------------------------------------- /sslcert/server.csr: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE REQUEST----- 2 | MIIBnjCCAQcCAQAwXjELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUx 3 | ITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEXMBUGA1UEAwwOMTky 4 | LjE2OC4yMDYuMzIwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAL2BQw8Inuuu 5 | //w9iCgv+sSOZ9+vyIpPEZhJ7LsiDSaOLVUfwyuUMXrrSnafN957Amot+7nu4CFr 6 | oGz3uInrCiZFrkRbwZuxq6bbgzFcSj0SM9fI313e56J3G+nPWm8gtALF7gOX591l 7 | fL1kN0GqPZE/MoXbWlI+imtcqoW4xMo5AgMBAAGgADANBgkqhkiG9w0BAQsFAAOB 8 | gQBMAQkWapwZ0dQy8GLF3KBcKii8rHzHkwEPNIrfVFNZUgqLruusFoFo6+HcWNY5 9 | BslXEnFHLAG5Pui5MlUdq1O8o3NZa31LJ64cGqBFldkw7RqFYsy3u6y6AZv86+Nn 10 | 8iEcXUdn/QfUEnELT9RGIPUpOlUuydmQODLx+MdyQ/yodA== 11 | -----END CERTIFICATE REQUEST----- 12 | -------------------------------------------------------------------------------- /sslcert/server.key: -------------------------------------------------------------------------------- 1 | -----BEGIN RSA PRIVATE KEY----- 2 | MIICXAIBAAKBgQC9gUMPCJ7rrv/8PYgoL/rEjmffr8iKTxGYSey7Ig0mji1VH8Mr 3 | lDF660p2nzfeewJqLfu57uAha6Bs97iJ6womRa5EW8Gbsaum24MxXEo9EjPXyN9d 4 | 3ueidxvpz1pvILQCxe4Dl+fdZXy9ZDdBqj2RPzKF21pSPoprXKqFuMTKOQIDAQAB 5 | AoGBAIcAbyVmntCH+xVXQIhgpeUhDh7su5DMg1xaTauCtpug7eqWlhOVnypSNNoM 6 | 02BLgYzi9VGgO0uTwNXgJDccmj0uLT0PKVdnp0PbBRJEnCY3jLCHF69tOCyajGuq 7 | ivFa+7rTyy6U+fSfGLW+rN7THYXmpIR7Jwym+DX1xJojefOBAkEA9ArInaN/dN1u 8 | 3Lby9WK+TbcK7S/L5AxNzGz/MnUTKj7GpiNoFal1b5bQ1b/Sg0l66TI0idmPQgWl 9 | pClPALQ4lwJBAMbKX90jsGkHiCtQ/wHCPNxsFkS+L4S6jZbk7MSaG7X9zPihXFdi 10 | UsSFIT4XHnB+Cgfc/Rkdwgg/ez93IAo/Ha8CQCP/TzZJfqx7WTX/Wnkttop6HId+ 11 | DGI4GmW0EjScJlaN6flpsZm4ZFUwdt+AqwmolhO9zxgiWkpP0O4VFc0xyEMCQE47 12 | EDTXubHrm+PoESLhDNB13OGastqaC+SJHMBWIXeidMqXvd5JvGbIOYfU007T2yCz 13 | EAuVUWmridY1DC/cHNMCQBhB1aqwiMvNp87kz90NGv9EnPDR9EiRb5KmToLhuU6Y 14 | mVqL3Ll7uWXZ5mitsKczoodoYi+QdOLKGhBucBSk+Kk= 15 | -----END RSA PRIVATE KEY----- 16 | -------------------------------------------------------------------------------- /sslcert/server.key.org: -------------------------------------------------------------------------------- 1 | -----BEGIN RSA PRIVATE KEY----- 2 | Proc-Type: 4,ENCRYPTED 3 | DEK-Info: DES-EDE3-CBC,39A6EEC4EA2E1E89 4 | 5 | 8pPGVFa38ZLhvwGrbDE5Z49dDM17yzyGFM/Q1aeTQ5pXqE9jwIjIcEMHVAkGnJ0P 6 | NObt7+3Xqr6ltwspCjtCah+1AG+HnO7hf0TPOzniRTfk3XmgqCnNaFIUZ71s0tEM 7 | 9KRvlghKzd0Q5NBFAB3GVuUZvhXdUP2R9H7iAQXGjRHjCsyYXjFKQNPD2vufZK5m 8 | 9tzcMgRgK+He3UorUWeUr1UuFeYI+KBR6QoxXdEDH64uC9KV2D5BipU2UO2EfT15 9 | JTjxQTCthm8zbIWu70xWWPuqppSAnzySTYFFT57xNuGdIAqLreUnwGniD/+wSf7t 10 | zLMVPFKPt1jQ/9qBlZPV6CV9GIh2YoFmE9YDZSLGTGxBJaU7WVcQNcMF8Akhh3Nm 11 | 8KnB7zdOqCVW6RK0UiQkXp3cxNIeqRYOvwDBJ+OOu8yLpeNR+NlLLru8MoEz46Zc 12 | CZ12B2PUG+uRvBRSnn09BllD9kb7cX+TEdRNF65Spq6FV0cqCOWHYLoGyFugCXN5 13 | jk6R8dTuWj6wmpxlErx7K4hkVeOKnVn0SlnepbsnYYkww6eLFUzzptD5RmpYTwaU 14 | G98Q18QaIDEn0gRUEjxq3rKJxCBVVvASYrcl0V1Cey94SPX5t8LvS7TJHKAJCdv+ 15 | plK65plMpdo96rhyKFyMvJc4+h2+RqWBG+mefOPVgeWAEnITqpQ5eFBziRZoRAsY 16 | 5IpqPjlsTm4/9oIbIjPh5uR6jHHeFAiM2EcRuhrvan7G2iJ7bkog/mvOqSTBdsdo 17 | 4EuDFSabGohTHYH5Sdt1TdxPsxk9YwY3ng+6Z5MmQtPUgHYu7q+sGA== 18 | -----END RSA PRIVATE KEY----- 19 | -------------------------------------------------------------------------------- /sslcert/test_policy.json: -------------------------------------------------------------------------------- 1 | { 2 | "VideoCaptureAllowedUrls": ["http://192.168.206.32/"] 3 | } 4 | -------------------------------------------------------------------------------- /static/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | "env": { 3 | "browser": true, 4 | "jquery": true 5 | }, 6 | "extends": "eslint:recommended", 7 | "rules": { 8 | "indent": [ 9 | "warn", 10 | 2 11 | ], 12 | "linebreak-style": [ 13 | "error", 14 | "unix" 15 | ], 16 | "quotes": [ 17 | "warn", 18 | "single" 19 | ], 20 | "semi": [ 21 | "warn", 22 | "always" 23 | ] 24 | } 25 | }; -------------------------------------------------------------------------------- /static/cam/i.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Camera view for marlin-conf 10 | 11 | 12 |
13 | 14 |
15 | -------------------------------------------------------------------------------- /static/cam/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Camera view for marlin-conf 10 | 11 | 12 |
13 | 14 |
15 | 16 |
17 | 18 |
19 | -------------------------------------------------------------------------------- /static/cam/main.css: -------------------------------------------------------------------------------- 1 | video { 2 | background: #222; 3 | margin: 0 0 20px 0; 4 | width: 100%; 5 | } -------------------------------------------------------------------------------- /static/cam/main0.js: -------------------------------------------------------------------------------- 1 | $(function(){ 2 | var streamID='uofgi4qqdvd'; 3 | var base=$('.cam-preview'); 4 | $.ajax('/upnp/local') 5 | .then(function(data){ 6 | var url='https://'+data.ip+':'+data.https+'/cam/'; 7 | base.find('.col-8 a').text(url).attr('href',url); 8 | }); 9 | base.find('.btn-warning').on('click',function(){ 10 | var url=$(this).siblings('a').attr('href'); 11 | var m=$('#mct-qr-modal'); 12 | m.find('.modal-body img').attr('src','/qr/'+encodeURI(btoa(url))) 13 | m.modal(); 14 | }); 15 | base.find('.onoffswitch').on('change',voice); 16 | var connection = new RTCMultiConnection(); 17 | connection.enableLogs=false; 18 | connection.socketURL = '/'; 19 | // connection.socketURL = 'https://'+location.hostname+':3002/'; 20 | // connection.socketURL = 'https://rtcmulticonnection.herokuapp.com:443/'; 21 | connection.socketMessageEvent = 'marlin-conf-cam'; 22 | connection.session = { 23 | audio: true, 24 | video: true, 25 | oneway: true, 26 | }; 27 | connection.sdpConstraints.mandatory = { 28 | OfferToReceiveAudio: false, 29 | OfferToReceiveVideo: false 30 | }; 31 | connection.onstream = function(event) { 32 | $('video')[0].src = event.mediaElement.src; 33 | connected=true; 34 | voice() 35 | }; 36 | //connection.dontAttachLocalStream = true; 37 | connection.dontCaptureUserMedia = true; 38 | var connected=false; 39 | function voice(){ 40 | var mode=base.find('.onoffswitch input').prop('checked') 41 | connection.streamEvents.selectFirst().stream[mode?'mute':'unmute']('audio') 42 | } 43 | function leave(){ 44 | connection.getAllParticipants().forEach(function(participantId) { 45 | connection.disconnectWith(participantId); 46 | }); 47 | } 48 | connection.onstreamended = function(event) { 49 | console.log('onstreamended') 50 | leave(); 51 | connected=false; 52 | join(); 53 | }; 54 | connection.onclose = function(event) { 55 | console.log('onclose') 56 | }; 57 | connection.onleave = function(event) { 58 | console.log('onleave') 59 | }; 60 | function join(){ 61 | if (connected) 62 | return; 63 | connection.checkPresence(streamID, function(isRoomExists, roomid) { 64 | if(isRoomExists) 65 | connection.join(roomid); 66 | }); 67 | } 68 | join(); 69 | setInterval(join,3000); 70 | }) 71 | -------------------------------------------------------------------------------- /static/css/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akaJes/marlin-config/d51e52eaa1bf6a1132ef2c2870a320b096441ce5/static/css/favicon.ico -------------------------------------------------------------------------------- /static/css/input-expand-group.css: -------------------------------------------------------------------------------- 1 | .input-expand-group { 2 | width: 40px; 3 | max-width: 300px; 4 | position: relative; 5 | } 6 | .input-expand-group > div { 7 | top:0; 8 | position: absolute; 9 | height:100%; 10 | display:flex; 11 | } 12 | .input-expand-group :nth-child(2) { 13 | left:10px; 14 | } 15 | .input-expand-group :nth-child(3) { 16 | right:10px; 17 | } 18 | .input-expand-group div * { 19 | margin-top:auto; 20 | margin-bottom:auto; 21 | } 22 | .input-expand-group div div { 23 | opacity:0; 24 | } 25 | .input-expand-group .form-control { 26 | padding-left:25px; 27 | width:100%; 28 | } 29 | 30 | .input-expand-group:focus-within div div { 31 | opacity:1; 32 | -webkit-transition:opacity 0.5s ease-in-out; 33 | } 34 | .input-expand-group.expanded, 35 | .input-expand-group:hover, 36 | .input-expand-group:focus-within { 37 | width:100%; 38 | -webkit-transition:width 0.5s ease-in-out; 39 | } 40 | -------------------------------------------------------------------------------- /static/css/spinner.css: -------------------------------------------------------------------------------- 1 | .spinner input { 2 | text-align: right; 3 | } 4 | .input-group-btn-vertical { 5 | position: relative; 6 | white-space: nowrap; 7 | vertical-align: middle; 8 | display: grid; 9 | text-align: center; 10 | } 11 | .input-group-btn-vertical > .btn { 12 | max-width: 100%; 13 | padding: 0 8px; 14 | margin-left: -1px; 15 | border-radius: 0; 16 | } 17 | .input-group-btn-vertical > .btn:first-child { 18 | border-top-right-radius: 4px; 19 | } 20 | .input-group-btn-vertical > .btn:last-child { 21 | margin-top: -2px; 22 | border-bottom-right-radius: 4px; 23 | } 24 | -------------------------------------------------------------------------------- /static/css/text-25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akaJes/marlin-config/d51e52eaa1bf6a1132ef2c2870a320b096441ce5/static/css/text-25.png -------------------------------------------------------------------------------- /static/css/toggle.css: -------------------------------------------------------------------------------- 1 | /* 2 | based on https://proto.io/freebies/onoff/ 3 | auto resize 4 | custom texts 5 | 6 | TODO: wrap with $(document).on('DOMNodeInserted', 'input', function () { }); 7 | */ 8 | .onoffswitch { 9 | position: relative; 10 | -webkit-user-select:none; -moz-user-select:none; -ms-user-select: none; 11 | display:inline-block; 12 | width:auto; 13 | box-sizing: initial; 14 | vertical-align: middle; 15 | } 16 | .onoffswitch-checkbox { 17 | position: absolute; 18 | left: 0; 19 | opacity: 0; 20 | overflow: hidden; 21 | clip: rect(0 0 0 0); 22 | } 23 | .onoffswitch label { 24 | display: block; overflow: hidden; cursor: pointer; 25 | border: 1px solid #999999; border-radius: 20px; 26 | margin-bottom:0; 27 | text-align: left; 28 | } 29 | .onoffswitch-inner { 30 | display: block; width: 200%; margin-left: -100%; 31 | transition: margin 0.3s ease-in 0s; 32 | } 33 | .onoffswitch-inner:before, .onoffswitch-inner:after { 34 | display: block; float: left; width: 50%; height: 30px; padding: 0; line-height: 30px; 35 | font-size: 14px; color: white; font-family: Trebuchet, Arial, sans-serif; font-weight: bold; 36 | box-sizing: border-box; 37 | } 38 | .onoffswitch-inner:before { 39 | content: attr(data-content-on); 40 | padding-left: 10px; 41 | background-color: #0275d8; color: #FFFFFF; 42 | } 43 | .onoffswitch-inner:after { 44 | content: attr(data-content-off); 45 | padding-right: 10px; 46 | *background-color: #EEEEEE; color: #999999; 47 | padding-left:30px; 48 | margin-right:-22px; 49 | text-align:center; 50 | } 51 | .onoffswitch-switch { 52 | display: block; width: 18px; height:18px;margin: 6px; 53 | background: #FFFFFF; 54 | position: absolute; top: 0; bottom: 0; 55 | left: 0; 56 | border: 1px solid #999999; border-radius: 20px; 57 | transition: all 0.3s ease-in 0s; 58 | } 59 | .onoffswitch label .onoffswitch-checkbox:checked ~ .onoffswitch-inner { 60 | margin-left: 0; 61 | } 62 | .onoffswitch label .onoffswitch-checkbox:checked ~ .onoffswitch-switch { 63 | left: 100%; 64 | margin-left:-28px; 65 | } -------------------------------------------------------------------------------- /static/editor/editor.css: -------------------------------------------------------------------------------- 1 | /* editor*/ 2 | .added-gutter { background-color: rgba(0,170,0,.33); } 3 | .changed-gutter { background-color: rgba(170,0,0,.33); } 4 | .changed-text { background-color: rgba(170,0,0,.14); position:absolute; z-index:2;} 5 | .added-text { background-color: rgba(0,170,0,.14); position:absolute; z-index:2;} 6 | .ace_gutter-cell { background-repeat: no-repeat; } 7 | /* layout */ 8 | html, body { 9 | margin:0; 10 | height: 100%; 11 | } 12 | 13 | .stickit { 14 | display: flex; 15 | } 16 | .stickit.top { 17 | flex-flow: column; 18 | height: 100%; 19 | } 20 | .stickit>*:nth-child(1) { 21 | flex: 0 0 auto; 22 | } 23 | .stickit>*:nth-child(2) { 24 | flex: 1 1 auto; 25 | } 26 | 27 | .uploader { 28 | min-width: 500px; 29 | line-height: 28px; 30 | padding-left: 10px; 31 | background-color: linen; 32 | color: green; 33 | } 34 | .tree { 35 | width: 250px; 36 | overflow: auto; 37 | display: inline-block; 38 | } 39 | .jstree-contextmenu { 40 | z-index: 5; 41 | } 42 | 43 | #previewTab { 44 | height:100%; 45 | width:100%; 46 | background-color: #EEE; 47 | padding:5px; 48 | } 49 | 50 | .nav-tabs { 51 | overflow-x: auto; 52 | overflow-y: hidden; 53 | display: -webkit-box; 54 | display: -moz-box; 55 | } 56 | .nav-tabs>li { 57 | float:none; 58 | } 59 | 60 | /* selection marker */ 61 | .remoteCaret { 62 | position: absolute; 63 | } 64 | 65 | .squareCaret { 66 | position: absolute; 67 | top: -6px; 68 | left: -2px; 69 | width: 6px; 70 | height: 6px; 71 | } 72 | 73 | .infoCaret { 74 | position: absolute; 75 | bottom: 6px; 76 | left: -6px; 77 | padding: 2px 4px; 78 | color: #333; 79 | } 80 | -------------------------------------------------------------------------------- /static/editor/helpers.js: -------------------------------------------------------------------------------- 1 | function debounce(f, ms, obj) { 2 | var timer; 3 | return function () { 4 | var self = this, args = arguments; 5 | timer && clearTimeout(timer); 6 | timer = setTimeout(function() { 7 | f && f.apply(obj || self, args); 8 | timer = null; 9 | }, ms); 10 | } 11 | } 12 | function toggleFullScreen() { 13 | var doc = window.document; 14 | var docEl = doc.documentElement; 15 | 16 | var requestFullScreen = docEl.requestFullscreen || docEl.mozRequestFullScreen || docEl.webkitRequestFullScreen || docEl.msRequestFullscreen; 17 | var cancelFullScreen = doc.exitFullscreen || doc.mozCancelFullScreen || doc.webkitExitFullscreen || doc.msExitFullscreen; 18 | 19 | if(!doc.fullscreenElement && !doc.mozFullScreenElement && !doc.webkitFullscreenElement && !doc.msFullscreenElement) { 20 | requestFullScreen.call(docEl); 21 | } 22 | else { 23 | cancelFullScreen.call(doc); 24 | } 25 | } 26 | function isElectron() { 27 | return navigator.userAgent.toLowerCase().indexOf(' electron/') >= 0; 28 | } -------------------------------------------------------------------------------- /static/editor/to-the-point.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akaJes/marlin-config/d51e52eaa1bf6a1132ef2c2870a320b096441ce5/static/editor/to-the-point.mp3 -------------------------------------------------------------------------------- /static/git/ThreeCSG.url: -------------------------------------------------------------------------------- 1 | https://raw.githubusercontent.com/chandlerprall/ThreeCSG/master/ThreeCSG.js -------------------------------------------------------------------------------- /static/git/bootstrap-treeview/bootstrap-treeview.min.css: -------------------------------------------------------------------------------- 1 | .treeview .list-group-item{cursor:pointer}.treeview span.indent{margin-left:10px;margin-right:10px}.treeview span.icon{width:12px;margin-right:5px}.treeview .node-disabled{color:silver;cursor:not-allowed} -------------------------------------------------------------------------------- /static/git/three/examples/js/controls/PointerLockControls.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @author mrdoob / http://mrdoob.com/ 3 | */ 4 | 5 | THREE.PointerLockControls = function ( camera ) { 6 | 7 | var scope = this; 8 | 9 | camera.rotation.set( 0, 0, 0 ); 10 | 11 | var pitchObject = new THREE.Object3D(); 12 | pitchObject.add( camera ); 13 | 14 | var yawObject = new THREE.Object3D(); 15 | yawObject.position.y = 10; 16 | yawObject.add( pitchObject ); 17 | 18 | var PI_2 = Math.PI / 2; 19 | 20 | var onMouseMove = function ( event ) { 21 | 22 | if ( scope.enabled === false ) return; 23 | 24 | var movementX = event.movementX || event.mozMovementX || event.webkitMovementX || 0; 25 | var movementY = event.movementY || event.mozMovementY || event.webkitMovementY || 0; 26 | 27 | yawObject.rotation.y -= movementX * 0.002; 28 | pitchObject.rotation.x -= movementY * 0.002; 29 | 30 | pitchObject.rotation.x = Math.max( - PI_2, Math.min( PI_2, pitchObject.rotation.x ) ); 31 | 32 | }; 33 | 34 | this.dispose = function() { 35 | 36 | document.removeEventListener( 'mousemove', onMouseMove, false ); 37 | 38 | }; 39 | 40 | document.addEventListener( 'mousemove', onMouseMove, false ); 41 | 42 | this.enabled = false; 43 | 44 | this.getObject = function () { 45 | 46 | return yawObject; 47 | 48 | }; 49 | 50 | this.getDirection = function() { 51 | 52 | // assumes the camera itself is not rotated 53 | 54 | var direction = new THREE.Vector3( 0, 0, - 1 ); 55 | var rotation = new THREE.Euler( 0, 0, 0, "YXZ" ); 56 | 57 | return function( v ) { 58 | 59 | rotation.set( pitchObject.rotation.x, yawObject.rotation.y, 0 ); 60 | 61 | v.copy( direction ).applyEuler( rotation ); 62 | 63 | return v; 64 | 65 | }; 66 | 67 | }(); 68 | 69 | }; 70 | -------------------------------------------------------------------------------- /static/git/three/examples/js/exporters/STLExporter.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @author kovacsv / http://kovacsv.hu/ 3 | * @author mrdoob / http://mrdoob.com/ 4 | */ 5 | 6 | THREE.STLExporter = function () {}; 7 | 8 | THREE.STLExporter.prototype = { 9 | 10 | constructor: THREE.STLExporter, 11 | 12 | parse: ( function () { 13 | 14 | var vector = new THREE.Vector3(); 15 | var normalMatrixWorld = new THREE.Matrix3(); 16 | 17 | return function parse( scene ) { 18 | 19 | var output = ''; 20 | 21 | output += 'solid exported\n'; 22 | 23 | scene.traverse( function ( object ) { 24 | 25 | if ( object instanceof THREE.Mesh ) { 26 | 27 | var geometry = object.geometry; 28 | var matrixWorld = object.matrixWorld; 29 | 30 | if( geometry instanceof THREE.BufferGeometry ) { 31 | 32 | geometry = new THREE.Geometry().fromBufferGeometry( geometry ); 33 | 34 | } 35 | 36 | if ( geometry instanceof THREE.Geometry ) { 37 | 38 | var vertices = geometry.vertices; 39 | var faces = geometry.faces; 40 | 41 | normalMatrixWorld.getNormalMatrix( matrixWorld ); 42 | 43 | for ( var i = 0, l = faces.length; i < l; i ++ ) { 44 | 45 | var face = faces[ i ]; 46 | 47 | vector.copy( face.normal ).applyMatrix3( normalMatrixWorld ).normalize(); 48 | 49 | output += '\tfacet normal ' + vector.x + ' ' + vector.y + ' ' + vector.z + '\n'; 50 | output += '\t\touter loop\n'; 51 | 52 | var indices = [ face.a, face.b, face.c ]; 53 | 54 | for ( var j = 0; j < 3; j ++ ) { 55 | 56 | vector.copy( vertices[ indices[ j ] ] ).applyMatrix4( matrixWorld ); 57 | 58 | output += '\t\t\tvertex ' + vector.x + ' ' + vector.y + ' ' + vector.z + '\n'; 59 | 60 | } 61 | 62 | output += '\t\tendloop\n'; 63 | output += '\tendfacet\n'; 64 | 65 | } 66 | 67 | } 68 | 69 | } 70 | 71 | } ); 72 | 73 | output += 'endsolid exported\n'; 74 | 75 | return output; 76 | 77 | }; 78 | 79 | }() ) 80 | 81 | }; 82 | -------------------------------------------------------------------------------- /static/git/three/examples/js/exporters/TypedGeometryExporter.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @author mrdoob / http://mrdoob.com/ 3 | */ 4 | 5 | THREE.TypedGeometryExporter = function () {}; 6 | 7 | THREE.TypedGeometryExporter.prototype = { 8 | 9 | constructor: THREE.TypedGeometryExporter, 10 | 11 | parse: function ( geometry ) { 12 | 13 | var output = { 14 | metadata: { 15 | version: 4.0, 16 | type: 'TypedGeometry', 17 | generator: 'TypedGeometryExporter' 18 | } 19 | }; 20 | 21 | var attributes = [ 'vertices', 'normals', 'uvs' ]; 22 | 23 | for ( var key in attributes ) { 24 | 25 | var attribute = attributes[ key ]; 26 | 27 | var typedArray = geometry[ attribute ]; 28 | var array = []; 29 | 30 | for ( var i = 0, l = typedArray.length; i < l; i ++ ) { 31 | 32 | array[ i ] = typedArray[ i ]; 33 | 34 | } 35 | 36 | output[ attribute ] = array; 37 | 38 | } 39 | 40 | var boundingSphere = geometry.boundingSphere; 41 | 42 | if ( boundingSphere !== null ) { 43 | 44 | output.boundingSphere = { 45 | center: boundingSphere.center.toArray(), 46 | radius: boundingSphere.radius 47 | } 48 | 49 | } 50 | 51 | return output; 52 | 53 | } 54 | 55 | }; 56 | -------------------------------------------------------------------------------- /views/_Bootscreen.h: -------------------------------------------------------------------------------- 1 | /** 2 | * Marlin 3D Printer Firmware 3 | * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] 4 | * 5 | * Based on Sprinter and grbl. 6 | * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm 7 | * 8 | * This program is free software: you can redistribute it and/or modify 9 | * it under the terms of the GNU General Public License as published by 10 | * the Free Software Foundation, either version 3 of the License, or 11 | * (at your option) any later version. 12 | * 13 | * This program is distributed in the hope that it will be useful, 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | * GNU General Public License for more details. 17 | * 18 | * You should have received a copy of the GNU General Public License 19 | * along with this program. If not, see . 20 | * 21 | */ 22 | 23 | /** 24 | * Custom Bitmap for splashscreen 25 | * 26 | * This file was generated with marlin-config https://github.com/akaJes/marlin-config/ 27 | * 28 | * You may use one of the following tools to generate the C++ bitmap array from 29 | * a black and white image: 30 | * 31 | * - http://www.marlinfw.org/tools/u8glib/converter.html 32 | * - http://www.digole.com/tools/PicturetoC_Hex_converter.php 33 | */ 34 | #include 35 | 36 | #define CUSTOM_BOOTSCREEN_TIMEOUT {{timeout}} 37 | #define CUSTOM_BOOTSCREEN_BMPWIDTH {{width}} 38 | #define CUSTOM_BOOTSCREEN_BMPHEIGHT {{height}} 39 | 40 | const unsigned char custom_start_bmp[] PROGMEM = { 41 | {{data}} 42 | }; 43 | -------------------------------------------------------------------------------- /views/gcode/G004.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: g04 3 | title: Dwell 4 | brief: Pause the planner 5 | author: thinkyhead 6 | 7 | experimental: false 8 | since: 1.0.0-beta 9 | group: planner 10 | 11 | codes: 12 | - G4 13 | 14 | long: 15 | - Dwell pauses the command queue and waits for a period of time. 16 | 17 | notes: 18 | - If both `S` and `P` are included, `S` takes precedence. 19 | - '`M0`/`M1` provides an interruptible "dwell" (Marlin 1.1.0 and up).' 20 | - '`G4` with no arguments is effectively the same as `M400`.' 21 | 22 | parameters: 23 | - 24 | tag: S 25 | optional: true 26 | description: Amount of time to dwell 27 | values: 28 | - 29 | tag: time 30 | type: int 31 | unit: sec 32 | - 33 | tag: P 34 | optional: true 35 | description: Amount of time to dwell 36 | values: 37 | - 38 | tag: time 39 | type: int 40 | unit: ms 41 | 42 | example: 43 | - 44 | code: 45 | - G4 P500 ; Dwell for 1/2 second 46 | --- 47 | -------------------------------------------------------------------------------- /views/gcode/G010.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: g10 3 | title: Retract 4 | brief: Retract the filament 5 | author: thinkyhead 6 | 7 | experimental: false 8 | since: 1.0.0-beta 9 | requires: FWRETRACT 10 | group: planner 11 | 12 | codes: 13 | - G10 14 | 15 | long: 16 | - Retract the filament according to settings of [`M207`](/docs/gcode/M207.html). 17 | - Firmware retraction allows you to tune retraction at the machine level and can significantly reduce the size of G-code files. 18 | - Multiple consecutive `G10` or `G10 S1` commands without a corresponding `G11` or `G11 S1` will be ignored. 19 | - "Performs two moves: a retract move at the retract feedrate/acceleration, and an optional Z lift at the maximum Z feedrate (travel acceleration)." 20 | 21 | notes: 22 | - Requires `FWRETRACT`. 23 | - See related codes [`G11`](/docs/gcode/G011.html), [`M207`](/docs/gcode/M207.html), [`M208`](/docs/gcode/M208.html), and [`M209`](/docs/gcode/M209.html). 24 | 25 | parameters: 26 | - 27 | tag: S 28 | optional: true 29 | description: Use `G10 S1` to do a swap retraction, before changing extruders. The subsequent `G11` (after tool change) will do a swap recover. (Requires `EXTRUDERS` > 1) 30 | values: 31 | - 32 | tag: flag 33 | type: bool 34 | 35 | example: 36 | - 37 | code: 38 | - G10 ; retract 39 | --- 40 | -------------------------------------------------------------------------------- /views/gcode/G011.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: g11 3 | title: Recover 4 | brief: Recover the filament with firmware-based retract. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: FWRETRACT 9 | since: 1.0.0-beta 10 | group: planner 11 | 12 | codes: 13 | - G11 14 | 15 | long: 16 | - Unretract (i.e., recover, prime) the filament according to settings of [`M208`](/docs/gcode/M208.html). 17 | - Multiple consecutive `G11` or `G11 S1` commands without a corresponding `G10` or `G10 S1` will be ignored. 18 | - "Performs two moves: An optional Z lower at the maximum Z feedrate (travel acceleration), and a recovery move at the recover feedrate (retract acceleration)." 19 | 20 | notes: 21 | - Requires `FWRETRACT`. 22 | - See related codes [`G10`](/docs/gcode/G010.html), [`M207`](/docs/gcode/M207.html), [`M208`](/docs/gcode/M208.html), and [`M209`](/docs/gcode/M209.html). 23 | 24 | example: 25 | - 26 | code: 27 | - G11 ; recover 28 | --- 29 | -------------------------------------------------------------------------------- /views/gcode/G020.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: g20 3 | title: Inch Units 4 | brief: Set Units to Inches. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | since: 1.1.0 9 | requires: INCH_MODE_SUPPORT 10 | group: units 11 | 12 | codes: 13 | - G20 14 | 15 | long: 16 | - Set units to inches. In this mode, all positions, offsets, rates, accelerations, etc., specified in G-code parameters are interpreted as inches. 17 | 18 | example: 19 | - 20 | code: 21 | - G20 ; set units to inches 22 | --- 23 | -------------------------------------------------------------------------------- /views/gcode/G021.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: g21 3 | title: Millimeter Units 4 | brief: Set Units to Millimeters. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | since: 1.1.0 9 | requires: INCH_MODE_SUPPORT 10 | group: units 11 | 12 | codes: 13 | - G21 14 | 15 | long: Set units to millimeters. In this mode, all positions, offsets, rates, accelerations, etc., specified in GCode parameters are interpreted as millimeters. 16 | 17 | example: 18 | - 19 | code: 20 | - G21 ; set units to millimeters 21 | --- 22 | -------------------------------------------------------------------------------- /views/gcode/G027.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: g27 3 | title: Park the nozzle 4 | brief: Move the nozzle to a predefined position. 5 | 6 | experimental: true 7 | since: 1.1.0 8 | requires: NOZZLE_PARK_FEATURE 9 | group: nozzle 10 | 11 | codes: 12 | - G27 13 | 14 | long: Park the nozzle at a predefined XYZ position. 15 | 16 | notes: 17 | - Requires `NOZZLE_PARK_FEATURE`. 18 | - The park position is defined by `NOZZLE_PARK_POINT`. 19 | 20 | parameters: 21 | - 22 | tag: P 23 | optional: true 24 | description: 'Z axis action' 25 | values: 26 | - 27 | tag: 0 28 | description: If current Z-pos is lower than Z-park then the nozzle will be raised to reach Z-park height 29 | - 30 | tag: 1 31 | description: No matter the current Z-pos, the nozzle will be raised/lowered to reach Z-park height 32 | - 33 | tag: 2 34 | description: The nozzle height will be raised by Z-park amount but never going over the machine's limit of `Z_MAX_POS` 35 | 36 | examples: 37 | - 38 | pre: 39 | The most basic example is to use the command without any arguments, this will default to a move the the parking position and raising the Z-pos if lower than the default Z-park position. 40 | code: 41 | - G27 ; raise Z if lower 42 | - 43 | pre: 44 | This one is useful to be used on the end-script of a print, it will raise the Z-pos by Z-park. 45 | code: 46 | - G27 P2 ; always raise Z 47 | 48 | --- 49 | -------------------------------------------------------------------------------- /views/gcode/G028.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: g28 3 | title: Auto Home 4 | brief: Auto home one or more axes. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | group: calibration 9 | 10 | codes: 11 | - G28 12 | 13 | long: 14 | - Auto-home one or more axes, moving them towards their endstops until triggered. Each axis is backed off and re-bumped according to the `[XYZ]_HOME_BUMP_MM` and `HOMING_BUMP_DIVISOR` settings. 15 | 16 | notes: 17 | - Homing is required before `G29`, `M48`, and some other procedures. 18 | - If homing is needed the LCD will blink the X Y Z indicators. 19 | 20 | parameters: 21 | - 22 | tag: O 23 | type: boolean 24 | optional: true 25 | description: Optional. If the position is known then exit without homing. (1.1.9) 26 | - 27 | tag: R 28 | type: float 29 | optional: true 30 | description: Raise before homing distance (1.1.9) 31 | - 32 | tag: X 33 | type: boolean 34 | optional: true 35 | description: Flag to go back to the X axis origin 36 | - 37 | tag: Y 38 | type: boolean 39 | optional: true 40 | description: Flag to go back to the Y axis origin 41 | - 42 | tag: Z 43 | type: boolean 44 | optional: true 45 | description: A coordinate on the Z axis 46 | 47 | examples: 48 | - 49 | pre: 50 | - 'The most-used form of this command is to home all axes:' 51 | code: 52 | - G28 ; Go to origin on all axes 53 | post: 54 | - With no arguments to `G28`, Marlin homes according to the `Z_SAFE_HOMING`, `QUICK_HOME` and `HOME_Y_BEFORE_X` settings. 55 | 56 | - 57 | code: 58 | - G28 X Z ; Home the X and Z axes 59 | --- 60 | -------------------------------------------------------------------------------- /views/gcode/G030.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: g30 3 | title: Single Z-Probe 4 | brief: Probe bed at current XY location 5 | author: thinkyhead 6 | 7 | experimental: false 8 | since: 1.0.0-beta 9 | requires: HAS_BED_PROBE 10 | group: calibration 11 | 12 | codes: 13 | - G30 14 | 15 | long: Do a single Z probe at a specified position. By default probe in the current position. 16 | 17 | parameters: 18 | - 19 | tag: X 20 | optional: true 21 | description: X probe position 22 | values: 23 | - 24 | tag: pos 25 | type: float 26 | - 27 | tag: Y 28 | optional: true 29 | description: Y probe position 30 | values: 31 | - 32 | tag: pos 33 | type: float 34 | - 35 | tag: E 36 | optional: true 37 | description: Engage the probe for each point. 38 | values: 39 | - 40 | type: bool 41 | - 42 | default: 0 43 | 44 | notes: 45 | 46 | --- 47 | -------------------------------------------------------------------------------- /views/gcode/G031.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: g31 3 | title: Dock Sled 4 | brief: Dock the Z probe sled. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | since: 1.0.0-beta 9 | requires: Z_PROBE_SLED 10 | group: planner 11 | 12 | codes: 13 | - G31 14 | 15 | long: Dock the Z probe sled. 16 | 17 | notes: Requires `Z_PROBE_SLED`. 18 | 19 | example: 20 | - 21 | pre: Dock the sled 22 | code: G31 23 | 24 | --- 25 | -------------------------------------------------------------------------------- /views/gcode/G032.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: g32 3 | title: Undock Sled 4 | brief: Undock the Z probe sled. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | since: 1.0.0-beta 9 | requires: Z_PROBE_SLED 10 | group: planner 11 | 12 | codes: 13 | - G32 14 | 15 | long: Undock the Z probe sled. 16 | 17 | notes: 18 | 19 | example: 20 | - 21 | pre: Undock the sled 22 | code: G32 23 | 24 | --- 25 | -------------------------------------------------------------------------------- /views/gcode/G038.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: g38 3 | title: Probe target 4 | brief: Probe towards a workpiece and stop on contact. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | since: 1.1.0 9 | requires: G38_PROBE_TARGET 10 | group: calibration 11 | 12 | codes: 13 | - G38.2 14 | - G38.3 15 | 16 | long: 17 | - | 18 | The Probe Target commands are used to probe towards a workpiece and determine its precise position. The Z endstop doubles as the probe for these commands. You might, for example, use a grounded metal workpiece, with a metal probe spliced into the Z endstop circuit. 19 | 20 | - `G38.2` probes towards a target and stops on contact, signaling an error if it reaches the target position without triggering the Z endstop. 21 | - `G38.3` probes towards a target and stops on contact. No error is given if it fails to trigger the Z endstop. 22 | 23 | These commands use the current homing feedrate, by default. 24 | 25 | notes: 26 | - | 27 | 28 | These commands require `G38_PROBE_TARGET`. 29 | 30 | parameters: 31 | - 32 | tag: X 33 | optional: true 34 | description: Target X 35 | values: 36 | - 37 | tag: pos 38 | type: float 39 | - 40 | tag: Y 41 | optional: true 42 | description: Target Y 43 | values: 44 | - 45 | tag: pos 46 | type: float 47 | - 48 | tag: Z 49 | optional: true 50 | description: Target Z 51 | values: 52 | - 53 | tag: pos 54 | type: float 55 | - 56 | tag: F 57 | optional: true 58 | description: Feedrate for the move 59 | values: 60 | - 61 | tag: rate 62 | type: float 63 | 64 | examples: 65 | 66 | --- 67 | 68 | -------------------------------------------------------------------------------- /views/gcode/G042.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: g42 3 | title: Move to mesh coordinate 4 | brief: Move to a specific point in the leveling mesh 5 | author: ManuelMcLure 6 | 7 | experimental: false 8 | since: 1.1.2 9 | requires: HAS_MESH 10 | group: calibration 11 | 12 | codes: 13 | - G42 14 | 15 | long: | 16 | The `G42` command moves the nozzle to the location corresponding to a specific coordinate in the bed leveling mesh. It operates similarly to the `G0` and `G1` commands except that the provided coordinates are a mesh row and column instead of an absolute or relative position on the bed. 17 | 18 | The `G42` command will determine the bed position that corresponds to the provided mesh row and column and move the nozzle to that position. 19 | 20 | parameters: 21 | - 22 | tag: I 23 | optional: true 24 | description: The column of the mesh coordinate 25 | values: 26 | - 27 | tag: pos 28 | type: float 29 | - 30 | tag: J 31 | optional: true 32 | description: The row of the mesh coordinate 33 | values: 34 | - 35 | tag: pos 36 | type: float 37 | - 38 | tag: F 39 | optional: true 40 | description: The maximum movement rate of the move between the start and end point. The feedrate set here applies to subsequent moves that omit this parameter. 41 | values: 42 | - 43 | tag: rate 44 | type: float 45 | 46 | examples: 47 | - 48 | pre: Move to various points on a 9x9 mesh 49 | code: 50 | - G42 I0 J0 ; front left corner 51 | - G42 I4 J4 ; center 52 | - G42 I4 J8 ; back center 53 | - G42 I8 J8 ; back right 54 | 55 | --- 56 | -------------------------------------------------------------------------------- /views/gcode/G090.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: g90 3 | title: Absolute Positioning 4 | brief: Use absolute positions. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | since: 1.0.0-beta 9 | group: units 10 | 11 | codes: 12 | - G90 13 | 14 | long: 15 | - In absolute mode all coordinates given in G-code are interpreted as positions in the logical coordinate space. This includes the extruder position unless overridden by [`M83`](/docs/gcode/M083.html). 16 | 17 | notes: 18 | - Absolute positioning is the default. 19 | 20 | --- 21 | -------------------------------------------------------------------------------- /views/gcode/G091.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: g91 3 | title: Relative Positioning 4 | brief: Use relative positions. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | since: 1.0.0-beta 9 | group: units 10 | 11 | codes: 12 | - G91 13 | 14 | long: 15 | - Set relative position mode. In this mode all coordinates are interpreted as relative to the last position. This includes the extruder position unless overridden by [`M82`](/docs/gcode/M082.html). 16 | 17 | --- 18 | -------------------------------------------------------------------------------- /views/gcode/G092.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: g92 3 | title: Set Position 4 | brief: Set the current position of one or more axes. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | since: 1.0.0-beta 9 | group: planner 10 | 11 | codes: 12 | - G92 13 | 14 | long: 15 | - Set the current position to the values specified. In Marlin 1.1.0 and up, the software endstops are adjusted to preserve the physical movement limits. Thus you could use `G92` to set the middle of the bed to 0,0 and then run .gcode that was sliced for a Deltabot. 16 | 17 | notes: 18 | - In earlier versions of Marlin `G92` doesn't update the software endstops, so it was unsupported to set coordinates outside these boundaries. In Marlin 1.1.0 and up, the physical boundaries are maintained. This means you can no longer use `G92` to move below the bed, for example. 19 | 20 | parameters: 21 | - 22 | tag: X 23 | optional: true 24 | description: New X axis position 25 | values: 26 | - 27 | tag: pos 28 | type: float 29 | - 30 | tag: Y 31 | optional: true 32 | description: New Y axis position 33 | values: 34 | - 35 | tag: pos 36 | type: float 37 | - 38 | tag: Z 39 | optional: true 40 | description: New Z axis position 41 | values: 42 | - 43 | tag: pos 44 | type: float 45 | - 46 | tag: E 47 | optional: true 48 | description: New extruder position 49 | values: 50 | - 51 | tag: pos 52 | type: float 53 | 54 | examples: 55 | - 56 | pre: 57 | - Specify that the nozzle's current X position is 10 and the current extruder position is 90. 58 | code: 59 | - G92 X10 E90 60 | - 61 | pre: 62 | - Specify that the nozzle's current XYZ position is 0, 0, 0. 63 | code: 64 | - G92 X0 Y0 Z0 65 | --- 66 | -------------------------------------------------------------------------------- /views/gcode/M000-M001.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m000 3 | title: Unconditional stop 4 | brief: Stop and wait for user. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | since: 1.0.0-beta 9 | group: planner 10 | 11 | codes: 12 | - M0 13 | - M1 14 | 15 | long: 16 | - The `M0` and `M1` commands pause after the last movement and wait for the user to continue. 17 | 18 | notes: 19 | - If both `S` and `P` are included, `S` takes precedence. 20 | - Without an LCD controller or `EMERGENCY_PARSER` this command is ignored. 21 | - With `EMERGENCY_PARSER` enabled the `M108` command can be used to continue. 22 | 23 | parameters: 24 | - 25 | tag: S 26 | optional: true 27 | description: Expire time, in seconds 28 | values: 29 | - 30 | tag: sec 31 | type: int 32 | - 33 | tag: P 34 | optional: true 35 | description: Expire time, in milliseconds 36 | values: 37 | - 38 | tag: ms 39 | type: int 40 | - 41 | tag: string 42 | optional: true 43 | description: An optional message to display on the LCD 44 | 45 | examples: 46 | - 47 | pre: 48 | Stop and wait 49 | code: 50 | - M0 51 | 52 | - 53 | pre: 54 | Display a message, stop, and wait 55 | code: 56 | - M0 Click to continue 57 | 58 | --- 59 | -------------------------------------------------------------------------------- /views/gcode/M003.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m003 3 | title: Spindle CW / Laser On 4 | brief: Set the spindle CW speed or laser power 5 | author: thinkyhead 6 | 7 | experimental: false 8 | since: 1.1.2 9 | requires: SPINDLE_LASER_ENABLE 10 | group: control 11 | 12 | codes: 13 | - M3 14 | 15 | long: Wait for moves to complete, then set the spindle speed (clockwise) or laser power. 16 | 17 | notes: 18 | 19 | parameters: 20 | - 21 | tag: S 22 | optional: true 23 | description: Spindle speed or laser power 24 | values: 25 | - 26 | tag: power 27 | type: byte 28 | 29 | examples: 30 | - 31 | pre: Set spindle rotation clockwise at 50% 32 | code: M3 S128 33 | - 34 | pre: Turn on the laser at full power 35 | code: M3 36 | 37 | --- 38 | -------------------------------------------------------------------------------- /views/gcode/M004.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m004 3 | title: Spindle CCW / Laser On 4 | brief: Set the spindle CCW speed or laser power 5 | author: thinkyhead 6 | 7 | experimental: false 8 | since: 1.1.2 9 | requires: SPINDLE_LASER_ENABLE 10 | group: control 11 | 12 | codes: 13 | - M4 14 | 15 | long: Wait for moves to complete, then set the spindle speed (counter-clockwise) or laser power. 16 | 17 | notes: 18 | 19 | parameters: 20 | - 21 | tag: S 22 | optional: true 23 | description: Spindle speed or laser power 24 | values: 25 | - 26 | tag: power 27 | type: byte 28 | 29 | examples: 30 | - 31 | pre: Set spindle rotation counter-clockwise at 50% 32 | code: M4 S128 33 | - 34 | pre: Turn on the laser at full power 35 | code: M4 36 | 37 | --- 38 | -------------------------------------------------------------------------------- /views/gcode/M005.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m005 3 | title: Spindle / Laser Off 4 | brief: Turn off spindle or laser 5 | author: thinkyhead 6 | 7 | experimental: false 8 | since: 1.1.2 9 | requires: SPINDLE_LASER_ENABLE 10 | group: control 11 | 12 | codes: 13 | - M5 14 | 15 | long: Wait for moves to complete, then turn off the spindle / laser power and PWM. 16 | 17 | notes: 18 | 19 | parameters: 20 | 21 | examples: 22 | - 23 | pre: Turn off the spindle or laser 24 | code: M5 25 | 26 | --- 27 | -------------------------------------------------------------------------------- /views/gcode/M017.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m017 3 | title: Enable Steppers 4 | brief: Power on all steppers 5 | author: thinkyhead 6 | 7 | experimental: false 8 | group: control 9 | 10 | codes: 11 | - M17 12 | 13 | long: Enable power on all stepper motors. 14 | 15 | notes: 16 | 17 | parameters: 18 | 19 | examples: 20 | - 21 | pre: Enable power on all stepper motors 22 | code: M17 23 | 24 | --- 25 | -------------------------------------------------------------------------------- /views/gcode/M018.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m018 3 | title: Disable steppers 4 | brief: Disable steppers (same as M84). 5 | author: thinkyhead 6 | 7 | experimental: false 8 | group: control 9 | 10 | codes: 11 | - M18 12 | - M84 13 | 14 | long: | 15 | This command can be used to set the stepper inactivity timeout (`S`) or to disable one or more steppers (`X`,`Y`,`Z`,`E`). 16 | 17 | If a timeout is given with `S`, this command just sets the stepper inactivity timeout. 18 | 19 | If no steppers are specified, this command disables all steppers immediately. 20 | 21 | If one or more axes are specified, this command disables the specified steppers immediately. 22 | 23 | notes: 24 | 25 | parameters: 26 | - 27 | tag: S 28 | optional: true 29 | description: Inactivity Timeout. If none specified, disable now. 30 | values: 31 | - 32 | tag: seconds 33 | type: int 34 | - 35 | tag: X 36 | optional: true 37 | description: X Disable 38 | values: 39 | - 40 | tag: flag 41 | type: bool 42 | - 43 | tag: Y 44 | optional: true 45 | description: Y Disable 46 | values: 47 | - 48 | tag: flag 49 | type: bool 50 | - 51 | tag: Z 52 | optional: true 53 | description: Z Disable 54 | values: 55 | - 56 | tag: flag 57 | type: bool 58 | - 59 | tag: E 60 | optional: true 61 | description: E Disable 62 | values: 63 | - 64 | tag: flag 65 | type: bool 66 | 67 | examples: 68 | - 69 | pre: Set the stepper inactivity timeout to 1 minute 70 | code: M18 S60 71 | - 72 | pre: Disable all steppers immediately 73 | code: M18 74 | - 75 | pre: Disable Z and E steppers immediately 76 | code: M18 Z E 77 | 78 | --- 79 | 80 | -------------------------------------------------------------------------------- /views/gcode/M020.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m020 3 | title: List SD Card 4 | brief: List the contents of the SD Card. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: SDSUPPORT 9 | group: sdcard 10 | 11 | codes: 12 | - M20 13 | 14 | long: | 15 | List the entire contents of the SD card to serial output in the more compact DOS 8.3 format. 16 | 17 | Marlin 1.1.0 includes file sizes in the output. 18 | 19 | notes: 20 | - Requires [`SDSUPPORT`](/docs/configuration/configuration.html#sd-card) 21 | 22 | parameters: 23 | 24 | examples: 25 | 26 | --- 27 | 28 | -------------------------------------------------------------------------------- /views/gcode/M021.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m021 3 | title: Init SD card 4 | brief: Attempt to detect an SD card in the slot. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: SDSUPPORT 9 | group: sdcard 10 | 11 | codes: 12 | - M21 13 | 14 | long: Use this command if the SD card isn't detected automatically. 15 | 16 | notes: Requires [`SDSUPPORT`](/docs/configuration/configuration.html#sd-card) 17 | 18 | parameters: 19 | 20 | examples: 21 | 22 | --- 23 | 24 | -------------------------------------------------------------------------------- /views/gcode/M022.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m022 3 | title: Release SD card 4 | brief: Simulate ejection of the SD card 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: SDSUPPORT 9 | group: sdcard 10 | 11 | codes: 12 | - M22 13 | 14 | long: | 15 | If Marlin gets confused about the state of the SD card, this command can be used to simulate an ejection of the SD card. 16 | 17 | Re-insert the SD card or use `M21` to enable the SD card following `M22`. 18 | 19 | notes: 20 | - Requires [`SDSUPPORT`](/docs/configuration/configuration.html#sd-card) 21 | 22 | parameters: 23 | 24 | examples: 25 | 26 | --- 27 | 28 | -------------------------------------------------------------------------------- /views/gcode/M023.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m023 3 | title: Select SD file 4 | brief: Select an SD file to be executed 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: SDSUPPORT 9 | group: sdcard 10 | 11 | codes: 12 | - M23 13 | 14 | long: 15 | 16 | notes: 17 | - Requires [`SDSUPPORT`](/docs/configuration/configuration.html#sd-card) 18 | 19 | parameters: 20 | - 21 | tag: filename 22 | optional: false 23 | description: The filename of the file to open. 24 | 25 | examples: 26 | 27 | --- 28 | 29 | -------------------------------------------------------------------------------- /views/gcode/M024.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m024 3 | title: Start or Resume SD print 4 | brief: Start or resume a file selected with `M23` 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: SDSUPPORT 9 | group: sdcard 10 | 11 | codes: 12 | - M24 13 | 14 | long: | 15 | Start an SD print or resume the paused SD print. If `PARK_HEAD_ON_PAUSE` is enabled, unpark the nozzle. 16 | 17 | If `POWER_LOSS_RECOVERY` is enabled `M24` accepts parameters which allow resuming the print from a specific point in the file. These parameters are usually only used in this scenario. 18 | 19 | notes: 20 | - Requires [`SDSUPPORT`](/docs/configuration/configuration.html#sd-card) 21 | 22 | parameters: 23 | - 24 | tag: S 25 | optional: true 26 | description: Position in file to resume from (requires `POWER_LOSS_RECOVERY`) 27 | values: 28 | - 29 | tag: pos 30 | type: long 31 | - 32 | tag: T 33 | optional: true 34 | description: Elapsed time since start of print (requires `POWER_LOSS_RECOVERY`) 35 | values: 36 | - 37 | tag: time 38 | type: long 39 | 40 | examples: 41 | 42 | --- 43 | 44 | -------------------------------------------------------------------------------- /views/gcode/M025.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m025 3 | title: Pause SD print 4 | brief: Pause printing from the SD card 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: SDSUPPORT 9 | group: sdcard 10 | 11 | codes: 12 | - M25 13 | 14 | long: Pause the SD print in progress. If `PARK_HEAD_ON_PAUSE` is enabled, park the nozzle. 15 | 16 | notes: 17 | - Requires [`SDSUPPORT`](/docs/configuration/configuration.html#sd-card) 18 | 19 | parameters: 20 | 21 | examples: 22 | 23 | --- 24 | 25 | -------------------------------------------------------------------------------- /views/gcode/M026.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m026 3 | title: Set SD position 4 | brief: Set the SD read position 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: SDSUPPORT 9 | group: sdcard 10 | 11 | codes: 12 | - M26 13 | 14 | long: Set the next read position in the open SD file. 15 | 16 | notes: 17 | - Requires [`SDSUPPORT`](/docs/configuration/configuration.html#sd-card) 18 | 19 | parameters: 20 | - 21 | tag: S 22 | optional: true 23 | description: Next file read position to set 24 | values: 25 | - 26 | tag: pos 27 | type: long 28 | 29 | examples: 30 | 31 | --- 32 | 33 | -------------------------------------------------------------------------------- /views/gcode/M027.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m027 3 | title: Report SD print status 4 | brief: Print SD progress to serial 5 | author: thinkyhead,TheSFReader 6 | 7 | experimental: false 8 | requires: SDSUPPORT 9 | group: sdcard 10 | 11 | codes: 12 | - M27 13 | 14 | long: 15 | - With no parameter, report the current SD read position in the form "`SD printing byte 123/12345`." If no file is open the response is "`Not SD printing`." 16 | - With 'S', set the SD status auto-report interval. (Requires `AUTO_REPORT_SD_STATUS`) 17 | - With 'C', get the currently open file's name (and long filename if possible). Print "`(no file)`" if no file is open. 18 | 19 | notes: 20 | - Requires [`SDSUPPORT`](/docs/configuration/configuration.html#sd-card) 21 | 22 | parameters: 23 | - 24 | tag: S 25 | optional: true 26 | description: Interval between auto-reports. `S0` to disable. 27 | values: 28 | - 29 | tag: seconds 30 | type: int 31 | - 32 | tag: C 33 | optional: true 34 | description: Report the filename and long filename of the current file. 35 | 36 | 37 | examples: 38 | - 39 | pre: Report current SD status 40 | code: M27 S4 41 | - 42 | pre: Report SD status every 4 seconds 43 | code: M27 S4 44 | - 45 | pre: Stop reporting SD status 46 | code: M27 S0 47 | - 48 | pre: Report currently open filename 49 | code: M27 C 50 | 51 | --- 52 | 53 | -------------------------------------------------------------------------------- /views/gcode/M028.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m028 3 | title: Start SD write 4 | brief: Start writing to a file on the SD card 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: SDSUPPORT 9 | group: sdcard 10 | 11 | codes: 12 | - M28 13 | 14 | long: This command starts a file write. All commands received by Marlin are written to the file and are not executed until `M29` closes the file. 15 | 16 | notes: 17 | - Requires [`SDSUPPORT`](/docs/configuration/configuration.html#sd-card) 18 | - To write commands to a file while also printing, use [`M928`](/docs/gcode/M928.html) 19 | 20 | parameters: 21 | 22 | examples: 23 | 24 | --- 25 | 26 | -------------------------------------------------------------------------------- /views/gcode/M029.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m029 3 | title: Stop SD write 4 | brief: Stop writing the file, end logging. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: SDSUPPORT 9 | group: sdcard 10 | 11 | codes: 12 | - M29 13 | 14 | long: Stop writing to a file that was begun with `M28` or `M928`. Logging is disabled. 15 | 16 | notes: 17 | - Requires [`SDSUPPORT`](/docs/configuration/configuration.html#sd-card) 18 | 19 | parameters: 20 | 21 | examples: 22 | 23 | related: [ M28, M928 ] 24 | 25 | --- 26 | 27 | -------------------------------------------------------------------------------- /views/gcode/M030.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m030 3 | title: Delete SD file 4 | brief: Delete a specified file from SD. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | group: sdcard 9 | 10 | codes: 11 | - M30 12 | 13 | long: 14 | 15 | notes: 16 | - Requires [`SDSUPPORT`](/docs/configuration/configuration.html#sd-card) 17 | 18 | parameters: 19 | - 20 | tag: filename 21 | optional: false 22 | description: The filename of the file to delete. 23 | 24 | example: 25 | - 26 | pre: Delete the file "/path/to/file.gco" 27 | code: M30 /path/to/file.gco 28 | 29 | --- 30 | 31 | -------------------------------------------------------------------------------- /views/gcode/M031.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m031 3 | title: Print time 4 | brief: Report the current print time. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | group: printjob 9 | 10 | codes: 11 | - M31 12 | 13 | long: 14 | - | 15 | This command reports the time elapsed since the start of the current print job to the host. When printing from SD card, the print job timer starts as soon as SD printing starts. 16 | 17 | If `PRINTJOB_TIMER_AUTOSTART` is enabled then the first `M109` or `M190` command received from the host will also start the print job timer. 18 | 19 | For manual control from the host, use `M75`, `M76`, and `M77` to start, pause, and stop the print job timer. 20 | 21 | notes: 22 | 23 | parameters: 24 | 25 | examples: 26 | 27 | related: [ M75, M76, M77, M78 ] 28 | 29 | --- 30 | 31 | -------------------------------------------------------------------------------- /views/gcode/M032.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m032 3 | title: Select and Start 4 | brief: Begin an SD print from a file. 5 | author: thinkyhead 6 | 7 | experimental: true 8 | requires: SDSUPPORT 9 | group: sdcard 10 | 11 | codes: 12 | - M32 13 | 14 | long: 15 | - The `M32` command exists to allow G-code to load other G-code files and run them as sub-programs. This can be useful to change the start / end gcode for a batch of files without having to edit them all. 16 | - For legacy reasons `M32` uses '`!`' (and '`#`') to delimit the filepath parameter. The filepath must be the last parameter. 17 | 18 | notes: 19 | - Requires [`SDSUPPORT`](/docs/configuration/configuration.html#sd-card) 20 | - This is a seldom-used beta feature that needs more testing and use-cases. 21 | 22 | parameters: 23 | - 24 | tag: P 25 | optional: true 26 | description: Sub-Program flag 27 | values: 28 | - 29 | tag: flag 30 | type: bool 31 | - 32 | tag: S 33 | optional: true 34 | description: Starting file offset 35 | values: 36 | - 37 | tag: filepos 38 | type: int 39 | 40 | examples: 41 | - 42 | pre: Select and start a file at offset 5022. 43 | code: M32 S5022 !/boats/sailboat.gco 44 | - 45 | pre: Select and start a file from within G-code. 46 | code: M32 P !/models/lgbust.gco# 47 | post: The `#` suffix is needed when using `P` to "stop buffer pre-reading" so no commands after `M32` will go into the buffer until after it returns. 48 | 49 | --- 50 | -------------------------------------------------------------------------------- /views/gcode/M033.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m033 3 | title: Get Long Path 4 | brief: Convert a short pathname to a long pathname. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | since: 1.0.2 9 | requires: SDSUPPORT, LONG_FILENAME_HOST_SUPPORT 10 | group: sdcard 11 | 12 | codes: 13 | - M33 14 | 15 | long: 16 | 17 | notes: 18 | - Requires [`SDSUPPORT`](/docs/configuration/configuration.html#sd-card) and `LONG_FILENAME_HOST_SUPPORT` 19 | 20 | parameters: 21 | - 22 | tag: path 23 | optional: false 24 | description: DOS 8.3 path to a file or folder 25 | 26 | examples: 27 | - 28 | pre: 29 | Get the long path for a file 30 | code: 31 | - M33 funstuff/mask.gco 32 | - 33 | pre: 34 | Output 35 | code: 36 | - FunStuff/Mask.gcode 37 | 38 | --- 39 | -------------------------------------------------------------------------------- /views/gcode/M034.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m034 3 | title: SDCard Sorting 4 | brief: Set SDCard file sorting options. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | since: 1.1.0 9 | requires: SDSUPPORT,SDCARD_SORT_ALPHA 10 | group: sdcard 11 | 12 | codes: 13 | - M34 14 | 15 | long: 16 | - Marlin now contains support for SDCard alphabetical file sorting in the LCD menus. This feature uses free SRAM to create a sorting index for up to the first 256 files in the current folder, and (if you have _lots_ of SRAM) can optionally cache file listings for a more responsive UI. Buffering only occurs during file browsing. Otherwise the SRAM is freed. 17 | 18 | notes: 19 | - Requires [`SDSUPPORT`](/docs/configuration/configuration.html#sd-card) and `SDCARD_SORT_ALPHA`. 20 | 21 | parameters: 22 | - 23 | tag: S 24 | optional: true 25 | description: Sorting on/off 26 | values: 27 | - 28 | type: bool 29 | - 30 | tag: F 31 | optional: true 32 | description: Folder Sorting 33 | values: 34 | - 35 | tag: -1 36 | description: Folders before files 37 | - 38 | tag: 0 39 | description: No folder sorting 40 | - 41 | tag: 1 42 | description: Folders after files 43 | 44 | examples: 45 | 46 | --- 47 | -------------------------------------------------------------------------------- /views/gcode/M042.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m042 3 | title: Set Pin State 4 | brief: Set an analog or digital pin to a specified state. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | group: control 9 | 10 | codes: 11 | - M42 12 | 13 | long: For custom hardware not officially supported in Marlin, you can often just connect up an unused pin and use `M42` to control it. 14 | 15 | notes: 16 | 17 | parameters: 18 | - 19 | tag: P 20 | optional: true 21 | description: A digital pin number (even for analog pins) to write to. (`LED_PIN` if omitted) 22 | values: 23 | - 24 | type: int 25 | - 26 | tag: S 27 | optional: false 28 | description: The state to set. PWM-able pins may be set from 0-255. 29 | values: 30 | - 31 | type: int 32 | 33 | 34 | examples: 35 | 36 | --- 37 | -------------------------------------------------------------------------------- /views/gcode/M043-T.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m043b 3 | title: Toggle Details (Debug Pins) 4 | brief: Get information about pins. 5 | author: thinkyhead 6 | 7 | experimental: true 8 | requires: PINS_DEBUGGING 9 | group: debug 10 | 11 | codes: 12 | - M43 T 13 | 14 | long: 15 | - The M43 T command toggles one or more pins. 16 | 17 | notes: 18 | - Requires `PINS_DEBUGGING`. This feature should be disabled for production use. 19 | 20 | parameters: 21 | - 22 | tag: S 23 | optional: true 24 | description: Start Pin number. If not given, will default to 0 25 | values: 26 | - 27 | tag: pin 28 | type: int 29 | - 30 | tag: L 31 | optional: true 32 | description: End Pin number. If not given, will default to last pin defined for this board 33 | values: 34 | - 35 | tag: pin 36 | type: int 37 | - 38 | tag: I 39 | optional: true 40 | description: Flag to ignore Marlin's pin protection. Use with caution!!!! 41 | values: 42 | - 43 | type: bool 44 | - 45 | tag: R 46 | optional: true 47 | description: Repeat pulses on each pin this number of times before continuing to next pin. If not given will default to 1. 48 | values: 49 | - 50 | tag: count 51 | type: int 52 | - 53 | tag: W 54 | optional: true 55 | description: Wait time (in milliseconds) transitions. If not given will default to 500. 56 | values: 57 | - 58 | tag: time 59 | type: int 60 | 61 | 62 | 63 | examples: 64 | - 65 | pre: 66 | - Toggle pins 3-6 five times with 1 second low and 1 second high pulses but only if the pin isn't in the protected list. 67 | code: 68 | - M43 T S3 L6 R5 W1000 69 | 70 | 71 | --- 72 | 73 | -------------------------------------------------------------------------------- /views/gcode/M048.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m048 3 | title: Probe Accuracy Test 4 | brief: Measure Z Probe repeatability. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: Z_MIN_PROBE_REPEATABILITY_TEST 9 | group: calibration 10 | 11 | codes: 12 | - M48 13 | 14 | long: 15 | - Probes come in many flavors and as such have varying levels of accuracy, reliability, and repeatability, depending on several factors. This command tests the probe for accuracy and produces a standard deviation based on two or more probes of the same XY position. 16 | 17 | notes: 18 | - Requires `Z_MIN_PROBE_REPEATABILITY_TEST`. 19 | 20 | parameters: 21 | - 22 | tag: E 23 | optional: true 24 | description: Engage for each probe 25 | values: 26 | - 27 | tag: engage 28 | type: bool 29 | - 30 | tag: L 31 | optional: true 32 | description: Number of legs to probe 33 | values: 34 | - 35 | tag: legs 36 | type: int 37 | - 38 | tag: P 39 | optional: true 40 | description: Number of probes to do 41 | values: 42 | - 43 | tag: count 44 | type: int 45 | - 46 | tag: S 47 | optional: true 48 | description: Star/Schizoid probe. By default this will do 7 points. Override with `L`. 49 | values: 50 | - 51 | tag: 0 52 | description: Circular pattern 53 | - 54 | tag: 1 55 | description: Star-like pattern 56 | - 57 | tag: V 58 | optional: true 59 | description: Verbose Level 60 | values: 61 | - 62 | tag: level 63 | type: int 64 | - 65 | tag: X 66 | optional: true 67 | description: X Position 68 | values: 69 | - 70 | tag: pos 71 | type: float 72 | - 73 | tag: Y 74 | optional: true 75 | description: Y Position 76 | values: 77 | - 78 | tag: pos 79 | type: float 80 | 81 | examples: 82 | 83 | --- 84 | 85 | -------------------------------------------------------------------------------- /views/gcode/M073.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m073 3 | title: Set Print Progress 4 | brief: Set current print progress percentage for LCD. 5 | 6 | experimental: false 7 | since: 1.1.7 8 | requires: LCD_SET_PROGRESS_MANUALLY 9 | group: lcd 10 | 11 | codes: 12 | - M73 13 | 14 | long: 15 | - Set current print progress percentage for LCD. 16 | 17 | parameters: 18 | - 19 | tag: P 20 | optional: false 21 | description: Current print progress percentage 22 | values: 23 | - 24 | tag: percent 25 | type: int 26 | 27 | examples: 28 | - 29 | pre: Set print progress to 25% 30 | code: M73 P25 31 | 32 | --- 33 | -------------------------------------------------------------------------------- /views/gcode/M075.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m075 3 | title: Start Print Job 4 | brief: Start the print job timer. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | group: printjob 9 | 10 | codes: 11 | - M75 12 | 13 | long: 14 | - Start the print job timer. 15 | 16 | notes: 17 | 18 | parameters: 19 | 20 | example: 21 | - 22 | pre: Start the print job timer 23 | code: M75 24 | 25 | --- 26 | 27 | -------------------------------------------------------------------------------- /views/gcode/M076.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m076 3 | title: Pause Print Job 4 | brief: Pause the print job timer. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | group: printjob 9 | 10 | codes: 11 | - M76 12 | 13 | long: 14 | - Pause the print job timer. 15 | 16 | notes: 17 | 18 | parameters: 19 | 20 | example: 21 | - 22 | pre: Pause the print job timer 23 | code: M76 24 | 25 | --- 26 | 27 | -------------------------------------------------------------------------------- /views/gcode/M077.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m077 3 | title: Stop Print Job 4 | brief: Stop the print job timer. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | group: printjob 9 | 10 | codes: 11 | - M77 12 | 13 | long: 14 | - Stop the print job timer. 15 | 16 | notes: 17 | 18 | parameters: 19 | 20 | example: 21 | - 22 | pre: Stop the print job timer 23 | code: M77 24 | 25 | --- 26 | 27 | -------------------------------------------------------------------------------- /views/gcode/M078.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m078 3 | title: Print Job Stats 4 | brief: Print statistics about print jobs. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: PRINTCOUNTER 9 | group: printjob 10 | 11 | codes: 12 | - M78 13 | 14 | long: 15 | 16 | notes: 17 | 18 | parameters: 19 | 20 | examples: 21 | 22 | --- 23 | 24 | -------------------------------------------------------------------------------- /views/gcode/M080.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m080 3 | title: Power On 4 | brief: Turn on the power supply. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: POWER_SUPPLY>0 9 | group: control 10 | 11 | codes: 12 | - M80 13 | 14 | long: 15 | - Turn on the high-voltage power supply. Requires a board that's powered from USB or another 5V source. 16 | 17 | notes: 18 | - Requires `POWER_SUPPLY` and a digital pin connected to the PSU's enable pin. 19 | 20 | parameters: 21 | - 22 | tag: S 23 | optional: true 24 | description: 'Report Power Supply state' 25 | values: 26 | 27 | examples: 28 | 29 | --- 30 | 31 | -------------------------------------------------------------------------------- /views/gcode/M081.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m081 3 | title: Power Off 4 | brief: Turn off the power supply. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: POWER_SUPPLY>0 9 | group: control 10 | 11 | codes: 12 | - M81 13 | 14 | long: 15 | - Turn off the high-voltage power supply. If the board is not powered from another source, this may also shut down the electronics. 16 | 17 | notes: 18 | - Requires `POWER_SUPPLY` and a digital pin connected to the PSU's enable pin. 19 | 20 | parameters: 21 | 22 | examples: 23 | 24 | --- 25 | 26 | -------------------------------------------------------------------------------- /views/gcode/M082.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m082 3 | title: E Absolute 4 | brief: Set E to absolute positioning. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | group: units 9 | 10 | codes: 11 | - M82 12 | 13 | long: 14 | - This command is used to override `G91` and put the E axis into absolute mode independent of the other axes. 15 | 16 | notes: 17 | 18 | parameters: 19 | 20 | examples: 21 | 22 | --- 23 | 24 | -------------------------------------------------------------------------------- /views/gcode/M083.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m083 3 | title: E Relative 4 | brief: Set E to relative positioning. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | group: units 9 | 10 | codes: 11 | - M83 12 | 13 | long: 14 | - This command is used to override `G90` and put the E axis into relative mode independent of the other axes. 15 | 16 | notes: 17 | 18 | parameters: 19 | 20 | examples: 21 | 22 | --- 23 | 24 | -------------------------------------------------------------------------------- /views/gcode/M085.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m085 3 | title: Inactivity Shutdown 4 | brief: Set the inactivity timeout. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | group: control 9 | 10 | codes: 11 | - M85 12 | 13 | long: 14 | - Use this command to set a maximum period of time for the machine to be inactive (with no moves). If the machine is idle for longer than the set period, the firmware will shut everything down and halt the machine. 15 | 16 | notes: 17 | 18 | parameters: 19 | - 20 | tag: S 21 | optional: false 22 | description: Max inactive seconds 23 | values: 24 | - 25 | tag: seconds 26 | type: int 27 | 28 | examples: 29 | 30 | --- 31 | -------------------------------------------------------------------------------- /views/gcode/M092.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m092 3 | title: Set Axis Steps-per-unit 4 | brief: Set the number of steps-per-mm or steps-per-inch. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | group: planner 9 | 10 | codes: 11 | - M92 12 | 13 | long: 14 | - Use `M92` to set the steps-per-unit for one or more axes. This setting affects how many steps will be done for each unit of movement. Units will be in steps/mm unless *inch* mode is set with [`G20`](/docs/gcode/G020.html) (which requires `INCH_MODE_SUPPORT`). 15 | 16 | notes: 17 | - | 18 | Get the current steps-per-unit settings with `M503`. 19 | 20 | With `EEPROM_SETTINGS` enabled: 21 | 22 | - This setting for all axes is saved with `M500` and loaded with `M501`. 23 | - `M502` resets steps-per-unit for all axes to the values from `DEFAULT_AXIS_STEPS_PER_UNIT`. 24 | 25 | parameters: 26 | - 27 | tag: X 28 | optional: true 29 | description: X steps per unit 30 | values: 31 | - 32 | tag: steps 33 | type: float 34 | - 35 | tag: Y 36 | optional: true 37 | description: Y steps per unit 38 | values: 39 | - 40 | tag: steps 41 | type: float 42 | - 43 | tag: Z 44 | optional: true 45 | description: Z steps per unit 46 | values: 47 | - 48 | tag: steps 49 | type: float 50 | - 51 | tag: E 52 | optional: true 53 | description: E steps per unit 54 | values: 55 | - 56 | tag: steps 57 | type: float 58 | - 59 | tag: T 60 | optional: true 61 | description: Target extruder (Requires `DISTINCT_E_FACTORS`) 62 | values: 63 | - 64 | tag: index 65 | type: int 66 | 67 | example: 68 | - 69 | pre: Set E steps for a new extruder 70 | code: M92 E688.4 71 | 72 | --- 73 | -------------------------------------------------------------------------------- /views/gcode/M100.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m100 3 | title: Free Memory 4 | brief: Description Here 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: M100_FREE_MEMORY_WATCHER 9 | group: debug 10 | 11 | codes: 12 | - M100 13 | 14 | long: 15 | - Use `M100` for development purposes to observe how much memory (particularly stack) is being used by code. Proper AVR code should avoid use of `new`, `malloc`, etc., and instead use either pre-allocated static variables or stack. 16 | 17 | notes: 18 | - Requires `M100_FREE_MEMORY_WATCHER`. 19 | 20 | parameters: 21 | - 22 | tag: D 23 | optional: true 24 | description: Dump the free memory block from `__brkval` to the stack pointer. 25 | - 26 | tag: F 27 | optional: true 28 | description: Return the number of free bytes in the memory pool along with other vital statistics that define the memory pool. 29 | - 30 | tag: I 31 | optional: true 32 | description: Initialize the free memory pool so it can be watched and print vital statistics that define the free memory pool. 33 | - 34 | tag: C 35 | optional: true 36 | description: Corrupt 'n' locations in the free memory pool and report the locations of the corruption. This is useful to check the correctness of the `M100 D` and `M100 F` commands. 37 | values: 38 | - 39 | tag: n 40 | type: int 41 | 42 | examples: 43 | 44 | --- 45 | 46 | -------------------------------------------------------------------------------- /views/gcode/M104.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m104 3 | title: Set Hotend Temperature 4 | brief: Set a new target hot end temperature. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | group: thermal 9 | 10 | codes: 11 | - M104 12 | 13 | long: 14 | - Set a new target hot end temperature and continue without waiting. The firmware will continue to try to reach and hold the temperature in the background. 15 | - Use [`M109`](/docs/gcode/M109.html) to wait for the hot end to reach the target temperature. 16 | 17 | notes: | 18 | - With `PRINTJOB_TIMER_AUTOSTART` this command will stop the print job timer if the temperature is set at or below half of `EXTRUDE_MINTEMP`. 19 | 20 | parameters: 21 | - 22 | tag: S 23 | optional: true 24 | description: 'Target temperature.
`AUTOTEMP`: the min auto-temperature.' 25 | values: 26 | - 27 | tag: temp 28 | type: float 29 | - 30 | tag: F 31 | optional: true 32 | description: '`AUTOTEMP`: Autotemp flag. Omit to disable autotemp.' 33 | values: 34 | - 35 | tag: flag 36 | type: bool 37 | - 38 | tag: B 39 | optional: true 40 | description: '`AUTOTEMP`: The max auto-temperature.' 41 | values: 42 | - 43 | tag: temp 44 | type: float 45 | - 46 | tag: T 47 | optional: true 48 | description: Hotend index. If omitted, the currently active hotend will be used. 49 | values: 50 | - 51 | tag: index 52 | type: int 53 | 54 | 55 | examples: 56 | - 57 | pre: Set target temperature for the active hotend 58 | code: M104 S185 59 | - 60 | pre: Set target temperature for E1 61 | code: M104 T1 S205 62 | - 63 | pre: '`AUTOTEMP`: Set autotemp range' 64 | code: M104 F S180 B190 65 | - 66 | pre: '`AUTOTEMP`: Disable autotemp' 67 | code: M104 68 | 69 | --- 70 | 71 | -------------------------------------------------------------------------------- /views/gcode/M105.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m105 3 | title: Report Temperatures 4 | brief: Send a temperature report to the host. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | group: thermal 9 | 10 | codes: 11 | - M105 12 | 13 | long: 14 | - Request a temperature report to be sent to the host at some point in the future. 15 | 16 | notes: 17 | - Some hosts may hide the reply from `M105`. 18 | - A better way for hosts to get regular temperature updates is to use `M155` (requires `AUTO_REPORT_TEMPERATURES` and `EXTENDED_CAPABILITIES_REPORT`). Hosts then no longer need to run an extra process or use up slots in the command buffer to receive temperatures. 19 | 20 | parameters: 21 | - 22 | tag: T 23 | optional: true 24 | description: Hotend index 25 | values: 26 | - 27 | tag: index 28 | type: int 29 | 30 | examples: 31 | - 32 | pre: Get a temperature report 33 | code: M105 34 | 35 | --- 36 | 37 | -------------------------------------------------------------------------------- /views/gcode/M106.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m106 3 | title: Set Fan Speed 4 | brief: Turn on the fan and set its speed 5 | author: thinkyhead 6 | 7 | experimental: false 8 | group: thermal 9 | requires: EXTRA_FAN_SPEED 10 | 11 | codes: 12 | - M106 13 | 14 | long: Turn on one of the fans and set its speed. If no fan index is given, the print cooling fan is selected. The fan speed applies to the next block added to the planner, so it will not take effect until previous moves in the planner are done. Under manual control with an idle machine, `M106` will change the fan speed immediately. 15 | 16 | notes: 17 | - '`M106` with no speed sets the fan to full speed.' 18 | - Turn off fans with [`M107`](/docs/gcode/M107.html). 19 | 20 | parameters: 21 | - 22 | tag: S 23 | optional: true 24 | description: Speed 25 | values: 26 | - 27 | tag: speed 28 | type: byte 29 | - 30 | tag: P 31 | optional: true 32 | description: Fan index 33 | values: 34 | - 35 | tag: index 36 | type: int 37 | - 38 | tag: T 39 | optional: true 40 | description: | 41 | Secondary speed. Added in Marlin 1.1.7. (Requires `EXTRA_FAN_SPEED`) 42 | - '`M106 P T3-255` sets a secondary speed for ``.' 43 | - '`M106 P T2` uses the set secondary speed.' 44 | - '`M106 P T1` restores the previous fan speed.' 45 | values: 46 | - 47 | tag: secondary 48 | type: int 49 | 50 | examples: 51 | 52 | --- 53 | 54 | -------------------------------------------------------------------------------- /views/gcode/M107.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m107 3 | title: Fan Off 4 | brief: Turn off a fan 5 | author: thinkyhead 6 | 7 | experimental: false 8 | group: thermal 9 | 10 | codes: 11 | - M107 12 | 13 | long: Turn off one of the fans. If no fan index is given, the print cooling fan. 14 | 15 | notes: Turn on fans with [`M106`](/docs/gcode/M106.html). 16 | 17 | parameters: 18 | - 19 | tag: P 20 | optional: true 21 | description: Fan index 22 | values: 23 | - 24 | tag: index 25 | type: int 26 | 27 | examples: 28 | 29 | --- 30 | 31 | -------------------------------------------------------------------------------- /views/gcode/M108.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m108 3 | title: Break and Continue 4 | brief: Break out of the current waiting loop 5 | author: thinkyhead 6 | 7 | experimental: false 8 | group: control 9 | 10 | codes: 11 | - M108 12 | 13 | long: 14 | - | 15 | The `M108` command requires `EMERGENCY_PARSER` for full effectiveness. (Otherwise a full queue blocks the parser.) 16 | 17 | Some G-code commands cause Marlin to go into a closed loop, waiting indefinitely for a certain state or event. For example, `M109` waits for the target temperature to be reached, and `M0` waits for an LCD click. 18 | 19 | - In the case of `M109`, the `M108` command stops waiting for the target temperature and continues processing G-code. This may result in "cold extrude" messages. For a full stop use `M112`. 20 | - In the case of `M0` the `M108` command acts like the LCD button, breaking out of `M0` and continuing to process the G-code queue. 21 | 22 | notes: 23 | - | 24 | With both `EMERGENCY_PARSER` and `HOST_KEEPALIVE_FEATURE` enabled, hosts will be able to prompt for continuation or cancellation, confirming with `M108` and cancelling with `M112`. 25 | 26 | parameters: 27 | 28 | example: 29 | - 30 | pre: Use `M108` as a "Continue" button in your host software. 31 | code: 32 | - M0 You're up, mate ; in your G-code file 33 | - M108 ; as your "Continue" button 34 | 35 | 36 | --- 37 | -------------------------------------------------------------------------------- /views/gcode/M110.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m110 3 | title: Set Line Number 4 | brief: Set the current line number. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | group: hosts 9 | 10 | codes: 11 | - M110 12 | 13 | long: Hosts can use `M110` to set the current line number in a print job. Each line number sent by a host must be one higher than the previous line number, or the firmware will ignore the line and send an error requesting a resend of the missing line. This is one technique Marlin uses to keep in sync with hosts. 14 | 15 | notes: 16 | - 'All these are valid: `N100 M110`, `M110 N100`, `N101 M110 N100`.' 17 | 18 | parameters: 19 | - 20 | tag: N 21 | optional: false 22 | description: Line number 23 | values: 24 | - 25 | tag: line 26 | type: int 27 | 28 | examples: 29 | 30 | --- 31 | 32 | -------------------------------------------------------------------------------- /views/gcode/M111.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m111 3 | title: Debug Level 4 | brief: Report and optionally set the debug flags. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | group: hosts 9 | 10 | codes: 11 | - M111 12 | 13 | long: | 14 | Marlin has several debug bits that can be set, in combination, to help configure, troubleshoot, and debug the firmware. Add up the debug bits you need: 15 | 16 | Mask|Name|Description 17 | 1|ECHO|Echo all commands sent to the parser. 18 | 2|INFO|Print extra informational messages. 19 | 4|ERRORS|Print extra error messages. 20 | 8|DRYRUN|Don't extrude, don't save leveling data, etc. 21 | 16|COMMUNICATION|Not currently used. 22 | 32|LEVELING|Detailed messages for homing, probing, and leveling. (Requires `DEBUG_LEVELING_FEATURE`.) 23 | 64|Reserved|Reserved for future usage 24 | 128|Reserved|Reserved for future usage 25 | 26 | notes: 27 | 28 | parameters: 29 | - 30 | tag: S 31 | optional: true 32 | description: Debug flag bits 33 | values: 34 | - 35 | tag: flags 36 | type: byte 37 | 38 | examples: 39 | - 40 | pre: Enable extra messages 41 | code: M111 S38 ; LEVELING, ERRORS, INFO 42 | - 43 | pre: Enable dry-run mode 44 | code: M111 S8 45 | - 46 | pre: Enable everything except dry-run mode 47 | code: M111 S247 ; 255 - 8 48 | - 49 | pre: Disable previously set extra debugging output. 50 | code: M111 S0 51 | 52 | --- 53 | 54 | -------------------------------------------------------------------------------- /views/gcode/M112.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m112 3 | title: Emergency Stop 4 | brief: Shut everything down and halt the machine. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | group: safety 9 | 10 | codes: 11 | - M112 12 | 13 | long: Used for emergency stopping, `M112` shuts down the machine, turns off all the steppers and heaters, and if possible, turns off the power supply. A reset is required to return to operational mode. 14 | 15 | notes: '`M112` is the fastest way to shut down the machine using a host, but it may need to wait for a space to open up in the command queue. Enable `EMERGENCY_PARSER` for an instantaneous `M112` command.' 16 | 17 | parameters: 18 | 19 | examples: 20 | - 21 | pre: Shut down now! 22 | code: M112 23 | 24 | --- 25 | 26 | -------------------------------------------------------------------------------- /views/gcode/M113.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m113 3 | title: Host Keepalive 4 | brief: Get or set the host keepalive interval. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: HOST_KEEPALIVE_FEATURE 9 | group: hosts 10 | 11 | codes: 12 | - M113 13 | 14 | long: During some lengthy processes, such as `G29`, Marlin may appear to the host to have "gone away." The "host keepalive" feature will send messages to the host when Marlin is busy or waiting for user response so the host won't try to reconnect. 15 | 16 | notes: Requires `HOST_KEEPALIVE_FEATURE`. 17 | 18 | parameters: 19 | - 20 | tag: S 21 | optional: true 22 | description: Keepalive interval (0-60) 23 | values: 24 | - 25 | tag: seconds 26 | type: int 27 | 28 | examples: 29 | 30 | --- 31 | 32 | -------------------------------------------------------------------------------- /views/gcode/M114.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m114 3 | title: Get Current Position 4 | brief: Report the current tool position to the host. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | group: hosts 9 | 10 | codes: 11 | - M114 12 | 13 | long: | 14 | Get the current position of the active nozzle. Includes stepper values. 15 | If `M114_DETAIL` is enabled the `D` parameter will provide more details such as leveling information and kinematics. 16 | 17 | notes: Hosts should respond to the output of `M114` by updating their current position. 18 | 19 | parameters: 20 | - 21 | tag: D 22 | optional: true 23 | description: Detailed information (requires `M114_DETAIL`) 24 | values: 25 | - 26 | type: bool 27 | - 28 | default: 0 29 | 30 | examples: 31 | - 32 | pre: Get the current position 33 | code: M114 34 | 35 | --- 36 | 37 | -------------------------------------------------------------------------------- /views/gcode/M115.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m115 3 | title: Firmware Info 4 | brief: Print the firmware info and capabilities. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | group: hosts 9 | 10 | codes: 11 | - M115 12 | 13 | long: | 14 | This command causes Marlin to output a string like this: 15 | 16 | ``` 17 | FIRMWARE_NAME:Marlin 1.1.0 (Github) SOURCE_CODE_URL:https://github.com/MarlinFirmware/Marlin PROTOCOL_VERSION:1.0 MACHINE_TYPE:RepRap EXTRUDER_COUNT:1 UUID:cede2a2f-41a2-4748-9b12-c55c62f367ff 18 | ``` 19 | 20 | When `EXTENDED_CAPABILITIES_REPORT` is enabled, Marlin also reports its capabilities: 21 | 22 | ``` 23 | Cap:EEPROM:1 24 | Cap:AUTOREPORT_TEMP:1 25 | Cap:PROGRESS:0 26 | Cap:AUTOLEVEL:1 27 | Cap:Z_PROBE:1 28 | Cap:SOFTWARE_POWER:0 29 | Cap:TOGGLE_LIGHTS:0 30 | Cap:EMERGENCY_PARSER:1 31 | ``` 32 | 33 | Hosts use this information to improve interoperability, so it's a good feature to enable. 34 | 35 | notes: 36 | 37 | parameters: 38 | 39 | examples: 40 | 41 | --- 42 | 43 | -------------------------------------------------------------------------------- /views/gcode/M117.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m117 3 | title: Set LCD Message 4 | brief: Set the message line on the LCD. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: ULTRA_LCD 9 | group: lcd 10 | 11 | codes: 12 | - M117 13 | 14 | long: Set the status line message on the LCD. 15 | 16 | notes: 17 | - Requires an LCD controller. 18 | - The message should appear immediately, but it will depend on LCD settings. 19 | 20 | parameters: 21 | - 22 | tag: string 23 | optional: true 24 | description: LCD status message 25 | 26 | examples: 27 | - 28 | pre: Set the message to "Yello World!" 29 | code: M117 Yello World! 30 | 31 | --- 32 | 33 | -------------------------------------------------------------------------------- /views/gcode/M118.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m118 3 | title: Serial print 4 | brief: Send text to serial 5 | author: thinkyhead 6 | 7 | experimental: false 8 | group: hosts 9 | 10 | codes: 11 | - M118 12 | 13 | long: Send a message to the connected host for display in the host console or to perform a host action. 14 | 15 | notes: The `E` and `A` parameters must precede the message. 16 | 17 | parameters: 18 | - 19 | tag: string 20 | optional: true 21 | description: Message string. If omitted, a blank line will be sent. 22 | - 23 | tag: A1 24 | optional: true 25 | description: Prepend `// ` to denote a comment or action command. Hosts like OctoPrint can interpret such commands to perform special actions. See your host's documentation. 26 | - 27 | tag: E1 28 | optional: true 29 | description: Prepend `echo:` to the message. Some hosts will display echo messages differently when preceded by `echo:`. 30 | 31 | examples: 32 | - 33 | pre: Echo "Yello World!" in the console 34 | code: M118 E1 Yello World! 35 | - 36 | pre: Tell [OctoPrint](http://docs.octoprint.org/en/master/features/action_commands.html) to cancel the print job 37 | code: M118 A1 action:cancel 38 | 39 | --- 40 | -------------------------------------------------------------------------------- /views/gcode/M119.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m119 3 | title: Endstop States 4 | brief: Report endstop and probe states to the host. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | group: debug 9 | 10 | codes: 11 | - M119 12 | 13 | long: 14 | - Use this command to get the current state of all endstops, useful for setup and troubleshooting. Endstops are reported as either "`open`" or "`TRIGGERED`". 15 | - The state of the Z probe and filament runout sensors are also reported with this command. 16 | 17 | notes: 18 | - The `BLTOUCH` probe only sends a brief pulse, so "`TRIGGERED`" indicates the probe is in error state. 19 | - Similarly, Trinamic's Sensorless Homing only sends a short pulse, so for these "`TRIGGERED`" is unusual. 20 | 21 | parameters: 22 | 23 | example: 24 | - 25 | pre: Get all endstop states 26 | code: | 27 | > M119 28 | Reporting endstop status 29 | x_min: open 30 | y_min: open 31 | z_min: TRIGGERED 32 | z_probe: open 33 | filament: open 34 | 35 | --- 36 | -------------------------------------------------------------------------------- /views/gcode/M120.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m120 3 | title: Enable Endstops 4 | brief: Enable endstops and keep them enabled when not homing. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | group: control 9 | 10 | codes: 11 | - M120 12 | 13 | long: Enable endstops. 14 | 15 | notes: After this command endstops will be kept enabled when not homing. This may have side-effects if using `ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED`. 16 | 17 | parameters: 18 | 19 | examples: 20 | - 21 | pre: Enable endstops 22 | code: M120 23 | 24 | --- 25 | 26 | -------------------------------------------------------------------------------- /views/gcode/M121.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m121 3 | title: Disable Endstops 4 | brief: Disable endstops and keep them enabled when not homing. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | group: control 9 | 10 | codes: 11 | - M121 12 | 13 | long: Disable endstops. 14 | 15 | notes: After this command endstops will be kept disabled when not homing. This may have side-effects if using `ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED`. 16 | 17 | parameters: 18 | 19 | examples: 20 | - 21 | pre: Disable endstops 22 | code: M121 23 | 24 | --- 25 | -------------------------------------------------------------------------------- /views/gcode/M122.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m122 3 | title: TMC Debugging 4 | brief: Get TMC Debug Info 5 | author: mbuc 6 | 7 | experimental: false 8 | since: 1.1.7 9 | requires: HAVE_TMC2130|HAVE_TMC2208,TMC_DEBUG 10 | group: debug 11 | 12 | codes: 13 | - M122 14 | 15 | long: 16 | - When sent without a parameter, returns a table of current register settings for any Trinamic TMC2130 or TMC2208 stepper motor drivers. Sending the command with the `S` parameter and a following boolean will respectively enable or disable reporting the debugging information on a continous basis. 17 | 18 | notes: 19 | - Need to have `TMC_DEBUG` enabled in `Configuration_adv.h`. 20 | 21 | parameters: 22 | - 23 | tag: S 24 | type: boolean 25 | optional: true 26 | description: Flag to enable/disable continuous reporting of debugging information. 27 | 28 | examples: 29 | - 30 | pre: 'Enabling debugging output:' 31 | code: M122 S1 32 | - 33 | pre: 'Example Output:' 34 | code: | 35 | SENDING:M122 36 | X Y 37 | Enabled false false 38 | Set current 850 850 39 | RMS current 826 826 40 | MAX current 1165 1165 41 | Run current 26/31 26/31 42 | Hold current 13/31 13/31 43 | CS actual 13/31 13/31 44 | PWM scale 41 41 45 | vsense 1=.18 1=.18 46 | stealthChop true true 47 | msteps 16 16 48 | tstep 1048575 1048575 49 | pwm 50 | threshold 0 0 51 | [mm/s] - - 52 | OT prewarn false false 53 | OT prewarn has 54 | been triggered false false 55 | off time 5 5 56 | blank time 24 24 57 | hysterisis 58 | -end 2 2 59 | -start 3 3 60 | Stallguard thrs 0 0 61 | DRVSTATUS X Y 62 | stallguard 63 | sg_result 0 0 64 | fsactive 65 | stst X X 66 | olb 67 | ola 68 | s2gb 69 | s2ga 70 | otpw 71 | ot 72 | 'Driver registers:' 73 | X = 0x80:0D:00:00 74 | Y = 0x80:0D:00:00 75 | 76 | --- 77 | 78 | -------------------------------------------------------------------------------- /views/gcode/M125.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m125 3 | title: Park Head 4 | brief: Save current position and move to filament change position. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: PARK_HEAD_ON_PAUSE 9 | group: nozzle 10 | 11 | codes: 12 | - M125 13 | 14 | long: Save the current nozzle position and move to the configured park position. 15 | 16 | notes: Requires `PARK_HEAD_ON_PAUSE`. 17 | 18 | parameters: 19 | - 20 | tag: L 21 | optional: true 22 | description: Retract length (otherwise `FILAMENT_CHANGE_RETRACT_LENGTH`) 23 | values: 24 | - 25 | tag: linear 26 | type: float 27 | - 28 | tag: X 29 | optional: true 30 | description: X position to park at (otherwise `FILAMENT_CHANGE_X_POS`) 31 | values: 32 | - 33 | tag: linear 34 | type: float 35 | - 36 | tag: Y 37 | optional: true 38 | description: Y position to park at (otherwise `FILAMENT_CHANGE_Y_POS`) 39 | values: 40 | - 41 | tag: linear 42 | type: float 43 | - 44 | tag: Z 45 | optional: true 46 | description: Z raise before park (otherwise `FILAMENT_CHANGE_Z_ADD`) 47 | values: 48 | - 49 | tag: linear 50 | type: float 51 | 52 | examples: 53 | - 54 | pre: Retract 2cm of filament and park the nozzle 55 | code: M125 L20 ; park and retract 56 | 57 | --- 58 | -------------------------------------------------------------------------------- /views/gcode/M126.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m126 3 | title: Baricuda 1 Open 4 | brief: Open the valve for Baricuda 1. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: BARICUDA 9 | group: baricuda 10 | 11 | codes: 12 | - M126 13 | 14 | long: Open the valve for Baricuda paste extruder 1. 15 | 16 | notes: Requires `BARICUDA`. 17 | 18 | parameters: 19 | - 20 | tag: S 21 | optional: true 22 | description: Valve pressure 23 | values: 24 | - 25 | tag: pressure 26 | type: byte 27 | 28 | examples: 29 | - 30 | code: M126 ; open valve 1 31 | 32 | --- 33 | 34 | -------------------------------------------------------------------------------- /views/gcode/M127.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m127 3 | title: Baricuda 1 Close 4 | brief: Close the valve for Baricuda 1. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: BARICUDA 9 | group: baricuda 10 | 11 | codes: 12 | - M127 13 | 14 | long: Close the valve for Baricuda paste extruder 1. 15 | 16 | notes: Requires `BARICUDA`. 17 | 18 | parameters: 19 | 20 | examples: 21 | - 22 | code: M127 ; close valve 1 23 | 24 | --- 25 | 26 | -------------------------------------------------------------------------------- /views/gcode/M128.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m128 3 | title: Baricuda 2 Open 4 | brief: Open the valve for Baricuda 2. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: BARICUDA 9 | group: baricuda 10 | 11 | codes: 12 | - M128 13 | 14 | long: Open the valve for Baricuda paste extruder 2. 15 | 16 | notes: Requires `BARICUDA`. 17 | 18 | parameters: 19 | - 20 | tag: S 21 | optional: true 22 | description: Valve pressure 23 | values: 24 | - 25 | tag: pressure 26 | type: byte 27 | 28 | examples: 29 | - 30 | code: M128 ; open valve 2 31 | 32 | --- 33 | 34 | -------------------------------------------------------------------------------- /views/gcode/M129.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m129 3 | title: Baricuda 2 Close 4 | brief: Close the valve for Baricuda 2. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: BARICUDA 9 | group: baricuda 10 | 11 | codes: 12 | - M129 13 | 14 | long: Close the valve for Baricuda paste extruder 2. 15 | 16 | notes: Requires `BARICUDA`. 17 | 18 | parameters: 19 | 20 | examples: 21 | - 22 | code: M129 ; close valve 2 23 | 24 | --- 25 | 26 | -------------------------------------------------------------------------------- /views/gcode/M140.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m140 3 | title: Set Bed Temperature 4 | brief: Set a new target bed temperature. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | group: thermal 9 | 10 | codes: 11 | - M140 12 | 13 | long: 14 | - Set a new target heated bed temperature and continue without waiting. The firmware will continue to try to reach and hold the temperature in the background. 15 | - Use [`M190`](/docs/gcode/M190.html) to wait for the bed to reach the target temperature. 16 | 17 | notes: 18 | 19 | parameters: 20 | - 21 | tag: S 22 | optional: true 23 | description: 'Target temperature.
`AUTOTEMP`: the min auto-temperature.' 24 | values: 25 | - 26 | tag: temp 27 | type: float 28 | 29 | examples: 30 | - 31 | pre: Simple set target temperature 32 | code: M140 S80 33 | 34 | --- 35 | 36 | -------------------------------------------------------------------------------- /views/gcode/M145.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m145 3 | title: Set Material Preset 4 | brief: Set material presets in the LCD menu. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: NEWPANEL 9 | group: lcd 10 | 11 | codes: 12 | - M145 13 | 14 | long: Set the preheating presets for materials in the LCD menu. 15 | 16 | notes: 17 | - Requires an LCD controller. 18 | - View the current settings with `M503`. 19 | - If `EEPROM_SETTINGS` is enabled, these settings are saved with `M500`, loaded with `M501`, and reset with `M502`. 20 | 21 | parameters: 22 | - 23 | tag: S 24 | optional: true 25 | description: Material index 26 | values: 27 | - 28 | tag: index 29 | type: int 30 | - 31 | tag: H 32 | optional: true 33 | description: Hotend temperature 34 | values: 35 | - 36 | tag: temp 37 | type: int 38 | - 39 | tag: B 40 | optional: true 41 | description: Bed temperature 42 | values: 43 | - 44 | tag: temp 45 | type: int 46 | - 47 | tag: F 48 | optional: true 49 | description: Fan speed 50 | values: 51 | - 52 | tag: speed 53 | type: byte 54 | 55 | examples: 56 | - 57 | pre: Set heatup presets for material 1 58 | code: M145 S0 H190 B70 F50 59 | 60 | --- 61 | 62 | -------------------------------------------------------------------------------- /views/gcode/M149.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m149 3 | title: Set Temperature Units 4 | brief: Set temperature units to Celsius, Fahrenheit, or Kelvin. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | group: units 9 | 10 | codes: 11 | - M149 12 | 13 | long: Set temperature units to Celsius, Fahrenheit, or Kelvin. Celsius is the default. 14 | 15 | notes: 16 | 17 | parameters: 18 | - 19 | tag: C 20 | optional: true 21 | description: Celsius 22 | - 23 | tag: F 24 | optional: true 25 | description: Fahrenheit 26 | - 27 | tag: K 28 | optional: true 29 | description: Kelvin 30 | 31 | examples: 32 | 33 | --- 34 | 35 | -------------------------------------------------------------------------------- /views/gcode/M150.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m150 3 | title: Set RGB(W) Color 4 | brief: Set the color of the RGB(W) LED, backlight, or LED strip. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: BLINKM|RGB_LED|RGBW_LED|NEOPIXEL_LED|PCA9632 9 | group: lcd 10 | 11 | codes: 12 | - M150 13 | 14 | long: If you have an RGB(W) light, either as part of a controller or installed separately, the `M150` command can be used to set its color. 15 | 16 | notes: Requires `BLINKM`, `RGB_LED`, `RGBW_LED`, `NEOPIXEL_LED` or `PCA9632`. 17 | 18 | parameters: 19 | - 20 | tag: R 21 | optional: true 22 | description: Red component from 0 to 255 23 | values: 24 | - 25 | tag: intensity 26 | type: byte 27 | - 28 | tag: U 29 | optional: true 30 | description: Green component from 0 to 255 31 | values: 32 | - 33 | tag: intensity 34 | type: byte 35 | - 36 | tag: B 37 | optional: true 38 | description: Blue component from 0 to 255 39 | values: 40 | - 41 | tag: intensity 42 | type: byte 43 | - 44 | tag: W 45 | optional: true 46 | description: White component from 0 to 255 (`RGBW_LED` or `NEOPIXEL_LED` only) 47 | values: 48 | - 49 | tag: intensity 50 | type: byte 51 | - 52 | tag: P 53 | optional: true 54 | description: Brightness from 0 to 255 (`NEOPIXEL_LED` only) 55 | values: 56 | - 57 | tag: intensity 58 | type: byte 59 | examples: 60 | 61 | --- 62 | 63 | -------------------------------------------------------------------------------- /views/gcode/M155.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m155 3 | title: Temperature Auto-Report 4 | brief: Auto-report temperatures to host periodically. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: AUTO_REPORT_TEMPERATURES,EXTENDED_CAPABILITIES_REPORT 9 | group: hosts 10 | 11 | codes: 12 | - M155 13 | 14 | long: It can be useful for host software to track temperatures, display and graph them over time, but polling with `M105` is less than optimal. With `M155` hosts simply set an interval and Marlin will keep sending data automatically. This method is preferred over polling with `M105`. 15 | 16 | notes: 17 | - Requires `AUTO_REPORT_TEMPERATURES` in `Configuration_adv.h`. 18 | - Also enable `EXTENDED_CAPABILITIES_REPORT` to notify hosts about this capability. 19 | 20 | parameters: 21 | - 22 | tag: S 23 | optional: true 24 | description: Interval in seconds between auto-reports. `S0` to disable. 25 | values: 26 | - 27 | tag: seconds 28 | type: int 29 | 30 | examples: 31 | - 32 | pre: Report temperatures every 4 seconds 33 | code: M155 S4 34 | - 35 | pre: Stop reporting temperatures 36 | code: M155 S0 37 | 38 | --- 39 | 40 | -------------------------------------------------------------------------------- /views/gcode/M163.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m163 3 | title: Set Mix Factor 4 | brief: Set a single mix factor for a mixing extruder. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: MIXING_EXTRUDER 9 | group: mixing 10 | 11 | codes: 12 | - M163 13 | 14 | long: Set a single mix factor from 0 to 1. (The mix will be "normalized" by `M164` before saving.) 15 | 16 | notes: Requires `MIXING_EXTRUDER`. 17 | 18 | parameters: 19 | - 20 | tag: S 21 | optional: true 22 | description: Component index 23 | values: 24 | - 25 | tag: index 26 | type: int 27 | - 28 | tag: P 29 | optional: true 30 | description: Mix factor 31 | values: 32 | - 33 | tag: factor 34 | type: float 35 | 36 | examples: 37 | - 38 | pre: 'Save a 60/40 mix as tool index 5:' 39 | code: 40 | - M163 S0 P0.6 41 | - M163 S1 P0.4 42 | - M164 S5 43 | - 44 | pre: 'Save a 3/5 mix as tool index 4:' 45 | code: 46 | - M163 S0 P3 47 | - M163 S1 P5 48 | - M164 S4 49 | 50 | --- 51 | -------------------------------------------------------------------------------- /views/gcode/M164.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m164 3 | title: Save Mix 4 | brief: Save the current mix as a virtual tool. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: MIXING_EXTRUDER,MIXING_VIRTUAL_TOOLS 9 | group: mixing 10 | 11 | codes: 12 | - M164 13 | 14 | long: 15 | 16 | notes: Requires `MIXING_EXTRUDER` and `MIXING_VIRTUAL_TOOLS`. 17 | 18 | parameters: 19 | - 20 | tag: S 21 | optional: false 22 | description: Tool index (0 if none) 23 | values: 24 | - 25 | tag: index 26 | type: int 27 | 28 | examples: 29 | - 30 | pre: 'Save a 60/40 mix as tool index 5:' 31 | code: 32 | - M163 S0 P0.6 33 | - M163 S1 P0.4 34 | - M164 S5 35 | - 36 | pre: 'Save a 3/5 mix as tool index 4:' 37 | code: 38 | - M163 S0 P3 39 | - M163 S1 P5 40 | - M164 S4 41 | 42 | --- 43 | 44 | -------------------------------------------------------------------------------- /views/gcode/M165.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m165 3 | title: Set Mix 4 | brief: Set all mix factors for the mixing extruder. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: MIXING_EXTRUDER,DIRECT_MIXING_IN_G1 9 | group: mixing 10 | 11 | codes: 12 | - M165 13 | 14 | long: Set the mix all at once. Any factors left out are set to 0.0. This is based on a reference implementation by Pìa Taubert. 15 | 16 | notes: Requires `MIXING_EXTRUDER` and `DIRECT_MIXING_IN_G1`. 17 | 18 | parameters: 19 | - 20 | tag: A 21 | optional: true 22 | description: Mix factor 1 23 | values: 24 | - 25 | tag: factor 26 | type: float 27 | - 28 | tag: B 29 | optional: true 30 | description: Mix factor 2 31 | values: 32 | - 33 | tag: factor 34 | type: float 35 | - 36 | tag: C 37 | optional: true 38 | description: Mix factor 3 39 | values: 40 | - 41 | tag: factor 42 | type: float 43 | - 44 | tag: D 45 | optional: true 46 | description: Mix factor 4 47 | values: 48 | - 49 | tag: factor 50 | type: float 51 | - 52 | tag: H 53 | optional: true 54 | description: Mix factor 5 55 | values: 56 | - 57 | tag: factor 58 | type: float 59 | - 60 | tag: I 61 | optional: true 62 | description: Mix factor 6 63 | values: 64 | - 65 | tag: factor 66 | type: float 67 | 68 | examples: 69 | - 70 | pre: Set a colorful mix 71 | code: M165 A0.2 B0.4 C0.3 D0.1 72 | 73 | --- 74 | 75 | -------------------------------------------------------------------------------- /views/gcode/M190.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m190 3 | title: Wait for Bed Temperature 4 | brief: Wait for the bed to reach target temperature. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | group: thermal 9 | 10 | codes: 11 | - M190 12 | 13 | long: 14 | - This command optionally sets a new target bed temperature and waits for the target temperature to be reached before proceeding. If the temperature is set with `S` then it waits *only when heating*. 15 | 16 | notes: 17 | - This command (and [`M109`](/docs/gcode/M109.html)) can block new commands from the host. To break out of wait for temperature using `M108` from the host, enable `EMERGENCY_PARSER`. 18 | - Use [`M140`](/docs/gcode/M140.html) to set the bed temperature and proceed without waiting. 19 | 20 | parameters: 21 | - 22 | tag: S 23 | optional: true 24 | description: 'Target temperature (wait only when heating). Also `AUTOTEMP`: The min auto-temperature.' 25 | values: 26 | - 27 | tag: temp 28 | type: float 29 | - 30 | tag: R 31 | optional: true 32 | description: Target temperature (wait for cooling or heating). 33 | values: 34 | - 35 | tag: temp 36 | type: float 37 | 38 | examples: 39 | - 40 | pre: 41 | - Set target bed temperature and wait (if heating) 42 | code: 43 | - M190 S80 44 | - 45 | pre: 46 | - Set target bed temperature, wait even if cooling 47 | code: 48 | - M190 R40 49 | 50 | --- 51 | 52 | -------------------------------------------------------------------------------- /views/gcode/M200.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m200 3 | title: Set Filament Diameter 4 | brief: Set the diameter for volumetric extrusion. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | group: planner 9 | 10 | codes: 11 | - M200 12 | 13 | long: 14 | - Set the filament's current diameter and enable volumetric extrusion. 15 | - In volumetric extrusion mode the E axis specifies cubic mm instead of linear mm, and the firmware calculates how much length to extrude for the given volume based on the filament diameter. 16 | 17 | notes: 18 | 19 | parameters: 20 | - 21 | tag: D 22 | optional: true 23 | description: Filament diameter 24 | values: 25 | - 26 | tag: diameter 27 | type: float 28 | - 29 | tag: T 30 | optional: true 31 | description: Extruder index. If omitted, the currently active extruder will be used. 32 | values: 33 | - 34 | tag: index 35 | type: int 36 | examples: 37 | - 38 | pre: 'A common diameter close to 3mm:' 39 | code: M200 D2.85 40 | - 41 | pre: Turn off volumetric extrusion 42 | code: 43 | - M200 D0 44 | - M200 D ; also works 45 | --- 46 | -------------------------------------------------------------------------------- /views/gcode/M201.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m201 3 | title: Set Print Max Acceleration 4 | brief: Set maximum acceleration for print moves one or more axes. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | group: planner 9 | 10 | codes: 11 | - M201 12 | 13 | long: Set the max acceleration for one or more axes (in current units-per-second squared). 14 | 15 | notes: 16 | - View the current setting with `M503`. 17 | - If `EEPROM_SETTINGS` is enabled, these are saved with `M500`, loaded with `M501`, and reset with `M502`. 18 | 19 | parameters: 20 | - 21 | tag: X 22 | optional: true 23 | description: X axis max acceleration 24 | values: 25 | - 26 | tag: accel 27 | type: float 28 | - 29 | tag: Y 30 | optional: true 31 | description: Y axis max acceleration 32 | values: 33 | - 34 | tag: accel 35 | type: float 36 | - 37 | tag: Z 38 | optional: true 39 | description: Z axis max acceleration 40 | values: 41 | - 42 | tag: accel 43 | type: float 44 | - 45 | tag: E 46 | optional: true 47 | description: E axis max acceleration 48 | values: 49 | - 50 | tag: accel 51 | type: float 52 | - 53 | tag: T 54 | optional: true 55 | description: Target extruder (Requires `DISTINCT_E_FACTORS`) 56 | values: 57 | - 58 | tag: index 59 | type: int 60 | 61 | examples: 62 | - 63 | pre: 'Set max acceleration lower so it sounds like a robot:' 64 | code: M201 X50 Y50 65 | 66 | --- 67 | 68 | -------------------------------------------------------------------------------- /views/gcode/M203.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m203 3 | title: Set Max Feedrate 4 | brief: Set maximum feedrate for one or more axes. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | group: planner 9 | 10 | codes: 11 | - M203 12 | 13 | long: Set the max feedrate for one or more axes (in current units-per-second). 14 | 15 | notes: 16 | - View the current setting with `M503`. 17 | - If `EEPROM_SETTINGS` is enabled, these are saved with `M500`, loaded with `M501`, and reset with `M502`. 18 | 19 | parameters: 20 | - 21 | tag: X 22 | optional: true 23 | description: X axis max feedrate 24 | values: 25 | - 26 | tag: units/s 27 | type: float 28 | - 29 | tag: Y 30 | optional: true 31 | description: Y axis max feedrate 32 | values: 33 | - 34 | tag: units/s 35 | type: float 36 | - 37 | tag: Z 38 | optional: true 39 | description: Z axis max feedrate 40 | values: 41 | - 42 | tag: units/s 43 | type: float 44 | - 45 | tag: E 46 | optional: true 47 | description: E axis max feedrate 48 | values: 49 | - 50 | tag: units/s 51 | type: float 52 | - 53 | tag: T 54 | optional: true 55 | description: Target extruder (Requires `DISTINCT_E_FACTORS`) 56 | values: 57 | - 58 | tag: index 59 | type: int 60 | 61 | examples: 62 | - 63 | pre: 'Set max feedrate for XY to 100mm/s:' 64 | code: M203 X100 Y100 65 | 66 | --- 67 | 68 | -------------------------------------------------------------------------------- /views/gcode/M204.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m204 3 | title: Set Starting Acceleration 4 | brief: Set the starting acceleration for moves by type. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | group: planner 9 | 10 | codes: 11 | - M204 12 | 13 | long: Set the preferred starting acceleration for moves of different types. 14 | 15 | notes: 16 | - View the current setting with `M503`. 17 | - If `EEPROM_SETTINGS` is enabled, these are saved with `M500`, loaded with `M501`, and reset with `M502`. 18 | 19 | parameters: 20 | - 21 | tag: P 22 | optional: true 23 | description: Printing acceleration 24 | values: 25 | - 26 | tag: accel 27 | type: float 28 | - 29 | tag: R 30 | optional: true 31 | description: Retract acceleration 32 | values: 33 | - 34 | tag: accel 35 | type: float 36 | - 37 | tag: T 38 | optional: true 39 | description: Travel acceleration 40 | values: 41 | - 42 | tag: accel 43 | type: float 44 | 45 | examples: 46 | 47 | --- 48 | 49 | -------------------------------------------------------------------------------- /views/gcode/M205.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m205 3 | title: Set Advanced Settings 4 | brief: Set some advanced settings related to movement. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | group: planner 9 | 10 | codes: 11 | - M205 12 | 13 | long: Set various motion settings. See parameters for details. 14 | 15 | notes: 16 | - View the current setting with `M503`. 17 | - If `EEPROM_SETTINGS` is enabled, these are saved with `M500`, loaded with `M501`, and reset with `M502`. 18 | 19 | parameters: 20 | - 21 | tag: X 22 | optional: true 23 | description: X max jerk (units/s) 24 | values: 25 | - 26 | tag: jerk 27 | type: float 28 | - 29 | tag: Y 30 | optional: true 31 | description: Y max jerk (units/s) 32 | values: 33 | - 34 | tag: jerk 35 | type: float 36 | - 37 | tag: Z 38 | optional: true 39 | description: Z max jerk (units/s) 40 | values: 41 | - 42 | tag: jerk 43 | type: float 44 | - 45 | tag: E 46 | optional: true 47 | description: E max jerk (units/s) 48 | values: 49 | - 50 | tag: jerk 51 | type: float 52 | - 53 | tag: B 54 | optional: true 55 | description: Minimum segment time (µs) 56 | values: 57 | - 58 | tag: µs 59 | type: int 60 | - 61 | tag: S 62 | optional: true 63 | description: Minimum feedrate for print moves (units/s) 64 | values: 65 | - 66 | tag: units/s 67 | type: float 68 | - 69 | tag: T 70 | optional: true 71 | description: Minimum feedrate for travel moves (units/s) 72 | values: 73 | - 74 | tag: units/s 75 | type: float 76 | - 77 | tag: J 78 | optional: true 79 | description: Junction deviation (requires `JUNCTION_DEVIATION`) 80 | values: 81 | - 82 | tag: deviation 83 | type: float 84 | examples: 85 | - 86 | pre: Set some advanced settings. 87 | code: M205 T40 ; Travel feedrate = 40mm/s 88 | 89 | --- 90 | -------------------------------------------------------------------------------- /views/gcode/M206.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m206 3 | title: Set Home Offsets 4 | brief: Description Here 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: HAS_HOME_OFFSET 9 | group: planner 10 | 11 | codes: 12 | - M206 13 | 14 | long: | 15 | Use `M206` to apply a persistent offset to the native home position and coordinate space. This effectively shifts the coordinate space in the negative direction. See examples below. 16 | 17 | - The current position is adjusted to align to the new home offset values. 18 | - The home offset is persistent — added to the current position until changed. 19 | - Some uses include fine adjustment of Z position (without moving endstops) and shifting the coordinate space to print on a different part of the bed. 20 | 21 | notes: | 22 | - This command isn't available on `DELTA`. (For delta use `M665 H`.) 23 | - This GCode can be disabled with `NO_WORKSPACE_OFFSETS` to optimize movement. 24 | - Changing the home offsets will not invalidate bed leveling or other saved data. 25 | - View the current offsets with `M503`. 26 | - If `EEPROM_SETTINGS` is enabled, the home offsets are saved with `M500`, loaded with `M501`, and reset with `M502`. 27 | - [`M428`](/docs/gcode/M428.html) sets home offsets so the current position aligns to the native home position. 28 | 29 | parameters: 30 | - 31 | tag: P 32 | optional: true 33 | description: SCARA Psi offset (Requires `MORGAN_SCARA`) 34 | values: 35 | - 36 | tag: offset 37 | type: float 38 | - 39 | tag: T 40 | optional: true 41 | description: SCARA Theta offset (Requires `MORGAN_SCARA`) 42 | values: 43 | - 44 | tag: offset 45 | type: float 46 | - 47 | tag: X 48 | optional: true 49 | description: X home offset 50 | values: 51 | - 52 | tag: offset 53 | type: float 54 | - 55 | tag: Y 56 | optional: true 57 | description: Y home offset 58 | values: 59 | - 60 | tag: offset 61 | type: float 62 | - 63 | tag: Z 64 | optional: true 65 | description: Z home offset 66 | values: 67 | - 68 | tag: offset 69 | type: float 70 | 71 | examples: 72 | - 73 | pre: 'Raise Z up a little bit on the first layer:' 74 | code: M206 Z-0.2 75 | - 76 | pre: 'Shift the print area 10mm to the left:' 77 | code: M206 X10 78 | 79 | --- 80 | -------------------------------------------------------------------------------- /views/gcode/M207.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m207 3 | title: Set Firmware Retraction 4 | brief: Set options for firmware-based retraction. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: FWRETRACT 9 | group: planner 10 | 11 | codes: 12 | - M207 13 | 14 | long: Set lengths, feedrate, and Z lift for firmware-based retraction. See parameters below. 15 | 16 | notes: 17 | - Requires `FWRETRACT`. 18 | - See related codes [`G10`](/docs/gcode/G010.html), [`G11`](/docs/gcode/G010.html), [`M208`](/docs/gcode/M208.html), and [`M209`](/docs/gcode/M209.html). 19 | 20 | parameters: 21 | - 22 | tag: S 23 | optional: true 24 | description: Retract length 25 | values: 26 | - 27 | tag: length 28 | type: float 29 | - 30 | tag: W 31 | optional: true 32 | description: Retract swap length (multi-extruder) 33 | values: 34 | - 35 | tag: length 36 | type: float 37 | - 38 | tag: F 39 | optional: true 40 | description: Retract feedrate (units/min) 41 | values: 42 | - 43 | tag: feedrate 44 | type: float 45 | - 46 | tag: Z 47 | optional: true 48 | description: Z lift on retraction 49 | values: 50 | - 51 | tag: length 52 | type: float 53 | 54 | examples: 55 | 56 | --- 57 | 58 | -------------------------------------------------------------------------------- /views/gcode/M208.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m208 3 | title: Set Firmware Recovery 4 | brief: Set values for firmware-based retract recovery. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: FWRETRACT 9 | group: planner 10 | 11 | codes: 12 | - M208 13 | 14 | long: Set lengths and feedrate for firmware-based retract recovery. The new values will apply to all subsequent G11 15 | 16 | notes: 17 | - Requires `FWRETRACT`. 18 | - See related codes [`G10`](/docs/gcode/G010.html), [`G11`](/docs/gcode/G010.html), [`M207`](/docs/gcode/M207.html), and [`M209`](/docs/gcode/M209.html). 19 | 20 | parameters: 21 | - 22 | tag: S 23 | optional: true 24 | description: Recover length 25 | values: 26 | - 27 | tag: length 28 | type: float 29 | - 30 | tag: W 31 | optional: true 32 | description: Recover swap length (multi-extruder) 33 | values: 34 | - 35 | tag: length 36 | type: float 37 | - 38 | tag: F 39 | optional: true 40 | description: Recover feedrate (units/min) 41 | values: 42 | - 43 | tag: feedrate 44 | type: float 45 | - 46 | tag: R 47 | optional: true 48 | description: Recover swap feedrate (units/min) 49 | values: 50 | - 51 | tag: feedrate 52 | type: float 53 | 54 | examples: 55 | 56 | --- 57 | 58 | -------------------------------------------------------------------------------- /views/gcode/M209.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m209 3 | title: Set Auto Retract 4 | brief: Enable / disable auto-retraction. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: FWRETRACT 9 | group: planner 10 | 11 | codes: 12 | - M209 13 | 14 | long: 15 | - Enable or disable automatic retraction. This option is meant to help slicers that don't support `G10`/`G11`. But it can be used to override retraction in any GCode. 16 | - When auto-retract is enabled, all reversed E-only moves are treated as retraction. (Recover moves are also automatically overridden.) When disabled, E retraction derives from G-code. 17 | 18 | notes: 19 | - Requires `FWRETRACT`. 20 | - Most slicers today can generate `G10`/`G11`. But this option is useful for older G-code. 21 | - Though not currently very popular, both volumetric extrusion and firmware-based retraction (and/or `M209`) make G-code more immune to changes from one machine to another, and permit changing the hardware without needing to re-slice. 22 | - See related codes [`G10`](/docs/gcode/G010.html), [`G11`](/docs/gcode/G010.html), [`M207`](/docs/gcode/M207.html), and [`M208`](/docs/gcode/M208.html). 23 | 24 | parameters: 25 | - 26 | tag: S 27 | optional: false 28 | description: Set Auto-Retract on/off 29 | values: 30 | - 31 | tag: flag 32 | type: bool 33 | 34 | examples: 35 | 36 | --- 37 | 38 | -------------------------------------------------------------------------------- /views/gcode/M211.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m211 3 | title: Software Endstops 4 | brief: Set and/or get the software endstops state 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: (MIN|MAX)_SOFTWARE_ENDSTOPS 9 | group: planner 10 | 11 | codes: 12 | - M211 13 | 14 | long: 15 | - Optionally enable/disable software endstops, then report the current state. 16 | - With software endstops enabled, moves will be clipped to the physical boundaries from `[XYZ]_MIN_POS` to `[XYZ]_MAX_POS`. 17 | 18 | notes: 19 | - Requires either `MIN_SOFTWARE_ENDSTOPS` or `MAX_SOFTWARE_ENDSTOPS` for the enable option. 20 | 21 | parameters: 22 | - 23 | tag: S 24 | optional: true 25 | description: Software endstops state 26 | values: 27 | - 28 | tag: flag 29 | type: bool 30 | 31 | examples: 32 | 33 | --- 34 | 35 | -------------------------------------------------------------------------------- /views/gcode/M218.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m218 3 | title: Set Hotend Offset 4 | brief: Set the offset of a hotend (from hotend 0). 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: EXTRUDERS>1 9 | group: calibration 10 | 11 | codes: 12 | - M218 13 | 14 | long: 15 | - To keep nozzles aligned to the work area between tool-changes, the firmware needs to know how they relate to each other. 16 | 17 | notes: | 18 | - Requires 2 or more nozzles. 19 | - The default hotend offsets are set with `HOTEND_OFFSET_[XYZ]`. 20 | - Z hotend offset only available with `DUAL_X_CARRIAGE` or `SWITCHING_NOZZLE`. 21 | - View current hotend offsets with `M503`. 22 | - If `EEPROM_SETTINGS` is enabled, these offsets are saved with `M500`, loaded with `M501`, and reset with `M502`. 23 | 24 | parameters: 25 | - 26 | tag: T 27 | optional: true 28 | description: Hotend index. Active extruder by default. 29 | values: 30 | - 31 | tag: index 32 | type: int 33 | - 34 | tag: X 35 | optional: true 36 | description: Hotend X offset 37 | values: 38 | - 39 | tag: offset 40 | type: float 41 | - 42 | tag: Y 43 | optional: true 44 | description: Hotend Y offset 45 | values: 46 | - 47 | tag: offset 48 | type: float 49 | - 50 | tag: Z 51 | optional: true 52 | description: Hotend Z offset. Requires `DUAL_X_CARRIAGE` or `SWITCHING_NOZZLE`. 53 | values: 54 | - 55 | tag: offset 56 | type: float 57 | 58 | examples: 59 | 60 | --- 61 | 62 | -------------------------------------------------------------------------------- /views/gcode/M220.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m220 3 | title: Set Feedrate Percentage 4 | brief: Set the global feedrate percentage. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | group: planner 9 | 10 | codes: 11 | - M220 12 | 13 | long: Set the feedrate percentage, which applies to all G-code-based moves in all (X, Y, Z, and E) axes. 14 | 15 | notes: 16 | 17 | parameters: 18 | - 19 | tag: S 20 | optional: false 21 | description: Feedrate percentage 22 | values: 23 | - 24 | tag: percent 25 | type: int 26 | 27 | examples: 28 | 29 | --- 30 | 31 | -------------------------------------------------------------------------------- /views/gcode/M221.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m221 3 | title: Set Flow Percentage 4 | brief: Set the flow percentage, which applies to all E moves. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | group: planner 9 | 10 | codes: 11 | - M221 12 | 13 | long: Set the flow percentage, which applies to all E moves added to the planner. 14 | 15 | notes: 16 | 17 | parameters: 18 | - 19 | tag: S 20 | optional: false 21 | description: Feedrate percentage 22 | values: 23 | - 24 | tag: percent 25 | type: int 26 | - 27 | tag: T 28 | optional: true 29 | description: Target extruder (requires multi-extruder). Default is the active extruder. 30 | values: 31 | - 32 | tag: index 33 | type: int 34 | 35 | examples: 36 | - 37 | pre: Set the flow rate to 150%. 38 | code: M221 S150 39 | 40 | --- 41 | 42 | -------------------------------------------------------------------------------- /views/gcode/M226.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m226 3 | title: Wait for Pin State 4 | brief: Wait for a pin to have a given state. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | group: control 9 | 10 | codes: 11 | - M226 12 | 13 | long: Wait for a pin to have a certain value or state. 14 | 15 | notes: 16 | 17 | parameters: 18 | - 19 | tag: P 20 | optional: false 21 | description: Pin number 22 | values: 23 | - 24 | tag: pin 25 | type: byte 26 | - 27 | tag: S 28 | optional: true 29 | description: State 0 or 1. Default -1 for inverted. 30 | values: 31 | - 32 | tag: state 33 | type: byte 34 | 35 | examples: 36 | 37 | --- 38 | -------------------------------------------------------------------------------- /views/gcode/M240.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m240 3 | title: Trigger Camera 4 | brief: Trigger camera snapshot or recording. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: CHDK|PHOTOGRAPH_PIN 9 | group: extras 10 | 11 | codes: 12 | - M240 13 | 14 | long: Trigger the photograph pin to take a snapshot or toggle recording. 15 | 16 | notes: Requires `CHDK` or `PHOTOGRAPH_PIN`. See [this article](http://www.doc-diy.net/photo/rc-1_hacked/) for more info. 17 | 18 | parameters: 19 | 20 | examples: 21 | 22 | --- 23 | -------------------------------------------------------------------------------- /views/gcode/M250.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m250 3 | title: LCD Contrast 4 | brief: Set and/or get the LCD contrast. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: HAS_LCD_CONTRAST 9 | group: lcd 10 | 11 | codes: 12 | - M250 13 | 14 | long: Set and/or get the LCD contrast. The value is constrained based on the LCD. 15 | 16 | notes: Requires an LCD controller with software-controlled contrast. 17 | 18 | parameters: 19 | - 20 | tag: C 21 | optional: true 22 | description: Contrast value 23 | values: 24 | - 25 | tag: contrast 26 | type: int 27 | 28 | examples: 29 | 30 | --- 31 | -------------------------------------------------------------------------------- /views/gcode/M260.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m260 3 | title: I2C Send 4 | brief: Send data to the I2C bus. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: EXPERIMENTAL_I2CBUS 9 | group: i2c 10 | 11 | codes: 12 | - M260 13 | 14 | long: Utility to send data over the I2C bus. 15 | 16 | notes: Requires `EXPERIMENTAL_I2CBUS`. 17 | 18 | parameters: 19 | - 20 | tag: A 21 | optional: true 22 | description: The bus address to send to 23 | values: 24 | - 25 | tag: addr 26 | type: byte 27 | - 28 | tag: B 29 | optional: true 30 | description: The byte to add to the buffer 31 | values: 32 | - 33 | tag: byte 34 | type: byte 35 | - 36 | tag: R 37 | optional: true 38 | description: Reset and rewind the I2C buffer 39 | values: 40 | - 41 | tag: flag 42 | type: bool 43 | - 44 | tag: S 45 | optional: true 46 | description: Send flag. Flush the buffer to the bus. 47 | values: 48 | - 49 | tag: flag 50 | type: bool 51 | 52 | examples: 53 | - 54 | pre: Send "Marlin" to the slave device with address 0x63 (99) 55 | code: | 56 | M260 A99 ; Target slave address 57 | M260 B77 ; M 58 | M260 B97 ; a 59 | M260 B114 ; r 60 | M260 B108 ; l 61 | M260 B105 ; i 62 | M260 B110 ; n 63 | M260 S1 ; Send the current buffer 64 | - 65 | pre: Request 6 bytes from slave device with address 0x63 (99) 66 | code: M261 A99 B5 67 | - 68 | code: 'i2c-reply: from:99 bytes:5 data:hello' 69 | 70 | --- 71 | 72 | -------------------------------------------------------------------------------- /views/gcode/M261.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m261 3 | title: I2C Request 4 | brief: Request and echo bytes from the I2C bus. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: EXPERIMENTAL_I2CBUS 9 | group: i2c 10 | 11 | codes: 12 | - M261 13 | 14 | long: Request bytes from the I2C bus and echo them to the host. To find out how to do more useful things with I2C see the I2C master / slave article. 15 | 16 | notes: Requires `EXPERIMENTAL_I2CBUS`. 17 | 18 | parameters: 19 | - 20 | tag: A 21 | optional: false 22 | description: The bus address to request bytes from 23 | values: 24 | - 25 | tag: addr 26 | type: byte 27 | - 28 | tag: B 29 | optional: false 30 | description: The number of bytes to request 31 | values: 32 | - 33 | tag: count 34 | type: byte 35 | 36 | examples: 37 | 38 | --- 39 | 40 | -------------------------------------------------------------------------------- /views/gcode/M280.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m280 3 | title: Servo Position 4 | brief: Set or get a servo position. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: NUM_SERVOS>0 9 | group: servos 10 | 11 | codes: 12 | - M280 13 | 14 | long: Set or get the position of a servo. 15 | 16 | notes: Requires `NUM_SERVOS` of 1 or more. 17 | 18 | parameters: 19 | - 20 | tag: P 21 | optional: false 22 | description: Servo index to set or get 23 | values: 24 | - 25 | tag: index 26 | type: int 27 | - 28 | tag: S 29 | optional: false 30 | description: Servo position to set. Omit to read the current position. 31 | values: 32 | - 33 | tag: pos 34 | type: int 35 | 36 | examples: 37 | 38 | --- 39 | 40 | -------------------------------------------------------------------------------- /views/gcode/M290.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m290 3 | title: Babystep 4 | brief: Babystep one or more axes 5 | author: thinkyhead 6 | 7 | experimental: false 8 | since: 1.1.7 9 | requires: BABYSTEPPING 10 | group: calibration 11 | 12 | codes: 13 | - M290 14 | 15 | long: 16 | - Apply babysteps to one or more axes using current units. Offsets applied with `M290` aren't added to the current coordinates, but are intended for making small adjustments, especially in the Z axis, at the start of a print. 17 | - Note that when `BABYSTEP_ZPROBE_OFFSET` is enabled, `M290` also modifies the Probe Z Offset (with no immediate effects). The new Z offset applies to successive probing operations, and can be saved with `M500`. This behavior is means to coincide with the LCD Menu replacing "Z Babystepping" with "Babystep Z Probe Offset." To avoid this side-effect, use `M290 P0` or leave `BABYSTEP_ZPROBE_OFFSET` disabled. 18 | 19 | notes: Requires `BABYSTEP_XY` for babystepping on the XY axes. 20 | 21 | parameters: 22 | - 23 | tag: X 24 | optional: true 25 | description: A distance on the X axis 26 | values: 27 | - 28 | tag: pos 29 | type: float 30 | - 31 | tag: Y 32 | optional: true 33 | description: A distance on the Y axis 34 | values: 35 | - 36 | tag: pos 37 | type: float 38 | - 39 | tag: Z 40 | optional: true 41 | description: A distance on the Z axis 42 | values: 43 | - 44 | tag: pos 45 | type: float 46 | - 47 | tag: S 48 | optional: true 49 | description: Alias for Z 50 | values: 51 | - 52 | tag: pos 53 | type: float 54 | - 55 | tag: P 56 | optional: true 57 | description: Use `P0` to leave the Probe Z Offset unaffected. (Requires `BABYSTEP_ZPROBE_OFFSET`) 58 | values: 59 | - 60 | type: bool 61 | 62 | example: 63 | - 64 | pre: Babystep the Z axis by 0.25mm (in mm units mode) 65 | code: 66 | - M290 Z0.25 ; move up 0.25mm on the Z axis 67 | 68 | --- 69 | -------------------------------------------------------------------------------- /views/gcode/M300.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m300 3 | title: Play Tone 4 | brief: Play a single tone, buzz, or beep. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: SPEAKER 9 | group: lcd 10 | 11 | codes: 12 | - M300 13 | 14 | long: Add a tone to the tone queue. 15 | 16 | notes: 17 | - Requires `SPEAKER` to play tones (not just beeps). 18 | - In Marlin 1.0.2, playing tones block the command queue. Marlin 1.1.0 uses a tone queue and background tone player to keep the command buffer from being blocked by playing tones. 19 | 20 | parameters: 21 | - 22 | tag: P 23 | optional: true 24 | description: Duration (1s) 25 | values: 26 | - 27 | tag: ms 28 | type: int 29 | - 30 | tag: S 31 | optional: true 32 | description: Frequency (260Hz) 33 | values: 34 | - 35 | tag: Hz 36 | type: int 37 | 38 | examples: 39 | - 40 | pre: Play a tune. 41 | code: | 42 | M300 S440 P200 43 | M300 S660 P250 44 | M300 S880 P300 45 | 46 | --- 47 | 48 | -------------------------------------------------------------------------------- /views/gcode/M301.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m301 3 | title: Set Hotend PID 4 | brief: Set PID values for a hotend. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: PIDTEMP 9 | group: thermal 10 | 11 | codes: 12 | - M301 13 | 14 | long: Set the values that control the PID loop for a hotend. 15 | 16 | notes: 17 | - Requires `PIDTEMP`. 18 | - View current PID values with `M503`. 19 | - If `EEPROM_SETTINGS` is enabled, all hotend PID values are saved with `M500`, loaded with `M501`, and reset with `M502`. 20 | 21 | parameters: 22 | - 23 | tag: E 24 | optional: true 25 | description: Extruder index to set. Default 0. 26 | values: 27 | - 28 | tag: index 29 | type: int 30 | - 31 | tag: P 32 | optional: true 33 | description: Proportional value 34 | values: 35 | - 36 | tag: value 37 | type: float 38 | - 39 | tag: I 40 | optional: true 41 | description: Integral value 42 | values: 43 | - 44 | tag: value 45 | type: float 46 | - 47 | tag: D 48 | optional: true 49 | description: Derivative value 50 | values: 51 | - 52 | tag: value 53 | type: float 54 | - 55 | tag: C 56 | optional: true 57 | description: C term (requires `PID_EXTRUSION_SCALING`) 58 | values: 59 | - 60 | tag: value 61 | type: float 62 | - 63 | tag: L 64 | optional: true 65 | description: Extrusion scaling queue length (requires `PID_EXTRUSION_SCALING`) 66 | values: 67 | - 68 | tag: value 69 | type: float 70 | 71 | examples: 72 | 73 | --- 74 | 75 | -------------------------------------------------------------------------------- /views/gcode/M302.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m302 3 | title: Cold Extrude 4 | brief: Set minimum extrusion temperature, allow cold extrusion. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: PREVENT_COLD_EXTRUSION 9 | group: thermal 10 | 11 | codes: 12 | - M302 13 | 14 | long: Set the minimum extrusion temperature, potentially allowing E movement at temperatures below the melting point of the material. 15 | 16 | notes: Requires `PREVENT_COLD_EXTRUSION`. 17 | 18 | parameters: 19 | - 20 | tag: S 21 | optional: true 22 | description: Minimum temperature for safe extrusion 23 | values: 24 | - 25 | tag: temp 26 | type: float 27 | - 28 | tag: P 29 | optional: true 30 | description: Flag to allow extrusion at any temperature 31 | values: 32 | - 33 | tag: flag 34 | type: bool 35 | 36 | examples: 37 | - 38 | pre: Some common uses... 39 | code: | 40 | M302 ; report current cold extrusion state 41 | M302 P0 ; enable cold extrusion checking 42 | M302 P1 ; disable cold extrusion checking 43 | M302 S0 ; always allow extrusion (disable checking) 44 | M302 S170 ; only allow extrusion above 170 45 | M302 S170 P1 ; set min extrude temp to 170 but leave disabled 46 | 47 | --- 48 | -------------------------------------------------------------------------------- /views/gcode/M303.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m303 3 | title: PID autotune 4 | brief: Auto-tune the PID system to find stable values. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: PIDTEMP|PIDTEMPBED 9 | group: thermal 10 | 11 | codes: 12 | - M303 13 | 14 | long: This command initiates a process of heating and cooling to determine the proper PID values for the specified hotend or the heated bed. 15 | 16 | notes: 17 | - Requires `PIDTEMP` or `PIDTEMPBED`. 18 | - View current PID values with `M503`. 19 | - If `EEPROM_SETTINGS` is enabled, all PID values are saved with `M500`, loaded with `M501`, and reset with `M502`. 20 | 21 | parameters: 22 | - 23 | tag: E 24 | optional: true 25 | description: Hotend index (-1 for heated bed). Default 0. 26 | values: 27 | - 28 | tag: index 29 | type: int 30 | - 31 | tag: C 32 | optional: false 33 | description: Cycles. Default 5. 34 | values: 35 | - 36 | tag: count 37 | type: int 38 | - 39 | tag: S 40 | optional: false 41 | description: Target temperature 42 | values: 43 | - 44 | tag: temp 45 | type: float 46 | - 47 | tag: U 48 | optional: false 49 | description: Use PID result. (Otherwise just print it out.) 50 | values: 51 | - 52 | tag: flag 53 | type: bool 54 | 55 | examples: 56 | 57 | --- 58 | -------------------------------------------------------------------------------- /views/gcode/M304.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m304 3 | title: Set Bed PID 4 | brief: Set PID values for the heated bed. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: PIDTEMPBED 9 | group: thermal 10 | 11 | codes: 12 | - M304 13 | 14 | long: Set the values that control the PID loop for the heated bed. 15 | 16 | notes: 17 | - Requires `PIDTEMPBED`. 18 | - View current bed PID values with `M503`. 19 | - If `EEPROM_SETTINGS` is enabled, bed PID values are saved with `M500`, loaded with `M501`, and reset with `M502`. 20 | 21 | parameters: 22 | - 23 | tag: P 24 | optional: true 25 | description: Proportional value 26 | values: 27 | - 28 | tag: value 29 | type: float 30 | - 31 | tag: I 32 | optional: true 33 | description: Integral value 34 | values: 35 | - 36 | tag: value 37 | type: float 38 | - 39 | tag: D 40 | optional: true 41 | description: Derivative value 42 | values: 43 | - 44 | tag: value 45 | type: float 46 | 47 | 48 | examples: 49 | 50 | --- 51 | 52 | -------------------------------------------------------------------------------- /views/gcode/M350.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m350 3 | title: Set micro-stepping 4 | brief: Set micro-stepping for drivers that support it 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: HAS_MICROSTEPS 9 | group: control 10 | 11 | codes: 12 | - M350 13 | 14 | long: If your board has digital micro-stepping pins (`X_MS1`, `Y_MS1`, etc.), use this command to set the micro-steps. 15 | 16 | notes: 17 | 18 | parameters: 19 | - 20 | tag: B 21 | optional: true 22 | description: Set micro-stepping for the 5th stepper driver. 23 | values: 24 | - 25 | tag: 1 26 | - 27 | tag: 2 28 | - 29 | tag: 4 30 | - 31 | tag: 8 32 | - 33 | tag: 16 34 | - 35 | tag: S 36 | optional: true 37 | description: Set micro-stepping for all 5 stepper drivers. 38 | values: 39 | - 40 | tag: 1 41 | - 42 | tag: 2 43 | - 44 | tag: 4 45 | - 46 | tag: 8 47 | - 48 | tag: 16 49 | - 50 | tag: X 51 | optional: true 52 | description: Set micro-stepping for the X stepper driver. 53 | values: 54 | - 55 | tag: 1 56 | - 57 | tag: 2 58 | - 59 | tag: 4 60 | - 61 | tag: 8 62 | - 63 | tag: 16 64 | - 65 | tag: Y 66 | optional: true 67 | description: Set micro-stepping for the Y stepper driver. 68 | values: 69 | - 70 | tag: 1 71 | - 72 | tag: 2 73 | - 74 | tag: 4 75 | - 76 | tag: 8 77 | - 78 | tag: 16 79 | - 80 | tag: Z 81 | optional: true 82 | description: Set micro-stepping for the Z stepper driver. 83 | values: 84 | - 85 | tag: 1 86 | - 87 | tag: 2 88 | - 89 | tag: 4 90 | - 91 | tag: 8 92 | - 93 | tag: 16 94 | - 95 | tag: E 96 | optional: true 97 | description: Set micro-stepping for the E0 stepper driver. 98 | values: 99 | - 100 | tag: 1 101 | - 102 | tag: 2 103 | - 104 | tag: 4 105 | - 106 | tag: 8 107 | - 108 | tag: 16 109 | 110 | examples: 111 | 112 | --- 113 | 114 | -------------------------------------------------------------------------------- /views/gcode/M351.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m351 3 | title: Set Microstep Pins 4 | brief: Directly set the micro-stepping pins 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: HAS_MICROSTEPS 9 | group: control 10 | 11 | codes: 12 | - M351 13 | 14 | long: If your board has digital micro-stepping pins (`X_MS1`, `Y_MS1`, etc.), use this command to set the micro-steps. 15 | 16 | notes: 17 | 18 | parameters: 19 | - 20 | tag: S 21 | optional: false 22 | description: Select the pin to set for all specified axes. 23 | values: 24 | - 25 | tag: 1 26 | description: Select pin MS1 for all axes being set. 27 | - 28 | tag: 2 29 | description: Select pin MS2 for all axes being set. 30 | - 31 | tag: B 32 | optional: true 33 | description: Set the MS1/2 pin for the 5th stepper driver. 34 | values: 35 | - 36 | tag: 0 37 | - 38 | tag: 1 39 | - 40 | tag: X 41 | optional: true 42 | description: Set the MS1/2 pin for the X stepper driver. 43 | values: 44 | - 45 | tag: 0 46 | - 47 | tag: 1 48 | - 49 | tag: Y 50 | optional: true 51 | description: Set the MS1/2 pin for the Y stepper driver. 52 | values: 53 | - 54 | tag: 0 55 | - 56 | tag: 1 57 | - 58 | tag: Z 59 | optional: true 60 | description: Set the MS1/2 pin for the Z stepper driver. 61 | values: 62 | - 63 | tag: 0 64 | - 65 | tag: 1 66 | - 67 | tag: E 68 | optional: true 69 | description: Set the MS1/2 pin for the E stepper driver. 70 | values: 71 | - 72 | tag: 0 73 | - 74 | tag: 1 75 | 76 | examples: 77 | - 78 | pre: Set the `X_MS1` pin and clear the `E0_MS1` pin 79 | code: M351 S1 X1 E0 80 | --- 81 | -------------------------------------------------------------------------------- /views/gcode/M355.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m355 3 | title: Case Light Control 4 | brief: Turn the case light on or off, set brightness 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: CASE_LIGHT_PIN 9 | group: control 10 | 11 | codes: 12 | - M355 13 | 14 | long: Set the case light power state and/or brightness. 15 | 16 | notes: Requires a `CASE_LIGHT_PIN` to control the on/off or PWM state of the case light. The pin will need to be a 12V MOSFET pin with PWM control, or a signal pin connected to a MOSFET or relay to control the higher current required for the light. 17 | 18 | parameters: 19 | - 20 | tag: P 21 | optional: true 22 | description: Set the brightness factor from 0 to 255. 23 | values: 24 | - 25 | type: byte 26 | - 27 | tag: S 28 | optional: true 29 | description: Turn the case light on or off. 30 | values: 31 | - 32 | type: bool 33 | 34 | 35 | example: 36 | - 37 | pre: Turn the case light on at half brightness 38 | code: M355 S1 P128 39 | 40 | --- 41 | 42 | -------------------------------------------------------------------------------- /views/gcode/M360.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m360 3 | title: SCARA Theta A 4 | brief: Move to Theta A 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: MORGAN_SCARA 9 | group: control 10 | 11 | codes: 12 | - M360 13 | 14 | long: Move the nozzle to SCARA calibration position Theta 0 (A0 B120) for calibration of "zero degrees." 15 | 16 | notes: 17 | 18 | parameters: 19 | 20 | examples: 21 | 22 | --- 23 | 24 | -------------------------------------------------------------------------------- /views/gcode/M361.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m361 3 | title: SCARA Theta-B 4 | brief: Move to Theta-B 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: MORGAN_SCARA 9 | group: control 10 | 11 | codes: 12 | - M361 13 | 14 | long: Move the nozzle to SCARA Theta-B calibration position Theta 90 (A90 B130) for calibration of "90 degrees steps-per-degree." 15 | 16 | notes: 17 | 18 | parameters: 19 | 20 | examples: 21 | 22 | --- 23 | 24 | -------------------------------------------------------------------------------- /views/gcode/M362.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m362 3 | title: SCARA Psi-A 4 | brief: Move to Psi-A 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: MORGAN_SCARA 9 | group: control 10 | 11 | codes: 12 | - M362 13 | 14 | long: Move the nozzle to SCARA Psi-A calibration position Psi 0 (A60 B180) for calibration of "zero degrees." 15 | 16 | notes: 17 | 18 | parameters: 19 | 20 | examples: 21 | 22 | --- 23 | 24 | -------------------------------------------------------------------------------- /views/gcode/M363.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m363 3 | title: SCARA Psi-B 4 | brief: Move to Psi-B 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: MORGAN_SCARA 9 | group: control 10 | 11 | codes: 12 | - M363 13 | 14 | long: Move the nozzle to SCARA Psi-B calibration position Psi 90 (A50 B90) for calibration of "90 degrees steps-per-degree." 15 | 16 | notes: 17 | 18 | parameters: 19 | 20 | examples: 21 | 22 | --- 23 | 24 | -------------------------------------------------------------------------------- /views/gcode/M364.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m364 3 | title: SCARA Psi-C 4 | brief: Move to Psi-C 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: MORGAN_SCARA 9 | group: control 10 | 11 | codes: 12 | - M364 13 | 14 | long: Move the nozzle to SCARA Psi-C calibration position Theta-Psi 90 (A45 B135) for calibration of "90 degrees to Theta." 15 | 16 | notes: 17 | 18 | parameters: 19 | 20 | examples: 21 | 22 | --- 23 | 24 | -------------------------------------------------------------------------------- /views/gcode/M380.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m380 3 | title: Activate Solenoid 4 | brief: Activate 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: EXT_SOLENOID 9 | group: none 10 | 11 | codes: 12 | - M380 13 | 14 | long: Activate the solenoid on the active extruder. 15 | 16 | notes: 17 | 18 | parameters: 19 | 20 | example: 21 | - 22 | code: 23 | - M381 ; Deactivate all solenoids 24 | - T0 ; Extruder 0 25 | - M380 ; Activate the E0 solenoid 26 | 27 | --- 28 | -------------------------------------------------------------------------------- /views/gcode/M381.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m381 3 | title: Deactivate Solenoids 4 | brief: Deactivate all extruder solenoids 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: EXT_SOLENOID 9 | group: none 10 | 11 | codes: 12 | - M381 13 | 14 | long: Deactivate all solenoids on all extruders. 15 | 16 | notes: 17 | 18 | parameters: 19 | 20 | example: 21 | - 22 | code: M381 ; Deactivate all solenoids 23 | 24 | --- 25 | -------------------------------------------------------------------------------- /views/gcode/M400.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m400 3 | title: Finish Moves 4 | brief: Wait for all moves to finish 5 | author: thinkyhead 6 | 7 | experimental: false 8 | group: planner 9 | 10 | codes: 11 | - M400 12 | 13 | long: This command causes all GCode processing to pause and wait in a loop until all moves in the planner are completed. 14 | 15 | notes: 16 | 17 | parameters: 18 | 19 | example: 20 | - 21 | pre: Wait for moves to finish before turning off the spindle 22 | code: 23 | - M400 24 | - M5 ; Without M400 this happens too soon 25 | 26 | --- 27 | 28 | -------------------------------------------------------------------------------- /views/gcode/M401.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m401 3 | title: Deploy Probe 4 | brief: Deploy the bed probe 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: HAS_BED_PROBE 9 | group: calibration 10 | 11 | codes: 12 | - M401 13 | 14 | long: Deploy the bed probe. The Z axis may raise up to make room for the probe to deploy. 15 | 16 | notes: Requires some kind of bed probe. This command has no visible effect for probes that don't move. They are just activated. 17 | 18 | parameters: 19 | 20 | examples: 21 | - 22 | pre: Deploy the probe 23 | code: M401 24 | 25 | --- 26 | 27 | -------------------------------------------------------------------------------- /views/gcode/M402.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m402 3 | title: Stow Probe 4 | brief: Stow the bed probe 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: HAS_BED_PROBE 9 | group: calibration 10 | 11 | codes: 12 | - M402 13 | 14 | long: Stow the bed probe. The Z axis may raise up to make room for the probe to stow. 15 | 16 | notes: Requires some kind of bed probe. This command has no visible effect for probes that don't move. They are just deactivated. 17 | 18 | parameters: 19 | 20 | examples: 21 | - 22 | pre: Stow the probe 23 | code: M402 24 | 25 | --- 26 | 27 | -------------------------------------------------------------------------------- /views/gcode/M404.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m404 3 | title: Set Filament Diameter 4 | brief: Set the nominal diameter for filament width sensor auto-flow 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: FILAMENT_WIDTH_SENSOR 9 | group: control 10 | 11 | codes: 12 | - M404 13 | 14 | long: | 15 | Report or set the nominal filament width, such as 1.75 or 3.00. 16 | 17 | This value is used to determine the percentage difference when auto-adjusting flow in response to the measured filament width, and should match the value used for filament width in your slicer settings. 18 | 19 | notes: Requires `FILAMENT_WIDTH_SENSOR`. 20 | 21 | parameters: 22 | - 23 | tag: W 24 | optional: true 25 | description: The new nominal width value 26 | values: 27 | - 28 | tag: linear 29 | type: float 30 | 31 | examples: 32 | - 33 | pre: Set the diameter to 1.75mm 34 | code: M404 W1.75 35 | - 36 | pre: Get the current width 37 | code: 38 | - M404 39 | - '> Filament dia (nominal mm): 1.75' 40 | 41 | --- 42 | -------------------------------------------------------------------------------- /views/gcode/M405.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m405 3 | title: Filament Width Sensor On 4 | brief: Enable filament width sensor flow control 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: FILAMENT_WIDTH_SENSOR 9 | group: control 10 | 11 | codes: 12 | - M405 13 | 14 | long: Turn on the filament width sensor and start using it to do flow control. Initially, the filament between the sensor and the hot-end will be treated as the nominal width. 15 | 16 | notes: Requires `FILAMENT_WIDTH_SENSOR`. 17 | 18 | parameters: 19 | - 20 | tag: D 21 | optional: true 22 | description: Distance from measurement point to hot end. If not given, the previous value will be used. The default startup value is set by `MEASUREMENT_DELAY_CM`. 23 | values: 24 | - 25 | unit: cm 26 | type: int 27 | 28 | example: 29 | - 30 | pre: Start measuring filament width, adjusting flow 31 | code: M405 32 | 33 | --- 34 | -------------------------------------------------------------------------------- /views/gcode/M406.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m406 3 | title: Filament Width Sensor Off 4 | brief: Disable filament width sensor flow control 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: FILAMENT_WIDTH_SENSOR 9 | group: control 10 | 11 | codes: 12 | - M406 13 | 14 | long: Turn off the filament width sensor and stop using it to do flow control. 15 | 16 | notes: Requires `FILAMENT_WIDTH_SENSOR`. 17 | 18 | parameters: 19 | 20 | example: 21 | - 22 | pre: Stop measuring filament width 23 | code: M406 24 | 25 | --- 26 | -------------------------------------------------------------------------------- /views/gcode/M407.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m407 3 | title: Filament Width 4 | brief: Report the measured filament width 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: FILAMENT_WIDTH_SENSOR 9 | group: control 10 | 11 | codes: 12 | - M407 13 | 14 | long: Report the current measured filament width to the host. 15 | 16 | notes: Requires `FILAMENT_WIDTH_SENSOR`. 17 | 18 | parameters: 19 | 20 | example: 21 | - 22 | pre: Get the current measured filament width 23 | code: 24 | - M407 25 | - '> Filament dia (measured mm): 1.768' 26 | 27 | --- 28 | -------------------------------------------------------------------------------- /views/gcode/M410.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m410 3 | title: Quickstop 4 | brief: Stop all steppers instantly 5 | author: thinkyhead 6 | 7 | experimental: false 8 | group: planner 9 | 10 | codes: 11 | - M410 12 | 13 | long: Stop all steppers instantly. Since there will be no deceleration, steppers are expected to be out of position after this command. 14 | 15 | notes: 16 | - This command is intended only for emergency situations. 17 | - If `EMERGENCY_PARSER` is not enabled, this will be delayed. 18 | 19 | parameters: 20 | 21 | example: 22 | - 23 | pre: Stop all steppers now. 24 | code: M410 25 | 26 | --- 27 | 28 | -------------------------------------------------------------------------------- /views/gcode/M420.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m420 3 | title: Bed Leveling State 4 | brief: Get and/or set bed leveling state and fade height 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: AUTO_BED_LEVELING_(3POINT|LINEAR|BILINEAR|UBL)|MESH_BED_LEVELING 9 | group: planner 10 | 11 | codes: 12 | - M420 13 | 14 | long: 15 | - Get and/or set the enabled state of bed leveling compensation, plus Z fade height. 16 | - This command has been extended with `L` to load a mesh for Unified Bed Leveling. 17 | 18 | notes: The "current position" may change in response to `M420 Sn`. 19 | 20 | parameters: 21 | - 22 | tag: L 23 | optional: true 24 | description: Load mesh from EEPROM index (Requires `AUTO_BED_LEVELING_UBL` and `EEPROM_SETTINGS`) 25 | values: 26 | - 27 | type: int 28 | - 29 | tag: S 30 | optional: true 31 | description: Enabled state 32 | values: 33 | - 34 | type: bool 35 | - 36 | tag: V 37 | optional: true 38 | description: 'Verbose: Print the stored mesh / matrix data' 39 | values: 40 | - 41 | type: bool 42 | - 43 | tag: T 44 | optional: true 45 | description: Format to print the mesh data 46 | values: 47 | - 48 | tag: 0 49 | description: Human readable 50 | - 51 | tag: 1 52 | description: CSV 53 | - 54 | tag: 4 55 | description: Compact 56 | - 57 | tag: Z 58 | optional: true 59 | description: Leveling fade Z height (Requires `ENABLE_LEVELING_FADE_HEIGHT`) 60 | values: 61 | - 62 | type: float 63 | tag: linear 64 | - 65 | tag: C 66 | optional: true 67 | description: Center the mesh on the mean of the lowest and highest points 68 | values: 69 | - 70 | type: bool 71 | 72 | examples: 73 | 74 | --- 75 | 76 | -------------------------------------------------------------------------------- /views/gcode/M421.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m421 3 | title: Set Mesh Value 4 | brief: Set a single mesh Z height 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: AUTO_BED_LEVELING_(BILINEAR|UBL)|MESH_BED_LEVELING 9 | group: planner 10 | 11 | codes: 12 | - M421 13 | 14 | long: 15 | - This command is used to set a single Z value for a mesh point in the stored bed leveling data. 16 | - Allowed forms are `M421 In Jn Zn`, `M421 Xn Yn Zn` (`MESH_BED_LEVELING` only) or `M421 C Zn` (`AUTO_BED_LEVELING_UBL` only). 17 | 18 | notes: 19 | 20 | parameters: 21 | - 22 | tag: I 23 | optional: true 24 | description: X index into the mesh array 25 | values: 26 | - 27 | type: int 28 | - 29 | tag: J 30 | optional: true 31 | description: Y index into the mesh array 32 | values: 33 | - 34 | type: int 35 | - 36 | tag: X 37 | optional: true 38 | description: X position (which should be very close to a grid line) (requires `MESH_BED_LEVELING`) 39 | values: 40 | - 41 | tag: linear 42 | type: float 43 | - 44 | tag: Y 45 | optional: true 46 | description: Y position (which should be very close to a grid line) (requires `MESH_BED_LEVELING`) 47 | values: 48 | - 49 | tag: linear 50 | type: float 51 | - 52 | tag: Z 53 | optional: true 54 | description: The new Z value to set 55 | values: 56 | - 57 | tag: linear 58 | type: float 59 | - 60 | tag: Q 61 | optional: true 62 | description: A value to add to the existing Z value 63 | values: 64 | - 65 | tag: linear 66 | type: float 67 | - 68 | tag: C 69 | optional: true 70 | description: Set the mesh point closest to the current nozzle position (requires `AUTO_BED_LEVELING_UBL`) 71 | values: 72 | - 73 | type: bool 74 | - 75 | tag: N 76 | optional: true 77 | description: Set the mesh point to undefined (requires `AUTO_BED_LEVELING_UBL`) 78 | values: 79 | - 80 | type: bool 81 | 82 | examples: 83 | - 84 | pre: Set the Z height in the middle of a 5x5 grid 85 | code: M421 I2 J2 Z-0.05 86 | - 87 | pre: Set the same Z height using XY 88 | code: M421 X100 Y100 Z-0.05 89 | - 90 | pre: Adjust the mesh point by -0.01 91 | code: M421 I2 J2 Q-0.01 92 | 93 | --- 94 | -------------------------------------------------------------------------------- /views/gcode/M428.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m428 3 | title: Home Offsets Here 4 | brief: Set home offsets based on current position 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: HAS_HOME_OFFSET 9 | group: planner 10 | 11 | codes: 12 | - M428 13 | 14 | long: | 15 | Use `M428` to set a persistent offset to the native home position and coordinate space by assigning the current position as the native home position. See the example below. 16 | 17 | - The current position must be within 2cm from 0 or an endstop. 18 | - The current position is set to the native home position. 19 | - Any previous position shift from `G92` is cleared. 20 | - The home offset is persistent — added to the current position until changed. 21 | - Some uses include fine adjustment of Z position (without moving endstops) and shifting the coordinate space to print on a different part of the bed. 22 | 23 | notes: | 24 | - Only the Z offset can be altered on `DELTA`. 25 | - This GCode can be disabled with `NO_WORKSPACE_OFFSETS` to optimize movement. 26 | - Changing the home offsets will not invalidate bed leveling or other saved data. 27 | - If `EEPROM_SETTINGS` is enabled, the home offsets are saved with `M500`, loaded with `M501`, and reset with `M502`. 28 | - Use [`M206`](/docs/gcode/M206.html) to set the home offsets directly. 29 | 30 | parameters: 31 | 32 | examples: 33 | - 34 | pre: What was X=10 becomes X=0. So the X home offset becomes -10. 35 | code: 36 | - G1 X10 37 | - M428 38 | 39 | --- 40 | -------------------------------------------------------------------------------- /views/gcode/M500.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m500 3 | title: Save Settings 4 | brief: Save settings to EEPROM. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: EEPROM_SETTINGS 9 | group: eeprom 10 | 11 | codes: 12 | - M500 13 | 14 | long: Save all configurable settings to EEPROM. 15 | 16 | notes: 17 | - Requires `EEPROM_SETTINGS`. 18 | - Since Marlin 1.1.0 only changed bytes are written to prolong EEPROM life. 19 | 20 | parameters: 21 | 22 | examples: 23 | - 24 | pre: Save settings 25 | code: M500 26 | 27 | --- 28 | -------------------------------------------------------------------------------- /views/gcode/M501.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m501 3 | title: Restore Settings 4 | brief: Restore settings from EEPROM. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: EEPROM_SETTINGS 9 | group: eeprom 10 | 11 | codes: 12 | - M501 13 | 14 | long: Load all saved settings from EEPROM. 15 | 16 | notes: Requires `EEPROM_SETTINGS`. 17 | 18 | parameters: 19 | 20 | examples: 21 | - 22 | pre: Restore all settings. 23 | code: M501 24 | 25 | --- 26 | -------------------------------------------------------------------------------- /views/gcode/M502.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m502 3 | title: Factory Reset 4 | brief: Restore all settings to factory defaults. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | group: eeprom 9 | 10 | codes: 11 | - M502 12 | 13 | long: 14 | - Reset all configurable settings to their factory defaults. 15 | - To also reset settings in EEPROM, follow with [`M500`](/docs/gcode/M500.html). 16 | 17 | notes: 18 | - This command can be used even if `EEPROM_SETTINGS` is disabled. 19 | 20 | parameters: 21 | 22 | examples: 23 | - 24 | pre: Reset settings and save them to EEPROM 25 | code: 26 | - M502 ; reset! 27 | - M500 ; saved!! 28 | 29 | --- 30 | -------------------------------------------------------------------------------- /views/gcode/M503.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m503 3 | title: Report Settings 4 | brief: Report all settings that may be saved to EEPROM. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | group: eeprom 9 | 10 | codes: 11 | - M503 12 | 13 | long: Print a concise report of all current settings (in SRAM) to the host console. 14 | 15 | notes: Does not require `EEPROM_SETTINGS`. 16 | 17 | parameters: 18 | - 19 | tag: S 20 | optional: true 21 | description: Detailed output flag. (`true` if omitted.) 22 | values: 23 | - 24 | tag: flag 25 | type: bool 26 | 27 | examples: 28 | 29 | --- 30 | -------------------------------------------------------------------------------- /views/gcode/M504.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m504 3 | title: Validate EEPROM contents 4 | brief: Validate the contents of the EEPROM. 5 | author: ManuelMcLure 6 | 7 | experimental: false 8 | requires: EEPROM_SETTINGS 9 | group: eeprom 10 | 11 | codes: 12 | - M504 13 | 14 | long: Validate the contents of the EEPROM. 15 | 16 | notes: Requires `EEPROM_SETTINGS`. 17 | 18 | parameters: 19 | 20 | examples: 21 | - 22 | pre: Validate EEPROM contents. 23 | code: M504 24 | 25 | --- 26 | -------------------------------------------------------------------------------- /views/gcode/M540.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m540 3 | title: Endstops Abort SD 4 | brief: Abort SD printing when an endstop is triggered. 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: SDSUPPORT,ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED 9 | group: sdcard 10 | 11 | codes: 12 | - M540 13 | 14 | long: Set whether SD printing should abort in the event of any endstop being triggered. This provides a fast way to abort a print in the event of mechanical failure such as loose couplings, lost steps, diverted axes, binding, etc., which lead to axes being very far out of position. 15 | 16 | notes: 17 | - Requires `SDSUPPORT` and `ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED`. 18 | - Use `ENDSTOPS_ALWAYS_ON_DEFAULT` or `M120` to ensure that endstops are enabled. 19 | 20 | parameters: 21 | - 22 | tag: S 23 | optional: false 24 | description: Whether (1) or not (0) to abort SD printing on endstop hit. 25 | values: 26 | - 27 | tag: flag 28 | type: bool 29 | 30 | examples: 31 | 32 | --- 33 | 34 | -------------------------------------------------------------------------------- /views/gcode/M603.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m603 3 | title: Configure Filament Change 4 | brief: Configure automatic filament change parameters 5 | author: ManuelMcLure 6 | 7 | experimental: false 8 | since: 1.1.0 9 | requires: ADVANCED_PAUSE_FEATURE 10 | group: filament 11 | 12 | codes: 13 | - M603 14 | 15 | long: 16 | - The `M603` command configures automatic filament change parameters. 17 | 18 | notes: 19 | - Requires `ADVANCED_PAUSE_FEATURE`. 20 | 21 | parameters: 22 | - 23 | tag: T 24 | optional: true 25 | description: Target extruder 26 | values: 27 | - 28 | tag: index 29 | type: int 30 | - 31 | tag: U 32 | optional: true 33 | description: Amount of retraction for unload (negative) 34 | values: 35 | - 36 | tag: pos 37 | type: float 38 | - 39 | tag: L 40 | optional: true 41 | description: Load length, longer for bowden (negative) 42 | values: 43 | - 44 | tag: pos 45 | type: float 46 | 47 | examples: 48 | - 49 | pre: Configure load and unload lengths for automatic filament change 50 | code: M603 U120 L125 51 | 52 | --- 53 | -------------------------------------------------------------------------------- /views/gcode/M605.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m605 3 | title: Dual Nozzle Mode 4 | brief: Set the behavior mode for dual nozzles 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: DUAL_NOZZLE_DUPLICATION_MODE|DUAL_X_CARRIAGE 9 | group: control 10 | 11 | codes: 12 | - M605 13 | 14 | long: 15 | - This command behaves differently for `DUAL_X_CARRIAGE` vs. `DUAL_NOZZLE_DUPLICATION_MODE` 16 | - For `DUAL_NOZZLE_DUPLICATION_MODE` the `S2` parameter enables duplication mode. Any other value disables it. 17 | - For `DUAL_X_CARRIAGE`, this command sets the Dual X mode. See the description of `S` below. 18 | 19 | notes: 20 | 21 | parameters: 22 | - 23 | tag: S 24 | optional: false 25 | description: Select the pin to set for all specified axes. 26 | values: 27 | - 28 | tag: 0 29 | description: Full control mode. Both carriages are free to move, constrained by safe distance. (Requires `DUAL_X_CARRIAGE`) 30 | - 31 | tag: 1 32 | description: Auto-park mode. One carriage parks while the other moves. (Requires `DUAL_X_CARRIAGE`) 33 | - 34 | tag: 2 35 | description: Duplication mode. Carriages and extruders move in unison. 36 | - 37 | tag: X 38 | optional: true 39 | description: X distance between dual X carriages. (Requires `DUAL_X_CARRIAGE`) 40 | values: 41 | - 42 | unit: linear 43 | type: float 44 | - 45 | tag: R 46 | optional: true 47 | description: Temperature difference to apply to E1. (Requires `DUAL_X_CARRIAGE`) 48 | values: 49 | - 50 | unit: temp 51 | type: int 52 | 53 | examples: 54 | 55 | --- 56 | 57 | -------------------------------------------------------------------------------- /views/gcode/M665-scara.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m665b 3 | title: SCARA Configuration 4 | brief: Set SCARA geometry values 5 | author: ManuelMcLure 6 | 7 | experimental: false 8 | requires: MORGAN_SCARA|MAKERARM_SCARA 9 | group: none 10 | 11 | codes: 12 | - M665 13 | 14 | long: 15 | - Configure SCARA geometry values 16 | 17 | notes: 18 | 19 | parameters: 20 | - 21 | tag: S 22 | optional: true 23 | description: Segments per second 24 | values: 25 | - 26 | type: float 27 | tag: segments-per-second 28 | - 29 | tag: P 30 | optional: true 31 | description: Theta-Psi offset, added to the shoulder (A/X) angle 32 | values: 33 | - 34 | type: float 35 | tag: theta-pi-offset 36 | - 37 | tag: T 38 | optional: true 39 | description: Theta offset, added to the elbow (B/Y) angle 40 | values: 41 | - 42 | type: float 43 | tag: theta-offset 44 | - 45 | tag: A 46 | optional: true 47 | description: Theta-Psi offset, alias for `P` 48 | values: 49 | - 50 | type: float 51 | tag: theta-pi-offset 52 | - 53 | tag: X 54 | optional: true 55 | description: Theta-Psi offset, alias for `P` 56 | values: 57 | - 58 | type: float 59 | tag: theta-pi-offset 60 | - 61 | tag: B 62 | optional: true 63 | description: Theta offset, alias for `T` 64 | values: 65 | - 66 | type: float 67 | tag: theta-offset 68 | - 69 | tag: Y 70 | optional: true 71 | description: Theta offset, alias for `T` 72 | values: 73 | - 74 | type: float 75 | tag: theta-offset 76 | 77 | examples: 78 | 79 | --- 80 | 81 | -------------------------------------------------------------------------------- /views/gcode/M665.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m665 3 | title: Delta Configuration 4 | brief: Set delta geometry values 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: DELTA 9 | group: none 10 | 11 | codes: 12 | - M665 13 | 14 | long: 15 | - Delta machines are very fast and accurate when tuned. The first key is to make sure all your dimensions are set correctly. Even small errors in these values can lead to curved movements and failed prints. To ensure the best delta experience, use this command in conjunction with `G33` to get these dimensions set perfectly before beginning to print. 16 | 17 | notes: 18 | 19 | parameters: 20 | - 21 | tag: H 22 | optional: true 23 | description: Delta height 24 | values: 25 | - 26 | type: float 27 | tag: linear 28 | - 29 | tag: L 30 | optional: true 31 | description: Diagonal rod 32 | values: 33 | - 34 | type: float 35 | tag: linear 36 | - 37 | tag: R 38 | optional: true 39 | description: Delta radius 40 | values: 41 | - 42 | type: float 43 | tag: linear 44 | - 45 | tag: S 46 | optional: true 47 | description: Segments per second 48 | values: 49 | - 50 | type: float 51 | - 52 | tag: B 53 | optional: true 54 | description: Delta calibration radius 55 | values: 56 | - 57 | type: float 58 | tag: linear 59 | - 60 | tag: X 61 | optional: true 62 | description: Alpha (Tower 1) angle trim 63 | values: 64 | - 65 | type: float 66 | - 67 | tag: Y 68 | optional: true 69 | description: Beta (Tower 2) angle trim 70 | values: 71 | - 72 | type: float 73 | - 74 | tag: Z 75 | optional: true 76 | description: Gamma (Tower 3) angle trim 77 | values: 78 | - 79 | type: float 80 | 81 | examples: 82 | 83 | --- 84 | 85 | -------------------------------------------------------------------------------- /views/gcode/M666-dual.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m666b 3 | title: Set dual endstop offsets 4 | brief: Set dual endstop offsets 5 | author: ManuelMcLure 6 | 7 | experimental: false 8 | group: calibration 9 | requires: (X|Y|Z)_DUAL_ENDSTOPS 10 | 11 | codes: 12 | - M666 13 | 14 | long: | 15 | The `M666` command allows adjusting the offsets for dual endstops 16 | 17 | parameters: 18 | - 19 | tag: X 20 | optional: true 21 | description: Offset for the X axis endstops 22 | values: 23 | - 24 | tag: adj 25 | type: float 26 | - 27 | tag: Y 28 | optional: true 29 | description: Offset for the Y axis endstops 30 | values: 31 | - 32 | tag: adj 33 | type: float 34 | - 35 | tag: Z 36 | optional: true 37 | description: Offset for the Z axis endstops 38 | values: 39 | - 40 | tag: adj 41 | type: float 42 | 43 | examples: 44 | 45 | --- 46 | -------------------------------------------------------------------------------- /views/gcode/M666.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m666a 3 | title: Set Delta endstop adjustments 4 | brief: Set Delta endstop adjustments 5 | author: ManuelMcLure 6 | 7 | experimental: false 8 | group: calibration 9 | requires: DELTA 10 | 11 | codes: 12 | - M666 13 | 14 | long: | 15 | The `M666` command allows adjusting the endstops on a Delta printer. 16 | 17 | parameters: 18 | - 19 | tag: X 20 | optional: true 21 | description: Adjustment for the X actuator endstop 22 | values: 23 | - 24 | tag: adj 25 | type: float 26 | - 27 | tag: Y 28 | optional: true 29 | description: Adjustment for the Y actuator endstop 30 | values: 31 | - 32 | tag: adj 33 | type: float 34 | - 35 | tag: Z 36 | optional: true 37 | description: Adjustment for the Z actuator endstop 38 | values: 39 | - 40 | tag: adj 41 | type: float 42 | 43 | examples: 44 | 45 | --- 46 | -------------------------------------------------------------------------------- /views/gcode/M851.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m851 3 | title: Z Probe Offset 4 | brief: Set the Z probe Z offset from nozzle 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: HAS_BED_PROBE 9 | group: none 10 | 11 | codes: 12 | - M851 13 | 14 | long: 15 | - Set the vertical distance from the nozzle to the Z probe trigger-point. 16 | - | 17 | The easiest way to get the value is to: 18 | - Home the Z axis. 19 | - Raise Z and deploy the probe. 20 | - Move Z down slowly until the probe triggers. 21 | - Take the current Z value and negate it. (`5.2` => `-5.2`) 22 | - Set with `M851 Z-5.2` and `#define Z_PROBE_OFFSET_FROM_EXTRUDER -5.2`. 23 | 24 | notes: The default (factory) value is set by `Z_PROBE_OFFSET_FROM_EXTRUDER`. 25 | 26 | parameters: 27 | - 28 | tag: Z 29 | optional: false 30 | description: Z probe Z offset 31 | values: 32 | - 33 | unit: linear 34 | type: float 35 | 36 | examples: 37 | - 38 | pre: Set a reasonable offset for an inductive probe 39 | code: M851 Z-2.0 40 | - 41 | pre: A probe that is triggered by the nozzle itself 42 | code: M851 Z1.2 43 | 44 | --- 45 | 46 | -------------------------------------------------------------------------------- /views/gcode/M852.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m852 3 | title: Bed Skew Compensation 4 | brief: Misalignment in the XYZ axes. 5 | author: HekTron802 6 | 7 | experimental: true 8 | group: calibration 9 | 10 | codes: 11 | - M852 12 | 13 | long: 14 | - Bed Skew Compensation corrects for misalignment in the XY, XZ, and ZY axes through the use of correction factors. 15 | 16 | notes: 17 | - Correction factors have a range of -1 to 1. 18 | - See Bed Skew Compensation section in the configuration file for more information on calculating the correction factors. 19 | 20 | parameters: 21 | - 22 | tag: I 23 | type: float 24 | optional: true 25 | description: Skew correction factor for XY axis. 26 | - 27 | tag: J 28 | type: float 29 | optional: true 30 | description: Skew correction factor for XZ axis 31 | - 32 | tag: K 33 | type: float 34 | optional: true 35 | description: Skew correction factor for YZ axis 36 | - 37 | tag: S 38 | type: float 39 | optional: true 40 | description: Alias for `I` when only XY skew correction is enabled 41 | --- 42 | -------------------------------------------------------------------------------- /views/gcode/M900.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m900 3 | title: Linear Advance Factor 4 | brief: Get and set Linear Advance K value 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: LIN_ADVANCE 9 | group: control 10 | 11 | codes: 12 | - M900 13 | 14 | long: Get and/or set the Linear Advance K factor. 15 | 16 | notes: See [Linear Advance](/docs/features/lin_advance.html) for details on how to determine the K factor. 17 | 18 | parameters: 19 | - 20 | tag: K 21 | optional: true 22 | description: Advance K factor. Unchanged if omitted. Set this value higher for more flexible filament or a longer filament path. 23 | values: 24 | - 25 | type: float 26 | 27 | example: 28 | - 29 | pre: Set the K factor 30 | code: M900 K0.18 31 | - 32 | pre: Fetch the K factor 33 | code: M900 34 | 35 | --- 36 | -------------------------------------------------------------------------------- /views/gcode/M906.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m906 3 | title: TMC Motor Current 4 | brief: Set the motor current (in milliamps) 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: HAVE_TMC2130 9 | group: none 10 | 11 | codes: 12 | - M906 13 | 14 | long: Set the current for a stepper motor in milliamps units. 15 | 16 | notes: 17 | 18 | parameters: 19 | - 20 | tag: E 21 | optional: true 22 | description: Current for the E0 stepper 23 | values: 24 | - 25 | unit: mA 26 | type: float 27 | - 28 | tag: I 29 | optional: true 30 | description: (>=1.1.9) Index for dual steppers. Use `I1` for X2, Y2, and/or Z2. 31 | values: 32 | - 33 | unit: index 34 | type: int 35 | - 36 | tag: T 37 | optional: true 38 | description: (>=1.1.9) Index (tool) number for the E axis. If not specified, the E0 extruder. 39 | values: 40 | - 41 | unit: index 42 | type: int 43 | - 44 | tag: X 45 | optional: true 46 | description: Current for the X stepper 47 | values: 48 | - 49 | unit: mA 50 | type: float 51 | - 52 | tag: Y 53 | optional: true 54 | description: Current for the Y stepper 55 | values: 56 | - 57 | unit: mA 58 | type: float 59 | - 60 | tag: Z 61 | optional: true 62 | description: Current for the Z stepper 63 | values: 64 | - 65 | unit: mA 66 | type: float 67 | 68 | examples: 69 | - 70 | pre: Set the XYZ motor currents to 5mA 71 | code: M906 X5 Y5 Z5 72 | - 73 | pre: Set the E1 motor current to 10mA 74 | code: M906 T1 E10 75 | - 76 | pre: Set the X2 motor current to 5mA 77 | code: M906 I1 X5 78 | 79 | --- 80 | 81 | -------------------------------------------------------------------------------- /views/gcode/M907.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m907 3 | title: Set Motor Current 4 | brief: Set motor current via digital trimpot 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: DIGIPOTSS_PIN|HAS_MOTOR_CURRENT_PWM|DIGIPOT_I2C|DAC_STEPPER_CURRENT 9 | group: control 10 | 11 | codes: 12 | - M907 13 | 14 | long: Set digital trimpot motor current using axis codes `X`, `Y`, `Z`, `E`, plus `B` and `S`. The unit used for current depends on the type of stepper driver. 15 | 16 | notes: 17 | 18 | parameters: 19 | - 20 | tag: B 21 | optional: true 22 | description: Current for the E1 stepper (Requires `DIGIPOTSS_PIN` or `DIGIPOT_I2C`) 23 | values: 24 | - 25 | tag: current 26 | - 27 | tag: C 28 | optional: true 29 | description: Current for the E2 stepper (Requires `DIGIPOT_I2C`) 30 | values: 31 | - 32 | tag: current 33 | - 34 | tag: D 35 | optional: true 36 | description: Current for the E3 stepper (Requires `DIGIPOT_I2C`) 37 | values: 38 | - 39 | tag: current 40 | - 41 | tag: E 42 | optional: true 43 | description: Current for the E0 stepper 44 | values: 45 | - 46 | tag: current 47 | - 48 | tag: S 49 | optional: true 50 | description: Set this current on all steppers (Requires `DIGIPOTSS_PIN` or `DAC_STEPPER_CURRENT`) 51 | values: 52 | - 53 | tag: current 54 | - 55 | tag: X 56 | optional: true 57 | description: Current for the X stepper (and the Y stepper with `MOTOR_CURRENT_PWM_XY`) 58 | values: 59 | - 60 | tag: current 61 | - 62 | tag: Y 63 | optional: true 64 | description: Current for the Y stepper (Use `X` with `MOTOR_CURRENT_PWM_XY`) 65 | values: 66 | - 67 | tag: current 68 | - 69 | tag: Z 70 | optional: true 71 | description: Current for the Z stepper 72 | values: 73 | - 74 | tag: current 75 | 76 | examples: 77 | 78 | --- 79 | 80 | -------------------------------------------------------------------------------- /views/gcode/M908.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m908 3 | title: Set Trimpot Pins 4 | brief: Set a digital trimpot directly 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: DAC_STEPPER_CURRENT|DIGIPOTSS_PIN 9 | group: control 10 | 11 | codes: 12 | - M908 13 | 14 | long: Set the digital trimpot current directly by address/channel/pin index. `DAC_STEPPER_CURRENT` pertains to the MCP4728. 15 | 16 | notes: Requires `DAC_STEPPER_CURRENT` or `DIGIPOTSS_PIN`. 17 | 18 | parameters: 19 | - 20 | tag: P 21 | optional: false 22 | description: Pin (i.e., Address, Channel) 23 | values: 24 | - 25 | tag: address 26 | type: int 27 | - 28 | tag: S 29 | optional: false 30 | description: Current value 31 | values: 32 | - 33 | tag: current 34 | type: int 35 | 36 | examples: 37 | 38 | --- 39 | 40 | -------------------------------------------------------------------------------- /views/gcode/M909.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m909 3 | title: DAC Print Values 4 | brief: Report DAC current values to host 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: DAC_STEPPER_CURRENT 9 | group: control 10 | 11 | codes: 12 | - M909 13 | 14 | long: Print the DAC stepper current values in the format "`% (Amps)`". 15 | 16 | notes: Requires `DAC_STEPPER_CURRENT`. 17 | 18 | parameters: 19 | 20 | examples: 21 | - 22 | code: M909 23 | 24 | --- 25 | 26 | -------------------------------------------------------------------------------- /views/gcode/M910.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m910 3 | title: Commit DAC to EEPROM 4 | brief: Commit digipot/DAC value to external EEPROM 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: DAC_STEPPER_CURRENT 9 | group: control 10 | 11 | codes: 12 | - M910 13 | 14 | long: Commit digipot/DAC value to external EEPROM via I2C. 15 | 16 | notes: Requires `DAC_STEPPER_CURRENT`. 17 | 18 | parameters: 19 | 20 | examples: 21 | 22 | --- 23 | 24 | -------------------------------------------------------------------------------- /views/gcode/M911.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m911 3 | title: TMC OT Pre-Warn Condition 4 | brief: Driver overtemperature pre-warn condition 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: HAVE_TMC2130 9 | group: control 10 | 11 | codes: 12 | - M911 13 | 14 | long: Report the TMC stepper driver overtemperature pre-warn condition to the host. 15 | 16 | notes: 17 | 18 | parameters: 19 | 20 | examples: 21 | 22 | --- 23 | 24 | -------------------------------------------------------------------------------- /views/gcode/M912.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m912 3 | title: Clear TMC OT Pre-Warn 4 | brief: Clear overtemperature pre-warn condition flag 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: HAVE_TMC2130 9 | group: control 10 | 11 | codes: 12 | - M912 13 | 14 | long: Clear the stepper driver overtemperature pre-warn condition flag. 15 | 16 | notes: Requires one or more TMC stepper drivers. 17 | 18 | parameters: 19 | - 20 | tag: I 21 | optional: true 22 | since: "1.1.9" 23 | description: Stepper number to set. If omitted, all specified axes. 24 | values: 25 | - 26 | tag: 0 27 | description: Both. 28 | - 29 | tag: 1 30 | description: Base (X, Y, Z) steppers. 31 | - 32 | tag: 2 33 | description: Second (X2, Y2, Z2) steppers. 34 | - 35 | tag: X 36 | type: int 37 | optional: true 38 | description: Clear `X` and/or `X2` stepper driver Over Temperature Pre-warn flag. 39 | - 40 | tag: Y 41 | type: int 42 | optional: true 43 | description: Clear `Y` and/or `Y2` stepper driver Over Temperature Pre-warn flag. 44 | - 45 | tag: Z 46 | type: int 47 | optional: true 48 | description: Clear `Z` and/or `Z2` stepper driver Over Temperature Pre-warn flag. 49 | - 50 | tag: E 51 | type: int 52 | optional: true 53 | description: Clear all or one `E` stepper driver Over Temperature Pre-warn flag. 54 | values: 55 | - 56 | tag: "-" 57 | description: All E. 58 | - 59 | tag: 0-4 60 | description: E index. 61 | 62 | examples: 63 | - 64 | code: | 65 | M912 ; clear all 66 | M912 X ; clear X and X2 67 | M912 X1 ; clear X1 only 68 | M912 X2 ; clear X2 only 69 | M912 X E ; clear X, X2, and all E 70 | M912 E1 ; clear E1 only 71 | 72 | --- 73 | 74 | -------------------------------------------------------------------------------- /views/gcode/M914.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m914 3 | title: TMC Bump Sensitivity 4 | brief: Set sensorless homing sensitivity 5 | author: thinkyhead,mbuc 6 | 7 | experimental: false 8 | requires: HAVE_TMC2130,SENSORLESS_HOMING 9 | group: control 10 | 11 | codes: 12 | - M914 13 | 14 | long: Some TMC stepper drivers can detect when they bump into something that causes them to stop moving. This feature is so sensitive that it can actually take the place of traditional endstops. Use this command to set the bump sensitivity for the X, Y, and Z stepper drivers. 15 | 16 | notes: 17 | - Set `SENSORLESS_HOMING` in `Configuration_adv.h` to enable this feature. 18 | - This feature is currently only compatible with the TMC2130. 19 | - This works best with the `*_HOME_BUMP_MM` options set to 0. 20 | - Higher values = Lower sensitivity. 21 | 22 | parameters: 23 | - 24 | tag: I 25 | optional: true 26 | description: (>=1.1.9) Index for dual steppers. Use `I1` for X2, Y2, and/or Z2. 27 | values: 28 | - 29 | unit: index 30 | type: int 31 | - 32 | tag: X 33 | optional: true 34 | description: Sensitivity of the X stepper driver. A value from -64 to +63. 35 | values: 36 | - 37 | type: int 38 | - 39 | tag: Y 40 | optional: true 41 | description: Sensitivity of the Y stepper driver. A value from -64 to +63. 42 | values: 43 | - 44 | type: int 45 | - 46 | tag: Z 47 | optional: true 48 | description: Sensitivity of the Z stepper driver. A value from -64 to +63. 49 | values: 50 | - 51 | type: int 52 | 53 | examples: 54 | 55 | --- 56 | -------------------------------------------------------------------------------- /views/gcode/M915.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m915 3 | title: TMC Z axis calibration 4 | brief: Align ends of the Z axis and test torque 5 | author: thinkyhead 6 | 7 | experimental: false 8 | requires: HAVE_TMC2130,TMC_Z_CALIBRATION 9 | group: control 10 | 11 | codes: 12 | - M915 13 | 14 | long: | 15 | The command aims to align the ends of the X gantry (for a Průša i3-style printer). Here's a [video demonstration](https://www.youtube.com/watch?v=JqH41K2vq0g&t=300s). 16 | 17 | Using the given current, Marlin will move the Z axis (at homing speed) to the top plus a given extra distance. _Since this intentionally stalls the Z steppers, you should use the minimum current required to move the axis._ 18 | 19 | Z is then re-homed to correct the position. 20 | 21 | notes: 22 | - Requires `TMC_Z_CALIBRATION` and at least one TMC driver for Z axis. 23 | - If `Z_DUAL_STEPPER_DRIVERS` is used, both should be TMC drivers. 24 | 25 | parameters: 26 | - 27 | tag: S 28 | optional: true 29 | description: "Current value to use for the raise move. (Default: `CALIBRATION_CURRENT`)" 30 | values: 31 | - 32 | unit: mA 33 | type: int 34 | - 35 | tag: Z 36 | optional: true 37 | description: "Extra distance past `Z_MAX_POS` to move the Z axis. (Default: `CALIBRATION_EXTRA_HEIGHT`)" 38 | values: 39 | - 40 | unit: linear 41 | type: float 42 | 43 | example: 44 | - 45 | pre: Set the current to 300mA and press the steppers against the top for an extra 5mm. 46 | code: 47 | - G21 ; Units to mm 48 | - M915 S300 Z5 49 | 50 | --- 51 | -------------------------------------------------------------------------------- /views/gcode/M928.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m928 3 | title: Start SD Logging 4 | brief: Log serial input to an SD file 5 | author: thinkyhead 6 | 7 | experimental: false 8 | group: sdcard 9 | 10 | codes: 11 | - M928 12 | 13 | long: Use this command to start logging all console and host input to an SD file while still operating the machine. 14 | 15 | notes: Stop logging with `M29`. 16 | 17 | parameters: 18 | - 19 | tag: filename 20 | optional: false 21 | description: File name of log file 22 | 23 | examples: 24 | - 25 | pre: Start logging to log.txt 26 | code: M928 log.txt 27 | 28 | related: [ M29 ] 29 | 30 | --- 31 | -------------------------------------------------------------------------------- /views/gcode/M999.md: -------------------------------------------------------------------------------- 1 | --- 2 | tag: m999 3 | title: STOP Restart 4 | brief: Return the machine to Running state 5 | author: thinkyhead 6 | 7 | experimental: false 8 | group: control 9 | 10 | codes: 11 | - M999 12 | 13 | long: | 14 | If a **STOP** occurs you can use `M999` to restart the "stopped" machine after resolving the issue. 15 | 16 | Marlin will call **STOP** if any error occurs that would make continuing the current process problematic. For example, if the probe fails to deploy, it will abort probing and STOP. Note that this disables all heaters. 17 | 18 | notes: 19 | 20 | parameters: 21 | - 22 | tag: S 23 | description: Resume without flushing the command buffer. The default behaviour is to flush the serial buffer and request a resend to the host starting on the last `N` line received. 24 | values: 25 | - 26 | type: bool 27 | 28 | examples: 29 | - 30 | pre: Restart the machine 31 | code: M999 32 | 33 | --- 34 | -------------------------------------------------------------------------------- /views/gt.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
16 | -------------------------------------------------------------------------------- /views/snippets/00-upnp.html: -------------------------------------------------------------------------------- 1 | External access (UPnP) 2 |
3 |

You can connect to this host from local network 4 | 5 |

6 |

Current state of public access is: Unknown at: 7 | 8 |

9 | 10 | 11 | 48 | -------------------------------------------------------------------------------- /views/snippets/01-cam.html: -------------------------------------------------------------------------------- 1 | Remote camera preview 2 |
3 |
4 |
5 | Scan QR code with your mobile phone 6 | 7 |
8 |
9 | Voice: 10 |
11 | 16 |
17 |
18 |
19 | 20 | 21 | 22 |
23 | 24 |
25 |
26 | -------------------------------------------------------------------------------- /views/snippets/bs-0default.html: -------------------------------------------------------------------------------- 1 | Default marlin bootscreen 2 |
3 |

This is default boot screen with size

4 | 5 | 16 | -------------------------------------------------------------------------------- /views/version.html: -------------------------------------------------------------------------------- 1 | 5 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 19 | 20 | {{text.name}} 21 | 22 | 23 | {{text.name}} 24 | 25 | 26 | {{text.version}} 27 | 28 | 29 | {{text.version}} 30 | 31 | 32 | --------------------------------------------------------------------------------