Removed GUI code from airprobe_rtlsdr_capture.py

This commit is contained in:
Roman Khassraf 2015-08-24 20:00:48 +02:00
parent 529e2150aa
commit 7eda4801f2
1 changed files with 22 additions and 217 deletions

View File

@ -21,54 +21,27 @@
#
#
from PyQt4 import Qt
from PyQt4.QtCore import QObject, pyqtSlot
from distutils.version import StrictVersion
from gnuradio import blocks
from gnuradio import eng_notation
from gnuradio import gr
from gnuradio import qtgui
from gnuradio.eng_option import eng_option
from gnuradio.filter import firdes
from math import pi
from optparse import OptionParser
import PyQt4.Qwt5 as Qwt
import grgsm
import osmosdr
import pmt
import sip
import signal
import sys
class airprobe_rtlsdr_capture(gr.top_block, Qt.QWidget):
class airprobe_rtlsdr_capture(gr.top_block):
def __init__(self, fc, gain, samp_rate, ppm, arfcn, cfile=None, burst_file=None, verbose=False):
gr.top_block.__init__(self, "Airprobe RTL-SDR Capture")
Qt.QWidget.__init__(self)
self.setWindowTitle("Airprobe RTL-SDR Capture")
try:
self.setWindowIcon(Qt.QIcon.fromTheme('gnuradio-grc'))
except:
pass
self.top_scroll_layout = Qt.QVBoxLayout()
self.setLayout(self.top_scroll_layout)
self.top_scroll = Qt.QScrollArea()
self.top_scroll.setFrameStyle(Qt.QFrame.NoFrame)
self.top_scroll_layout.addWidget(self.top_scroll)
self.top_scroll.setWidgetResizable(True)
self.top_widget = Qt.QWidget()
self.top_scroll.setWidget(self.top_widget)
self.top_layout = Qt.QVBoxLayout(self.top_widget)
self.top_grid_layout = Qt.QGridLayout()
self.top_layout.addLayout(self.top_grid_layout)
self.settings = Qt.QSettings("GNU Radio", "airprobe_rtlsdr_capture")
self.restoreGeometry(self.settings.value("geometry").toByteArray())
##################################################
# Parameters
##################################################
@ -81,137 +54,19 @@ class airprobe_rtlsdr_capture(gr.top_block, Qt.QWidget):
self.burst_file = burst_file
self.verbose = verbose
self.shiftoff = shiftoff = 400e3
##################################################
# Variables
##################################################
self.ppm_slider = ppm_slider = ppm
self.g_slider = g_slider = gain
self.fc_slider = fc_slider = fc
##################################################
# UI Blocks
##################################################
self._ppm_slider_layout = Qt.QHBoxLayout()
self._ppm_slider_layout.addWidget(Qt.QLabel("PPM Offset"+": "))
class qwt_counter_pyslot(Qwt.QwtCounter):
def __init__(self, parent=None):
Qwt.QwtCounter.__init__(self, parent)
@pyqtSlot('double')
def setValue(self, value):
super(Qwt.QwtCounter, self).setValue(value)
self._ppm_slider_counter = qwt_counter_pyslot()
self._ppm_slider_counter.setRange(-150, 150, 1)
self._ppm_slider_counter.setNumButtons(2)
self._ppm_slider_counter.setMinimumWidth(100)
self._ppm_slider_counter.setValue(self.ppm_slider)
self._ppm_slider_layout.addWidget(self._ppm_slider_counter)
self._ppm_slider_counter.valueChanged.connect(self.set_ppm_slider)
self.top_layout.addLayout(self._ppm_slider_layout)
self._g_slider_layout = Qt.QHBoxLayout()
self._g_slider_layout.addWidget(Qt.QLabel("Gain"+": "))
class qwt_counter_pyslot(Qwt.QwtCounter):
def __init__(self, parent=None):
Qwt.QwtCounter.__init__(self, parent)
@pyqtSlot('double')
def setValue(self, value):
super(Qwt.QwtCounter, self).setValue(value)
self._g_slider_counter = qwt_counter_pyslot()
self._g_slider_counter.setRange(0, 50, 0.5)
self._g_slider_counter.setNumButtons(2)
self._g_slider_counter.setMinimumWidth(100)
self._g_slider_counter.setValue(self.g_slider)
self._g_slider_layout.addWidget(self._g_slider_counter)
self._g_slider_counter.valueChanged.connect(self.set_g_slider)
self.top_layout.addLayout(self._g_slider_layout)
self._fc_slider_layout = Qt.QVBoxLayout()
self._fc_slider_tool_bar = Qt.QToolBar(self)
self._fc_slider_layout.addWidget(self._fc_slider_tool_bar)
self._fc_slider_tool_bar.addWidget(Qt.QLabel("Frequency"+": "))
class qwt_counter_pyslot(Qwt.QwtCounter):
def __init__(self, parent=None):
Qwt.QwtCounter.__init__(self, parent)
@pyqtSlot('double')
def setValue(self, value):
super(Qwt.QwtCounter, self).setValue(value)
self._fc_slider_counter = qwt_counter_pyslot()
self._fc_slider_counter.setRange(925e6, 1990e6, 2e5)
self._fc_slider_counter.setNumButtons(2)
self._fc_slider_counter.setValue(self.fc_slider)
self._fc_slider_tool_bar.addWidget(self._fc_slider_counter)
self._fc_slider_counter.valueChanged.connect(self.set_fc_slider)
self._fc_slider_slider = Qwt.QwtSlider(None, Qt.Qt.Horizontal, Qwt.QwtSlider.BottomScale, Qwt.QwtSlider.BgSlot)
self._fc_slider_slider.setRange(925e6, 1990e6, 2e5)
self._fc_slider_slider.setValue(self.fc_slider)
self._fc_slider_slider.setMinimumWidth(100)
self._fc_slider_slider.valueChanged.connect(self.set_fc_slider)
self._fc_slider_layout.addWidget(self._fc_slider_slider)
self.top_layout.addLayout(self._fc_slider_layout)
self.qtgui_freq_sink_x = qtgui.freq_sink_c(
1024,
firdes.WIN_BLACKMAN_hARRIS,
fc_slider,
samp_rate,
"",
1
)
self.qtgui_freq_sink_x.set_update_time(0.10)
self.qtgui_freq_sink_x.set_y_axis(-140, 10)
self.qtgui_freq_sink_x.enable_autoscale(False)
self.qtgui_freq_sink_x.enable_grid(False)
self.qtgui_freq_sink_x.set_fft_average(1.0)
labels = ["", "", "", "", "",
"", "", "", "", ""]
widths = [1, 1, 1, 1, 1,
1, 1, 1, 1, 1]
colors = ["blue", "red", "green", "black", "cyan",
"magenta", "yellow", "dark red", "dark green", "dark blue"]
alphas = [1.0, 1.0, 1.0, 1.0, 1.0,
1.0, 1.0, 1.0, 1.0, 1.0]
for i in xrange(1):
if len(labels[i]) == 0:
self.qtgui_freq_sink_x.set_line_label(i, "Data {0}".format(i))
else:
self.qtgui_freq_sink_x.set_line_label(i, labels[i])
self.qtgui_freq_sink_x.set_line_width(i, widths[i])
self.qtgui_freq_sink_x.set_line_color(i, colors[i])
self.qtgui_freq_sink_x.set_line_alpha(i, alphas[i])
self._qtgui_freq_sink_x_win = sip.wrapinstance(self.qtgui_freq_sink_x.pyqwidget(), Qt.QWidget)
self.top_layout.addWidget(self._qtgui_freq_sink_x_win)
##################################################
# Processing Blocks
##################################################
self.rtlsdr_source = osmosdr.source( args="numchan=" + str(1) + " " + "" )
self.rtlsdr_source.set_sample_rate(samp_rate)
self.rtlsdr_source.set_center_freq(fc_slider - shiftoff, 0)
self.rtlsdr_source.set_freq_corr(ppm_slider, 0)
self.rtlsdr_source.set_center_freq(fc - shiftoff, 0)
self.rtlsdr_source.set_freq_corr(ppm, 0)
self.rtlsdr_source.set_dc_offset_mode(2, 0)
self.rtlsdr_source.set_iq_balance_mode(2, 0)
self.rtlsdr_source.set_gain_mode(True, 0)
self.rtlsdr_source.set_gain(g_slider, 0)
self.rtlsdr_source.set_gain(gain, 0)
self.rtlsdr_source.set_if_gain(20, 0)
self.rtlsdr_source.set_bb_gain(20, 0)
self.rtlsdr_source.set_antenna("", 0)
@ -244,7 +99,6 @@ class airprobe_rtlsdr_capture(gr.top_block, Qt.QWidget):
##################################################
self.connect((self.rtlsdr_source, 0), (self.blocks_rotator, 0))
self.connect((self.blocks_rotator, 0), (self.qtgui_freq_sink_x, 0))
if self.cfile:
self.connect((self.blocks_rotator, 0), (self.blocks_file_sink, 0))
@ -260,17 +114,11 @@ class airprobe_rtlsdr_capture(gr.top_block, Qt.QWidget):
if self.verbose:
self.msg_connect(self.gsm_receiver, "C0", self.gsm_bursts_printer_0, "bursts")
def closeEvent(self, event):
self.settings = Qt.QSettings("GNU Radio", "airprobe_rtlsdr_capture")
self.settings.setValue("geometry", self.saveGeometry())
event.accept()
def get_fc(self):
return self.fc
def set_fc(self, fc):
self.fc = fc
self.set_fc_slider(self.fc)
if self.verbose or self.burst_file:
self.gsm_input.set_fc(self.fc)
@ -279,14 +127,12 @@ class airprobe_rtlsdr_capture(gr.top_block, Qt.QWidget):
def set_gain(self, gain):
self.gain = gain
self.set_g_slider(self.gain)
def get_samp_rate(self):
return self.samp_rate
def set_samp_rate(self, samp_rate):
self.samp_rate = samp_rate
self.qtgui_freq_sink_x.set_frequency_range(self.fc_slider, self.samp_rate)
self.rtlsdr_source.set_sample_rate(self.samp_rate)
if self.verbose or self.burst_file:
self.gsm_input.set_samp_rate_in(self.samp_rate)
@ -298,39 +144,10 @@ class airprobe_rtlsdr_capture(gr.top_block, Qt.QWidget):
self.ppm = ppm
self.set_ppm_slider(self.ppm)
def get_ppm_slider(self):
return self.ppm_slider
def set_ppm_slider(self, ppm_slider):
self.ppm_slider = ppm_slider
Qt.QMetaObject.invokeMethod(self._ppm_slider_counter, "setValue", Qt.Q_ARG("double", self.ppm_slider))
self.rtlsdr_source.set_freq_corr(self.ppm_slider, 0)
def get_g_slider(self):
return self.g_slider
def set_g_slider(self, g_slider):
self.g_slider = g_slider
Qt.QMetaObject.invokeMethod(self._g_slider_counter, "setValue", Qt.Q_ARG("double", self.g_slider))
self.rtlsdr_source.set_gain(self.g_slider, 0)
def get_fc_slider(self):
return self.fc_slider
def set_fc_slider(self, fc_slider):
self.fc_slider = fc_slider
Qt.QMetaObject.invokeMethod(self._fc_slider_counter, "setValue", Qt.Q_ARG("double", self.fc_slider))
Qt.QMetaObject.invokeMethod(self._fc_slider_slider, "setValue", Qt.Q_ARG("double", self.fc_slider))
self.qtgui_freq_sink_x.set_frequency_range(self.fc_slider, self.samp_rate)
self.rtlsdr_source.set_center_freq(self.fc_slider, 0)
if __name__ == '__main__':
import ctypes
import sys
parser = OptionParser(option_class=eng_option, usage="%prog [options]",
description="RTL-SDR capturing app of gr-gsm.")
#parser.formatter.width = 80
parser.add_option("-f", "--fc", dest="fc", type="eng_float",
help="Set frequency [default=%default]")
@ -355,13 +172,13 @@ if __name__ == '__main__':
parser.add_option("-c", "--cfile", dest="cfile",
help="File where the captured data are saved")
parser.add_option("-v", "--verbose", action="store_true",
help="If set, the captured bursts are printed to stdout")
bands_list = ", ".join(grgsm.arfcn.get_bands())
parser.add_option("--band", dest="band",
help="Specify the GSM band for the frequency.\nAvailable bands are: " + bands_list + ".\nIf no band is specified, it will be determined automatically, defaulting to 0." )
parser.add_option("-v", "--verbose", action="store_true",
help="If set, the captured bursts are printed to stdout")
(options, args) = parser.parse_args()
if options.cfile is None and options.burst_file is None:
@ -402,28 +219,16 @@ if __name__ == '__main__':
arfcn = grgsm.arfcn.downlink2arfcn(options.fc, band)
break
if sys.platform.startswith('linux'):
try:
x11 = ctypes.cdll.LoadLibrary('libX11.so')
x11.XInitThreads()
except:
print "Warning: failed to XInitThreads()"
if StrictVersion(Qt.qVersion()) >= StrictVersion("4.5.0"):
Qt.QApplication.setGraphicsSystem(gr.prefs().get_string('qtgui','style','raster'))
qapp = Qt.QApplication(sys.argv)
tb = airprobe_rtlsdr_capture(fc=fc, gain=options.gain, samp_rate=options.samp_rate,
ppm=options.ppm, arfcn=arfcn, cfile=options.cfile, burst_file=options.burst_file, verbose=options.verbose)
ppm=options.ppm, arfcn=arfcn, cfile=options.cfile,
burst_file=options.burst_file, verbose=options.verbose)
def signal_handler(signal, frame):
tb.stop()
tb.wait()
sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)
tb.start()
tb.show()
def quitting():
tb.stop()
tb.wait()
qapp.connect(qapp, Qt.SIGNAL("aboutToQuit()"), quitting)
qapp.exec_()
tb = None #to clean up Qt widgets
tb.wait()