blob: 1d379707ae39c4aef0288a84736c89223a7bb74d [file] [log] [blame]
Piotr Krysik35582082015-09-02 21:49:12 +02001#!/usr/bin/env python2
2##################################################
3# GNU Radio Python Flow Graph
Piotr Krysik332e0b52016-02-13 18:37:32 +01004# Title: Gr-gsm Livemon
Piotr Krysik35582082015-09-02 21:49:12 +02005# 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
Piotr Krysik332e0b52016-02-13 18:37:32 +010036class grgsm_livemon(gr.top_block, Qt.QWidget):
Piotr Krysik35582082015-09-02 21:49:12 +020037
Piotr Krysik7185b662016-02-14 20:24:54 +010038 def __init__(self, fc=939.4e6, gain=30, ppm=0, samp_rate=2000000.052982, shiftoff=400e3, args=""):
Piotr Krysik332e0b52016-02-13 18:37:32 +010039 gr.top_block.__init__(self, "Gr-gsm Livemon")
Piotr Krysik35582082015-09-02 21:49:12 +020040 Qt.QWidget.__init__(self)
Piotr Krysik332e0b52016-02-13 18:37:32 +010041 self.setWindowTitle("Gr-gsm Livemon")
Piotr Krysik35582082015-09-02 21:49:12 +020042 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
Piotr Krysik332e0b52016-02-13 18:37:32 +010058 self.settings = Qt.QSettings("GNU Radio", "grgsm_livemon")
Piotr Krysik35582082015-09-02 21:49:12 +020059 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)
Piotr Krysik7185b662016-02-14 20:24:54 +010089 self.rtlsdr_source_0 = osmosdr.source( args="numchan=" + str(1) + " " + args )
Piotr Krysik35582082015-09-02 21:49:12 +020090 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)
Piotr Krysik56b0a672015-10-12 08:34:15 +0200112# 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])
Piotr Krysik35582082015-09-02 21:49:12 +0200140
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)
Piotr Krysik773a1942016-05-20 12:45:54 +0200143 self.gsm_sdcch8_demapper_0 = grgsm.gsm_sdcch8_demapper(1)
Piotr Krysik35582082015-09-02 21:49:12 +0200144 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)
Piotr Krysik773a1942016-05-20 12:45:54 +0200156 self.gsm_bcch_ccch_demapper_0 = grgsm.gsm_bcch_ccch_demapper(0)
Piotr Krysik56b0a672015-10-12 08:34:15 +0200157 self.blocks_socket_pdu_0_0 = blocks.socket_pdu("UDP_SERVER", "127.0.0.1", "4729", 10000)
Piotr Krysik56b0a672015-10-12 08:34:15 +0200158 self.blocks_socket_pdu_0 = blocks.socket_pdu("UDP_CLIENT", "127.0.0.1", "4729", 10000)
Piotr Krysik35582082015-09-02 21:49:12 +0200159 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):
Piotr Krysik332e0b52016-02-13 18:37:32 +0100181 self.settings = Qt.QSettings("GNU Radio", "grgsm_livemon")
Piotr Krysik35582082015-09-02 21:49:12 +0200182 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]")
Piotr Krysik7185b662016-02-14 20:24:54 +0100261 parser.add_option("", "--args", dest="args", type="string", default="",
262 help="Set device arguments [default=%default]")
263
Piotr Krysik35582082015-09-02 21:49:12 +0200264 (options, args) = parser.parse_args()
Piotr Krysik56b0a672015-10-12 08:34:15 +0200265# from distutils.version import StrictVersion
266# if StrictVersion(Qt.qVersion()) >= StrictVersion("4.5.0"):
267# Qt.QApplication.setGraphicsSystem(gr.prefs().get_string('qtgui','style','raster'))
268 Qt.QApplication.setGraphicsSystem(gr.prefs().get_string('qtgui','style','raster'))
Piotr Krysik35582082015-09-02 21:49:12 +0200269 qapp = Qt.QApplication(sys.argv)
Piotr Krysik7185b662016-02-14 20:24:54 +0100270 tb = grgsm_livemon(fc=options.fc, gain=options.gain, ppm=options.ppm, samp_rate=options.samp_rate, shiftoff=options.shiftoff, args=options.args)
Piotr Krysik35582082015-09-02 21:49:12 +0200271 tb.start()
272 tb.show()
273
274 def quitting():
275 tb.stop()
276 tb.wait()
277 qapp.connect(qapp, Qt.SIGNAL("aboutToQuit()"), quitting)
278 qapp.exec_()
279 tb = None # to clean up Qt widgets