Merge vrt of http://gnuradio.org/git/jblum.git into master
authorJohnathan Corgan <jcorgan@corganenterprises.com>
Wed, 26 Aug 2009 23:52:40 +0000 (16:52 -0700)
committerJohnathan Corgan <jcorgan@corganenterprises.com>
Wed, 26 Aug 2009 23:58:08 +0000 (16:58 -0700)
* automatic store for empty traces on enable
* added traces to fft window
* added quadradio method to enable/disable cal
* use enum for band select
* added get band select

gr-vrt/src/vrt_quadradio_source_32fc.cc
gr-vrt/src/vrt_quadradio_source_32fc.h
gr-wxgui/src/python/constants.py
gr-wxgui/src/python/fft_window.py
vrt/include/vrt/quadradio.h
vrt/lib/quadradio.cc

index 0321062aa93e015ae60118570719c4aed8aea5b3..0aac86991f074edc216b47a8452059d20cafc435 100644 (file)
@@ -86,9 +86,15 @@ vrt_quadradio_source_32fc::set_center_freq(double target_freq)
 }
 
 bool 
-vrt_quadradio_source_32fc::set_band_select(const std::string &band)
+vrt_quadradio_source_32fc::set_band_select(int band)
 {
-  return d_qr->set_band_select(band);
+  return d_qr->set_band_select(static_cast<vrt_band_sel_t>(band));
+}
+
+int 
+vrt_quadradio_source_32fc::get_band_select(void)
+{
+  return static_cast<int>(d_qr->get_band_select());
 }
 
 //void 
@@ -210,3 +216,7 @@ vrt_quadradio_source_32fc::set_beamforming(std::vector<gr_complex> gains){
  return d_qr->set_beamforming(gains_ints);
 }
 
+bool
+vrt_quadradio_source_32fc::set_cal_enb(bool enb){
+  return d_qr->set_cal_enb(enb);
+}
index 6ad63f7be46784f99aae3e54d52ca461c7e1206d..6193efa102bde88943b1833a36c3f9fa62e35c2e 100644 (file)
@@ -68,9 +68,9 @@ public:
 
   /*!
    * \brief Set the band select dboard bits.
-   * \param band "A", "B", "C", "D"
    */
