00001 import shlex 00002 import subprocess 00003 import re 00004 00005 __author__ = 'tom1231' 00006 from PyQt4.QtCore import QUrl 00007 from PyQt4.QtGui import * 00008 from BAL.Interface.DeviceFrame import DeviceFrame, EX_DEV, USBCAM 00009 from lxml.etree import Element, SubElement, XML 00010 00011 00012 class UsbCam(DeviceFrame): 00013 00014 def __init__(self, frame, data): 00015 DeviceFrame.__init__(self, EX_DEV, frame, data) 00016 self._name = 'RiC_CAM' 00017 self._output = 'screen' 00018 self._respawn = 'true' 00019 self._videoDevice = '/dev/video0' 00020 self._frameId = 'Head_Camera' 00021 self._format = 'yuyv' 00022 self._width = '640' 00023 self._height = '480' 00024 00025 def fromDict(self, data): 00026 self._name = data['name'] 00027 self._output = data['output'] 00028 self._respawn = data['respawn'] 00029 self._videoDevice = data['videoDevice'] 00030 self._frameId = data['frameId'] 00031 self._format = data['format'] 00032 self._width = data['width'] 00033 self._height = data['height'] 00034 index = self._videoDevice.find('/dev/') 00035 if index != -1: 00036 self._videoDevice = self._videoDevice[index + 5:] 00037 00038 def toDict(self): 00039 data = dict() 00040 00041 data['type'] = USBCAM 00042 data['name'] = self._name 00043 data['output'] = self._output 00044 data['respawn'] = self._respawn 00045 data['videoDevice'] = self._videoDevice 00046 data['frameId'] = self._frameId 00047 data['format'] = self._format 00048 data['width'] = self._width 00049 data['height'] = self._height 00050 00051 return data 00052 00053 def printDetails(self): 00054 self._frame.layout().addRow(QLabel('name: '), QLabel(self._name)) 00055 self._frame.layout().addRow(QLabel('Output: '), QLabel(self._output)) 00056 self._frame.layout().addRow(QLabel('Respawn: '), QLabel(self._respawn)) 00057 self._frame.layout().addRow(QLabel('Video device: '), QLabel(self._videoDevice)) 00058 self._frame.layout().addRow(QLabel('Frame id: '), QLabel(self._frameId)) 00059 self._frame.layout().addRow(QLabel('Pixel format: '), QLabel(self._format)) 00060 self._frame.layout().addRow(QLabel('Image width: '), QLabel(self._width)) 00061 self._frame.layout().addRow(QLabel('Image height: '), QLabel(self._height)) 00062 00063 def getName(self): 00064 return self._name 00065 00066 def findItem(self): 00067 for i in xrange(self.videoDevice.count()): 00068 if self._videoDevice == str(self.videoDevice.itemText(i)): 00069 return i 00070 return -1 00071 00072 def showDetails(self, items=None): 00073 self.name = QLineEdit(self._name) 00074 self.output = QLineEdit(self._output) 00075 self.respawn = QLineEdit(self._respawn) 00076 self.videoDevice = QComboBox() 00077 self.frameId = QLineEdit(self._frameId) 00078 self.format = QLineEdit(self._format) 00079 self.width = QLineEdit(self._width) 00080 self.height = QLineEdit(self._height) 00081 00082 allDev = subprocess.check_output(shlex.split("ls /dev")) 00083 videoDevs = re.findall('video.*', allDev) 00084 00085 self.videoDevice.addItems(videoDevs) 00086 index = self.findItem() 00087 if index != -1: self.videoDevice.setCurrentIndex(index) 00088 00089 link = QLabel("<a href = http://wiki.ros.org/usb_cam> Usb Camera Wiki </a>") 00090 link.linkActivated.connect(self.onLink) 00091 00092 self._frame.layout().addRow(QLabel('name: '), self.name) 00093 self._frame.layout().addRow(QLabel('Output: '), self.output) 00094 self._frame.layout().addRow(QLabel('Respawn: '), self.respawn) 00095 self._frame.layout().addRow(QLabel('Video device: '), self.videoDevice) 00096 self._frame.layout().addRow(QLabel('Frame id: '), self.frameId) 00097 self._frame.layout().addRow(QLabel('Pixel format: '), self.format) 00098 self._frame.layout().addRow(QLabel('Image width: '), self.width) 00099 self._frame.layout().addRow(QLabel('Image height: '), self.height) 00100 self._frame.layout().addRow(QLabel('More information: '), link) 00101 00102 def onLink(self, URL): 00103 QDesktopServices().openUrl(QUrl(URL)) 00104 00105 def add(self): 00106 old = self._name 00107 self._name = str(self.name.text()) 00108 00109 if not self.nameIsValid(): 00110 error = QErrorMessage() 00111 error.setWindowTitle("Same name error") 00112 error.showMessage("Name already taken.") 00113 error.exec_() 00114 self._name = old 00115 self._isValid = False 00116 return 00117 00118 self._isValid = True 00119 self._name = str(self.name.text()) 00120 self._output = str(self.output.text()) 00121 self._respawn = str(self.respawn.text()) 00122 self._videoDevice = str(self.videoDevice.currentText()) 00123 self._format = str(self.format.text()) 00124 self._frameId = str(self.frameId.text()) 00125 self._width = str(self.width.text()) 00126 self._height = str(self.height.text()) 00127 00128 def saveToFile(self, parent): 00129 nodeAt = { 00130 'pkg': 'usb_cam', 00131 'name': self._name, 00132 'output': self._output, 00133 'respawn': self._respawn, 00134 'type': 'usb_cam_node' 00135 } 00136 element = SubElement(parent, 'node', nodeAt) 00137 SubElement(element, 'param', { 00138 'name': 'video_device', 00139 'value': '/dev/%s' % self._videoDevice 00140 }) 00141 SubElement(element, 'param', { 00142 'name': 'camera_frame_id', 00143 'value': self._frameId 00144 }) 00145 SubElement(element, 'param', { 00146 'name': 'pixel_format', 00147 'value': self._format 00148 }) 00149 SubElement(element, 'param', { 00150 'name': 'image_width', 00151 'value': self._width 00152 }) 00153 SubElement(element, 'param', { 00154 'name': 'image_height', 00155 'value': self._height 00156 })