commit-gnuradio
[Top][All Lists]
Advanced

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

[Commit-gnuradio] r8597 - in usrp2/trunk/host-ng: apps lib


From: eb
Subject: [Commit-gnuradio] r8597 - in usrp2/trunk/host-ng: apps lib
Date: Mon, 16 Jun 2008 21:39:35 -0600 (MDT)

Author: eb
Date: 2008-06-16 21:39:35 -0600 (Mon, 16 Jun 2008)
New Revision: 8597

Modified:
   usrp2/trunk/host-ng/apps/test_usrp2.cc
   usrp2/trunk/host-ng/lib/usrp2_impl.cc
Log:
host code now notices control channel packets

Modified: usrp2/trunk/host-ng/apps/test_usrp2.cc
===================================================================
--- usrp2/trunk/host-ng/apps/test_usrp2.cc      2008-06-17 03:35:46 UTC (rev 
8596)
+++ usrp2/trunk/host-ng/apps/test_usrp2.cc      2008-06-17 03:39:35 UTC (rev 
8597)
@@ -23,15 +23,57 @@
 #include <usrp2/usrp2.h>
 #include <gr_realtime.h>
 #include <iostream>
+#include <string.h>
 
+static void
+usage(const char *progname)
+{
+  const char *p = strrchr(progname, '/');      // drop leading directory path
+  if (p)
+    p++;
+
+  if (strncmp(p, "lt-", 3) == 0)               // drop lt- libtool prefix
+    p += 3;
+  
+  fprintf(stderr, "Usage: %s [options]\n\n", p);
+  fprintf(stderr, "Options:\n");
+  fprintf(stderr, "  -h                   show this message and exit\n");
+  fprintf(stderr, "  -e ETH_INTERFACE     specify ethernet interface 
[default=eth0]\n");
+  fprintf(stderr, "  -m MAC_ADDR          mac address of USRP2 HH:HH 
[default=first one found]\n");
+}
+
 int
 main(int argc, char **argv)
 {
+  // options and their defaults
+  const char *interface = "eth0";
+  const char *mac_addr_str = "";
+
+  int ch;
+
+  while ((ch = getopt(argc, argv, "he:m:")) != EOF){
+    switch (ch){
+
+    case 'e':
+      interface = optarg;
+      break;
+      
+    case 'm':
+      mac_addr_str = optarg;
+      break;
+
+    case 'h':
+    default:
+      usage(argv[0]);
+      exit(1);
+    }
+  }
+  
   gr_rt_status_t rt = gr_enable_realtime_scheduling();
   if (rt != RT_OK)
     std::cerr << "Failed to enable realtime scheduling" << std::endl;
 
-  usrp2::usrp2::sptr u2 = usrp2::usrp2::make("eth0");
+  usrp2::usrp2::sptr u2 = usrp2::usrp2::make(interface, mac_addr_str);
   
   u2->set_rx_gain(1.0);
   u2->set_rx_freq(0.0, NULL);
@@ -40,8 +82,10 @@
   
   struct timespec ts;
   ts.tv_sec = 10;
-  nanosleep(&ts, 0);
-  std::cout << std::endl;
+  ts.tv_nsec = 0;
+  int r = nanosleep(&ts, 0);
+  if (r == -1)
+    perror("nanosleep");
   
   u2->stop_rx_streaming();
   

Modified: usrp2/trunk/host-ng/lib/usrp2_impl.cc
===================================================================
--- usrp2/trunk/host-ng/lib/usrp2_impl.cc       2008-06-17 03:35:46 UTC (rev 
8596)
+++ usrp2/trunk/host-ng/lib/usrp2_impl.cc       2008-06-17 03:39:35 UTC (rev 
8597)
@@ -28,6 +28,7 @@
 #include "pktfilter.h"
 #include <stdexcept>
 #include <iostream>
+#include <stdio.h>
 
 #define USRP2_IMPL_DEBUG 1
 #if USRP2_IMPL_DEBUG
@@ -38,6 +39,36 @@
 
 namespace usrp2 {
 
+  std::string
+  opcode_to_string(int opcode)
+  {
+    switch(opcode){
+    case OP_EOP: return "OP_EOP";
+    case OP_ID: return "OP_ID";
+    case OP_ID_REPLY: return "OP_ID_REPLY";
+    case OP_BURN_MAC_ADDR: return "OP_BURN_MAC_ADDR";
+    case OP_READ_TIME: return "OP_READ_TIME";
+    case OP_READ_TIME_REPLY: return "OP_READ_TIME_REPLY";
+    case OP_CONFIG_RX_V2: return "OP_CONFIG_RX_V2";
+    case OP_CONFIG_RX_REPLY_V2: return "OP_CONFIG_RX_REPLY_V2";
+    case OP_CONFIG_TX_V2: return "OP_CONFIG_TX_V2";
+    case OP_CONFIG_TX_REPLY_V2: return "OP_CONFIG_TX_REPLY_V2";
+    case OP_START_RX_STREAMING: return "OP_START_RX_STREAMING";
+    case OP_STOP_RX: return "OP_STOP_RX";
+    case OP_START_RX: return "OP_START_RX";
+    case OP_CONFIG_TX: return "OP_CONFIG_TX";
+    case OP_WRITE_REG: return "OP_WRITE_REG";
+    case OP_WRITE_REG_MASKED: return "OP_WRITE_REG_MASKED";
+    case OP_READ_REG: return "OP_READ_REG";
+    case OP_READ_REG_REPLY: return "OP_READ_REG_REPLY";
+    default:
+      char buf[64];
+      snprintf(buf, sizeof(buf), "<unknown opcode: %d>", opcode);
+      return buf;
+    }
+  }
+
+
   usrp2::impl::impl(const std::string &ifc, const std::string &addr)
     : d_buffer(new eth_buffer()), d_pf(0), d_bg_thread(0), d_bg_running(false),
       d_rx_decim(0), d_rx_seqno(-1), d_tx_seqno(0), d_next_rid(0),
@@ -353,26 +384,39 @@
   unsigned int
   usrp2::impl::operator()(const void *base, unsigned int len)
   {
-    u2_eth_samples_t *pkt = (u2_eth_samples_t *)base;
+    u2_eth_samples_t  *pkt = (u2_eth_samples_t *)base;
+    int chan = u2p_chan(&pkt->hdrs.fixed);
+
+    if (chan == CONTROL_CHAN){         // control packets
+      // point to beginning of payload (subpackets)
+      unsigned char *p = ((unsigned char *) pkt) + sizeof(u2_eth_packet_t);
+
+      // FIXME iterate over payload, handling more than a single
+      // subpacket, when (if?) the firmware starts sending them
+
+      int opcode = p[0];
+      std::cerr << "control_packet: " << opcode_to_string(opcode) << std::endl;
+    }
+    else {                             // data packets
+      d_num_rx_frames++;
+      d_num_rx_bytes += len;
     
-    d_num_rx_frames++;
-    d_num_rx_bytes += len;
-    
-    if (d_rx_seqno != -1) {
-      int expected_seqno = (d_rx_seqno + 1) & 0xFF;
-      int seqno = pkt->hdrs.thdr.seqno; 
+      if (d_rx_seqno != -1) {
+       int expected_seqno = (d_rx_seqno + 1) & 0xFF;
+       int seqno = pkt->hdrs.thdr.seqno; 
       
-      if (seqno != expected_seqno) {
-       ::write(2, "uS", 2); // missing sequence number
-       int missing = expected_seqno - seqno;
-       if (missing < 0)
-         missing += 256;
+       if (seqno != expected_seqno) {
+         ::write(2, "uS", 2); // missing sequence number
+         int missing = expected_seqno - seqno;
+         if (missing < 0)
+           missing += 256;
        
-       d_num_rx_lost += missing;
+         d_num_rx_lost += missing;
+       }
       }
+      d_rx_seqno = pkt->hdrs.thdr.seqno;
     }
-    
-    d_rx_seqno = pkt->hdrs.thdr.seqno;
+
     return 0;
   }
   





reply via email to

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