示例#1
0
    def _create_dac_gain_helper(self, vbox, i_or_q):

        d = {"1/1": 0xC0, "1/2": 0x40, "1/11": 0x00}

        def doit(kv):
            dac_gain = kv['dac_gain']
            coarse_s = kv['coarse']
            print "dac_gain[%d] = %4d" % (i_or_q, dac_gain)
            print "coarse = ", coarse_s
            return self._set_dac_fine_gain(i_or_q, dac_gain, d[coarse_s])

        myform = form.form()
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        vbox.Add(hbox, 0, wx.EXPAND)
        myform['coarse'] = form.radiobox_field(
            parent=self.panel,
            sizer=hbox,
            callback=myform.check_input_and_call(doit),
            choices=['1/11', '1/2', '1/1'],
            weight=1,
            value='1/1')
        myform['dac_gain'] = form.slider_field(
            parent=self.panel,
            sizer=hbox,
            callback=myform.check_input_and_call(doit),
            min=-32,
            max=31,
            value=0,
            weight=4)
示例#2
0
    def _create_dac_offset_helper(self, vbox, i_or_q):

        def doit(kv):
            drive_positive = kv['drive_positive']
            dac_offset = kv['dac_offset']
            print "drive_positive =", drive_positive
            print "dac_offset[%d] = %4d" % (i_or_q, dac_offset)
            
            # FIXME signed magnitude??
            # dac_offset = signed_mag10(dac_offset)
            return self._set_dac_offset(i_or_q, dac_offset, int(drive_positive))
        
        def signed_mag10(x):
            # not clear from doc if this is really 2's comp or 10-bit signed magnitude
            # we'll guess it's 10-bit signed mag
            if x < 0:
                return (1 << 9) | min(511, max(0, abs(x)))
            else:
                return (0 << 9) | min(511, max(0, abs(x)))

        myform = form.form()
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        vbox.Add(hbox, 0, wx.EXPAND)
        myform['drive_positive'] = form.checkbox_field(parent=self.panel, sizer=hbox,
                                                       callback=myform.check_input_and_call(doit),
                                                       weight=0,
                                                       label="drive +ve")
        myform['dac_offset'] = form.slider_field(parent=self.panel, sizer=hbox,
                                                 callback=myform.check_input_and_call(doit),
                                                 min=-512, max=511, value=0,
                                                 weight=5)
示例#3
0
文件: am_fft.py 项目: yanyub/gr-baz
    def _build_gui(self, vbox):

        def _form_set_freq(kv):
            return self.set_freq(kv['freq'])
            
        vbox.Add(self.scope.win, 1, wx.EXPAND)	# Proportion used to be 10
        
        # add control area at the bottom
        self.myform = myform = form.form()
        hbox = wx.BoxSizer(wx.HORIZONTAL)	# Create row sizer

        hbox.Add((5,0), 0, 0)

        myform['freq'] = form.float_field(
            parent=self.panel, sizer=hbox, label="Center freq", weight=1,
            callback=myform.check_input_and_call(_form_set_freq, self._set_status_msg))

        myform['antenna'] = form.radiobox_field(parent=self.panel, sizer=hbox, label="Antenna",
            value=None, callback=self.set_antenna_callback,
            choices=["TX/RX", "RX2", "RXA", "RXB", "RXAB"],major_dimension=5, weight=3)

        hbox.Add((5,0), 0, 0)

        g = self.subdev.gain_range()
        myform['gain'] = form.slider_field(parent=self.panel, sizer=hbox, label="Gain",
                                           weight=6, # 3
                                           min=int(g[0]), max=int(g[1]),
                                           callback=self.set_gain)

        hbox.Add((5,0), 0, 0)

        vbox.Add(hbox, 0, wx.EXPAND)

        self._build_subpanel(vbox)
    def _build_gui(self, vbox):
        def _form_set_freq(kv):
            return self.set_freq(kv['freq'])

        def _form_set_freq2(kv):
            return self.set_freq2(kv['freq2'])

        vbox.Add(self.scope2.win, 10, wx.EXPAND)

        # add control area at the bottom
        self.myform = myform = form.form()
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        hbox.Add((5, 0), 0, 0)
        myform['gain'] = form.slider_field(parent=self.panel,
                                           sizer=hbox,
                                           label="Gain",
                                           weight=3,
                                           min=1,
                                           max=150,
                                           callback=self.set_gain)

        hbox.Add((5, 0), 0, 0)
        vbox.Add(hbox, 0, wx.EXPAND)

        self._build_subpanel(vbox)
示例#5
0
文件: mrfm_fft.py 项目: Bobakka/uhd
    def _build_gui(self, vbox):
        def _form_set_freq(kv):
            return self.set_freq(kv["freq"])

        vbox.Add(self.scope1.win, 10, wx.EXPAND)
        vbox.Add(self.scope2.win, 10, wx.EXPAND)

        # add control area at the bottom
        self.myform = myform = form.form()
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        hbox.Add((5, 0), 0, 0)
        myform["freq"] = form.float_field(
            parent=self.panel,
            sizer=hbox,
            label="Center freq",
            weight=1,
            callback=myform.check_input_and_call(_form_set_freq, self._set_status_msg),
        )

        hbox.Add((5, 0), 0, 0)
        g = self.subdev.gain_range()
        myform["gain"] = form.slider_field(
            parent=self.panel, sizer=hbox, label="Gain", weight=3, min=int(g[0]), max=int(g[1]), callback=self.set_gain
        )

        hbox.Add((5, 0), 0, 0)
        vbox.Add(hbox, 0, wx.EXPAND)

        self._build_subpanel(vbox)
示例#6
0
    def _build_gui(self, vbox):

        def _form_set_freq(kv):
            return self.set_freq(kv['freq'])
            
        vbox.Add(self.scope.win, 10, wx.EXPAND)
        
        # add control area at the bottom
        self.myform = myform = form.form()
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        hbox.Add((5,0), 0, 0)
        myform['freq'] = form.float_field(
            parent=self.panel, sizer=hbox, label="Center freq", weight=1,
            callback=myform.check_input_and_call(_form_set_freq, self._set_status_msg))

        hbox.Add((5,0), 0, 0)
        g = self.u.get_gain_range()

	# some configurations don't have gain control
	if g.stop() > g.start():
    	    myform['gain'] = form.slider_field(parent=self.panel, sizer=hbox, label="Gain",
                                               weight=3,
                                               min=int(g.start()), max=int(g.stop()),
                                               callback=self.set_gain)

        hbox.Add((5,0), 0, 0)
        vbox.Add(hbox, 0, wx.EXPAND)

        self._build_subpanel(vbox)
    def _build_subpanel4(self, vbox_arg):

        panel = self.panel
        vbox = vbox_arg
        myform = self.myform

        hbox = wx.BoxSizer(wx.HORIZONTAL)


        hbox.Add((5,0), 0, 0)#Add space between the previous and next box, horizontally

        # Create a bar or slider horizontally, it is labeled "LO frequency" and it moves in the interval [20M,30M] Hz,once it is moved it calls back to the function set_lo_freq 
        myform['lofreq'] = form.slider_field(parent=self.panel,
                                               sizer=hbox, label="LO frequency (Hz)",
                                               weight=3,
                                               min=20000000, max=30000000,
                                               callback=self.set_lo_freq)
        hbox.Add((10,0), 0)

	#Create a checkbox to produce LO signal (the signal will go out when the box is ticked)
        myform['LO'] = form.checkbox_field(parent=panel,        label="LO generator", sizer=hbox, callback=self.begin_thread2)
       
        

        vbox.AddSpacer(5)

        vbox.Add(hbox, 0, wx.EXPAND)
        vbox.AddSpacer(5)
示例#8
0
    def _build_gui(self, vbox):
        def _form_set_freq(kv):
            return self.set_freq(kv['freq'])

        vbox.Add(self.scope.win, 10, wx.EXPAND)

        # add control area at the bottom
        self.myform = myform = form.form()
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        hbox.Add((5, 0), 0, 0)
        myform['freq'] = form.float_field(parent=self.panel,
                                          sizer=hbox,
                                          label="Center freq",
                                          weight=1,
                                          callback=myform.check_input_and_call(
                                              _form_set_freq,
                                              self._set_status_msg))

        hbox.Add((5, 0), 0, 0)
        g = self.subdev.gain_range()
        myform['gain'] = form.slider_field(parent=self.panel,
                                           sizer=hbox,
                                           label="Gain",
                                           weight=3,
                                           min=int(g[0]),
                                           max=int(g[1]),
                                           callback=self.set_gain)

        hbox.Add((5, 0), 0, 0)
        vbox.Add(hbox, 0, wx.EXPAND)

        self._build_subpanel(vbox)
示例#9
0
	def _build_gui(self, vbox):

		if self.scopes.count("I"):
			vbox.Add(self.input_fft_scope.win, 5, wx.EXPAND)

		if self.scopes.count("F"):
			vbox.Add(self.filter_fft_scope.win, 5, wx.EXPAND)

		if self.scopes.count("d"):
			vbox.Add(self.demod_scope.win, 5, wx.EXPAND)

		if self.scopes.count("c"):
			vbox.Add(self.clocked_scope.win, 5, wx.EXPAND)
 
		if self.scopes.count("b"):
			vbox.Add(self.burst_scope.win, 5, wx.EXPAND)
		
		# add control area at the bottom
		if self.using_usrp:

			def _form_set_freq(kv):
				return self.set_freq(kv['freq'])

			self.usrpform = usrpform = form.form()
			hbox = wx.BoxSizer(wx.HORIZONTAL)

			hbox.Add((5,0), 0, 0)
			g = self.subdev.gain_range()
			usrpform['gain'] = form.slider_field(parent=self.panel, sizer=hbox, label="Gain",
											   weight=3,
											   min=int(g[0]), max=int(g[1]),
											   callback=self.set_gain)

			hbox.Add((5,0), 0, 0)
			usrpform['chan'] = form.slider_field(	parent=self.panel, sizer=hbox, label="Channel",
												weight=3,
												min=0, max=1023,
												value=self.channel,
												callback=self.set_channel)

			vbox.Add(hbox, 0, wx.EXPAND)
