From ca8779676c7c6955eacae59d2a9b5e5e174e2008 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gina=20H=C3=A4u=C3=9Fge?= Date: Mon, 10 Mar 2014 13:52:09 +0100 Subject: [PATCH] Added configurable timeout settings for temperature and sd status query, made communication timeout reset everytime a non-empty line is received from the printer --- src/octoprint/server/api/settings.py | 4 ++++ src/octoprint/settings.py | 4 +++- .../static/js/app/viewmodels/settings.js | 6 +++++ src/octoprint/templates/settings.jinja2 | 24 ++++++++++++++++--- src/octoprint/util/__init__.py | 7 +++--- src/octoprint/util/comm.py | 18 +++++++------- 6 files changed, 46 insertions(+), 17 deletions(-) diff --git a/src/octoprint/server/api/settings.py b/src/octoprint/server/api/settings.py index 0cb14375..7323548e 100644 --- a/src/octoprint/server/api/settings.py +++ b/src/octoprint/server/api/settings.py @@ -71,6 +71,8 @@ def getSettings(): "timeoutConnection": s.getFloat(["serial", "timeout", "connection"]), "timeoutDetection": s.getFloat(["serial", "timeout", "detection"]), "timeoutCommunication": s.getFloat(["serial", "timeout", "communication"]), + "timeoutTemperature": s.getFloat(["serial", "timeout", "temperature"]), + "timeoutSdStatus": s.getFloat(["serial", "timeout", "sdStatus"]), "log": s.getBoolean(["serial", "log"]) }, "folder": { @@ -146,6 +148,8 @@ def setSettings(): if "timeoutConnection" in data["serial"].keys(): s.setFloat(["serial", "timeout", "connection"], data["serial"]["timeoutConnection"]) if "timeoutDetection" in data["serial"].keys(): s.setFloat(["serial", "timeout", "detection"], data["serial"]["timeoutDetection"]) if "timeoutCommunication" in data["serial"].keys(): s.setFloat(["serial", "timeout", "communication"], data["serial"]["timeoutCommunication"]) + if "timeoutTemperature" in data["serial"].keys(): s.setFloat(["serial", "timeout", "temperature"], data["serial"]["timeoutTemperature"]) + if "timeoutSdStatus" in data["serial"].keys(): s.setFloat(["serial", "timeout", "sdStatus"], data["serial"]["timeoutSdStatus"]) oldLog = s.getBoolean(["serial", "log"]) if "log" in data["serial"].keys(): s.setBoolean(["serial", "log"], data["serial"]["log"]) diff --git a/src/octoprint/settings.py b/src/octoprint/settings.py index 8c489061..e776a8d7 100644 --- a/src/octoprint/settings.py +++ b/src/octoprint/settings.py @@ -31,7 +31,9 @@ default_settings = { "timeout": { "detection": 0.5, "connection": 2, - "communication": 5 + "communication": 5, + "temperature": 5, + "sdStatus": 1 }, "additionalPorts": [] }, diff --git a/src/octoprint/static/js/app/viewmodels/settings.js b/src/octoprint/static/js/app/viewmodels/settings.js index eef8d584..12902e64 100644 --- a/src/octoprint/static/js/app/viewmodels/settings.js +++ b/src/octoprint/static/js/app/viewmodels/settings.js @@ -106,6 +106,8 @@ function SettingsViewModel(loginStateViewModel, usersViewModel) { self.serial_timeoutConnection = ko.observable(undefined); self.serial_timeoutDetection = ko.observable(undefined); self.serial_timeoutCommunication = ko.observable(undefined); + self.serial_timeoutTemperature = ko.observable(undefined); + self.serial_timeoutSdStatus = ko.observable(undefined); self.serial_log = ko.observable(undefined); self.folder_uploads = ko.observable(undefined); @@ -216,6 +218,8 @@ function SettingsViewModel(loginStateViewModel, usersViewModel) { self.serial_timeoutConnection(response.serial.timeoutConnection); self.serial_timeoutDetection(response.serial.timeoutDetection); self.serial_timeoutCommunication(response.serial.timeoutCommunication); + self.serial_timeoutTemperature(response.serial.timeoutTemperature); + self.serial_timeoutSdStatus(response.serial.timeoutSdStatus); self.serial_log(response.serial.log); self.folder_uploads(response.folder.uploads); @@ -279,6 +283,8 @@ function SettingsViewModel(loginStateViewModel, usersViewModel) { "timeoutConnection": self.serial_timeoutConnection(), "timeoutDetection": self.serial_timeoutDetection(), "timeoutCommunication": self.serial_timeoutCommunication(), + "timeoutTemperature": self.serial_timeoutTemperature(), + "timeoutSdStatus": self.serial_timeoutSdStatus(), "log": self.serial_log() }, "folder": { diff --git a/src/octoprint/templates/settings.jinja2 b/src/octoprint/templates/settings.jinja2 index 4c29e6b1..28f647e7 100644 --- a/src/octoprint/templates/settings.jinja2 +++ b/src/octoprint/templates/settings.jinja2 @@ -46,7 +46,7 @@
- +
@@ -55,7 +55,25 @@
- + +
+
+ + s +
+
+
+
+ +
+
+ + s +
+
+
+
+
@@ -64,7 +82,7 @@
- +
diff --git a/src/octoprint/util/__init__.py b/src/octoprint/util/__init__.py index 0c5e66d2..ae4bbe73 100644 --- a/src/octoprint/util/__init__.py +++ b/src/octoprint/util/__init__.py @@ -10,7 +10,7 @@ import re import tempfile from flask import make_response -from octoprint.settings import settings +from octoprint.settings import settings, default_settings def getFormattedSize(num): @@ -89,8 +89,9 @@ def getGitInfo(): def getNewTimeout(type): now = time.time() - if type not in ["connection", "detection", "communication"]: - return now # timeout immediately for unknown timeout type + if type not in default_settings["serial"]["timeout"].keys(): + # timeout immediately for unknown timeout type + return now return now + settings().getFloat(["serial", "timeout", type]) diff --git a/src/octoprint/util/comm.py b/src/octoprint/util/comm.py index 34f7b960..acb7b1ea 100644 --- a/src/octoprint/util/comm.py +++ b/src/octoprint/util/comm.py @@ -614,8 +614,8 @@ class MachineCom(object): #Start monitoring the serial port. timeout = getNewTimeout("communication") - tempRequestTimeout = timeout - sdStatusRequestTimeout = timeout + tempRequestTimeout = getNewTimeout("temperature") + sdStatusRequestTimeout = getNewTimeout("sdStatus") startSeen = not settings().getBoolean(["feature", "waitForStartOnConnect"]) heatingUp = False swallowOk = False @@ -626,6 +626,8 @@ class MachineCom(object): line = self._readline() if line is None: break + if line.strip() is not "": + timeout = getNewTimeout("communication") ##~~ Error handling line = self._handleErrors(line) @@ -845,7 +847,7 @@ class MachineCom(object): self._sendCommand(self._commandQueue.get()) else: self._sendCommand("M105") - tempRequestTimeout = getNewTimeout("communication") + tempRequestTimeout = getNewTimeout("temperature") # resend -> start resend procedure from requested line elif line.lower().startswith("resend") or line.lower().startswith("rs"): if settings().get(["feature", "swallowOkAfterResend"]): @@ -861,24 +863,20 @@ class MachineCom(object): if self.isSdPrinting(): if time.time() > tempRequestTimeout and not heatingUp: self._sendCommand("M105") - tempRequestTimeout = getNewTimeout("communication") + tempRequestTimeout = getNewTimeout("temperature") if time.time() > sdStatusRequestTimeout and not heatingUp: self._sendCommand("M27") - sdStatusRequestTimeout = time.time() + 1 - - if 'ok' or 'SD printing byte' in line: - timeout = getNewTimeout("communication") + sdStatusRequestTimeout = getNewTimeout("sdStatus") else: # Even when printing request the temperature every 5 seconds. if time.time() > tempRequestTimeout and not self.isStreaming(): self._commandQueue.put("M105") - tempRequestTimeout = getNewTimeout("communication") + tempRequestTimeout = getNewTimeout("temperature") if "ok" in line and swallowOk: swallowOk = False elif "ok" in line: - timeout = getNewTimeout("communication") if self._resendDelta is not None: self._resendNextCommand() elif not self._commandQueue.empty() and not self.isStreaming():