Merge branch 'vrt' of http://gnuradio.org/git/jblum
authorJohnathan Corgan <jcorgan@corganenterprises.com>
Wed, 21 Oct 2009 21:20:15 +0000 (14:20 -0700)
committerJohnathan Corgan <jcorgan@corganenterprises.com>
Wed, 21 Oct 2009 21:20:15 +0000 (14:20 -0700)
Merge fix: added GRUEL_INCLUDES to vrt Makefile
Merge fix: added missing include in gr-vrt

* 'vrt' of http://gnuradio.org/git/jblum:
  query the model number from the host
  fix so all handlers get called on event
  simplfied the code while i was looking at it
  added access methods for gps stuff
  added access methods and parsing for caldiv if context
  use existing utility method
  reading the lo back and storing it
  use the new htonll and vrt types to send cal and lo freqs
  checking for if context packets and setting up the payload pointer and size
  Reading 64 bit freq out of chunk of context packet.
  copied over vrt context and type headers, updated bits.h as well
  Dump IF-Context packets in hex.
  use gruel/inet.h instead of arap/inet.h
  fix white space
  made rxdspno a parameter for: start/stop streaming, and quadradio32fc

16 files changed:
gnuradio-core/src/python/gnuradio/blks2impl/stream_to_vector_decimator.py
gr-vrt/src/vrt_quadradio_source_32fc.cc
gr-vrt/src/vrt_quadradio_source_32fc.h
gr-vrt/src/vrt_source_32fc.cc
gr-vrt/src/vrt_source_32fc.h
gr-wxgui/src/python/forms/forms.py
gruel/src/include/gruel/inet.h.in
vrt/apps/simple_rx_samples.cc
vrt/include/vrt/Makefile.am
vrt/include/vrt/bits.h
vrt/include/vrt/if_context.h [new file with mode: 0644]
vrt/include/vrt/quadradio.h
vrt/include/vrt/types.h [new file with mode: 0644]
vrt/lib/Makefile.am
vrt/lib/expanded_header.cc
vrt/lib/quadradio.cc

index 39c8b5050259cc0a94256d80e063a240cc879cb3..8f75729c91c24a3c0e032e53b40d3863e1f23519 100644 (file)
@@ -72,8 +72,7 @@ class stream_to_vector_decimator(gr.hier_block2):
         self.one_in_n.set_n(self._decim)
 
     def _update_decimator(self):