示例#10
0
 def _build_gui(self, vbox):
     vbox.Add(self.scope.win, 10, wx.EXPAND)
     vbox.Add(self.scope2.win, 10, wx.EXPAND)
     
     # add control area at the bottom
     self.myform = myform = form.form()
     hbox = wx.BoxSizer(wx.HORIZONTAL)
     hbox.Add((5,0), 0, 0)
     g = [0,1000]   # Faux gain range
     myform['gain'] = form.slider_field(parent=self.panel, sizer=hbox, label="Gain",
                                        weight=3,
                                        min=int(g[0]), max=int(g[1]),
                                        callback=self.gui_set_gain)
     self.myform['gain'].set_value(int(self.options.gain * 10.0))
示例#11
0
    def _build_gui(self, vbox):
        vbox.Add(self.scope.win, 10, wx.EXPAND)
        vbox.Add(self.scope2.win, 10, wx.EXPAND)

        # add control area at the bottom
        self.myform = myform = form.form()
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        hbox.Add((5, 0), 0, 0)
        g = [0, 1000]  # Faux gain range
        myform['gain'] = form.slider_field(parent=self.panel,
                                           sizer=hbox,
                                           label="Gain",
                                           weight=3,
                                           min=int(g[0]),
                                           max=int(g[1]),
                                           callback=self.gui_set_gain)
        self.myform['gain'].set_value(int(self.options.gain * 10.0))
示例#12
0
    def _build_gui(self, vbox):

        def _form_set_freq(kv):
            return self.set_freq(kv['freq'])

        def _form_set_freq2(kv):
            return self.set_freq2(kv['freq2'])            
        vbox.Add(self.scope2.win, 10, wx.EXPAND)
        
        # add control area at the bottom
        self.myform = myform = form.form()
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        hbox.Add((5,0), 0, 0)
        myform['gain'] = form.slider_field(parent=self.panel, sizer=hbox, label="Gain",
                                           weight=3,
                                           min=1, max=150,
                                           callback=self.set_gain)

        hbox.Add((5,0), 0, 0)
        vbox.Add(hbox, 0, wx.EXPAND)

        self._build_subpanel(vbox)
示例#13
0
    def _create_dac_offset_helper(self, vbox, i_or_q):
        def doit(kv):
            drive_positive = kv['drive_positive']
            dac_offset = kv['dac_offset']
            print "drive_positive =", drive_positive
            print "dac_offset[%d] = %4d" % (i_or_q, dac_offset)

            # FIXME signed magnitude??
            # dac_offset = signed_mag10(dac_offset)
            return self._set_dac_offset(i_or_q, dac_offset,
                                        int(drive_positive))

        def signed_mag10(x):
            # not clear from doc if this is really 2's comp or 10-bit signed magnitude
            # we'll guess it's 10-bit signed mag
            if x < 0:
                return (1 << 9) | min(511, max(0, abs(x)))
            else:
                return (0 << 9) | min(511, max(0, abs(x)))

        myform = form.form()
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        vbox.Add(hbox, 0, wx.EXPAND)
        myform['drive_positive'] = form.checkbox_field(
            parent=self.panel,
            sizer=hbox,
            callback=myform.check_input_and_call(doit),
            weight=0,
            label="drive +ve")
        myform['dac_offset'] = form.slider_field(
            parent=self.panel,
            sizer=hbox,
            callback=myform.check_input_and_call(doit),
            min=-512,
            max=511,
            value=0,
            weight=5)
示例#14
0
    def _create_dac_gain_helper(self, vbox, i_or_q):

        d = { "1/1"  : 0xC0,
              "1/2"  : 0x40,
              "1/11" : 0x00 }

        def doit(kv):
            dac_gain = kv['dac_gain']
            coarse_s = kv['coarse']
            print "dac_gain[%d] = %4d" % (i_or_q, dac_gain)
            print "coarse = ", coarse_s
            return self._set_dac_fine_gain(i_or_q, dac_gain, d[coarse_s])
        
        myform = form.form()
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        vbox.Add(hbox, 0, wx.EXPAND)
        myform['coarse'] = form.radiobox_field(parent=self.panel, sizer=hbox,
                                               callback=myform.check_input_and_call(doit),
                                               choices=['1/11', '1/2', '1/1'],
                                               weight=1, value='1/1')
        myform['dac_gain'] = form.slider_field(parent=self.panel, sizer=hbox,
                                               callback=myform.check_input_and_call(doit),
                                               min=-32, max=31, value=0,
                                               weight=4)
示例#15
0
    def make_control(self):
        bspace = 10
        PyHydra.control.make_control(self)

        self.AddLocalMacAddress()
        
        """ Create MCS choicebox_field """
        box = wx.BoxSizer(wx.HORIZONTAL)
        self.make_label("MCS", box, 35)
        self.mcsfield = PyHydra.choicebox_field(self, box, \
                        value="Auto", callback = self.SetMCS, \
                        choices = MimoControl.MCS_CHOICES)
        self.mcsfield.f.SetToolTipString("Select Modulation and Coding Scheme")
        self.AddParam('rate', self.SetMCS)
        self.AddParam('mcs', self.SetMCS)
        if self.options.rate<0: self.SetParam('mcs', "Auto")
        else: self.SetParam('mcs', self.options.rate)
        self.cbox.Add (box, 0, wx.ALIGN_LEFT|wx.ALL, border = bspace)

        ## Create divider
        divider = PyHydra.Divider(self)
        divider.SetBackgroundColour(wx.Colour(200,200,200) )
        self.cbox.AddSpacer((10,10))
        self.cbox.Add(divider, 0, wx.EXPAND|wx.GROW)
        self.cbox.AddSpacer((10,10))
        
        """ Packet Detector Threshold """
        box = wx.BoxSizer(wx.VERTICAL)
        self.pd_threshold = form.slider_field(self, box,  \
                "Packet Detector Threshold (%)", value=self.options.pd_threshold,
                callback=self.SetPacketDetectorThreshold, min=20, max=100)
        self.AddParam('pd_threshold', self.SetPacketDetectorThreshold)
        self.SetParam('pd_threshold', self.options.pd_threshold)
        self.cbox.Add(box, 0, wx.ALIGN_LEFT|wx.ALL, border=bspace)

        """ Enable Beamforming """
        box = wx.BoxSizer(wx.HORIZONTAL)
        self.make_label("Enable Beamforming: ", box, 20)
        self.enable_beamforming = form.radiobox_field(self, box, label="", \
                value = MimoControl.ENABLE_CHOICES[self.options.enable_beamforming], \
                callback=self.SetEnableBeamforming,     \
                choices = MimoControl.ENABLE_CHOICES, major_dimension=0)
        #box.Hide(1, recursive=True), box.Remove(1) # Remove default form label
        self.enable_beamforming.f.SetLabel("")
        self.AddParam('enable_beamforming', self.SetEnableBeamforming)
        self.SetParam('enable_beamforming', self.options.enable_beamforming)
        self.cbox.Add(box, 0, wx.ALIGN_LEFT|wx.ALL, border=bspace)

        """ MAC Monitor Address """
        vbox = wx.BoxSizer(wx.VERTICAL)
        self.monitor = MimoControl.BROADCAST_ADDR
        f = form.static_text_field(self, vbox, value="Monitoring MAC Address: ")
        vbox.AddSpacer((10,10) )
        box = wx.BoxSizer(wx.HORIZONTAL)
        self.fmonitor = form.text_field(self, box, \
                value="FF:"*(mimo.mac_monitor.MAC_ADDR_SIZE-1)+"FF", \
                callback=self.SetMonitor, weight=1)
        self.AddParam('mac_monitor', self.SetMonitor)
        box.AddSpacer((10,10) )
        self.enable_monitor = form.checkbox_field(self, box, "monitor?", \
                value=False, callback=self.SetEnableMonitor, \
                weight=0)
        box.AddSpacer((100,10) )
        vbox.Add(box, 0, wx.EXPAND)
        self.cbox.Add(vbox, 1, wx.EXPAND|wx.ALIGN_LEFT|wx.ALL, border=bspace)
        self.Fit()
示例#16
0
    def _build_gui(self, vbox):

        def _form_set_freq(kv):
            return self.set_freq(kv['freq'])
            
        vbox.Add(self.scope.win, 10, wx.EXPAND)
        
        # add control area at the bottom
        self.myform = myform = form.form()
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        hbox.Add((5,0), 0, 0)
        myform['freq'] = form.float_field(
            parent=self.panel, sizer=hbox, label="Center freq", weight=1,
            callback=myform.check_input_and_call(_form_set_freq,
                                                 self._set_status_msg))

        hbox.Add((5,0), 0, 0)
        g = self.u.get_gain_range()

        # some configurations don't have gain control
        if g.stop() <= g.start():
            glow = 0.0
            ghigh = 1.0
            
        else:
            glow = g.start()
            ghigh = g.stop()
            
        myform['gain'] = form.slider_field(parent=self.panel,
                                               sizer=hbox, label="Gain",
                                               weight=3,
                                               min=int(glow), max=int(ghigh),
                                               callback=self.set_gain)

        try:
            mboard_id = self.u.get_usrp_info().get("mboard_id").split(" ")[0]
            mboard_serial = self.u.get_usrp_info().get("mboard_serial")
            if mboard_serial == "":
                mboard_serial = "no serial"
            dboard_id = self.u.get_usrp_info().get("rx_id").split(" ")[0].split(",")[0]
            dboard_serial = self.u.get_usrp_info().get("rx_serial")
            if dboard_serial == "":
                dboard_serial = "no serial"
            subdev = self.u.get_subdev_spec()
            antenna = self.u.get_antenna()

            usrp_config_val = "%s (%s), %s (%s, %s, %s)" % (mboard_id, mboard_serial, dboard_id, dboard_serial, subdev, antenna)
        except:
            usrp_config_val = "Not implemented in this version."

        uhd_box = forms.static_box_sizer(parent=self.panel,
                                         label="UHD (%s)" % (uhd.get_version_string()),
                                         orient=wx.HORIZONTAL)
        usrp_config_form = forms.static_text(
            parent=self.panel,
            sizer=uhd_box,
            value=usrp_config_val,
            label="USRP",
            converter=forms.str_converter(),
        )
        vbox.Add(uhd_box, 0, wx.EXPAND)
        vbox.AddSpacer(5)

        hbox.Add((5,0), 0, 0)
        vbox.Add(hbox, 0, wx.EXPAND)

        self._build_subpanel(vbox)
