blob: 17cb1d3e27110453ad8b312e184b393528127fe4 [file] [log] [blame]
Piotr Krysik35582082015-09-02 21:49:12 +02001#!/usr/bin/env python2
2##################################################
3# GNU Radio Python Flow Graph
4# Title: Airprobe Rtlsdr
5# Generated: Wed Sep 2 21:46:35 2015
6##################################################
7
8if __name__ == '__main__':
9 import ctypes
10 import sys
11 if sys.platform.startswith('linux'):
12 try:
13 x11 = ctypes.cdll.LoadLibrary('libX11.so')
14 x11.XInitThreads()
15 except:
16 print "Warning: failed to XInitThreads()"
17
18from PyQt4 import Qt
19from gnuradio import blocks
20from gnuradio import eng_notation
21from gnuradio import gr
22from gnuradio import qtgui
23from gnuradio.eng_option import eng_option
24from gnuradio.filter import firdes
25from gnuradio.qtgui import Range, RangeWidget
26from math import pi
27from optparse import OptionParser
28import grgsm
29import osmosdr
30import pmt
31import sip
32import sys
33import time
34
35
36class airprobe_rtlsdr(gr.top_block, Qt.QWidget):
37
38 def __init__(self, fc=939.4e6, gain=30, ppm=0, samp_rate=2000000.052982, shiftoff=400e3):
39 gr.top_block.__init__(self, "Airprobe Rtlsdr")
40 Qt.QWidget.__init__(self)
41 self.setWindowTitle("Airprobe Rtlsdr")
42 try:
43 self.setWindowIcon(Qt.QIcon.fromTheme('gnuradio-grc'))
44 except:
45 pass
46 self.top_scroll_layout = Qt.QVBoxLayout()
47 self.setLayout(self.top_scroll_layout)
48 self.top_scroll = Qt.QScrollArea()
49 self.top_scroll.setFrameStyle(Qt.QFrame.NoFrame)
50 self.top_scroll_layout.addWidget(self.top_scroll)
51 self.top_scroll.setWidgetResizable(True)
52 self.top_widget = Qt.QWidget()
53 self.top_scroll.setWidget(self.top_widget)
54 self.top_layout = Qt.QVBoxLayout(self.top_widget)
55 self.top_grid_layout = Qt.QGridLayout()
56 self.top_layout.addLayout(self.top_grid_layout)
57
58 self.settings = Qt.QSettings("GNU Radio", "airprobe_rtlsdr")
59 self.restoreGeometry(self.settings.value("geometry").toByteArray())
60
61 ##################################################
62 # Parameters
63 ##################################################
64 self.fc = fc
65 self.gain = gain
66 self.ppm = ppm
67 self.samp_rate = samp_rate
68 self.shiftoff = shiftoff
69
70 ##################################################
71 # Variables
72 ##################################################
73 self.ppm_slider = ppm_slider = ppm
74 self.g_slider = g_slider = gain
75 self.fc_slider = fc_slider = fc
76
77 ##################################################
78 # Blocks
79 ##################################################
80 self._ppm_slider_range = Range(-150, 150, 1, ppm, 100)
81 self._ppm_slider_win = RangeWidget(self._ppm_slider_range, self.set_ppm_slider, "PPM Offset", "counter", float)
82 self.top_layout.addWidget(self._ppm_slider_win)
83 self._g_slider_range = Range(0, 50, 0.5, gain, 100)
84 self._g_slider_win = RangeWidget(self._g_slider_range, self.set_g_slider, "Gain", "counter", float)
85 self.top_layout.addWidget(self._g_slider_win)
86 self._fc_slider_range = Range(925e6, 1990e6, 2e5, fc, 100)
87 self._fc_slider_win = RangeWidget(self._fc_slider_range, self.set_fc_slider, "Frequency", "counter_slider", float)
88 self.top_layout.addWidget(self._fc_slider_win)
89 self.rtlsdr_source_0 = osmosdr.source( args="numchan=" + str(1) + " " + "" )
90 self.rtlsdr_source_0.set_sample_rate(samp_rate)
91 self.rtlsdr_source_0.set_center_freq(fc_slider-shiftoff, 0)
92 self.rtlsdr_source_0.set_freq_corr(ppm_slider, 0)
93 self.rtlsdr_source_0.set_dc_offset_mode(2, 0)
94 self.rtlsdr_source_0.set_iq_balance_mode(2, 0)
95 self.rtlsdr_source_0.set_gain_mode(False, 0)
96 self.rtlsdr_source_0.set_gain(g_slider, 0)
97 self.rtlsdr_source_0.set_if_gain(20, 0)
98 self.rtlsdr_source_0.set_bb_gain(20, 0)
99 self.rtlsdr_source_0.set_antenna("", 0)
100 self.rtlsdr_source_0.set_bandwidth(250e3+abs(shiftoff), 0)
101
102 self.qtgui_freq_sink_x_0 = qtgui.freq_sink_c(
103 1024, #size
104 firdes.WIN_BLACKMAN_hARRIS, #wintype
105 fc_slider, #fc
106 samp_rate, #bw
107 "", #name
108 1 #number of inputs
109 )
110 self.qtgui_freq_sink_x_0.set_update_time(0.10)
111 self.qtgui_freq_sink_x_0.set_y_axis(-140, 10)
112 self.qtgui_freq_sink_x_0.set_trigger_mode(qtgui.TRIG_MODE_FREE, 0.0, 0, "")
113 self.qtgui_freq_sink_x_0.enable_autoscale(False)
114 self.qtgui_freq_sink_x_0.enable_grid(False)
115 self.qtgui_freq_sink_x_0.set_fft_average(1.0)
116 self.qtgui_freq_sink_x_0.enable_control_panel(False)
117
118 if not True:
119 self.qtgui_freq_sink_x_0.disable_legend()
120
121 if complex == type(float()):
122 self.qtgui_freq_sink_x_0.set_plot_pos_half(not True)
123
124 labels = ["", "", "", "", "",
125 "", "", "", "", ""]
126 widths = [1, 1, 1, 1, 1,
127 1, 1, 1, 1, 1]
128 colors = ["blue", "red", "green", "black", "cyan",
129 "magenta", "yellow", "dark red", "dark green", "dark blue"]
130 alphas = [1.0, 1.0, 1.0, 1.0, 1.0,
131 1.0, 1.0, 1.0, 1.0, 1.0]
132 for i in xrange(1):
133 if len(labels[i]) == 0:
134 self.qtgui_freq_sink_x_0.set_line_label(i, "Data {0}".format(i))
135 else:
136 self.qtgui_freq_sink_x_0.set_line_label(i, labels[i])
137 self.qtgui_freq_sink_x_0.set_line_width(i, widths[i])
138 self.qtgui_freq_sink_x_0.set_line_color(i, colors[i])
139 self.qtgui_freq_sink_x_0.set_line_alpha(i, alphas[i])
140
141 self._qtgui_freq_sink_x_0_win = sip.wrapinstance(self.qtgui_freq_sink_x_0.pyqwidget(), Qt.QWidget)
142 self.top_layout.addWidget(self._qtgui_freq_sink_x_0_win)
143 self.gsm_sdcch8_demapper_0 = grgsm.universal_ctrl_chans_demapper(1, ([0,4,8,12,16,20,24,28,32,36,40,44]), ([8,8,8,8,8,8,8,8,136,136,136,136]))
144 self.gsm_receiver_0 = grgsm.receiver(4, ([0]), ([]))
145 self.gsm_message_printer_1 = grgsm.message_printer(pmt.intern(""), False)
146 self.gsm_input_0 = grgsm.gsm_input(
147 ppm=0,
148 osr=4,
149 fc=fc,
150 samp_rate_in=samp_rate,
151 )
152 self.gsm_decryption_0 = grgsm.decryption(([]), 1)
153 self.gsm_control_channels_decoder_0_0 = grgsm.control_channels_decoder()
154 self.gsm_control_channels_decoder_0 = grgsm.control_channels_decoder()
155 self.gsm_clock_offset_control_0 = grgsm.clock_offset_control(fc-shiftoff)
156 self.gsm_bcch_ccch_demapper_0 = grgsm.universal_ctrl_chans_demapper(0, ([2,6,12,16,22,26,32,36,42,46]), ([1,2,2,2,2,2,2,2,2,2]))
157 self.blocks_socket_pdu_0_0 = blocks.socket_pdu("UDP_SERVER", "127.0.0.1", "4729", 10000, False)
158 self.blocks_socket_pdu_0 = blocks.socket_pdu("UDP_CLIENT", "127.0.0.1", "4729", 10000, False)
159 self.blocks_rotator_cc_0 = blocks.rotator_cc(-2*pi*shiftoff/samp_rate)
160
161 ##################################################
162 # Connections
163 ##################################################
164 self.msg_connect((self.gsm_bcch_ccch_demapper_0, 'bursts'), (self.gsm_control_channels_decoder_0, 'bursts'))
165 self.msg_connect((self.gsm_clock_offset_control_0, 'ppm'), (self.gsm_input_0, 'ppm_in'))
166 self.msg_connect((self.gsm_control_channels_decoder_0, 'msgs'), (self.blocks_socket_pdu_0, 'pdus'))
167 self.msg_connect((self.gsm_control_channels_decoder_0, 'msgs'), (self.gsm_message_printer_1, 'msgs'))
168 self.msg_connect((self.gsm_control_channels_decoder_0_0, 'msgs'), (self.blocks_socket_pdu_0, 'pdus'))
169 self.msg_connect((self.gsm_control_channels_decoder_0_0, 'msgs'), (self.gsm_message_printer_1, 'msgs'))
170 self.msg_connect((self.gsm_decryption_0, 'bursts'), (self.gsm_control_channels_decoder_0_0, 'bursts'))
171 self.msg_connect((self.gsm_receiver_0, 'C0'), (self.gsm_bcch_ccch_demapper_0, 'bursts'))
172 self.msg_connect((self.gsm_receiver_0, 'measurements'), (self.gsm_clock_offset_control_0, 'measurements'))
173 self.msg_connect((self.gsm_receiver_0, 'C0'), (self.gsm_sdcch8_demapper_0, 'bursts'))
174 self.msg_connect((self.gsm_sdcch8_demapper_0, 'bursts'), (self.gsm_decryption_0, 'bursts'))
175 self.connect((self.blocks_rotator_cc_0, 0), (self.gsm_input_0, 0))
176 self.connect((self.blocks_rotator_cc_0, 0), (self.qtgui_freq_sink_x_0, 0))
177 self.connect((self.gsm_input_0, 0), (self.gsm_receiver_0, 0))
178 self.connect((self.rtlsdr_source_0, 0), (self.blocks_rotator_cc_0, 0))
179
180 def closeEvent(self, event):
181 self.settings = Qt.QSettings("GNU Radio", "airprobe_rtlsdr")
182 self.settings.setValue("geometry", self.saveGeometry())
183 event.accept()
184
185 def get_fc(self):
186 return self.fc
187
188 def set_fc(self, fc):
189 self.fc = fc
190 self.set_fc_slider(self.fc)
191 self.gsm_input_0.set_fc(self.fc)
192
193 def get_gain(self):
194 return self.gain
195
196 def set_gain(self, gain):
197 self.gain = gain
198 self.set_g_slider(self.gain)
199
200 def get_ppm(self):
201 return self.ppm
202
203 def set_ppm(self, ppm):
204 self.ppm = ppm
205 self.set_ppm_slider(self.ppm)
206
207 def get_samp_rate(self):
208 return self.samp_rate
209
210 def set_samp_rate(self, samp_rate):
211 self.samp_rate = samp_rate
212 self.blocks_rotator_cc_0.set_phase_inc(-2*pi*self.shiftoff/self.samp_rate)
213 self.gsm_input_0.set_samp_rate_in(self.samp_rate)
214 self.qtgui_freq_sink_x_0.set_frequency_range(self.fc_slider, self.samp_rate)
215 self.rtlsdr_source_0.set_sample_rate(self.samp_rate)
216
217 def get_shiftoff(self):
218 return self.shiftoff
219
220 def set_shiftoff(self, shiftoff):
221 self.shiftoff = shiftoff
222 self.blocks_rotator_cc_0.set_phase_inc(-2*pi*self.shiftoff/self.samp_rate)
223 self.rtlsdr_source_0.set_center_freq(self.fc_slider-self.shiftoff, 0)
224 self.rtlsdr_source_0.set_bandwidth(250e3+abs(self.shiftoff), 0)
225
226 def get_ppm_slider(self):
227 return self.ppm_slider
228
229 def set_ppm_slider(self, ppm_slider):
230 self.ppm_slider = ppm_slider
231 self.rtlsdr_source_0.set_freq_corr(self.ppm_slider, 0)
232
233 def get_g_slider(self):
234 return self.g_slider
235
236 def set_g_slider(self, g_slider):
237 self.g_slider = g_slider
238 self.rtlsdr_source_0.set_gain(self.g_slider, 0)
239
240 def get_fc_slider(self):
241 return self.fc_slider
242
243 def set_fc_slider(self, fc_slider):
244 self.fc_slider = fc_slider
245 self.qtgui_freq_sink_x_0.set_frequency_range(self.fc_slider, self.samp_rate)
246 self.rtlsdr_source_0.set_center_freq(self.fc_slider-self.shiftoff, 0)
247
248
249if __name__ == '__main__':
250 parser = OptionParser(option_class=eng_option, usage="%prog: [options]")
251 parser.add_option("-f", "--fc", dest="fc", type="eng_float", default=eng_notation.num_to_str(939.4e6),
252 help="Set fc [default=%default]")
253 parser.add_option("-g", "--gain", dest="gain", type="eng_float", default=eng_notation.num_to_str(30),
254 help="Set gain [default=%default]")
255 parser.add_option("-p", "--ppm", dest="ppm", type="intx", default=0,
256 help="Set ppm [default=%default]")
257 parser.add_option("-s", "--samp-rate", dest="samp_rate", type="eng_float", default=eng_notation.num_to_str(2000000.052982),
258 help="Set samp_rate [default=%default]")
259 parser.add_option("-o", "--shiftoff", dest="shiftoff", type="eng_float", default=eng_notation.num_to_str(400e3),
260 help="Set shiftoff [default=%default]")
261 (options, args) = parser.parse_args()
262 from distutils.version import StrictVersion
263 if StrictVersion(Qt.qVersion()) >= StrictVersion("4.5.0"):
264 Qt.QApplication.setGraphicsSystem(gr.prefs().get_string('qtgui','style','raster'))
265 qapp = Qt.QApplication(sys.argv)
266 tb = airprobe_rtlsdr(fc=options.fc, gain=options.gain, ppm=options.ppm, samp_rate=options.samp_rate, shiftoff=options.shiftoff)
267 tb.start()
268 tb.show()
269
270 def quitting():
271 tb.stop()
272 tb.wait()
273 qapp.connect(qapp, Qt.SIGNAL("aboutToQuit()"), quitting)
274 qapp.exec_()
275 tb = None # to clean up Qt widgets