Hello everyone,
Short story:
I would like to ask if it is possible to bring back the Miri support that was removed in October 2020?
The market for cheap SDR receivers has changed in recent years and there are now more good boards with Miri chipsets.
Long story:
I work as an industrial mechanic, but my secret loves since many years are electronics and amateur radio. It was GNU Radio that allowed me to learn a lot about filtering, modulation or signal mixing without the necessary technical training.
I started with the RTL-SDR sticks like many others and they got me off to a good start, but the lack of ability to receive signals below 20MHz without modification makes it difficult for beginners to experiment.
This is where the cheap Miri Boards come into play today. I ordered boards with Miri chipset from China for 18€ delivered to Germany. They have a good performance for beginners and signals above 10kHz can also be received well.
My plan is to develop cheap open source boards for amateur radio beginners that are connected directly to the Miri boards. Based on the NE555 and the Si5351A, basics such as filters, attenuators, mixing and modulating frequencies should be explained and tested.
My biggest problem is that I'm not a good programmer, so I can't manage to re-implement Miri support myself and compile gr-osmosdr to get it running on Windows (yes, I'll burn in hell for it one day).
Hence my request to resume Miri support in gr-osmosdr or the question of whether someone can help me to create a fork that can be compiled with Miri Support under Windows.
Offtopic:
After all these years of using gr-osmosdr, I would like to take this opportunity to thank everyone involved for their time and dedication, which enables people like me to learn and develop with simple means and without expensive equipment.
Thanks for your time and Merry Christmas to everyone!
Marc
Hey osmocom-sdr,
I've got a choose your own adventure patch set here for the adventurous
reviewer.
On OpenBSD (but not specific to OpenBSD) libusb-1.0 lives in
/usr/local/lib. The default linker (lld 13.0.0 on 7.2) doesn't include
/usr/local/lib in its out of the box search path, which triggers a build
failure in rtl-sdr because the -L argument(s) aren't passed through to ld.
The root cause here is that we pass ${LIBUSB_LIBRARIES} to
target_link_libraries, which is only the -lfoo arguments, but not the
-L/foo/bar arguments. This tends to work on most systems, since libusb is
usually in a place ld will search anyway.
There's two ways I could see to do this. Here comes the choose your own
adventure part:
1) The first is to use the PkgConfig::LIBUSB helper, which can be passed
directly to `target_link_libraries`, which allows all the arguments to be
passed through. This means the existing hooks to pass in a manual path
would be dropped and building without pkg-config against libusb won't be
supported anymore. This is the attached git format-patch entitled
"0001-Use-the-PkgConfig-imported-target-rather-than-_LIBRA.patch".
2) Punch the -L arguments through next to the LIBUSB_LIBRARIES argument to
`target_link_libraries`, add a new knob to set the values ("manual libusb
librarypath"), and when using pkg-config, generate the arguments with a
FOREACH. This is the attached git format-patch
"0001-Pass-additional-library-directory-arguments-to-ld.patch".
Both patch flavors build on my Debian sid box and an OpenBSD 7.2 box.
paultag
--
:wq
The signal handler for SIGINT/TERM/QUIT and, importantly, SIGPIPE tries
to write an informational message to stderr. When however stderr is
redirected to a closed pipe, this will cause (another) SIGPIPE, and in
turn the signal handler will get called again, and again and again.
Since we intend to exit rtl_fm anyways, we can just ignore this signal
from this point on.
---
Here is a small test program to verify the bug.
from subprocess import Popen, PIPE
p = Popen("rtl_test", stderr=PIPE)
# sighandler is set up after rtlsdr_open() call, so read past that
while p.stderr.readline()[:8] != b"Sampling": pass
p.stderr.close()
p.terminate() # SIGTERM -> sighandler() -> fprintf(stderr) -> SIGPIPE!
Note that the signal handler is not set up immediately, but only after
rtlsdr_open() is called. Due to line buffering/flushing on stderr, we
must read from the pipe or rtl_* will stall and SIGTERM/PIPE will still
be handled by the SIG_DFL, not triggering the write to the broken pipe.
And in case someone is wondering: Using signal(2) instead of
sigaction(2) is OK, as long as it only sets to SIG_DFL or SIG_IGN.
src/rtl_adsb.c | 1 +
src/rtl_fm.c | 1 +
src/rtl_power.c | 1 +
src/rtl_sdr.c | 1 +
src/rtl_tcp.c | 1 +
src/rtl_test.c | 1 +
6 files changed, 6 insertions(+)
diff --git a/src/rtl_adsb.c b/src/rtl_adsb.c
index 7aea8dd..8119ac8 100644
--- a/src/rtl_adsb.c
+++ b/src/rtl_adsb.c
@@ -123,6 +123,7 @@ sighandler(int signum)
#else
static void sighandler(int signum)
{
+ signal(SIGPIPE, SIG_IGN);
fprintf(stderr, "Signal caught, exiting!\n");
do_exit = 1;
rtlsdr_cancel_async(dev);
diff --git a/src/rtl_fm.c b/src/rtl_fm.c
index 7c84332..037793c 100644
--- a/src/rtl_fm.c
+++ b/src/rtl_fm.c
@@ -246,6 +246,7 @@ sighandler(int signum)
#else
static void sighandler(int signum)
{
+ signal(SIGPIPE, SIG_IGN);
fprintf(stderr, "Signal caught, exiting!\n");
do_exit = 1;
rtlsdr_cancel_async(dongle.dev);
diff --git a/src/rtl_power.c b/src/rtl_power.c
index 6204de2..df3ceb7 100644
--- a/src/rtl_power.c
+++ b/src/rtl_power.c
@@ -195,6 +195,7 @@ sighandler(int signum)
#else
static void sighandler(int signum)
{
+ signal(SIGPIPE, SIG_IGN);
do_exit++;
multi_bail();
}
diff --git a/src/rtl_sdr.c b/src/rtl_sdr.c
index e6537ca..2c93b57 100644
--- a/src/rtl_sdr.c
+++ b/src/rtl_sdr.c
@@ -74,6 +74,7 @@ sighandler(int signum)
#else
static void sighandler(int signum)
{
+ signal(SIGPIPE, SIG_IGN);
fprintf(stderr, "Signal caught, exiting!\n");
do_exit = 1;
rtlsdr_cancel_async(dev);
diff --git a/src/rtl_tcp.c b/src/rtl_tcp.c
index 84f5591..8781ba9 100644
--- a/src/rtl_tcp.c
+++ b/src/rtl_tcp.c
@@ -144,6 +144,7 @@ sighandler(int signum)
#else
static void sighandler(int signum)
{
+ signal(SIGPIPE, SIG_IGN);
fprintf(stderr, "Signal caught, exiting!\n");
rtlsdr_cancel_async(dev);
do_exit = 1;
diff --git a/src/rtl_test.c b/src/rtl_test.c
index 9b44097..b7f46ea 100644
--- a/src/rtl_test.c
+++ b/src/rtl_test.c
@@ -115,6 +115,7 @@ sighandler(int signum)
#else
static void sighandler(int signum)
{
+ signal(SIGPIPE, SIG_IGN);
fprintf(stderr, "Signal caught, exiting!\n");
do_exit = 1;
rtlsdr_cancel_async(dev);
--
2.38.1
The new-ish RFSpace CloudSDR is mostly the same as the Cloud-IQ, but has a few differences. I’ve tested it thoroughly and it works well. One side note, the CloudSDR (and probably others) require the UDP host port to be set equal to the SDR’s port. This allows multiple CloudSDRs to work simultaneously. That is, a second CloudSDR needs a different IP address, obviously, but also needs a different port, e.g. 50001 rather than the default 50000.
Regards,
Mike McCarrick