diff --git a/src/octoprint/plugins/svgtogcode/static/js/working_area.js b/src/octoprint/plugins/svgtogcode/static/js/working_area.js index a6a4ffe1..226a79ad 100644 --- a/src/octoprint/plugins/svgtogcode/static/js/working_area.js +++ b/src/octoprint/plugins/svgtogcode/static/js/working_area.js @@ -16,18 +16,37 @@ function WorkingAreaViewModel(loginStateViewModel, settingsViewModel, printerSta self.isError = ko.observable(undefined); self.isReady = ko.observable(undefined); self.isLoading = ko.observable(undefined); + self.currentPos = ko.observable(undefined); self.laserPos = ko.computed(function(){ - console.log("foo") - x = self.x === undefined ? '?' : self.x; - y = self.y === undefined ? '?' : self.y; - return "x"+ x + ", y"+ y; + var pos = self.currentPos(); + if(!pos){ + + return "(?, ?)"; + } else { + return "("+ pos.x + ", "+ pos.y + ")"; + } }, this); + + self._processPos = function(posStr) { + // example posStr: "X: 73.0000 Y: 192.0000 Z: 0.0000" + var parts = posStr.split(" "); + var x = parseFloat(parts[1]).toFixed(2) + var y = parseFloat(parts[3]).toFixed(2) + self.currentPos({x:x, y:y}); + }; + + self._fromData = function(data) { + workPosition = data.workPosition; + self._processPos(workPosition); + }; + + self.fromCurrentData = function(data) { + self._fromData(data); + }; self.move_laser = function(el){ - console.log(event); var x = event.offsetX; var y = event.toElement.offsetHeight - event.offsetY; - console.log(x, y); var command = "G0 X"+x+" Y"+y; $.ajax({ url: API_BASEURL + "printer/command", @@ -49,12 +68,8 @@ function WorkingAreaViewModel(loginStateViewModel, settingsViewModel, printerSta self.pause = self.state.pause; self.cancel = self.state.cancel; -// self.enable_focus = function(){ -// $root.sendCustomCommand({type:'command',command:'M3S5'}) -// } -// self.disable_focus = function(){ -// $root.sendCustomCommand({type:'command',command:'M5'}) -// } + + // // self.getLaserPos = function(){ // console.log("foo") diff --git a/src/octoprint/plugins/svgtogcode/templates/override_index.jinja2 b/src/octoprint/plugins/svgtogcode/templates/override_index.jinja2 index 65ded5b0..e558ed45 100644 --- a/src/octoprint/plugins/svgtogcode/templates/override_index.jinja2 +++ b/src/octoprint/plugins/svgtogcode/templates/override_index.jinja2 @@ -422,8 +422,8 @@ - - + + diff --git a/src/octoprint/printer.py b/src/octoprint/printer.py index 53f809fb..3229a189 100644 --- a/src/octoprint/printer.py +++ b/src/octoprint/printer.py @@ -58,6 +58,8 @@ class Printer(): self._state = None self._currentZ = None + self._machinePosition = "-" + self._workPosition = "-" self._progress = None self._printTime = None @@ -196,6 +198,7 @@ class Printer(): def jog(self, axis, amount): movementSpeed = settings().get(["printerParameters", "movementSpeed", ["x", "y", "z"]], asdict=True) self.commands(["G91", "G1 %s%.4f F%d" % (axis.upper(), amount, movementSpeed[axis]), "G90"]) + self.command("?") def home(self, axes): #self.commands(["G91", "G28 %s" % " ".join(map(lambda x: "%s0" % x.upper(), axes)), "G90"]) @@ -277,9 +280,22 @@ class Printer(): if self._selectedFile is None: return + self._addPositionData(None) self._setCurrentZ(None) self._comm.startPrint() + def _addPositionData(self, MPos, WPos): + + if MPos is None or WPos is None: + MPosString = WPosString = "-" + else: + MPosString = "X: %.4f Y: %.4f Z: %.4f" % ( MPos[0], MPos[1], MPos[2] ) + WPosString = "X: %.4f Y: %.4f Z: %.4f" % ( WPos[0], WPos[1], WPos[2] ) + + + self._stateMonitor.setWorkPosition(WPosString) + self._stateMonitor.setMachinePosition(MPosString) + def togglePausePrint(self): """ Pause the current printjob. @@ -467,6 +483,10 @@ class Printer(): def mcTempUpdate(self, temp, bedTemp): self._addTemperatureData(temp, bedTemp) + def mcPosUpdate(self, MPos, WPos): + print WPos + self._addPositionData(MPos, WPos) + def mcStateChange(self, state): """ Callback method for the comm object, called if the connection state changes. @@ -693,6 +713,8 @@ class StateMonitor(object): self._gcodeData = None self._sdUploadData = None self._currentZ = None + self._machinePosition = None + self._workPosition = None self._progress = None self._offsets = {} @@ -705,16 +727,26 @@ class StateMonitor(object): self._worker.daemon = True self._worker.start() - def reset(self, state=None, jobData=None, progress=None, currentZ=None): + def reset(self, state=None, jobData=None, progress=None, currentZ=None, machinePosition=None, workPosition=None): self.setState(state) self.setJobData(jobData) self.setProgress(progress) + self.setMachinePosition(machinePosition) + self.setWorkPosition(workPosition) self.setCurrentZ(currentZ) def addTemperature(self, temperature): self._addTemperatureCallback(temperature) self._changeEvent.set() + def setWorkPosition(self, workPosition): + self._workPosition = workPosition + self._changeEvent.set() + + def setMachinePosition(self, machinePosition): + self._machinePosition = machinePosition + self._changeEvent.set() + def addLog(self, log): self._addLogCallback(log) self._changeEvent.set() @@ -764,6 +796,8 @@ class StateMonitor(object): return { "state": self._state, "job": self._jobData, + "machinePosition": self._machinePosition, + "workPosition": self._workPosition, "currentZ": self._currentZ, "progress": self._progress, "offsets": self._offsets diff --git a/src/octoprint/server/api/printer.py b/src/octoprint/server/api/printer.py index 55ae6d3b..165a7b53 100644 --- a/src/octoprint/server/api/printer.py +++ b/src/octoprint/server/api/printer.py @@ -326,6 +326,9 @@ def printerCommand(): commandToSend = command % parameters commandsToSend.append(commandToSend) + if settings().getBoolean(["feature", "grbl"]): + commandsToSend.append("?") + printer.commands(commandsToSend) return NO_CONTENT diff --git a/src/octoprint/server/util/sockjs.py b/src/octoprint/server/util/sockjs.py index 22374eac..99be19b3 100644 --- a/src/octoprint/server/util/sockjs.py +++ b/src/octoprint/server/util/sockjs.py @@ -70,6 +70,7 @@ class PrinterStateConnection(sockjs.tornado.SockJSConnection): pass def sendCurrentData(self, data): + print("send_current_data", data) # add current temperature, log and message backlogs to sent data with self._temperatureBacklogMutex: temperatures = self._temperatureBacklog @@ -131,4 +132,5 @@ class PrinterStateConnection(sockjs.tornado.SockJSConnection): self.sendEvent(event, payload) def _emit(self, type, payload): + print("emit", type, payload) self.send({type: payload}) diff --git a/src/octoprint/util/comm.py b/src/octoprint/util/comm.py index 7118ab34..ea765a2d 100644 --- a/src/octoprint/util/comm.py +++ b/src/octoprint/util/comm.py @@ -91,7 +91,7 @@ gcodeToEvent = { "M300": Events.ALERT, # home print head - "G28": Events.HOME, + "$H": Events.HOME, # emergency stop "M112": Events.E_STOP, @@ -647,6 +647,8 @@ class MachineCom(object): heatingUp = False swallowOk = False supportRepetierTargetTemp = settings().getBoolean(["feature", "repetierTargetTemp"]) + grblMoving = True + grblLastStatus = "" while True: try: @@ -725,6 +727,27 @@ class MachineCom(object): except ValueError: pass + # GRBL Position update + if self._grbl and 'MPos:' in line: + + if grblLastStatus == line: + grblMoving = False + else: + grblMoving = True + + grblLastStatus = line + + parts = line.strip("\r\n").split(":") + + pos = parts[1].split(",") + MPos = (float(pos[0]), float(pos[1]), float(pos[2])) + + pos = parts[2].split(",") + WPos = (float(pos[0]), float(pos[1]), float( pos[2].strip(">") )) + + self._callback.mcPosUpdate(MPos, WPos) + + ##~~ SD Card handling elif 'SD init fail' in line or 'volume.init failed' in line or 'openRoot failed' in line: self._sdAvailable = False