示例#17
0
    def _generate_panel(self):
        # Rx LNA Selection
        self.rx_lna_chooser = forms.drop_down(
            parent=self.GetWin(),
            value=umtrx_lms.lms_get_rx_lna(self.lms),
            callback=self.set_rx_lna,
            label="Rx LNA",
            choices=[0, 1, 2, 3],
            labels=["Disabled","LNA1","LNA2", "LNA3"],
#            style=wx.RA_HORIZONTAL,
            )
        self.GridAdd(self.rx_lna_chooser, 0, 0, 1, 1)

        # Rx LNA Mode
        self.rx_lna_gain_mode_chooser = forms.drop_down(
            parent=self.GetWin(),
            value=umtrx_lms.lms_get_rx_lna_gain(self.lms),
            callback=self.set_rx_lna_gain_mode,
            label="Rx LNA Mode",
            choices=[3, 2, 1],
            labels=["3: Norm","3: -6dB","1: Bypass"],
#            style=wx.RA_HORIZONTAL,
            )
        self.GridAdd(self.rx_lna_gain_mode_chooser, 0, 1, 1, 1)

        # Rx LPF bandwidth
        self.rx_lna_gain_mode_chooser = forms.drop_down(
            parent=self.GetWin(),
            value=umtrx_lms.lms_get_rx_lpf_raw(self.lms),
            callback=self.set_rx_lpf,
            label="Rx LNA LPF",
            choices=[15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0],
            labels=[0.75, 0.875, 1.25, 1.375, 1.5, 1.92, 2.5, 2.75, 3, 3.5, 4.375, 5, 6, 7, 10, 14],
#            style=wx.RA_HORIZONTAL,
            )
        self.GridAdd(self.rx_lna_gain_mode_chooser, 0, 2, 1, 1)
        
        # Rx VGA1 gain
        self.rx_vga1gain = umtrx_lms.lms_get_rx_vga1gain_int(self.lms)
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        self.rx_vga1gain_slider = form.slider_field(
            parent=self.GetWin(), sizer=hbox,
            value=self.rx_vga1gain,
            callback=self.set_rx_vga1gain,
            label="Rx VGA1 gain (raw)\n120=30dB, 102=19dB, 2=5dB",
            min=0, max=127,
            )
        self.GridAdd(hbox, 1, 0, 1, 4)
        
        # Rx VGA2 gain
        self.rx_vga2gain = umtrx_lms.lms_get_rx_vga2gain(self.lms)
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        self.rx_vga2gain_slider = form.slider_field(
            parent=self.GetWin(), sizer=hbox,
            value=self.rx_vga2gain,
            callback=self.set_rx_vga2gain,
            label="\nRx VGA2 gain (dB)",
            min=0, max=30,# Not recommended to use above 30
            )
        self.GridAdd(hbox, 1, 4, 1, 4)
        
        # Tx VGA1 DC I offset
        self.tx_vga1dc_i_int = umtrx_lms.lms_get_vga1dc_i_int(self.lms)
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        self.tx_vga1dc_i_int_slider = form.slider_field(
            parent=self.GetWin(), sizer=hbox,
            value=self.tx_vga1dc_i_int,
            callback=self.set_tx_vga1dc_i_int,
            label="\nTx VGA1 DC I offset (raw)",
            min=0, max=255,
            )
        self.GridAdd(hbox, 3, 0, 1, 4)
        
        # Tx VGA1 DC Q offset
        self.tx_vga1dc_q_int = umtrx_lms.lms_get_vga1dc_q_int(self.lms)
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        self.tx_vga1dc_q_int_slider = form.slider_field(
            parent=self.GetWin(), sizer=hbox,
            value=self.tx_vga1dc_q_int,
            callback=self.set_tx_vga1dc_q_int,
            label="\nTx VGA1 DC Q offset (raw)",
            min=0, max=255,
            )
        self.GridAdd(hbox, 3, 4, 1, 4)

        # Tx VGA1 gain
        self.tx_vga1gain = umtrx_lms.lms_get_tx_vga1gain(self.lms)
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        self.tx_vga1gain_slider = form.slider_field(
            parent=self.GetWin(), sizer=hbox,
            value=self.tx_vga1gain,
            callback=self.set_tx_vga1gain,
            label="\nTx VGA1 gain (dB)",
            min=-35, max=-4,
            )
        self.GridAdd(hbox, 4, 0, 1, 4)

        # Tx VGA2 gain
        self.tx_vga2gain = umtrx_lms.lms_get_tx_vga2gain(self.lms)
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        self.tx_vga2gain_slider = form.slider_field(
            parent=self.GetWin(), sizer=hbox,
            value=self.tx_vga2gain,
            callback=self.set_tx_vga2gain,
            label="\nTx VGA2 gain (dB)",
            min=0, max=25,
            )
        self.GridAdd(hbox, 4, 4, 1, 4)
    def __init__(self, frame, panel, vbox, argv, panel_info):
        stdgui2.std_top_block.__init__(self, frame, panel, vbox, argv)

        signal_type = default_signal_type # not yet an option

        # command line options
        parser = OptionParser(option_class=eng_option)
        parser.add_option("-r", "--sample-rate",type="eng_float",
                          default=default_rate,
                          help="set flow graph sample rate [default=%s]" % default_rate)
        parser.add_option ("-f", "--freq", type="eng_float",
                           default=default_freq,
                           help="set signal frequency [default=%s]" % default_freq)
        parser.add_option ("-a", "--amplitude", type="eng_float",
                           default=default_ampl,
                           help="set signal amplitude [default %s]" % default_ampl)
        parser.add_option ("--gaussian", dest="noise_type",
                           action="store_const", const=gr.GR_GAUSSIAN,
                           help="generate Gaussian noise (-x is variance)",
                           default=default_noise_type)
        parser.add_option ("--uniform", dest="noise_type",
                           action="store_const", const=gr.GR_UNIFORM,
                           help="generate Uniform noise (-x is peak-to-peak)")
        parser.add_option ("-x", "--noise_amplitude", type="eng_float",
                           default=default_noise_ampl,
                           help="set noise amplitude (variance or p-p) [default %s]" % default_noise_ampl)
        parser.add_option("-n", "--frame_decim", type="int",
                          default=default_frame_decim,
                          help="set oscope frame decimation factor to DECIM [default=%s]" % default_frame_decim)
        parser.add_option("-v", "--v_scale", type="eng_float",
                          default=default_v_scale,
                          help="set oscope initial V/div [default=%s]" % default_v_scale)
        parser.add_option("-t", "--t_scale", type="eng_float",
                          default=default_t_scale,
                          help="set oscope initial s/div [default=%s]" % default_t_scale)
        parser.add_option("-l", "--ref_level", type="eng_float",
                          default=default_ref_level,
                          help="set fft reference level [default=%sdB]" % default_ref_level)
        (options, args) = parser.parse_args ()
        if len(args) != 0:
            parser.print_help()
            raise SystemExit, 1

        # flow graph, including scope and fft frames
        sample_rate = int(options.sample_rate)

        # signal, noise sources need to be attributes so callbacks can get them
        self.signal = gr.sig_source_f(sample_rate, gr.GR_SIN_WAVE, options.freq,
                                    options.amplitude, 0.0)

        # Seed copied from example at cswiger/noise_source.html
        self.noise = gr.noise_source_f(options.noise_type,
                                       options.noise_amplitude,
                                       2482)
        add = gr.add_ff()
        
        throttle = gr.throttle(gr.sizeof_float, sample_rate)

        (scope_title, scope_panel, scope_vbox) = panel_info[1] #0 is ctrl panel
        scope = scopesink2.scope_sink_f(scope_panel,
                                       sample_rate=sample_rate,
                                       frame_decim=options.frame_decim,
                                       v_scale=options.v_scale,
                                       t_scale=options.t_scale)
        scope_vbox.Add (scope.win, 1, wx.EXPAND)

        fft_size = 256
        (fft_title, fft_panel, fft_vbox) = panel_info[2] # 0 is control panel
        fft = fftsink2.fft_sink_f (fft_panel,title=fft_title,
                                  fft_size=fft_size*2,
                                  sample_rate=sample_rate, baseband_freq=0,
                                  ref_level=options.ref_level,
                                  y_per_div=10)
        fft_vbox.Add (fft.win, 1, wx.EXPAND)

        self.connect (self.signal, (add,0))
        self.connect (self.noise, (add,1))
        self.connect (add, throttle)
        # self.connect (throttle, (scope, 0))
        # self.connect (throttle, (scope, 1)) # can't leave scope in unconnected
        self.connect (throttle, scope)
        self.connect (throttle, fft)

        # control panel frame
        sliders = form.form()
        
        vbox.Add((0,10), 0)
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        hbox.Add((10,0), 0)
        sliders['signal_type'] = form.static_text_field(parent=panel,sizer=hbox)
        vbox.Add(hbox, 0, wx.EXPAND)
        
        vbox.Add((0,10), 0)
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        hbox.Add((10,0), 0)
        sliders['signal_freq'] = form.slider_field(parent=panel, sizer=hbox,
                                                 label="Frequency",
                                                 weight=3,
                                                 min=0, max=2*options.freq,
                                                 callback=self.set_signal_freq)
        vbox.Add(hbox, 0, wx.EXPAND)
        
        vbox.Add((0,10), 0)
        hbox = wx.BoxSizer(wx.HORIZONTAL) # apparently you can rebind hbox
        hbox.Add((10,0), 0)
        sliders['signal_ampl'] = form.slider_field(parent=panel, sizer=hbox,
                                                 label="Amplitude",
                                                 weight=3,
                                                 min=0, max=usrp_full_scale,
                                                 callback=self.set_signal_ampl)
        vbox.Add(hbox, 0, wx.EXPAND)

        vbox.Add((0,20), 0)
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        hbox.Add((10,0), 0)
        sliders['noise_type'] = form.static_text_field(parent=panel,sizer=hbox)
        vbox.Add(hbox, 0, wx.EXPAND)

        vbox.Add((0,10), 0)
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        hbox.Add((10,0), 0)
        sliders['noise_ampl'] = form.slider_field(parent=panel, sizer=hbox,
                                                  label="Amplitude",
                                                  weight=3,
                                                  min=0, max=usrp_full_scale,
                                                  callback=self.set_noise_ampl)
        vbox.Add(hbox, 0, wx.EXPAND)
        vbox.Add((0,10), 0)
        
        sliders['signal_type'].set_value("Signal: %s"
                                        % signal_string[signal_type])    
        sliders['noise_type'].set_value("Noise: %s"
                                        % noise_string[options.noise_type])
        sliders['signal_freq'].set_value(options.freq)
        sliders['signal_ampl'].set_value(options.amplitude)        
        sliders['noise_ampl'].set_value(options.noise_amplitude)
