commit-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Commit-gnuradio] r6710 - gnuradio/branches/developers/gnychis/inband/us


From: gnychis
Subject: [Commit-gnuradio] r6710 - gnuradio/branches/developers/gnychis/inband/usrp/host/lib/inband
Date: Sat, 27 Oct 2007 00:48:38 -0600 (MDT)

Author: gnychis
Date: 2007-10-27 00:48:36 -0600 (Sat, 27 Oct 2007)
New Revision: 6710

Modified:
   
gnuradio/branches/developers/gnychis/inband/usrp/host/lib/inband/qa_inband_usrp_server.cc
   
gnuradio/branches/developers/gnychis/inband/usrp/host/lib/inband/usrp_rx_stub.cc
   
gnuradio/branches/developers/gnychis/inband/usrp/host/lib/inband/usrp_rx_stub.h
   
gnuradio/branches/developers/gnychis/inband/usrp/host/lib/inband/usrp_server.cc
Log:
Adding in throtteling functionality to usrp_rx_stub by calculating the
approximate inter-packet arrival based on the decimation rate.

The RX QA code now uses a 1 shot timeout in which it expects at least one packet
from the stub.


Modified: 
gnuradio/branches/developers/gnychis/inband/usrp/host/lib/inband/qa_inband_usrp_server.cc
===================================================================
--- 
gnuradio/branches/developers/gnychis/inband/usrp/host/lib/inband/qa_inband_usrp_server.cc
   2007-10-26 22:21:30 UTC (rev 6709)
+++ 
gnuradio/branches/developers/gnychis/inband/usrp/host/lib/inband/qa_inband_usrp_server.cc
   2007-10-27 06:48:36 UTC (rev 6710)
@@ -46,6 +46,8 @@
 
 static bool verbose = false;
 
+static pmt_t s_timeout = pmt_intern("%timeout");
+
 // 
----------------------------------------------------------------------------------------------
 
 class qa_alloc_top : public mb_mblock
@@ -903,10 +905,10 @@
 
   long d_rx_chan;
 
-  long d_got_response_recv;
+  bool d_got_response_recv;
 
-  long d_nmsg_to_recv;
-  long d_nmsg_recvd;
+  mb_time d_t0;
+  double d_delta_t;
 
  public:
   qa_rx_top(mb_runtime *runtime, const std::string &instance_name, pmt_t 
user_arg);
@@ -927,18 +929,19 @@
     d_got_response_recv(false)
 { 
 
-  d_nmsg_to_recv=12;
-  d_nmsg_recvd=0;
-  
   d_rx = define_port("rx0", "usrp-rx", false, mb_port::INTERNAL);
   d_cs = define_port("cs", "usrp-server-cs", false, mb_port::INTERNAL);
 
   // Use the stub with the usrp_server
-  pmt_t usrp_server_dict = pmt_make_dict();
-  pmt_dict_set(usrp_server_dict, pmt_intern("fake-usrp"), PMT_T);
+  pmt_t usrp_dict = pmt_make_dict();
+  // Set TX and RX interpolations
+  pmt_dict_set(usrp_dict,
+               pmt_intern("decim-rx"),
+               pmt_from_long(128));
+  pmt_dict_set(usrp_dict, pmt_intern("fake-usrp"), PMT_T);
 
   // Test the TX side
-  define_component("server", "usrp_server", usrp_server_dict);
+  define_component("server", "usrp_server", usrp_dict);
   connect("self", "rx0", "server", "rx0");
   connect("self", "cs", "server", "cs");
 }
@@ -967,17 +970,10 @@
              pmt_list2(PMT_NIL, 
                        pmt_from_long(0)));
 
-  // A small sleep is used to ensure, if working properly, a recv
-  // response comes through successfully before the close gets
-  // through
-  usleep(1000);
-
-  d_rx->send(s_cmd_stop_recv_raw_samples, 
-             pmt_list2(PMT_NIL, 
-                       pmt_from_long(0)));
-
-  d_cs->send(s_cmd_close, pmt_list1(pmt_list2(s_response_close,PMT_T)));
-  
+  // Schedule a small timeout in which we expect to have received at least one
+  // packet worth of samples from the stub
+  d_t0 = mb_time::time();
+  schedule_one_shot_timeout(d_t0 + 0.01, PMT_NIL);
 }
 
 
