OctoPrint/printer_webui/timelapse.py

84 lines
1.9 KiB
Python
Raw Normal View History

2013-01-03 20:38:46 +00:00
# coding=utf-8
__author__ = "Gina Häußge <osd@foosel.net>"
__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)