示例#19
0
    def _build_gui(self, vbox):
        def _form_set_freq(kv):
            return self.set_freq(kv['freq'])

        def _form_set_dm(kv):
            return self.set_dm(kv['DM'])

        def _form_set_doppler(kv):
            return self.set_doppler(kv['Doppler'])

        # Position the FFT or Waterfall
        vbox.Add(self.scope.win, 5, wx.EXPAND)
        vbox.Add(self.chart.win, 5, wx.EXPAND)

        # add control area at the bottom
        self.myform = myform = form.form()
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        hbox.Add((7, 0), 0, wx.EXPAND)
        vbox1 = wx.BoxSizer(wx.VERTICAL)
        myform['freq'] = form.float_field(parent=self.panel,
                                          sizer=vbox1,
                                          label="Center freq",
                                          weight=1,
                                          callback=myform.check_input_and_call(
                                              _form_set_freq,
                                              self._set_status_msg))

        vbox1.Add((3, 0), 0, 0)

        # To show current Local Mean Sidereal Time
        myform['lmst_high'] = form.static_text_field(parent=self.panel,
                                                     sizer=vbox1,
                                                     label="Current LMST",
                                                     weight=1)
        vbox1.Add((3, 0), 0, 0)

        # To show current spectral cursor data
        myform['spec_data'] = form.static_text_field(parent=self.panel,
                                                     sizer=vbox1,
                                                     label="Pulse Freq",
                                                     weight=1)
        vbox1.Add((3, 0), 0, 0)

        # To show best pulses found in FFT output
        myform['best_pulse'] = form.static_text_field(parent=self.panel,
                                                      sizer=vbox1,
                                                      label="Best freq",
                                                      weight=1)
        vbox1.Add((3, 0), 0, 0)

        vboxBogus = wx.BoxSizer(wx.VERTICAL)
        vboxBogus.Add((2, 0), 0, wx.EXPAND)
        vbox2 = wx.BoxSizer(wx.VERTICAL)
        g = self.subdev.gain_range()
        myform['gain'] = form.slider_field(parent=self.panel,
                                           sizer=vbox2,
                                           label="RF Gain",
                                           weight=1,
                                           min=int(g[0]),
                                           max=int(g[1]),
                                           callback=self.set_gain)

        vbox2.Add((6, 0), 0, 0)
        myform['average'] = form.slider_field(parent=self.panel,
                                              sizer=vbox2,
                                              label="Spectral Averaging",
                                              weight=1,
                                              min=1,
                                              max=200,
                                              callback=self.set_averaging)
        vbox2.Add((6, 0), 0, 0)
        myform['foldavg'] = form.slider_field(
            parent=self.panel,
            sizer=vbox2,
            label="Folder Averaging",
            weight=1,
            min=1,
            max=20,
            callback=self.set_folder_averaging)
        vbox2.Add((6, 0), 0, 0)
        #myform['volume'] = form.quantized_slider_field(parent=self.panel, sizer=vbox2,
        #label="Audio Volume", weight=1, range=(-20, 0, 0.5), callback=self.set_volume)
        #vbox2.Add((6,0), 0, 0)
        myform['DM'] = form.float_field(
            parent=self.panel,
            sizer=vbox2,
            label="DM",
            weight=1,
            callback=myform.check_input_and_call(_form_set_dm))
        vbox2.Add((6, 0), 0, 0)
        myform['Doppler'] = form.float_field(
            parent=self.panel,
            sizer=vbox2,
            label="Doppler",
            weight=1,
            callback=myform.check_input_and_call(_form_set_doppler))
        vbox2.Add((6, 0), 0, 0)

        # Baseband recording control
        buttonbox = wx.BoxSizer(wx.HORIZONTAL)
        self.record_control = form.button_with_callback(
            self.panel,
            label="Recording baseband: Off                           ",
            callback=self.toggle_recording)
        self.record_pulse_control = form.button_with_callback(
            self.panel,
            label="Recording pulses: Off                              ",
            callback=self.toggle_pulse_recording)

        buttonbox.Add(self.record_control, 0, wx.CENTER)
        buttonbox.Add(self.record_pulse_control, 0, wx.CENTER)
        vbox.Add(buttonbox, 0, wx.CENTER)
        hbox.Add(vbox1, 0, 0)
        hbox.Add(vboxBogus, 0, 0)
        hbox.Add(vbox2, wx.ALIGN_RIGHT, 0)
        vbox.Add(hbox, 0, wx.EXPAND)

        self._build_subpanel(vbox)

        self.lmst_timer = wx.PyTimer(self.lmst_timeout)
        self.lmst_timeout()
