blob: 3e818c56b7e50d135bb108a297afdec785fde4cd [file] [log] [blame]
Piotr Krysik35582082015-09-02 21:49:12 +02001#!/usr/bin/env python2
Piotr Krysik6577ec22016-07-15 13:21:09 +02002# -*- coding: utf-8 -*-
Piotr Krysikea34c012016-10-02 18:53:43 +02003# @file
Piotr Krysika6268a52017-08-23 16:02:19 +02004# @author (C) 2014-2016 by Piotr Krysik <ptrkrysik@gmail.com>
Piotr Krysikea34c012016-10-02 18:53:43 +02005# @section LICENSE
6#
7# Gr-gsm is free software; you can redistribute it and/or modify
8# it under the terms of the GNU General Public License as published by
9# the Free Software Foundation; either version 3, or (at your option)
10# any later version.
11#
12# Gr-gsm is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU General Public License for more details.
16#
17# You should have received a copy of the GNU General Public License
18# along with gr-gsm; see the file COPYING. If not, write to
19# the Free Software Foundation, Inc., 51 Franklin Street,
20# Boston, MA 02110-1301, USA.
21#
22#
Piotr Krysik35582082015-09-02 21:49:12 +020023##################################################
24# GNU Radio Python Flow Graph
Piotr Krysik332e0b52016-02-13 18:37:32 +010025# Title: Gr-gsm Livemon
Piotr Krysik6577ec22016-07-15 13:21:09 +020026# Author: Piotr Krysik
27# Description: Interactive monitor of a single C0 channel with analysis performed by Wireshark (command to run wireshark: sudo wireshark -k -f udp -Y gsmtap -i lo)
Piotr Krysikf0c83d82018-01-23 15:07:08 +010028# Generated: Tue Jan 23 14:59:18 2018
Piotr Krysik35582082015-09-02 21:49:12 +020029##################################################
30
31if __name__ == '__main__':
32 import ctypes
33 import sys
34 if sys.platform.startswith('linux'):
35 try:
36 x11 = ctypes.cdll.LoadLibrary('libX11.so')
37 x11.XInitThreads()
38 except:
39 print "Warning: failed to XInitThreads()"
40
41from PyQt4 import Qt
42from gnuradio import blocks
43from gnuradio import eng_notation
44from gnuradio import gr
45from gnuradio import qtgui
46from gnuradio.eng_option import eng_option
47from gnuradio.filter import firdes
48from gnuradio.qtgui import Range, RangeWidget
49from math import pi
50from optparse import OptionParser
51import grgsm
52import osmosdr
53import pmt
54import sip
55import sys
56import time
Piotr Krysikf0c83d82018-01-23 15:07:08 +010057from gnuradio import qtgui
Piotr Krysik35582082015-09-02 21:49:12 +020058
59
Piotr Krysik332e0b52016-02-13 18:37:32 +010060class grgsm_livemon(gr.top_block, Qt.QWidget):
Piotr Krysik35582082015-09-02 21:49:12 +020061
Piotr Krysikf0c83d82018-01-23 15:07:08 +010062 def __init__(self, args="", collector='localhost', collectorport='4729', fc=941.8e6, gain=30, osr=4, ppm=0, samp_rate=2000000.052982, serverport='4729', shiftoff=400e3):
Piotr Krysik332e0b52016-02-13 18:37:32 +010063 gr.top_block.__init__(self, "Gr-gsm Livemon")
Piotr Krysik35582082015-09-02 21:49:12 +020064 Qt.QWidget.__init__(self)
Piotr Krysik332e0b52016-02-13 18:37:32 +010065 self.setWindowTitle("Gr-gsm Livemon")
Piotr Krysikf0c83d82018-01-23 15:07:08 +010066 qtgui.util.check_set_qss()
Piotr Krysik35582082015-09-02 21:49:12 +020067 try:
Piotr Krysik6577ec22016-07-15 13:21:09 +020068 self.setWindowIcon(Qt.QIcon.fromTheme('gnuradio-grc'))
Piotr Krysik35582082015-09-02 21:49:12 +020069 except:
Piotr Krysik6577ec22016-07-15 13:21:09 +020070 pass
Piotr Krysik35582082015-09-02 21:49:12 +020071 self.top_scroll_layout = Qt.QVBoxLayout()
72 self.setLayout(self.top_scroll_layout)
73 self.top_scroll = Qt.QScrollArea()
74 self.top_scroll.setFrameStyle(Qt.QFrame.NoFrame)
75 self.top_scroll_layout.addWidget(self.top_scroll)
76 self.top_scroll.setWidgetResizable(True)
77 self.top_widget = Qt.QWidget()
78 self.top_scroll.setWidget(self.top_widget)
79 self.top_layout = Qt.QVBoxLayout(self.top_widget)
80 self.top_grid_layout = Qt.QGridLayout()
81 self.top_layout.addLayout(self.top_grid_layout)
82
Piotr Krysik332e0b52016-02-13 18:37:32 +010083 self.settings = Qt.QSettings("GNU Radio", "grgsm_livemon")
Piotr Krysik35582082015-09-02 21:49:12 +020084 self.restoreGeometry(self.settings.value("geometry").toByteArray())
85
Piotr Krysikf0c83d82018-01-23 15:07:08 +010086
Piotr Krysik35582082015-09-02 21:49:12 +020087 ##################################################
88 # Parameters
89 ##################################################
Piotr Krysik6577ec22016-07-15 13:21:09 +020090 self.args = args
Piotr Krysik688c81e2017-08-26 13:32:51 +020091 self.collector = collector
92 self.collectorport = collectorport
Piotr Krysik85ec6ae2017-08-26 12:24:34 +020093 self.fc = fc
Piotr Krysik35582082015-09-02 21:49:12 +020094 self.gain = gain
Piotr Krysik82638ab2017-07-23 19:14:13 +020095 self.osr = osr
Piotr Krysik35582082015-09-02 21:49:12 +020096 self.ppm = ppm
97 self.samp_rate = samp_rate
Piotr Krysik50c3e362017-08-26 12:59:15 +020098 self.serverport = serverport
Piotr Krysik688c81e2017-08-26 13:32:51 +020099 self.shiftoff = shiftoff
Piotr Krysik35582082015-09-02 21:49:12 +0200100
101 ##################################################
102 # Variables
103 ##################################################
104 self.ppm_slider = ppm_slider = ppm
Piotr Krysikf0c83d82018-01-23 15:07:08 +0100105 self.gain_slider = gain_slider = gain
Piotr Krysik35582082015-09-02 21:49:12 +0200106 self.fc_slider = fc_slider = fc
107
108 ##################################################
109 # Blocks
110 ##################################################
Piotr Krysik93ba6bc2017-01-23 21:33:09 +0100111 self._ppm_slider_range = Range(-150, 150, 0.1, ppm, 100)
Piotr Krysikf0c83d82018-01-23 15:07:08 +0100112 self._ppm_slider_win = RangeWidget(self._ppm_slider_range, self.set_ppm_slider, 'PPM Offset', "counter", float)
Piotr Krysik35582082015-09-02 21:49:12 +0200113 self.top_layout.addWidget(self._ppm_slider_win)
Piotr Krysikf0c83d82018-01-23 15:07:08 +0100114 self._gain_slider_range = Range(0, 100, 0.5, gain, 100)
115 self._gain_slider_win = RangeWidget(self._gain_slider_range, self.set_gain_slider, 'Gain', "counter", float)
116 self.top_layout.addWidget(self._gain_slider_win)
Piotr Krysik93ba6bc2017-01-23 21:33:09 +0100117 self._fc_slider_range = Range(800e6, 1990e6, 2e5, fc, 100)
Piotr Krysikf0c83d82018-01-23 15:07:08 +0100118 self._fc_slider_win = RangeWidget(self._fc_slider_range, self.set_fc_slider, 'Frequency', "counter_slider", float)
Piotr Krysik35582082015-09-02 21:49:12 +0200119 self.top_layout.addWidget(self._fc_slider_win)
Piotr Krysik7185b662016-02-14 20:24:54 +0100120 self.rtlsdr_source_0 = osmosdr.source( args="numchan=" + str(1) + " " + args )
Piotr Krysik35582082015-09-02 21:49:12 +0200121 self.rtlsdr_source_0.set_sample_rate(samp_rate)
122 self.rtlsdr_source_0.set_center_freq(fc_slider-shiftoff, 0)
123 self.rtlsdr_source_0.set_freq_corr(ppm_slider, 0)
124 self.rtlsdr_source_0.set_dc_offset_mode(2, 0)
125 self.rtlsdr_source_0.set_iq_balance_mode(2, 0)
126 self.rtlsdr_source_0.set_gain_mode(False, 0)
Piotr Krysikf0c83d82018-01-23 15:07:08 +0100127 self.rtlsdr_source_0.set_gain(gain_slider, 0)
Piotr Krysik35582082015-09-02 21:49:12 +0200128 self.rtlsdr_source_0.set_if_gain(20, 0)
129 self.rtlsdr_source_0.set_bb_gain(20, 0)
Piotr Krysikf0c83d82018-01-23 15:07:08 +0100130 self.rtlsdr_source_0.set_antenna('', 0)
Piotr Krysik35582082015-09-02 21:49:12 +0200131 self.rtlsdr_source_0.set_bandwidth(250e3+abs(shiftoff), 0)
Piotr Krysikf0c83d82018-01-23 15:07:08 +0100132
Piotr Krysik35582082015-09-02 21:49:12 +0200133 self.qtgui_freq_sink_x_0 = qtgui.freq_sink_c(
134 1024, #size
135 firdes.WIN_BLACKMAN_hARRIS, #wintype
136 fc_slider, #fc
137 samp_rate, #bw
138 "", #name
139 1 #number of inputs
140 )
141 self.qtgui_freq_sink_x_0.set_update_time(0.10)
142 self.qtgui_freq_sink_x_0.set_y_axis(-140, 10)
Piotr Krysikf0c83d82018-01-23 15:07:08 +0100143 self.qtgui_freq_sink_x_0.set_y_label('Relative Gain', 'dB')
Piotr Krysik6577ec22016-07-15 13:21:09 +0200144 self.qtgui_freq_sink_x_0.set_trigger_mode(qtgui.TRIG_MODE_FREE, 0.0, 0, "")
145 self.qtgui_freq_sink_x_0.enable_autoscale(False)
146 self.qtgui_freq_sink_x_0.enable_grid(False)
147 self.qtgui_freq_sink_x_0.set_fft_average(1.0)
Piotr Krysikf0c83d82018-01-23 15:07:08 +0100148 self.qtgui_freq_sink_x_0.enable_axis_labels(True)
Piotr Krysik6577ec22016-07-15 13:21:09 +0200149 self.qtgui_freq_sink_x_0.enable_control_panel(False)
Piotr Krysikf0c83d82018-01-23 15:07:08 +0100150
Piotr Krysik6577ec22016-07-15 13:21:09 +0200151 if not True:
152 self.qtgui_freq_sink_x_0.disable_legend()
Piotr Krysikf0c83d82018-01-23 15:07:08 +0100153
Piotr Krysik6577ec22016-07-15 13:21:09 +0200154 if "complex" == "float" or "complex" == "msg_float":
155 self.qtgui_freq_sink_x_0.set_plot_pos_half(not True)
Piotr Krysikf0c83d82018-01-23 15:07:08 +0100156
157 labels = ['', '', '', '', '',
158 '', '', '', '', '']
Piotr Krysik6577ec22016-07-15 13:21:09 +0200159 widths = [1, 1, 1, 1, 1,
160 1, 1, 1, 1, 1]
161 colors = ["blue", "red", "green", "black", "cyan",
162 "magenta", "yellow", "dark red", "dark green", "dark blue"]
163 alphas = [1.0, 1.0, 1.0, 1.0, 1.0,
164 1.0, 1.0, 1.0, 1.0, 1.0]
165 for i in xrange(1):
166 if len(labels[i]) == 0:
167 self.qtgui_freq_sink_x_0.set_line_label(i, "Data {0}".format(i))
168 else:
169 self.qtgui_freq_sink_x_0.set_line_label(i, labels[i])
170 self.qtgui_freq_sink_x_0.set_line_width(i, widths[i])
171 self.qtgui_freq_sink_x_0.set_line_color(i, colors[i])
172 self.qtgui_freq_sink_x_0.set_line_alpha(i, alphas[i])
Piotr Krysikf0c83d82018-01-23 15:07:08 +0100173
Piotr Krysik35582082015-09-02 21:49:12 +0200174 self._qtgui_freq_sink_x_0_win = sip.wrapinstance(self.qtgui_freq_sink_x_0.pyqwidget(), Qt.QWidget)
175 self.top_layout.addWidget(self._qtgui_freq_sink_x_0_win)
Piotr Krysik6577ec22016-07-15 13:21:09 +0200176 self.gsm_sdcch8_demapper_0 = grgsm.gsm_sdcch8_demapper(
177 timeslot_nr=1,
178 )
179 self.gsm_receiver_0 = grgsm.receiver(4, ([0]), ([]), False)
180 self.gsm_message_printer_1 = grgsm.message_printer(pmt.intern(""), False,
181 False, False)
Piotr Krysik35582082015-09-02 21:49:12 +0200182 self.gsm_input_0 = grgsm.gsm_input(
Piotr Krysik93ba6bc2017-01-23 21:33:09 +0100183 ppm=ppm-int(ppm),
Piotr Krysik35582082015-09-02 21:49:12 +0200184 osr=4,
Piotr Krysikf0c83d82018-01-23 15:07:08 +0100185 fc=fc_slider-shiftoff,
Piotr Krysik35582082015-09-02 21:49:12 +0200186 samp_rate_in=samp_rate,
187 )
188 self.gsm_decryption_0 = grgsm.decryption(([]), 1)
189 self.gsm_control_channels_decoder_0_0 = grgsm.control_channels_decoder()
190 self.gsm_control_channels_decoder_0 = grgsm.control_channels_decoder()
Piotr Krysikf0c83d82018-01-23 15:07:08 +0100191 self.gsm_clock_offset_control_0 = grgsm.clock_offset_control(fc_slider-shiftoff, samp_rate, osr)
Piotr Krysik54e39052017-08-27 12:27:21 +0200192 self.gsm_bcch_ccch_demapper_0 = grgsm.gsm_bcch_ccch_demapper(
Piotr Krysik6577ec22016-07-15 13:21:09 +0200193 timeslot_nr=0,
194 )
Piotr Krysik688c81e2017-08-26 13:32:51 +0200195 self.blocks_socket_pdu_0_1 = blocks.socket_pdu("UDP_CLIENT", collector, collectorport, 1500, False)
Piotr Krysikf0c83d82018-01-23 15:07:08 +0100196 self.blocks_socket_pdu_0_0 = blocks.socket_pdu("UDP_SERVER", '127.0.0.1', serverport, 10000, False)
Piotr Krysik35582082015-09-02 21:49:12 +0200197 self.blocks_rotator_cc_0 = blocks.rotator_cc(-2*pi*shiftoff/samp_rate)
198
Piotr Krysikf0c83d82018-01-23 15:07:08 +0100199
200
Piotr Krysik35582082015-09-02 21:49:12 +0200201 ##################################################
202 # Connections
203 ##################################################
Piotr Krysikf0c83d82018-01-23 15:07:08 +0100204 self.msg_connect((self.blocks_socket_pdu_0_0, 'pdus'), (self.gsm_message_printer_1, 'msgs'))
205 self.msg_connect((self.gsm_bcch_ccch_demapper_0, 'bursts'), (self.gsm_control_channels_decoder_0, 'bursts'))
206 self.msg_connect((self.gsm_clock_offset_control_0, 'ctrl'), (self.gsm_input_0, 'ctrl_in'))
207 self.msg_connect((self.gsm_control_channels_decoder_0, 'msgs'), (self.blocks_socket_pdu_0_1, 'pdus'))
208 self.msg_connect((self.gsm_control_channels_decoder_0_0, 'msgs'), (self.blocks_socket_pdu_0_1, 'pdus'))
209 self.msg_connect((self.gsm_decryption_0, 'bursts'), (self.gsm_control_channels_decoder_0_0, 'bursts'))
210 self.msg_connect((self.gsm_receiver_0, 'C0'), (self.gsm_bcch_ccch_demapper_0, 'bursts'))
211 self.msg_connect((self.gsm_receiver_0, 'measurements'), (self.gsm_clock_offset_control_0, 'measurements'))
212 self.msg_connect((self.gsm_receiver_0, 'C0'), (self.gsm_sdcch8_demapper_0, 'bursts'))
213 self.msg_connect((self.gsm_sdcch8_demapper_0, 'bursts'), (self.gsm_decryption_0, 'bursts'))
214 self.connect((self.blocks_rotator_cc_0, 0), (self.gsm_input_0, 0))
215 self.connect((self.blocks_rotator_cc_0, 0), (self.qtgui_freq_sink_x_0, 0))
216 self.connect((self.gsm_input_0, 0), (self.gsm_receiver_0, 0))
217 self.connect((self.rtlsdr_source_0, 0), (self.blocks_rotator_cc_0, 0))
Piotr Krysik35582082015-09-02 21:49:12 +0200218
219 def closeEvent(self, event):
Piotr Krysik332e0b52016-02-13 18:37:32 +0100220 self.settings = Qt.QSettings("GNU Radio", "grgsm_livemon")
Piotr Krysik35582082015-09-02 21:49:12 +0200221 self.settings.setValue("geometry", self.saveGeometry())
222 event.accept()
223
Piotr Krysik6577ec22016-07-15 13:21:09 +0200224 def get_args(self):
225 return self.args
226
227 def set_args(self, args):
228 self.args = args
229
Piotr Krysik688c81e2017-08-26 13:32:51 +0200230 def get_collector(self):
231 return self.collector
232
233 def set_collector(self, collector):
234 self.collector = collector
235
236 def get_collectorport(self):
237 return self.collectorport
238
239 def set_collectorport(self, collectorport):
240 self.collectorport = collectorport
241
Piotr Krysik85ec6ae2017-08-26 12:24:34 +0200242 def get_fc(self):
243 return self.fc
244
245 def set_fc(self, fc):
246 self.fc = fc
247 self.set_fc_slider(self.fc)
Piotr Krysik85ec6ae2017-08-26 12:24:34 +0200248
Piotr Krysik35582082015-09-02 21:49:12 +0200249 def get_gain(self):
250 return self.gain
251
252 def set_gain(self, gain):
253 self.gain = gain
Piotr Krysikf0c83d82018-01-23 15:07:08 +0100254 self.set_gain_slider(self.gain)
Piotr Krysik35582082015-09-02 21:49:12 +0200255
Piotr Krysik82638ab2017-07-23 19:14:13 +0200256 def get_osr(self):
257 return self.osr
258
259 def set_osr(self, osr):
260 self.osr = osr
261
Piotr Krysik35582082015-09-02 21:49:12 +0200262 def get_ppm(self):
263 return self.ppm
264
265 def set_ppm(self, ppm):
266 self.ppm = ppm
267 self.set_ppm_slider(self.ppm)
Piotr Krysik93ba6bc2017-01-23 21:33:09 +0100268 self.gsm_input_0.set_ppm(self.ppm-int(self.ppm))
Piotr Krysik35582082015-09-02 21:49:12 +0200269
270 def get_samp_rate(self):
271 return self.samp_rate
272
273 def set_samp_rate(self, samp_rate):
274 self.samp_rate = samp_rate
Piotr Krysik35582082015-09-02 21:49:12 +0200275 self.rtlsdr_source_0.set_sample_rate(self.samp_rate)
Piotr Krysikf0c83d82018-01-23 15:07:08 +0100276 self.qtgui_freq_sink_x_0.set_frequency_range(self.fc_slider, self.samp_rate)
277 self.gsm_input_0.set_samp_rate_in(self.samp_rate)
278 self.blocks_rotator_cc_0.set_phase_inc(-2*pi*self.shiftoff/self.samp_rate)
Piotr Krysik35582082015-09-02 21:49:12 +0200279
Piotr Krysik688c81e2017-08-26 13:32:51 +0200280 def get_serverport(self):
281 return self.serverport
282
283 def set_serverport(self, serverport):
284 self.serverport = serverport
285
Piotr Krysik35582082015-09-02 21:49:12 +0200286 def get_shiftoff(self):
287 return self.shiftoff
288
289 def set_shiftoff(self, shiftoff):
290 self.shiftoff = shiftoff
Piotr Krysik35582082015-09-02 21:49:12 +0200291 self.rtlsdr_source_0.set_center_freq(self.fc_slider-self.shiftoff, 0)
292 self.rtlsdr_source_0.set_bandwidth(250e3+abs(self.shiftoff), 0)
Piotr Krysikf0c83d82018-01-23 15:07:08 +0100293 self.gsm_input_0.set_fc(self.fc_slider-self.shiftoff)
294 self.gsm_clock_offset_control_0.set_fc(self.fc_slider-self.shiftoff)
295 self.blocks_rotator_cc_0.set_phase_inc(-2*pi*self.shiftoff/self.samp_rate)
Piotr Krysikfe538eb2016-07-18 18:14:49 +0200296
Piotr Krysik35582082015-09-02 21:49:12 +0200297 def get_ppm_slider(self):
298 return self.ppm_slider
299
300 def set_ppm_slider(self, ppm_slider):
301 self.ppm_slider = ppm_slider
302 self.rtlsdr_source_0.set_freq_corr(self.ppm_slider, 0)
303
Piotr Krysikf0c83d82018-01-23 15:07:08 +0100304 def get_gain_slider(self):
305 return self.gain_slider
Piotr Krysik35582082015-09-02 21:49:12 +0200306
Piotr Krysikf0c83d82018-01-23 15:07:08 +0100307 def set_gain_slider(self, gain_slider):
308 self.gain_slider = gain_slider
309 self.rtlsdr_source_0.set_gain(self.gain_slider, 0)
Piotr Krysik35582082015-09-02 21:49:12 +0200310
311 def get_fc_slider(self):
312 return self.fc_slider
313
314 def set_fc_slider(self, fc_slider):
315 self.fc_slider = fc_slider
Piotr Krysik35582082015-09-02 21:49:12 +0200316 self.rtlsdr_source_0.set_center_freq(self.fc_slider-self.shiftoff, 0)
Piotr Krysikf0c83d82018-01-23 15:07:08 +0100317 self.qtgui_freq_sink_x_0.set_frequency_range(self.fc_slider, self.samp_rate)
318 self.gsm_input_0.set_fc(self.fc_slider-self.shiftoff)
319 self.gsm_clock_offset_control_0.set_fc(self.fc_slider-self.shiftoff)
Piotr Krysik35582082015-09-02 21:49:12 +0200320
321
Piotr Krysik6577ec22016-07-15 13:21:09 +0200322def argument_parser():
Piotr Krysikf0c83d82018-01-23 15:07:08 +0100323 description = 'Interactive monitor of a single C0 channel with analysis performed by Wireshark (command to run wireshark: sudo wireshark -k -f udp -Y gsmtap -i lo)'
324 parser = OptionParser(usage="%prog: [options]", option_class=eng_option, description=description)
Piotr Krysik6577ec22016-07-15 13:21:09 +0200325 parser.add_option(
326 "", "--args", dest="args", type="string", default="",
327 help="Set Device Arguments [default=%default]")
328 parser.add_option(
Piotr Krysikf0c83d82018-01-23 15:07:08 +0100329 "", "--collector", dest="collector", type="string", default='localhost',
Piotr Krysik688c81e2017-08-26 13:32:51 +0200330 help="Set IP or DNS name of collector point [default=%default]")
331 parser.add_option(
Piotr Krysikf0c83d82018-01-23 15:07:08 +0100332 "", "--collectorport", dest="collectorport", type="string", default='4729',
Piotr Krysik688c81e2017-08-26 13:32:51 +0200333 help="Set UDP port number of collector [default=%default]")
334 parser.add_option(
Piotr Krysik85ec6ae2017-08-26 12:24:34 +0200335 "-f", "--fc", dest="fc", type="eng_float", default=eng_notation.num_to_str(941.8e6),
336 help="Set GSM channel's central frequency [default=%default]")
337 parser.add_option(
Piotr Krysik6577ec22016-07-15 13:21:09 +0200338 "-g", "--gain", dest="gain", type="eng_float", default=eng_notation.num_to_str(30),
Piotr Krysik35582082015-09-02 21:49:12 +0200339 help="Set gain [default=%default]")
Piotr Krysik6577ec22016-07-15 13:21:09 +0200340 parser.add_option(
Piotr Krysik82638ab2017-07-23 19:14:13 +0200341 "", "--osr", dest="osr", type="intx", default=4,
342 help="Set OverSampling Ratio [default=%default]")
343 parser.add_option(
Piotr Krysik93ba6bc2017-01-23 21:33:09 +0100344 "-p", "--ppm", dest="ppm", type="eng_float", default=eng_notation.num_to_str(0),
Piotr Krysik35582082015-09-02 21:49:12 +0200345 help="Set ppm [default=%default]")
Piotr Krysik6577ec22016-07-15 13:21:09 +0200346 parser.add_option(
347 "-s", "--samp-rate", dest="samp_rate", type="eng_float", default=eng_notation.num_to_str(2000000.052982),
Piotr Krysik35582082015-09-02 21:49:12 +0200348 help="Set samp_rate [default=%default]")
Piotr Krysik6577ec22016-07-15 13:21:09 +0200349 parser.add_option(
Piotr Krysikf0c83d82018-01-23 15:07:08 +0100350 "", "--serverport", dest="serverport", type="string", default='4729',
Piotr Krysik50c3e362017-08-26 12:59:15 +0200351 help="Set UDP server listening port [default=%default]")
Piotr Krysik688c81e2017-08-26 13:32:51 +0200352 parser.add_option(
353 "-o", "--shiftoff", dest="shiftoff", type="eng_float", default=eng_notation.num_to_str(400e3),
354 help="Set Frequency Shiftoff [default=%default]")
Piotr Krysik6577ec22016-07-15 13:21:09 +0200355 return parser
356
357
358def main(top_block_cls=grgsm_livemon, options=None):
359 if options is None:
360 options, _ = argument_parser().parse_args()
361
362 from distutils.version import StrictVersion
363 if StrictVersion(Qt.qVersion()) >= StrictVersion("4.5.0"):
364 style = gr.prefs().get_string('qtgui', 'style', 'raster')
365 Qt.QApplication.setGraphicsSystem(style)
Piotr Krysik35582082015-09-02 21:49:12 +0200366 qapp = Qt.QApplication(sys.argv)
Piotr Krysik6577ec22016-07-15 13:21:09 +0200367
Piotr Krysik688c81e2017-08-26 13:32:51 +0200368 tb = top_block_cls(args=options.args, collector=options.collector, collectorport=options.collectorport, fc=options.fc, gain=options.gain, osr=options.osr, ppm=options.ppm, samp_rate=options.samp_rate, serverport=options.serverport, shiftoff=options.shiftoff)
Piotr Krysik35582082015-09-02 21:49:12 +0200369 tb.start()
370 tb.show()
371
372 def quitting():
373 tb.stop()
374 tb.wait()
375 qapp.connect(qapp, Qt.SIGNAL("aboutToQuit()"), quitting)
376 qapp.exec_()
Piotr Krysik6577ec22016-07-15 13:21:09 +0200377
378
379if __name__ == '__main__':
380 main()