-        self._decim = max(1, int(round(self._sample_rate/self._vec_len/self._vec_rate)))
-        self.one_in_n.set_n(self._decim)
+        self.set_decimation(self._sample_rate/self._vec_len/self._vec_rate)
 
     def decimation(self):
         """
index 0aac86991f074edc216b47a8452059d20cafc435..cd779bdf50b415b20ae6ed1c597fad8a33c99bc7 100644 (file)
 vrt_quadradio_source_32fc_sptr
 vrt_make_quadradio_source_32fc(const std::string &ip, 
                               size_t rx_bufsize,
-                              size_t samples_per_pkt)
+                              size_t samples_per_pkt,
+                              int rxdspno)
 {
   return gnuradio::get_initial_sptr(new vrt_quadradio_source_32fc(ip,
                                                                  rx_bufsize,
-                                                                 samples_per_pkt));
+                                                                 samples_per_pkt,
+                                                                 rxdspno));
 }
 
 vrt_quadradio_source_32fc::vrt_quadradio_source_32fc(const std::string &ip,
                                                     size_t rx_bufsize,
-                                                    size_t samples_per_pkt)
+                                                    size_t samples_per_pkt,
+                             int rxdspno)
   : vrt_source_32fc("quadradio_source_32fc"),
-    d_samples_per_pkt(samples_per_pkt == 0 ? 800 : samples_per_pkt),
-    d_qr(vrt::quadradio::sptr(new vrt::quadradio(ip, rx_bufsize)))
+    d_samples_per_pkt(samples_per_pkt == 0 ? (rxdspno == 0 ? 800 : 200) : samples_per_pkt),
+    d_qr(vrt::quadradio::sptr(new vrt::quadradio(ip, rx_bufsize))),
+    d_rxdspno(rxdspno)
 {
 }
 
 vrt_quadradio_source_32fc::~vrt_quadradio_source_32fc()
 {
-  d_qr->stop_streaming();
+  d_qr->stop_streaming(d_rxdspno);
 }
 
 vrt::rx::sptr 
@@ -64,13 +68,13 @@ vrt_quadradio_source_32fc::start()
   vrt_rx()->rx_packets(&nop, true);
   d_checker.resync();
 
-  return d_qr->start_streaming(d_samples_per_pkt);
+  return d_qr->start_streaming(d_rxdspno, d_samples_per_pkt);
 }  
 
 bool
 vrt_quadradio_source_32fc::stop()
 {
-  return d_qr->stop_streaming();
+  return d_qr->stop_streaming(d_rxdspno);
 }
 
 bool 
index 6193efa102bde88943b1833a36c3f9fa62e35c2e..bb3935c466d159c0ec011dc7e719edc6613f254f 100644 (file)
@@ -33,19 +33,21 @@ typedef boost::shared_ptr<vrt_quadradio_source_32fc> vrt_quadradio_source_32fc_s
 vrt_quadradio_source_32fc_sptr
 vrt_make_quadradio_source_32fc(const std::string &ip,
                               size_t rx_bufsize = 0,
-                              size_t samples_per_pkt = 0);
+                              size_t samples_per_pkt = 0,
+                              int rxdspno = 0);
 
 class vrt_quadradio_source_32fc : public vrt_source_32fc
 {
   size_t                               d_samples_per_pkt;
   boost::shared_ptr<vrt::quadradio>    d_qr;
+  int                                  d_rxdspno;
 
   vrt_quadradio_source_32fc(const std::string &ip, size_t rx_bufsize,
-                           size_t samples_per_pkt);
+                           size_t samples_per_pkt, int rxdspno);
 
   friend vrt_quadradio_source_32fc_sptr
   vrt_make_quadradio_source_32fc(const std::string &ip, size_t rx_bufsize,
-                                size_t samples_per_pkt);
+                                size_t samples_per_pkt, int rxdspno);
 
 public:
   virtual ~vrt_quadradio_source_32fc();
@@ -110,6 +112,23 @@ public:
   bool set_cal_freq(double freq);
   bool set_beamforming(std::vector<gr_complex> gains);
   bool set_cal_enb(bool enb);
+  
+  //caldiv public access methods
+  double get_cal_freq(void){return d_cal_freq;}
+  bool get_cal_locked(void){return d_cal_locked;}
+  bool get_cal_enabled(void){return d_cal_enabled;}
+  double get_lo_freq(void){return d_lo_freq;}
+  bool get_lo_locked(void){return d_lo_locked;}
+  double get_caldiv_temp(void){return d_caldiv_temp;}
+  int get_caldiv_revision(void){return d_caldiv_rev;}
+  int get_caldiv_serial(void){return d_caldiv_ser;}
+  int get_caldiv_model(void){return d_caldiv_mod;}
+  
+  //gps public access methods
+  int get_utc_time(void){return d_utc_time;}
+  double get_altitude(void){return d_altitude;}
+  double get_longitude(void){return d_longitude;}
+  double get_latitude(void){return d_latitude;}
 };
 
 
index beb5ef26d256ac3ffa0bfd024af4e2d0c8020caf..f9375d31cb6e2f124505f3526a8f67ed2f766cfc 100644 (file)
 #include <vrt_source_32fc.h>
 #include <vrt/expanded_header.h>
 #include <vrt/copiers.h>
+#include <vrt/types.h>
+#include <vrt/if_context.h>
 #include <gr_io_signature.h>
 #include <missing_pkt_checker.h>
 #include <iostream>
+#include <gruel/inet.h>
+#include <cstdio>
+#include <cstring>
 
 #define VERBOSE 1              // define to 0 or 1
 
@@ -41,7 +46,8 @@ class rx_32fc_handler : public vrt::rx_packet_handler
   int                               *d_oo;             // output index
   std::vector< std::complex<float> > &d_remainder;
   missing_pkt_checker               &d_checker;
-  
+  all_context_t d_if_context;
+  size_t d_if_context_n32_bit_words;
 
 public:
 
@@ -49,13 +55,16 @@ public:
                  int *oo, std::vector< std::complex<float> > &remainder,
                  missing_pkt_checker &checker)
     : d_noutput_items(noutput_items), d_out(out),
-      d_oo(oo), d_remainder(remainder), d_checker(checker) {}
+      d_oo(oo), d_remainder(remainder), d_checker(checker),
+      d_if_context_n32_bit_words(0) {}
 
   ~rx_32fc_handler();
 
   bool operator()(const uint32_t *payload,
                  size_t n32_bit_words,
                  const vrt::expanded_header *hdr);
+  all_context_t* get_if_context(void){
+    return d_if_context_n32_bit_words? &d_if_context : NULL;};
 };
 
 rx_32fc_handler::~rx_32fc_handler()
@@ -67,29 +76,48 @@ rx_32fc_handler::operator()(const uint32_t *payload,
                            size_t n32_bit_words,
                            const vrt::expanded_header *hdr)
 {
-  int nmissing = d_checker.check(hdr);
-  if (VERBOSE && nmissing != 0){
-    std::cerr << "S" << nmissing;
+  if (hdr->if_data_p()){
+    int nmissing = d_checker.check(hdr);
+    if (VERBOSE && nmissing != 0){
+      std::cerr << "S" << nmissing;
+    }
+
+    // copy as many as will fit into the output buffer.
+
+    size_t n = std::min(n32_bit_words, (size_t)(d_noutput_items - *d_oo));
+    vrt::copy_net_16sc_to_host_32fc(n, payload, &d_out[*d_oo]);
+    *d_oo += n;
+
+    // if there are any left over, copy them into remainder and tell
+    // our caller we're had enough for now.
+
+    size_t r = n32_bit_words - n;
+    if (r > 0){
+      assert(d_remainder.size() == 0);
+      d_remainder.resize(r);
+      vrt::copy_net_16sc_to_host_32fc(r, &payload[n], &d_remainder[0]);
+      return false;            // Stop calling us.
+    }
+
+    return true;                       // Keep calling us, we've got more room
   }
-
-  // copy as many as will fit into the output buffer.
-
-  size_t n = std::min(n32_bit_words, (size_t)(d_noutput_items - *d_oo));
-  vrt::copy_net_16sc_to_host_32fc(n, payload, &d_out[*d_oo]);
-  *d_oo += n;
-
-  // if there are any left over, copy them into remainder and tell
-  // our caller we're had enough for now.
-
-  size_t r = n32_bit_words - n;
-  if (r > 0){
-    assert(d_remainder.size() == 0);
-    d_remainder.resize(r);
-    vrt::copy_net_16sc_to_host_32fc(r, &payload[n], &d_remainder[0]);
-    return false;              // Stop calling us.
+  else if (hdr->if_context_p()){
+    // print the IF-Context packet
+    fprintf(stderr, "\nIF-Context:\n");
+    //for (size_t i = 0; i < n32_bit_words; i++)
+    //  fprintf(stderr, "%04x: %08x\n", (unsigned int) i, ntohl(payload[i]));
+    memcpy(&d_if_context, payload, sizeof(uint32_t)*n32_bit_words);
+    d_if_context_n32_bit_words = n32_bit_words;
+    return true;
+  }
+  else {
+    // It's most likely an Extension Data or Extension Context packet
+    // (that we don't know how to interpret...)
+    fprintf(stderr, "\nIF-Extension:\n");
+    for (size_t i = 0; i < n32_bit_words; i++)
+      fprintf(stderr, "%04x: %08x\n", (unsigned int) i, ntohl(payload[i]));
+    return true;
   }
-
-  return true;                 // Keep calling us, we've got more room
 }
 
 
@@ -140,5 +168,25 @@ vrt_source_32fc::work(int noutput_items,
     return -1; // say we're done
   }
 
+  //we have a context packet, grab its useful information...
+  //remember that things are in network byte order!
+  if (h.get_if_context()){
+    //extract caldiv stuff
+    d_lo_freq = vrt_freq_to_double(ntohx(h.get_if_context()->caldiv.lo_freq));
+    d_cal_freq = vrt_freq_to_double(ntohx(h.get_if_context()->caldiv.cal_freq));
+    d_lo_locked = bool(ntohx(h.get_if_context()->caldiv.lo_locked));
+    d_cal_locked = bool(ntohx(h.get_if_context()->caldiv.cal_locked));
+    d_cal_enabled = bool(ntohx(h.get_if_context()->caldiv.cal_enabled));
+    d_caldiv_temp = vrt_temp_to_double(ntohx(h.get_if_context()->caldiv.temp));
+    d_caldiv_rev = ntohx(h.get_if_context()->caldiv.rev);
+    d_caldiv_ser = ntohx(h.get_if_context()->caldiv.ser);
+    d_caldiv_mod = ntohx(h.get_if_context()->caldiv.mod);
+    //extract gps stuff
+    d_utc_time = ntohx(h.get_if_context()->gps.formatted_gps.integer_secs);
+    d_altitude = vrt_altitude_to_double(ntohx(h.get_if_context()->gps.formatted_gps.altitude));
+    d_longitude = vrt_geo_angle_to_double(ntohx(h.get_if_context()->gps.formatted_gps.longitude));
+    d_latitude = vrt_geo_angle_to_double(ntohx(h.get_if_context()->gps.formatted_gps.latitude));
+  }
+
   return oo;
 }
index 7ca3e5fe25b7368f506627ef31b4d00c42705e04..c43170e83beb779b553dedd072200f5e9604940e 100644 (file)
@@ -34,6 +34,23 @@ protected:
   std::vector< std::complex<float> >   d_remainder;
   missing_pkt_checker                  d_checker;
 
+  //caldiv settings parsed from if context
+  double d_cal_freq;
+  bool   d_cal_locked;
+  bool   d_cal_enabled;
+  double d_lo_freq;
+  bool   d_lo_locked;
+  double d_caldiv_temp;
+  int    d_caldiv_rev;
+  int    d_caldiv_ser;
+  int    d_caldiv_mod;
+  
+  //gps settings parsed from if context
+  int    d_utc_time;
+  double d_altitude;
+  double d_longitude;
+  double d_latitude;
+
 public:
   ~vrt_source_32fc();
 
@@ -42,7 +59,6 @@ public:
           gr_vector_void_star &output_items);
 
   void reset() { d_remainder.clear(); }
-
 };
 
 #endif /* INCLUDED_VRT_SOURCE_32FC_H */
index 8dc58367d9deac34251467061d307388b816945e..19b30ffb0a2998a04f3960266a95ca5938aaf6d4 100644 (file)
@@ -194,15 +194,19 @@ class static_text(_form_base):
        @param label title label for this widget (optional)
        @param width the width of the form in px
        @param bold true to bold-ify the text (default=False)
+       @param units a suffix to add after the text
        @param converter forms.str_converter(), int_converter(), float_converter()...
        """