@@ -992,26 +988,37 @@
   
   pmt_t expected = pmt_nth(0, data);
   pmt_t status = pmt_nth(1, data);
+
+  // If we get a timeout we shutdown
+  if(pmt_eq(event, s_timeout)) {
+    if(verbose)
+      std::cout << "[qa_rx_top] Got timeout\n";
+    d_rx->send(s_cmd_stop_recv_raw_samples, 
+               pmt_list2(PMT_NIL, 
+                         pmt_from_long(0)));
+
+    d_cs->send(s_cmd_close, pmt_list1(pmt_list2(s_response_close,PMT_T)));
+    return;
+  }
   
   // For testing RX, an invocation handle is not generated by the stub,
   // therefore the same approach for testing is not used.  We simply
   // expect all responses to be true.
   if(pmt_eq(event, s_response_recv_raw_samples)) {
-    if(!pmt_eqv(status, PMT_T)) {
+    if(pmt_eqv(status, PMT_T)) {
+
       if(verbose)
-        std::cout << "Got: " << status << " Expected: " << PMT_T << "\n";
-      shutdown_all(PMT_F);
-      return;
-    }
-    else {
-      if(verbose)
         std::cout << "[qa_rx_top] Received expected response for message " 
-                  << d_nmsg_recvd
                   << " (" << event << ")\n";
 
       // All we want is 1 response receive!  Can't guarantee exact numbers
       d_got_response_recv = true;
     }
+    else {
+      if(verbose)
+        std::cout << "Got: " << status << " Expected: " << PMT_T << "\n";
+      shutdown_all(PMT_F);
+    }
     return;
   }
 
@@ -1026,8 +1033,7 @@
   } else {
     if(verbose)
       std::cout << "[qa_rx_top] Received expected response for message " 
-                << d_nmsg_recvd
-      << " (" << event << ")\n";
+                << " (" << event << ")\n";
   }
 
   if (pmt_eq(msg->port_id(), d_rx->port_symbol())) {
@@ -1051,12 +1057,7 @@
         std::cout << "[qa_rx_top] No response message before close\n";
       return;
     }
-
   }
-    
-  
-  d_nmsg_recvd++;
-
 }
 
 

Modified: 
gnuradio/branches/developers/gnychis/inband/usrp/host/lib/inband/usrp_rx_stub.cc
===================================================================
--- 
gnuradio/branches/developers/gnychis/inband/usrp/host/lib/inband/usrp_rx_stub.cc
    2007-10-26 22:21:30 UTC (rev 6709)
+++ 
gnuradio/branches/developers/gnychis/inband/usrp/host/lib/inband/usrp_rx_stub.cc
    2007-10-27 06:48:36 UTC (rev 6710)
@@ -40,7 +40,7 @@
 
 typedef usrp_inband_usb_packet transport_pkt;
 
-static const bool verbose = true;
+static const bool verbose = false;
 
 bool usrp_rx_stop_stub;
 
@@ -96,7 +96,6 @@
 void 
 usrp_rx_stub::initial_transition()
 {
-  
 }
 
 void
@@ -106,96 +105,122 @@
   pmt_t port_id = msg->port_id();
   pmt_t data = msg->data(); 
 
+  if (pmt_eq(msg->signal(), s_timeout)
+      && !pmt_eq(msg->data(), s_done)) {
+  
+    if(!usrp_rx_stop_stub) 
+      read_and_respond();
+    else {  // requested to stop
+      cancel_timeout(msg->metadata());
+      usrp_rx_stop_stub=false;
+      if(verbose)
+        std::cout << "[USRP_RX_STUB] Stopping RX stub\n";
+    }
+
+  }
+
   // Theoretically only have 1 message to ever expect, but
   // want to make sure its at least what we want
-  if(pmt_eq(port_id, d_cs->port_symbol())) {
+  if(pmt_eq(port_id, d_cs->port_symbol())
+      && pmt_eqv(event, s_cmd_usrp_rx_start_reading)) {
 
     if(verbose)
       std::cout << "[USRP_RX_STUB] Starting with decim @ " 
                 << d_decim_rx << std::endl;
     
-    if(pmt_eqv(event, s_cmd_usrp_rx_start_reading))
-      read_and_respond(data);
+      start_packet_timer();
   }
 }
 
+// Setup a periodic timer which will drive packet generation
 void
