Extend payload in various events

Added name and path various event print job events and
the upload event, deprecated the file property.

Had to move event triggering of the print job events to
the printer implementation, since the file manager
is not available in the comm layer. Added new callbacks
to the PrinterInterface to allow for that to be possible.
This commit is contained in:
Gina Häußge 2016-07-08 12:54:58 +02:00
parent 3a4902367b
commit 5bf5e336ec
4 changed files with 204 additions and 91 deletions

View file

@ -152,8 +152,15 @@ Upload
A file has been uploaded.
Payload:
* ``file``: the file's name
* ``target``: the target to which the file was uploaded, either ``local`` or ``sdcard``
* ``name``: the file's name
* ``path``: the file's path within its storage location
* ``target``: the target storage location to which the file was uploaded, either ``local`` or ``sdcard``
.. deprecated:: 1.3.0
* ``file``: the file's path within its storage location
Still available for reasons of backwards compatibility. Will be removed with 1.4.0.
UpdatedFiles
A file list was modified.
@ -201,19 +208,26 @@ MetadataAnalysisFinished
Still available for reasons of backwards compatibility. Will be removed with 1.4.0.
FileSelected
A GCODE file has been selected for printing.
A file has been selected for printing.
Payload:
* ``file``: the full path to the file
* ``filename``: the file's name
* ``origin``: the origin of the file, either ``local`` or ``sdcard``
* ``name``: the file's name
* ``path``: the file's path within its storage location
* ``origin``: the origin storage location of the file, either ``local`` or ``sdcard``
.. deprecated:: 1.3.0
* ``file``: the file's full path on disk (``local``) or within its storage (``sdcard``)
* ``filename``: the file's name
Still available for reasons of backwards compatibility. Will be removed with 1.4.0.
FileDeselected
No file is selected any more for printing.
TransferStarted
A GCODE file transfer to SD has started.
A file transfer to the printer's SD has started.
Payload:
@ -223,7 +237,7 @@ TransferStarted
**Note:** Name changed in version 1.1.0
TransferDone
A GCODE file transfer to SD has finished.
A file transfer to the printer's SD has finished.
Payload:
@ -239,49 +253,97 @@ PrintStarted
Payload:
* ``file``: the file's name
* ``origin``: the origin of the file, either ``local`` or ``sdcard``
* ``name``: the file's name
* ``path``: the file's path within its storage location
* ``origin``: the origin storage location of the file, either ``local`` or ``sdcard``
.. deprecated:: 1.3.0
* ``file``: the file's full path on disk (``local``) or within its storage (``sdcard``)
* ``filename``: the file's name
Still available for reasons of backwards compatibility. Will be removed with 1.4.0.
PrintFailed
A print failed.
Payload:
* ``file``: the file's name
* ``origin``: the origin of the file, either ``local`` or ``sdcard``
* ``name``: the file's name
* ``path``: the file's path within its storage location
* ``origin``: the origin storage location of the file, either ``local`` or ``sdcard``
.. deprecated:: 1.3.0
* ``file``: the file's full path on disk (``local``) or within its storage (``sdcard``)
* ``filename``: the file's name
Still available for reasons of backwards compatibility. Will be removed with 1.4.0.
PrintDone
A print completed successfully.
Payload:
* ``file``: the file's name
* ``origin``: the origin of the file, either ``local`` or ``sdcard``
* ``name``: the file's name
* ``path``: the file's path within its storage location
* ``origin``: the origin storage location of the file, either ``local`` or ``sdcard``
* ``time``: the time needed for the print, in seconds (float)
.. deprecated:: 1.3.0
* ``file``: the file's full path on disk (``local``) or within its storage (``sdcard``)
* ``filename``: the file's name
Still available for reasons of backwards compatibility. Will be removed with 1.4.0.
PrintCancelled
The print has been cancelled via the cancel button.
Payload:
* ``file``: the file's name
* ``origin``: the origin of the file, either ``local`` or ``sdcard``
* ``name``: the file's name
* ``path``: the file's path within its storage location
* ``origin``: the origin storage location of the file, either ``local`` or ``sdcard``
.. deprecated:: 1.3.0
* ``file``: the file's full path on disk (``local``) or within its storage (``sdcard``)
* ``filename``: the file's name
Still available for reasons of backwards compatibility. Will be removed with 1.4.0.
PrintPaused
The print has been paused.
Payload:
* ``file``: the file's name
* ``origin``: the origin of the file, either ``local`` or ``sdcard``
* ``name``: the file's name
* ``path``: the file's path within its storage location
* ``origin``: the origin storage location of the file, either ``local`` or ``sdcard``
.. deprecated:: 1.3.0
* ``file``: the file's full path on disk (``local``) or within its storage (``sdcard``)
* ``filename``: the file's name
Still available for reasons of backwards compatibility. Will be removed with 1.4.0.
PrintResumed
The print has been resumed.
Payload:
* ``file``: the file's name
* ``origin``: the origin of the file, either ``local`` or ``sdcard``
* ``name``: the file's name
* ``path``: the file's path within its storage location
* ``origin``: the origin storage location of the file, either ``local`` or ``sdcard``
.. deprecated:: 1.3.0
* ``file``: the file's full path on disk (``local``) or within its storage (``sdcard``)
* ``filename``: the file's name
Still available for reasons of backwards compatibility. Will be removed with 1.4.0.
GCODE processing
----------------

