From 769b8a53ed5fa38202aaaeaaa107b176749a8ff1 Mon Sep 17 00:00:00 2001 From: mmone Date: Sat, 25 Aug 2018 16:55:48 +0200 Subject: [PATCH] [feature] Parameterized macros (#16) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds the option to have parameters in Macros and show a dialog to the user on execution to change them. Here's and example: PID_CALIBRATE HEATER={label:Heater, default:extruder, options:extruder|extruder1} TARGET={label:Temperature, unit:°C, default:190} WRITE_FILE={label:WriteFile, default:0, options:0|1} --- octoprint_klipper/__init__.py | 7 ++ octoprint_klipper/static/js/klipper.js | 27 ++++++- .../static/js/klipper_param_macro.js | 76 +++++++++++++++++++ .../klipper_param_macro_dialog.jinja2 | 32 ++++++++ .../templates/klipper_settings.jinja2 | 19 ++++- .../templates/klipper_tab_main.jinja2 | 2 +- 6 files changed, 158 insertions(+), 5 deletions(-) create mode 100644 octoprint_klipper/static/js/klipper_param_macro.js create mode 100644 octoprint_klipper/templates/klipper_param_macro_dialog.jinja2 diff --git a/octoprint_klipper/__init__.py b/octoprint_klipper/__init__.py index fd210b1..fa45563 100644 --- a/octoprint_klipper/__init__.py +++ b/octoprint_klipper/__init__.py @@ -209,6 +209,12 @@ class KlipperPlugin( name="Performance Graph", template="klipper_graph_dialog.jinja2", custom_bindings=True + ), + dict( + type="generic", + name="Macro Dialog", + template="klipper_param_macro_dialog.jinja2", + custom_bindings=True ) ] @@ -221,6 +227,7 @@ class KlipperPlugin( "js/klipper_leveling.js", "js/klipper_pid_tuning.js", "js/klipper_offset.js", + "js/klipper_param_macro.js", "js/klipper_graph.js" ], css=["css/klipper.css"], diff --git a/octoprint_klipper/static/js/klipper.js b/octoprint_klipper/static/js/klipper.js index 1f7522b..bcf7bc0 100644 --- a/octoprint_klipper/static/js/klipper.js +++ b/octoprint_klipper/static/js/klipper.js @@ -12,6 +12,7 @@ $(function() { self.loginState = parameters[1]; self.connectionState = parameters[2]; self.levelingViewModel = parameters[3]; + self.paramMacroViewModel = parameters[4]; self.shortStatus = ko.observable(); self.logMessages = ko.observableArray(); @@ -52,8 +53,22 @@ $(function() { }); } - self.executeMacro = function(macro) { - OctoPrint.control.sendGcode(macro.macro()); + self.executeMacro = function(macro) { + var paramObjRegex = /{(.*?)}/g; + + if (macro.macro().match(paramObjRegex) == null) { + OctoPrint.control.sendGcode( + macro.macro().replace(/(?:\r\n|\r|\n)/g, " ") + ); + } else { + self.paramMacroViewModel.process(macro); + + var dialog = $("#klipper_macro_dialog"); + dialog.modal({ + show: 'true', + backdrop: 'static' + }); + } } self.onGetStatus = function() { @@ -97,7 +112,13 @@ $(function() { OCTOPRINT_VIEWMODELS.push({ construct: KlipperViewModel, - dependencies: ["settingsViewModel", "loginStateViewModel", "connectionViewModel", "klipperLevelingViewModel"], + dependencies: [ + "settingsViewModel", + "loginStateViewModel", + "connectionViewModel", + "klipperLevelingViewModel", + "klipperMacroDialogViewModel" + ], elements: ["#tab_plugin_klipper_main", "#sidebar_plugin_klipper", "#navbar_plugin_klipper"] }); }); \ No newline at end of file diff --git a/octoprint_klipper/static/js/klipper_param_macro.js b/octoprint_klipper/static/js/klipper_param_macro.js new file mode 100644 index 0000000..977052e --- /dev/null +++ b/octoprint_klipper/static/js/klipper_param_macro.js @@ -0,0 +1,76 @@ +// OctoPrint Klipper Plugin +// +// Copyright (C) 2018 Martin Muehlhaeuser +// +// This file may be distributed under the terms of the GNU GPLv3 license. + +$(function() { + function KlipperMacroDialogViewModel(parameters) { + var self = this; + + self.parameters = ko.observableArray(); + self.interpolatedCmd; + self.macro; + self.macroName = ko.observable(); + + var paramObjRegex = /{(.*?)}/g; + var keyValueRegex = /(\w*)\s*:\s*([\w°"|]*)/g; + + self.process = function(macro) { + self.macro = macro.macro(); + self.macroName(macro.name()); + + var matches = self.macro.match(paramObjRegex); + var params = []; + + for (var i=0; i < matches.length; i++) { + var obj = {}; + var res = keyValueRegex.exec(matches[i]); + + while (res != null) { + if("options" == res[1]) { + obj["options"] = res[2].split("|"); + } else { + obj[res[1]] = res[2]; + } + res = keyValueRegex.exec(matches[i]); + } + + if(!("label" in obj)) { + obj["label"] = "Input " + (i+1); + } + + if(!("unit" in obj)) { + obj["unit"] = ""; + } + + if("default" in obj) { + obj["value"] = obj["default"]; + } + + params.push(obj); + } + self.parameters(params); + } + + self.executeMacro = function() { + var i=-1; + + function replaceParams(match) { + i++; + return self.parameters()[i]["value"]; + } + + expanded = self.macro.replace(paramObjRegex, replaceParams) + expanded = expanded.replace(/(?:\r\n|\r|\n)/g, " "); + + OctoPrint.control.sendGcode(expanded); + } + } + + OCTOPRINT_VIEWMODELS.push({ + construct: KlipperMacroDialogViewModel, + dependencies: [], + elements: ["#klipper_macro_dialog"] + }); +}); diff --git a/octoprint_klipper/templates/klipper_param_macro_dialog.jinja2 b/octoprint_klipper/templates/klipper_param_macro_dialog.jinja2 new file mode 100644 index 0000000..ac8674a --- /dev/null +++ b/octoprint_klipper/templates/klipper_param_macro_dialog.jinja2 @@ -0,0 +1,32 @@ + diff --git a/octoprint_klipper/templates/klipper_settings.jinja2 b/octoprint_klipper/templates/klipper_settings.jinja2 index d105fb0..dcac2f5 100644 --- a/octoprint_klipper/templates/klipper_settings.jinja2 +++ b/octoprint_klipper/templates/klipper_settings.jinja2 @@ -6,6 +6,7 @@
  • Klipper Configuration
  • +
    @@ -38,6 +39,7 @@
    +
    @@ -69,7 +71,7 @@
    - +
    @@ -86,7 +88,21 @@ {{ _('Add Macro') }}
    +
    + + To show a dialog that asks for parameters you can write your macro like in the following example:
    +
    +
    +
    +
    +PID_CALIBRATE 
    +HEATER={label:Heater, default:extruder, options:extruder|extruder1}
    +TARGET={label:Temperature, unit:°C, default:190}
    +WRITE_FILE={label:WriteFile, default:0, options:0|1}
    +
    +
    +
    @@ -164,6 +180,7 @@
    +
    diff --git a/octoprint_klipper/templates/klipper_tab_main.jinja2 b/octoprint_klipper/templates/klipper_tab_main.jinja2 index 175cfe9..da9640d 100644 --- a/octoprint_klipper/templates/klipper_tab_main.jinja2 +++ b/octoprint_klipper/templates/klipper_tab_main.jinja2 @@ -10,7 +10,7 @@