From c00b3de40c0a2107f0f3d515612c5f84488b7974 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gina=20H=C3=A4u=C3=9Fge?= Date: Fri, 2 Dec 2016 11:06:01 +0100 Subject: [PATCH] Fix temperature history on server reconnect Two problems solved: * Make sure to only process temperature data once we have printer profile information on hand to evaluate the heater data. If we don't have that yet, create a client side backlog and process that once we have the necessary data on hand. * Do not use uninitialized history cutoff values - if our cutoff value hasn't yet synced (no settings response arrived yet), just don't perform the cutoff. --- .../static/js/app/viewmodels/temperature.js | 49 +++++++++++++++---- 1 file changed, 40 insertions(+), 9 deletions(-) diff --git a/src/octoprint/static/js/app/viewmodels/temperature.js b/src/octoprint/static/js/app/viewmodels/temperature.js index 089cbfc6..9dbd4991 100644 --- a/src/octoprint/static/js/app/viewmodels/temperature.js +++ b/src/octoprint/static/js/app/viewmodels/temperature.js @@ -36,6 +36,10 @@ $(function() { self.heaterOptions = ko.observable({}); + self._printerProfileInitialized = false; + self._currentTemperatureDataBacklog = []; + self._historyTemperatureDataBacklog = []; + self._printerProfileUpdated = function() { var graphColors = ["red", "orange", "green", "brown", "purple"]; var heaterOptions = {}; @@ -81,6 +85,10 @@ $(function() { // write back self.heaterOptions(heaterOptions); self.tools(tools); + + if (!self._printerProfileInitialized) { + self._triggerBacklog(); + } self.updatePlot(); }; self.settingsViewModel.printerProfiles.currentProfileData.subscribe(function() { @@ -126,16 +134,36 @@ $(function() { self.fromCurrentData = function(data) { self._processStateData(data.state); - self._processTemperatureUpdateData(data.serverTime, data.temps); + if (!self._printerProfileInitialized) { + self._currentTemperatureDataBacklog.push(data); + } else { + self._processTemperatureUpdateData(data.serverTime, data.temps); + } self._processOffsetData(data.offsets); }; self.fromHistoryData = function(data) { self._processStateData(data.state); - self._processTemperatureHistoryData(data.serverTime, data.temps); + if (!self._printerProfileInitialized) { + self._historyTemperatureDataBacklog.push(data); + } else { + self._processTemperatureHistoryData(data.serverTime, data.temps); + } self._processOffsetData(data.offsets); }; + self._triggerBacklog = function() { + _.each(self._historyTemperatureDataBacklog, function(data) { + self._processTemperatureHistoryData(data.serverTime, data.temps); + }); + _.each(self._currentTemperatureDataBacklog, function(data) { + self._processTemperatureUpdateData(data.serverTime, data.temps); + }); + self._historyTemperatureDataBacklog = []; + self._currentTemperatureDataBacklog = []; + self._printerProfileInitialized = true; + }; + self._processStateData = function(data) { self.isErrorOrClosed(data.flags.closedOrError); self.isOperational(data.flags.operational); @@ -217,14 +245,17 @@ $(function() { }) }); - var filterOld = function(item) { - return item[0] >= clientTime - self.temperature_cutoff() * 60 * 1000; - }; + var temperature_cutoff = self.temperature_cutoff(); + if (temperature_cutoff != undefined) { + var filterOld = function(item) { + return item[0] >= clientTime - temperature_cutoff * 60 * 1000; + }; - _.each(_.keys(self.heaterOptions()), function(d) { - result[d].actual = _.filter(result[d].actual, filterOld); - result[d].target = _.filter(result[d].target, filterOld); - }); + _.each(_.keys(self.heaterOptions()), function(d) { + result[d].actual = _.filter(result[d].actual, filterOld); + result[d].target = _.filter(result[d].target, filterOld); + }); + } return result; };