示例#20
0
    def __init__(self, options):
	grc_wxgui.top_block_gui.__init__(self, title="DSSDR")

	self.initialized = False
	self.stopped = False

	self.options = copy.copy(options)
	self._constellation = digital.constellation_bpsk()
	self._excess_bw = options.excess_bw
	self._phase_bw = options.phase_bw
	self._freq_bw = options.freq_bw
	self._timing_bw = options.timing_bw
	self._if_freq = options.if_freq
	self._timing_max_dev= 1.5
	self._demod_class = digital.bpsk_demod  # the demodulator_class we're using
	self._chbw_factor = options.chbw_factor # channel filter bandwidth factor
	self._samples_per_second = 2e6
	self._nav_samples_per_second = 16e6
	self._down_decim = 1
	self._down_samples_per_second = self._scope_sample_rate = self._samples_per_second/self._down_decim
	self._up_samples_per_second = 1e6
	self._asm_threshold = 0
	self._access_code = None
	self._tm_packet_id = 4
	self._timestamp_id = 5
	self._down_bitrate = options.bitrate
	self._up_bitrate = options.up_bitrate
	self._up_samples_per_symbol = self._up_samples_per_second/self._up_bitrate
	self._samples_per_symbol = self._samples_per_second/self._down_decim/self._down_bitrate
	self._down_sub_freq = options.down_sub_freq
	self._up_sub_freq = 25e3
	self._tm_len = 8920
	self._up_tm_len = 8920
	self._coding_method = options.coding_method
	self._up_coding_method = 'None'
	self._up_subcarrier = 'Square'
	self._rs_i = 1
	self._ccsds_channel = 38
	self._uhd_carrier_offset = 10e3
	self._turn_div = 749
	self._turn_mult = 880
	self._modulation_index = 'pi/3'
	self._up_modulation_index = 1.047
	self._max_carrier_offset = 0.1
	self._dssdr_mixer_freq = options.rf_freq
	self._up_coding_rate = '1'
	self._down_coding_rate = '1'
	self._down_conv_en = "False"
	self._down_randomizer_en = options.down_randomizer_en
	self._down_manchester_en = options.down_manchester_en
	self._up_conv_en = "False"
	self._up_idle_sequence = "\\x55"
	self._down_default_gain = 64
	self._up_default_gain = 44
	self._up_en = True

        if self._access_code is None:
            self._access_code = packet_utils.default_access_code

	#Construct the lookup table for parameter-setting functions
	self.param_setters = {
		"DSSDR_CHANNEL": self.setChannel,
		"DSSDR_LO_FREQ": self.setLOFreq,
		"DSSDR_REF_FREQ": self.setRefFreq,
		"DSSDR_TURN_MULT": self.setTurnMult,
		"DSSDR_TURN_DIV": self.setTurnDiv,
		"DSSDR_UP_GAIN": self.setUpGain,
		"DSSDR_DOWN_GAIN": self.setDownGain,
		"DSSDR_UP_BITRATE": self.setUpBitrate,
		"DSSDR_DOWN_BITRATE": self.setDownBitrate,
		"DSSDR_DOWN_SAMPLE_RATE": self.setSampRate,
		"DSSDR_UP_SUB_FREQ": self.setUpSubFreq,
		"DSSDR_DOWN_SUB_FREQ": self.setDownSubFreq,
		"DSSDR_DOPPLER_REPORT": self.dopplerReport,
		"DSSDR_PN_RANGE": self.rangePN,
		"DSSDR_SEQUENTIAL_RANGE": self.rangeSequential,
		"DSSDR_DOWN_CODING_METHOD": self.setDownCodingMethod,
		"DSSDR_UP_CODING_METHOD": self.setUpCodingMethod,
		"DSSDR_DOWN_TM_LEN": self.setTMLen,
		"DSSDR_UP_TM_LEN": self.setUpTMLen,
		"DSSDR_DOWN_MOD_IDX": self.setDownModulationIndex,
		"DSSDR_UP_MOD_IDX": self.setUpModulationIndex,
		"DSSDR_DOWN_CONV_EN": self.setDownConvEn,
		"DSSDR_UP_CONV_EN": self.setUpConvEn,
		"DSSDR_ASM_TOL": self.setASMThreshold,
		"DSSDR_UP_SWEEP": self.freqSweep,
		"DSSDR_UP_IDLE": self.setUpIdleSequence,
		"DSSDR_UP_EN": self.setUpEn,
		"DSSDR_SYNC_TIME": self.syncSDRTime,
		"DSSDR_UP_SWEEP": self.freqSweep,
		"DSSDR_DOWN_ACQUIRE": self.acquireCarrier,
		"DSSDR_INPUT_SELECT": self.setPanelSelect,
		"DSSDR_REF_SELECT": self.setRefSelect,
		"DSSDR_PPS_SELECT": self.setPPSSelect
	}

	#TODO:Add status fields for things like DSSDR_REF_LOCK

	self._dssdr_channels = {
		3: [7149597994, 8400061729],
		4: [7150753857, 8401419752],
		5: [7151909723, 8402777779],
		6: [7153065586, 8404135802],
		7: [7154221449, 8405493825],
		8: [7155377316, 8406851853],
		9: [7156533179, 8408209877],
		10: [7157689045, 8409567903],
		11: [7158844908, 8410925927],
		12: [7160000771, 8412283950],
		13: [7161156637, 8413641977],
		14: [7162312500, 8415000000],
		15: [7163468363, 8416358023],
		16: [7164624229, 8417716050],
		17: [7165780092, 8419074073],
		18: [7166935955, 8420432097],
		19: [7168091821, 8421790123],
		20: [7169247684, 8423148147],
		21: [7170403551, 8424506175],
		22: [7171559414, 8425864198],
		23: [7172715277, 8427222221],
		24: [7173871143, 8428580248],
		25: [7175027006, 8429938271],
		26: [7176182869, 8431296295],
		27: [7177338735, 8432654321],
		28: [7178494598, 8434012345],
		29: [7179650464, 8435370372],
		30: [7180806327, 8436728395],
		31: [7181962190, 8438086418],
		32: [7183118057, 8439444446],
		33: [7184273920, 8440802469],
		34: [7185429783, 8442160493],
		35: [7186585649, 8443518520],
		36: [7187741512, 8444876543],
		37: [7188897378, 8446234570],
		38: [7190000000, 8450000000],
	}

	#FLOWGRAPH STUFF
	if options.test == True:
		self.u = blks2.tcp_source(
			itemsize=gr.sizeof_gr_complex*1,
			addr="",
			port=12905,
			server=True
		)
	elif options.fromfile == True:
		self.u2 = blocks.file_meta_source("iq_in.dat")
		self.u = blocks.throttle(gr.sizeof_gr_complex*1, self._samples_per_second)
	elif options.frombitlog == True:
		self.u3 = blocks.file_source(gr.sizeof_char, "bitstream_recording.in", True)
		self.u2 = blocks.uchar_to_float()
		self.u1 = blocks.throttle(gr.sizeof_float*1, self._down_bitrate)
		self.u = blocks.add_const_ff(-0.5)
	else:
		self.u = uhd.usrp_source(device_addr=options.args, stream_args=uhd.stream_args('fc32'))
		self.u.set_clock_source("external")
		self.u.set_time_source("external")
		self.u.set_samp_rate(self._samples_per_second)
		self.u.set_antenna("RX2")
		self.u.set_gain(self._down_default_gain)

		self.frontend = dfi.dssdrFrontendInterface(self.u)

	if options.debug_pps == True:
		self.debug_pps = blocks.tag_debug(gr.sizeof_gr_complex, "debug-pps", "rx_time")

	if options.tofile == True:
		self.u_tx = blocks.file_meta_sink(gr.sizeof_gr_complex, "iq_out.dat", self._up_samples_per_second)
	elif options.tonull == True:
		self.u_tx = blocks.null_sink(gr.sizeof_gr_complex)
	else:
		self.u_tx = uhd.usrp_sink(device_addr=options.args, stream_args=uhd.stream_args('fc32'))
		self.u_tx.set_clock_source("external")
		self.u_tx.set_time_source("external")
		self.u_tx.set_samp_rate(self._up_samples_per_second)
		self.u_tx.set_antenna("TX/RX")
		self.u_tx.set_gain(self._up_default_gain)

	#GUI STUFF
	if options.graphics == True:
		self.nb0 = wx.Notebook(self.GetWin(), style=wx.NB_TOP)
		self.nb0.AddPage(grc_wxgui.Panel(self.nb0), "RX")
		self.nb0.AddPage(grc_wxgui.Panel(self.nb0), "TX")
		self.nb0.AddPage(grc_wxgui.Panel(self.nb0), "Nav")
		self.Add(self.nb0)
		self.constellation_scope = scopesink2.scope_sink_c(
			self.nb0.GetPage(0).GetWin(),
			title="Scope Plot",
			sample_rate=self._scope_sample_rate,
			v_scale=0,
			v_offset=0,
			t_scale=0,
			ac_couple=False,
			xy_mode=True,
			num_inputs=1,
			trig_mode=wxgui.TRIG_MODE_AUTO,
			y_axis_label="Counts",
		)
	        self.nb0.GetPage(0).Add(self.constellation_scope.win)
		#self.constellation_scope.win.set_marker('plus')
		self._scope_is_fft = False
		self.time_scope = scopesink2.scope_sink_f(
			self.nb0.GetPage(0).GetWin(),
			title="Scope Plot",
			sample_rate=self._scope_sample_rate,
			v_scale=0,
			v_offset=0,
			t_scale=.005,
			ac_couple=False,
			xy_mode=False,
			num_inputs=1,
			trig_mode=wxgui.TRIG_MODE_AUTO,
			y_axis_label="Counts",
		)
		self.nb0.GetPage(0).Add(self.time_scope.win)
		self.nb0.GetPage(0).GetWin()._box.Hide(self.time_scope.win)
		self.fft_scope = fftsink2.fft_sink_c(
			self.nb0.GetPage(0).GetWin(),
			baseband_freq=0,
			y_per_div=10,
			y_divs=10,
			ref_level=0,
			ref_scale=2.0,
			sample_rate=self._scope_sample_rate,
			fft_size=1024,
		 	fft_rate=15,
			average=False,
			avg_alpha=None,
			title="FFT Plot",
			peak_hold=False,
		)
		self.nb0.GetPage(0).Add(self.fft_scope.win)
		self.nb0.GetPage(0).GetWin()._box.Hide(self.fft_scope.win)
	
		self.row1_sizer = wx.BoxSizer(wx.HORIZONTAL)
		self.recording_onoff_chooser = forms.radio_buttons(
			parent=self.nb0.GetPage(0).GetWin(),
			value='Off',
			callback=self.setRecording,
			label="IQ Recording",
			choices=['Off','On'],
			labels=[],
			style=wx.RA_HORIZONTAL,
		)
		self.front_panel_chooser = forms.radio_buttons(
			parent=self.nb0.GetPage(0).GetWin(),
			value='RF',
			callback=self.setPanelSelect,
			label="Input Select",
			choices=['RF','IF'],
			labels=[],
			style=wx.RA_HORIZONTAL,
		)
		self.ref_chooser = forms.radio_buttons(
			parent=self.nb0.GetPage(0).GetWin(),
			value='Internal',
			callback=self.setRefSelect,
			label="Ref Select",
			choices=['Internal','External'],
			labels=[],
			style=wx.RA_HORIZONTAL,
		)
		self.pps_chooser = forms.radio_buttons(
			parent=self.nb0.GetPage(0).GetWin(),
			value='Internal',
			callback=self.setPPSSelect,
			label="PPS Select",
			choices=['Internal','External'],
			labels=[],
			style=wx.RA_HORIZONTAL,
		)

		self.sync_button = forms.button(
			parent=self.nb0.GetPage(0).GetWin(),
			value='Sync to PPS',
			callback=self.syncSDRTime,
			choices=['Sync to PPS'],
			style=wx.RA_HORIZONTAL,
		)
		self.ref_locked_text = forms.static_text(
			parent=self.nb0.GetPage(0).GetWin(),
			value="",
			callback=self.setRefLocked,
			label="",
			converter=forms.str_converter(),
		)
		self.row1_sizer.Add(self.recording_onoff_chooser, flag=wx.ALIGN_CENTER)
		self.row1_sizer.Add(self.front_panel_chooser, flag=wx.ALIGN_CENTER)
		self.row1_sizer.Add(self.ref_chooser, flag=wx.ALIGN_CENTER)
		self.row1_sizer.Add(self.pps_chooser, flag=wx.ALIGN_CENTER)
		self.row1_sizer.Add(self.sync_button, flag=wx.ALIGN_CENTER)
		self.row1_sizer.Add(self.ref_locked_text, flag=wx.ALIGN_CENTER)
		self.nb0.GetPage(0).Add(self.row1_sizer)
		self.complex_scope_chooser = forms.radio_buttons(
			parent=self.nb0.GetPage(0).GetWin(),
			value='Constellation',
			callback=self.setComplexScopeStyle,
			label="Complex Scope",
			choices=['Constellation','FFT'],
			labels=[],
			style=wx.RA_HORIZONTAL,
		)
		self.nb0.GetPage(0).Add(self.complex_scope_chooser)
		self.scope_chooser = forms.radio_buttons(
			parent=self.nb0.GetPage(0).GetWin(),
			value='USRP',
			callback=self.setScopePoint,
			label="Scope Probe Point",
			choices=['USRP','Carrier Tracking','Sub-Carrier Costas','Sub-Carrier Sync','Data Sync'],
			labels=[],
			style=wx.RA_HORIZONTAL,
		)
		self.nb0.GetPage(0).Add(self.scope_chooser)
		self._bitrate_text_box = forms.text_box(
			parent=self.nb0.GetPage(0).GetWin(),
			value=self._down_bitrate,
			callback=self.setDownBitrate,
			label="Symbol Rate",
			converter=forms.float_converter(),
		)
		self.nb0.GetPage(0).Add(self._bitrate_text_box)
		self._samprate_text_box = forms.text_box(
			parent=self.nb0.GetPage(0).GetWin(),
			value=self._samples_per_second,
			callback=self.setSampRate,
			label="Sampling Rate",
			converter=forms.float_converter(),
		)
		self.nb0.GetPage(0).Add(self._samprate_text_box)
		self._subcfreq_text_box = forms.text_box(
			parent=self.nb0.GetPage(0).GetWin(),
			value=self._down_sub_freq,
			callback=self.setDownSubFreq,
			label="Downlink Subcarrier Frequency",
			converter=forms.float_converter(),
		)
		self.nb0.GetPage(0).Add(self._subcfreq_text_box)
		self._mod_index_chooser = forms.radio_buttons(
			parent=self.nb0.GetPage(0).GetWin(),
			value=self._modulation_index,
			callback=self.setDownModulationIndex,
			label="Modulation Index",
			choices=['pi/2', 'pi/3'],
			labels=[],
			style=wx.RA_HORIZONTAL,
		)
		self.nb0.GetPage(0).Add(self._mod_index_chooser)
		self._pktlen_text_box = forms.text_box(
			parent=self.nb0.GetPage(0).GetWin(),
			value=self._tm_len,
			callback=self.setTMLen,
			label="Downlink Packet Length (bits)",
			converter=forms.float_converter(),
		)
		self.nb0.GetPage(0).Add(self._pktlen_text_box)
		self._coding_chooser = forms.radio_buttons(
			parent=self.nb0.GetPage(0).GetWin(),
			value=self._coding_method,
			callback=self.setDownCodingMethod,
			label="Coding",
			choices=['None', 'RS', 'Turbo 1/2', 'Turbo 1/3', 'Turbo 1/4', 'Turbo 1/6'],
			labels=[],
			style=wx.RA_HORIZONTAL,
		)
		self.nb0.GetPage(0).Add(self._coding_chooser)
		self._down_conv_check_box = forms.check_box(
			parent=self.nb0.GetPage(0).GetWin(),
			value=self._down_conv_en,
			callback=self.setDownConvEn,
			label="Convolutional Decode",
			true="True",
			false="False",
		)
		self.nb0.GetPage(0).Add(self._down_conv_check_box)
		self._down_randomizer_check_box = forms.check_box(
			parent=self.nb0.GetPage(0).GetWin(),
			value=self._down_randomizer_en,
			callback=self.setDownRandomizerEn,
			label="De-randomizer",
			true=True,
			false=False,
		)
		self.nb0.GetPage(0).Add(self._down_randomizer_check_box)
		self._down_manchester_check_box = forms.check_box(
			parent=self.nb0.GetPage(0).GetWin(),
			value=self._down_manchester_en,
			callback=self.setDownManchesterEn,
			label="Manchester Decode",
			true=True,
			false=False,
		)
		self.nb0.GetPage(0).Add(self._down_manchester_check_box)
		self._pktlen_text_box = forms.text_box(
			parent=self.nb0.GetPage(0).GetWin(),
			value=self._asm_threshold,
			callback=self.setASMThreshold,
			label="ASM Error Tolerance (bits)",
			converter=forms.float_converter(),
		)
		self.nb0.GetPage(0).Add(self._pktlen_text_box)
		self._coding_chooser = forms.radio_buttons(
			parent=self.nb0.GetPage(0).GetWin(),
			value=self._rs_i,
			callback=self.setRSI,
			label="Reed-Solomon Interleaving Depth",
			choices=[1,5],
			labels=[],
			style=wx.RA_HORIZONTAL,
		)
		self.nb0.GetPage(0).Add(self._coding_chooser)
		self._ccsds_chan_text_box = forms.text_box(
			parent=self.nb0.GetPage(0).GetWin(),
			value=self._ccsds_channel,
			callback=self.setChannel,
			label="CCSDS Channel",
			converter=forms.int_converter(),
		)
		self.nb0.GetPage(0).Add(self._ccsds_chan_text_box)
		self.setChannel(self._ccsds_channel)
	
		if options.test == True or options.fromfile == True or options.frombitlog == True:
			glow = 0.0
			ghigh = 1.0
			cur_g = 0.5
		else:
			g = self.u.get_gain_range()
			cur_g = self._down_default_gain
		
			# some configurations don't have gain control
			if g.stop() <= g.start():
				glow = 0.0
				ghigh = 1.0
		
			else:
				glow = g.start()
				ghigh = g.stop()
		
		self._uhd_gain_slider = wx.BoxSizer(wx.HORIZONTAL)
		form.slider_field(
			parent=self.nb0.GetPage(0).GetWin(),
			sizer=self._uhd_gain_slider,
			label="USRP RX Gain",
			weight=3,
			min=int(glow), 
			max=int(ghigh),
			value=cur_g,
			callback=self.setDownGain
		)
		self.nb0.GetPage(0).Add(self._uhd_gain_slider)

		#TX chain GUI components
		if options.test == True or options.tofile == True or options.tonull == True:
			gtxlow = 0.0
			gtxhigh = 1.0
			cur_gtx = 0.5
		else:
			gtx = self.u_tx.get_gain_range()
			cur_gtx = self._up_default_gain
		
			# some configurations don't have gain control
			if gtx.stop() <= gtx.start():
				gtxlow = 0.0
				gtxhigh = 1.0
		
			else:
				gtxlow = gtx.start()
				gtxhigh = gtx.stop()

		self._up_en_chooser = forms.check_box(
			parent=self.nb0.GetPage(1).GetWin(),
			value='True',
			callback=self.setUpEn,
			label="TX Enable",
			true='True',
			false='False',
		)
		self.nb0.GetPage(1).Add(self._up_en_chooser)

		self._uhd_tx_gain_slider = wx.BoxSizer(wx.HORIZONTAL)
		form.slider_field(
			parent=self.nb0.GetPage(1).GetWin(),
			sizer=self._uhd_tx_gain_slider,
			label="USRP TX Gain",
			weight=3,
			min=int(gtxlow), 
			max=int(gtxhigh),
			value=cur_gtx,
			callback=self.setUpGain
		)
		self.nb0.GetPage(1).Add(self._uhd_tx_gain_slider)
		self._subcfreq_up_text_box = forms.text_box(
			parent=self.nb0.GetPage(1).GetWin(),
			value=self._up_sub_freq,
			callback=self.setUpSubFreq,
			label="Uplink Subcarrier Frequency",
			converter=forms.float_converter(),
		)
		self.nb0.GetPage(1).Add(self._subcfreq_up_text_box)
		self._up_bitrate_text_box = forms.text_box(
			parent=self.nb0.GetPage(1).GetWin(),
			value=self._up_bitrate,
			callback=self.setUpBitrate,
			label="Uplink Bitrate",
			converter=forms.float_converter(),
		)
		self.nb0.GetPage(1).Add(self._up_bitrate_text_box)
		self._up_data_text_box = forms.text_box(
			parent=self.nb0.GetPage(1).GetWin(),
			value="1234ABCD",
			callback=self.txData,
			label="TX Data",
			converter=forms.str_converter(),
		)
		self.nb0.GetPage(1).Add(self._up_data_text_box)
		self._up_mod_index_chooser = forms.text_box(
			parent=self.nb0.GetPage(1).GetWin(),
			value=self._up_modulation_index,
			callback=self.setUpModulationIndex,
			label="Uplink Modulation Index",
			converter=forms.float_converter(),
		)
		self.nb0.GetPage(1).Add(self._up_mod_index_chooser)
		self._up_coding_chooser = forms.radio_buttons(
			parent=self.nb0.GetPage(1).GetWin(),
			value=self._up_coding_method,
			callback=self.setUpCodingMethod,
			label="Coding",
			choices=['None', 'RS'],
			labels=[],
			style=wx.RA_HORIZONTAL,
		)
		self.nb0.GetPage(1).Add(self._up_coding_chooser)
		self._subcarrier_chooser = forms.radio_buttons(
			parent=self.nb0.GetPage(1).GetWin(),
			value=self._up_subcarrier,
			callback=self.setUpSubcarrier,
			label="Subcarrier Type",
			choices=['Square','Sine'],
			labels=[],
			style=wx.RA_HORIZONTAL,
		)
		self.nb0.GetPage(1).Add(self._subcarrier_chooser)
		self._up_conv_check_box = forms.check_box(
			parent=self.nb0.GetPage(1).GetWin(),
			value=self._up_conv_en,
			callback=self.setUpConvEn,
			label="Convolutional Encode",
			true="True",
			false="False",
		)
		self.nb0.GetPage(1).Add(self._up_conv_check_box)
		self._up_pktlen_text_box = forms.text_box(
			parent=self.nb0.GetPage(1).GetWin(),
			value=self._up_tm_len,
			callback=self.setUpTMLen,
			label="Uplink Packet Length (bits)",
			converter=forms.float_converter(),
		)
		self.nb0.GetPage(1).Add(self._up_pktlen_text_box)
		self._uhd_offset_text_box = forms.text_box(
			parent=self.nb0.GetPage(1).GetWin(),
			value=self._uhd_carrier_offset,
			callback=self.setUHDCarrierOffset,
			label="USRP Offset Frequency (Hz)",
			converter=forms.float_converter(),
		)
		self.nb0.GetPage(1).Add(self._uhd_offset_text_box)
		self._sweep_gen_text_box = forms.text_box(
			parent=self.nb0.GetPage(1).GetWin(),
			value="rf2_1",
			callback=self.freqSweep,
			label="Frequency Sweep Profile",
			converter=forms.str_converter(),
		)
		self.nb0.GetPage(1).Add(self._sweep_gen_text_box)
		self._idle_sequence_text_box = forms.text_box(
			parent=self.nb0.GetPage(1).GetWin(),
			value=self._up_idle_sequence,
			callback=self.setUpIdleSequence,
			label="Uplink Idle Sequence",
			converter=forms.str_converter(),
		)
		self.nb0.GetPage(1).Add(self._idle_sequence_text_box)
		self._pn_ranging_text_box = forms.text_box(
			parent=self.nb0.GetPage(2).GetWin(),
			value="",
			callback=self.rangePN,
			label="Queue PN Ranging",
			converter=forms.str_converter(),
		)
		self.nb0.GetPage(2).Add(self._pn_ranging_text_box)
		self._sequential_ranging_text_box = forms.text_box(
			parent=self.nb0.GetPage(2).GetWin(),
			value="",
			callback=self.rangeSequential,
			label="Queue Sequential Ranging",
			converter=forms.str_converter(),
		)
		self.nb0.GetPage(2).Add(self._sequential_ranging_text_box)
		self.row2_sizer = wx.BoxSizer(wx.HORIZONTAL)
		self.freq_acq_button = forms.button(
			parent=self.nb0.GetPage(2).GetWin(),
			value='Acquire Carrier Offset',
			callback=self.acquireCarrier,
			choices=['Acquire Carrier Offset'],
			style=wx.RA_HORIZONTAL,
		)
		self.carrier_offset_text = forms.static_text(
			parent=self.nb0.GetPage(2).GetWin(),
			value="",
			label="",
			converter=forms.str_converter(),
		)
		self.row2_sizer.Add(self.freq_acq_button, flag=wx.ALIGN_CENTER)
		self.row2_sizer.Add(self.carrier_offset_text, flag=wx.ALIGN_CENTER)
		self.nb0.GetPage(2).Add(self.row2_sizer)


	self.file_sink = blocks.file_meta_sink(gr.sizeof_gr_complex, "iq_recording.dat", self._samples_per_second)
	self.file_sink.close()
	self.iq_recording_ctr = 0

	# Selection logic to switch between recording and normal flowgraph routes
	# NOTE: u_valve logic is implemented backwards in GNURadio....
	#self.u_valve = blks2.valve(
	#	item_size=gr.sizeof_gr_complex,
	#	open=False
	#)

	# Temporary code used to verify coherent turnaround
	self.turnaround_mixer = blocks.multiply_cc()
	self.turnaround_mixer_source = analog.sig_source_c(self._down_samples_per_second, analog.GR_SIN_WAVE, -25e3, 1.0)
	self.turnaround_iir = filter.single_pole_iir_filter_cc(0.0001)
	self.turnaround_null = blocks.null_sink(gr.sizeof_float)

	# PLL and associated carrier for tracking carrier frequency if residual carrier is used
	self.carrier_tracking = sdrp.pll_freq_acq_cc(math.pi/2000, math.pi, -math.pi, int(options.acq_samples))
	self.imag_to_float = blocks.complex_to_imag()

	#Suppressed carrier requires costas after subcarrier mixer
	self.subcarrier_costas = digital.costas_loop_cc(0.001, 2)
	self.real_to_float = blocks.complex_to_real()

	#Square wave subcarrier sync
	self.subcarrier_sync = sdrp.square_sub_tracker_ff(0.001, 2*self._down_sub_freq/self._down_samples_per_second*1.0001, 2*self._down_sub_freq/self._down_samples_per_second*0.9999)

	#Data sync
	self.data_sync = sdrp.square_data_tracker_ff(0.001, self._down_bitrate/self._down_samples_per_second*1.001, self._down_bitrate/self._down_samples_per_second*0.999)

	#Data framing
	self.soft_correlator = sdrp.correlate_soft_access_tag_ff(conv_packed_binary_string_to_1_0_string('\x1A\xCF\xFC\x1D'), self._asm_threshold, "asm_corr")
	self.conv_decoder = sdrp.ccsds_tm_conv_decoder("asm_corr")
	self.de_randomizer = sdrp.ccsds_tm_derandomizer("asm_corr")
	self.tm_framer = sdrp.ccsds_tm_framer(self._tm_packet_id, self._timestamp_id, "asm_corr", "rx_time", self._down_bitrate)
	self.tm_framer.setFrameLength(self._tm_len)

	self._current_scope_block = None
	self._current_scoped_block = self.u
	self._current_scoped_block_port = 0

	self._recording = 'Off'

	#TX path in flowgraph
	self.pkt_gen_msgq = gr.msg_queue(10)
        self.pkt_gen = sdrp.ccsds_tm_tx(self._tm_packet_id, self._timestamp_id, 1.0, 16, self.pkt_gen_msgq)
	self.conj = blocks.conjugate_cc()

	#Sweep generator for transponder lock
	self.sweep_gen = sdrp.sweep_generator_cc(self._up_samples_per_second)

	# DSSDR subcarrier mixer (either 25 kHz or 0 kHz depending on baud rate)
	self.up_subcarrier_mixer = blocks.multiply_ff()
	self.subcarrier_mixer_source_tx = analog.sig_source_f(self._up_samples_per_second, analog.GR_SQR_WAVE, 25e3, 2.0, -1.0)
	self.phase_mod_tx = analog.phase_modulator_fc(self._up_modulation_index)
	self.tx_attenuator = blocks.multiply_const_cc((0.1+0.0j))

	#Add in bit recorder if needed
	if self.options.bitlog:
		self.bit_slicer = digital.binary_slicer_fb()
		self.bit_recorder = blocks.file_sink(1, "bitstream_recording.out")


	self.setDownCodingMethod(self._coding_method)
	self.setUpCodingMethod("None")
	self.setUpSubcarrier(self._up_subcarrier)
	self.setDownBitrate(self._down_bitrate)
	self.setUpBitrate(self._up_bitrate)
	self.setDownModulationIndex(self._modulation_index)
	self.setUpModulationIndex(self._up_modulation_index)
	self.setDownConvEn(self._down_conv_en)
	self.setUpConvEn(self._up_conv_en)
	self.setUpIdleSequence(self._up_idle_sequence)
	self.setDownRandomizerEn(self._down_randomizer_en)
	self.setDownManchesterEn(self._down_manchester_en)

	#Connection to outside world
	self.socket_pdu = blocks.socket_pdu("TCP_SERVER", "127.0.0.1", "12902", 10000)
	self.sdrp_interpreter = sdrp.sdrp_packet_interpreter()
	self.msg_connect(self.tm_framer, "tm_frame_out", self.sdrp_interpreter, "sdrp_pdu_in")
	self.msg_connect(self.sdrp_interpreter, "socket_pdu_out", self.socket_pdu, "pdus")
	self.msg_connect(self.socket_pdu, "pdus", self.sdrp_interpreter, "socket_pdu_in")
	self.msg_connect(self.sdrp_interpreter,"sdrp_pdu_out", self.pkt_gen, "ccsds_tx_msg_in")

	if options.test == False and options.fromfile == False and options.frombitlog == False:
		_threading.Thread(target=self.watchRef).start()

	self.initialized = True
	print "DS-SDR Initialized"