-usrp_rx_stub::read_and_respond(pmt_t data)
+usrp_rx_stub::start_packet_timer()
 {
+  d_t0 = mb_time::time();   // current time
 
-  while(!usrp_rx_stop_stub) {
+  // Calculate the inter-packet arrival time.  
+  double samples_per_sec = (64.0/(double)d_decim_rx)*1000000.0;
+  double frames_per_sec = samples_per_sec / (double)d_samples_per_frame;
+  double frame_rate = 1.0 / frames_per_sec;
 
-    long nsamples_this_frame = d_samples_per_frame;
+  if(verbose) {
+    std::cout << "[USRP_RX_STUB] Scheduling periodic packet generator\n";
+    std::cout << "\tsamples_per_sec: " << samples_per_sec << std::endl;
+    std::cout << "\tframes_per_sec: " << frames_per_sec << std::endl;
+    std::cout << "\tframe_rate: " << frame_rate << std::endl;
+  }
 
-    size_t nshorts = 2 * nsamples_this_frame;  // 16-bit I & Q
-    long channel = 0;
-    long n_bytes = nshorts*2;
-    pmt_t uvec = pmt_make_s16vector(nshorts, 0);
-    size_t ignore;
-    int16_t *samples = pmt_s16vector_writeable_elements(uvec, ignore);
+  schedule_periodic_timeout(d_t0 + frame_rate, mb_time(frame_rate), PMT_T);
+}
 
-    // fill in the complex sinusoid
+void
+usrp_rx_stub::read_and_respond()
+{
 
-    for (int i = 0; i < nsamples_this_frame; i++){
+  long nsamples_this_frame = d_samples_per_frame;
 
-      if (1){
-        gr_complex s;
-        d_nco.sincos(&s, 1, d_amplitude);
-        // write 16-bit i & q
-        samples[2*i] =   (int16_t) s.real();
-        samples[2*i+1] = (int16_t) s.imag();
-      }
-      else {
-        gr_complex s(d_amplitude, d_amplitude);
+  size_t nshorts = 2 * nsamples_this_frame;    // 16-bit I & Q
+  long channel = 0;
+  long n_bytes = nshorts*2;
+  pmt_t uvec = pmt_make_s16vector(nshorts, 0);
+  size_t ignore;
+  int16_t *samples = pmt_s16vector_writeable_elements(uvec, ignore);
 
-        // write 16-bit i & q
-        samples[2*i] =   (int16_t) s.real();
-        samples[2*i+1] = (int16_t) s.imag();
-      }
+  // fill in the complex sinusoid
+
+  for (int i = 0; i < nsamples_this_frame; i++){
+
+    if (1){
+      gr_complex s;
+      d_nco.sincos(&s, 1, d_amplitude);
+      // write 16-bit i & q
+      samples[2*i] =   (int16_t) s.real();
+      samples[2*i+1] = (int16_t) s.imag();
     }
-    
-    if(d_disk_write)
-      d_ofile.write((const char *)samples, n_bytes);
+    else {
+      gr_complex s(d_amplitude, d_amplitude);
+
+      // write 16-bit i & q
+      samples[2*i] =   (int16_t) s.real();
+      samples[2*i+1] = (int16_t) s.imag();
+    }
+  }
   
-    pmt_t v_pkt = pmt_make_u8vector(sizeof(transport_pkt), 0);
-    transport_pkt *pkt =
-      (transport_pkt *) pmt_u8vector_writeable_elements(v_pkt, ignore);
+  if(d_disk_write)
+    d_ofile.write((const char *)samples, n_bytes);
 
-    pkt->set_header(0, channel, 0, n_bytes);
-    pkt->set_timestamp(0xffffffff);
-    memcpy(pkt->payload(), samples, n_bytes);
-    
-    d_cs->send(s_response_usrp_rx_read, pmt_list3(PMT_NIL, PMT_T, v_pkt));
+  pmt_t v_pkt = pmt_make_u8vector(sizeof(transport_pkt), 0);
+  transport_pkt *pkt =
+    (transport_pkt *) pmt_u8vector_writeable_elements(v_pkt, ignore);
 
-    // Now lets check the shared CS queue between the TX and RX stub.  Each
-    // element in a queue is a list where the first element is an invocation
-    // handle and the second element is a PMT u8 vect representation of the
-    // CS packet response which can just be passed transparently.
-    while(!d_cs_queue.empty()) {
-      
-      pmt_t cs_pkt = d_cs_queue.front();
-      d_cs_queue.pop();
+  pkt->set_header(0, channel, 0, n_bytes);
+  pkt->set_timestamp(0xffffffff);
+  memcpy(pkt->payload(), samples, n_bytes);
+  
+  d_cs->send(s_response_usrp_rx_read, pmt_list3(PMT_NIL, PMT_T, v_pkt));
 
-      pmt_t invocation_handle = pmt_nth(0, cs_pkt);
-      pmt_t v_pkt = pmt_nth(1, cs_pkt);
+  // Now lets check the shared CS queue between the TX and RX stub.  Each
+  // element in a queue is a list where the first element is an invocation
+  // handle and the second element is a PMT u8 vect representation of the
+  // CS packet response which can just be passed transparently.
+  while(!d_cs_queue.empty()) {
+    
+    pmt_t cs_pkt = d_cs_queue.front();
+    d_cs_queue.pop();
 
-      d_cs->send(s_response_usrp_rx_read,   
-                 pmt_list3(invocation_handle, 
-                           PMT_T, 
-                           v_pkt));  // Take the front CS pkt
+    pmt_t invocation_handle = pmt_nth(0, cs_pkt);
+    pmt_t v_pkt = pmt_nth(1, cs_pkt);
 
-      
-      if(verbose)
-        std::cout << "[USRP_RX_STUB] Received CS response from TX stub\n";
-    }
+    d_cs->send(s_response_usrp_rx_read,   
+               pmt_list3(invocation_handle, 
+                         PMT_T, 
+                         v_pkt));  // Take the front CS pkt
 
+    
+    if(verbose)
+      std::cout << "[USRP_RX_STUB] Received CS response from TX stub\n";
   }
-  
-  usrp_rx_stop_stub = false;
 
-  if(verbose)
-    std::cout << "[USRP_RX_STUB] Got fake RX stop\n";
-
 }
 
 REGISTER_MBLOCK_CLASS(usrp_rx_stub);

Modified: 
gnuradio/branches/developers/gnychis/inband/usrp/host/lib/inband/usrp_rx_stub.h
===================================================================
--- 
gnuradio/branches/developers/gnychis/inband/usrp/host/lib/inband/usrp_rx_stub.h 
    2007-10-26 22:21:30 UTC (rev 6709)
+++ 
gnuradio/branches/developers/gnychis/inband/usrp/host/lib/inband/usrp_rx_stub.h 
    2007-10-27 06:48:36 UTC (rev 6710)
@@ -34,6 +34,9 @@
 extern bool usrp_rx_stop_stub;   // used to communicate a 'stop' to the RX stub
 extern std::queue<pmt_t> d_cs_queue;
 
+static pmt_t s_timeout = pmt_intern("%timeout");
+static pmt_t s_done = pmt_intern("done");
+
 /*!
  * \brief Implements the low level usb interface to the USRP
  */
@@ -46,6 +49,9 @@
   
   long         d_samples_per_frame;
   long    d_decim_rx;
+
+  mb_time d_t0;
+  double d_delta_t;
   
   // for generating sine wave output
   ui_nco<float,float>  d_nco;
@@ -62,8 +68,9 @@
   void handle_message(mb_message_sptr msg);
 
  private:
-  void read_and_respond(pmt_t data);
+  void read_and_respond();
   void read_data();
+  void start_packet_timer();
  
 };
   

Modified: 
gnuradio/branches/developers/gnychis/inband/usrp/host/lib/inband/usrp_server.cc
===================================================================
--- 
gnuradio/branches/developers/gnychis/inband/usrp/host/lib/inband/usrp_server.cc 
    2007-10-26 22:21:30 UTC (rev 6709)
+++ 
gnuradio/branches/developers/gnychis/inband/usrp/host/lib/inband/usrp_server.cc 
    2007-10-27 06:48:36 UTC (rev 6710)
@@ -41,7 +41,7 @@
 
 typedef usrp_inband_usb_packet transport_pkt;   // makes conversion to gigabit 
easy
 
-const static bool verbose = true;
+const static bool verbose = false;
 
 static std::string
 str(long x)





reply via email to

[Prev in Thread] Current Thread [Next in Thread]