[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Commit-gnuradio] gnuradio-examples/python/apps/hf_explorer hfx2....
From: |
Charles B Swiger |
Subject: |
[Commit-gnuradio] gnuradio-examples/python/apps/hf_explorer hfx2.... |
Date: |
Mon, 10 Jul 2006 21:04:07 +0000 |
CVSROOT: /sources/gnuradio
Module name: gnuradio-examples
Changes by: Charles B Swiger <cswiger> 06/07/10 21:04:07
Modified files:
python/apps/hf_explorer: hfx2.py hfx_help
Removed files:
python/apps/hf_explorer: hfx.py weaver_isb_am1_usrp4.py
Log message:
Update USRP interface with auto subdev, mux, DDC tune, etc. Fix AM web
control tuning bug. Remove old crufty hfx.py radio.
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnuradio-examples/python/apps/hf_explorer/hfx2.py?cvsroot=gnuradio&r1=1.4&r2=1.5
http://cvs.savannah.gnu.org/viewcvs/gnuradio-examples/python/apps/hf_explorer/hfx_help?cvsroot=gnuradio&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/gnuradio-examples/python/apps/hf_explorer/hfx.py?cvsroot=gnuradio&r1=1.1&r2=0
http://cvs.savannah.gnu.org/viewcvs/gnuradio-examples/python/apps/hf_explorer/weaver_isb_am1_usrp4.py?cvsroot=gnuradio&r1=1.1&r2=0
Patches:
Index: hfx2.py
===================================================================
RCS file: /sources/gnuradio/gnuradio-examples/python/apps/hf_explorer/hfx2.py,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- hfx2.py 23 Mar 2006 16:58:06 -0000 1.4
+++ hfx2.py 10 Jul 2006 21:04:07 -0000 1.5
@@ -2,7 +2,7 @@
# -*- coding: ANSI_X3.4-1968 -*-
# generated by wxGlade 0.4 on Tue Mar 14 10:16:06 2006
#
-# Copyright 2005 Free Software Foundation, Inc.
+# Copyright 2006 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
@@ -65,14 +65,15 @@
# 2.3.1 adds web control, made AM Sync display optional,
# added more comments.
#
+# 2.4.1 updates usrp interface to support auto subdev
# Web server control disabled by default. Do not enable
# until directory structure and scripts are in place.
-WEB_CONTROL = False
+WEB_CONTROL = True
# Controls display of AM Sync Carrier - turn off for smaller
# window if not needed
-AM_SYNC_DISPLAY = True
+AM_SYNC_DISPLAY = False
import os, wx, sys, math
import wx.lib.evtmgr as em
@@ -107,6 +108,20 @@
ID_EXIT = wx.NewId() # Menu Exit
+def pick_subdevice(u):
+ """
+ The user didn't specify a subdevice on the command line.
+ If there's a daughterboard on A, select A.
+ If there's a daughterboard on B, select B.
+ Otherwise, select A.
+ """
+ if u.db[0][0].dbid() >= 0: # dbid is < 0 if there's no d'board or a
problem
+ return (0, 0)
+ if u.db[1][0].dbid() >= 0:
+ return (1, 0)
+ return (0, 0)
+
+
class MyFrame(wx.Frame):
def __init__(self, *args, **kwds):
# begin wxGlade: MyFrame.__init__
@@ -176,6 +191,7 @@
help="radio input file", metavar="FILE")
parser.add_option ("-d", "--decim", type="int", default=250,
help="USRP decimation")
+ parser.add_option("-R", "--rx-subdev-spec", type="subdev",
default=None, help="select USRP Rx side A or B
(default=first one with a daughterboard)")
(options, args) = parser.parse_args ()
self.usrp_center = options.ddc_freq
@@ -226,14 +242,13 @@
else: self.PLAY_FROM_USRP = False
if self.PLAY_FROM_USRP:
- # these can be updated for flexible m'board support
- self.src = usrp.source_c(0,options.decim)
- mux = gru.hexint(0xf0f0f0f0)
- self.src.set_nchannels(1)
- self.src.set_pga(0,0)
- self.src.set_mux(mux)
- self.src.set_rx_freq(0,-self.usrp_center)
- self.tune_offset = -self.usrp_center - self.src.rx_freq(0)
+ self.src = usrp.source_c(decim_rate=options.decim)
+ if options.rx_subdev_spec is None:
+ options.rx_subdev_spec = pick_subdevice(self.src)
+ self.src.set_mux(usrp.determine_rx_mux_value(self.src,
options.rx_subdev_spec))
+ self.subdev = usrp.selected_subdev(self.src, options.rx_subdev_spec)
+ self.src.tune(0, self.subdev, self.usrp_center)
+ self.tune_offset = 0 # -self.usrp_center - self.src.rx_freq(0)
else:
self.src = gr.file_source (gr.sizeof_gr_complex,options.input_file)
@@ -263,7 +278,7 @@
self.audio_filter = gr.fir_filter_ccc ( 1, audio_coeffs)
- # Main +-16Khz spectrum display
+ # Main +/- 16Khz spectrum display
self.fft = fftsink.fft_sink_c (self.fg, self.panel_2, fft_size=512,
sample_rate=self.af_sample_rate, average=True, size=(640,240))
# AM Sync carrier
@@ -614,7 +629,7 @@
def set_pga(self,event):
if self.PLAY_FROM_USRP:
- self.src.set_pga(0,self.slider_5.GetValue())
+ self.subdev.set_gain(self.slider_5.GetValue())
def slide_tune(self, event):
self.frequency = (self.f_slider_scale * self.slider_3.GetValue()) +
self.f_slider_offset
@@ -720,7 +735,7 @@
if self.button_12.GetValue():
self.auto_antenna_tune()
if self.AM_mode:
- self.xlate.set_center_freq ( self.usrp_center - (
self.frequency - self.tune_offset ) - 7.5e3 )
+ self.xlate.set_center_freq ( self.usrp_center - (
self.frequency - self.tune_offset - 7.5e3 ))
else:
self.xlate.set_center_freq ( self.usrp_center - (
self.frequency - self.tune_offset ))
Index: hfx_help
===================================================================
RCS file: /sources/gnuradio/gnuradio-examples/python/apps/hf_explorer/hfx_help,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- hfx_help 29 Dec 2005 22:17:51 -0000 1.2
+++ hfx_help 10 Jul 2006 21:04:07 -0000 1.3
@@ -115,9 +115,7 @@
Mode:
Demodulation modes are chosen by clicking on the buttons for
- Lower Sideband, Upper Sideband, AM or two versions of Independent
- Sideband. One ISB puts LSB in one ear and USB in the other, and
- the other ISB is the opposite.
+ Lower Sideband, Upper Sideband, or AM.
PGA:
@@ -134,17 +132,6 @@
or skip through annoying AM commercials.
- Status Bar:
-
- Frequency, volume and filter are displayed at the bottom of the
- HFX window. Also, for rapid frequency spotting, when moving the mouse
- over the display a 'tooltip' opens up at the bottom with an
- accurate frequency readout. When a desired frequency is shown
- in the 'tooltip', clicking on the display sets the demod frequency
- to that frequency. After clicking you have to move the mouse
- out of the display and back to get the tooltip back.
-
-
Antennas and Preamps:
The USRP Basic RX board is not sensitive enough for anything but
@@ -189,5 +176,5 @@
--Good luck and happy LW/MW/SW Exploring.
Chuck
- address@hidden
+ address@hidden
Index: hfx.py
===================================================================
RCS file: hfx.py
diff -N hfx.py
--- hfx.py 20 Dec 2005 22:12:01 -0000 1.1
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,998 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: UTF-8 -*-
-# generated by wxGlade 0.3.5.1 on Tue Jun 14 11:32:06 2005
-#
-# Copyright 2005 Free Software Foundation, Inc.
-#
-# This file is part of GNU Radio
-#
-# GNU Radio is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-#
-# GNU Radio is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with GNU Radio; see the file COPYING. If not, write to
-# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-# Boston, MA 02111-1307, USA.
-#
-
-WEB_CONTROL = False
-
-import os, wx, sys
-import wx.lib.evtmgr as em
-from gnuradio.wxgui import powermate
-from gnuradio import gr
-from gnuradio import audio
-from gnuradio import eng_notation
-from gnuradio.eng_option import eng_option
-from optparse import OptionParser
-from gnuradio.wxgui import fftsink
-from weaver_isb_am1_usrp4 import * # main radio guts
-
-ID_BUTTON_1 = wx.NewId()
-ID_BUTTON_2 = wx.NewId()
-ID_BUTTON_3 = wx.NewId()
-ID_BUTTON_4 = wx.NewId()
-ID_BUTTON_5 = wx.NewId()
-ID_BUTTON_6 = wx.NewId()
-ID_BUTTON_7 = wx.NewId()
-ID_BUTTON_8 = wx.NewId()
-ID_BUTTON_9 = wx.NewId()
-ID_BUTTON_10 = wx.NewId()
-ID_BUTTON_11 = wx.NewId()
-ID_BUTTON_12 = wx.NewId()
-ID_BUTTON_13 = wx.NewId()
-ID_BUTTON_14 = wx.NewId()
-ID_BUTTON_15 = wx.NewId()
-ID_BUTTON_16 = wx.NewId()
-ID_BUTTON_17 = wx.NewId()
-ID_BUTTON_18 = wx.NewId()
-ID_BUTTON_19 = wx.NewId()
-ID_BUTTON_20 = wx.NewId()
-ID_BAND = wx.NewId()
-ID_SLIDER_1 = wx.NewId()
-ID_SLIDER_2 = wx.NewId()
-ID_SLIDER_3 = wx.NewId()
-ID_SLIDER_4 = wx.NewId()
-ID_ABOUT = wx.NewId()
-ID_HELP = wx.NewId()
-ID_EXIT = wx.NewId()
-ID_SPINFREQ = wx.NewId()
-
-
-class MyDialog(wx.Dialog):
- def __init__(self, *args, **kwds):
- # begin wxGlade: MyDialog.__init__
- kwds["style"] = wx.DEFAULT_DIALOG_STYLE
- wx.Dialog.__init__(self, *args, **kwds)
- self.text_ctrl_10 = wx.TextCtrl(self, -1, "",
style=wx.TE_MULTILINE|wx.TE_READONLY)
- fh = open("hfx_help","r")
- helptext = fh.read()
- fh.close()
- self.text_ctrl_10.SetValue(helptext)
- self.__set_properties()
- self.__do_layout()
- # end wxGlade
-
- def __set_properties(self):
- # begin wxGlade: MyDialog.__set_properties
- self.SetTitle("HFX Help")
- self.SetSize((500, 610))
- self.text_ctrl_10.SetSize((500, 600))
- # end wxGlade
-
- def __do_layout(self):
- # begin wxGlade: MyDialog.__do_layout
- sizer_7 = wx.BoxSizer(wx.VERTICAL)
- sizer_7.Add(self.text_ctrl_10, 0, wx.FIXED_MINSIZE, 0)
- self.SetAutoLayout(True)
- self.SetSizer(sizer_7)
- self.Layout()
- # end wxGlade
-
-# end of class MyDialog
-
-
-class MyFrame(wx.Frame):
- def __init__(self, *args, **kwds):
-
- # this will get changed below when edited in wxglade
- self.vol_max = 500 # in self.slider_2, change 100 => self.vol_max
-
- # begin wxGlade: MyFrame.__init__
- kwds["style"] = wx.DEFAULT_FRAME_STYLE
- wx.Frame.__init__(self, *args, **kwds)
-
- # cmd line opts - unfortunately this must come after wx.Frame.__init__
- # so will get clobbered when wxglade generates code
- parser = OptionParser (option_class=eng_option)
- parser.add_option ("-c", "--ddc-freq", type="eng_float", default=3.9e6,
- help="set Rx DDC frequency to FREQ", metavar="FREQ")
- parser.add_option ("-a", "--audio_file", default="",
- help="audio output file", metavar="FILE")
- parser.add_option ("-r", "--radio_file", default="",
- help="radio output file", metavar="FILE")
- parser.add_option ("-i", "--input_file", default="",
- help="radio input file", metavar="FILE")
- parser.add_option ("-d", "--decim", type="int", default=250,
- help="USRP decimation")
- (options, args) = parser.parse_args ()
- if options.input_file == "": self.PLAY_FROM_USRP = True
- else: self.PLAY_FROM_USRP = False
- self.usrp_center = options.ddc_freq
- usb_rate = 64e6 / options.decim
- self.slider_range = usb_rate * 0.9375
- self.f_lo = self.usrp_center - (self.slider_range/2)
- self.f_hi = self.usrp_center + (self.slider_range/2)
-
-
- # Menu Bar
- self.frame_1_menubar = wx.MenuBar()
- self.SetMenuBar(self.frame_1_menubar)
- wxglade_tmp_menu = wx.Menu()
- wxglade_tmp_menu.Append(ID_ABOUT, "About", "About", wx.ITEM_NORMAL)
- wxglade_tmp_menu.Append(ID_EXIT, "Exit", "Exit", wx.ITEM_NORMAL)
- self.frame_1_menubar.Append(wxglade_tmp_menu, "File")
- wxglade_tmp_menu = wx.Menu()
- wxglade_tmp_menu.Append(ID_HELP, "Help", "Help", wx.ITEM_NORMAL)
- self.frame_1_menubar.Append(wxglade_tmp_menu, "Help")
- # Menu Bar end
- self.frame_1_statusbar = self.CreateStatusBar(4, 0)
- self.panel_1 = wx.Panel(self, -1)
- self.text_ctrl_2 = wx.TextCtrl(self, -1, "", style=wx.TE_READONLY)
- self.text_ctrl_3 = wx.TextCtrl(self, -1, "", style=wx.TE_READONLY)
- self.text_ctrl_4 = wx.TextCtrl(self, -1, "", style=wx.TE_READONLY)
- self.text_ctrl_5 = wx.TextCtrl(self, -1, "", style=wx.TE_READONLY)
- self.text_ctrl_6 = wx.TextCtrl(self, -1, "", style=wx.TE_READONLY)
- self.text_ctrl_7 = wx.TextCtrl(self, -1, "", style=wx.TE_READONLY)
- self.text_ctrl_8 = wx.TextCtrl(self, -1, "", style=wx.TE_READONLY)
- self.text_ctrl_9 = wx.TextCtrl(self, -1, "", style=wx.TE_READONLY)
- self.label_2 = wx.StaticText(self, -1, "Center Freq")
- self.button_12 = wx.ToggleButton(self, ID_BUTTON_12, "Set")
- self.button_13 = wx.Button(self, ID_BUTTON_13, "B1")
- self.button_14 = wx.Button(self, ID_BUTTON_14, "B2")
- self.button_15 = wx.Button(self, ID_BUTTON_15, "B3")
- self.button_16 = wx.Button(self, ID_BUTTON_16, "B4")
- self.button_17 = wx.Button(self, ID_BUTTON_17, "B5")
- self.button_18 = wx.Button(self, ID_BUTTON_18, "B6")
- self.button_19 = wx.Button(self, ID_BUTTON_19, "B7")
- self.button_20 = wx.Button(self, ID_BUTTON_20, "B8")
- self.text_ctrl_1 = wx.TextCtrl(self, ID_BAND, "",
style=wx.TE_PROCESS_ENTER)
- self.button_1 = wx.ToggleButton(self, ID_BUTTON_1, "Frequency")
- self.slider_1 = wx.Slider(self, ID_SLIDER_1, 0, 0, 6000)
- self.spin_ctrl_1 = wx.SpinCtrl(self, ID_SPINFREQ, "", min=3600000,
max=4000000)
- self.button_2 = wx.ToggleButton(self, ID_BUTTON_2, "Volume")
- self.slider_2 = wx.Slider(self, ID_SLIDER_2, 0, 0, self.vol_max)
- self.panel_2 = wx.Panel(self, -1)
- self.button_7 = wx.ToggleButton(self, ID_BUTTON_7, "LSB")
- self.button_8 = wx.ToggleButton(self, ID_BUTTON_8, "USB")
- self.button_9 = wx.ToggleButton(self, ID_BUTTON_9, "AM")
- self.button_3 = wx.ToggleButton(self, ID_BUTTON_3, "Filter")
- self.slider_3 = wx.Slider(self, ID_SLIDER_3, 0, 0, 30)
- self.panel_3 = wx.Panel(self, -1)
- self.panel_4 = wx.Panel(self, -1)
- self.button_10 = wx.ToggleButton(self, ID_BUTTON_10, "ISB1")
- self.button_11 = wx.ToggleButton(self, ID_BUTTON_11, "ISB2")
- self.button_4 = wx.ToggleButton(self, ID_BUTTON_4, "Time")
- self.button_5 = wx.Button(self, ID_BUTTON_5, "Rewind")
- self.button_6 = wx.Button(self, ID_BUTTON_6, "Fast Fwd")
- self.panel_5 = wx.Panel(self, -1)
- self.label_1 = wx.StaticText(self, -1, "Programmable \nGain
Amplifier ")
- self.slider_4 = wx.Slider(self, ID_SLIDER_4, 0, 0, 20,
style=wx.SL_HORIZONTAL|wx.SL_LABELS)
- self.panel_7 = wx.Panel(self, -1)
-
- self.__set_properties()
- self.__do_layout()
- # end wxGlade
-
- wx.ToolTip.Enable(True)
- wx.ToolTip.SetDelay(0)
-
- self.active_button = 1
- self.button_1.SetValue(True)
-
- # radio variables, initial conditions
- self.frequency = self.usrp_center
- # these map the frequency slider (0-6000) to the actual range
- self.f_slider_offset = self.f_lo
- self.f_slider_scale = 10000/options.decim
- self.spin_ctrl_1.SetRange(self.f_lo,self.f_hi)
- self.text_ctrl_1.SetValue(str(int(self.usrp_center)))
- self.slider_4.SetValue(0) # self.src.set_pga(0) in radio module
-
-
self.slider_1.SetValue((self.frequency-self.f_slider_offset)/self.f_slider_scale)
- self.spin_ctrl_1.SetValue(int(self.frequency))
- msg = "Frequency: %s" % (eng_notation.num_to_str(self.frequency))
- self.frame_1_statusbar.SetStatusText(msg,1)
-
- self.volume = 0
- self.slider_2.SetValue(self.volume)
- msg = "Volume: %s" % (eng_notation.num_to_str(self.volume))
- self.frame_1_statusbar.SetStatusText(msg,2)
-
- self.filter = 24
- self.slider_3.SetValue(24)
- # calculate filters
- af_sample_rate = 32e3
- self.audio_lpf_x = []
- self.fkey = []
- for co in range(600,3601,100):
- self.fkey += [co]
-
fc=gr.firdes.low_pass(1.0,af_sample_rate,co,300,gr.firdes.WIN_HAMMING)
- self.audio_lpf_x += [fc]
- # audio_lpf_x[0] is 600, [1] is 900, [2] is 1200, etc
-
- rf_sample_rate = 64000000 / options.decim
- self.xlate_filter = 30
- self.xlate_filter_x = []
- self.xlate_fkey = []
- for co in range(2000, 5001, 100):
- self.xlate_fkey += [co]
- fc =
gr.firdes.low_pass(1.0,rf_sample_rate,co,2000,gr.firdes.WIN_HAMMING)
- self.xlate_filter_x += [fc]
- # xlate_filter_x[0] is 2000, [1] is 2100, [29] is 5000
-
- # start with ssb filter
- msg = "Filter: %s" % (eng_notation.num_to_str(self.fkey[self.filter]))
- self.frame_1_statusbar.SetStatusText(msg,3)
- # 0=usb, 1=lsb, 2=am, 3=isb1, 4=isb2
- self.mode = 1
- self.button_7.SetValue(True)
-
- # xlate_L taps for ssb or am modes
- self.xlate_taps_ssb = gr.firdes.low_pass ( \
- 1.0, usb_rate, 20e3, 10e3, gr.firdes.WIN_HAMMING )
- self.xlate_taps_am = gr.firdes.low_pass ( \
- 1.0, usb_rate, 6e3, 2e3, gr.firdes.WIN_HAMMING )
- # xlate_L offset for ssb or am modes
-
- #setup for bandswitching
- self.b1 = 3900000
- self.b2 = 7200000
- self.b3 = 14200000
- self.b4 = 6100000
- self.b5 = 9750000
- self.b6 = 11900000
- self.b7 = 800000
- self.b8 = 1400000
- self.text_ctrl_2.SetValue(eng_notation.num_to_str(self.b1))
- self.text_ctrl_3.SetValue(eng_notation.num_to_str(self.b2))
- self.text_ctrl_4.SetValue(eng_notation.num_to_str(self.b3))
- self.text_ctrl_5.SetValue(eng_notation.num_to_str(self.b4))
- self.text_ctrl_6.SetValue(eng_notation.num_to_str(self.b5))
- self.text_ctrl_7.SetValue(eng_notation.num_to_str(self.b6))
- self.text_ctrl_8.SetValue(eng_notation.num_to_str(self.b7))
- self.text_ctrl_9.SetValue(eng_notation.num_to_str(self.b8))
-
- wx.EVT_SLIDER(self,ID_SLIDER_1,self.slide_event)
- wx.EVT_SLIDER(self,ID_SLIDER_2,self.slide_event)
- wx.EVT_SLIDER(self,ID_SLIDER_3,self.slide_event)
- wx.EVT_SLIDER(self,ID_SLIDER_4,self.set_pga)
- wx.EVT_SPINCTRL(self, ID_SPINFREQ, self.spin_event)
-
- wx.EVT_TOGGLEBUTTON(self, ID_BUTTON_1, self.on_button)
- wx.EVT_TOGGLEBUTTON(self, ID_BUTTON_2, self.on_button)
- wx.EVT_TOGGLEBUTTON(self, ID_BUTTON_3, self.on_button)
- wx.EVT_TOGGLEBUTTON(self, ID_BUTTON_4, self.on_button)
-
- wx.EVT_BUTTON(self, ID_BUTTON_5, self.on_tbutton)
- wx.EVT_BUTTON(self, ID_BUTTON_6, self.on_tbutton)
-
- wx.EVT_TOGGLEBUTTON(self, ID_BUTTON_7, self.on_mbutton)
- wx.EVT_TOGGLEBUTTON(self, ID_BUTTON_8, self.on_mbutton)
- wx.EVT_TOGGLEBUTTON(self, ID_BUTTON_9, self.on_mbutton)
- wx.EVT_TOGGLEBUTTON(self, ID_BUTTON_10, self.on_mbutton)
- wx.EVT_TOGGLEBUTTON(self, ID_BUTTON_11, self.on_mbutton)
-
- #bandswitch buttons
- wx.EVT_BUTTON(self, ID_BUTTON_13, self.bandswitch)
- wx.EVT_BUTTON(self, ID_BUTTON_14, self.bandswitch)
- wx.EVT_BUTTON(self, ID_BUTTON_15, self.bandswitch)
- wx.EVT_BUTTON(self, ID_BUTTON_16, self.bandswitch)
- wx.EVT_BUTTON(self, ID_BUTTON_17, self.bandswitch)
- wx.EVT_BUTTON(self, ID_BUTTON_18, self.bandswitch)
- wx.EVT_BUTTON(self, ID_BUTTON_19, self.bandswitch)
- wx.EVT_BUTTON(self, ID_BUTTON_20, self.bandswitch)
- wx.EVT_TEXT_ENTER(self, ID_BAND, self.band)
-
- wx.EVT_MENU(self, ID_EXIT, self.TimeToQuit)
- wx.EVT_MENU(self, ID_ABOUT, self.OnAbout)
- wx.EVT_MENU(self, ID_HELP, self.OnHelp)
-
- POWERMATE = True
- try:
- self.pm = powermate.powermate(self)
- except:
- sys.stderr.write("Unable to find PowerMate or Contour Shuttle\n")
- POWERMATE = False
-
- if POWERMATE:
- self.brightness = 0
- powermate.EVT_POWERMATE_ROTATE(self, self.on_rotate)
- powermate.EVT_POWERMATE_BUTTON(self, self.on_pmButton)
-
- scale = self.volume / 10e3
- # call to Radio guts
- (self.fg, self.tune_offset, self.xlate_L, self.xlate_U, self.scale_L, \
- self.scale_U, self.src, self.audio_lpf_L, self.audio_lpf_U, \
- self.sel_lsb_0, self.sel_lsb_1, self.sel_usb_0, self.sel_usb_1, \
- self.sel_am, self.scale_am) = build_graph \
- (self.frequency, scale, options.decim, self.usrp_center, \
- options.audio_file, options.radio_file, options.input_file)
- if self.fg.is_running():
- print "fg is running"
-
- # add an fft display to panel_7, nice size, avg on and weaver IF offset
- self.fft = fftsink.fft_sink_c (self.fg, self.panel_7, fft_size=512,
sample_rate=af_sample_rate, baseband_freq=-1.8e3, average=True, size=(680,240))
- self.fg.connect (self.xlate_L, self.fft)
-
-
- # for mouse position reporting on fft display
- em.eventManager.Register(self.Mouse, wx.EVT_MOTION, self.fft.win)
- # and left click to re-tune
- em.eventManager.Register(self.Click, wx.EVT_LEFT_DOWN, self.fft.win)
-
- self.fg.start()
-
-
- # start a timer to check for web commands
- if WEB_CONTROL:
- self.timer = UpdateTimer(self, 1000) # every 1000 mSec, 1 Sec
- self.timer2 = UpdateTimer2(self, 5000) # 5 seconds update web state
-
- def __set_properties(self):
- # begin wxGlade: MyFrame.__set_properties
- self.SetTitle("GNU Radio HF Explorer")
- self.frame_1_statusbar.SetStatusWidths([-1, -1, -1, -1])
- # statusbar fields
- frame_1_statusbar_fields = ["", "Frequency", "Volume", "Filter"]
- for i in range(len(frame_1_statusbar_fields)):
- self.frame_1_statusbar.SetStatusText(frame_1_statusbar_fields[i],
i)
- self.text_ctrl_2.SetSize((70, 25))
- self.text_ctrl_3.SetSize((70, 25))
- self.text_ctrl_4.SetSize((70, 25))
- self.text_ctrl_5.SetSize((70, 25))
- self.text_ctrl_6.SetSize((70, 25))
- self.text_ctrl_7.SetSize((70, 25))
- self.text_ctrl_8.SetSize((70, 25))
- self.text_ctrl_9.SetSize((70, 25))
- self.button_12.SetSize((45, 30))
- self.button_13.SetSize((45, 30))
- self.button_14.SetSize((45, 30))
- self.button_15.SetSize((45, 30))
- self.button_16.SetSize((45, 30))
- self.button_17.SetSize((45, 30))
- self.button_18.SetSize((45, 30))
- self.button_19.SetSize((45, 30))
- self.button_20.SetSize((45, 30))
- self.slider_1.SetSize((500, 25))
- self.slider_2.SetSize((200, 25))
- self.slider_3.SetSize((200, 25))
- self.slider_4.SetSize((200, 40))
- self.panel_7.SetSize((680, 240))
- # end wxGlade
-
- def __do_layout(self):
- # begin wxGlade: MyFrame.__do_layout
- sizer_1 = wx.BoxSizer(wx.VERTICAL)
- grid_sizer_1 = wx.FlexGridSizer(2, 1, 0, 0)
- sizer_2 = wx.BoxSizer(wx.VERTICAL)
- sizer_6 = wx.BoxSizer(wx.HORIZONTAL)
- sizer_5 = wx.BoxSizer(wx.HORIZONTAL)
- sizer_4 = wx.BoxSizer(wx.HORIZONTAL)
- sizer_3 = wx.BoxSizer(wx.HORIZONTAL)
- grid_sizer_2 = wx.FlexGridSizer(2, 10, 0, 0)
- grid_sizer_2.Add(self.panel_1, 1, wx.EXPAND, 0)
- grid_sizer_2.Add(self.text_ctrl_2, 0, wx.FIXED_MINSIZE, 0)
- grid_sizer_2.Add(self.text_ctrl_3, 0, wx.FIXED_MINSIZE, 0)
- grid_sizer_2.Add(self.text_ctrl_4, 0, wx.FIXED_MINSIZE, 0)
- grid_sizer_2.Add(self.text_ctrl_5, 0, wx.FIXED_MINSIZE, 0)
- grid_sizer_2.Add(self.text_ctrl_6, 0, wx.FIXED_MINSIZE, 0)
- grid_sizer_2.Add(self.text_ctrl_7, 0, wx.FIXED_MINSIZE, 0)
- grid_sizer_2.Add(self.text_ctrl_8, 0, wx.FIXED_MINSIZE, 0)
- grid_sizer_2.Add(self.text_ctrl_9, 0, wx.FIXED_MINSIZE, 0)
- grid_sizer_2.Add(self.label_2, 0, wx.FIXED_MINSIZE, 0)
- grid_sizer_2.Add(self.button_12, 0, wx.FIXED_MINSIZE, 0)
- grid_sizer_2.Add(self.button_13, 0,
wx.ALIGN_CENTER_HORIZONTAL|wx.FIXED_MINSIZE, 0)
- grid_sizer_2.Add(self.button_14, 0,
wx.ALIGN_CENTER_HORIZONTAL|wx.FIXED_MINSIZE, 0)
- grid_sizer_2.Add(self.button_15, 0,
wx.ALIGN_CENTER_HORIZONTAL|wx.FIXED_MINSIZE, 0)
- grid_sizer_2.Add(self.button_16, 0,
wx.ALIGN_CENTER_HORIZONTAL|wx.FIXED_MINSIZE, 0)
- grid_sizer_2.Add(self.button_17, 0,
wx.ALIGN_CENTER_HORIZONTAL|wx.FIXED_MINSIZE, 0)
- grid_sizer_2.Add(self.button_18, 0,
wx.ALIGN_CENTER_HORIZONTAL|wx.FIXED_MINSIZE, 0)
- grid_sizer_2.Add(self.button_19, 0,
wx.ALIGN_CENTER_HORIZONTAL|wx.FIXED_MINSIZE, 0)
- grid_sizer_2.Add(self.button_20, 0,
wx.ALIGN_CENTER_HORIZONTAL|wx.FIXED_MINSIZE, 0)
- grid_sizer_2.Add(self.text_ctrl_1, 0,
wx.ALIGN_CENTER_VERTICAL|wx.FIXED_MINSIZE, 0)
- sizer_2.Add(grid_sizer_2, 1, wx.EXPAND, 0)
- sizer_3.Add(self.button_1, 0,
wx.ALIGN_CENTER_VERTICAL|wx.FIXED_MINSIZE, 0)
- sizer_3.Add(self.slider_1, 0,
wx.ALIGN_CENTER_VERTICAL|wx.FIXED_MINSIZE, 0)
- sizer_3.Add(self.spin_ctrl_1, 0,
wx.ALIGN_CENTER_VERTICAL|wx.FIXED_MINSIZE, 0)
- sizer_2.Add(sizer_3, 1, wx.EXPAND, 0)
- sizer_4.Add(self.button_2, 0,
wx.ALIGN_CENTER_VERTICAL|wx.FIXED_MINSIZE, 0)
- sizer_4.Add(self.slider_2, 0,
wx.ALIGN_CENTER_VERTICAL|wx.FIXED_MINSIZE, 0)
- sizer_4.Add(self.panel_2, 1, wx.EXPAND, 0)
- sizer_4.Add(self.button_7, 0,
wx.ALIGN_CENTER_VERTICAL|wx.FIXED_MINSIZE, 0)
- sizer_4.Add(self.button_8, 0,
wx.ALIGN_CENTER_VERTICAL|wx.FIXED_MINSIZE, 0)
- sizer_4.Add(self.button_9, 0,
wx.ALIGN_CENTER_VERTICAL|wx.FIXED_MINSIZE, 0)
- sizer_2.Add(sizer_4, 1, wx.EXPAND, 0)
- sizer_5.Add(self.button_3, 0,
wx.ALIGN_CENTER_VERTICAL|wx.FIXED_MINSIZE, 0)
- sizer_5.Add(self.slider_3, 0,
wx.ALIGN_CENTER_VERTICAL|wx.FIXED_MINSIZE, 0)
- sizer_5.Add(self.panel_3, 1, wx.EXPAND, 0)
- sizer_5.Add(self.panel_4, 1, wx.EXPAND, 0)
- sizer_5.Add(self.button_10, 0,
wx.ALIGN_CENTER_VERTICAL|wx.FIXED_MINSIZE, 0)
- sizer_5.Add(self.button_11, 0,
wx.ALIGN_CENTER_VERTICAL|wx.FIXED_MINSIZE, 0)
- sizer_2.Add(sizer_5, 1, wx.EXPAND, 0)
- sizer_6.Add(self.button_4, 0,
wx.ALIGN_CENTER_VERTICAL|wx.FIXED_MINSIZE, 0)
- sizer_6.Add(self.button_5, 0,
wx.ALIGN_CENTER_VERTICAL|wx.FIXED_MINSIZE, 0)
- sizer_6.Add(self.button_6, 0,
wx.ALIGN_CENTER_VERTICAL|wx.FIXED_MINSIZE, 0)
- sizer_6.Add(self.panel_5, 1, wx.EXPAND, 0)
- sizer_6.Add(self.label_1, 0,
wx.ALIGN_CENTER_VERTICAL|wx.FIXED_MINSIZE, 0)
- sizer_6.Add(self.slider_4, 0,
wx.ALIGN_CENTER_VERTICAL|wx.FIXED_MINSIZE, 0)
- sizer_2.Add(sizer_6, 1, wx.EXPAND, 0)
- grid_sizer_1.Add(sizer_2, 1, wx.EXPAND, 0)
- grid_sizer_1.Add(self.panel_7, 1, wx.EXPAND, 0)
- sizer_1.Add(grid_sizer_1, 1, wx.EXPAND, 0)
- self.SetAutoLayout(True)
- self.SetSizer(sizer_1)
- sizer_1.Fit(self)
- sizer_1.SetSizeHints(self)
- self.Layout()
- # end wxGlade
-
- def slide_event(self,evt):
- value = evt.GetInt()
- id = evt.GetId()
- if id == ID_SLIDER_1:
- self.frequency = (self.f_slider_scale * self.slider_1.GetValue()) +
self.f_slider_offset
- msg = "Frequency: %s" % (eng_notation.num_to_str(self.frequency))
- self.frame_1_statusbar.SetStatusText (msg,1)
- self.spin_ctrl_1.SetValue(self.frequency)
- if self.mode == 2:
- self.xlate_L.set_center_freq ( self.usrp_center - ( self.frequency
- self.tune_offset ) + 960 )
- else:
- self.xlate_L.set_center_freq ( self.usrp_center - (
self.frequency - self.tune_offset ) + 1.8e3 )
- self.xlate_U.set_center_freq ( self.usrp_center - (
self.frequency - self.tune_offset ) - 1.8e3 )
- elif id == ID_SLIDER_2:
- self.volume = self.slider_2.GetValue()
- msg = "Volume: %s" % (eng_notation.num_to_str(self.volume))
- self.frame_1_statusbar.SetStatusText (msg,2)
- self.scale_L.set_k(self.volume/10e3)
- self.scale_U.set_k(self.volume/10e3)
- self.scale_am.set_k(self.volume/10e4)
- elif id == ID_SLIDER_3:
- filter = self.slider_3.GetValue()
- if self.mode == 2:
- self.xlate_filter = filter
- msg = "Filter: %s" %
(eng_notation.num_to_str(self.xlate_fkey[self.xlate_filter]))
- self.frame_1_statusbar.SetStatusText (msg,3)
- self.xlate_L.set_taps(self.xlate_filter_x[self.xlate_filter])
- else:
- self.filter = filter
- msg = "Filter: %s" %
(eng_notation.num_to_str(self.fkey[self.filter]))
- self.frame_1_statusbar.SetStatusText (msg,3)
- self.audio_lpf_L.set_taps(self.audio_lpf_x[self.filter])
- self.audio_lpf_U.set_taps(self.audio_lpf_x[self.filter])
-
- def set_pga(self, evt):
- if self.PLAY_FROM_USRP:
- self.src.set_pga(0,self.slider_4.GetValue())
-
- def bandswitch(self, evt):
- button = evt.GetId()
- if self.button_12.GetValue() == True:
- if button == ID_BUTTON_13:
- self.b1 = eng_notation.str_to_num(self.text_ctrl_1.GetValue())
- self.text_ctrl_2.SetValue(eng_notation.num_to_str(self.b1))
- elif button == ID_BUTTON_14:
- self.b2 = eng_notation.str_to_num(self.text_ctrl_1.GetValue())
- self.text_ctrl_3.SetValue(eng_notation.num_to_str(self.b2))
- elif button == ID_BUTTON_15:
- self.b3 = eng_notation.str_to_num(self.text_ctrl_1.GetValue())
- self.text_ctrl_4.SetValue(eng_notation.num_to_str(self.b3))
- elif button == ID_BUTTON_16:
- self.b4 = eng_notation.str_to_num(self.text_ctrl_1.GetValue())
- self.text_ctrl_5.SetValue(eng_notation.num_to_str(self.b4))
- elif button == ID_BUTTON_17:
- self.b5 = eng_notation.str_to_num(self.text_ctrl_1.GetValue())
- self.text_ctrl_6.SetValue(eng_notation.num_to_str(self.b5))
- elif button == ID_BUTTON_18:
- self.b6 = eng_notation.str_to_num(self.text_ctrl_1.GetValue())
- self.text_ctrl_7.SetValue(eng_notation.num_to_str(self.b6))
- elif button == ID_BUTTON_19:
- self.b7 = eng_notation.str_to_num(self.text_ctrl_1.GetValue())
- self.text_ctrl_8.SetValue(eng_notation.num_to_str(self.b7))
- elif button == ID_BUTTON_20:
- self.b8 = eng_notation.str_to_num(self.text_ctrl_1.GetValue())
- self.text_ctrl_9.SetValue(eng_notation.num_to_str(self.b8))
- self.button_12.SetValue(False)
- else:
- if button == ID_BUTTON_13: self.usrp_center = self.b1
- elif button == ID_BUTTON_14: self.usrp_center = self.b2
- elif button == ID_BUTTON_15: self.usrp_center = self.b3
- elif button == ID_BUTTON_16: self.usrp_center = self.b4
- elif button == ID_BUTTON_17: self.usrp_center = self.b5
- elif button == ID_BUTTON_18: self.usrp_center = self.b6
- elif button == ID_BUTTON_19: self.usrp_center = self.b7
- elif button == ID_BUTTON_20: self.usrp_center = self.b8
- self.f_lo = self.usrp_center - (self.slider_range/2.)
- self.f_hi = self.usrp_center + (self.slider_range/2.)
- self.frequency = self.usrp_center
- self.slider_1.SetValue(3000)
- self.f_slider_offset = self.f_lo
- self.spin_ctrl_1.SetRange(self.f_lo,self.f_hi)
- self.spin_ctrl_1.SetValue(self.usrp_center)
- self.text_ctrl_1.SetValue(str(int(self.usrp_center)))
- self.src.set_rx_freq(0,-self.usrp_center)
- self.tune_offset = -self.usrp_center - self.src.rx_freq(0)
- msg = "Frequency: %s" % (eng_notation.num_to_str(self.frequency))
- self.frame_1_statusbar.SetStatusText(msg,1)
- if self.mode == 2:
- self.xlate_L.set_center_freq ( self.usrp_center - ( self.frequency
- self.tune_offset ) + 960 )
- else:
- self.xlate_L.set_center_freq ( self.usrp_center - ( self.frequency
- self.tune_offset ) + 1.8e3 )
- self.xlate_U.set_center_freq ( self.usrp_center - ( self.frequency
- self.tune_offset ) - 1.8e3 )
-
- def band(self,evt):
- self.usrp_center = eng_notation.str_to_num(self.text_ctrl_1.GetValue())
- self.f_lo = self.usrp_center - (self.slider_range/2.)
- self.f_hi = self.usrp_center + (self.slider_range/2.)
- self.frequency = self.usrp_center
- self.slider_1.SetValue(3000)
- self.f_slider_offset = self.f_lo
- self.spin_ctrl_1.SetRange(self.f_lo,self.f_hi)
- self.spin_ctrl_1.SetValue(self.usrp_center)
- self.src.set_rx_freq(0,-self.usrp_center)
- self.tune_offset = -self.usrp_center - self.src.rx_freq(0)
- msg = "Frequency: %s" % (eng_notation.num_to_str(self.frequency))
- self.frame_1_statusbar.SetStatusText(msg,1)
- if self.mode == 2:
- self.xlate_L.set_center_freq ( self.usrp_center - ( self.frequency
- self.tune_offset ) + 960 )
- else:
- self.xlate_L.set_center_freq ( self.usrp_center - ( self.frequency -
self.tune_offset ) + 1.8e3 )
- self.xlate_U.set_center_freq ( self.usrp_center - ( self.frequency -
self.tune_offset ) - 1.8e3 )
-
-
- def on_button(self, evt):
- id = evt.GetId()
- if id == ID_BUTTON_1:
- self.active_button = 1
- self.button_2.SetValue(False)
- self.button_3.SetValue(False)
- self.button_4.SetValue(False)
- elif id == ID_BUTTON_2:
- self.active_button = 2
- self.button_1.SetValue(False)
- self.button_3.SetValue(False)
- self.button_4.SetValue(False)
- elif id == ID_BUTTON_3:
- self.active_button = 3
- self.button_1.SetValue(False)
- self.button_2.SetValue(False)
- self.button_4.SetValue(False)
- elif id == ID_BUTTON_4:
- self.active_button = 4
- self.button_1.SetValue(False)
- self.button_2.SetValue(False)
- self.button_3.SetValue(False)
-
- def on_tbutton(self, evt):
- if self.PLAY_FROM_USRP == False:
- id = evt.GetId()
- if id == ID_BUTTON_5:
- self.src.seek(-10000000,gr.SEEK_CUR)
- elif id == ID_BUTTON_6:
- self.src.seek(1000000,gr.SEEK_CUR)
-
- def on_mbutton(self, evt):
- id = evt.GetId()
- if id == ID_BUTTON_7: # LSB in both ears
- self.mode = 1
- self.button_8.SetValue(False)
- self.button_9.SetValue(False)
- self.button_10.SetValue(False)
- self.button_11.SetValue(False)
- self.sel_lsb_0.set_k(1)
- self.sel_lsb_1.set_k(1)
- self.sel_usb_0.set_k(0)
- self.sel_usb_1.set_k(0)
- self.sel_am.set_k(0)
- self.xlate_L.set_taps(self.xlate_taps_ssb)
- self.slider_3.SetValue(self.filter)
- msg = "Filter: %s" %
(eng_notation.num_to_str(self.fkey[self.filter]))
- self.frame_1_statusbar.SetStatusText (msg,3)
- self.xlate_L.set_center_freq ( self.usrp_center - ( self.frequency -
self.tune_offset ) + 1.8e3 )
- self.xlate_U.set_center_freq ( self.usrp_center - ( self.frequency -
self.tune_offset ) - 1.8e3 )
- self.fft.set_baseband_freq(-1.8e3)
-
-
- elif id == ID_BUTTON_8: # USB in both ears
- self.mode = 0
- self.button_7.SetValue(False)
- self.button_9.SetValue(False)
- self.button_10.SetValue(False)
- self.button_11.SetValue(False)
- self.sel_lsb_0.set_k(0)
- self.sel_lsb_1.set_k(0)
- self.sel_usb_0.set_k(1)
- self.sel_usb_1.set_k(1)
- self.sel_am.set_k(0)
- self.xlate_L.set_taps(self.xlate_taps_ssb)
- self.slider_3.SetValue(self.filter)
- msg = "Filter: %s" %
(eng_notation.num_to_str(self.fkey[self.filter]))
- self.frame_1_statusbar.SetStatusText (msg,3)
- self.xlate_L.set_center_freq ( self.usrp_center - ( self.frequency -
self.tune_offset ) + 1.8e3 )
- self.xlate_U.set_center_freq ( self.usrp_center - ( self.frequency -
self.tune_offset ) - 1.8e3 )
- self.fft.set_baseband_freq(-1.8e3)
-
-
- elif id == ID_BUTTON_9: # AM
- self.mode = 2
- self.button_7.SetValue(False)
- self.button_8.SetValue(False)
- self.button_9.SetValue(True)
- self.button_10.SetValue(False)
- self.button_11.SetValue(False)
- self.sel_lsb_0.set_k(0)
- self.sel_lsb_1.set_k(0)
- self.sel_usb_0.set_k(0)
- self.sel_usb_1.set_k(0)
- self.sel_am.set_k(1)
- self.xlate_L.set_taps(self.xlate_filter_x[self.xlate_filter])
- self.slider_3.SetValue(self.xlate_filter)
- msg = "Filter: %s" %
(eng_notation.num_to_str(self.xlate_fkey[self.xlate_filter]))
- self.frame_1_statusbar.SetStatusText (msg,3)
- self.xlate_L.set_center_freq ( self.usrp_center - ( self.frequency -
self.tune_offset ) + 960 )
- self.fft.set_baseband_freq(0)
-
-
- elif id == ID_BUTTON_10: # LSB in one ear and USB in the other
- self.mode = 3
- self.button_7.SetValue(False)
- self.button_8.SetValue(False)
- self.button_9.SetValue(False)
- self.button_11.SetValue(False)
- self.sel_lsb_0.set_k(1)
- self.sel_lsb_1.set_k(0)
- self.sel_usb_0.set_k(0)
- self.sel_usb_1.set_k(1)
- self.sel_am.set_k(0)
- self.xlate_L.set_taps(self.xlate_taps_ssb)
- self.slider_3.SetValue(self.filter)
- msg = "Filter: %s" %
(eng_notation.num_to_str(self.fkey[self.filter]))
- self.frame_1_statusbar.SetStatusText (msg,3)
- self.xlate_L.set_center_freq ( self.usrp_center - ( self.frequency -
self.tune_offset ) + 1.8e3 )
- self.xlate_U.set_center_freq ( self.usrp_center - ( self.frequency -
self.tune_offset ) - 1.8e3 )
- self.fft.set_baseband_freq(-1.8e3)
-
-
- elif id == ID_BUTTON_11: # USB in one ear and LSB in the other
- self.mode = 4
- self.button_7.SetValue(False)
- self.button_8.SetValue(False)
- self.button_9.SetValue(False)
- self.button_10.SetValue(False)
- self.sel_lsb_0.set_k(0)
- self.sel_lsb_1.set_k(1)
- self.sel_usb_0.set_k(1)
- self.sel_usb_1.set_k(0)
- self.sel_am.set_k(0)
- self.xlate_L.set_taps(self.xlate_taps_ssb)
- self.slider_3.SetValue(self.filter)
- msg = "Filter: %s" %
(eng_notation.num_to_str(self.fkey[self.filter]))
- self.frame_1_statusbar.SetStatusText (msg,3)
- self.xlate_L.set_center_freq ( self.usrp_center - ( self.frequency -
self.tune_offset ) + 1.8e3 )
- self.xlate_U.set_center_freq ( self.usrp_center - ( self.frequency -
self.tune_offset ) - 1.8e3 )
- self.fft.set_baseband_freq(-1.8e3)
-
-
- def on_rotate(self, evt):
- if self.active_button == 1:
- new = max(0, min(6000, self.slider_1.GetValue() + evt.delta))
- self.slider_1.SetValue(new)
- self.frequency = (self.f_slider_scale * new) + self.f_slider_offset
- self.spin_ctrl_1.SetValue(self.frequency)
- msg = "Frequency: %s" % (eng_notation.num_to_str(self.frequency))
- self.frame_1_statusbar.SetStatusText(msg,1)
- if self.mode == 2:
- self.xlate_L.set_center_freq ( self.usrp_center - (
self.frequency - self.tune_offset ) + 960 )
- else:
- self.xlate_L.set_center_freq ( self.usrp_center - (
self.frequency - self.tune_offset ) + 1.8e3 )
- self.xlate_U.set_center_freq ( self.usrp_center - (
self.frequency - self.tune_offset ) - 1.8e3 )
-
- elif self.active_button == 2:
- new = max(0, min(self.vol_max, self.slider_2.GetValue() +
evt.delta))
- self.slider_2.SetValue(new)
- self.volume = new
- msg = "Volume: %s" % (eng_notation.num_to_str(self.volume))
- self.frame_1_statusbar.SetStatusText(msg,2)
- self.scale_L.set_k(self.volume/10e3)
- self.scale_U.set_k(self.volume/10e3)
- self.scale_am.set_k(self.volume/10e4)
-
- elif self.active_button == 3:
- new = max(0, min(30, self.slider_3.GetValue() + evt.delta))
- self.slider_3.SetValue(new)
- if self.mode == 2:
- self.xlate_filter = new
- msg = "Filter: %s" %
(eng_notation.num_to_str(self.xlate_fkey[self.xlate_filter]))
- self.frame_1_statusbar.SetStatusText (msg,3)
- self.xlate_L.set_taps(self.xlate_filter_x[self.xlate_filter])
- else:
- self.filter = new
- msg = "Filter: %s" %
(eng_notation.num_to_str(self.fkey[self.filter]))
- self.frame_1_statusbar.SetStatusText(msg,3)
- self.audio_lpf_L.set_taps(self.audio_lpf_x[self.filter])
- self.audio_lpf_U.set_taps(self.audio_lpf_x[self.filter])
-
- elif self.active_button == 4:
- if self.PLAY_FROM_USRP == False:
- if evt.delta == -1:
- self.src.seek(-1000000,gr.SEEK_CUR)
- elif evt.delta == 1:
- self.src.seek(1000000,gr.SEEK_CUR)
-
- def on_pmButton(self, evt):
- if evt.value == 0:
- if self.active_button == 1:
- self.active_button = 2
- self.button_1.SetValue(False)
- self.button_2.SetValue(True)
- self.button_3.SetValue(False)
- self.button_4.SetValue(False)
- elif self.active_button == 2:
- self.active_button = 3
- self.button_1.SetValue(False)
- self.button_2.SetValue(False)
- self.button_3.SetValue(True)
- self.button_4.SetValue(False)
- elif self.active_button == 3:
- if self.PLAY_FROM_USRP == True:
- self.active_button = 1
- self.button_1.SetValue(True)
- self.button_2.SetValue(False)
- self.button_3.SetValue(False)
- self.button_4.SetValue(False)
- else:
- self.active_button = 4
- self.button_1.SetValue(False)
- self.button_2.SetValue(False)
- self.button_3.SetValue(False)
- self.button_4.SetValue(True)
- elif self.active_button == 4:
- self.active_button = 1
- self.button_1.SetValue(True)
- self.button_2.SetValue(False)
- self.button_3.SetValue(False)
- self.button_4.SetValue(False)
-
- def spin_event(self, event):
- self.frequency = self.spin_ctrl_1.GetValue()
-
self.slider_1.SetValue(int((self.frequency-self.f_slider_offset)/self.f_slider_scale))
- msg = "Frequency: %s" % (eng_notation.num_to_str(self.frequency))
- self.frame_1_statusbar.SetStatusText(msg,1)
- if self.mode == 2:
- self.xlate_L.set_center_freq ( self.usrp_center - ( self.frequency -
self.tune_offset ) + 960 )
- else:
- self.xlate_L.set_center_freq ( self.usrp_center - ( self.frequency -
self.tune_offset ) + 1.8e3 )
- self.xlate_U.set_center_freq ( self.usrp_center - ( self.frequency -
self.tune_offset ) - 1.8e3 )
-
- # menubar events
- def TimeToQuit(self, event):
- self.fg.stop()
- self.Close(True)
-
- def OnAbout(self, event):
- dlg = wx.MessageDialog(self, "Listen To\n"
- "GNU/Radio live USRP\n",
- "GNU/Radio Control Panel", wx.OK |
wx.ICON_INFORMATION)
- dlg.ShowModal()
- dlg.Destroy()
-
- def OnHelp(self, event):
- dlg = MyDialog(self)
- dlg.Show()
-
- def Mouse(self,event):
- fRel = ( event.GetX() - 48 ) / 15.2 - 20
- # print eng_notation.num_to_str(self.frequency + (fRel*1e3))
-
self.fft.win.SetToolTip(wx.ToolTip(eng_notation.num_to_str(self.frequency +
(fRel*1e3))))
-
- def Click(self,event):
- fRel = ( event.GetX() - 48 ) / 15.2 - 20
- self.frequency = self.frequency + (fRel*1e3)
- self.spin_ctrl_1.SetValue(int(self.frequency))
-
self.slider_1.SetValue(int((self.frequency-self.f_slider_offset)/self.f_slider_scale))
- msg = "Frequency: %s" % (eng_notation.num_to_str(self.frequency))
- self.frame_1_statusbar.SetStatusText(msg,1)
- if self.mode == 2:
- self.xlate_L.set_center_freq ( self.usrp_center - ( self.frequency -
self.tune_offset ) + 960 )
- else:
- self.xlate_L.set_center_freq ( self.usrp_center - ( self.frequency -
self.tune_offset ) + 1.8e3 )
- self.xlate_U.set_center_freq ( self.usrp_center - ( self.frequency -
self.tune_offset ) - 1.8e3 )
-
-
- # timer events - check for web commands
- def OnUpdate(self):
- cmds = os.listdir("/var/www/cgi-bin/commands/")
- if cmds!=[]:
- if cmds[0]=='chfreq':
- fd=open("/var/www/cgi-bin/commands/chfreq","r")
- new=fd.readline()
- fd.close()
- if new!='':
- os.unlink("/var/www/cgi-bin/commands/chfreq")
- if ( int(new) >= self.f_lo ) & ( int(new) <= self.f_hi ):
- self.frequency = int(new)
- self.slider_1.SetValue(( self.frequency - self.f_slider_offset)
/ self.f_slider_scale )
- self.spin_ctrl_1.SetValue(self.frequency)
- msg = "Frequency: %s" %
(eng_notation.num_to_str(self.frequency))
- self.frame_1_statusbar.SetStatusText(msg,1)
- if self.mode == 2:
- self.xlate_L.set_center_freq ( self.usrp_center - (
self.frequency - self.tune_offset ) + 960 )
- else:
- self.xlate_L.set_center_freq ( self.usrp_center - (
self.frequency - self.tune_offset ) + 1.8e3 )
- self.xlate_U.set_center_freq ( self.usrp_center - (
self.frequency - self.tune_offset ) - 1.8e3 )
-
- if cmds[0]=='chvolume':
- fd=open("/var/www/cgi-bin/commands/chvolume","r")
- new=fd.readline()
- fd.close()
- if new!='':
- os.unlink("/var/www/cgi-bin/commands/chvolume")
- if ( int(new) >= 0 ) & ( int(new) <= self.vol_max ):
- self.volume = int(new)
- self.slider_2.SetValue(self.volume)
- msg = "Volume: %s" % (eng_notation.num_to_str(self.volume))
- self.frame_1_statusbar.SetStatusText(msg,2)
- self.scale_L.set_k(self.volume/10e3)
- self.scale_U.set_k(self.volume/10e3)
- self.scale_am.set_k(self.volume/10e4)
- if cmds[0]=='chfilter':
- fd=open("/var/www/cgi-bin/commands/chfilter","r")
- new=fd.readline()
- fd.close()
- if new!='':
- os.unlink("/var/www/cgi-bin/commands/chfilter")
- if ( int(new) >= 0 ) & ( int(new) <= 30 ):
- self.filter = int(new)
- msg = "Filter: %s" %
(eng_notation.num_to_str(self.fkey[self.filter]))
- self.frame_1_statusbar.SetStatusText(msg,3)
- self.audio_lpf_L.set_taps(self.audio_lpf_x[self.filter])
- self.audio_lpf_U.set_taps(self.audio_lpf_x[self.filter])
-
- if cmds[0]=='chmode':
- fd=open("/var/www/cgi-bin/commands/chmode","r")
- new=fd.readline()
- fd.close()
- if new!='':
- os.unlink("/var/www/cgi-bin/commands/chmode")
- if new == 'lsb\n' :
- self.mode = 1
- self.button_7.SetValue(True)
- self.button_8.SetValue(False)
- self.button_9.SetValue(False)
- self.button_10.SetValue(False)
- self.button_11.SetValue(False)
- self.sel_lsb_0.set_k(1)
- self.sel_lsb_1.set_k(1)
- self.sel_usb_0.set_k(0)
- self.sel_usb_1.set_k(0)
- self.sel_am.set_k(0)
- self.xlate_L.set_taps(self.xlate_taps_ssb)
- self.fft.set_baseband_freq(-1.8e3)
-
- elif new == 'usb\n':
- self.mode = 0
- self.button_7.SetValue(False)
- self.button_8.SetValue(True)
- self.button_9.SetValue(False)
- self.button_10.SetValue(False)
- self.button_11.SetValue(False)
- self.sel_lsb_0.set_k(0)
- self.sel_lsb_1.set_k(0)
- self.sel_usb_0.set_k(1)
- self.sel_usb_1.set_k(1)
- self.sel_am.set_k(0)
- self.xlate_L.set_taps(self.xlate_taps_ssb)
- self.fft.set_baseband_freq(-1.8e3)
-
- elif new == 'am\n':
- self.mode = 2
- self.button_7.SetValue(False)
- self.button_8.SetValue(False)
- self.button_9.SetValue(True)
- self.button_10.SetValue(False)
- self.button_11.SetValue(False)
- self.sel_lsb_0.set_k(0)
- self.sel_lsb_1.set_k(0)
- self.sel_usb_0.set_k(0)
- self.sel_usb_1.set_k(0)
- self.sel_am.set_k(1)
- self.xlate_L.set_taps(self.xlate_taps_am)
- self.fft.set_baseband_freq(-960)
-
- elif new == 'isb1\n':
- self.mode = 3
- self.button_7.SetValue(False)
- self.button_8.SetValue(False)
- self.button_9.SetValue(False)
- self.button_10.SetValue(True)
- self.button_11.SetValue(False)
- self.sel_lsb_0.set_k(1)
- self.sel_lsb_1.set_k(0)
- self.sel_usb_0.set_k(0)
- self.sel_usb_1.set_k(1)
- self.sel_am.set_k(0)
- self.xlate_L.set_taps(self.xlate_taps_ssb)
- self.fft.set_baseband_freq(-1.8e3)
-
- elif new == 'isb2\n':
- self.mode = 4
- self.button_7.SetValue(False)
- self.button_8.SetValue(False)
- self.button_9.SetValue(False)
- self.button_10.SetValue(False)
- self.button_11.SetValue(True)
- self.sel_lsb_0.set_k(0)
- self.sel_lsb_1.set_k(1)
- self.sel_usb_0.set_k(1)
- self.sel_usb_1.set_k(0)
- self.sel_am.set_k(0)
- self.xlate_L.set_taps(self.xlate_taps_ssb)
- self.fft.set_baseband_freq(-1.8e3)
-
- def UpdateWebState(self):
- fh = open("/var/www/cgi-bin/state/freq","w")
- fh.write(str(int(self.frequency))+'\n')
- fh.close()
- fh = open("/var/www/cgi-bin/state/filter","w")
- fh.write(str(self.filter)+'\n')
- fh.close()
- fh = open("/var/www/cgi-bin/state/volume","w")
- fh.write(str(self.volume)+'\n')
- fh.close()
-
-
-# end of class MyFrame
-
-# wx.Timer to check for web updates
-class UpdateTimer(wx.Timer):
- def __init__(self, target, dur=1000):
- wx.Timer.__init__(self)
- self.target = target
- self.Start(dur)
-
- def Notify(self):
- """Called every timer interval"""
- if self.target:
- self.target.OnUpdate()
-
-
-class UpdateTimer2(wx.Timer):
- def __init__(self, target, dur=1000):
- wx.Timer.__init__(self)
- self.target = target
- self.Start(dur)
-
- def Notify(self):
- """Called every timer interval"""
- if self.target:
- self.target.UpdateWebState()
-
-
-
-class MyApp(wx.App):
- def OnInit(self):
- frame = MyFrame(None, -1, "HF Explorer")
- frame.Show(True)
- self.SetTopWindow(frame)
- return True
-
-app = MyApp(0)
-app.MainLoop()
-
Index: weaver_isb_am1_usrp4.py
===================================================================
RCS file: weaver_isb_am1_usrp4.py
diff -N weaver_isb_am1_usrp4.py
--- weaver_isb_am1_usrp4.py 20 Dec 2005 22:12:01 -0000 1.1
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,239 +0,0 @@
-#!/usr/bin/env python
-#
-# Weaver SSB demodulation
-#
-#
-# af_loi
-# |
-# --[lpf2i]---(X)---|
-# | af_mixi |
-# | |
-# signal --[freq xlating]--[split] (+)----- ssb_demod
-# [fir filter ] | | + USB
-# | af_mixq | - LSB
-# --[lpf2q]---(X)---|
-# |
-# af_loq
-#
-# This version uses TWO branches of the above, one for LSB and one for USB
-# and feeds to the right & left audio out for 'stereo' independant side band
-
-from gnuradio import gr, gru
-from gnuradio import audio
-from gnuradio import usrp
-
-
-def build_graph
(freq,scale,usrp_decim,usrp_center,audio_file,radio_file,input_file):
-
- # command line options
- if audio_file == "": SAVE_AUDIO_TO_FILE = False
- else: SAVE_AUDIO_TO_FILE = True
- if radio_file == "": SAVE_RADIO_TO_FILE = False
- else: SAVE_RADIO_TO_FILE = True
- if input_file == "": PLAY_FROM_USRP = True
- else: PLAY_FROM_USRP = False
-
- # If true, this redirects setup of the flow graph to directly
- # send freq-xlated complex RF to stereo-audio. This is used
- # for Digital Radio Mondial (DRM) demodulation on other software
- # like DReaM, or for using external demod software like I2PHD's
- # SDRadio, etc.
- IF_OUTPUT = False
-
- rf_sample_rate = 64000000 / usrp_decim
- af_sample_rate = 32000
- fir_decimation = rf_sample_rate / af_sample_rate
-
- fg = gr.flow_graph ()
-
- if PLAY_FROM_USRP:
- src = usrp.source_c(0,usrp_decim)
- mux = gru.hexint(0xf0f0f0f0)
- src.set_nchannels(1)
- src.set_pga(0,0)
- src.set_mux(mux)
- src.set_rx_freq(0,-usrp_center)
- tune_offset = -usrp_center - src.rx_freq(0)
-
- else:
- src = gr.file_source (gr.sizeof_gr_complex,input_file)
- tune_offset = 2200 # 2200 works for 3.5-4Mhz band
-
-# save radio data to a file
- if SAVE_RADIO_TO_FILE:
- file = gr.file_sink(gr.sizeof_gr_complex, radio_file)
- fg.connect (src, file)
-
- rf_LO_L = usrp_center - ( freq - tune_offset ) + 1.8e3
- rf_LO_U = usrp_center - ( freq - tune_offset ) - 1.82e3
- af_LO = 1.8e3
-
-
- xlate_taps = gr.firdes.low_pass ( \
- 1.0, rf_sample_rate, 20e3, 10e3, gr.firdes.WIN_HAMMING )
-
-# LSB branch
- xlate_L = gr.freq_xlating_fir_filter_ccf ( \
- fir_decimation, xlate_taps, rf_LO_L, rf_sample_rate )
-
- split_L = gr.complex_to_float ()
-
- af_loi_L = gr.sig_source_f (af_sample_rate,gr.GR_COS_WAVE,af_LO,1,0)
- af_loq_L = gr.sig_source_f (af_sample_rate,gr.GR_SIN_WAVE,af_LO,1,0)
-
- lpf2_taps = gr.firdes.low_pass ( \
- 1.0, af_sample_rate, 2e3, 600, gr.firdes.WIN_HAMMING)
- lpf2i_L = gr.fir_filter_fff (1, lpf2_taps)
- lpf2q_L = gr.fir_filter_fff (1, lpf2_taps)
-
- af_mixi_L = gr.multiply_ff ()
- af_mixq_L = gr.multiply_ff ()
-
- sum_L = gr.add_ff () # sub for USB, add for LSB
-
- audio_lpf_coeffs = gr.firdes.low_pass ( \
- 1.0,af_sample_rate,3000,600,gr.firdes.WIN_HAMMING)
- audio_lpf_L = gr.fir_filter_fff (1, audio_lpf_coeffs)
-
- scale_L = gr.multiply_const_ff(scale)
-
-# USB branch
- xlate_U = gr.freq_xlating_fir_filter_ccf ( \
- fir_decimation, xlate_taps, rf_LO_U, rf_sample_rate )
-
- split_U = gr.complex_to_float ()
-
- af_loi_U = gr.sig_source_f (af_sample_rate,gr.GR_COS_WAVE,af_LO,1,0)
- af_loq_U = gr.sig_source_f (af_sample_rate,gr.GR_SIN_WAVE,af_LO,1,0)
-
- lpf2i_U = gr.fir_filter_fff (1, lpf2_taps)
- lpf2q_U = gr.fir_filter_fff (1, lpf2_taps)
-
- af_mixi_U = gr.multiply_ff ()
- af_mixq_U = gr.multiply_ff ()
-
- sum_U = gr.sub_ff () # sub for USB, add for LSB
-
- audio_lpf_U = gr.fir_filter_fff (1, audio_lpf_coeffs)
-
- scale_U = gr.multiply_const_ff(scale)
-
-# AM branch
- mag = gr.complex_to_mag()
- diff = gr.fir_filter_fff ( 1, [1, -1] )
- int_0dc = gr.iir_filter_ffd ( [1, 0], [0, .999] )
- sel_am = gr.multiply_const_ff(0)
- scale_am = gr.multiply_const_ff(0)
-
-# AGC lsb
- sqr1_L = gr.multiply_ff()
- int_L = gr.iir_filter_ffd ( [.004, 0], [0, .999] )
- offset_L = gr.add_const_ff(1)
- agc_L = gr.divide_ff()
-
-# AGC usb
- sqr1_U = gr.multiply_ff()
- int_U = gr.iir_filter_ffd ( [.004, 0], [0, .999] )
- offset_U = gr.add_const_ff(1)
- agc_U = gr.divide_ff()
-
-# sideband selection
- sel_lsb_0 = gr.multiply_const_ff(1)
- sel_lsb_1 = gr.multiply_const_ff(1)
- sel_usb_0 = gr.multiply_const_ff(0)
- sel_usb_1 = gr.multiply_const_ff(0)
- select0 = gr.add_ff()
- select1 = gr.add_ff()
-
- out = audio.sink (long(af_sample_rate))
-
- fg.connect (src, xlate_L)
- fg.connect (src, xlate_U)
- fg.connect (xlate_L, split_L)
- fg.connect (xlate_U, split_U)
-
- fg.connect ((split_L, 0), lpf2i_L)
- fg.connect ((split_U, 0), lpf2i_U)
- fg.connect (lpf2i_L, (af_mixi_L, 0))
- fg.connect (lpf2i_U, (af_mixi_U, 0))
- fg.connect (af_loi_L, (af_mixi_L, 1))
- fg.connect (af_loi_U, (af_mixi_U, 1))
- fg.connect (af_mixi_L, (sum_L, 0))
- fg.connect (af_mixi_U, (sum_U, 0))
-
- fg.connect ((split_L, 1), lpf2q_L)
- fg.connect ((split_U, 1), lpf2q_U)
- fg.connect (lpf2q_L, (af_mixq_L, 0))
- fg.connect (lpf2q_U, (af_mixq_U, 0))
- fg.connect (af_loq_L, (af_mixq_L, 1))
- fg.connect (af_loq_U, (af_mixq_U, 1))
- fg.connect (af_mixq_L, (sum_L, 1))
- fg.connect (af_mixq_U, (sum_U, 1))
-
- fg.connect (sum_L, audio_lpf_L)
- fg.connect (sum_U, audio_lpf_U)
- fg.connect (audio_lpf_L, scale_L)
- fg.connect (audio_lpf_U, scale_U)
-# wire AGC
- fg.connect (scale_L, (sqr1_L, 0))
- fg.connect (scale_U, (sqr1_U, 0))
- fg.connect (scale_L, (sqr1_L, 1))
- fg.connect (scale_U, (sqr1_U, 1))
- fg.connect (sqr1_L, int_L)
- fg.connect (sqr1_U, int_U)
- fg.connect (int_L, offset_L)
- fg.connect (int_U, offset_U)
- fg.connect (offset_L, (agc_L, 1))
- fg.connect (offset_U, (agc_U, 1))
- fg.connect (scale_L, (agc_L, 0))
- fg.connect (scale_U, (agc_U, 0))
-# wire sideband selection
- fg.connect (agc_L, sel_lsb_0)
- fg.connect (agc_U, sel_usb_0)
- fg.connect (agc_L, sel_lsb_1)
- fg.connect (agc_U, sel_usb_1)
- fg.connect (sel_lsb_0, (select0, 0))
- fg.connect (sel_usb_0, (select0, 1))
- fg.connect (sel_lsb_1, (select1, 0))
- fg.connect (sel_usb_1, (select1, 1))
- if IF_OUTPUT:
- nl_sink1 = gr.null_sink(gr.sizeof_float)
- nl_sink2 = gr.null_sink(gr.sizeof_float)
- fg.connect (select0, nl_sink1)
- fg.connect (select1, nl_sink2)
- c2f = gr.complex_to_float()
- scale_if = gr.multiply_const_cc(.0015)
- fg.connect (xlate_L, scale_if, c2f)
- fg.connect ((c2f, 0), (out, 1))
- fg.connect ((c2f, 1), (out, 0))
- else:
- fg.connect (select0, (out, 0))
- fg.connect (select1, (out, 1))
-# output to file
- if SAVE_AUDIO_TO_FILE:
- f_out = gr.file_sink(gr.sizeof_short,audio_file)
-# This creates a signed-word 2-channel (stereo) file at 32000 hz
-# convert to wav file with: sox -c 2 -r 32000 hfx_out.sw hfx_out.wav
- combine = gr.interleave(gr.sizeof_short)
- sc1 = gr.multiply_const_ff(64000)
- sc2 = gr.multiply_const_ff(64000)
- f2s1 = gr.float_to_short()
- f2s2 = gr.float_to_short()
- fg.connect (select0, sc1)
- fg.connect (select1, sc2)
- fg.connect (sc1, f2s1)
- fg.connect (sc2, f2s2)
- fg.connect (f2s1, (combine, 0))
- fg.connect (f2s2, (combine, 1))
- fg.connect (combine, f_out)
-# wire AM
- fg.connect (xlate_L, mag, diff, int_0dc)
- fg.connect (int_0dc, sel_am)
- fg.connect (sel_am, scale_am)
- fg.connect (scale_am, (select0, 2))
- fg.connect (scale_am, (select1, 2))
-
- return fg, tune_offset, xlate_L, xlate_U, scale_L, scale_U, src, \
- audio_lpf_L, audio_lpf_U, sel_lsb_0, sel_lsb_1, sel_usb_0, sel_usb_1, \
- sel_am, scale_am
-
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Commit-gnuradio] gnuradio-examples/python/apps/hf_explorer hfx2....,
Charles B Swiger <=