Futher work on timelapse support
parent
35e6b19332
commit
02f2436cd5
|
@ -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
|
||||
----------------------------------------
|
||||
|
||||
|
|
|
@ -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):
|
||||
"""
|
||||
|
|
|
@ -27,7 +27,8 @@ default_settings = {
|
|||
},
|
||||
"webcam": {
|
||||
"stream": None,
|
||||
"snapshot": None
|
||||
"snapshot": None,
|
||||
"ffmpeg": None
|
||||
},
|
||||
"folder": {
|
||||
"uploads": None,
|
||||
|
|
|
@ -0,0 +1,83 @@
|
|||
# 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)
|
Loading…
Reference in New Issue