<p>laforge <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/gr-gsm/+/13812">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  fixeria: Looks good to me, but someone else must approve
  laforge: Looks good to me, but someone else must approve; Verified
  osmith: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Filter out SoapyAudio devices<br><br>When gr-osmosdr is compiled with SoapySDR support and SoapyAudio is<br>installed the audio device is picked as a first choice when detecting<br>devices but grgsm tools are not able to work with audio devices. So in<br>such cases the user has to always specify the correct SDR device in the<br>args parameter which is a bit inconvenient.<br><br>When args is not specified call osmosdr.device_find to get all devices<br>and filter out unspported ones like SoapyAudio devices. When args is<br>specifed just try to create osmosdr.source with whatever value has been<br>specified.<br><br>Add -l and --list-devices command line option that prints information<br>about all detected devices.<br><br>Example commands:<br>  grgsm_capture --list-devices<br>  grgsm_capture --list-devices --args=nofake<br>  grgsm_capture --args=uhd,type=b210 -a 111 capture.cfile<br>  grgsm_livemon --args=rtl<br>  grgsm_livemon --args=uhd,type=b210<br><br>Change-Id: Ib84081041ca6c2bc18b9da0c32bac9d3ecef65ca<br>---<br>M apps/grgsm_livemon.grc<br>M apps/grgsm_livemon_headless.grc<br>M apps/grgsm_scanner<br>M apps/helpers/grgsm_capture<br>M python/__init__.py<br>M python/misc_utils/CMakeLists.txt<br>A python/misc_utils/device.py<br>7 files changed, 89 insertions(+), 8 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/apps/grgsm_livemon.grc b/apps/grgsm_livemon.grc</span><br><span>index 46b83e2..176aa6c 100644</span><br><span>--- a/apps/grgsm_livemon.grc</span><br><span>+++ b/apps/grgsm_livemon.grc</span><br><span>@@ -2844,7 +2844,7 @@</span><br><span>     </param></span><br><span>     <param></span><br><span>       <key>args</key></span><br><span style="color: hsl(0, 100%, 40%);">-      <value>args</value></span><br><span style="color: hsl(120, 100%, 40%);">+      <value>str(grgsm.device.get_default_args(args))</value></span><br><span>     </param></span><br><span>     <param></span><br><span>       <key>_enabled</key></span><br><span>diff --git a/apps/grgsm_livemon_headless.grc b/apps/grgsm_livemon_headless.grc</span><br><span>index a1ce284..2f3e981 100644</span><br><span>--- a/apps/grgsm_livemon_headless.grc</span><br><span>+++ b/apps/grgsm_livemon_headless.grc</span><br><span>@@ -2414,7 +2414,7 @@</span><br><span>     </param></span><br><span>     <param></span><br><span>       <key>args</key></span><br><span style="color: hsl(0, 100%, 40%);">-      <value>args</value></span><br><span style="color: hsl(120, 100%, 40%);">+      <value>str(grgsm.device.get_default_args(args))</value></span><br><span>     </param></span><br><span>     <param></span><br><span>       <key>_enabled</key></span><br><span>diff --git a/apps/grgsm_scanner b/apps/grgsm_scanner</span><br><span>index 32210ed..ce33a60 100755</span><br><span>--- a/apps/grgsm_scanner</span><br><span>+++ b/apps/grgsm_scanner</span><br><span>@@ -36,7 +36,7 @@</span><br><span> import osmosdr</span><br><span> import pmt</span><br><span> import time</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+import sys</span><br><span> </span><br><span> # from wideband_receiver import *</span><br><span> </span><br><span>@@ -208,7 +208,8 @@</span><br><span> </span><br><span>         # if no file name is given process data from rtl_sdr source</span><br><span>         print "Args=", args</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(120, 100%, 40%);">+        self.rtlsdr_source = osmosdr.source(args="numchan=" + str(1) + " " +</span><br><span style="color: hsl(120, 100%, 40%);">+                str(grgsm.device.get_default_args(args)))</span><br><span>         #self.rtlsdr_source.set_min_output_buffer(int(sample_rate*rec_len)) #this line causes segfaults on HackRF</span><br><span>         self.rtlsdr_source.set_sample_rate(sample_rate)</span><br><span> </span><br><span>@@ -387,7 +388,10 @@</span><br><span>     parser.add_option("-g", "--gain", dest="gain", type="eng_float", default=24.0,</span><br><span>                       help="Set gain [default=%default]")</span><br><span>     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 style="color: hsl(120, 100%, 40%);">+                      help="Set device arguments [default=%default]."</span><br><span style="color: hsl(120, 100%, 40%);">+                      " Use --list-devices the view the available devices")</span><br><span style="color: hsl(120, 100%, 40%);">+    parser.add_option("-l", "--list-devices", action="store_true",</span><br><span style="color: hsl(120, 100%, 40%);">+                      help="List available SDR devices, use --args to specify hints")</span><br><span>     parser.add_option("--speed", dest="speed", type="intx", default=4,</span><br><span>                       help="Scan speed [default=%default]. Value range 0-5.")</span><br><span>     parser.add_option("-v", "--verbose", action="store_true",</span><br><span>@@ -404,6 +408,10 @@</span><br><span>     if options is None:</span><br><span>         (options, args) = argument_parser().parse_args()</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    if options.list_devices:</span><br><span style="color: hsl(120, 100%, 40%);">+        grgsm.device.print_devices(options.args)</span><br><span style="color: hsl(120, 100%, 40%);">+        sys.exit(0)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     if options.band not in grgsm.arfcn.get_bands():</span><br><span>         parser.error("Invalid GSM band\n")</span><br><span> </span><br><span>diff --git a/apps/helpers/grgsm_capture b/apps/helpers/grgsm_capture</span><br><span>index 081544a..f3886ba 100755</span><br><span>--- a/apps/helpers/grgsm_capture</span><br><span>+++ b/apps/helpers/grgsm_capture</span><br><span>@@ -53,8 +53,8 @@</span><br><span>         # Setting up RF source</span><br><span>         ##################################################</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        self.sdr_source = \</span><br><span style="color: hsl(0, 100%, 40%);">-                    osmosdr.source(args="numchan=" + str(1) + " " + device_args)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.sdr_source = osmosdr.source(args="numchan=" + str(1) + " " +</span><br><span style="color: hsl(120, 100%, 40%);">+                str(grgsm.device.get_default_args(device_args)))</span><br><span> </span><br><span>         self.sdr_source.set_sample_rate(samp_rate)</span><br><span>         self.sdr_source.set_center_freq(freq, 0)</span><br><span>@@ -141,12 +141,19 @@</span><br><span> </span><br><span>     osmogroup.add_option("", "--args", dest="device_args", type="string",</span><br><span>                       default="", help="Set device arguments "</span><br><span style="color: hsl(0, 100%, 40%);">-                      "[default=%default]")</span><br><span style="color: hsl(120, 100%, 40%);">+                      "[default=%default]. Use --list-devices the view the available devices")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    osmogroup.add_option("-l", "--list-devices", action="store_true",</span><br><span style="color: hsl(120, 100%, 40%);">+                      help="List available SDR devices, use --args to specify hints")</span><br><span> </span><br><span>     parser.add_option_group(osmogroup)</span><br><span> </span><br><span>     (options, args) = parser.parse_args()</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    if options.list_devices:</span><br><span style="color: hsl(120, 100%, 40%);">+        grgsm.device.print_devices(options.device_args)</span><br><span style="color: hsl(120, 100%, 40%);">+        sys.exit(0)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     if not args:</span><br><span>         parser.error("Please provide an output file name to save the captured data\n")</span><br><span> </span><br><span>diff --git a/python/__init__.py b/python/__init__.py</span><br><span>index 00d14ac..e2905e8 100644</span><br><span>--- a/python/__init__.py</span><br><span>+++ b/python/__init__.py</span><br><span>@@ -59,6 +59,7 @@</span><br><span> from fn_time import *</span><br><span> from txtime_bursts_tagger import *</span><br><span> import arfcn</span><br><span style="color: hsl(120, 100%, 40%);">+import device</span><br><span> </span><br><span> </span><br><span> #</span><br><span>diff --git a/python/misc_utils/CMakeLists.txt b/python/misc_utils/CMakeLists.txt</span><br><span>index ec732a4..76304ca 100644</span><br><span>--- a/python/misc_utils/CMakeLists.txt</span><br><span>+++ b/python/misc_utils/CMakeLists.txt</span><br><span>@@ -23,5 +23,6 @@</span><br><span>     clock_offset_corrector_tagged.py</span><br><span>     hier_block.py </span><br><span>     fn_time.py</span><br><span style="color: hsl(120, 100%, 40%);">+    device.py</span><br><span>     DESTINATION ${GR_PYTHON_DIR}/grgsm</span><br><span> )</span><br><span>diff --git a/python/misc_utils/device.py b/python/misc_utils/device.py</span><br><span>new file mode 100644</span><br><span>index 0000000..de967ab</span><br><span>--- /dev/null</span><br><span>+++ b/python/misc_utils/device.py</span><br><span>@@ -0,0 +1,64 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#!/usr/bin/env python</span><br><span style="color: hsl(120, 100%, 40%);">+# -*- coding: utf-8 -*-</span><br><span style="color: hsl(120, 100%, 40%);">+# @file</span><br><span style="color: hsl(120, 100%, 40%);">+# @author (C) 2019 by Vasil Velichkov <vvvelichkov@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+# @section LICENSE</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# Gr-gsm is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+# it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+# the Free Software Foundation; either version 3, or (at your option)</span><br><span style="color: hsl(120, 100%, 40%);">+# any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# Gr-gsm is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+# but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+# GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# You should have received a copy of the GNU General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+# along with gr-gsm; see the file COPYING.  If not, write to</span><br><span style="color: hsl(120, 100%, 40%);">+# the Free Software Foundation, Inc., 51 Franklin Street,</span><br><span style="color: hsl(120, 100%, 40%);">+# Boston, MA 02110-1301, USA.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import osmosdr</span><br><span style="color: hsl(120, 100%, 40%);">+import os</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def get_devices(hint=""):</span><br><span style="color: hsl(120, 100%, 40%);">+    return osmosdr.device_find(osmosdr.device_t(hint))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def match(dev, filters):</span><br><span style="color: hsl(120, 100%, 40%);">+    for f in filters:</span><br><span style="color: hsl(120, 100%, 40%);">+        for k, v in f.items():</span><br><span style="color: hsl(120, 100%, 40%);">+            if (k not in dev or dev[k] != v):</span><br><span style="color: hsl(120, 100%, 40%);">+                break</span><br><span style="color: hsl(120, 100%, 40%);">+        else:</span><br><span style="color: hsl(120, 100%, 40%);">+            return True</span><br><span style="color: hsl(120, 100%, 40%);">+    return False</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def exclude(devices, filters = ({'driver': 'audio'},)):</span><br><span style="color: hsl(120, 100%, 40%);">+    return [dev for dev in devices if not match(dev, filters)]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def get_all_args(hint="nofake"):</span><br><span style="color: hsl(120, 100%, 40%);">+    return map(lambda dev: dev.to_string(), exclude(get_devices(hint)))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def get_default_args(args):</span><br><span style="color: hsl(120, 100%, 40%);">+    # The presence of GRC_BLOCKS_PATH environment variable indicates that</span><br><span style="color: hsl(120, 100%, 40%);">+    # gnuradio-companion compiles a flowgraph and in this case no exception</span><br><span style="color: hsl(120, 100%, 40%);">+    # have to be thrown otherwise the generaged python script will be invalid.</span><br><span style="color: hsl(120, 100%, 40%);">+    # This allows compilation of flowgraphs without an SDR device.</span><br><span style="color: hsl(120, 100%, 40%);">+    if args or os.getenv("GRC_BLOCKS_PATH"):</span><br><span style="color: hsl(120, 100%, 40%);">+        return args</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    devices = get_all_args("nofake")</span><br><span style="color: hsl(120, 100%, 40%);">+    if not devices:</span><br><span style="color: hsl(120, 100%, 40%);">+        raise RuntimeError("Unable to find any supported SDR devices")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    return devices[0]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def print_devices(hint=""):</span><br><span style="color: hsl(120, 100%, 40%);">+    devices = exclude(get_devices(hint))</span><br><span style="color: hsl(120, 100%, 40%);">+    if devices:</span><br><span style="color: hsl(120, 100%, 40%);">+        print("\n".join(map(lambda dev: dev.to_string(), devices)))</span><br><span style="color: hsl(120, 100%, 40%);">+    else:</span><br><span style="color: hsl(120, 100%, 40%);">+        print("Unable to find any supported SDR devices")</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/gr-gsm/+/13812">change 13812</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/c/gr-gsm/+/13812"/><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-Change-Id: Ib84081041ca6c2bc18b9da0c32bac9d3ecef65ca </div>
<div style="display:none"> Gerrit-Change-Number: 13812 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: Vasil Velichkov <vvvelichkov@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: Piotr Krysik <ptrkrysik@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: Vasil Velichkov <vvvelichkov@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: osmith <osmith@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>