<p>Piotr Krysik <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/13090">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Piotr Krysik: Looks good to me, approved; Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Major simplification and some argument changes in grgsm_capture<br><br>grmgs_capture tried to do too many things for a simple recorder.<br>It was simplified by removing the receiver and ability to<br>save data to bursts files.<br><br>All other stuff that is not necessary for recording signal to disk was<br>also removed:<br>-setters/getters,<br>-storing of parameters that never will be changed.<br><br>The 'fc' parameter name was changed to 'freq' to follow GNU Radio<br>guidelines.<br><br>The 'shiftoff' parameter was removed.<br><br>'bb_gain' and 'if_gain' parameters were added.<br><br>Variables specific to some of SDR's like:<br>-gains at different stages,<br>-bandwidth (not all devices can set it),<br>-antennas (some devices have just one, some not),<br>were moved to separate options group.<br><br>What is left to be exposed is:<br>-dc_offset_mode,<br>-iq_balance_mode,<br>-gain_mode.<br><br>Change-Id: I092a43eaddb09a99c6cc05fde13f0ae94d9e0251<br>---<br>M apps/helpers/grgsm_capture<br>1 file changed, 117 insertions(+), 171 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/apps/helpers/grgsm_capture b/apps/helpers/grgsm_capture</span><br><span>index b1b85a7..f698205 100755</span><br><span>--- a/apps/helpers/grgsm_capture</span><br><span>+++ b/apps/helpers/grgsm_capture</span><br><span>@@ -2,6 +2,7 @@</span><br><span> # -*- coding: utf-8 -*-</span><br><span> # @file</span><br><span> # @author (C) 2015 by Roman Khassraf <rkhassraf@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+#         (C) 2019 by Piotr Krysik <ptrkrysik@gmail.com></span><br><span> # @section LICENSE</span><br><span> #</span><br><span> # Gr-gsm is free software; you can redistribute it and/or modify</span><br><span>@@ -26,217 +27,162 @@</span><br><span> from gnuradio import gr</span><br><span> from gnuradio.eng_option import eng_option</span><br><span> from gnuradio.filter import firdes</span><br><span style="color: hsl(0, 100%, 40%);">-from math import pi</span><br><span style="color: hsl(0, 100%, 40%);">-from optparse import OptionParser</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-import grgsm</span><br><span style="color: hsl(120, 100%, 40%);">+from optparse import OptionParser, OptionGroup</span><br><span> import osmosdr</span><br><span style="color: hsl(0, 100%, 40%);">-import pmt</span><br><span style="color: hsl(120, 100%, 40%);">+import time</span><br><span style="color: hsl(120, 100%, 40%);">+import grgsm</span><br><span> import signal</span><br><span> import sys</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> class grgsm_capture(gr.top_block):</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, fc, gain, samp_rate, ppm, arfcn, cfile=None, burst_file=None, verbose=False, rec_length=None, args=""):</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self,</span><br><span style="color: hsl(120, 100%, 40%);">+                 freq,</span><br><span style="color: hsl(120, 100%, 40%);">+                 gain=30,</span><br><span style="color: hsl(120, 100%, 40%);">+                 samp_rate=1e6,</span><br><span style="color: hsl(120, 100%, 40%);">+                 rec_length=float('Inf'),</span><br><span style="color: hsl(120, 100%, 40%);">+                 freq_corr=0,</span><br><span style="color: hsl(120, 100%, 40%);">+                 output_filename=None,</span><br><span style="color: hsl(120, 100%, 40%);">+                 bandwidth=0,</span><br><span style="color: hsl(120, 100%, 40%);">+                 bb_gain=20,</span><br><span style="color: hsl(120, 100%, 40%);">+                 if_gain=20,</span><br><span style="color: hsl(120, 100%, 40%);">+                 antenna="",</span><br><span style="color: hsl(120, 100%, 40%);">+                 device_args=""):</span><br><span>         gr.top_block.__init__(self, "Gr-gsm Capture")</span><br><span style="color: hsl(0, 100%, 40%);">-                </span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         ##################################################</span><br><span style="color: hsl(0, 100%, 40%);">-        # Parameters</span><br><span style="color: hsl(0, 100%, 40%);">-        ##################################################</span><br><span style="color: hsl(0, 100%, 40%);">-        self.fc = fc</span><br><span style="color: hsl(0, 100%, 40%);">-        self.gain = gain</span><br><span style="color: hsl(0, 100%, 40%);">-        self.samp_rate = samp_rate</span><br><span style="color: hsl(0, 100%, 40%);">-        self.ppm = ppm</span><br><span style="color: hsl(0, 100%, 40%);">-        self.arfcn = arfcn</span><br><span style="color: hsl(0, 100%, 40%);">-        self.cfile = cfile</span><br><span style="color: hsl(0, 100%, 40%);">-        self.burst_file = burst_file</span><br><span style="color: hsl(0, 100%, 40%);">-        self.verbose = verbose</span><br><span style="color: hsl(0, 100%, 40%);">-        self.shiftoff = shiftoff = 400e3</span><br><span style="color: hsl(0, 100%, 40%);">-        self.rec_length = rec_length</span><br><span style="color: hsl(0, 100%, 40%);">-        </span><br><span style="color: hsl(0, 100%, 40%);">-        ##################################################</span><br><span style="color: hsl(0, 100%, 40%);">-        # Processing Blocks</span><br><span style="color: hsl(120, 100%, 40%);">+        # Setting up RF source</span><br><span>         ##################################################</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        self.rtlsdr_source = osmosdr.source( args="numchan=" + str(1) + " " + args )</span><br><span style="color: hsl(0, 100%, 40%);">-        self.rtlsdr_source.set_sample_rate(samp_rate)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.rtlsdr_source.set_center_freq(fc - shiftoff, 0)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.rtlsdr_source.set_freq_corr(ppm, 0)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.rtlsdr_source.set_dc_offset_mode(2, 0)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.rtlsdr_source.set_iq_balance_mode(2, 0)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.rtlsdr_source.set_gain_mode(True, 0)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.rtlsdr_source.set_gain(gain, 0)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.rtlsdr_source.set_if_gain(20, 0)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.rtlsdr_source.set_bb_gain(20, 0)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.rtlsdr_source.set_antenna("", 0)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.rtlsdr_source.set_bandwidth(250e3+abs(shiftoff), 0)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.blocks_rotator = blocks.rotator_cc(-2*pi*shiftoff/samp_rate)</span><br><span style="color: hsl(0, 100%, 40%);">-        </span><br><span style="color: hsl(0, 100%, 40%);">-        if self.rec_length is not None:</span><br><span style="color: hsl(0, 100%, 40%);">-            self.blocks_head_0 = blocks.head(gr.sizeof_gr_complex, int(samp_rate*rec_length))</span><br><span style="color: hsl(0, 100%, 40%);">-        </span><br><span style="color: hsl(0, 100%, 40%);">-        if self.verbose or self.burst_file:</span><br><span style="color: hsl(0, 100%, 40%);">-            self.gsm_receiver = grgsm.receiver(4, ([self.arfcn]), ([]))</span><br><span style="color: hsl(0, 100%, 40%);">-            self.gsm_input = grgsm.gsm_input(</span><br><span style="color: hsl(0, 100%, 40%);">-                ppm=0,</span><br><span style="color: hsl(0, 100%, 40%);">-                osr=4,</span><br><span style="color: hsl(0, 100%, 40%);">-                fc=fc,</span><br><span style="color: hsl(0, 100%, 40%);">-                samp_rate_in=samp_rate,</span><br><span style="color: hsl(0, 100%, 40%);">-            )</span><br><span style="color: hsl(0, 100%, 40%);">-            self.gsm_clock_offset_control = grgsm.clock_offset_control(fc-shiftoff, samp_rate, osr=4)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.sdr_source = \</span><br><span style="color: hsl(120, 100%, 40%);">+                    osmosdr.source(args="numchan=1" + device_args )</span><br><span style="color: hsl(120, 100%, 40%);">+        self.sdr_source.set_sample_rate(samp_rate)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.sdr_source.set_center_freq(freq, 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.sdr_source.set_freq_corr(freq_corr, 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.sdr_source.set_dc_offset_mode(2, 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.sdr_source.set_iq_balance_mode(2, 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.sdr_source.set_gain_mode(True, 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.sdr_source.set_gain(gain, 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.sdr_source.set_if_gain(if_gain, 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.sdr_source.set_bb_gain(bb_gain, 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.sdr_source.set_antenna("", 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        if bandwidth != 0:</span><br><span style="color: hsl(120, 100%, 40%);">+            self.sdr_source.set_bandwidth(bandwidth, 0)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        if self.burst_file:</span><br><span style="color: hsl(0, 100%, 40%);">-            self.gsm_burst_file_sink = grgsm.burst_file_sink(self.burst_file)</span><br><span style="color: hsl(120, 100%, 40%);">+        ##################################################</span><br><span style="color: hsl(120, 100%, 40%);">+        # The rest of processing blocks</span><br><span style="color: hsl(120, 100%, 40%);">+        ##################################################</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        if self.cfile:</span><br><span style="color: hsl(0, 100%, 40%);">-            self.blocks_file_sink = blocks.file_sink(gr.sizeof_gr_complex*1, self.cfile, False)</span><br><span style="color: hsl(0, 100%, 40%);">-            self.blocks_file_sink.set_unbuffered(False)</span><br><span style="color: hsl(120, 100%, 40%);">+        if rec_length != float('Inf'):</span><br><span style="color: hsl(120, 100%, 40%);">+            self.head = \</span><br><span style="color: hsl(120, 100%, 40%);">+                    blocks.head(gr.sizeof_gr_complex, int(samp_rate*rec_length))</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        if self.verbose:</span><br><span style="color: hsl(0, 100%, 40%);">-            self.gsm_bursts_printer_0 = grgsm.bursts_printer(pmt.intern(""),</span><br><span style="color: hsl(0, 100%, 40%);">-                                                             False, False, False, False)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.file_sink = blocks.file_sink(gr.sizeof_gr_complex*1, \</span><br><span style="color: hsl(120, 100%, 40%);">+                                          output_filename, False)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.file_sink.set_unbuffered(False)</span><br><span> </span><br><span>         ##################################################</span><br><span>         # Connections</span><br><span>         ##################################################</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        if self.rec_length is not None: #if recording length is defined connect head block after the source</span><br><span style="color: hsl(0, 100%, 40%);">-            self.connect((self.rtlsdr_source, 0), (self.blocks_head_0, 0))</span><br><span style="color: hsl(0, 100%, 40%);">-            self.connect((self.blocks_head_0, 0), (self.blocks_rotator, 0))</span><br><span style="color: hsl(120, 100%, 40%);">+        if rec_length != float('Inf'): #if recording length is not infinite</span><br><span style="color: hsl(120, 100%, 40%);">+                                            #connect head block after the source</span><br><span style="color: hsl(120, 100%, 40%);">+            self.connect((self.sdr_source, 0), (self.head, 0))</span><br><span style="color: hsl(120, 100%, 40%);">+            self.connect((self.head, 0), (self.file_sink, 0))</span><br><span>         else:</span><br><span style="color: hsl(0, 100%, 40%);">-            self.connect((self.rtlsdr_source, 0), (self.blocks_rotator, 0))</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if self.cfile:</span><br><span style="color: hsl(0, 100%, 40%);">-            self.connect((self.blocks_rotator, 0), (self.blocks_file_sink, 0))</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if self.verbose or self.burst_file:</span><br><span style="color: hsl(0, 100%, 40%);">-            self.connect((self.gsm_input, 0), (self.gsm_receiver, 0))</span><br><span style="color: hsl(0, 100%, 40%);">-            self.connect((self.blocks_rotator, 0), (self.gsm_input, 0))</span><br><span style="color: hsl(0, 100%, 40%);">-            self.msg_connect(self.gsm_clock_offset_control, "ctrl", self.gsm_input, "ctrl_in")</span><br><span style="color: hsl(0, 100%, 40%);">-            self.msg_connect(self.gsm_receiver, "measurements", self.gsm_clock_offset_control, "measurements")</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            if self.burst_file:</span><br><span style="color: hsl(0, 100%, 40%);">-                self.msg_connect(self.gsm_receiver, "C0", self.gsm_burst_file_sink, "in")</span><br><span style="color: hsl(0, 100%, 40%);">-            if self.verbose:</span><br><span style="color: hsl(0, 100%, 40%);">-                self.msg_connect(self.gsm_receiver, "C0", self.gsm_bursts_printer_0, "bursts")</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    def get_fc(self):</span><br><span style="color: hsl(0, 100%, 40%);">-        return self.fc</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    def set_fc(self, fc):</span><br><span style="color: hsl(0, 100%, 40%);">-        self.fc = fc</span><br><span style="color: hsl(0, 100%, 40%);">-        if self.verbose or self.burst_file:</span><br><span style="color: hsl(0, 100%, 40%);">-            self.gsm_input.set_fc(self.fc)</span><br><span style="color: hsl(0, 100%, 40%);">-            </span><br><span style="color: hsl(0, 100%, 40%);">-    def get_arfcn(self):</span><br><span style="color: hsl(0, 100%, 40%);">-        return self.arfcn</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    def set_arfcn(self, arfcn):</span><br><span style="color: hsl(0, 100%, 40%);">-        self.arfcn = arfcn</span><br><span style="color: hsl(0, 100%, 40%);">-        if self.verbose or self.burst_file:</span><br><span style="color: hsl(0, 100%, 40%);">-            self.gsm_receiver.set_cell_allocation([self.arfcn])</span><br><span style="color: hsl(0, 100%, 40%);">-            new_freq = grgsm.arfcn.arfcn2downlink(self.arfcn)</span><br><span style="color: hsl(0, 100%, 40%);">-            self.set_fc(new_freq)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    def get_gain(self):</span><br><span style="color: hsl(0, 100%, 40%);">-        return self.gain</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    def set_gain(self, gain):</span><br><span style="color: hsl(0, 100%, 40%);">-        self.gain = gain</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    def get_samp_rate(self):</span><br><span style="color: hsl(0, 100%, 40%);">-        return self.samp_rate</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    def set_samp_rate(self, samp_rate):</span><br><span style="color: hsl(0, 100%, 40%);">-        self.samp_rate = samp_rate</span><br><span style="color: hsl(0, 100%, 40%);">-        self.rtlsdr_source.set_sample_rate(self.samp_rate)</span><br><span style="color: hsl(0, 100%, 40%);">-        if self.verbose or self.burst_file:</span><br><span style="color: hsl(0, 100%, 40%);">-            self.gsm_input.set_samp_rate_in(self.samp_rate)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    def get_ppm(self):</span><br><span style="color: hsl(0, 100%, 40%);">-        return self.ppm</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    def set_ppm(self, ppm):</span><br><span style="color: hsl(0, 100%, 40%);">-        self.ppm = ppm</span><br><span style="color: hsl(0, 100%, 40%);">-        self.set_ppm_slider(self.ppm)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    def get_rec_length(self):</span><br><span style="color: hsl(0, 100%, 40%);">-        return self.rec_length</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    def set_rec_length(self, rec_length):</span><br><span style="color: hsl(0, 100%, 40%);">-        self.rec_length = rec_length</span><br><span style="color: hsl(0, 100%, 40%);">-        self.blocks_head_0.set_length(int(self.samp_rate*self.rec_length))</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+            self.connect((self.sdr_source, 0), (self.file_sink, 0))</span><br><span> </span><br><span> if __name__ == '__main__':</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    parser = OptionParser(option_class=eng_option, usage="%prog [options]",</span><br><span style="color: hsl(120, 100%, 40%);">+    parser = OptionParser(option_class=eng_option, usage="%prog [options] output_filename",</span><br><span>                           description="RTL-SDR capturing app of gr-gsm.")</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    parser.add_option("-f", "--fc", dest="fc", type="eng_float", </span><br><span style="color: hsl(120, 100%, 40%);">+    parser.add_option("-f", "--freq", dest="freq", type="eng_float",</span><br><span>                       help="Set frequency [default=%default]")</span><br><span style="color: hsl(0, 100%, 40%);">-    </span><br><span style="color: hsl(0, 100%, 40%);">-    parser.add_option("-a", "--arfcn", dest="arfcn", type="intx", </span><br><span style="color: hsl(0, 100%, 40%);">-                      help="Set ARFCN instead of frequency (for PCS1900 add 0x8000 (2**15) to the ARFCN number)")</span><br><span style="color: hsl(0, 100%, 40%);">-    </span><br><span style="color: hsl(0, 100%, 40%);">-    parser.add_option("-g", "--gain", dest="gain", type="eng_float", </span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    parser.add_option("-a", "--arfcn", dest="arfcn", type="intx",</span><br><span style="color: hsl(120, 100%, 40%);">+                      help="Set ARFCN instead of frequency (for PCS1900 add"</span><br><span style="color: hsl(120, 100%, 40%);">+                           "0x8000 (2**15) to the ARFCN number)")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    parser.add_option("-g", "--gain", dest="gain", type="eng_float",</span><br><span>                       default=eng_notation.num_to_str(30),</span><br><span>                       help="Set gain [default=%default]")</span><br><span style="color: hsl(0, 100%, 40%);">-    </span><br><span style="color: hsl(0, 100%, 40%);">-    parser.add_option("-s", "--samp-rate", dest="samp_rate", type="eng_float", </span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    parser.add_option("-s", "--samp-rate", dest="samp_rate", type="eng_float",</span><br><span>                       default=eng_notation.num_to_str(1000000),</span><br><span>                       help="Set samp_rate [default=%default]")</span><br><span style="color: hsl(0, 100%, 40%);">-    </span><br><span style="color: hsl(0, 100%, 40%);">-    parser.add_option("-p", "--ppm", dest="ppm", type="intx", default=0,</span><br><span style="color: hsl(0, 100%, 40%);">-                      help="Set ppm [default=%default]")</span><br><span style="color: hsl(0, 100%, 40%);">-    </span><br><span style="color: hsl(0, 100%, 40%);">-    parser.add_option("-b", "--burst-file", dest="burst_file", </span><br><span style="color: hsl(0, 100%, 40%);">-                      help="File where the captured bursts are saved")</span><br><span style="color: hsl(0, 100%, 40%);">-    </span><br><span style="color: hsl(0, 100%, 40%);">-    parser.add_option("-c", "--cfile", dest="cfile", </span><br><span style="color: hsl(0, 100%, 40%);">-                      help="File where the captured data are saved")</span><br><span style="color: hsl(0, 100%, 40%);">-    </span><br><span style="color: hsl(0, 100%, 40%);">-    parser.add_option("", "--args", dest="args", type="string", default="",</span><br><span style="color: hsl(0, 100%, 40%);">-        help="Set device arguments [default=%default]")</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    parser.add_option("-v", "--verbose", action="store_true", </span><br><span style="color: hsl(0, 100%, 40%);">-                      help="If set, the captured bursts are printed to stdout")</span><br><span style="color: hsl(120, 100%, 40%);">+    parser.add_option("-T", "--rec-length", dest="rec_length", type="float",</span><br><span style="color: hsl(120, 100%, 40%);">+                      default='Inf', help="Set length of recording in seconds "</span><br><span style="color: hsl(120, 100%, 40%);">+                      "[default=infinity]")</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    parser.add_option("-T", "--rec-length", dest="rec_length", type="eng_float",</span><br><span style="color: hsl(0, 100%, 40%);">-        help="Set length of recording in seconds [default=%default]")</span><br><span style="color: hsl(120, 100%, 40%);">+    parser.add_option("-p", "--freq-corr", dest="freq_corr", type="eng_float",</span><br><span style="color: hsl(120, 100%, 40%);">+                      default="0", help="Set frequency correction in"</span><br><span style="color: hsl(120, 100%, 40%);">+                      " ppm [default=%default]")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    osmogroup = OptionGroup(parser, 'Additional osmosdr source options',</span><br><span style="color: hsl(120, 100%, 40%);">+                      "Options specific to a subset of SDR receivers "</span><br><span style="color: hsl(120, 100%, 40%);">+                      "supported by osmosdr source.")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    osmogroup.add_option("-w", "--bandwidth", dest="bandwidth", type="eng_float",</span><br><span style="color: hsl(120, 100%, 40%);">+                      default="0", help="Set bandwidth [default=samp_rate]")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    osmogroup.add_option("", "--bb-gain", dest="bb_gain", type="eng_float",</span><br><span style="color: hsl(120, 100%, 40%);">+                      default=eng_notation.num_to_str(20),</span><br><span style="color: hsl(120, 100%, 40%);">+                      help="Set baseband gain [default=%default]")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    osmogroup.add_option("", "--if-gain", dest="if_gain", type="eng_float",</span><br><span style="color: hsl(120, 100%, 40%);">+                      default=eng_notation.num_to_str(20),</span><br><span style="color: hsl(120, 100%, 40%);">+                      help="Set intermediate freque gain [default=%default]")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    osmogroup.add_option("", "--ant", dest="antenna", type="string",</span><br><span style="color: hsl(120, 100%, 40%);">+                      default="", help="Set antenna "</span><br><span style="color: hsl(120, 100%, 40%);">+                      "[default=%default]")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    osmogroup.add_option("", "--args", dest="device_args", type="string",</span><br><span style="color: hsl(120, 100%, 40%);">+                      default="", help="Set device arguments "</span><br><span style="color: hsl(120, 100%, 40%);">+                      "[default=%default]")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    parser.add_option_group(osmogroup)</span><br><span> </span><br><span>     (options, args) = parser.parse_args()</span><br><span style="color: hsl(0, 100%, 40%);">-    </span><br><span style="color: hsl(0, 100%, 40%);">-    if options.cfile is None and options.burst_file is None:</span><br><span style="color: hsl(0, 100%, 40%);">-        parser.error("Please provide a cfile or a burst file (or both) to save the captured data\n")</span><br><span style="color: hsl(0, 100%, 40%);">-        </span><br><span style="color: hsl(0, 100%, 40%);">-    if (options.fc is None and options.arfcn is None) or (options.fc is not None and options.arfcn is not None):</span><br><span style="color: hsl(0, 100%, 40%);">-        parser.error("You have to provide either a frequency or an ARFCN (but not both).\n")</span><br><span style="color: hsl(0, 100%, 40%);">-        </span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    if not args:</span><br><span style="color: hsl(120, 100%, 40%);">+        parser.error("Please provide an output file name to save the captured data\n")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    output_filename = args[0]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    if (options.freq is None and options.arfcn is None) or \</span><br><span style="color: hsl(120, 100%, 40%);">+       (options.freq is not None and options.arfcn is not None):</span><br><span style="color: hsl(120, 100%, 40%);">+        parser.error("You have to provide either a frequency or"</span><br><span style="color: hsl(120, 100%, 40%);">+                     "an ARFCN (but not both).\n")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     arfcn = 0</span><br><span style="color: hsl(0, 100%, 40%);">-    fc = 939.4e6</span><br><span style="color: hsl(120, 100%, 40%);">+    freq = 0</span><br><span>     if options.arfcn:</span><br><span>         if not grgsm.arfcn.is_valid_arfcn(options.arfcn):</span><br><span>             parser.error("ARFCN is not valid\n")</span><br><span>         else:</span><br><span style="color: hsl(0, 100%, 40%);">-            arfcn = options.arfcn</span><br><span style="color: hsl(0, 100%, 40%);">-            fc = grgsm.arfcn.arfcn2downlink(arfcn)</span><br><span style="color: hsl(0, 100%, 40%);">-    elif options.fc:</span><br><span style="color: hsl(0, 100%, 40%);">-        fc = options.fc</span><br><span style="color: hsl(0, 100%, 40%);">-        arfcn = grgsm.arfcn.downlink2arfcn(options.fc)</span><br><span style="color: hsl(0, 100%, 40%);">-     </span><br><span style="color: hsl(0, 100%, 40%);">-    tb = grgsm_capture(fc=fc, gain=options.gain, samp_rate=options.samp_rate,</span><br><span style="color: hsl(0, 100%, 40%);">-                         ppm=options.ppm, arfcn=arfcn, cfile=options.cfile, </span><br><span style="color: hsl(0, 100%, 40%);">-                         burst_file=options.burst_file, verbose=options.verbose,</span><br><span style="color: hsl(0, 100%, 40%);">-                         rec_length=options.rec_length, args=options.args)</span><br><span style="color: hsl(0, 100%, 40%);">-    </span><br><span style="color: hsl(120, 100%, 40%);">+            freq = grgsm.arfcn.arfcn2downlink(options.arfcn)</span><br><span style="color: hsl(120, 100%, 40%);">+    elif options.freq:</span><br><span style="color: hsl(120, 100%, 40%);">+        freq = options.freq</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    tb = grgsm_capture(freq=freq,</span><br><span style="color: hsl(120, 100%, 40%);">+                       gain=options.gain,</span><br><span style="color: hsl(120, 100%, 40%);">+                       freq_corr=options.freq_corr,</span><br><span style="color: hsl(120, 100%, 40%);">+                       samp_rate=options.samp_rate,</span><br><span style="color: hsl(120, 100%, 40%);">+                       output_filename=output_filename,</span><br><span style="color: hsl(120, 100%, 40%);">+                       rec_length=options.rec_length,</span><br><span style="color: hsl(120, 100%, 40%);">+                       bandwidth=options.bandwidth,</span><br><span style="color: hsl(120, 100%, 40%);">+                       bb_gain=options.bb_gain,</span><br><span style="color: hsl(120, 100%, 40%);">+                       if_gain=options.if_gain,</span><br><span style="color: hsl(120, 100%, 40%);">+                       antenna=options.antenna,</span><br><span style="color: hsl(120, 100%, 40%);">+                       device_args=options.device_args)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     def signal_handler(signal, frame):</span><br><span>         tb.stop()</span><br><span style="color: hsl(0, 100%, 40%);">-        tb.wait()        </span><br><span style="color: hsl(120, 100%, 40%);">+        tb.wait()</span><br><span>         sys.exit(0)</span><br><span style="color: hsl(0, 100%, 40%);">-        </span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     signal.signal(signal.SIGINT, signal_handler)</span><br><span> </span><br><span>     tb.start()</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/13090">change 13090</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/13090"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: gr-gsm </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: I092a43eaddb09a99c6cc05fde13f0ae94d9e0251 </div>
<div style="display:none"> Gerrit-Change-Number: 13090 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </div>
<div style="display:none"> Gerrit-Owner: Piotr Krysik <ptrkrysik@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: Piotr Krysik <ptrkrysik@gmail.com> </div>