commit-gnuradio
[Top][All Lists]
Advanced

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

[Commit-gnuradio] r4376 - in gnuradio/branches/developers/jcorgan/digita


From: jcorgan
Subject: [Commit-gnuradio] r4376 - in gnuradio/branches/developers/jcorgan/digital: gnuradio-core/src/lib/general gnuradio-core/src/python/gnuradio gnuradio-core/src/python/gnuradio/blksimpl gnuradio-examples/python/digital
Date: Sun, 4 Feb 2007 23:48:07 -0700 (MST)

Author: jcorgan
Date: 2007-02-04 23:48:07 -0700 (Sun, 04 Feb 2007)
New Revision: 4376

Modified:
   
gnuradio/branches/developers/jcorgan/digital/gnuradio-core/src/lib/general/gr_framer_sink_1.cc
   
gnuradio/branches/developers/jcorgan/digital/gnuradio-core/src/lib/general/gr_framer_sink_1.h
   
gnuradio/branches/developers/jcorgan/digital/gnuradio-core/src/python/gnuradio/blksimpl/pkt.py
   
gnuradio/branches/developers/jcorgan/digital/gnuradio-core/src/python/gnuradio/packet_utils.py
   
gnuradio/branches/developers/jcorgan/digital/gnuradio-examples/python/digital/benchmark_tx.py
   
gnuradio/branches/developers/jcorgan/digital/gnuradio-examples/python/digital/transmit_path.py
Log:
Trial implementation of whitener indexing.  NOT TESTED.

Adds --use-whitener-offset option to benchmark_tx.py.

Adds a 4 bit field to the existing packet header above the 12 bits
already used for the length field.  Does not increase packet size.

The whitener now has an optional offset parameter that will shift the
start of XOR operation some number of bytes (default is zero) with 
wraparound.

When the --use-whitener-offset option is set, this offset is
incremented for each transmitted packet, and stored in the new 4 bit
field.

If a received packet fails CRC because of some pattern-specific 
synchronization problem, if the upper protocol layers cause a
retransmission, the new packet on the wire, even if identical to the 
previous, will have a different whitened bit pattern, allowing it to
go through.



Modified: 
gnuradio/branches/developers/jcorgan/digital/gnuradio-core/src/lib/general/gr_framer_sink_1.cc
===================================================================
--- 
gnuradio/branches/developers/jcorgan/digital/gnuradio-core/src/lib/general/gr_framer_sink_1.cc
      2007-02-05 05:52:47 UTC (rev 4375)
+++ 
gnuradio/branches/developers/jcorgan/digital/gnuradio-core/src/lib/general/gr_framer_sink_1.cc
      2007-02-05 06:48:07 UTC (rev 4376)
@@ -52,13 +52,14 @@
 }
 
 inline void
