def _do_connect(self):
     ret = False
     if self.isConnected():
         self.disconnect()
     self.pyradio = None
     self.pyradio_cls = None
     if self.radio_type is None or self.radio_type == "":
         self.last_error = "No radio type defined"
     elif self.radio_type not in CyberRadioDriver.getSupportedRadios():
         self.last_error = "Unsupported radio type: %s" % str(self.radio_type)
     else:
         self.pyradio_cls = CyberRadioDriver.getRadioClass(self.radio_type)
         self.pyradio = CyberRadioDriver.getRadioObject(self.radio_type, \
                                                   verbose=self.verbose, \
                                                   logFile=self.log_file)
         if self.connect_mode == "":
             # No connection -- this mode supports class method queries
             # only.
             pass
         elif not self.isConnectionModeSupported(self.connect_mode):
             self.last_error = "Unsupported connection mode: %s" % \
                               self.connect_mode
         elif self.connect_mode == "tty":
             ret = self.connect(self.connect_mode, self.dev_name, \
                                self.baud_rate, False, False, False)
             if not ret:
                 self.last_error = "Could not connect to %s radio at %s" % \
                                   (self.getName(), self.dev_name)
         elif self.connect_mode in ["tcp", "udp"]:
             ret = self.connect(self.connect_mode, self.host_name, \
                                self.host_port, False, False, False)
             if not ret:
                 self.last_error = "Could not connect to %s radio at %s" % \
                                   (self.getName(), self.host_name)
     return ret
Ejemplo n.º 2
0
    def constructor(self):
        """
        This is called by the framework immediately after your device registers with the system.
        
        In general, you should add customization here and not in the __init__ constructor.  If you have 
        a custom port implementation you can override the specific implementation here with a statement
        similar to the following:
          self.some_port = MyPortImplementation()

        For a tuner device, the structure frontend_tuner_status needs to match the number
        of tuners that this device controls and what kind of device it is.
        The options for devices are: TX, RX, RX_DIGITIZER, CHANNELIZER, DDC, RC_DIGITIZER_CHANNELIZER
     
        For example, if this device has 5 physical
        tuners, each an RX_DIGITIZER, then the code in the construct function should look like this:

        self.setNumChannels(5, "RX_DIGITIZER");
     
        The incoming request for tuning contains a string describing the requested tuner
        type. The string for the request must match the string in the tuner status.
        """
        # TODO add customization here.
        # Redefine the control port
        self.port_DigitalTuner_in = frontend.InDigitalTunerPort("DigitalTuner_in",self)
        
        # get the model number for this device and make sure CRD supports it
        radioClass = crd.getRadioClass(self.model)
        if radioClass is None: 
            raise Exception("Unknown radio model %t. Available radio types: %s"%(self.model,crd.getSupportedRadios()))
        
        # connect to the radio
        self.radio = crd.getRadioObject(self.model)
        self.radio.connect("tcp", self.host_or_dev, self.port_or_baud)
        
        if self.radio.isConnected():
            print self.radio.getVersionInfo()
        else:
            raise Exception("Unable to connect to host : %s:%s"%(self.host_or_dev, self.port_or_baud))
            
        # query the number of DDC, DUC, RX, and TX, along with rates and bandwidths
        self.numRx = self.radio.getNumTuner()
        self.numWbddc = self.radio.getNumWbddc()
        self.ratesWbddc = self.radio.getWbddcRateList()
        self.numNbddc = self.radio.getNumNbddc()
        self.ratesNbddc = self.radio.getNbddcRateList()
        
        self.numTx = self.radio.getNumTransmitters()
        self.numDuc = self.radio.getNumWbduc()    
        self.ratesDuc = self.radio.getWbducRateList()
        
        self.numDdc = self.numWbddc + self.numNbddc
        self.numChannels = self.numWbddc + self.numNbddc + self.numDuc
        
        self.bwfactor = 0.8
        
        # get the frequency range and step
        self.freqRange = self.radio.getTunerFrequencyRange()
        self.freqRes = self.radio.getTunerFrequencyRes()

        self.txfreqRange = self.radio.getTransmitterFrequencyRange()
        self.txfreqRes = self.radio.getTransmitterFrequencyRes()
        
        # set the number of channels         
        self.setNumChannels(self.numChannels,"RX_DIGITIZER")
                
        # set the TX channels
        for i in range(self.numChannels-self.numDuc, self.numChannels):
            self.frontend_tuner_status[i].tuner_type="TX"
        
        # init the frequency
        for i in range(0, self.numChannels):
            self.frontend_tuner_status[i].center_frequency=1000e6        
        
        # set the reference mode
        self.radio.setReferenceMode(self.reference)
        
        # set the cal signal
        self.addPropertyChangeListener('calf', self.setCALF)
        self.radio.setCalibrationFrequency(self.calf)
        
        # command handler
        self.addPropertyChangeListener('cmd', self.setCMD)
        
        # attenuation
        ## TODO: add attenuation control      
        
        # create lists to hold the vita49 objects
        self.SV49=[]
        self.Tx_SV49=[]
        self.Tx_SV49_ports=[]
        self.sris=[]
        
        # get a copy of the full unit configuration
        self.confdict=self.radio.getConfiguration()
        
        # set tuner allocation
        print self.frontend_tuner_allocation
        self.frontend_tuner_allocation.center_frequency=1000e6
        
        # set of SIP/DIP tables
        self.num10gbe = self.radio.getNumGigE()
        self.numDIPEntries = self.radio.getNumGigEDipEntries()
        
        for i in range(0,self.num10gbe):
            # set the source IP as .1 address corresponding to eth address
            if i == 0:                
                ethconf=crd.getInterfaceAddresses(self.tenGbe1)
            else:
                ethconf=crd.getInterfaceAddresses(self.tenGbe2)
            
            # set source IP address to x.x.x.1
            ipparts = ethconf[1].split('.')
            self.confdict[cfgKeys.CONFIG_IP][i+1][cfgKeys.IP_SOURCE]=ipparts[0]+'.'+ipparts[1]+'.'+ipparts[2]+'.1'
            
            # set the destination IP table
            for j in range(0,self.numDIPEntries):
                # set the destinations in sequence
                self.confdict[cfgKeys.CONFIG_IP][i+1][cfgKeys.IP_DEST][j][cfgKeys.GIGE_DEST_PORT]=41000+i*500+j
                self.confdict[cfgKeys.CONFIG_IP][i+1][cfgKeys.IP_DEST][j][cfgKeys.GIGE_SOURCE_PORT]=31000+i*500+j
                self.confdict[cfgKeys.CONFIG_IP][i+1][cfgKeys.IP_DEST][j][cfgKeys.GIGE_MAC_ADDR]=ethconf[0]
                self.confdict[cfgKeys.CONFIG_IP][i+1][cfgKeys.IP_DEST][j][cfgKeys.GIGE_IP_ADDR]=ethconf[1]
        
        # write back the ip configuration
        self.radio.setConfiguration(self.confdict)
