Merge commit '38d5389f3054164a2f04d6e4e8fe381aa5ee03fc' into vrt
authorJosh Blum <josh@joshknows.com>
Mon, 12 Oct 2009 19:16:12 +0000 (12:16 -0700)
committerJosh Blum <josh@joshknows.com>
Mon, 12 Oct 2009 19:16:12 +0000 (12:16 -0700)
14 files changed:
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/expanded_header.cc
vrt/lib/quadradio.cc

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..45dad1f89ab313106aac88da4b3cc2a99e889c83 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,22 @@ 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_serial(void){return d_caldiv_rev;}
+  int get_caldiv_revision(void){return d_caldiv_ser;}
+  
+  //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..3035813cc54a9c5821de5ac3c3485e2ffc8519af 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>
+
 
 #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,24 @@ 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_ser = ntohx(h.get_if_context()->caldiv.ser);
+    d_caldiv_rev = ntohx(h.get_if_context()->caldiv.rev);
+    //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..46d80f4426e033eaee0c158dd32f5094a639d7fd 100644 (file)
@@ -34,6 +34,22 @@ 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;
+  
+  //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 +58,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..b1d5424
--- /dev/null
@@ -0,0 +1,242 @@
+/* -*- 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;
+} __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 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));
 }