From d43bc2e17ebf5e96e76335a12ba66d401598fd11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gina=20H=C3=A4u=C3=9Fge?= Date: Wed, 6 May 2015 17:23:01 +0200 Subject: [PATCH] Allow different timestamps (zones or dates) between client and server while keeping the temperature graph working The server now sends the current server time with each temperature update as well as the initial temperature data, allowing the client to translate the timestamps contained in the temperature logs to its local timescale. Followup to commit f19d0f0360ce102bd601fc571bb1c17878f136c4 which caused a problem with large deviations between server and client time. --- src/octoprint/server/util/sockjs.py | 6 +++++- .../static/js/app/viewmodels/temperature.js | 21 ++++++++++--------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/octoprint/server/util/sockjs.py b/src/octoprint/server/util/sockjs.py index 67137a99..b8985ef5 100644 --- a/src/octoprint/server/util/sockjs.py +++ b/src/octoprint/server/util/sockjs.py @@ -8,6 +8,7 @@ __copyright__ = "Copyright (C) 2014 The OctoPrint Project - Released under terms import logging import threading import sockjs.tornado +import time import octoprint.timelapse import octoprint.server @@ -98,6 +99,7 @@ class PrinterStateConnection(sockjs.tornado.SockJSConnection, octoprint.printer. busy_files.append(dict(origin=data["job"]["file"]["origin"], name=data["job"]["file"]["name"])) data.update({ + "serverTime": time.time(), "temps": temperatures, "logs": logs, "messages": messages, @@ -106,7 +108,9 @@ class PrinterStateConnection(sockjs.tornado.SockJSConnection, octoprint.printer. self._emit("current", data) def on_printer_send_initial_data(self, data): - self._emit("history", data) + data_to_send = dict(data) + data_to_send["serverTime"] = time.time() + self._emit("history", data_to_send) def sendEvent(self, type, payload=None): self._emit("event", {"type": type, "payload": payload}) diff --git a/src/octoprint/static/js/app/viewmodels/temperature.js b/src/octoprint/static/js/app/viewmodels/temperature.js index 4657630a..9b58d2ec 100644 --- a/src/octoprint/static/js/app/viewmodels/temperature.js +++ b/src/octoprint/static/js/app/viewmodels/temperature.js @@ -117,13 +117,13 @@ $(function() { self.fromCurrentData = function(data) { self._processStateData(data.state); - self._processTemperatureUpdateData(data.temps); + self._processTemperatureUpdateData(data.serverTime, data.temps); self._processOffsetData(data.offsets); }; self.fromHistoryData = function(data) { self._processStateData(data.state); - self._processTemperatureHistoryData(data.temps); + self._processTemperatureHistoryData(data.serverTime, data.temps); self._processOffsetData(data.offsets); }; @@ -137,7 +137,7 @@ $(function() { self.isLoading(data.flags.loading); }; - self._processTemperatureUpdateData = function(data) { + self._processTemperatureUpdateData = function(serverTime, data) { if (data.length == 0) return; @@ -161,12 +161,12 @@ $(function() { if (!CONFIG_TEMPERATURE_GRAPH) return; - self.temperatures = self._processTemperatureData(data, self.temperatures); + self.temperatures = self._processTemperatureData(serverTime, data, self.temperatures); self.updatePlot(); }; - self._processTemperatureHistoryData = function(data) { - self.temperatures = self._processTemperatureData(data); + self._processTemperatureHistoryData = function(serverTime, data) { + self.temperatures = self._processTemperatureData(serverTime, data); self.updatePlot(); }; @@ -183,8 +183,9 @@ $(function() { } }; - self._processTemperatureData = function(data, result) { + self._processTemperatureData = function(serverTime, data, result) { var types = _.keys(self.heaterOptions()); + var clientTime = Date.now(); // make sure result is properly initialized if (!result) { @@ -201,7 +202,8 @@ $(function() { // convert data _.each(data, function(d) { - var time = d.time * 1000; + var timeDiff = (serverTime - d.time) * 1000; + var time = clientTime - timeDiff; _.each(types, function(type) { if (!d[type]) return; result[type].actual.push([time, d[type].actual]); @@ -211,9 +213,8 @@ $(function() { }) }); - var now = Date.now(); var filterOld = function(item) { - return item[0] >= now - self.temperature_cutoff() * 60 * 1000; + return item[0] >= clientTime - self.temperature_cutoff() * 60 * 1000; }; _.each(_.keys(self.heaterOptions()), function(d) {