View file

@ -97,6 +97,7 @@ class Printer(PrinterInterface, comm.MachineComPrintCallback):
job_data={
"file": {
"name": None,
"path": None,
"size": None,
"origin": None,
"date": None
@ -232,7 +233,7 @@ class Printer(PrinterInterface, comm.MachineComPrintCallback):
for command in commands:
self._comm.sendCommand(command)
def script(self, name, context=None):
def script(self, name, context=None, must_be_set=True):
if self._comm is None:
return
@ -240,7 +241,7 @@ class Printer(PrinterInterface, comm.MachineComPrintCallback):
raise ValueError("name must be set")
result = self._comm.sendGcodeScript(name, replacements=context)
if not result:
if not result and must_be_set:
raise UnknownScript(name)
def jog(self, axes, relative=True, speed=None, *args, **kwargs):
@ -719,13 +720,15 @@ class Printer(PrinterInterface, comm.MachineComPrintCallback):
def _setJobData(self, filename, filesize, sd):
if filename is not None:
if sd:
path_in_storage = filename
if path_in_storage.startswith("/"):
path_in_storage = path_in_storage[1:]
name_in_storage = filename
if name_in_storage.startswith("/"):
name_in_storage = name_in_storage[1:]
path_in_storage = name_in_storage
path_on_disk = None
else:
path_in_storage = self._fileManager.path_in_storage(FileDestinations.LOCAL, filename)
path_on_disk = self._fileManager.path_on_disk(FileDestinations.LOCAL, filename)
_, name_in_storage = self._fileManager.split_path(FileDestinations.LOCAL, path_in_storage)
self._selectedFile = {
"filename": path_in_storage,
"filesize": filesize,
@ -737,6 +740,7 @@ class Printer(PrinterInterface, comm.MachineComPrintCallback):
self._stateMonitor.set_job_data({
"file": {
"name": None,
"path": None,
"origin": None,
"size": None,
"date": None
@ -784,7 +788,8 @@ class Printer(PrinterInterface, comm.MachineComPrintCallback):
self._stateMonitor.set_job_data({
"file": {
"name": path_in_storage,
"name": name_in_storage,
"path": path_in_storage,
"origin": FileDestinations.SDCARD if sd else FileDestinations.LOCAL,
"size": filesize,
"date": date
@ -804,7 +809,7 @@ class Printer(PrinterInterface, comm.MachineComPrintCallback):
"messages": list(self._messages)
})
callback.on_printer_send_initial_data(data)
except Exception, err:
except Exception as err:
import sys
sys.stderr.write("ERROR: %s\n" % str(err))
pass
@ -892,19 +897,67 @@ class Printer(PrinterInterface, comm.MachineComPrintCallback):
eventManager().fire(Events.UPDATED_FILES, {"type": "gcode"})
self._sdFilelistAvailable.set()
def on_comm_file_selected(self, filename, filesize, sd):
self._setJobData(filename, filesize, sd)
def on_comm_file_selected(self, full_path, size, sd):
if full_path is not None:
payload = self._payload_for_print_job_event(location=FileDestinations.SDCARD if sd else FileDestinations.LOCAL,
print_job_file=full_path)
eventManager().fire(Events.FILE_SELECTED, payload)
else:
eventManager().fire(Events.FILE_DESELECTED)
self._setJobData(full_path, size, sd)
self._stateMonitor.set_state({"text": self.get_state_string(), "flags": self._getStateFlags()})
if self._printAfterSelect:
self.start_print(pos=self._posAfterSelect)
def on_comm_print_job_started(self):
payload = self._payload_for_print_job_event()
if payload:
eventManager().fire(Events.PRINT_STARTED, payload)
def on_comm_print_job_done(self):
payload = self._payload_for_print_job_event()
if payload:
payload["time"] = self._comm.getPrintTime()
eventManager().fire(Events.PRINT_DONE, payload)
self.script("afterPrintDone",
context=dict(event=payload),
must_be_set=False)
self._fileManager.log_print(FileDestinations.SDCARD if self._selectedFile["sd"] else FileDestinations.LOCAL, self._selectedFile["filename"], time.time(), self._comm.getPrintTime(), True, self._printerProfileManager.get_current_or_default()["id"])
self._setProgressData(completion=1.0, filepos=self._selectedFile["filesize"], printTime=self._comm.getPrintTime(), printTimeLeft=0)
self._stateMonitor.set_state({"text": self.get_state_string(), "flags": self._getStateFlags()})
self._fileManager.delete_recovery_data()
def on_comm_print_job_failed(self):
payload = self._payload_for_print_job_event()
eventManager().fire(Events.PRINT_FAILED, payload)
def on_comm_print_job_cancelled(self):
payload = self._payload_for_print_job_event()
if payload:
eventManager().fire(Events.PRINT_CANCELLED, payload)
self.script("afterPrintCancelled",
context=dict(event=payload),
must_be_set=False)
def on_comm_print_job_paused(self):
payload = self._payload_for_print_job_event()
if payload:
eventManager().fire(Events.PRINT_PAUSED, payload)
self.script("afterPrintPaused",
context=dict(event=payload),
must_be_set=False)
def on_comm_print_job_resumed(self):
payload = self._payload_for_print_job_event()
if payload:
eventManager().fire(Events.PRINT_RESUMED, payload)
self.script("beforePrintResumed",
context=dict(event=payload),
must_be_set=False)
def on_comm_file_transfer_started(self, filename, filesize):
self._sdStreaming = True
@ -936,6 +989,39 @@ class Printer(PrinterInterface, comm.MachineComPrintCallback):
except:
self._logger.exception("Error while trying to persist print recovery data")
def _payload_for_print_job_event(self, location=None, print_job_file=None):
if print_job_file is None:
selected_file = self._selectedFile
if not selected_file:
return dict()
print_job_file = selected_file.get("filename", None)
location = FileDestinations.LOCAL if selected_file.get("sd", False) else FileDestinations.SDCARD
if not print_job_file or not location:
return dict()
if location == FileDestinations.SDCARD:
full_path = print_job_file
name = full_path
path = ""
origin = FileDestinations.SDCARD
else:
full_path = self._fileManager.path_on_disk(FileDestinations.LOCAL, print_job_file)
path = self._fileManager.path_in_storage(FileDestinations.LOCAL, print_job_file)
_, name = self._fileManager.split_path(FileDestinations.LOCAL, path)
origin = FileDestinations.LOCAL
return dict(name=name,
path=path,
origin=origin,
# TODO deprecated, remove in 1.4.0
file=full_path,
filename=name)
class StateMonitor(object):
def __init__(self, interval=0.5, on_update=None, on_add_temperature=None, on_add_log=None, on_add_message=None, on_get_progress=None):
self._interval = interval

View file

@ -287,7 +287,12 @@ def uploadGcodeFile(target):
if isinstance(filename, tuple):
filename, sdFilename = filename
eventManager.fire(Events.UPLOAD, {"file": filename, "target": target})
eventManager.fire(Events.UPLOAD, {"name": futureFilename,
"path": filename,
"target": target,
# TODO deprecated, remove in 1.4.0
"file": filename})
files = {}
location = url_for(".readGcodeFile", target=FileDestinations.LOCAL, filename=filename, _external=True)

View file

@ -575,14 +575,7 @@ class MachineCom(object):
self._sdFileList = []
if printing:
payload = None
if self._currentFile is not None:
payload = {
"file": self._currentFile.getFilename(),
"filename": os.path.basename(self._currentFile.getFilename()),
"origin": self._currentFile.getFileLocation()
}
eventManager().fire(Events.PRINT_FAILED, payload)
self._callback.on_comm_print_job_failed()
def setTemperatureOffset(self, offsets):
self._tempOffsets.update(offsets)
@ -676,13 +669,7 @@ class MachineCom(object):
self.resetLineNumbers()
payload = {
"file": self._currentFile.getFilename(),
"filename": os.path.basename(self._currentFile.getFilename()),
"origin": self._currentFile.getFileLocation()
}
eventManager().fire(Events.PRINT_STARTED, payload)
self.sendGcodeScript("beforePrintStarted", replacements=dict(event=payload))
self._callback.on_comm_print_job_started()
if self.isSdFileSelected():
#self.sendCommand("M26 S0") # setting the sd pos apparently sometimes doesn't work, so we re-select
@ -743,11 +730,6 @@ class MachineCom(object):
self.sendCommand("M23 %s" % filename)
else:
self._currentFile = PrintingGcodeFileInformation(filename, offsets_callback=self.getOffsets, current_tool_callback=self.getCurrentTool)
eventManager().fire(Events.FILE_SELECTED, {
"file": self._currentFile.getFilename(),
"filename": os.path.basename(self._currentFile.getFilename()),
"origin": self._currentFile.getFileLocation()
})
self._callback.on_comm_file_selected(filename, self._currentFile.getFilesize(), False)
def unselectFile(self):
@ -755,7 +737,6 @@ class MachineCom(object):
return
self._currentFile = None
eventManager().fire(Events.FILE_DESELECTED)
self._callback.on_comm_file_selected(None, None, False)
def cancelPrint(self, firmware_error=None):
@ -778,16 +759,7 @@ class MachineCom(object):
pass
self._recordFilePosition()
payload = {
"file": self._currentFile.getFilename(),
"filename": os.path.basename(self._currentFile.getFilename()),
"origin": self._currentFile.getFileLocation(),
"firmwareError": firmware_error
}
self.sendGcodeScript("afterPrintCancelled", replacements=dict(event=payload))
eventManager().fire(Events.PRINT_CANCELLED, payload)
self._callback.on_comm_print_job_cancelled()
def setPause(self, pause):
if self.isStreaming():
@ -796,20 +768,13 @@ class MachineCom(object):
if not self._currentFile:
return
payload = {
"file": self._currentFile.getFilename(),
"filename": os.path.basename(self._currentFile.getFilename()),
"origin": self._currentFile.getFileLocation()
}
if not pause and self.isPaused():
if self._pauseWaitStartTime:
self._pauseWaitTimeLost = self._pauseWaitTimeLost + (time.time() - self._pauseWaitStartTime)
self._pauseWaitStartTime = None
self._changeState(self.STATE_PRINTING)
self.sendGcodeScript("beforePrintResumed", replacements=dict(event=payload))
self._callback.on_comm_print_job_resumed()
if self.isSdFileSelected():
self.sendCommand("M24")
@ -822,7 +787,6 @@ class MachineCom(object):
# now make sure we actually do something, up until now we only filled up the queue
self._sendFromQueue()
eventManager().fire(Events.PRINT_RESUMED, payload)
elif pause and self.isPrinting():
if not self._pauseWaitStartTime:
self._pauseWaitStartTime = time.time()
@ -830,9 +794,9 @@ class MachineCom(object):
self._changeState(self.STATE_PAUSED)
if self.isSdFileSelected():
self.sendCommand("M25") # pause print
self.sendGcodeScript("afterPrintPaused", replacements=dict(event=payload))
eventManager().fire(Events.PRINT_PAUSED, payload)
self._callback.on_comm_print_job_paused()
def getSdFiles(self):
return self._sdFiles
@ -1165,10 +1129,6 @@ class MachineCom(object):
elif self._currentFile is not None and self.isSdFileSelected():
# final answer to M23, at least on Marlin, Repetier and Sprinter: "File selected"
self._callback.on_comm_file_selected(self._currentFile.getFilename(), self._currentFile.getFilesize(), True)
eventManager().fire(Events.FILE_SELECTED, {
"file": self._currentFile.getFilename(),
"origin": self._currentFile.getFileLocation()
})
elif 'Writing to file' in line and self.isStreaming():
self._changeState(self.STATE_PRINTING)
elif 'Done printing file' in line and self.isSdPrinting():
@ -1176,12 +1136,6 @@ class MachineCom(object):
self._sdFilePos = 0
self._callback.on_comm_print_job_done()
self._changeState(self.STATE_OPERATIONAL)
eventManager().fire(Events.PRINT_DONE, {
"file": self._currentFile.getFilename(),
"filename": os.path.basename(self._currentFile.getFilename()),
"origin": self._currentFile.getFileLocation(),
"time": self.getPrintTime()
})
if self._sd_status_timer is not None:
try:
self._sd_status_timer.cancel()
@ -1637,17 +1591,8 @@ class MachineCom(object):
eventManager().fire(Events.TRANSFER_DONE, payload)
self.refreshSdFiles()
else:
payload = {
"file": self._currentFile.getFilename(),
"filename": os.path.basename(self._currentFile.getFilename()),
"origin": self._currentFile.getFileLocation(),
"time": self.getPrintTime()
}
self._callback.on_comm_print_job_done()
self._changeState(self.STATE_OPERATIONAL)
eventManager().fire(Events.PRINT_DONE, payload)
self.sendGcodeScript("afterPrintDone", replacements=dict(event=payload))
return line
def _sendNext(self):
@ -2193,9 +2138,24 @@ class MachineComPrintCallback(object):
def on_comm_progress(self):
pass
def on_comm_print_job_started(self):
pass
def on_comm_print_job_failed(self):
pass
def on_comm_print_job_done(self):
pass
def on_comm_print_job_cancelled(self):
pass
def on_comm_print_job_paused(self):
pass
def on_comm_print_job_resumed(self):
pass
def on_comm_z_change(self, newZ):
pass