blob: 50ea994e1f77eb4386da674e5096f4e665b668da [file] [log] [blame]
ptrkrysik3b776542015-01-03 00:06:39 +01001#!/usr/bin/env python
2##################################################
3# Gnuradio Python Flow Graph
4# Title: Airprobe Usrp
ptrkrysikd8d4fbc2015-02-07 19:37:42 +01005# Generated: Sat Feb 7 19:31:03 2015
ptrkrysik3b776542015-01-03 00:06:39 +01006##################################################
7
8from PyQt4 import Qt
9from PyQt4.QtCore import QObject, pyqtSlot
10from gnuradio import blocks
11from gnuradio import eng_notation
12from gnuradio import gr
13from gnuradio import qtgui
14from gnuradio import uhd
15from gnuradio.eng_option import eng_option
16from gnuradio.filter import firdes
17from optparse import OptionParser
18import PyQt4.Qwt5 as Qwt
19import grgsm
20import pmt
21import sip
22import sys
23import time
24
25from distutils.version import StrictVersion
26class airprobe_usrp(gr.top_block, Qt.QWidget):
27
ptrkrysikd8d4fbc2015-02-07 19:37:42 +010028 def __init__(self, gain=30, fc=939.4e6, samp_rate=2000000.052982):
ptrkrysik3b776542015-01-03 00:06:39 +010029 gr.top_block.__init__(self, "Airprobe Usrp")
30 Qt.QWidget.__init__(self)
31 self.setWindowTitle("Airprobe Usrp")
32 try:
33 self.setWindowIcon(Qt.QIcon.fromTheme('gnuradio-grc'))
34 except:
35 pass
36 self.top_scroll_layout = Qt.QVBoxLayout()
37 self.setLayout(self.top_scroll_layout)
38 self.top_scroll = Qt.QScrollArea()
39 self.top_scroll.setFrameStyle(Qt.QFrame.NoFrame)
40 self.top_scroll_layout.addWidget(self.top_scroll)
41 self.top_scroll.setWidgetResizable(True)
42 self.top_widget = Qt.QWidget()
43 self.top_scroll.setWidget(self.top_widget)
44 self.top_layout = Qt.QVBoxLayout(self.top_widget)
45 self.top_grid_layout = Qt.QGridLayout()
46 self.top_layout.addLayout(self.top_grid_layout)
47
48 self.settings = Qt.QSettings("GNU Radio", "airprobe_usrp")
49 self.restoreGeometry(self.settings.value("geometry").toByteArray())
50
51
52 ##################################################
ptrkrysik9032b872015-01-03 00:36:21 +010053 # Parameters
54 ##################################################
ptrkrysik9032b872015-01-03 00:36:21 +010055 self.gain = gain
56 self.fc = fc
ptrkrysikd8d4fbc2015-02-07 19:37:42 +010057 self.samp_rate = samp_rate
ptrkrysik9032b872015-01-03 00:36:21 +010058
59 ##################################################
ptrkrysik3b776542015-01-03 00:06:39 +010060 # Variables
61 ##################################################
ptrkrysik9032b872015-01-03 00:36:21 +010062 self.g_slider = g_slider = gain
63 self.fc_slider = fc_slider = fc
ptrkrysik3b776542015-01-03 00:06:39 +010064 self.SDCCH = SDCCH = 6
65 self.RACH = RACH = 3
66 self.PCH = PCH = 5
67 self.CHANNEL_UNKNOWN = CHANNEL_UNKNOWN = 0
68 self.CCCH = CCCH = 2
69 self.BCCH = BCCH = 1
70 self.AGCH = AGCH = 4
71
72 ##################################################
73 # Blocks
74 ##################################################
ptrkrysik9032b872015-01-03 00:36:21 +010075 self._g_slider_layout = Qt.QHBoxLayout()
76 self._g_slider_layout.addWidget(Qt.QLabel("Gain"+": "))
ptrkrysik3b776542015-01-03 00:06:39 +010077 class qwt_counter_pyslot(Qwt.QwtCounter):
78 def __init__(self, parent=None):
79 Qwt.QwtCounter.__init__(self, parent)
80 @pyqtSlot('double')
81 def setValue(self, value):
82 super(Qwt.QwtCounter, self).setValue(value)
ptrkrysik9032b872015-01-03 00:36:21 +010083 self._g_slider_counter = qwt_counter_pyslot()
84 self._g_slider_counter.setRange(0, 50, 0.5)
85 self._g_slider_counter.setNumButtons(2)
86 self._g_slider_counter.setMinimumWidth(100)
87 self._g_slider_counter.setValue(self.g_slider)
88 self._g_slider_layout.addWidget(self._g_slider_counter)
89 self._g_slider_counter.valueChanged.connect(self.set_g_slider)
90 self.top_layout.addLayout(self._g_slider_layout)
91 self._fc_slider_layout = Qt.QVBoxLayout()
92 self._fc_slider_tool_bar = Qt.QToolBar(self)
93 self._fc_slider_layout.addWidget(self._fc_slider_tool_bar)
94 self._fc_slider_tool_bar.addWidget(Qt.QLabel("Frequency"+": "))
ptrkrysik3b776542015-01-03 00:06:39 +010095 class qwt_counter_pyslot(Qwt.QwtCounter):
96 def __init__(self, parent=None):
97 Qwt.QwtCounter.__init__(self, parent)
98 @pyqtSlot('double')
99 def setValue(self, value):
100 super(Qwt.QwtCounter, self).setValue(value)
ptrkrysik9032b872015-01-03 00:36:21 +0100101 self._fc_slider_counter = qwt_counter_pyslot()
102 self._fc_slider_counter.setRange(925e6, 960e6, 2e5)
103 self._fc_slider_counter.setNumButtons(2)
104 self._fc_slider_counter.setValue(self.fc_slider)
105 self._fc_slider_tool_bar.addWidget(self._fc_slider_counter)
106 self._fc_slider_counter.valueChanged.connect(self.set_fc_slider)
107 self._fc_slider_slider = Qwt.QwtSlider(None, Qt.Qt.Horizontal, Qwt.QwtSlider.BottomScale, Qwt.QwtSlider.BgSlot)
108 self._fc_slider_slider.setRange(925e6, 960e6, 2e5)
109 self._fc_slider_slider.setValue(self.fc_slider)
110 self._fc_slider_slider.setMinimumWidth(100)
111 self._fc_slider_slider.valueChanged.connect(self.set_fc_slider)
112 self._fc_slider_layout.addWidget(self._fc_slider_slider)
113 self.top_layout.addLayout(self._fc_slider_layout)
ptrkrysik3b776542015-01-03 00:06:39 +0100114 self.uhd_usrp_source_0 = uhd.usrp_source(
115 ",".join(("addr=192.168.10.2", "")),
116 uhd.stream_args(
117 cpu_format="fc32",
118 channels=range(1),
119 ),
120 )
121 self.uhd_usrp_source_0.set_clock_source("internal", 0)
122 self.uhd_usrp_source_0.set_samp_rate(samp_rate)
ptrkrysik9032b872015-01-03 00:36:21 +0100123 self.uhd_usrp_source_0.set_center_freq(fc_slider, 0)
124 self.uhd_usrp_source_0.set_gain(g_slider, 0)
ptrkrysik3b776542015-01-03 00:06:39 +0100125 self.qtgui_freq_sink_x_0 = qtgui.freq_sink_c(
126 1024, #size
127 firdes.WIN_BLACKMAN_hARRIS, #wintype
128 fc, #fc
129 samp_rate, #bw
130 "", #name
131 1 #number of inputs
132 )
133 self.qtgui_freq_sink_x_0.set_update_time(0.10)
134 self.qtgui_freq_sink_x_0.set_y_axis(-140, 10)
135 self.qtgui_freq_sink_x_0.set_trigger_mode(qtgui.TRIG_MODE_FREE, 0.0, 0, "")
136 self.qtgui_freq_sink_x_0.enable_autoscale(False)
137 self.qtgui_freq_sink_x_0.enable_grid(False)
138 self.qtgui_freq_sink_x_0.set_fft_average(1.0)
139
140 if complex == type(float()):
141 self.qtgui_freq_sink_x_0.set_plot_pos_half(not True)
142
143 labels = ["", "", "", "", "",
144 "", "", "", "", ""]
145 widths = [1, 1, 1, 1, 1,
146 1, 1, 1, 1, 1]
147 colors = ["blue", "red", "green", "black", "cyan",
148 "magenta", "yellow", "dark red", "dark green", "dark blue"]
149 alphas = [1.0, 1.0, 1.0, 1.0, 1.0,
150 1.0, 1.0, 1.0, 1.0, 1.0]
151 for i in xrange(1):
152 if len(labels[i]) == 0:
153 self.qtgui_freq_sink_x_0.set_line_label(i, "Data {0}".format(i))
154 else:
155 self.qtgui_freq_sink_x_0.set_line_label(i, labels[i])
156 self.qtgui_freq_sink_x_0.set_line_width(i, widths[i])
157 self.qtgui_freq_sink_x_0.set_line_color(i, colors[i])
158 self.qtgui_freq_sink_x_0.set_line_alpha(i, alphas[i])
159
160 self._qtgui_freq_sink_x_0_win = sip.wrapinstance(self.qtgui_freq_sink_x_0.pyqwidget(), Qt.QWidget)
161 self.top_layout.addWidget(self._qtgui_freq_sink_x_0_win)
ptrkrysikd8d4fbc2015-02-07 19:37:42 +0100162 self.gsm_universal_ctrl_chans_demapper_0 = grgsm.universal_ctrl_chans_demapper(0, ([2,6,12,16,22,26,32,36,42,46]), ([BCCH,CCCH,CCCH,CCCH,CCCH,CCCH,CCCH,CCCH,CCCH,CCCH]))
ptrkrysik3b776542015-01-03 00:06:39 +0100163 self.gsm_receiver_0 = grgsm.receiver(4, ([0]), ([]))
164 self.gsm_message_printer_0 = grgsm.message_printer(pmt.intern(""))
165 self.gsm_input_0 = grgsm.gsm_input(
166 ppm=0,
167 osr=4,
168 fc=fc,
169 samp_rate_in=samp_rate,
170 )
171 self.gsm_control_channels_decoder_0 = grgsm.control_channels_decoder()
172 self.blocks_socket_pdu_0 = blocks.socket_pdu("UDP_CLIENT", "127.0.0.1", "4729", 10000, False)
ptrkrysik3b776542015-01-03 00:06:39 +0100173
174 ##################################################
175 # Connections
176 ##################################################
ptrkrysikd8d4fbc2015-02-07 19:37:42 +0100177 self.msg_connect(self.gsm_control_channels_decoder_0, 'msgs', self.blocks_socket_pdu_0, 'pdus')
178 self.msg_connect(self.gsm_control_channels_decoder_0, 'msgs', self.gsm_message_printer_0, 'msgs')
179 self.msg_connect(self.gsm_receiver_0, 'C0', self.gsm_universal_ctrl_chans_demapper_0, 'bursts')
180 self.msg_connect(self.gsm_universal_ctrl_chans_demapper_0, 'bursts', self.gsm_control_channels_decoder_0, 'bursts')
181 self.connect((self.gsm_input_0, 0), (self.gsm_receiver_0, 0))
182 self.connect((self.uhd_usrp_source_0, 0), (self.gsm_input_0, 0))
183 self.connect((self.uhd_usrp_source_0, 0), (self.qtgui_freq_sink_x_0, 0))
ptrkrysik3b776542015-01-03 00:06:39 +0100184
185 def closeEvent(self, event):
186 self.settings = Qt.QSettings("GNU Radio", "airprobe_usrp")
187 self.settings.setValue("geometry", self.saveGeometry())
188 event.accept()
189
ptrkrysik9032b872015-01-03 00:36:21 +0100190 def get_gain(self):
191 return self.gain
ptrkrysik3b776542015-01-03 00:06:39 +0100192
ptrkrysik9032b872015-01-03 00:36:21 +0100193 def set_gain(self, gain):
194 self.gain = gain
195 self.set_g_slider(self.gain)
ptrkrysik3b776542015-01-03 00:06:39 +0100196
197 def get_fc(self):
198 return self.fc
199
200 def set_fc(self, fc):
201 self.fc = fc
202 self.gsm_input_0.set_fc(self.fc)
203 self.qtgui_freq_sink_x_0.set_frequency_range(self.fc, self.samp_rate)
ptrkrysik9032b872015-01-03 00:36:21 +0100204 self.set_fc_slider(self.fc)
205
ptrkrysikd8d4fbc2015-02-07 19:37:42 +0100206 def get_samp_rate(self):
207 return self.samp_rate
208
209 def set_samp_rate(self, samp_rate):
210 self.samp_rate = samp_rate
211 self.gsm_input_0.set_samp_rate_in(self.samp_rate)
212 self.qtgui_freq_sink_x_0.set_frequency_range(self.fc, self.samp_rate)
213 self.uhd_usrp_source_0.set_samp_rate(self.samp_rate)
214
ptrkrysik9032b872015-01-03 00:36:21 +0100215 def get_g_slider(self):
216 return self.g_slider
217
218 def set_g_slider(self, g_slider):
219 self.g_slider = g_slider
220 Qt.QMetaObject.invokeMethod(self._g_slider_counter, "setValue", Qt.Q_ARG("double", self.g_slider))
221 self.uhd_usrp_source_0.set_gain(self.g_slider, 0)
222
223 def get_fc_slider(self):
224 return self.fc_slider
225
226 def set_fc_slider(self, fc_slider):
227 self.fc_slider = fc_slider
228 Qt.QMetaObject.invokeMethod(self._fc_slider_counter, "setValue", Qt.Q_ARG("double", self.fc_slider))
229 Qt.QMetaObject.invokeMethod(self._fc_slider_slider, "setValue", Qt.Q_ARG("double", self.fc_slider))
230 self.uhd_usrp_source_0.set_center_freq(self.fc_slider, 0)
ptrkrysik3b776542015-01-03 00:06:39 +0100231
232 def get_SDCCH(self):
233 return self.SDCCH
234
235 def set_SDCCH(self, SDCCH):
236 self.SDCCH = SDCCH
237
238 def get_RACH(self):
239 return self.RACH
240
241 def set_RACH(self, RACH):
242 self.RACH = RACH
243
244 def get_PCH(self):
245 return self.PCH
246
247 def set_PCH(self, PCH):
248 self.PCH = PCH
249
250 def get_CHANNEL_UNKNOWN(self):
251 return self.CHANNEL_UNKNOWN
252
253 def set_CHANNEL_UNKNOWN(self, CHANNEL_UNKNOWN):
254 self.CHANNEL_UNKNOWN = CHANNEL_UNKNOWN
255
256 def get_CCCH(self):
257 return self.CCCH
258
259 def set_CCCH(self, CCCH):
260 self.CCCH = CCCH
261
262 def get_BCCH(self):
263 return self.BCCH
264
265 def set_BCCH(self, BCCH):
266 self.BCCH = BCCH
267
268 def get_AGCH(self):
269 return self.AGCH
270
271 def set_AGCH(self, AGCH):
272 self.AGCH = AGCH
273
274if __name__ == '__main__':
275 import ctypes
276 import sys
277 if sys.platform.startswith('linux'):
278 try:
279 x11 = ctypes.cdll.LoadLibrary('libX11.so')
280 x11.XInitThreads()
281 except:
282 print "Warning: failed to XInitThreads()"
283 parser = OptionParser(option_class=eng_option, usage="%prog: [options]")
ptrkrysik9032b872015-01-03 00:36:21 +0100284 parser.add_option("-g", "--gain", dest="gain", type="eng_float", default=eng_notation.num_to_str(30),
285 help="Set gain [default=%default]")
286 parser.add_option("-f", "--fc", dest="fc", type="eng_float", default=eng_notation.num_to_str(939.4e6),
287 help="Set fc [default=%default]")
ptrkrysikd8d4fbc2015-02-07 19:37:42 +0100288 parser.add_option("-s", "--samp-rate", dest="samp_rate", type="eng_float", default=eng_notation.num_to_str(2000000.052982),
289 help="Set samp_rate [default=%default]")
ptrkrysik3b776542015-01-03 00:06:39 +0100290 (options, args) = parser.parse_args()
291 if(StrictVersion(Qt.qVersion()) >= StrictVersion("4.5.0")):
292 Qt.QApplication.setGraphicsSystem(gr.prefs().get_string('qtgui','style','raster'))
293 qapp = Qt.QApplication(sys.argv)
ptrkrysikd8d4fbc2015-02-07 19:37:42 +0100294 tb = airprobe_usrp(gain=options.gain, fc=options.fc, samp_rate=options.samp_rate)
ptrkrysik3b776542015-01-03 00:06:39 +0100295 tb.start()
296 tb.show()
297 def quitting():
298 tb.stop()
299 tb.wait()
300 qapp.connect(qapp, Qt.SIGNAL("aboutToQuit()"), quitting)
301 qapp.exec_()
302 tb = None #to clean up Qt widgets