diff --git a/src/octoprint/plugins/svgtogcode/templates/override_index.jinja2 b/src/octoprint/plugins/svgtogcode/templates/override_index.jinja2
index 76e095b0..44e1040f 100644
--- a/src/octoprint/plugins/svgtogcode/templates/override_index.jinja2
+++ b/src/octoprint/plugins/svgtogcode/templates/override_index.jinja2
@@ -154,7 +154,7 @@ var UI_API_KEY = "{{ uiApiKey }}";
-
+
@@ -282,7 +282,7 @@ var UI_API_KEY = "{{ uiApiKey }}";
{{ _('Size') }}:
diff --git a/src/octoprint/printer.py b/src/octoprint/printer.py
index 46ddd745..1a7a13fc 100644
--- a/src/octoprint/printer.py
+++ b/src/octoprint/printer.py
@@ -464,6 +464,7 @@ class Printer():
def _getStateFlags(self):
return {
"operational": self.isOperational(),
+ "locked": self.isLocked(),
"printing": self.isPrinting(),
"closedOrError": self.isClosedOrError(),
"error": self.isError(),
@@ -681,6 +682,9 @@ class Printer():
def isOperational(self):
return self._comm is not None and self._comm.isOperational()
+ def isLocked(self):
+ return self._comm is not None and self._comm.isLocked()
+
def isPrinting(self):
return self._comm is not None and self._comm.isPrinting()
diff --git a/src/octoprint/server/api/printer.py b/src/octoprint/server/api/printer.py
index 165a7b53..d52a4f64 100644
--- a/src/octoprint/server/api/printer.py
+++ b/src/octoprint/server/api/printer.py
@@ -19,7 +19,7 @@ import octoprint.util as util
@api.route("/printer", methods=["GET"])
def printerState():
- if not printer.isOperational():
+ if not (printer.isOperational() or printer.isLocked()):
return make_response("Printer is not operational", 409)
# process excludes
diff --git a/src/octoprint/static/css/mrbeam.css b/src/octoprint/static/css/mrbeam.css
index bb4274b0..7fadca5a 100644
--- a/src/octoprint/static/css/mrbeam.css
+++ b/src/octoprint/static/css/mrbeam.css
@@ -1568,7 +1568,7 @@ input.search-query,
}
-/* TODO ... don't use :hover ... tablets! */
+/* TODO ... don't use :hover ... tablets!
.file_list_entry .action-buttons,
.file_list_entry .uploaded,
.file_list_entry .size {
@@ -1580,6 +1580,7 @@ input.search-query,
.file_list_entry:hover .size {
display: block;
}
+*/
#area_preview {
background-image: url(../img/crosshair.png);
diff --git a/src/octoprint/static/js/app/viewmodels/connection.js b/src/octoprint/static/js/app/viewmodels/connection.js
index 1b4505c2..07c7b409 100644
--- a/src/octoprint/static/js/app/viewmodels/connection.js
+++ b/src/octoprint/static/js/app/viewmodels/connection.js
@@ -13,6 +13,7 @@ function ConnectionViewModel(loginStateViewModel, settingsViewModel) {
self.isErrorOrClosed = ko.observable(undefined);
self.isOperational = ko.observable(undefined);
+ self.isLocked = ko.observable(undefined);
self.isPrinting = ko.observable(undefined);
self.isPaused = ko.observable(undefined);
self.isError = ko.observable(undefined);
@@ -69,6 +70,7 @@ function ConnectionViewModel(loginStateViewModel, settingsViewModel) {
self.isErrorOrClosed(data.flags.closedOrError);
self.isOperational(data.flags.operational);
+ self.isOperational(data.flags.locked);
self.isPaused(data.flags.paused);
self.isPrinting(data.flags.printing);
self.isError(data.flags.error);
diff --git a/src/octoprint/static/js/app/viewmodels/control.js b/src/octoprint/static/js/app/viewmodels/control.js
index dfaaa422..200719d2 100644
--- a/src/octoprint/static/js/app/viewmodels/control.js
+++ b/src/octoprint/static/js/app/viewmodels/control.js
@@ -14,6 +14,7 @@ function ControlViewModel(loginStateViewModel, settingsViewModel, printerStateVi
self.isErrorOrClosed = ko.observable(undefined);
self.isOperational = ko.observable(undefined);
+ self.isLocked = ko.observable(undefined);
self.isPrinting = ko.observable(undefined);
self.isPaused = ko.observable(undefined);
self.isError = ko.observable(undefined);
@@ -60,6 +61,7 @@ function ControlViewModel(loginStateViewModel, settingsViewModel, printerStateVi
self._processStateData = function(data) {
self.isErrorOrClosed(data.flags.closedOrError);
self.isOperational(data.flags.operational);
+ self.isLocked(data.flags.locked);
self.isPaused(data.flags.paused);
self.isPrinting(data.flags.printing);
self.isError(data.flags.error);
diff --git a/src/octoprint/static/js/app/viewmodels/files.js b/src/octoprint/static/js/app/viewmodels/files.js
index f982dd63..dea02238 100644
--- a/src/octoprint/static/js/app/viewmodels/files.js
+++ b/src/octoprint/static/js/app/viewmodels/files.js
@@ -220,6 +220,7 @@ function GcodeFilesViewModel(printerStateViewModel, loginStateViewModel, slicing
self.downloadLink = function(data) {
if (data["refs"] && data["refs"]["download"]) {
+ console.log(data["refs"])
return data["refs"]["download"];
} else {
return false;
diff --git a/src/octoprint/static/js/app/viewmodels/printerstate.js b/src/octoprint/static/js/app/viewmodels/printerstate.js
index bc8d1678..b8b6beba 100644
--- a/src/octoprint/static/js/app/viewmodels/printerstate.js
+++ b/src/octoprint/static/js/app/viewmodels/printerstate.js
@@ -6,6 +6,7 @@ function PrinterStateViewModel(loginStateViewModel) {
self.stateString = ko.observable(undefined);
self.isErrorOrClosed = ko.observable(undefined);
self.isOperational = ko.observable(undefined);
+ self.isLocked = ko.observable(undefined);
self.isPrinting = ko.observable(undefined);
self.isPaused = ko.observable(undefined);
self.isError = ko.observable(undefined);
@@ -133,6 +134,7 @@ function PrinterStateViewModel(loginStateViewModel) {
self.stateString(gettext(data.text));
self.isErrorOrClosed(data.flags.closedOrError);
self.isOperational(data.flags.operational);
+ self.isLocked(data.flags.locked);
self.isPaused(data.flags.paused);
self.isPrinting(data.flags.printing);
self.isError(data.flags.error);
diff --git a/src/octoprint/util/comm.py b/src/octoprint/util/comm.py
index 8f62ed86..6a4161cb 100644
--- a/src/octoprint/util/comm.py
+++ b/src/octoprint/util/comm.py
@@ -114,6 +114,7 @@ class MachineCom(object):
STATE_ERROR = 9
STATE_CLOSED_WITH_ERROR = 10
STATE_TRANSFERING_FILE = 11
+ STATE_LOCKED = 12
def __init__(self, port = None, baudrate = None, callbackObject = None):
self._logger = logging.getLogger(__name__)
@@ -263,6 +264,8 @@ class MachineCom(object):
return "Error: %s" % (self.getShortErrorString())
if self._state == self.STATE_TRANSFERING_FILE:
return "Transfering file to SD"
+ if self._state == self.STATE_LOCKED:
+ return "Locked"
return "?%d?" % (self._state)
def getShortErrorString(self):
@@ -281,6 +284,9 @@ class MachineCom(object):
def isOperational(self):
return self._state == self.STATE_OPERATIONAL or self._state == self.STATE_PRINTING or self._state == self.STATE_PAUSED or self._state == self.STATE_TRANSFERING_FILE
+
+ def isLocked(self):
+ return self._state == self.STATE_LOCKED
def isPrinting(self):
return self._state == self.STATE_PRINTING
@@ -736,7 +742,15 @@ class MachineCom(object):
grblMoving = True
grblLastStatus = line
-
+
+ if("Alarm" in line):
+ self._changeState(self.STATE_LOCKED)
+ else:
+ if(grblMoving):
+ self._changeState(self.STATE_PRINTING)
+ else:
+ self._changeState(self.STATE_OPERATIONAL)
+
parts = line.strip("\r\n").split(":")
pos = parts[1].split(",")
@@ -745,6 +759,7 @@ class MachineCom(object):
pos = parts[2].split(",")
WPos = (float(pos[0]), float(pos[1]), float( pos[2].strip(">") ))
+
self._callback.mcPosUpdate(MPos, WPos)