blob: f87f8eef8637bcb02642f1f19fa9a43d62c8bf6e [file] [log] [blame]
ptrkrysik3b776542015-01-03 00:06:39 +01001#!/usr/bin/env python
2##################################################
3# Gnuradio Python Flow Graph
4# Title: Airprobe Usrp
ptrkrysik9032b872015-01-03 00:36:21 +01005# Generated: Sat Jan 3 00:30:50 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
ptrkrysik9032b872015-01-03 00:36:21 +010028 def __init__(self, samp_rate=2000000.052982, gain=30, fc=939.4e6):
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 ##################################################
55 self.samp_rate = samp_rate
56 self.gain = gain
57 self.fc = fc
58
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)
162 self.gsm_universal_ctrl_chans_demapper_0 = grgsm.universal_ctrl_chans_demapper(([2,6,12,16,22,26,32,36,42,46]), ([BCCH,CCCH,CCCH,CCCH,CCCH,CCCH,CCCH,CCCH,CCCH,CCCH]))
163 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 ##################################################
177 self.connect((self.uhd_usrp_source_0, 0), (self.qtgui_freq_sink_x_0, 0))
178 self.connect((self.uhd_usrp_source_0, 0), (self.gsm_input_0, 0))
179 self.connect((self.gsm_input_0, 0), (self.gsm_receiver_0, 0))
180
181 ##################################################
182 # Message Connections
183 ##################################################
184 self.msg_connect(self.gsm_control_channels_decoder_0, "msgs", self.gsm_message_printer_0, "msgs")
185 self.msg_connect(self.gsm_control_channels_decoder_0, "msgs", self.blocks_socket_pdu_0, "pdus")
186 self.msg_connect(self.gsm_universal_ctrl_chans_demapper_0, "bursts", self.gsm_control_channels_decoder_0, "bursts")
187 self.msg_connect(self.gsm_receiver_0, "C0", self.gsm_universal_ctrl_chans_demapper_0, "bursts")
ptrkrysik3b776542015-01-03 00:06:39 +0100188
189 def closeEvent(self, event):
190 self.settings = Qt.QSettings("GNU Radio", "airprobe_usrp")
191 self.settings.setValue("geometry", self.saveGeometry())
192 event.accept()
193
194 def get_samp_rate(self):
195 return self.samp_rate
196
197 def set_samp_rate(self, samp_rate):
198 self.samp_rate = samp_rate
199 self.gsm_input_0.set_samp_rate_in(self.samp_rate)
200 self.qtgui_freq_sink_x_0.set_frequency_range(self.fc, self.samp_rate)
201 self.uhd_usrp_source_0.set_samp_rate(self.samp_rate)
202
ptrkrysik9032b872015-01-03 00:36:21 +0100203 def get_gain(self):
204 return self.gain
ptrkrysik3b776542015-01-03 00:06:39 +0100205
ptrkrysik9032b872015-01-03 00:36:21 +0100206 def set_gain(self, gain):
207 self.gain = gain
208 self.set_g_slider(self.gain)
ptrkrysik3b776542015-01-03 00:06:39 +0100209
210 def get_fc(self):
211 return self.fc
212
213 def set_fc(self, fc):
214 self.fc = fc
215 self.gsm_input_0.set_fc(self.fc)
216 self.qtgui_freq_sink_x_0.set_frequency_range(self.fc, self.samp_rate)
ptrkrysik9032b872015-01-03 00:36:21 +0100217 self.set_fc_slider(self.fc)
218
219 def get_g_slider(self):
220 return self.g_slider
221
222 def set_g_slider(self, g_slider):
223 self.g_slider = g_slider
224 Qt.QMetaObject.invokeMethod(self._g_slider_counter, "setValue", Qt.Q_ARG("double", self.g_slider))
225 self.uhd_usrp_source_0.set_gain(self.g_slider, 0)
226
227 def get_fc_slider(self):
228 return self.fc_slider
229
230 def set_fc_slider(self, fc_slider):
231 self.fc_slider = fc_slider
232 Qt.QMetaObject.invokeMethod(self._fc_slider_counter, "setValue", Qt.Q_ARG("double", self.fc_slider))
233 Qt.QMetaObject.invokeMethod(self._fc_slider_slider, "setValue", Qt.Q_ARG("double", self.fc_slider))
234 self.uhd_usrp_source_0.set_center_freq(self.fc_slider, 0)
ptrkrysik3b776542015-01-03 00:06:39 +0100235
236 def get_SDCCH(self):
237 return self.SDCCH
238
239 def set_SDCCH(self, SDCCH):
240 self.SDCCH = SDCCH
241
242 def get_RACH(self):
243 return self.RACH
244
245 def set_RACH(self, RACH):
246 self.RACH = RACH
247
248 def get_PCH(self):
249 return self.PCH
250
251 def set_PCH(self, PCH):
252 self.PCH = PCH
253
254 def get_CHANNEL_UNKNOWN(self):
255 return self.CHANNEL_UNKNOWN
256
257 def set_CHANNEL_UNKNOWN(self, CHANNEL_UNKNOWN):
258 self.CHANNEL_UNKNOWN = CHANNEL_UNKNOWN
259
260 def get_CCCH(self):
261 return self.CCCH
262
263 def set_CCCH(self, CCCH):
264 self.CCCH = CCCH
265
266 def get_BCCH(self):
267 return self.BCCH
268
269 def set_BCCH(self, BCCH):
270 self.BCCH = BCCH
271
272 def get_AGCH(self):
273 return self.AGCH
274
275 def set_AGCH(self, AGCH):
276 self.AGCH = AGCH
277
278if __name__ == '__main__':
279 import ctypes
280 import sys
281 if sys.platform.startswith('linux'):
282 try:
283 x11 = ctypes.cdll.LoadLibrary('libX11.so')
284 x11.XInitThreads()
285 except:
286 print "Warning: failed to XInitThreads()"
287 parser = OptionParser(option_class=eng_option, usage="%prog: [options]")
ptrkrysik9032b872015-01-03 00:36:21 +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]")
290 parser.add_option("-g", "--gain", dest="gain", type="eng_float", default=eng_notation.num_to_str(30),
291 help="Set gain [default=%default]")
292 parser.add_option("-f", "--fc", dest="fc", type="eng_float", default=eng_notation.num_to_str(939.4e6),
293 help="Set fc [default=%default]")
ptrkrysik3b776542015-01-03 00:06:39 +0100294 (options, args) = parser.parse_args()
295 if(StrictVersion(Qt.qVersion()) >= StrictVersion("4.5.0")):
296 Qt.QApplication.setGraphicsSystem(gr.prefs().get_string('qtgui','style','raster'))
297 qapp = Qt.QApplication(sys.argv)
ptrkrysik9032b872015-01-03 00:36:21 +0100298 tb = airprobe_usrp(samp_rate=options.samp_rate, gain=options.gain, fc=options.fc)
ptrkrysik3b776542015-01-03 00:06:39 +0100299 tb.start()
300 tb.show()
301 def quitting():
302 tb.stop()
303 tb.wait()
304 qapp.connect(qapp, Qt.SIGNAL("aboutToQuit()"), quitting)
305 qapp.exec_()
306 tb = None #to clean up Qt widgets