<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>