-       def __init__(self, label='', width=-1, bold=False, converter=converters.str_converter(), **kwargs):
+       def __init__(self, label='', width=-1, bold=False, units='', converter=converters.str_converter(), **kwargs):
+               self._units = units
                _form_base.__init__(self, converter=converter, **kwargs)
                self._static_text = wx.StaticText(self._parent, size=wx.Size(width, -1))
                if bold: make_bold(self._static_text)
                self._add_widget(self._static_text, label)
 
-       def _update(self, label): self._static_text.SetLabel(label); self._parent.Layout()
+       def _update(self, label):
+                       if self._units: label += ' ' + self._units
+                       self._static_text.SetLabel(label); self._parent.Layout()
 
 ########################################################################
 # Text Box Form
index a98d83e9c57962b02aa78a3dab10eecea725ebaa..7ac01eb56df44114b2f17e5f771bf5cc7ee9be37 100644 (file)
@@ -1,6 +1,6 @@
 /* -*- c++ -*- */
 /*
- * Copyright 2008 Free Software Foundation, Inc.
+ * Copyright 2008, 2009 Free Software Foundation, Inc.
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
 #ifndef INCLUDED_INET_H
 #define INCLUDED_INET_H
 
+#include <stdint.h>
+
+#if 1 /* missing htonll or ntohll */
+#if @GR_ARCH_BIGENDIAN@  /* GR_ARCH_BIGENDIAN */
+// Nothing to do...
+static inline uint64_t htonll(uint64_t x){ return x;}
+static inline uint64_t ntohll(uint64_t x){ return x;}
+#else
+#if @GR_HAVE_BYTESWAP@  /* GR_HAVE_BYTESWAP */
+#include <byteswap.h>
+#else
+
+static inline uint64_t
+bswap_64(uint64_t x)
+{
+  return ((x & 0x00000000000000ffull) << 56) | ((x & 0x000000000000ff00ull) << 40) |
+         ((x & 0x0000000000ff0000ull) << 24) | ((x & 0x00000000ff000000ull) <<  8) |
+         ((x & 0x000000ff00000000ull) >>  8) | ((x & 0x0000ff0000000000ull) >> 24) |
+         ((x & 0x00ff000000000000ull) >> 40) | ((x & 0xff00000000000000ull) >> 56);
+}
+
+#endif /* GR_HAVE_BYTESWAP */
+
+static inline uint64_t htonll(uint64_t x){ return bswap_64(x);}
+static inline uint64_t ntohll(uint64_t x){ return bswap_64(x);}
+
+#endif /* GR_ARCH_BIGENDIAN */
+#endif /* missing htonll or ntohll */ 
+
 #if @GR_HAVE_ARPA_INET@  /* GR_HAVE_ARPA_INET */
 #include <arpa/inet.h>
 #elif @GR_HAVE_NETINET_IN@  /* GR_HAVE_NETINET_IN */
