[Top][All Lists]
[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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [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,
jcorgan <=