Houston, we have a trunk.
[debian/gnuradio] / gnuradio-examples / python / gmsk2 / gmsk_test.py
1 #!/usr/bin/env python
2
3 from gnuradio import gr, blks
4 from gnuradio.eng_option import eng_option
5 from optparse import OptionParser
6 import random
7 import struct
8
9 #import os
10 #print os.getpid()
11 #raw_input('Attach and press enter')
12
13
14 class my_graph(gr.flow_graph):
15
16     def __init__(self, rx_callback, spb, bt, SNR, freq_error):
17         gr.flow_graph.__init__(self)
18
19         fg = self
20
21         # Tuning Parameters
22         gain_mu = 0.002*spb
23         omega = spb*(1+freq_error)
24
25         # transmitter
26         self.packet_transmitter = blks.gmsk2_mod_pkts(fg, spb=spb, bt=bt)
27
28         # add some noise
29         add = gr.add_cc()
30         noise = gr.noise_source_c(gr.GR_GAUSSIAN, pow(10.0,-SNR/20.0))
31
32         # channel filter
33         rx_filt_taps = gr.firdes.low_pass(1,spb,0.8,0.1,gr.firdes.WIN_HANN)
34         rx_filt = gr.fir_filter_ccf(1,rx_filt_taps)
35
36         # receiver
37         self.packet_receiver = blks.gmsk2_demod_pkts(fg, callback=rx_callback,
38                                                      spb=spb, gain_mu=gain_mu,
39                                                      freq_error=freq_error, omega=omega)
40
41         fg.connect (self.packet_transmitter, (add,0))
42         fg.connect (noise, (add,1))
43         fg.connect(add, rx_filt, self.packet_receiver)
44
45
46 class stats(object):
47     def __init__(self):
48         self.npkts = 0
49         self.nright = 0
50         
51 def main():
52     st = stats()
53     
54     def send_pkt(payload='', eof=False):
55         fg.packet_transmitter.send_pkt(payload, eof)
56
57     def rx_callback(ok, payload):
58         st.npkts += 1
59         if ok:
60             st.nright += 1
61         if len(payload) <= 16:
62             print "ok = %5r  payload = '%s'  %d/%d" % (ok, payload, st.nright, st.npkts)
63         else:
64             (pktno,) = struct.unpack('!H', payload[0:2])
65             print "ok = %5r  pktno = %4d  len(payload) = %4d  %d/%d" % (ok, pktno, len(payload),
66                                                                         st.nright, st.npkts)
67
68
69     parser = OptionParser (option_class=eng_option)
70     parser.add_option("-M", "--megabytes", type="eng_float", default=1,
71                       help="set megabytes to transmit [default=%default]")
72     parser.add_option("-s", "--size", type="eng_float", default=1500,
73                       help="set packet size [default=%default]")
74     parser.add_option("","--spb", type=int, default=4,
75                       help="set samples per baud to SPB [default=%default]")
76     parser.add_option("", "--bt", type="eng_float", default=0.3,
77                       help="set bandwidth time product for Gaussian filter [default=%default]")
78     parser.add_option("", "--snr", type="eng_float", default=20,
79                       help="set SNR in dB for simulation [default=%default]")
80     parser.add_option("", "--freq-error", type="eng_float", default=0,
81                       help="set frequency error for simulation [default=%default]")
82     (options, args) = parser.parse_args ()
83
84     if len(args) != 0:
85         parser.print_help()
86         sys.exit(1)
87
88     pkt_size = int(options.size)
89
90     fg = my_graph(rx_callback, options.spb, options.bt, options.snr, options.freq_error)
91     fg.start()
92
93     nbytes = int(1e6 * options.megabytes)
94     n = 0
95     pktno = 0
96
97     send_pkt('Hello World')
98
99     # generate and send packets
100     while n < nbytes:
101         send_pkt(struct.pack('!H', pktno) + (pkt_size - 2) * chr(pktno & 0xff))
102         n += pkt_size
103         pktno += 1
104
105     send_pkt('Goodbye World')
106     send_pkt(eof=True)             # tell modulator we're not sending any more pkts
107
108     fg.wait()
109
110
111 if __name__ == '__main__':
112     try:
113         main()
114     except KeyboardInterrupt:
115         pass