#!/usr/bin/env python # # Decoder of IEEE 802.15.4 RADIO Packets. # # Modified by: Thomas Schmid, Leslie Choong, Mikhail Tadjikov # from gnuradio import gr, eng_notation from gnuradio import uhd from gnuradio.ucla_blks import ieee802_15_4_pkt from gnuradio.eng_option import eng_option from optparse import OptionParser import struct, sys, time n2s = eng_notation.num_to_str class stats(object): def __init__(self): self.npkts = 0 self.nright = 0 class oqpsk_rx_graph (gr.top_block): def __init__(self, options, rx_callback): gr.top_block.__init__(self) # ---------------------------------------------------------------- self.data_rate = options.data_rate self.samples_per_symbol = 2 self._samp_rate = 200000 print "data_rate = ", n2s(self.data_rate) print "samples_per_symbol = ", self.samples_per_symbol self.u = uhd.usrp_source (device_addr=options.address, io_type=uhd.io_type.COMPLEX_FLOAT32, num_channels=1) # set the antenna self.u.set_antenna(options.antenna, 0) # set sampling rate self.u.set_samp_rate(self._samp_rate) # set and print center frequency treq = uhd.tune_request(options.center_freq) self.u.set_center_freq(treq) cntr_freq = self.u.get_center_freq() print "Center freqency: %d " % (cntr_freq) self.packet_receiver = ieee802_15_4_pkt.ieee802_15_4_demod_pkts(self, callback=rx_callback, sps=self.samples_per_symbol, symbol_rate=self.data_rate, threshold=-1) self.connect(self.u, self.packet_receiver) # self.vecsink = gr.vector_sink_c() # self.connect(self.u, self.vecsink) def main (): def rx_callback(ok, payload): st.npkts += 1 if ok: st.nright += 1 (pktno,) = struct.unpack('!H', payload[0:2]) print "ok = %5r pktno = %4d len(payload) = %4d %d/%d" % (ok, pktno, len(payload), st.nright, st.npkts) print " ------------------------" sys.stdout.flush() parser = OptionParser(option_class=eng_option) parser.add_option("-a", "--address", type="string", default="addr=192.168.10.2", help="Address of UHD device, [default=%default]") parser.add_option("-A", "--antenna", type="string", default="RX2", help="select Rx Antenna where appropiate") parser.add_option("-c", "--center_freq", type="eng_float", default=2475000000, help="set Rx center frequency to FREQ", metavar="FREQ") parser.add_option("-r", "--data_rate", type="eng_float", default=2000000) parser.add_option("-f", "--filename", type="string", default="rx.dat", help="write data to FILENAME") parser.add_option("-g", "--gain", type="eng_float", default=0, help="set Rx PGA gain in dB [0,20]") (options, args) = parser.parse_args() st = stats() tb = oqpsk_rx_graph(options, rx_callback) tb.start() tb.wait() if __name__ == '__main__': # insert this in your test code... #import os #print 'Blocked waiting for GDB attach (pid = %d)' % (os.getpid(),) #raw_input ('Press Enter to continue: ') main ()