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