@@ -61,8 +90,10 @@ static inline uint16_t ntohs(uint16_t x){ return bswap_16(x); }
 static inline uint8_t  ntohx(uint8_t  x){ return x;        }
 static inline uint16_t ntohx(uint16_t x){ return ntohs(x); }
 static inline uint32_t ntohx(uint32_t x){ return ntohl(x); }
+static inline uint64_t ntohx(uint64_t x){ return ntohll(x);}
 static inline uint8_t  htonx(uint8_t  x){ return x;        }
 static inline uint16_t htonx(uint16_t x){ return htons(x); }
 static inline uint32_t htonx(uint32_t x){ return htonl(x); }
+static inline uint64_t htonx(uint64_t x){ return htonll(x);}
 
 #endif /* INCLUDED_INET_H */
index 6b09afda51f90c81460f8d7f28ead55ad393ad2e..08f01c9ccc41d0d7208cb8261283f2d5defec128 100644 (file)
@@ -365,7 +365,7 @@ main(int argc, char **argv)
 
   printf("samples_per_pkt = %d\n", samples_per_pkt);
 
-  if (!qr->start_streaming(samples_per_pkt)){
+  if (!qr->start_streaming(0, samples_per_pkt)){
     fprintf(stderr, "failed to send_rx_command\n");
     return 1;
   }
@@ -383,7 +383,7 @@ main(int argc, char **argv)
     }
   }
 
-  qr->stop_streaming();
+  qr->stop_streaming(0);
 
   printf("%llu packets received, %llu bad pkt_cnt field values, %llu samples\n",
         handler->npackets(), handler->nwrong_pkt_cnt(), handler->nsamples());
index b710547d9f43748d1471bbb96d98b137a297f15c..2780d79b0caf11eb049bab982fd55dadc34b0854 100644 (file)
@@ -26,5 +26,7 @@ vrtinclude_HEADERS = \
        copiers.h \
        expanded_header.h \
        quadradio.h \
+       if_context.h \
        rx.h \
-       rx_packet_handler.h
+       rx_packet_handler.h \
+       types.h
index bb4227db4531c5dcef0a62fab379b9e68e7b5928..54eeec7b4ac6e157485ded2cc00f9146b5ea3649 100644 (file)
@@ -1,24 +1,20 @@
 /* -*- c++ -*- */
 /*
  * Copyright 2009 Free Software Foundation, Inc.
- * 
- * This file is part of GNU Radio
- * 
- * GNU Radio is free software; you can redistribute it and/or modify
+ *
+ * This program 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 3, or (at your option)
- * any later version.
- * 
- * GNU Radio is distributed in the hope that it will be useful,
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
-
 #ifndef INCLUDED_VRT_BITS_H
 #define INCLUDED_VRT_BITS_H
 
@@ -53,7 +49,9 @@
 #define        VRTH_TSF_REAL_TIME_PS     (0x2 << 20)
 #define        VRTH_TSF_FREE_RUNNING     (0x3 << 20)
 
+#define        VRTH_PKT_CNT_SHIFT        16
 #define        VRTH_PKT_CNT_MASK         (0xf << 16)
+
 #define        VRTH_PKT_SIZE_MASK        0xffff                    
 
 
@@ -69,4 +67,26 @@ vrth_pkt_size(uint32_t h)
   return h & VRTH_PKT_SIZE_MASK;
 }
 
+/*
+ * Trailer bits
+ */
+#define        TR_E                  (1 << 8)
+
+#define TR_ENABLE(x) ((x) << 20)
+#define        TR_STATE(x)  ((x) <<  8)
+
+// Use these with TR_ENABLE and TR_STATE
+#define        TR_CAL_TIME           (1 << 11)
+#define        TR_VALID_DATA         (1 << 10)
+#define TR_REF_LOCK          (1 <<  9)
+#define        TR_AGC                (1 <<  8)
+#define TR_DETECTED_SIG              (1 <<  7)
+#define        TR_SPECTRAL_INVERSION (1 <<  6)
+#define        TR_OVER_RANGE         (1 <<  5)
+#define        TR_SAMPLE_LOSS        (1 <<  4)
+#define TR_USER_3            (1 <<  3)
+#define TR_USER_2            (1 <<  2)
+#define TR_USER_1            (1 <<  1)
+#define TR_USER_0            (1 <<  0)
+
 #endif /* INCLUDED_VRT_BITS_H */