示例#21
0
    def _build_gui(self, vbox):

        def _form_set_freq(kv):
            return self.set_freq(kv['freq'])

        def _form_set_dm(kv):
            return self.set_dm(kv['DM'])

        def _form_set_doppler(kv):
            return self.set_doppler(kv['Doppler'])

        # Position the FFT or Waterfall
        vbox.Add(self.scope.win, 5, wx.EXPAND)
        vbox.Add(self.chart.win, 5, wx.EXPAND)

        # add control area at the bottom
        self.myform = myform = form.form()
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        hbox.Add((7,0), 0, wx.EXPAND)
        vbox1 = wx.BoxSizer(wx.VERTICAL)
        myform['freq'] = form.float_field(
            parent=self.panel, sizer=vbox1, label="Center freq", weight=1,
            callback=myform.check_input_and_call(_form_set_freq, self._set_status_msg))

        vbox1.Add((3,0), 0, 0)

        # To show current Local Mean Sidereal Time
        myform['lmst_high'] = form.static_text_field(
            parent=self.panel, sizer=vbox1, label="Current LMST", weight=1)
        vbox1.Add((3,0), 0, 0)

        # To show current spectral cursor data
        myform['spec_data'] = form.static_text_field(
            parent=self.panel, sizer=vbox1, label="Pulse Freq", weight=1)
        vbox1.Add((3,0), 0, 0)

        # To show best pulses found in FFT output
        myform['best_pulse'] = form.static_text_field(
            parent=self.panel, sizer=vbox1, label="Best freq", weight=1)
        vbox1.Add((3,0), 0, 0)

        vboxBogus = wx.BoxSizer(wx.VERTICAL)
        vboxBogus.Add ((2,0), 0, wx.EXPAND)
        vbox2 = wx.BoxSizer(wx.VERTICAL)
        g = self.subdev.gain_range()
        myform['gain'] = form.slider_field(parent=self.panel, sizer=vbox2, label="RF Gain",
                                           weight=1,
                                           min=int(g[0]), max=int(g[1]),
                                           callback=self.set_gain)

        vbox2.Add((6,0), 0, 0)
        myform['average'] = form.slider_field(parent=self.panel, sizer=vbox2, 
                    label="Spectral Averaging", weight=1, min=1, max=200, callback=self.set_averaging)
        vbox2.Add((6,0), 0, 0)
        myform['foldavg'] = form.slider_field(parent=self.panel, sizer=vbox2,
                    label="Folder Averaging", weight=1, min=1, max=20, callback=self.set_folder_averaging)
        vbox2.Add((6,0), 0, 0)
        #myform['volume'] = form.quantized_slider_field(parent=self.panel, sizer=vbox2,
                    #label="Audio Volume", weight=1, range=(-20, 0, 0.5), callback=self.set_volume)
        #vbox2.Add((6,0), 0, 0)
        myform['DM'] = form.float_field(
            parent=self.panel, sizer=vbox2, label="DM", weight=1,
            callback=myform.check_input_and_call(_form_set_dm))
        vbox2.Add((6,0), 0, 0)
        myform['Doppler'] = form.float_field(
            parent=self.panel, sizer=vbox2, label="Doppler", weight=1,
            callback=myform.check_input_and_call(_form_set_doppler))
        vbox2.Add((6,0), 0, 0)


        # Baseband recording control
        buttonbox = wx.BoxSizer(wx.HORIZONTAL)
        self.record_control = form.button_with_callback(self.panel,
              label="Recording baseband: Off                           ",
              callback=self.toggle_recording)
        self.record_pulse_control = form.button_with_callback(self.panel,
              label="Recording pulses: Off                              ",
              callback=self.toggle_pulse_recording)

        buttonbox.Add(self.record_control, 0, wx.CENTER)
        buttonbox.Add(self.record_pulse_control, 0, wx.CENTER)
        vbox.Add(buttonbox, 0, wx.CENTER)
        hbox.Add(vbox1, 0, 0)
        hbox.Add(vboxBogus, 0, 0)
	hbox.Add(vbox2, wx.ALIGN_RIGHT, 0)
        vbox.Add(hbox, 0, wx.EXPAND)

        self._build_subpanel(vbox)

        self.lmst_timer = wx.PyTimer(self.lmst_timeout)
        self.lmst_timeout()