-  bool set_band_select(const std::string &band);
+  bool set_band_select(int band);
+  int get_band_select(void);
 
   /*!
    * \brief Turn the 10 dB attenuation on/off.
@@ -109,6 +109,7 @@ public:
   bool set_lo_freq(double freq);
   bool set_cal_freq(double freq);
   bool set_beamforming(std::vector<gr_complex> gains);
+  bool set_cal_enb(bool enb);
 };
 
 
index 5e1395701eaa9c923ea5c0280aa92c7a9ffdfbb3..8ff7fa8fee848f44870a23481375270133b179c3 100644 (file)
@@ -41,6 +41,8 @@ MSG_KEY = 'msg'
 NUM_LINES_KEY = 'num_lines'
 OMEGA_KEY = 'omega'
 PEAK_HOLD_KEY = 'peak_hold'
+TRACE_STORE_KEY = 'trace_store'
+TRACE_SHOW_KEY = 'trace_show'
 REF_LEVEL_KEY = 'ref_level'
 RUNNING_KEY = 'running'
 SAMPLE_RATE_KEY = 'sample_rate'
index ba5711d109100d7528bedf79a68fccc63589b52e..0529e6a5d6d77eb2070fbda7468fa2c1cecb1fb8 100644 (file)
@@ -39,10 +39,15 @@ SLIDER_STEPS = 100
 AVG_ALPHA_MIN_EXP, AVG_ALPHA_MAX_EXP = -3, 0
 DEFAULT_WIN_SIZE = (600, 300)
 DEFAULT_FRAME_RATE = gr.prefs().get_long('wxgui', 'fft_rate', 30)
-DIV_LEVELS = (1, 2, 5, 10, 20)
+DB_DIV_MIN, DB_DIV_MAX = 1, 20
 FFT_PLOT_COLOR_SPEC = (0.3, 0.3, 1.0)
 PEAK_VALS_COLOR_SPEC = (0.0, 0.8, 0.0)
-NO_PEAK_VALS = list()
+EMPTY_TRACE = list()
+TRACES = ('A', 'B')
+TRACES_COLOR_SPEC = {
+       'A': (1.0, 0.0, 0.0),
+       'B': (0.8, 0.0, 0.8),
+}
 
 ##################################################
 # FFT window control panel
@@ -63,7 +68,7 @@ class control_panel(wx.Panel):
                control_box.AddStretchSpacer()
                #checkboxes for average and peak hold
                options_box = forms.static_box_sizer(
-                       parent=self, sizer=control_box, label='Options',
+                       parent=self, sizer=control_box, label='Trace Options',
                        bold=True, orient=wx.VERTICAL,
                )
                forms.check_box(
@@ -90,17 +95,32 @@ class control_panel(wx.Panel):
                for widget in (avg_alpha_text, avg_alpha_slider):
                        parent.subscribe(AVERAGE_KEY, widget.Enable)
                        widget.Enable(parent[AVERAGE_KEY])
+               
+               #trace menu
+               for trace in TRACES:
+                       trace_box = wx.BoxSizer(wx.HORIZONTAL)
+                       options_box.Add(trace_box, 0, wx.EXPAND)
+                       forms.check_box(
+                               sizer=trace_box, parent=self,
+                               ps=parent, key=TRACE_SHOW_KEY+trace,
+                               label='Trace %s'%trace,
+                       )
+                       trace_box.AddSpacer(10)
+                       forms.single_button(
+                               sizer=trace_box, parent=self,
+                               ps=parent, key=TRACE_STORE_KEY+trace,
+                               label='Store', style=wx.BU_EXACTFIT,
+                       )
+                       trace_box.AddSpacer(10)
                #radio buttons for div size
                control_box.AddStretchSpacer()
                y_ctrl_box = forms.static_box_sizer(
                        parent=self, sizer=control_box, label='Axis Options',
                        bold=True, orient=wx.VERTICAL,
                )
-               forms.radio_buttons(
-                       sizer=y_ctrl_box, parent=self,
-                       ps=parent, key=Y_PER_DIV_KEY,
-                       style=wx.RA_VERTICAL|wx.NO_BORDER, choices=DIV_LEVELS,
-                       labels=map(lambda x: '%s dB/div'%x, DIV_LEVELS),
+               forms.incr_decr_buttons(
+                       parent=self, sizer=y_ctrl_box, label='dB/Div',
+                       on_incr=self._on_incr_db_div, on_decr=self._on_decr_db_div,
                )
                #ref lvl buttons
                forms.incr_decr_buttons(
@@ -135,6 +155,10 @@ class control_panel(wx.Panel):
                self.parent[REF_LEVEL_KEY] = self.parent[REF_LEVEL_KEY] + self.parent[Y_PER_DIV_KEY]
        def _on_decr_ref_level(self, event):
                self.parent[REF_LEVEL_KEY] = self.parent[REF_LEVEL_KEY] - self.parent[Y_PER_DIV_KEY]
+       def _on_incr_db_div(self, event):
+               self.parent[Y_PER_DIV_KEY] = min(DB_DIV_MAX, self.parent[Y_PER_DIV_KEY]*2)
+       def _on_decr_db_div(self, event):
+               self.parent[Y_PER_DIV_KEY] = max(DB_DIV_MIN, self.parent[Y_PER_DIV_KEY]/2)
 
 ##################################################
 # FFT window with plotter and control panel
@@ -159,13 +183,12 @@ class fft_window(wx.Panel, pubsub.pubsub):
                msg_key,
        ):
                pubsub.pubsub.__init__(self)
-               #ensure y_per_div
-               if y_per_div not in DIV_LEVELS: y_per_div = DIV_LEVELS[0]
                #setup
-               self.samples = list()
+               self.samples = EMPTY_TRACE
                self.real = real
                self.fft_size = fft_size
                self._reset_peak_vals()
+               self._traces = dict()
                #proxy the keys
                self.proxy(MSG_KEY, controller, msg_key)
                self.proxy(AVERAGE_KEY, controller, average_key)
@@ -179,6 +202,26 @@ class fft_window(wx.Panel, pubsub.pubsub):
                self[REF_LEVEL_KEY] = ref_level
                self[BASEBAND_FREQ_KEY] = baseband_freq
                self[RUNNING_KEY] = True
+               for trace in TRACES:
+                       #a function that returns a function
+                       #so the function wont use local trace
+                       def new_store_trace(my_trace):
+                               def store_trace(*args):
+                                       self._traces[my_trace] = self.samples
+                                       self.update_grid()
+                               return store_trace
+                       def new_toggle_trace(my_trace):
+                               def toggle_trace(toggle):
+                                       #do an automatic store if toggled on and empty trace
+                                       if toggle and not len(self._traces[my_trace]):
+                                               self._traces[my_trace] = self.samples
+                                       self.update_grid()
+                               return toggle_trace
+                       self._traces[trace] = EMPTY_TRACE
+                       self[TRACE_STORE_KEY+trace] = False
+                       self[TRACE_SHOW_KEY+trace] = False
+                       self.subscribe(TRACE_STORE_KEY+trace, new_store_trace(trace))
+                       self.subscribe(TRACE_SHOW_KEY+trace, new_toggle_trace(trace))
                #init panel and plot
                wx.Panel.__init__(self, parent, style=wx.SIMPLE_BORDER)
                self.plotter = plotter.channel_plotter(self)
@@ -194,7 +237,7 @@ class fft_window(wx.Panel, pubsub.pubsub):
                main_box.Add(self.control_panel, 0, wx.EXPAND)
                self.SetSizerAndFit(main_box)
                #register events
-               self.subscribe(AVERAGE_KEY, lambda x: self._reset_peak_vals())
+               self.subscribe(AVERAGE_KEY, self._reset_peak_vals)
                self.subscribe(MSG_KEY, self.handle_msg)
                self.subscribe(SAMPLE_RATE_KEY, self.update_grid)
                for key in (
@@ -223,7 +266,7 @@ class fft_window(wx.Panel, pubsub.pubsub):
                #set the range to a clean number of the dynamic range
                self[Y_PER_DIV_KEY] = common.get_clean_num((peak_level - noise_floor)/self[Y_DIVS_KEY])
 
-       def _reset_peak_vals(self): self.peak_vals = NO_PEAK_VALS
+       def _reset_peak_vals(self, *args): self.peak_vals = EMPTY_TRACE
 
        def handle_msg(self, msg):
                """
@@ -272,6 +315,15 @@ class fft_window(wx.Panel, pubsub.pubsub):
                The x axis depends on sample rate, baseband freq, and x divs.
                The y axis depends on y per div, y divs, and ref level.
                """
+               for trace in TRACES:
+                       channel = '%s'%trace.upper()
+                       if self[TRACE_SHOW_KEY+trace]:
+                               self.plotter.set_waveform(
+                                       channel=channel,
+                                       samples=self._traces[trace],
+                                       color_spec=TRACES_COLOR_SPEC[trace],
+                               )
+                       else: self.plotter.clear_waveform(channel=channel)
                #grid parameters
                sample_rate = self[SAMPLE_RATE_KEY]
                baseband_freq = self[BASEBAND_FREQ_KEY]
index 747ca8ef4745e3d4f6dd948ee6b6a64a91a768df..83323f09358b23ef97e940b972a30ab727c57b81 100644 (file)
@@ -38,6 +38,14 @@ typedef enum{
       
     } vrt_test_sig_t;
 
+typedef enum{
+    VRT_BAND_SEL_A='A',
+    VRT_BAND_SEL_B='B',
+    VRT_BAND_SEL_C='C',
+    VRT_BAND_SEL_D='D',  
+      
+    } vrt_band_sel_t;
+
 namespace vrt {
 
   /*
@@ -53,7 +61,7 @@ namespace vrt {
     int                   d_data_port;        // our data port number
     vrt::rx::sptr  d_rx;              // has-a rx
     
-    int                   d_band_select;              // band select setting
+    vrt_band_sel_t                d_band_select;              // band select setting
     int                   d_rx_antenna;               // antenna type rf/cal
     int                   d_attenuation0;             // attenuation setting
     int                   d_attenuation1;             // attenuation setting
@@ -92,7 +100,8 @@ namespace vrt {
 
     /* convenience methods that ultimately write the dboard pins */
     bool set_center_freq(double target_freq);