Ejemplo n.º 3
0
 def set_radioType(self, radioType):
     self.radioType = radioType
     self.set_radioClass(crd.getRadioClass(self.radioType, ))
Ejemplo n.º 4
0
    def __init__(self,
                 basePort=22200,
                 dataPort=1,
                 hostnameOrDevice='/dev/ndr47x',
                 ifname='eth6',
                 radioType='ndr304',
                 udpPortOrBaudrate=921600,
                 verbose=1,
                 vitaLevel=3,
                 wbfftRate=8,
                 wbfftSize=10,
                 wideband2=0):
        gr.top_block.__init__(self, "NDR Demo GUI (QT)")
        Qt.QWidget.__init__(self)
        self.setWindowTitle("NDR Demo GUI (QT)")
        qtgui.util.check_set_qss()
        try:
            self.setWindowIcon(Qt.QIcon.fromTheme('gnuradio-grc'))
        except:
            pass
        self.top_scroll_layout = Qt.QVBoxLayout()
        self.setLayout(self.top_scroll_layout)
        self.top_scroll = Qt.QScrollArea()
        self.top_scroll.setFrameStyle(Qt.QFrame.NoFrame)
        self.top_scroll_layout.addWidget(self.top_scroll)
        self.top_scroll.setWidgetResizable(True)
        self.top_widget = Qt.QWidget()
        self.top_scroll.setWidget(self.top_widget)
        self.top_layout = Qt.QVBoxLayout(self.top_widget)
        self.top_grid_layout = Qt.QGridLayout()
        self.top_layout.addLayout(self.top_grid_layout)

        self.settings = Qt.QSettings("GNU Radio", "ndr_qt_demo_gui")
        self.restoreGeometry(self.settings.value("geometry").toByteArray())

        ##################################################
        # Parameters
        ##################################################
        self.basePort = basePort
        self.dataPort = dataPort
        self.hostnameOrDevice = hostnameOrDevice
        self.ifname = ifname
        self.radioType = radioType
        self.udpPortOrBaudrate = udpPortOrBaudrate
        self.verbose = verbose
        self.vitaLevel = vitaLevel
        self.wbfftRate = wbfftRate
        self.wbfftSize = wbfftSize
        self.wideband2 = wideband2

        ##################################################
        # Variables
        ##################################################
        self.radioClass = radioClass = crd.getRadioClass(radioType, )
        self.ch2_wb = ch2_wb = bool(
            wideband2) or radioType.strip().lower() in ("ndr304", "ndr472")
        self.ch2_rateSet = ch2_rateSet = radioClass.getWbddcRateSet(
        ) if ch2_wb else radioClass.getNbddcRateSet()
        self.ch1_rateSet = ch1_rateSet = radioClass.getWbddcRateSet()
        self.ch2_rateIndex = ch2_rateIndex = sorted(ch2_rateSet.keys())[0]
        self.ch1_rateIndex = ch1_rateIndex = sorted(ch1_rateSet.keys())[0]
        self.radioRsp = radioRsp = ""
        self.macAndIpList = macAndIpList = crd.getInterfaceAddresses(ifname)
        self.ch2_rfAttenRange = ch2_rfAttenRange = [
            int(i) for i in radioClass.getTunerAttenuationRange()
        ] if ch2_wb else [0, 0]
        self.ch2_fs = ch2_fs = ch2_rateSet[ch2_rateIndex]
        self.ch2_channelList = ch2_channelList = radioClass.getWbddcIndexRange(
        )[1::2] if ch2_wb else radioClass.getNbddcIndexRange()
        self.ch1_updateRate = ch1_updateRate = wbfftRate
        self.ch1_fs = ch1_fs = ch1_rateSet[ch1_rateIndex]
        self.ch1_fftSize = ch1_fftSize = int(2**wbfftSize)
        self.ch1_channelList = ch1_channelList = radioClass.getWbddcIndexRange(
        )[0::2] if ch2_wb else radioClass.getWbddcIndexRange()
        self.udpPortList = udpPortList = [basePort, basePort + 1]
        self.radioRspDisplay = radioRspDisplay = radioRsp
        self.radioCmd = radioCmd = ''
        self.logfile = logfile = os.path.join(
            "/public", "ndrDemoGui", "ndrCmd.%s.log" %
            datetime.datetime.now().strftime("%y%m%d-%H%M%S"))
        self.ipAddress = ipAddress = macAndIpList[1]
        self.fftColSpan = fftColSpan = 6
        self.ch2_updateRate = ch2_updateRate = ch1_updateRate if ch2_wb else 4 * ch1_updateRate
        self.ch2_rfFreqRange = ch2_rfFreqRange = [
            int(i / 1e6) for i in radioClass.getTunerFrequencyRange()
        ] if ch2_wb else [0, 0]
        self.ch2_rfFreq = ch2_rfFreq = int(
            sum(radioClass.getTunerFrequencyRange()) / 2e6) if ch2_wb else 0
        self.ch2_rfAtten = ch2_rfAtten = ch2_rfAttenRange[0]
        self.ch2_index = ch2_index = ch2_channelList[0]
        self.ch2_fsLabel = ch2_fsLabel = "%sHz" % (num_to_str(ch2_fs))
        self.ch2_fftSize = ch2_fftSize = ch1_fftSize if ch2_wb else ch1_fftSize / 2
        self.ch2_ddcFreq = ch2_ddcFreq = 0
        self.ch1_rfFreq = ch1_rfFreq = int(
            sum(radioClass.getTunerFrequencyRange()) / 2e6)
        self.ch1_rfAtten = ch1_rfAtten = int(
            radioClass.getTunerAttenuationRange()[0])
        self.ch1_index = ch1_index = ch1_channelList[0]
        self.ch1_fsLabel = ch1_fsLabel = "%sHz" % (num_to_str(ch1_fs))
        self.ch1_ddcFreq = ch1_ddcFreq = 0

        ##################################################
        # Blocks
        ##################################################
        self._ch2_rfFreq_range = Range(
            int(radioClass.getTunerFrequencyRange()[0] / 1e6) if ch2_wb else 0,
            int(radioClass.getTunerFrequencyRange()[1] / 1e6) if ch2_wb else 0,
            20,
            int(sum(radioClass.getTunerFrequencyRange()) /
                2e6) if ch2_wb else 0, 200)
        self._ch2_rfFreq_win = RangeWidget(self._ch2_rfFreq_range,
                                           self.set_ch2_rfFreq,
                                           'RF Freq (MHz)', "counter_slider",
                                           int)
        self.top_grid_layout.addWidget(self._ch2_rfFreq_win, 2, fftColSpan + 0,
                                       1, fftColSpan / 2)
        self._ch2_rfAtten_range = Range(ch2_rfAttenRange[0],
                                        ch2_rfAttenRange[1], 1,
                                        ch2_rfAttenRange[0], 200)
        self._ch2_rfAtten_win = RangeWidget(self._ch2_rfAtten_range,
                                            self.set_ch2_rfAtten,
                                            'RF Atten (dB)', "counter_slider",
                                            int)
        self.top_grid_layout.addWidget(self._ch2_rfAtten_win, 2,
                                       fftColSpan + fftColSpan / 2, 1,
                                       fftColSpan / 2)
        self._ch2_rateIndex_options = sorted(ch2_rateSet.keys())
        self._ch2_rateIndex_labels = map(str, self._ch2_rateIndex_options)
        self._ch2_rateIndex_tool_bar = Qt.QToolBar(self)
        self._ch2_rateIndex_tool_bar.addWidget(Qt.QLabel('Rate Index' + ": "))
        self._ch2_rateIndex_combo_box = Qt.QComboBox()
        self._ch2_rateIndex_tool_bar.addWidget(self._ch2_rateIndex_combo_box)
        for label in self._ch2_rateIndex_labels:
            self._ch2_rateIndex_combo_box.addItem(label)
        self._ch2_rateIndex_callback = lambda i: Qt.QMetaObject.invokeMethod(
            self._ch2_rateIndex_combo_box, "setCurrentIndex",
            Qt.Q_ARG("int", self._ch2_rateIndex_options.index(i)))
        self._ch2_rateIndex_callback(self.ch2_rateIndex)
        self._ch2_rateIndex_combo_box.currentIndexChanged.connect(
            lambda i: self.set_ch2_rateIndex(self._ch2_rateIndex_options[i]))
        self.top_grid_layout.addWidget(self._ch2_rateIndex_tool_bar, 1,
                                       fftColSpan + 1, 1, 1)
        self._ch2_index_options = ch2_channelList
        self._ch2_index_labels = map(str, self._ch2_index_options)
        self._ch2_index_tool_bar = Qt.QToolBar(self)
        self._ch2_index_tool_bar.addWidget(
            Qt.QLabel("%sDDC" % ("WB" if ch2_wb else "NB") + ": "))
        self._ch2_index_combo_box = Qt.QComboBox()
        self._ch2_index_tool_bar.addWidget(self._ch2_index_combo_box)
        for label in self._ch2_index_labels:
            self._ch2_index_combo_box.addItem(label)
        self._ch2_index_callback = lambda i: Qt.QMetaObject.invokeMethod(
            self._ch2_index_combo_box, "setCurrentIndex",
            Qt.Q_ARG("int", self._ch2_index_options.index(i)))
        self._ch2_index_callback(self.ch2_index)
        self._ch2_index_combo_box.currentIndexChanged.connect(
            lambda i: self.set_ch2_index(self._ch2_index_options[i]))
        self.top_grid_layout.addWidget(self._ch2_index_tool_bar, 1,
                                       fftColSpan + 0, 1, 1)
        self._ch2_ddcFreq_range = Range(
            (radioClass.getWbddcFrequencyRange()
             if ch2_wb else radioClass.getNbddcFrequencyRange())[0] / 1e3,
            (radioClass.getWbddcFrequencyRange() if ch2_wb else
             radioClass.getNbddcFrequencyRange())[1] / 1e3, 10, 0, 200)
        self._ch2_ddcFreq_win = RangeWidget(self._ch2_ddcFreq_range,
                                            self.set_ch2_ddcFreq, 'Freq (kHz)',
                                            "counter_slider", float)
        self.top_grid_layout.addWidget(self._ch2_ddcFreq_win, 1,
                                       fftColSpan + fftColSpan / 2, 1,
                                       fftColSpan / 2)
        self._ch1_rfFreq_range = Range(
            int(radioClass.getTunerFrequencyRange()[0] / 1e6),
            int(radioClass.getTunerFrequencyRange()[1] / 1e6), 20,
            int(sum(radioClass.getTunerFrequencyRange()) / 2e6), 200)
        self._ch1_rfFreq_win = RangeWidget(self._ch1_rfFreq_range,
                                           self.set_ch1_rfFreq,
                                           'RF Freq (MHz)', "counter_slider",
                                           int)
        self.top_grid_layout.addWidget(self._ch1_rfFreq_win, 2, 0, 1,
                                       fftColSpan / 2)
        self._ch1_rfAtten_range = Range(
            int(radioClass.getTunerAttenuationRange()[0]),
            int(radioClass.getTunerAttenuationRange()[1]), 1,
            int(radioClass.getTunerAttenuationRange()[0]), 200)
        self._ch1_rfAtten_win = RangeWidget(self._ch1_rfAtten_range,
                                            self.set_ch1_rfAtten,
                                            'RF Atten (dB)', "counter_slider",
                                            int)
        self.top_grid_layout.addWidget(self._ch1_rfAtten_win, 2,
                                       fftColSpan / 2, 1, fftColSpan / 2)
        self._ch1_rateIndex_options = sorted(ch1_rateSet.keys())
        self._ch1_rateIndex_labels = map(str, self._ch1_rateIndex_options)
        self._ch1_rateIndex_tool_bar = Qt.QToolBar(self)
        self._ch1_rateIndex_tool_bar.addWidget(Qt.QLabel('Rate Index' + ": "))
        self._ch1_rateIndex_combo_box = Qt.QComboBox()
        self._ch1_rateIndex_tool_bar.addWidget(self._ch1_rateIndex_combo_box)
        for label in self._ch1_rateIndex_labels:
            self._ch1_rateIndex_combo_box.addItem(label)
        self._ch1_rateIndex_callback = lambda i: Qt.QMetaObject.invokeMethod(
            self._ch1_rateIndex_combo_box, "setCurrentIndex",
            Qt.Q_ARG("int", self._ch1_rateIndex_options.index(i)))
        self._ch1_rateIndex_callback(self.ch1_rateIndex)
        self._ch1_rateIndex_combo_box.currentIndexChanged.connect(
            lambda i: self.set_ch1_rateIndex(self._ch1_rateIndex_options[i]))
        self.top_grid_layout.addWidget(self._ch1_rateIndex_tool_bar, 1, 1, 1,
                                       1)
        self._ch1_index_options = ch1_channelList
        self._ch1_index_labels = map(str, self._ch1_index_options)
        self._ch1_index_tool_bar = Qt.QToolBar(self)
        self._ch1_index_tool_bar.addWidget(Qt.QLabel('WBDDC' + ": "))
        self._ch1_index_combo_box = Qt.QComboBox()
        self._ch1_index_tool_bar.addWidget(self._ch1_index_combo_box)
        for label in self._ch1_index_labels:
            self._ch1_index_combo_box.addItem(label)
        self._ch1_index_callback = lambda i: Qt.QMetaObject.invokeMethod(
            self._ch1_index_combo_box, "setCurrentIndex",
            Qt.Q_ARG("int", self._ch1_index_options.index(i)))
        self._ch1_index_callback(self.ch1_index)
        self._ch1_index_combo_box.currentIndexChanged.connect(
            lambda i: self.set_ch1_index(self._ch1_index_options[i]))
        self.top_grid_layout.addWidget(self._ch1_index_tool_bar, 1, 0, 1, 1)
        self._ch1_ddcFreq_range = Range(
            radioClass.getWbddcFrequencyRange()[0] / 1e3,
            radioClass.getWbddcFrequencyRange()[1] / 1e3, 10, 0, 200)
        self._ch1_ddcFreq_win = RangeWidget(self._ch1_ddcFreq_range,
                                            self.set_ch1_ddcFreq, 'Freq (kHz)',
                                            "counter_slider", float)
        self.top_grid_layout.addWidget(self._ch1_ddcFreq_win, 1,
                                       fftColSpan / 2, 1, fftColSpan / 2)
        self.ndrDemoControlBlock = CyberRadio.NDR_demo_control(
            radio_type=str(radioType),
            radio_hostname=str(hostnameOrDevice),
            radio_port=int(udpPortOrBaudrate),
            tuner1_index=ch1_index,
            tuner1_freq=float(1e6 * ch1_rfFreq),
            tuner1_atten=ch1_rfAtten,
            tuner2_index=ch2_index if ch2_wb else -1,
            tuner2_freq=float(1e6 * ch2_rfFreq),
            tuner2_atten=ch2_rfAtten,
            ddc1_index=ch1_index,
            ddc1_wideband=True,
            ddc1_enable=True,
            ddc1_vita49_level=vitaLevel,
            ddc1_rate_index=ch1_rateIndex,
            ddc1_freq=ch1_ddcFreq * 1e3,
            ddc1_udp_port=udpPortList[0],
            ddc1_rf_source=-1,
            ddc1_data_port=dataPort,
            ddc2_index=ch2_index,
            ddc2_wideband=ch2_wb,
            ddc2_enable=True,
            ddc2_vita49_level=vitaLevel,
            ddc2_rate_index=ch2_rateIndex,
            ddc2_freq=1e3 * ch2_ddcFreq,
            ddc2_udp_port=udpPortList[1],
            ddc2_rf_source=-1 if ch2_wb else ch1_index,
            ddc2_data_port=dataPort,
            cal_freq=0.0,
            interface_dict={dataPort: str(ifname)},
            verbose=bool(verbose),
            other_args={})
        self.ch2_tabs = Qt.QTabWidget()
        self.ch2_tabs_widget_0 = Qt.QWidget()
        self.ch2_tabs_layout_0 = Qt.QBoxLayout(Qt.QBoxLayout.TopToBottom,
                                               self.ch2_tabs_widget_0)
        self.ch2_tabs_grid_layout_0 = Qt.QGridLayout()
        self.ch2_tabs_layout_0.addLayout(self.ch2_tabs_grid_layout_0)
        self.ch2_tabs.addTab(self.ch2_tabs_widget_0, 'Spectrum')
        self.ch2_tabs_widget_1 = Qt.QWidget()
        self.ch2_tabs_layout_1 = Qt.QBoxLayout(Qt.QBoxLayout.TopToBottom,
                                               self.ch2_tabs_widget_1)
        self.ch2_tabs_grid_layout_1 = Qt.QGridLayout()
        self.ch2_tabs_layout_1.addLayout(self.ch2_tabs_grid_layout_1)
        self.ch2_tabs.addTab(self.ch2_tabs_widget_1, 'Time')
        self.top_grid_layout.addWidget(self.ch2_tabs, 0, fftColSpan, 1,
                                       fftColSpan)
        self.ch1_tabs = Qt.QTabWidget()
        self.ch1_tabs_widget_0 = Qt.QWidget()
        self.ch1_tabs_layout_0 = Qt.QBoxLayout(Qt.QBoxLayout.TopToBottom,
                                               self.ch1_tabs_widget_0)
        self.ch1_tabs_grid_layout_0 = Qt.QGridLayout()
        self.ch1_tabs_layout_0.addLayout(self.ch1_tabs_grid_layout_0)
        self.ch1_tabs.addTab(self.ch1_tabs_widget_0, 'Spectrum')
        self.ch1_tabs_widget_1 = Qt.QWidget()
        self.ch1_tabs_layout_1 = Qt.QBoxLayout(Qt.QBoxLayout.TopToBottom,
                                               self.ch1_tabs_widget_1)
        self.ch1_tabs_grid_layout_1 = Qt.QGridLayout()
        self.ch1_tabs_layout_1.addLayout(self.ch1_tabs_grid_layout_1)
        self.ch1_tabs.addTab(self.ch1_tabs_widget_1, 'Waterfall')
        self.top_grid_layout.addWidget(self.ch1_tabs, 0, 0, 1, fftColSpan)
        self._radioRspDisplay_tool_bar = Qt.QToolBar(self)
        self._radioRspDisplay_tool_bar.addWidget(
            Qt.QLabel('Command Response' + ": "))
        self._radioRspDisplay_line_edit = Qt.QLineEdit(
            str(self.radioRspDisplay))
        self._radioRspDisplay_tool_bar.addWidget(
            self._radioRspDisplay_line_edit)
        self._radioRspDisplay_line_edit.returnPressed.connect(
            lambda: self.set_radioRspDisplay(
                str(str(self._radioRspDisplay_line_edit.text().toAscii()))))
        self.top_grid_layout.addWidget(self._radioRspDisplay_tool_bar, 3, 2, 1,
                                       2 * fftColSpan - 2)

        def _radioRsp_probe():
            while True:
                val = self.ndrDemoControlBlock.get_radio_rsp()
                try:
                    self.set_radioRsp(val)
                except AttributeError:
                    pass
                time.sleep(1.0 / (10))

        _radioRsp_thread = threading.Thread(target=_radioRsp_probe)
        _radioRsp_thread.daemon = True
        _radioRsp_thread.start()

        self._radioCmd_tool_bar = Qt.QToolBar(self)
        self._radioCmd_tool_bar.addWidget(Qt.QLabel('Manual Command' + ": "))
        self._radioCmd_line_edit = Qt.QLineEdit(str(self.radioCmd))
        self._radioCmd_tool_bar.addWidget(self._radioCmd_line_edit)
        self._radioCmd_line_edit.returnPressed.connect(
            lambda: self.set_radioCmd(
                str(str(self._radioCmd_line_edit.text().toAscii()))))
        self.top_grid_layout.addWidget(self._radioCmd_tool_bar, 3, 0, 1, 2)
        self.qtgui_waterfall_sink_x_0 = qtgui.waterfall_sink_c(
            ch1_fftSize,  #size
            firdes.WIN_BLACKMAN_hARRIS,  #wintype
            ch1_rfFreq * 1e6 + ch1_ddcFreq * 1e3,  #fc
            ch1_fs,  #bw
            'Ch 1 (Wideband)',  #name
            1  #number of inputs
        )
        self.qtgui_waterfall_sink_x_0.set_update_time(1.0 / ch1_updateRate)
        self.qtgui_waterfall_sink_x_0.enable_grid(True)
        self.qtgui_waterfall_sink_x_0.enable_axis_labels(True)

        if not True:
            self.qtgui_waterfall_sink_x_0.disable_legend()

        if "complex" == "float" or "complex" == "msg_float":
            self.qtgui_waterfall_sink_x_0.set_plot_pos_half(not True)

        labels = ['', '', '', '', '', '', '', '', '', '']
        colors = [5, 0, 0, 0, 0, 0, 0, 0, 0, 0]
        alphas = [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]
        for i in xrange(1):
            if len(labels[i]) == 0:
                self.qtgui_waterfall_sink_x_0.set_line_label(
                    i, "Data {0}".format(i))
            else:
                self.qtgui_waterfall_sink_x_0.set_line_label(i, labels[i])
            self.qtgui_waterfall_sink_x_0.set_color_map(i, colors[i])
            self.qtgui_waterfall_sink_x_0.set_line_alpha(i, alphas[i])

        self.qtgui_waterfall_sink_x_0.set_intensity_range(-120, 0)

        self._qtgui_waterfall_sink_x_0_win = sip.wrapinstance(
            self.qtgui_waterfall_sink_x_0.pyqwidget(), Qt.QWidget)
        self.ch1_tabs_layout_1.addWidget(self._qtgui_waterfall_sink_x_0_win)
        self.qtgui_time_sink_x_0 = qtgui.time_sink_c(
            1024,  #size
            ch2_fs,  #samp_rate
            "",  #name
            1  #number of inputs
        )
        self.qtgui_time_sink_x_0.set_update_time(0.10)
        self.qtgui_time_sink_x_0.set_y_axis(-1, 1)

        self.qtgui_time_sink_x_0.set_y_label('Amplitude', "")

        self.qtgui_time_sink_x_0.enable_tags(-1, True)
        self.qtgui_time_sink_x_0.set_trigger_mode(qtgui.TRIG_MODE_FREE,
                                                  qtgui.TRIG_SLOPE_POS, 0.0, 0,
                                                  0, "")
        self.qtgui_time_sink_x_0.enable_autoscale(True)
        self.qtgui_time_sink_x_0.enable_grid(True)
        self.qtgui_time_sink_x_0.enable_axis_labels(True)
        self.qtgui_time_sink_x_0.enable_control_panel(False)

        if not False:
            self.qtgui_time_sink_x_0.disable_legend()

        labels = ['', '', '', '', '', '', '', '', '', '']
        widths = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
        colors = [
            "blue", "red", "green", "black", "cyan", "magenta", "yellow",
            "dark red", "dark green", "blue"
        ]
        styles = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
        markers = [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1]
        alphas = [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]

        for i in xrange(2):
            if len(labels[i]) == 0:
                if (i % 2 == 0):
                    self.qtgui_time_sink_x_0.set_line_label(
                        i, "Re{{Data {0}}}".format(i / 2))
                else:
                    self.qtgui_time_sink_x_0.set_line_label(
                        i, "Im{{Data {0}}}".format(i / 2))
            else:
                self.qtgui_time_sink_x_0.set_line_label(i, labels[i])
            self.qtgui_time_sink_x_0.set_line_width(i, widths[i])
            self.qtgui_time_sink_x_0.set_line_color(i, colors[i])
            self.qtgui_time_sink_x_0.set_line_style(i, styles[i])
            self.qtgui_time_sink_x_0.set_line_marker(i, markers[i])
            self.qtgui_time_sink_x_0.set_line_alpha(i, alphas[i])

        self._qtgui_time_sink_x_0_win = sip.wrapinstance(
            self.qtgui_time_sink_x_0.pyqwidget(), Qt.QWidget)
        self.ch2_tabs_layout_1.addWidget(self._qtgui_time_sink_x_0_win)
        self._ch2_fsLabel_tool_bar = Qt.QToolBar(self)

        if None:
            self._ch2_fsLabel_formatter = None
        else:
            self._ch2_fsLabel_formatter = lambda x: x

        self._ch2_fsLabel_tool_bar.addWidget(Qt.QLabel('fs' + ": "))
        self._ch2_fsLabel_label = Qt.QLabel(
            str(self._ch2_fsLabel_formatter(self.ch2_fsLabel)))
        self._ch2_fsLabel_tool_bar.addWidget(self._ch2_fsLabel_label)
        self.top_grid_layout.addWidget(self._ch2_fsLabel_tool_bar, 1,
                                       fftColSpan + 2, 1, 1)

        self.ch2_fftDisplay = qtgui.freq_sink_c(
            ch2_fftSize,  #size
            firdes.WIN_BLACKMAN_hARRIS,  #wintype
            (ch2_rfFreq if ch2_wb else ch1_rfFreq) * 1e6 +
            ch2_ddcFreq * 1e3,  #fc
            ch2_fs,  #bw
            "Channel 2 (%sband)" % ("Wide" if ch2_wb else "Narrow"),  #name
            1  #number of inputs
        )
        self.ch2_fftDisplay.set_update_time(1.0 / ch2_updateRate)
        self.ch2_fftDisplay.set_y_axis(-120, 0)
        self.ch2_fftDisplay.set_y_label('Relative Gain', 'dB')
        self.ch2_fftDisplay.set_trigger_mode(qtgui.TRIG_MODE_FREE, 0.0, 0, "")
        self.ch2_fftDisplay.enable_autoscale(False)
        self.ch2_fftDisplay.enable_grid(True)
        self.ch2_fftDisplay.set_fft_average(0.2)
        self.ch2_fftDisplay.enable_axis_labels(True)
        self.ch2_fftDisplay.enable_control_panel(False)

        if not False:
            self.ch2_fftDisplay.disable_legend()

        if "complex" == "float" or "complex" == "msg_float":
            self.ch2_fftDisplay.set_plot_pos_half(not True)

        labels = ['', '', '', '', '', '', '', '', '', '']
        widths = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
        colors = [
            "red", "red", "green", "black", "cyan", "magenta", "yellow",
            "dark red", "dark green", "dark blue"
        ]
        alphas = [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]
        for i in xrange(1):
            if len(labels[i]) == 0:
                self.ch2_fftDisplay.set_line_label(i, "Data {0}".format(i))
            else:
                self.ch2_fftDisplay.set_line_label(i, labels[i])
            self.ch2_fftDisplay.set_line_width(i, widths[i])
            self.ch2_fftDisplay.set_line_color(i, colors[i])
            self.ch2_fftDisplay.set_line_alpha(i, alphas[i])

        self._ch2_fftDisplay_win = sip.wrapinstance(
            self.ch2_fftDisplay.pyqwidget(), Qt.QWidget)
        self.ch2_tabs_layout_0.addWidget(self._ch2_fftDisplay_win)
        self._ch1_fsLabel_tool_bar = Qt.QToolBar(self)

        if None:
            self._ch1_fsLabel_formatter = None
        else:
            self._ch1_fsLabel_formatter = lambda x: x

        self._ch1_fsLabel_tool_bar.addWidget(Qt.QLabel('fs' + ": "))
        self._ch1_fsLabel_label = Qt.QLabel(
            str(self._ch1_fsLabel_formatter(self.ch1_fsLabel)))
        self._ch1_fsLabel_tool_bar.addWidget(self._ch1_fsLabel_label)
        self.top_grid_layout.addWidget(self._ch1_fsLabel_tool_bar, 1, 2, 1, 1)

        self.ch1_fftDisplay = qtgui.freq_sink_c(
            ch1_fftSize,  #size
            firdes.WIN_BLACKMAN_hARRIS,  #wintype
            ch1_rfFreq * 1e6 + ch1_ddcFreq * 1e3,  #fc
            ch1_fs,  #bw
            'Channel 1 (Wideband)',  #name
            1  #number of inputs
        )
        self.ch1_fftDisplay.set_update_time(1.0 / ch1_updateRate)
        self.ch1_fftDisplay.set_y_axis(-120, 0)
        self.ch1_fftDisplay.set_y_label('Relative Gain', 'dB')
        self.ch1_fftDisplay.set_trigger_mode(qtgui.TRIG_MODE_FREE, 0.0, 0, "")
        self.ch1_fftDisplay.enable_autoscale(False)
        self.ch1_fftDisplay.enable_grid(True)
        self.ch1_fftDisplay.set_fft_average(0.2)
        self.ch1_fftDisplay.enable_axis_labels(True)
        self.ch1_fftDisplay.enable_control_panel(False)

        if not False:
            self.ch1_fftDisplay.disable_legend()

        if "complex" == "float" or "complex" == "msg_float":
            self.ch1_fftDisplay.set_plot_pos_half(not True)

        labels = ['', '', '', '', '', '', '', '', '', '']
        widths = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
        colors = [
            "red", "red", "green", "black", "cyan", "magenta", "yellow",
            "dark red", "dark green", "dark blue"
        ]
        alphas = [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]
        for i in xrange(1):
            if len(labels[i]) == 0:
                self.ch1_fftDisplay.set_line_label(i, "Data {0}".format(i))
            else:
                self.ch1_fftDisplay.set_line_label(i, labels[i])
            self.ch1_fftDisplay.set_line_width(i, widths[i])
            self.ch1_fftDisplay.set_line_color(i, colors[i])
            self.ch1_fftDisplay.set_line_alpha(i, alphas[i])

        self._ch1_fftDisplay_win = sip.wrapinstance(
            self.ch1_fftDisplay.pyqwidget(), Qt.QWidget)
        self.ch1_tabs_layout_0.addWidget(self._ch1_fftDisplay_win)
        self.blocks_file_sink_0 = blocks.file_sink(gr.sizeof_char * 1, logfile,
                                                   False)
        self.blocks_file_sink_0.set_unbuffered(False)
        self.blocks_file_descriptor_sink_0 = blocks.file_descriptor_sink(
            gr.sizeof_char * 1, 1)
        self.CyberRadio_vita_udp_rx_0_0 = CyberRadio.vita_udp_rx(
            macAndIpList[1], udpPortList[1], radioClass.getVitaHeaderSize(),
            radioClass.getVitaPayloadSize() / 4,
            radioClass.getVitaHeaderSize() +
            radioClass.getVitaPayloadSize() + radioClass.getVitaTailSize(),
            radioClass.isByteswapped(), False, False, False)
        self.CyberRadio_vita_udp_rx_0 = CyberRadio.vita_udp_rx(
            macAndIpList[1], udpPortList[0], radioClass.getVitaHeaderSize(),
            radioClass.getVitaPayloadSize() / 4,
            radioClass.getVitaHeaderSize() +
            radioClass.getVitaPayloadSize() + radioClass.getVitaTailSize(),
            radioClass.isByteswapped(), False, False, False)

        ##################################################
        # Connections
        ##################################################
        self.connect((self.CyberRadio_vita_udp_rx_0, 0),
                     (self.ch1_fftDisplay, 0))
        self.connect((self.CyberRadio_vita_udp_rx_0, 0),
                     (self.qtgui_waterfall_sink_x_0, 0))
        self.connect((self.CyberRadio_vita_udp_rx_0_0, 0),
                     (self.ch2_fftDisplay, 0))
        self.connect((self.CyberRadio_vita_udp_rx_0_0, 0),
                     (self.qtgui_time_sink_x_0, 0))
        self.connect((self.ndrDemoControlBlock, 0),
                     (self.blocks_file_descriptor_sink_0, 0))
        self.connect((self.ndrDemoControlBlock, 0),
                     (self.blocks_file_sink_0, 0))