示例#22
0
    def make_control(self):
        bspace = 10
        vbox = wx.BoxSizer(wx.VERTICAL)
        
        """ Frequency """
        nbox = wx.BoxSizer(wx.HORIZONTAL)
        self.make_label("Carrier Frequency", nbox, 46)
        self.freq = form.float_field (self, nbox, \
                value=default_control_setup.d_options['freq'], callback=self.SetFreq)
        self.AddParam('freq',self.SetFreq)
        self.SetParam('freq', self.options.freq)
        vbox.AddSpacer((10,10) )
        vbox.Add(nbox, 0, wx.ALIGN_LEFT|wx.BOTTOM|wx.LEFT|wx.RIGHT, border=bspace)
        
        """ Sample Rate """
        nbox = wx.BoxSizer(wx.HORIZONTAL)
        self.make_label("Sample Rate", nbox, 80)
        self.sample_rate = form.float_field (self, nbox, \
                value=self.options.sample_rate, callback=self.SetSampleRate)
        self.AddParam('sample_rate', self.SetSampleRate)
        self.SetParam('sample_rate', self.options.sample_rate)
        vbox.Add(nbox, 0, wx.ALIGN_LEFT|wx.BOTTOM|wx.LEFT|wx.RIGHT, border=bspace)
        
        """ Upsampling Factor """
        nbox = wx.BoxSizer(wx.HORIZONTAL)
        self.make_label("Upsampling Factor", nbox, 43)
        self.upsample = form.int_field (self, nbox, \
                value=self.options.upsample, callback=self.SetUpsample)
        self.AddParam('upsampling_factor', self.SetUpsample)
        self.SetParam('upsampling_factor', self.options.upsample)
        vbox.Add(nbox, 0, wx.ALIGN_LEFT|wx.BOTTOM|wx.LEFT|wx.RIGHT, border=bspace)
        self.upsamplebox = nbox

        """ TxGain """
        box = wx.BoxSizer(wx.HORIZONTAL)
        self.txgain = form.slider_field(self, box, "Transmit Gain",\
                value=self.options.tx_gain, callback=self.SetTxGain,
                min=0, max=10000.0)
        box.AddSpacer((10,10) )
        self.autotxgain = form.checkbox_field(self, box, "auto", \
                value=self.options.auto_tx_gain, callback=self.SetAutoTxGain, \
                weight=0)
        box.GetItem(self.autotxgain.f).SetFlag(wx.ALIGN_LEFT|wx.ALIGN_BOTTOM)
        self.AddParam('auto_tx_gain', self.SetAutoTxGain)
        self.SetParam('auto_tx_gain', self.options.auto_tx_gain)
        self.AddParam('tx_gain', self.SetTxGain)
        self.SetParam('tx_gain', self.options.tx_gain)
        vbox.Add(box, 0, wx.ALIGN_LEFT|wx.BOTTOM|wx.LEFT|wx.RIGHT, border=bspace)
        self.txgainbox = box

        """ RxGain """
        box = wx.BoxSizer(wx.HORIZONTAL)
        self.rxgain = form.slider_field(self, box, "Receive Gain", \
                value=self.options.rx_gain, callback=self.SetRxGain,
                min=0, max=75)
        self.AddParam('rx_gain', self.SetRxGain)
        self.SetParam('rx_gain', self.options.rx_gain)
        vbox.Add(box, 0, wx.ALIGN_LEFT|wx.BOTTOM|wx.LEFT|wx.RIGHT, border=bspace)

        self.topbox.Add(vbox, 0, wx.GROW)
        self.cbox = vbox
        self.Fit()