-    bool set_band_select(const std::string &band);
+    bool set_band_select(vrt_band_sel_t band);
+    vrt_band_sel_t get_band_select(void){return d_band_select;}
     //void set_10dB_atten(bool on);
     bool set_attenuation0(int attenuation);
     bool select_rx_antenna(const std::string &ant);
@@ -110,6 +119,7 @@ namespace vrt {
     bool set_lo_freq(double freq);
     bool set_cal_freq(double freq);
     bool set_beamforming(int32_t gains[8]);
+    bool set_cal_enb(bool enb);
     /*
      * The first parameter for these is a bitmask which indicates which
      * daughterboard or daughterboards to apply the operation to.
index ab5de89b8a2223712f7d38b4e2d5bff0e2d2db83..8cf542e0f3b5889f953b718d8a091cb3350769f0 100644 (file)
@@ -51,7 +51,7 @@ send_and_check(int fd, void *buf, size_t len)
 
 vrt::quadradio::quadradio(const std::string &ip, size_t rx_bufsize)
   : d_ctrl_fd(0), d_data_fd(0), d_data_port(0),
-  d_band_select(0), d_rx_antenna(0), d_attenuation0(0), d_attenuation1(0)//d_10dB_atten(true)
+  d_band_select(VRT_BAND_SEL_A), d_rx_antenna(0), d_attenuation0(0), d_attenuation1(0)//d_10dB_atten(true)
 {
   if (!open(ip.c_str()))
     throw std::runtime_error("vrt::quadradio: failed to open " + ip + "\n");
@@ -89,20 +89,16 @@ vrt::quadradio::stop_streaming()
 bool
 vrt::quadradio::set_center_freq(double target_freq){
     if (target_freq < 700e6) return false;
-    if (target_freq <= 1.0e9) return set_band_select("A");
-    if (target_freq <= 1.5e9) return set_band_select("B");
-    if (target_freq <= 2.2e9) return set_band_select("C");
-    if (target_freq <= 3.0e9) return set_band_select("D");
+    if (target_freq <= 1.0e9) return set_band_select(VRT_BAND_SEL_A);
+    if (target_freq <= 1.5e9) return set_band_select(VRT_BAND_SEL_B);
+    if (target_freq <= 2.2e9) return set_band_select(VRT_BAND_SEL_C);
+    if (target_freq <= 3.0e9) return set_band_select(VRT_BAND_SEL_D);
     return false;
 }
 
 bool
-vrt::quadradio::set_band_select(const std::string &band){
-    if (band == "A") d_band_select = 3;
-    else if (band == "B") d_band_select = 2;
-    else if (band == "C") d_band_select = 1;
-    else if (band == "D") d_band_select = 0;
-    else return false;
+vrt::quadradio::set_band_select(vrt_band_sel_t band){
+    d_band_select = band;
     update_dboard_pins();
     return true;
 }
@@ -149,11 +145,21 @@ static int reverse_bits(int input, int len){
 
 void
 vrt::quadradio::update_dboard_pins(void){
+    //convert the band ID to bits
+    int band_select;
+    switch (d_band_select){
+        case VRT_BAND_SEL_A: band_select = 3; break;
+        case VRT_BAND_SEL_B: band_select = 2; break;
+        case VRT_BAND_SEL_C: band_select = 1; break;
+        case VRT_BAND_SEL_D: band_select = 0; break;
+        default: band_select = 0;
+    }
+    //calculate the control bits
     int db_ctrl = \
-        ((reverse_bits(d_attenuation0, 5) & 0x1f) << 10) | \
+        ((reverse_bits(d_attenuation0, 5)  & 0x1f) << 10) | \
         ((reverse_bits(~d_attenuation1, 5) & 0x1f) << 03) | \
-        ((d_band_select                   & 0x03) << 01) | \
-        ((d_rx_antenna                    & 0x01) << 00);
+        ((band_select                      & 0x03) << 01) | \
+        ((d_rx_antenna                     & 0x01) << 00);
     set_dboard_pins(ALL_DBOARDS, db_ctrl);  // FIXME sets them all
 }
 
@@ -406,3 +412,13 @@ vrt::quadradio::set_beamforming(int32_t gains[8]){
   return send_and_check(d_ctrl_fd, cmd, sizeof(cmd));
 }
 
+bool
+vrt::quadradio::set_cal_enb(bool enb)
+{
+  uint32_t cmd[3];
+  cmd[0] = htonl(0);              // verb: set
+  cmd[1] = htonl(9);              // id: cal enb
+  cmd[2] = htonl(enb);
+
+  return send_and_check(d_ctrl_fd, cmd, sizeof(cmd));
+}