-gr_framer_sink_1::enter_have_header(int payload_len)
+gr_framer_sink_1::enter_have_header(int payload_len, int whitener_offset)
 {
   if (VERBOSE)
-    fprintf(stderr, "@ enter_have_header (payload_len = %d)\n", payload_len);
+    fprintf(stderr, "@ enter_have_header (payload_len = %d) (offset = %d\n", 
whitener_offset);
 
   d_state = STATE_HAVE_HEADER;
   d_packetlen = payload_len;
+  d_packet_whitener_offset = whitener_offset;
   d_packetlen_cnt = 0;
   d_packet_byte = 0;
   d_packet_byte_index = 0;
@@ -125,11 +126,10 @@
 
          // we have a full header, check to see if it has been received 
properly
          if (header_ok()){
-           int payload_len = header_payload_len();
-           if (payload_len <= MAX_PKT_LEN)             // reasonable?
-             enter_have_header(payload_len);           // yes.
-           else
-             enter_search();                           // no.
+           int payload_len;
+           int payload_offset;
+           header_payload(&payload_len, &payload_offset);
+           enter_have_header(payload_len, payload_offset);
          }
          else
            enter_search();                             // no.
@@ -151,7 +151,8 @@
          if (d_packetlen_cnt == d_packetlen){          // packet is filled
 
            // build a message
-           gr_message_sptr msg = gr_make_message(0, 0, 0, d_packetlen_cnt);    
    
+           // NOTE: passing header field as arg1 is not scalable
+           gr_message_sptr msg = gr_make_message(0, d_packet_whitener_offset, 
0, d_packetlen_cnt);         
            memcpy(msg->msg(), d_packet, d_packetlen_cnt);
 
            d_target_queue->insert_tail(msg);           // send it

Modified: 
gnuradio/branches/developers/jcorgan/digital/gnuradio-core/src/lib/general/gr_framer_sink_1.h
===================================================================
--- 
gnuradio/branches/developers/jcorgan/digital/gnuradio-core/src/lib/general/gr_framer_sink_1.h
       2007-02-05 05:52:47 UTC (rev 4375)
+++ 
gnuradio/branches/developers/jcorgan/digital/gnuradio-core/src/lib/general/gr_framer_sink_1.h
       2007-02-05 06:48:07 UTC (rev 4376)
@@ -70,6 +70,7 @@
   unsigned char             d_packet_byte;             // byte being assembled
   int               d_packet_byte_index;       // which bit of d_packet_byte 
we're working on
   int               d_packetlen;               // length of packet
+  int                d_packet_whitener_offset;  // offset into whitener string 
to use
   int               d_packetlen_cnt;           // how many so far
 
  protected:
@@ -77,7 +78,7 @@
 
   void enter_search();
   void enter_have_sync();
-  void enter_have_header(int payload_len);
+  void enter_have_header(int payload_len, int whitener_offset);
   
   bool header_ok()
   {
@@ -85,11 +86,13 @@
     return ((d_header >> 16) ^ (d_header & 0xffff)) == 0;
   }
 
-  int header_payload_len()
+  void header_payload(int *len, int *offset)
   {
     // header consists of two 16-bit shorts in network byte order
-    int t = (d_header >> 16) & 0xffff;
-    return t;
+    // payload length is lower 12 bits
+    // whitener offset is upper 4 bits
+    *len = (d_header >> 16) & 0x0fff;
+    *offset = (d_header >> 28) & 0x000f;
   }
 
  public:

Modified: 
gnuradio/branches/developers/jcorgan/digital/gnuradio-core/src/python/gnuradio/blksimpl/pkt.py
===================================================================
--- 
gnuradio/branches/developers/jcorgan/digital/gnuradio-core/src/python/gnuradio/blksimpl/pkt.py
      2007-02-05 05:52:47 UTC (rev 4375)
+++ 
gnuradio/branches/developers/jcorgan/digital/gnuradio-core/src/python/gnuradio/blksimpl/pkt.py
      2007-02-05 06:48:07 UTC (rev 4376)
@@ -36,7 +36,7 @@
 
     Send packets by calling send_pkt
     """
-    def __init__(self, fg, modulator, access_code=None, msgq_limit=2, 
pad_for_usrp=True):
+    def __init__(self, fg, modulator, access_code=None, msgq_limit=2, 
pad_for_usrp=True, use_whitener_offset=False):
         """
        Hierarchical block for sending packets
 
@@ -52,12 +52,15 @@
         @param msgq_limit: maximum number of messages in message queue
         @type msgq_limit: int
         @param pad_for_usrp: If true, packets are padded such that they end up 
a multiple of 128 samples
-
+        @param use_whitener_offset: If true, start of whitener XOR string is 
incremented each packet
+        
         See gmsk_mod for remaining parameters
         """
         self._modulator = modulator
         self._pad_for_usrp = pad_for_usrp
-
+        self._use_whitener_offset = use_whitener_offset
+        self._whitener_offset = 0
+        
         if access_code is None:
             access_code = packet_utils.default_access_code
         if not packet_utils.is_1_0_string(access_code):
@@ -84,9 +87,13 @@
                                            
self._modulator.samples_per_symbol(),
                                            self._modulator.bits_per_symbol(),
                                            self._access_code,
-                                           self._pad_for_usrp)
+                                           self._pad_for_usrp,
+                                           self._whitener_offset)
             #print "pkt =", string_to_hex_list(pkt)
             msg = gr.message_from_string(pkt)
+            if self._use_whitener_offset is True:
+                self._whitener_offset = (self._whitener_offset + 1) % 16
+                
         self._pkt_input.msgq().insert_tail(msg)
 
 
@@ -151,6 +158,6 @@
     def run(self):
         while self.keep_running:
             msg = self.rcvd_pktq.delete_head()
-            ok, payload = packet_utils.unmake_packet(msg.to_string())
+            ok, payload = packet_utils.unmake_packet(msg.to_string(), 
int(msg.arg1()))
             if self.callback:
                 self.callback(ok, payload)

Modified: 
gnuradio/branches/developers/jcorgan/digital/gnuradio-core/src/python/gnuradio/packet_utils.py
===================================================================
--- 
gnuradio/branches/developers/jcorgan/digital/gnuradio-core/src/python/gnuradio/packet_utils.py
      2007-02-05 05:52:47 UTC (rev 4375)
+++ 
gnuradio/branches/developers/jcorgan/digital/gnuradio-core/src/python/gnuradio/packet_utils.py
      2007-02-05 06:48:07 UTC (rev 4376)
@@ -86,22 +86,25 @@
     return map(lambda x: hex(ord(x)), s)
 
 
-def whiten(s):
+def whiten(s, o):
     sa = Numeric.fromstring(s, Numeric.UnsignedInt8)
-    z = sa ^ random_mask_vec8[0:len(sa)]
+    z = sa ^ random_mask_vec8[o:len(sa)+o]
     return z.tostring()
 
-def dewhiten(s):
-    return whiten(s)        # self inverse
+def dewhiten(s, o):
+    return whiten(s, o)        # self inverse
 
 
-def make_header(payload_len):
-    return struct.pack('!HH', payload_len, payload_len)
+def make_header(payload_len, whitener_offset=0):
+    val = 4096 * (whitener_offset & 0xf) + payload_len  # Upper nibble is 
offset, lower 12 bits is len
+    #print "offset =", whitener_offset, " len =", payload_len, " val=", val
+    return struct.pack('!HH', val, val)
 
 def make_packet(payload, samples_per_symbol, bits_per_symbol,
-                access_code=default_access_code, pad_for_usrp=True):
+                access_code=default_access_code, pad_for_usrp=True,
+                whitener_offset=0):
     """
-    Build a packet, given access code and payload.
+    Build a packet, given access code, payload, and whitener offset
 
     @param payload:               packet payload, len [0, 4096]
     @param samples_per_symbol:    samples per symbol (needed for padding 
calculation)
@@ -109,6 +112,7 @@
     @param bits_per_symbol:       (needed for padding calculation)
     @type bits_per_symbol:        int
     @param access_code:           string of ascii 0's and 1's
+    @param whitener_offset        offset into whitener string to use [0-16)
     
     Packet will have access code at the beginning, followed by length, payload
     and finally CRC-32.
@@ -116,6 +120,9 @@
     if not is_1_0_string(access_code):
         raise ValueError, "access_code must be a string containing only 0's 
and 1's (%r)" % (access_code,)
 
+    if not whitener_offset >=0 and whitener_offset < 16:
+        raise ValueError, "whitener_offset must be between 0 and 15, inclusive 
(%i)" % (whitener_offset,)
+
     (packed_access_code, padded) = 
conv_1_0_string_to_packed_binary_string(access_code)
     (packed_preamble, ignore) = 
conv_1_0_string_to_packed_binary_string(preamble)
     
@@ -127,7 +134,8 @@
     if L > MAXLEN:
         raise ValueError, "len(payload) must be in [0, %d]" % (MAXLEN,)
 
-    pkt = ''.join((packed_preamble, packed_access_code, make_header(L), 
whiten(payload_with_crc), '\x55'))
+    pkt = ''.join((packed_preamble, packed_access_code, make_header(L, 
whitener_offset),
+                   whiten(payload_with_crc, whitener_offset), '\x55'))
     if pad_for_usrp:
         pkt = pkt + (_npadding_bytes(len(pkt), samples_per_symbol, 
bits_per_symbol) * '\x55')
 
@@ -156,13 +164,13 @@
     return byte_modulus - r
     
 
-def unmake_packet(whitened_payload_with_crc):
+def unmake_packet(whitened_payload_with_crc, whitener_offset=0):
     """
     Return (ok, payload)
 
     @param whitened_payload_with_crc: string
     """
-    payload_with_crc = dewhiten(whitened_payload_with_crc)
+    payload_with_crc = dewhiten(whitened_payload_with_crc, whitener_offset)
     ok, payload = gru.check_crc32(payload_with_crc)
 
     if 0:

Modified: 
gnuradio/branches/developers/jcorgan/digital/gnuradio-examples/python/digital/benchmark_tx.py
===================================================================
--- 
gnuradio/branches/developers/jcorgan/digital/gnuradio-examples/python/digital/benchmark_tx.py
       2007-02-05 05:52:47 UTC (rev 4375)
+++ 
gnuradio/branches/developers/jcorgan/digital/gnuradio-examples/python/digital/benchmark_tx.py
       2007-02-05 06:48:07 UTC (rev 4376)
@@ -73,6 +73,9 @@
                       help="enable discontinous transmission (bursts of 5 
packets)")
     parser.add_option("","--from-file", default=None,
                       help="use file for packet contents")
+    parser.add_option("","--use-whitener-offset", action="store_true", 
default=False,
+                      help="make sequential packets use different whitening")
+
     transmit_path.add_options(parser, expert_grp)
 
     for mod in mods.values():

Modified: 
gnuradio/branches/developers/jcorgan/digital/gnuradio-examples/python/digital/transmit_path.py
===================================================================
--- 
gnuradio/branches/developers/jcorgan/digital/gnuradio-examples/python/digital/transmit_path.py
      2007-02-05 05:52:47 UTC (rev 4375)
+++ 
gnuradio/branches/developers/jcorgan/digital/gnuradio-examples/python/digital/transmit_path.py
      2007-02-05 06:48:07 UTC (rev 4376)
@@ -50,7 +50,8 @@
         self._samples_per_symbol = options.samples_per_symbol  # desired 
samples/baud
         self._fusb_block_size    = options.fusb_block_size # usb info for USRP
         self._fusb_nblocks       = options.fusb_nblocks    # usb info for USRP
-
+        self._use_whitener_offset = options.use_whitener_offset # increment 
start of whitener XOR data
+        
         self._modulator_class = modulator_class         # the modulator_class 
we are using
     
         if self._tx_freq is None:
@@ -80,7 +81,8 @@
                           self._modulator_class(fg, **mod_kwargs),
                           access_code=None,
                           msgq_limit=4,
-                          pad_for_usrp=True)
+                          pad_for_usrp=True,
+                          use_whitener_offset=options.use_whitener_offset)
 
 
         # Set the USRP for maximum transmit gain





reply via email to

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