diff --git a/vrt/include/vrt/if_context.h b/vrt/include/vrt/if_context.h
new file mode 100644 (file)
index 0000000..24aba7a
--- /dev/null
@@ -0,0 +1,243 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2009 Free Software Foundation, Inc.
+ *
+ * This program 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 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+#ifndef INCLUDED_VRT_IF_CONTEXT_H
+#define INCLUDED_VRT_IF_CONTEXT_H
+
+#include <stdint.h>
+
+// Stream ID's for packet streams (low 8-bits)
+
+#define QR_SID_BEAMFORMER_IF_DATA      0x00    // paired
+#define QR_SID_BEAMFORMER_IF_CNTX      0x00    // paired
+#define QR_SID_DBOARD_0_IF_CNTX                0x01    // src assoc
+#define QR_SID_DBOARD_1_IF_CNTX                0x02    // src assoc
+#define QR_SID_DBOARD_2_IF_CNTX                0x03    // src assoc
+#define QR_SID_DBOARD_3_IF_CNTX                0x04    // src assoc
+#define QR_SID_GPS_IF_CNTX             0x05    // system assoc
+#define QR_SID_SYS_INFO_EXT_CNTX       0x06    // system assoc
+
+// No class id, with 3 words of time.
+// Used for all IF-Context packets
+typedef struct if_context_hdr_tag {
+  uint32_t     header;                 // first word of all packets
+  uint32_t     stream_id;              // mandatory in context packets
+  uint32_t     integer_secs;           // integer seconds timestamp
+  uint64_t     fractional_secs;        // fractional seconds timestamp
+  uint32_t     context_indicator;      // which context fields follow
+} __attribute__((packed)) if_context_hdr_t;
+
+
+// With class id, with 3 words of time.
+// Used only with Extension Context packets
+typedef struct if_context_hdr_with_classid_tag {
+  uint32_t     header;                 // first word of all packets
+  uint32_t     stream_id;              // mandatory in context packets
+  uint64_t     class_id;               // class identifier
+  uint32_t     integer_secs;           // integer seconds timestamp
+  uint64_t     fractional_secs;        // fractional seconds timestamp
+  uint32_t     context_indicator;      // which context fields follow
+} __attribute__((packed)) if_context_hdr_with_classid_t;
+
+
+// ------------------------------------------------------------------------
+// Context Indicator field bits (Table 7.1.5.1-1)
+
+#define CI_CHANGE_INDICATOR    (1 << 31)
+#define        CI_REF_POINT_ID         (1 << 30)
+#define        CI_BANDWIDTH            (1 << 29)
+#define        CI_IF_REF_FREQ          (1 << 28)
+#define        CI_RF_REF_FREQ          (1 << 27)
+#define        CI_RF_REF_FREQ_OFFSET   (1 << 26)
+#define CI_IF_BAND_OFFSET      (1 << 25)
+#define        CI_REF_LEVEL            (1 << 24)
+#define CI_GAIN                        (1 << 23)
+#define        CI_OVER_RANGE_COUNT     (1 << 22)
+#define        CI_SAMPLE_RATE          (1 << 21)
+#define        CI_TIMESTAMP_ADJ        (1 << 20)
+#define        CI_TIMESTAMP_CAL_TIME   (1 << 19)
+#define        CI_TEMPERATURE          (1 << 18)
+#define CI_DEVICE_ID           (1 << 17)
+#define        CI_STATE_AND_EVENT_IND  (1 << 16)
+#define        CI_PAYLOAD_FMT          (1 << 15)
+#define        CI_FORMATTED_GPS        (1 << 14)
+#define        CI_FORMATTED_INS        (1 << 13)
+#define        CI_ECEF_EPHEMERIS       (1 << 12)
+#define        CI_REL_EPHEMERIS        (1 << 11)
+#define        CI_EPHEMERIS_REF_ID     (1 << 10)
+#define        CI_ASCII_GPS            (1 <<  9)
+#define        CI_CNTX_ASSOC_LISTS     (1 <<  8)
+#define CI_RESERVED_7          (1 <<  7)
+#define CI_RESERVED_6          (1 <<  6)
+#define CI_RESERVED_5          (1 <<  5)
+#define CI_RESERVED_4          (1 <<  4)
+#define CI_RESERVED_3          (1 <<  3)
+#define CI_RESERVED_2          (1 <<  2)
+#define CI_RESERVED_1          (1 <<  1)
+#define CI_RESERVED_0          (1 <<  0)
+
+
+// ------------------------------------------------------------------------
+// Types that may be in the Context Section
+
+
+// 7.1.5.10 Gain -- two Q10.6 dB fields
+
+static inline uint32_t
+vrt_make_gain_field(int16_t stage1, int16_t stage2)
+{
+  return (((uint32_t) stage2) << 16) | (stage1 & 0xffff);
+}
+
+static inline int16_t
+vrt_gain_stage1(uint32_t field)
+{
+  return (int16_t)(field & 0xffff);
+}
+
+static inline int16_t
+vrt_gain_stage2(uint32_t field)
+{
+  return (int16_t)((field >> 16) & 0xffff);
+}
+
+// See VITA-49.0 section 7.1.5.19
+
+#define        VRT_GPS_UNKNOWN_VALUE   0x7fffffff      // for SOG, heading, track, and mag var
+
+typedef struct vrt_formatted_gps_tag {
+  uint32_t     tsi_tsf_manuf_oui;
+  uint32_t     integer_secs;           // timestamp of position fix
+  uint64_t     fractional_secs;        // timestamp of position fix
+  uint32_t     latitude;               // degrees Q10.22
+  uint32_t     longitude;              // degrees Q10.22
+  uint32_t     altitude;               // meters  Q27.5
+  uint32_t     speed_over_ground;
+  uint32_t     heading_angle;
+  uint32_t     track_angle;
+  uint32_t     magnetic_variation;     
+} vrt_formatted_gps_t;
+
+
+// Data Packet Payload Format Field 7.1.5.18
+
+typedef struct vrt_payload_format_tag {
+  uint32_t     word0;
+  uint32_t     word1;
+} vrt_payload_format_t;
+
+#define DF0_PACKED                             (1 << 31)
+#define        DF0_REAL_CMPLX_TYPE_MASK                (0x3 << 29)
+#define          DF0_REAL_CMPLX_TYPE_REAL              (0 << 29)
+#define          DF0_REAL_CMPLX_TYPE_CMPLX_CART        (1 << 29)
+#define          DF0_REAL_CMPLX_TYPE_CMPLX_POLAR       (2 << 29)
+#define          DF0_REAL_CMPLX_TYPE_RESERVED          (3 << 29)
+#define DF0_ITEM_FMT_MASK                      (0x1f << 24)
+#define   DF0_ITEM_FMT_SIGNED_FIXED_POINT      (0x00 << 24)
+#define   DF0_ITEM_FMT_UNSIGNED_FIXED_POINT    (0x10 << 24)
+// lots more we're not using
+#define        DF0_SAMPLE_COMPONENT_REPEATING          (1 << 23)
+#define        DF0_EVENT_TAG_SIZE_SHIFT                20
+#define DF0_EVENT_TAG_SIZE_MASK                        (0x7 << 20)
+#define        DF0_CHANNEL_TAG_SIZE_SHIFT              16
+#define        DF0_CHANNEL_TAG_SIZE_MASK               (0xf << 16)
+#define        DF0_RESERVED_SHIFT                      12
+#define        DF0_RESERVED_MASK                       (0xf << 12)
+#define DF0_ITEM_PACKING_FIELD_SIZE_SHIFT      6
+#define DF0_ITEM_PACKING_FIELD_SIZE_MASK       (0x3f << 6)
+#define        DF0_DATA_ITEM_SIZE_SHIFT                0
+#define        DF0_DATA_ITEM_SIZE_MASK                 (0x3f << 0)
+
+#define        DF1_REPEAT_COUNT_SHIFT                  16
+#define        DF1_REPEAT_COUNT_MASK                   (0xffff << 16)
+#define        DF1_VECTOR_SIZE_SHIFT                   0
+#define        DF1_VECTOR_SIZE_MASK                    (0xffff <<  0)
+
+
+// Composite values
+
+// 16-bit I & Q, no events, no channel tags
+#define DF0_16_BIT_IQ  \
+  (0 \
+   | DF0_REAL_CMPLX_TYPE_CMPLX_CART  \
+   | DF0_ITEM_FMT_SIGNED_FIXED_POINT \
+   | (15 << DF0_ITEM_PACKING_FIELD_SIZE_SHIFT) \
+   | (15 << DF0_DATA_ITEM_SIZE_SHIFT))
+
+// Vector of length 1
+#define DF1_VECTOR_1 (0 << DF1_VECTOR_SIZE_SHIFT)
+
+// Vector of length 4
+#define DF1_VECTOR_4 (3 << DF1_VECTOR_SIZE_SHIFT)
+
+
+// ------------------------------------------------------------------------
+// Our context packets
+
+typedef struct beamformer_if_cntx_tag {
+  if_context_hdr_t     cntx_hdr;
+  uint64_t             rf_ref_freq;    // Q44.20 Hz
+  uint64_t             sample_rate;    // Q44.20 Hz
+  vrt_payload_format_t format;
+  // FIXME context association lists
+} __attribute__((packed)) beamformer_if_cntx_t;
+
+typedef struct gps_if_cntx_tag {
+  if_context_hdr_t     cntx_hdr;
+  vrt_formatted_gps_t  formatted_gps;
+} __attribute__((packed)) gps_if_cntx_t;
+
+typedef struct gain_if_cntx_tag {
+  if_context_hdr_t     cntx_hdr;
+  uint32_t             gain;
+} __attribute__((packed)) gain_if_cntx_t;
+
+typedef struct caldiv_if_cntx_tag {
+  if_context_hdr_t     cntx_hdr;
+  uint64_t lo_freq;
+  uint32_t lo_locked;
+  uint64_t cal_freq;
+  uint32_t cal_locked;
+  uint32_t cal_enabled;
+  uint32_t temp;
+  uint32_t rev;
+  uint32_t ser;
+  uint32_t mod;
+} __attribute__((packed)) caldiv_if_cntx_t;
+
+// FIXME the rest...
+
+// ------------------------------------------------------------------------
+// All of them concatenated
+
+#define        NCONTEXT_PKTS   7       // number of context pkts aggregated here
+
+typedef struct all_context_tag {
+  beamformer_if_cntx_t beamformer;
+  gain_if_cntx_t       db[4];
+
+  // FIXME add Extension Context for board types, revs, serial numbers, temps
+  caldiv_if_cntx_t caldiv;
+
+  gps_if_cntx_t                gps;            // must be last
+} __attribute__((packed)) all_context_t;
+
+#define SIZEOF_ALL_CONTEXT        (sizeof(all_context_t))
+#define SIZEOF_ALL_CONTEXT_BUT_GPS (SIZEOF_ALL_CONTEXT - sizeof(gps_if_cntx_t))
+
+
+#endif /* INCLUDED_IF_CONTEXT_H */
index d30ee14f128ed2ebce92e2b89d7857ab185942b6..525a177a82c8b4a7cf2a42a9e487d6c08bd924ff 100644 (file)
@@ -96,11 +96,9 @@ namespace vrt {
 
     vrt::rx::sptr vrt_rx() const { return d_rx; }
 
-    // FIXME add rxdspno as the first parameter
-    bool start_streaming(int samples_per_pkt = 0);
+    bool start_streaming(int rxdspno, int samples_per_pkt = 0);
 
-    // FIXME add rxdspno as the first parameter
-    bool stop_streaming();
+    bool stop_streaming(int rxdspno);
 
     /* convenience methods that ultimately write the dboard pins */
     bool set_center_freq(double target_freq);
diff --git a/vrt/include/vrt/types.h b/vrt/include/vrt/types.h
new file mode 100644 (file)
index 0000000..edfa4ec
--- /dev/null
@@ -0,0 +1,138 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2009 Free Software Foundation, Inc.
+ *
+ * This program 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 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+#ifndef INCLUDED_VRT_TYPES_H
+#define INCLUDED_VRT_TYPES_H
+
+#include <stdint.h>
+
+/* macros for dealing with fixed point numbers */
+#define _FXPT_C(_type, _x, _rp) ((_type)((_x)*(1ll << _rp)))
+#define _FXPT_TO_INT(_x, _one) (((_x) + ((_one)/2))/(_one))
+#define _FXPT_TO_DOUBLE(_x, _one) ((double)(_x) * (1.0/(_one)))
+
+/***********************************************************************
+ * The VRT Altitude Type (meters)
+ **********************************************************************/
+typedef int32_t vrt_altitude_t;
+#define VRT_ALTITUDE_RP 5
+#define VRT_ALTITUDE_C(_x) _FXPT_C(vrt_altitude_t, _x, VRT_ALTITUDE_RP)
+
+static inline vrt_altitude_t
+double_to_vrt_altitude(double num){
+  return VRT_ALTITUDE_C(num);
+}
+
+static inline int32_t
+vrt_altitude_round_to_int(vrt_altitude_t fx){
+  return _FXPT_TO_INT(fx, VRT_ALTITUDE_C(1));
+}
+
+static inline double
+vrt_altitude_to_double(vrt_altitude_t fx){
+  return _FXPT_TO_DOUBLE(fx, VRT_ALTITUDE_C(1));
+}
+
+/***********************************************************************
+ * The VRT Geolocation Angle Type (degrees)
+ **********************************************************************/
+typedef int32_t vrt_geo_angle_t;
+#define VRT_GEO_ANGLE_RP 22
+#define VRT_GEO_ANGLE_C(_x) _FXPT_C(vrt_geo_angle_t, _x, VRT_GEO_ANGLE_RP)
+
+static inline vrt_geo_angle_t
+double_to_vrt_geo_angle(double num){
+  return VRT_GEO_ANGLE_C(num);
+}
+
+static inline int16_t
+vrt_geo_angle_round_to_int(vrt_geo_angle_t fx){
+  return _FXPT_TO_INT(fx, VRT_GEO_ANGLE_C(1));
+}
+
+static inline double
+vrt_geo_angle_to_double(vrt_geo_angle_t fx){
+  return _FXPT_TO_DOUBLE(fx, VRT_GEO_ANGLE_C(1));
+}
+
+/***********************************************************************
+ * The VRT Frequency Type (Hz)
+ **********************************************************************/
+typedef int64_t vrt_freq_t;
+#define VRT_FREQ_RP 20
+#define VRT_FREQ_C(_x) _FXPT_C(vrt_freq_t, _x, VRT_FREQ_RP)
+
+static inline vrt_freq_t
+double_to_vrt_freq(double num){
+  return VRT_FREQ_C(num);
+}
+
+static inline int64_t
+vrt_freq_round_to_int(vrt_freq_t fx){
+  return _FXPT_TO_INT(fx, VRT_FREQ_C(1));
+}
+
+static inline double
+vrt_freq_to_double(vrt_freq_t fx){
+  return _FXPT_TO_DOUBLE(fx, VRT_FREQ_C(1));
+}
+
+/***********************************************************************
+ * The VRT Gain Type (dB)
+ **********************************************************************/
+typedef int16_t vrt_gain_t;
+#define VRT_GAIN_RP 7
+#define VRT_GAIN_C(_x) _FXPT_C(vrt_gain_t, _x, VRT_GAIN_RP)
+
+static inline vrt_gain_t
+double_to_vrt_gain(double num){
+  return VRT_GAIN_C(num);
+}
+
+static inline int16_t
+vrt_gain_round_to_int(vrt_gain_t fx){
+  return _FXPT_TO_INT(fx, VRT_GAIN_C(1));
+}
+
+static inline double
+vrt_gain_to_double(vrt_gain_t fx){
+  return _FXPT_TO_DOUBLE(fx, VRT_GAIN_C(1));
+}
+
+/***********************************************************************
+ * The VRT Temperature Type (Celcius)
+ **********************************************************************/
+typedef int16_t vrt_temp_t;
+#define VRT_TEMP_RP 6
+#define VRT_TEMP_C(_x) _FXPT_C(vrt_temp_t, _x, VRT_TEMP_RP)
+
+static inline vrt_temp_t
+double_to_vrt_temp(double num){
+  return VRT_TEMP_C(num);
+}
+
+static inline int16_t
+vrt_temp_round_to_int(vrt_temp_t fx){
+  return _FXPT_TO_INT(fx, VRT_TEMP_C(1));
+}
+
+static inline double
+vrt_temp_to_double(vrt_temp_t fx){
+  return _FXPT_TO_DOUBLE(fx, VRT_TEMP_C(1));
+}
+
+#endif /* INCLUDED_VRT_TYPES_H */
index 9832c0cd54375fcda991279a6b0d0a7e5ca915cd..d41343a5d8800de6141383835ec7ca7d541b7ad8 100644 (file)
@@ -20,7 +20,8 @@ include $(top_srcdir)/Makefile.common
 AM_CPPFLAGS = \
     $(VRT_INCLUDES) \
     $(BOOST_CPPFLAGS) \
-    $(CPPUNIT_INCLUDES)
+    $(CPPUNIT_INCLUDES) \
+    $(GRUEL_INCLUDES)
 
 bin_PROGRAMS = 
 
index d5c4ea88814b6815620dc21905d0a22281f1c438..0eb2042d8f33796096e645db3f44b1e8504bdd18 100644 (file)
@@ -23,7 +23,7 @@
 #include <config.h>
 #endif
 #include <vrt/expanded_header.h>
-#include <arpa/inet.h>                 // needs autoconf'ing
+#include <gruel/inet.h>
 //#include <stdio.h>
 
 namespace vrt {
@@ -112,6 +112,12 @@ namespace vrt {
 #include "expanded_header_switch_body.h"
     }
 
+    /* is this a if context packet? */
+    if (h->if_context_p()){
+        *payload = p;
+        *n32_bit_words_payload = n32_bit_words_packet;
+    }
+
     return true;
   }
 
index a8bc3e525bdb5eea535c128d29b74c5b7b0d30ad..cc810e683b7d8998aa231598e71a23289cbe931e 100644 (file)
@@ -22,6 +22,8 @@
 #include <config.h>
 #endif
 #include <vrt/quadradio.h>
+#include <vrt/types.h>
+#include <gruel/inet.h>
 #include <errno.h>
 #include <string.h>
 #include <stdio.h>
@@ -74,19 +76,15 @@ vrt::quadradio::open(const char *ip)
 }
 
 bool
