blob: 7bf4ee358611b725a5f174d555a29917ef91c992 [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)
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]))
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, False)
158 self.blocks_socket_pdu_0_0 = blocks.socket_pdu("UDP_SERVER", "127.0.0.1", "4729", 10000)
159# self.blocks_socket_pdu_0 = blocks.socket_pdu("UDP_CLIENT", "127.0.0.1", "4729", 10000, False)
160 self.blocks_socket_pdu_0 = blocks.socket_pdu("UDP_CLIENT", "127.0.0.1", "4729", 10000)
Piotr Krysik35582082015-09-02 21:49:12 +0200161 self.blocks_rotator_cc_0 = blocks.rotator_cc(-2*pi*shiftoff/samp_rate)
162
163 ##################################################
164 # Connections
165 ##################################################
166 self.msg_connect((self.gsm_bcch_ccch_demapper_0, 'bursts'), (self.gsm_control_channels_decoder_0, 'bursts'))
167 self.msg_connect((self.gsm_clock_offset_control_0, 'ppm'), (self.gsm_input_0, 'ppm_in'))
168 self.msg_connect((self.gsm_control_channels_decoder_0, 'msgs'), (self.blocks_socket_pdu_0, 'pdus'))
169 self.msg_connect((self.gsm_control_channels_decoder_0, 'msgs'), (self.gsm_message_printer_1, 'msgs'))
170 self.msg_connect((self.gsm_control_channels_decoder_0_0, 'msgs'), (self.blocks_socket_pdu_0, 'pdus'))
171 self.msg_connect((self.gsm_control_channels_decoder_0_0, 'msgs'), (self.gsm_message_printer_1, 'msgs'))
172 self.msg_connect((self.gsm_decryption_0, 'bursts'), (self.gsm_control_channels_decoder_0_0, 'bursts'))
173 self.msg_connect((self.gsm_receiver_0, 'C0'), (self.gsm_bcch_ccch_demapper_0, 'bursts'))
174 self.msg_connect((self.gsm_receiver_0, 'measurements'), (self.gsm_clock_offset_control_0, 'measurements'))
175 self.msg_connect((self.gsm_receiver_0, 'C0'), (self.gsm_sdcch8_demapper_0, 'bursts'))
176 self.msg_connect((self.gsm_sdcch8_demapper_0, 'bursts'), (self.gsm_decryption_0, 'bursts'))
177 self.connect((self.blocks_rotator_cc_0, 0), (self.gsm_input_0, 0))
178 self.connect((self.blocks_rotator_cc_0, 0), (self.qtgui_freq_sink_x_0, 0))
179 self.connect((self.gsm_input_0, 0), (self.gsm_receiver_0, 0))
180 self.connect((self.rtlsdr_source_0, 0), (self.blocks_rotator_cc_0, 0))
181
182 def closeEvent(self, event):
Piotr Krysik332e0b52016-02-13 18:37:32 +0100183 self.settings = Qt.QSettings("GNU Radio", "grgsm_livemon")
Piotr Krysik35582082015-09-02 21:49:12 +0200184 self.settings.setValue("geometry", self.saveGeometry())
185 event.accept()
186
187 def get_fc(self):
188 return self.fc
189
190 def set_fc(self, fc):
191 self.fc = fc
192 self.set_fc_slider(self.fc)
193 self.gsm_input_0.set_fc(self.fc)
194
195 def get_gain(self):
196 return self.gain
197
198 def set_gain(self, gain):
199 self.gain = gain
200 self.set_g_slider(self.gain)
201
202 def get_ppm(self):
203 return self.ppm
204
205 def set_ppm(self, ppm):
206 self.ppm = ppm
207 self.set_ppm_slider(self.ppm)
208
209 def get_samp_rate(self):
210 return self.samp_rate
211
212 def set_samp_rate(self, samp_rate):
213 self.samp_rate = samp_rate
214 self.blocks_rotator_cc_0.set_phase_inc(-2*pi*self.shiftoff/self.samp_rate)
215 self.gsm_input_0.set_samp_rate_in(self.samp_rate)
216 self.qtgui_freq_sink_x_0.set_frequency_range(self.fc_slider, self.samp_rate)
217 self.rtlsdr_source_0.set_sample_rate(self.samp_rate)
218
219 def get_shiftoff(self):
220 return self.shiftoff
221
222 def set_shiftoff(self, shiftoff):
223 self.shiftoff = shiftoff
224 self.blocks_rotator_cc_0.set_phase_inc(-2*pi*self.shiftoff/self.samp_rate)
225 self.rtlsdr_source_0.set_center_freq(self.fc_slider-self.shiftoff, 0)
226 self.rtlsdr_source_0.set_bandwidth(250e3+abs(self.shiftoff), 0)
227
228 def get_ppm_slider(self):
229 return self.ppm_slider
230
231 def set_ppm_slider(self, ppm_slider):
232 self.ppm_slider = ppm_slider
233 self.rtlsdr_source_0.set_freq_corr(self.ppm_slider, 0)
234
235 def get_g_slider(self):
236 return self.g_slider
237
238 def set_g_slider(self, g_slider):
239 self.g_slider = g_slider
240 self.rtlsdr_source_0.set_gain(self.g_slider, 0)
241
242 def get_fc_slider(self):
243 return self.fc_slider
244
245 def set_fc_slider(self, fc_slider):
246 self.fc_slider = fc_slider
247 self.qtgui_freq_sink_x_0.set_frequency_range(self.fc_slider, self.samp_rate)
248 self.rtlsdr_source_0.set_center_freq(self.fc_slider-self.shiftoff, 0)
249
250
251if __name__ == '__main__':
252 parser = OptionParser(option_class=eng_option, usage="%prog: [options]")
253 parser.add_option("-f", "--fc", dest="fc", type="eng_float", default=eng_notation.num_to_str(939.4e6),
254 help="Set fc [default=%default]")
255 parser.add_option("-g", "--gain", dest="gain", type="eng_float", default=eng_notation.num_to_str(30),
256 help="Set gain [default=%default]")
257 parser.add_option("-p", "--ppm", dest="ppm", type="intx", default=0,
258 help="Set ppm [default=%default]")
259 parser.add_option("-s", "--samp-rate", dest="samp_rate", type="eng_float", default=eng_notation.num_to_str(2000000.052982),
260 help="Set samp_rate [default=%default]")
261 parser.add_option("-o", "--shiftoff", dest="shiftoff", type="eng_float", default=eng_notation.num_to_str(400e3),
262 help="Set shiftoff [default=%default]")
Piotr Krysik7185b662016-02-14 20:24:54 +0100263 parser.add_option("", "--args", dest="args", type="string", default="",
264 help="Set device arguments [default=%default]")
265
Piotr Krysik35582082015-09-02 21:49:12 +0200266 (options, args) = parser.parse_args()
Piotr Krysik56b0a672015-10-12 08:34:15 +0200267# from distutils.version import StrictVersion
268# if StrictVersion(Qt.qVersion()) >= StrictVersion("4.5.0"):
269# Qt.QApplication.setGraphicsSystem(gr.prefs().get_string('qtgui','style','raster'))
270 Qt.QApplication.setGraphicsSystem(gr.prefs().get_string('qtgui','style','raster'))
Piotr Krysik35582082015-09-02 21:49:12 +0200271 qapp = Qt.QApplication(sys.argv)
Piotr Krysik7185b662016-02-14 20:24:54 +0100272 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 +0200273 tb.start()
274 tb.show()
275
276 def quitting():
277 tb.stop()
278 tb.wait()
279 qapp.connect(qapp, Qt.SIGNAL("aboutToQuit()"), quitting)
280 qapp.exec_()
281 tb = None # to clean up Qt widgets