class MainWindow(QtGui.QMainWindow): """ The main window and menus """ def __init__(self, dut_address=None, playback_filename=None): super(MainWindow, self).__init__() screen = QtGui.QDesktopWidget().screenGeometry() WINDOW_WIDTH = max(screen.width() * 0.7, MINIMUM_WIDTH) WINDOW_HEIGHT = max(screen.height() * 0.6, MINIMUM_HEIGHT) self.resize(WINDOW_WIDTH, WINDOW_HEIGHT) self.controller = SpecAController() self.init_menu_bar() self.initUI(dut_address, playback_filename) def initUI(self, dut_address, playback_filename): self.mainPanel = MainPanel(self.controller, self) self.setWindowTitle("PyRF RTSA") self.setCentralWidget(self.mainPanel) if dut_address: self.open_device(dut_address, True) elif playback_filename: self.start_playback(playback_filename) else: self.open_device_dialog() def init_menu_bar(self): open_action = QtGui.QAction("&Open Device", self) open_action.triggered.connect(self.open_device_dialog) play_action = QtGui.QAction("&Playback Recording", self) play_action.triggered.connect(self.open_playback_dialog) self.record_action = QtGui.QAction("Start &Recording", self) self.record_action.triggered.connect(self.start_recording) self.record_action.setDisabled(True) self.stop_action = QtGui.QAction("&Stop Recording", self) self.stop_action.triggered.connect(self.stop_recording) self.stop_action.setDisabled(True) exit_action = QtGui.QAction("&Exit", self) exit_action.setShortcut("Ctrl+Q") exit_action.triggered.connect(self.close) menubar = self.menuBar() file_menu = menubar.addMenu("&File") file_menu.addAction(open_action) file_menu.addAction(play_action) file_menu.addSeparator() file_menu.addAction(self.record_action) file_menu.addAction(self.stop_action) file_menu.addSeparator() file_menu.addAction(exit_action) def checkbox_action(apply_fn, text, option, default): action = QtGui.QAction(text, self) action.setCheckable(True) if default: action.toggle() action.triggered.connect(lambda: apply_fn(**{option: action.isChecked()})) return action self.view_menu = menubar.addMenu("&View") for text, option, default in VIEW_OPTIONS: self.view_menu.addAction(checkbox_action(self.controller.apply_options, text, option, default)) self.dsp_menu = menubar.addMenu("&DSP Options") for text, option, default in DSP_OPTIONS: self.dsp_menu.addAction(checkbox_action(self.controller.apply_options, text, option, default)) self.developer_menu = menubar.addMenu("D&eveloper Options") for text, option, default in DEVELOPER_OPTIONS: self.developer_menu.addAction(checkbox_action(self.controller.apply_options, text, option, default)) self.controller.apply_options( **dict((option, default) for text, option, default in VIEW_OPTIONS + DSP_OPTIONS + DEVELOPER_OPTIONS) ) def start_recording(self): self.stop_action.setDisabled(False) self.controller.start_recording() def stop_recording(self): self.stop_action.setDisabled(True) self.controller.stop_recording() def open_device_dialog(self): self.discovery_widget = DiscoveryWidget(open_device_callback=self.open_device, name="Open Device") self.discovery_widget.show() def open_playback_dialog(self): self.controller.set_device(None) playback_filename, file_type = QtGui.QFileDialog.getOpenFileName( self, "Play Recording", None, "VRT Packet Capture Files (*.vrt)" ) if playback_filename: self.start_playback(playback_filename) def start_playback(self, playback_filename): self.record_action.setDisabled(True) self.stop_action.setDisabled(True) self.controller.set_device(playback_filename=playback_filename) self.show() @inlineCallbacks def open_device(self, name, ok): if not ok: self.show() return self.show() dut = WSA(connector=TwistedConnector(self._get_reactor())) yield dut.connect(name) self.setWindowTitle("PyRF RTSA Connected To: %s" % name) if hasattr(dut.properties, "MINIMUM_FW_VERSION") and parse_version(dut.fw_version) < parse_version( dut.properties.MINIMUM_FW_VERSION ): too_old = QtGui.QMessageBox() too_old.setText( "Your device firmware version is {0}" " but this application is expecting at least version" " {1}. Some features may not work properly".format(dut.fw_version, dut.properties.MINIMUM_FW_VERSION) ) too_old.exec_() self.controller.set_device(dut) self.record_action.setDisabled(False) self.stop_action.setDisabled(True) def closeEvent(self, event): event.accept() self.controller.stop_recording() self.controller.set_device() self._get_reactor().stop() def _get_reactor(self): # late import because installReactor is being used from twisted.internet import reactor return reactor
def main(): app = QtGui.QApplication(sys.argv) ex = DiscoveryWidget() ex.show() sys.exit(app.exec_())
class MainWindow(QtGui.QMainWindow): """ The main window and menus """ def __init__(self, dut_address=None, playback_filename=None, developer_menu=False): super(MainWindow, self).__init__() screen = QtGui.QDesktopWidget().screenGeometry() WINDOW_WIDTH = max(screen.width() * 0.7, MINIMUM_WIDTH) WINDOW_HEIGHT = max(screen.height() * 0.6, MINIMUM_HEIGHT) self.resize(WINDOW_WIDTH, WINDOW_HEIGHT) self.controller = SpecAController(developer_menu) self.controller.device_change.connect(self.device_changed) self.init_menu_bar(developer_menu) self.initUI(dut_address, playback_filename) def initUI(self, dut_address, playback_filename): self.mainPanel = MainPanel(self.controller, self) self.setWindowTitle('PyRF RTSA: ' + __version__) self.setCentralWidget(self.mainPanel) if dut_address: self.open_device(dut_address, True) elif playback_filename: self.start_playback(playback_filename) else: self.open_device_dialog() def init_menu_bar(self, developer_menu=False): open_action = QtGui.QAction('&Open Device', self) open_action.triggered.connect(self.open_device_dialog) play_action = QtGui.QAction('&Playback Recording', self) play_action.triggered.connect(self.open_playback_dialog) self.record_action = QtGui.QAction('Start &Recording', self) self.record_action.triggered.connect(self.start_recording) self.record_action.setDisabled(True) self.stop_action = QtGui.QAction('&Stop Recording', self) self.stop_action.triggered.connect(self.stop_recording) self.stop_action.setDisabled(True) self.start_csv_export = QtGui.QAction('&Start Exporting CSV', self) self.start_csv_export.triggered.connect(self.start_csv) self.stop_csv_export = QtGui.QAction('&Stop Exporting CSV', self) self.stop_csv_export.triggered.connect(self.stop_csv) self.stop_csv_export.setDisabled(True) self.device_info = QtGui.QAction('Device &Information', self) self.device_info.triggered.connect(self.get_device_information) self.device_info.setDisabled(True) exit_action = QtGui.QAction('&Exit', self) exit_action.setShortcut('Ctrl+Q') exit_action.triggered.connect(self.close) menubar = self.menuBar() file_menu = menubar.addMenu('&File') file_menu.addAction(open_action) file_menu.addAction(play_action) file_menu.addSeparator() file_menu.addAction(self.record_action) file_menu.addAction(self.stop_action) file_menu.addAction(self.start_csv_export) file_menu.addAction(self.stop_csv_export) file_menu.addSeparator() file_menu.addAction(self.device_info) file_menu.addSeparator() file_menu.addAction(exit_action) def checkbox_action(apply_fn, text, option, default): action = QtGui.QAction(text, self) action.setCheckable(True) if default: action.toggle() action.triggered.connect( lambda: apply_fn(**{option: action.isChecked()})) return action self.view_menu = menubar.addMenu('&View') for text, option, default in VIEW_OPTIONS: self.view_menu.addAction( checkbox_action(self.controller.apply_options, text, option, default)) self.view_menu.addSeparator() if developer_menu: self.developer_menu = menubar.addMenu('D&eveloper Options') for text, option, default in DEVELOPER_OPTIONS: self.developer_menu.addAction( checkbox_action(self.controller.apply_options, text, option, default)) self.controller.apply_options(**dict( (option, default) for text, option, default in VIEW_OPTIONS + DEVELOPER_OPTIONS)) def start_recording(self): self.stop_action.setDisabled(False) filename = time.strftime('recording-%Y-%m-%d-%H%M%S') names = glob.glob(filename + '*.vrt') if (filename + '.vrt') in names: count = names.count(filename) filename += '(%d)' % count filename += '.vrt' record_filename, file_type = QtGui.QFileDialog.getSaveFileName( self, "Create Recording", filename, "VRT Packet Capture Files (*.vrt)", ) if record_filename: self.controller.start_recording(record_filename) def stop_recording(self): self.stop_action.setDisabled(True) self.controller.stop_recording() def open_device_dialog(self): self.discovery_widget = DiscoveryWidget( open_device_callback=self.open_device, name="Open Device") self.discovery_widget.show() def open_playback_dialog(self): self.controller.set_device(None) playback_filename, file_type = QtGui.QFileDialog.getOpenFileName( self, "Play Recording", None, "VRT Packet Capture Files (*.vrt)") if playback_filename: self.start_playback(playback_filename) def start_csv(self): filename = time.strftime('csv-%Y-%m-%d-%H%M%S') names = glob.glob(filename + '*.csv') if (filename + '.csv') in names: count = names.count(filename) filename += '(%d)' % count filename += '.csv' playback_filename, file_type = QtGui.QFileDialog.getSaveFileName( self, "CSV File", filename, "CSV File (*.csv)") if playback_filename: self.controller.start_csv_export(playback_filename) self.start_csv_export.setDisabled(True) self.stop_csv_export.setDisabled(False) def stop_csv(self): self.start_csv_export.setDisabled(False) self.stop_csv_export.setDisabled(True) self.controller.stop_csv_export() def start_playback(self, playback_filename): self.record_action.setDisabled(True) self.stop_action.setDisabled(True) self.device_info.setDisabled(False) self._device_address = playback_filename self.controller.set_device(playback_filename=playback_filename) self.setWindowTitle('PyRF RTSA: ' + __version__ + ' Playback Recording: ' + playback_filename) self.show() def device_changed(self, dut): if not dut: self._device_address = None self._device_id = None self._device_id = dut.device_id def get_device_information(self): info = QtGui.QMessageBox() device_parts = self._device_id.split(',') + ['', '', ''] hardware, serial, firmware = device_parts[1:4] info.setText(''' Connected to: %s Serial number: %s Hardware version: %s Firmware version: %s'''.strip() % ( self._device_address, serial, hardware, firmware, )) info.exec_() @inlineCallbacks def open_device(self, name, ok): if not ok: self.show() return self.show() dut = WSA(connector=TwistedConnector(self._get_reactor())) yield dut.connect(name) self._device_address = name self.setWindowTitle('PyRF RTSA %s Connected To: %s' % (__version__, name)) if hasattr(dut.properties, 'MINIMUM_FW_VERSION') and parse_version( dut.fw_version) < parse_version( dut.properties.MINIMUM_FW_VERSION): too_old = QtGui.QMessageBox() too_old.setText( 'Your device firmware version is {0}' ' but this application is expecting at least version' ' {1}. Some features may not work properly'.format( dut.fw_version, dut.properties.MINIMUM_FW_VERSION)) too_old.exec_() self.controller.set_device(dut) self.record_action.setDisabled(False) self.stop_action.setDisabled(True) self.device_info.setDisabled(False) def closeEvent(self, event): event.accept() self.controller.stop_recording() self.controller.set_device() self._get_reactor().stop() def _get_reactor(self): # late import because installReactor is being used from twisted.internet import reactor return reactor
class MainWindow(QtGui.QMainWindow): """ The main window and menus """ def __init__(self, dut_address=None, playback_filename=None, developer_menu=False): super(MainWindow, self).__init__() screen = QtGui.QDesktopWidget().screenGeometry() WINDOW_WIDTH = max(screen.width() * 0.7, MINIMUM_WIDTH) WINDOW_HEIGHT = max(screen.height() * 0.6, MINIMUM_HEIGHT) self.resize(WINDOW_WIDTH,WINDOW_HEIGHT) self.controller = SpecAController(developer_menu) self.controller.device_change.connect(self.device_changed) self.init_menu_bar(developer_menu) self.initUI(dut_address, playback_filename) def initUI(self, dut_address, playback_filename): self.mainPanel = MainPanel(self.controller, self) self.setWindowTitle('PyRF RTSA: ' + __version__) self.setCentralWidget(self.mainPanel) if dut_address: self.open_device(dut_address, True) elif playback_filename: self.start_playback(playback_filename) else: self.open_device_dialog() def init_menu_bar(self, developer_menu=False): open_action = QtGui.QAction('&Open Device', self) open_action.triggered.connect(self.open_device_dialog) play_action = QtGui.QAction('&Playback Recording', self) play_action.triggered.connect(self.open_playback_dialog) self.record_action = QtGui.QAction('Start &Recording', self) self.record_action.triggered.connect(self.start_recording) self.record_action.setDisabled(True) self.stop_action = QtGui.QAction('&Stop Recording', self) self.stop_action.triggered.connect(self.stop_recording) self.stop_action.setDisabled(True) self.start_csv_export = QtGui.QAction('&Start Exporting CSV', self) self.start_csv_export.triggered.connect(self.start_csv) self.stop_csv_export = QtGui.QAction('&Stop Exporting CSV', self) self.stop_csv_export.triggered.connect(self.stop_csv) self.stop_csv_export.setDisabled(True) self.device_info = QtGui.QAction('Device &Information', self) self.device_info.triggered.connect(self.get_device_information) self.device_info.setDisabled(True) exit_action = QtGui.QAction('&Exit', self) exit_action.setShortcut('Ctrl+Q') exit_action.triggered.connect(self.close) menubar = self.menuBar() file_menu = menubar.addMenu('&File') file_menu.addAction(open_action) file_menu.addAction(play_action) file_menu.addSeparator() file_menu.addAction(self.record_action) file_menu.addAction(self.stop_action) file_menu.addAction(self.start_csv_export) file_menu.addAction(self.stop_csv_export) file_menu.addSeparator() file_menu.addAction(self.device_info) file_menu.addSeparator() file_menu.addAction(exit_action) def checkbox_action(apply_fn, text, option, default): action = QtGui.QAction(text, self) action.setCheckable(True) if default: action.toggle() action.triggered.connect(lambda: apply_fn(**{option: action.isChecked()})) return action self.view_menu = menubar.addMenu('&View') for text, option, default in VIEW_OPTIONS: self.view_menu.addAction(checkbox_action( self.controller.apply_options, text, option, default)) self.view_menu.addSeparator() if developer_menu: self.developer_menu = menubar.addMenu('D&eveloper Options') for text, option, default in DEVELOPER_OPTIONS: self.developer_menu.addAction(checkbox_action( self.controller.apply_options, text, option, default)) self.controller.apply_options( **dict((option, default) for text, option, default in VIEW_OPTIONS + DEVELOPER_OPTIONS)) def start_recording(self): self.stop_action.setDisabled(False) filename = time.strftime('recording-%Y-%m-%d-%H%M%S') names = glob.glob(filename + '*.vrt') if (filename + '.vrt') in names: count = names.count(filename) filename += '(%d)' % count filename += '.vrt' record_filename, file_type = QtGui.QFileDialog.getSaveFileName(self, "Create Recording", filename, "VRT Packet Capture Files (*.vrt)", ) if record_filename: self.controller.start_recording(record_filename) def stop_recording(self): self.stop_action.setDisabled(True) self.controller.stop_recording() def open_device_dialog(self): self.discovery_widget = DiscoveryWidget( open_device_callback=self.open_device, name="Open Device") self.discovery_widget.show() def open_playback_dialog(self): self.controller.set_device(None) playback_filename, file_type = QtGui.QFileDialog.getOpenFileName(self, "Play Recording", None, "VRT Packet Capture Files (*.vrt)") if playback_filename: self.start_playback(playback_filename) def start_csv(self): filename = time.strftime('csv-%Y-%m-%d-%H%M%S') names = glob.glob(filename + '*.csv') if (filename + '.csv') in names: count = names.count(filename) filename += '(%d)' % count filename += '.csv' playback_filename, file_type = QtGui.QFileDialog.getSaveFileName(self, "CSV File", filename, "CSV File (*.csv)") if playback_filename: self.controller.start_csv_export(playback_filename) self.start_csv_export.setDisabled(True) self.stop_csv_export.setDisabled(False) def stop_csv(self): self.start_csv_export.setDisabled(False) self.stop_csv_export.setDisabled(True) self.controller.stop_csv_export() def start_playback(self, playback_filename): self.record_action.setDisabled(True) self.stop_action.setDisabled(True) self.device_info.setDisabled(False) self._device_address = playback_filename self.controller.set_device(playback_filename=playback_filename) self.setWindowTitle('PyRF RTSA: ' + __version__ +' Playback Recording: ' + playback_filename) self.show() def device_changed(self, dut): if not dut: self._device_address = None self._device_id = None self._device_id = dut.device_id def get_device_information(self): info = QtGui.QMessageBox() device_parts = self._device_id.split(',') + ['', '', ''] hardware, serial, firmware = device_parts[1:4] info.setText(''' Connected to: %s Serial number: %s Hardware version: %s Firmware version: %s'''.strip() % ( self._device_address, serial, hardware, firmware, )) info.exec_() @inlineCallbacks def open_device(self, name, ok): if not ok: self.show() return self.show() dut = WSA(connector=TwistedConnector(self._get_reactor())) yield dut.connect(name) self._device_address = name self.setWindowTitle('PyRF RTSA %s Connected To: %s' % (__version__ , name)) if hasattr(dut.properties, 'MINIMUM_FW_VERSION') and parse_version( dut.fw_version) < parse_version(dut.properties.MINIMUM_FW_VERSION): too_old = QtGui.QMessageBox() too_old.setText('Your device firmware version is {0}' ' but this application is expecting at least version' ' {1}. Some features may not work properly'.format( dut.fw_version, dut.properties.MINIMUM_FW_VERSION)) too_old.exec_() self.controller.set_device(dut) self.record_action.setDisabled(False) self.stop_action.setDisabled(True) self.device_info.setDisabled(False) def closeEvent(self, event): event.accept() self.controller.stop_recording() self.controller.set_device() self._get_reactor().stop() def _get_reactor(self): # late import because installReactor is being used from twisted.internet import reactor return reactor