diff --git a/octoprint/server.py b/octoprint/server.py index 323b1a38..0bc4b40a 100644 --- a/octoprint/server.py +++ b/octoprint/server.py @@ -177,6 +177,7 @@ def index(): webcamStream=settings().get(["webcam", "stream"]), enableTimelapse=(settings().get(["webcam", "snapshot"]) is not None and settings().get(["webcam", "ffmpeg"]) is not None), enableGCodeVisualizer=settings().get(["feature", "gCodeVisualizer"]), + enableTemperatureGraph=settings().get(["feature", "temperatureGraph"]), enableSystemMenu=settings().get(["system"]) is not None and settings().get(["system", "actions"]) is not None and len(settings().get(["system", "actions"])) > 0, enableAccessControl=userManager is not None, enableSdSupport=settings().get(["feature", "sdSupport"]), @@ -587,6 +588,7 @@ def getSettings(): }, "feature": { "gcodeViewer": s.getBoolean(["feature", "gCodeVisualizer"]), + "temperatureGraph": s.getBoolean(["feature", "temperatureGraph"]), "waitForStart": s.getBoolean(["feature", "waitForStartOnConnect"]), "alwaysSendChecksum": s.getBoolean(["feature", "alwaysSendChecksum"]), "sdSupport": s.getBoolean(["feature", "sdSupport"]) @@ -651,6 +653,7 @@ def setSettings(): if "feature" in data.keys(): if "gcodeViewer" in data["feature"].keys(): s.setBoolean(["feature", "gCodeVisualizer"], data["feature"]["gcodeViewer"]) + if "temperatureGraph" in data["feature"].keys(): s.setBoolean(["feature", "temperatureGraph"], data["feature"]["temperatureGraph"]) if "waitForStart" in data["feature"].keys(): s.setBoolean(["feature", "waitForStartOnConnect"], data["feature"]["waitForStart"]) if "alwaysSendChecksum" in data["feature"].keys(): s.setBoolean(["feature", "alwaysSendChecksum"], data["feature"]["alwaysSendChecksum"]) if "sdSupport" in data["feature"].keys(): s.setBoolean(["feature", "sdSupport"], data["feature"]["sdSupport"]) diff --git a/octoprint/settings.py b/octoprint/settings.py index f45846ba..4cc80222 100644 --- a/octoprint/settings.py +++ b/octoprint/settings.py @@ -50,6 +50,7 @@ default_settings = { }, "feature": { "gCodeVisualizer": True, + "temperatureGraph": True, "waitForStartOnConnect": False, "alwaysSendChecksum": False, "sdSupport": True diff --git a/octoprint/static/js/app/main.js b/octoprint/static/js/app/main.js index 3406c589..2bdba579 100644 --- a/octoprint/static/js/app/main.js +++ b/octoprint/static/js/app/main.js @@ -194,7 +194,10 @@ $(function() { ko.applyBindings(temperatureViewModel, document.getElementById("temp")); ko.applyBindings(controlViewModel, document.getElementById("control")); ko.applyBindings(terminalViewModel, document.getElementById("term")); - ko.applyBindings(gcodeViewModel, document.getElementById("gcode")); + var gcode = document.getElementById("gcode"); + if (gcode) { + ko.applyBindings(gcodeViewModel, gcode); + } ko.applyBindings(settingsViewModel, document.getElementById("settings_dialog")); ko.applyBindings(navigationViewModel, document.getElementById("navbar")); ko.applyBindings(appearanceViewModel, document.getElementsByTagName("head")[0]); diff --git a/octoprint/static/js/app/viewmodels/settings.js b/octoprint/static/js/app/viewmodels/settings.js index a8e9d28a..2790e40d 100644 --- a/octoprint/static/js/app/viewmodels/settings.js +++ b/octoprint/static/js/app/viewmodels/settings.js @@ -27,6 +27,7 @@ function SettingsViewModel(loginStateViewModel, usersViewModel) { self.webcam_flipV = ko.observable(undefined); self.feature_gcodeViewer = ko.observable(undefined); + self.feature_temperatureGraph = ko.observable(undefined); self.feature_waitForStart = ko.observable(undefined); self.feature_alwaysSendChecksum = ko.observable(undefined); self.feature_sdSupport = ko.observable(undefined); @@ -98,6 +99,7 @@ function SettingsViewModel(loginStateViewModel, usersViewModel) { self.webcam_flipV(response.webcam.flipV); self.feature_gcodeViewer(response.feature.gcodeViewer); + self.feature_temperatureGraph(response.feature.temperatureGraph); self.feature_waitForStart(response.feature.waitForStart); self.feature_alwaysSendChecksum(response.feature.alwaysSendChecksum); self.feature_sdSupport(response.feature.sdSupport); @@ -151,6 +153,7 @@ function SettingsViewModel(loginStateViewModel, usersViewModel) { }, "feature": { "gcodeViewer": self.feature_gcodeViewer(), + "temperatureGraph": self.feature_temperatureGraph(), "waitForStart": self.feature_waitForStart(), "alwaysSendChecksum": self.feature_alwaysSendChecksum(), "sdSupport": self.feature_sdSupport() diff --git a/octoprint/static/js/app/viewmodels/temperature.js b/octoprint/static/js/app/viewmodels/temperature.js index 1d7b9953..794447df 100644 --- a/octoprint/static/js/app/viewmodels/temperature.js +++ b/octoprint/static/js/app/viewmodels/temperature.js @@ -104,6 +104,8 @@ function TemperatureViewModel(loginStateViewModel, settingsViewModel) { self.targetTemp(data[data.length - 1].targetTemp); self.bedTargetTemp(data[data.length - 1].targetBedTemp); + if (!CONFIG_TEMPERATURE_GRAPH) return; + if (!self.temperatures) self.temperatures = []; if (!self.temperatures.actual) @@ -115,12 +117,14 @@ function TemperatureViewModel(loginStateViewModel, settingsViewModel) { if (!self.temperatures.targetBed) self.temperatures.targetBed = []; - for (var i = 0; i < data.length; i++) { - self.temperatures.actual.push([data[i].currentTime, data[i].temp]) - self.temperatures.target.push([data[i].currentTime, data[i].targetTemp]) - self.temperatures.actualBed.push([data[i].currentTime, data[i].bedTemp]) - self.temperatures.targetBed.push([data[i].currentTime, data[i].targetBedTemp]) - } + _.each(data, function(d) { + var time = d.currentTime; + self.temperatures.actual.push([currentTime, d.temp]); + self.temperatures.target.push([currentTime, d.targetTemp]); + self.temperatures.actualBed.push([currentTime, d.bedTemp]); + self.temperatures.targetBed.push([currentTime, d.targetBedTemp]); + }); + self.temperatures.actual = self.temperatures.actual.slice(-300); self.temperatures.target = self.temperatures.target.slice(-300); self.temperatures.actualBed = self.temperatures.actualBed.slice(-300); @@ -135,13 +139,17 @@ function TemperatureViewModel(loginStateViewModel, settingsViewModel) { } self.updatePlot = function() { - var data = [ - {label: "Actual", color: "#FF4040", data: self.temperatures.actual}, - {label: "Target", color: "#FFA0A0", data: self.temperatures.target}, - {label: "Bed Actual", color: "#4040FF", data: self.temperatures.actualBed}, - {label: "Bed Target", color: "#A0A0FF", data: self.temperatures.targetBed} - ] - $.plot($("#temperature-graph"), data, self.plotOptions); + var graph = $("#temperature-graph"); + if (graph.length) { + var data = [ + {label: "Actual", color: "#FF4040", data: self.temperatures.actual}, + {label: "Target", color: "#FFA0A0", data: self.temperatures.target}, + {label: "Bed Actual", color: "#4040FF", data: self.temperatures.actualBed}, + {label: "Bed Target", color: "#A0A0FF", data: self.temperatures.targetBed} + ] + + $.plot(graph, data, self.plotOptions); + } } self.setTempFromProfile = function(profile) { diff --git a/octoprint/templates/index.jinja2 b/octoprint/templates/index.jinja2 index 1fc1ea1b..8f98b868 100644 --- a/octoprint/templates/index.jinja2 +++ b/octoprint/templates/index.jinja2 @@ -26,6 +26,7 @@ var CONFIG_ACCESS_CONTROL = {% if enableAccessControl -%} true; {% else %} false; {%- endif %} var CONFIG_SD_SUPPORT = {% if enableSdSupport -%} true; {% else %} false; {%- endif %} var CONFIG_FIRST_RUN = {% if firstRun -%} true; {% else %} false; {%- endif %} + var CONFIG_TEMPERATURE_GRAPH = {% if enableTemperatureGraph -%} true; {% else %} false; {%- endif %} var SOCKJS_URI = window.location.protocol.slice(0, -1) + "://" + (window.document ? window.document.domain : window.location.hostname) + ":" + window.location.port + "/sockjs"; var SOCKJS_DEBUG = {% if debug -%} true; {% else %} false; {%- endif %} @@ -245,9 +246,11 @@