89 lines
3.6 KiB
Python
89 lines
3.6 KiB
Python
# Author: Lionel Jeanson copyright 2009 - 2021
|
|
# Part of the JMRI distribution
|
|
#
|
|
# Create a Jynstrument with video view from connected webcam
|
|
#
|
|
# Build using https://github.com/sarxos/webcam-capture/tree/master/webcam-capture-drivers/driver-ipcam
|
|
#
|
|
#
|
|
depErr="""Required dependency must be installed!
|
|
|
|
You need to install libraries from sarxos webcam ipcam library. Direct download link:
|
|
http://repo.sarxos.pl/maven2/com/github/sarxos/webcam-capture-driver-ipcam/0.3.12/webcam-capture-driver-ipcam-0.3.12-dist.zip
|
|
|
|
Copy to your JMRI lib folder :
|
|
webcam-capture-driver-ipcam-0.3.12.jar
|
|
bridj-0.7.0.jar (from zip file libs subfolder)
|
|
httpclient-4.5.3.jar (from zip file libs subfolder)
|
|
httpcore-4.4.6.jar (from zip file libs subfolder)
|
|
webcam-capture-0.3.12.jar (from zip file libs subfolder)
|
|
"""
|
|
|
|
|
|
import java
|
|
import java.awt
|
|
import java.awt.event
|
|
import java.beans
|
|
import jmri.jmrit.jython.Jynstrument as Jynstrument
|
|
import java.awt.BorderLayout as BorderLayout
|
|
import java.awt.event.ItemListener as ItemListener
|
|
import javax.swing.JCheckBoxMenuItem as JCheckBoxMenuItem
|
|
import javax.swing.JOptionPane as JOptionPane
|
|
import javax.swing.JTextArea as JTextArea
|
|
import javax.swing.JFrame as JFrame
|
|
try:
|
|
import com.github.sarxos.webcam.Webcam as Webcam
|
|
import com.github.sarxos.webcam.WebcamPanel as WebcamPanel
|
|
import com.github.sarxos.webcam.ds.ipcam.IpCamDeviceRegistry as IpCamDeviceRegistry
|
|
import com.github.sarxos.webcam.ds.ipcam.IpCamDriver as IpCamDriver
|
|
import com.github.sarxos.webcam.ds.ipcam.IpCamMode as IpCamMode
|
|
except:
|
|
JOptionPane.showMessageDialog(JFrame(), JTextArea(depErr), "Missing dependency", JOptionPane.ERROR_MESSAGE);
|
|
|
|
class VideoViewIP(Jynstrument, ItemListener):
|
|
|
|
def getExpectedContextClassName(self):
|
|
# This Jynstrument likes to be in a ThrottleFrame and not anywhere else
|
|
return "jmri.jmrit.throttle.UIImplementation.ThrottleFrame"
|
|
|
|
def init(self):
|
|
Webcam.setDriver( IpCamDriver() )
|
|
self.setLayout( BorderLayout() )
|
|
self.miFill = JCheckBoxMenuItem ( "Fill window" )
|
|
self.miFill.addItemListener(self)
|
|
self.getPopUpMenu().add( self.miFill )
|
|
self.miMirror = JCheckBoxMenuItem ( "Mirror", True )
|
|
self.miMirror.addItemListener(self)
|
|
self.getPopUpMenu().add( self.miMirror )
|
|
# Adjust bellow URL accordingly
|
|
IpCamDeviceRegistry.register("MyTest", "http://root:salambo42@10.0.0.127/x/ch1.mjpg", IpCamMode.PUSH);
|
|
self.addCamPanel()
|
|
|
|
def quit(self): # very important to clean up everything to make sure GC will collect us
|
|
self.webcamPanel.stop()
|
|
IpCamDeviceRegistry.unregisterAll()
|
|
self.webcamPanel = None
|
|
|
|
def addCamPanel(self):
|
|
self.webcamPanel = WebcamPanel(Webcam.getWebcams().get(0))
|
|
self.webcamPanel.setMirrored(self.miMirror.isSelected())
|
|
if ( self.miFill.isSelected() ) :
|
|
self.webcamPanel.setFillArea( True )
|
|
else :
|
|
self.webcamPanel.setFitArea( True )
|
|
self.add(self.webcamPanel, BorderLayout.CENTER)
|
|
|
|
# this is a good way to make sure that we're are actaully GCed
|
|
def __del__(self):
|
|
print "in destructor"
|
|
|
|
def itemStateChanged(self, evt):
|
|
if (evt.getSource() == self.miFill ):
|
|
if (evt.getStateChange() == java.awt.event.ItemEvent.SELECTED ) :
|
|
self.webcamPanel.setFillArea( True )
|
|
else :
|
|
self.webcamPanel.setFitArea( True )
|
|
if (evt.getSource() == self.miMirror ):
|
|
self.webcamPanel.setMirrored(self.miMirror.isSelected())
|
|
|