From 02f2436cd56b1e8f41f76228c1033aaaeb4409bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gina=20H=C3=A4u=C3=9Fge?= Date: Thu, 3 Jan 2013 21:38:46 +0100 Subject: [PATCH] Futher work on timelapse support --- README.md | 6 +++ printer_webui/printer.py | 2 +- printer_webui/settings.py | 3 +- printer_webui/timelapse.py | 83 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 92 insertions(+), 2 deletions(-) create mode 100644 printer_webui/timelapse.py diff --git a/README.md b/README.md index 96a49b79..95df0baa 100644 --- a/README.md +++ b/README.md @@ -69,6 +69,12 @@ The following example config should explain the available options: # use this option to enable timelapse support via snapshot, e.g. via MJPG-Streamer snapshot = http://10.0.0.1:8080/?action=snapshot + [folder] + # absolute path where to store gcode uploads. Defaults to the uploads folder in the Printer WebUI settings dir + uploads = /path/to/upload/folder + # absolute path where to store gcode uploads. Defaults to the timelapse folder in the Printer WebUI settings dir + timelapse = /path/to/timelapse/folder + Setup on a Raspberry Pi running Raspbian ---------------------------------------- diff --git a/printer_webui/printer.py b/printer_webui/printer.py index 4e9fe422..ace1bb24 100644 --- a/printer_webui/printer.py +++ b/printer_webui/printer.py @@ -152,7 +152,7 @@ class Printer(): if oldState == self.comm.STATE_PRINTING: self.timelapse.onPrintjobStopped() elif state == self.comm.STATE_PRINTING: - self.timelapse.onPrintjobStarted() + self.timelapse.onPrintjobStarted(self.filename) def mcMessage(self, message): """ diff --git a/printer_webui/settings.py b/printer_webui/settings.py index abe551c8..6a9fed54 100644 --- a/printer_webui/settings.py +++ b/printer_webui/settings.py @@ -27,7 +27,8 @@ default_settings = { }, "webcam": { "stream": None, - "snapshot": None + "snapshot": None, + "ffmpeg": None }, "folder": { "uploads": None, diff --git a/printer_webui/timelapse.py b/printer_webui/timelapse.py new file mode 100644 index 00000000..f28c4da4 --- /dev/null +++ b/printer_webui/timelapse.py @@ -0,0 +1,83 @@ +# coding=utf-8 +__author__ = "Gina Häußge " +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + +from printer_webui.settings import settings + +import os +import threading +import urllib +import time + +class Timelapse(object): + def __init__(self): + self.imageNumber = None + self.inTimelapse = False + self.gcodeFile = None + + self.captureDir = settings().getBaseFolder("timelapse") + self.snapshotUrl = settings().get("webcam", "snapshot") + + def onPrintjobStarted(self, gcodeFile): + self.startTimelapse(gcodeFile) + + def onPrintjobStopped(self): + self.stopTimelapse() + + def onPrintjobProgress(self, oldPos, newPos, percentage): + pass + + def onZChange(self, oldZ, newZ): + pass + + def startTimelapse(self, gcodeFile): + self.imageNumber = 0 + self.inTimelapse = True + self.gcodeFile = os.path.basename(gcodeFile) + + def stopTimelapse(self): + self.imageNumber = None + self.inTimelapse = False + + def captureImage(self): + if self.captureDir is None: + return + + filename = os.path.join(self.captureDir, "tmp_%i.jpg" % (self.imageNumber)) + self.imageNumber += 1; + + captureThread = threading.Thread(target=self.captureWorker, kwargs={"filename": filename}) + captureThread.start() + + def captureWorker(self, filename): + urllib.urlretrieve(self.snapshotUrl, filename) + +class ZTimelapse(Timelapse): + def __init__(self): + Timelapse.__init__(self) + + def onZChange(self, oldZ, newZ): + self.captureImage() + +class TimedTimelapse(Timelapse): + def __init__(self, interval=1): + Timelapse.__init__(self) + + self.interval = interval + if self.interval < 1: + self.interval = 1 # force minimum interval of 1s + + self.timerThread = None + + def onPrintjobStarted(self): + Timelapse.onPrintjobStarted(self) + if self.timerThread is not None: + return + + self.timerThread = threading.Thread(target=self.timerWorker) + self.timerThread.start() + + def timerWorker(self): + while self.inTimelapse: + self.captureImage() + time.sleep(self.interval)