示例#23
0
	def _build_gui(self, vbox):

		def _form_set_freq(kv):
			# Adjust current SETI frequency, and limits
			self.setifreq_lower = kv['freq'] - (self.seti_freq_range/2)
			self.setifreq_current = kv['freq']
			self.setifreq_upper = kv['freq'] + (self.seti_freq_range/2)

			# Reset SETI analysis timer
			self.seti_then = time.time()
			# Zero-out hits array when changing frequency
			self.hits_array[:,:] = 0.0
			self.hit_intensities[:,:] = -60.0

			return self.set_freq(kv['freq'])

		def _form_set_decln(kv):
			return self.set_decln(kv['decln'])

		# Position the FFT display
		vbox.Add(self.scope.win, 15, wx.EXPAND)

		if self.setimode == False:
			# Position the Total-power stripchart
			vbox.Add(self.chart.win, 15, wx.EXPAND)
		
		# add control area at the bottom
		self.myform = myform = form.form()
		hbox = wx.BoxSizer(wx.HORIZONTAL)
		hbox.Add((7,0), 0, wx.EXPAND)
		vbox1 = wx.BoxSizer(wx.VERTICAL)
		myform['freq'] = form.float_field(
			parent=self.panel, sizer=vbox1, label="Center freq", weight=1,
			callback=myform.check_input_and_call(_form_set_freq, self._set_status_msg))

		vbox1.Add((4,0), 0, 0)

		myform['lmst_high'] = form.static_text_field(
			parent=self.panel, sizer=vbox1, label="Current LMST", weight=1)
		vbox1.Add((4,0), 0, 0)

		if self.setimode == False:
			myform['spec_data'] = form.static_text_field(
				parent=self.panel, sizer=vbox1, label="Spectral Cursor", weight=1)
			vbox1.Add((4,0), 0, 0)

		vbox2 = wx.BoxSizer(wx.VERTICAL)
		if self.setimode == False:
			vbox3 = wx.BoxSizer(wx.VERTICAL)
		g = self.subdev[0].gain_range()
		myform['gain'] = form.slider_field(parent=self.panel, sizer=vbox2, label="RF Gain",
										   weight=1,
										   min=int(g[0]), max=int(g[1]),
										   callback=self.set_gain)

		vbox2.Add((4,0), 0, 0)
		if self.setimode == True:
			max_savg = 100
		else:
			max_savg = 3000
		myform['average'] = form.slider_field(parent=self.panel, sizer=vbox2, 
					label="Spectral Averaging (FFT frames)", weight=1, min=1, max=max_savg, callback=self.set_averaging)

		# Set up scan control button when in SETI mode
		if (self.setimode == True):
			# SETI scanning control
			buttonbox = wx.BoxSizer(wx.HORIZONTAL)
			self.scan_control = form.button_with_callback(self.panel,
				  label="Scan: On ",
				  callback=self.toggle_scanning)
	
			buttonbox.Add(self.scan_control, 0, wx.CENTER)
			vbox2.Add(buttonbox, 0, wx.CENTER)

		vbox2.Add((4,0), 0, 0)

		if self.setimode == False:
			myform['integration'] = form.slider_field(parent=self.panel, sizer=vbox2,
				   label="Continuum Integration Time (sec)", weight=1, min=1, max=180, callback=self.set_integration)

			vbox2.Add((4,0), 0, 0)

		myform['decln'] = form.float_field(
			parent=self.panel, sizer=vbox2, label="Current Declination", weight=1,
			callback=myform.check_input_and_call(_form_set_decln))
		vbox2.Add((4,0), 0, 0)

		if self.setimode == False:
			myform['offset'] = form.slider_field(parent=self.panel, sizer=vbox3,
				label="Post-Detector Offset", weight=1, min=-750, max=750, 
				callback=self.set_pd_offset)
			vbox3.Add((2,0), 0, 0)
			myform['dcgain'] = form.slider_field(parent=self.panel, sizer=vbox3,
				label="Post-Detector Gain", weight=1, min=1, max=100, 
				callback=self.set_pd_gain)
			vbox3.Add((2,0), 0, 0)
		hbox.Add(vbox1, 0, 0)
		hbox.Add(vbox2, wx.ALIGN_RIGHT, 0)

		if self.setimode == False:
			hbox.Add(vbox3, wx.ALIGN_RIGHT, 0)

		vbox.Add(hbox, 0, wx.EXPAND)

		self._build_subpanel(vbox)

		self.lmst_timer = wx.PyTimer(self.lmst_timeout)
		self.other_timer = wx.PyTimer(self.other_timeout)