-vrt::quadradio::start_streaming(int samples_per_pkt)
+vrt::quadradio::start_streaming(int rxdspno, int samples_per_pkt)
 {
-  int rxdspno = 0;     // FIXME make it the first param
-
   return send_rx_command(d_ctrl_fd, rxdspno, true, d_ctrl_port_inaddr,
                         d_data_port, samples_per_pkt);
 }
 
 bool
-vrt::quadradio::stop_streaming()
+vrt::quadradio::stop_streaming(int rxdspno)
 {
-  int rxdspno = 0;     // FIXME make it the first param
-
   return send_stop_rx_command(d_ctrl_fd, rxdspno);
 }
 
@@ -381,12 +379,11 @@ vrt::quadradio::set_mem32(int addr, int value)
 bool
 vrt::quadradio::set_lo_freq(double freq)
 {
-  uint64_t lo_freq = uint64_t(freq * (uint64_t(1)<<20)); //q20 format
+  vrt_freq_t lo_freq = htonll(double_to_vrt_freq(freq));
   uint32_t cmd[4];
   cmd[0] = htonl(0);              // verb: set
   cmd[1] = htonl(6);              // id: lo freq
-  cmd[2] = htonl((lo_freq >> 32) & 0xffffffff);
-  cmd[3] = htonl((lo_freq >> 0) & 0xffffffff);
+  memcpy(cmd+2, &lo_freq, sizeof(lo_freq));
 
   return send_and_check(d_ctrl_fd, cmd, sizeof(cmd));
 }
@@ -394,12 +391,11 @@ vrt::quadradio::set_lo_freq(double freq)
 bool
 vrt::quadradio::set_cal_freq(double freq)
 {
-  uint64_t cal_freq = uint64_t(freq * (uint64_t(1)<<20)); //q20 format
+  vrt_freq_t cal_freq = htonll(double_to_vrt_freq(freq));
   uint32_t cmd[4];
   cmd[0] = htonl(0);              // verb: set
   cmd[1] = htonl(7);              // id: cal freq
-  cmd[2] = htonl((cal_freq >> 32) & 0xffffffff);
-  cmd[3] = htonl((cal_freq >> 0) & 0xffffffff);
+  memcpy(cmd+2, &cal_freq, sizeof(cal_freq));
 
   return send_and_check(d_ctrl_fd, cmd, sizeof(cmd));
 }