self.termHistoryIdx = 0\r
\r
self.cam = None\r
- try:\r
+ if webcam.hasWebcamSupport():\r
self.cam = webcam.webcam()\r
- except:\r
- pass\r
\r
#self.SetIcon(icon.getMainIcon())\r
\r
\r
nb.AddPage(self.termPanel, 'Term')\r
\r
- if self.cam != None:\r
+ if self.cam != None and self.cam.hasCamera():\r
self.camPage = wx.Panel(nb)\r
sizer = wx.GridBagSizer(2, 2)\r
self.camPage.SetSizer(sizer)\r
\r
+ self.camPreview = wx.Panel(self.camPage)\r
+ sizer.Add(self.camPreview, pos=(0,0), flag=wx.EXPAND)\r
+ \r
nb.AddPage(self.camPage, 'Camera')\r
- self.camPage.timer = wx.Timer(self)\r
- self.Bind(wx.EVT_TIMER, self.OnCameraTimer, self.camPage.timer)\r
- self.camPage.timer.Start(500)\r
- self.camPage.Bind(wx.EVT_ERASE_BACKGROUND, self.OnCameraEraseBackground)\r
+ self.camPreview.timer = wx.Timer(self)\r
+ self.Bind(wx.EVT_TIMER, self.OnCameraTimer, self.camPreview.timer)\r
+ self.camPreview.timer.Start(500)\r
+ self.camPreview.Bind(wx.EVT_ERASE_BACKGROUND, self.OnCameraEraseBackground)\r
\r
self.sizer.AddGrowableRow(3)\r
self.sizer.AddGrowableCol(3)\r
if self.machineCom != None and not self.machineCom.isPrinting():\r
return\r
self.cam.takeNewImage()\r
- self.camPage.Refresh()\r
+ self.camPreview.Refresh()\r
\r
def OnCameraEraseBackground(self, e):\r
dc = e.GetDC()\r
dc = wx.ClientDC(self)\r
rect = self.GetUpdateRegion().GetBox()\r
dc.SetClippingRect(rect)\r
- dc.SetBackground(wx.Brush(self.camPage.GetBackgroundColour(), wx.SOLID))\r
+ dc.SetBackground(wx.Brush(self.camPreview.GetBackgroundColour(), wx.SOLID))\r
dc.Clear()\r
if self.cam.getLastImage() != None:\r
dc.DrawBitmap(self.cam.getLastImage(), 0, 0)\r
def mcZChange(self, newZ):\r
if self.cam != None:\r
wx.CallAfter(self.cam.takeNewImage)\r
- wx.CallAfter(self.camPage.Refresh)\r
+ wx.CallAfter(self.camPreview.Refresh)\r
\r
class temperatureGraph(wx.Panel):\r
def __init__(self, parent):\r
-import os, glob, subprocess\r
+import os, glob, subprocess, platform\r
import wx\r
\r
try:\r
except:\r
win32vidcap = None\r
\r
+def hasWebcamSupport():\r
+ if cv == None and win32vidcap == None:\r
+ return False\r
+ if not os.path.exists(getFFMPEGpath()):\r
+ return False\r
+ return True\r
+\r
+def getFFMPEGpath():\r
+ if platform.system() == "Windows":\r
+ return os.path.normpath(os.path.join(os.path.split(__file__)[0], "../ffmpeg.exe"))\r
+ elif os.path.exists('/usr/bin/ffmpeg'):\r
+ return '/usr/bin/ffmpeg'\r
+ return os.path.normpath(os.path.join(os.path.split(__file__)[0], "../ffmpeg"))\r
+\r
class webcam(object):\r
def __init__(self):\r
+ self._cam = None\r
if cv != None:\r
self._cam = highgui.cvCreateCameraCapture(-1)\r
elif win32vidcap != None:\r
- self._cam = win32vidcap.new_Dev(0, False)\r
- #self._cam.displaycapturefilterproperties()\r
- #self._cam.displaycapturepinproperties()\r
- else:\r
- raise exception("No camera implementation available")\r
+ try:\r
+ self._cam = win32vidcap.new_Dev(0, False)\r
+ except:\r
+ pass\r
\r
self._doTimelaps = False\r
self._bitmap = None\r
\r
+ def hasCamera(self):\r
+ return self._cam != None\r
+ \r
+ def propertyPages():\r
+ if self._cam == None:\r
+ return []\r
+ if win32vidcap != None:\r
+ return ['capture properties', 'pin properties']\r
+ if cv != None:\r
+ #TODO Make an OpenCV property page\r
+ return []\r
+\r
+ def openPropertyPage(pageType = 0):\r
+ if self._cam == None:\r
+ return\r
+ if win32vidcap != None:\r
+ if pageType == 0:\r
+ self._cam.displaycapturefilterproperties()\r
+ else:\r
+ self._cam.displaycapturepinproperties()\r
+ \r
def takeNewImage(self):\r
+ if self._cam == None:\r
+ return\r
if cv != None:\r
frame = cv.QueryFrame(self._cam)\r
cv.CvtColor(frame, frame, cv.CV_BGR2RGB)\r
return self._bitmap\r
\r
def startTimelaps(self, filename):\r
+ if self._cam == None:\r
+ return\r
self._cleanTempDir()\r
self._timelapsFilename = filename\r
self._snapshotCount = 0\r
\r
def endTimelaps(self):\r
if self._doTimelaps:\r
- if platform.system() == "Windows":\r
- ffmpeg = os.path.normpath(os.path.join(os.path.split(__file__)[0], "../ffmpeg.exe"))\r
- else:\r
- ffmpeg = os.path.normpath(os.path.join(os.path.split(__file__)[0], "../ffmpeg"))\r
+ ffmpeg = getFFMPEGpath()\r
basePath = os.path.normpath(os.path.join(os.path.split(__file__)[0], "../__tmp_snap", "__tmp_snap_%04d.jpg"))\r
subprocess.call([ffmpeg, '-r', '12.5', '-i', basePath, '-vcodec', 'mpeg2video', '-pix_fmt', 'yuv420p', '-r', '25', '-y', '-b:v', '1500k', '-f', 'vob', self._timelapsFilename])\r
self._doTimelaps = False\r