The shell is functioning, including RX functionality (not TX). Currently the process looks like so:
christopher@nightshade:~/Repos/hackrf-shell$ ./hackrf-shell
GNU Guile 2.2.3
Copyright (C) 1995-2017 Free Software Foundation, Inc.
Guile comes with ABSOLUTELY NO WARRANTY; for details type `,show w'.
This program is free software, and you are welcome to redistribute it
under certain conditions; type `,show c' for details.
Enter `,help' for help.
scheme@(guile-user)> (load "hackrf-shell-lib.scm")
scheme@(guile-user)> (define d (hackrf-open))
scheme@(guile-user)> (hackrf-sensible-defaults d)
scheme@(guile-user)> (define c (hackrf-cb-rx-to-file "out.bin"))
scheme@(guile-user)> (hackrf-start-rx d c)
scheme@(guile-user)> (hackrf-stop d c)
hackrf-sensible-defaults
is simply an alias for
(hackrf-set-freq d 99500000)
(hackrf-set-sample-rate d 8000000)
(hackrf-disable-amp d)
(hackrf-set-lna-gain d 16)
(hackrf-set-vga-gain d 16))
The hackrf-start-rx
procedure must receive a callback function which will handle the data each time a block of data is received through libhackrf. The callback function receives a pointer
object to the data buffer, which can be converted to a bytevector with pointer->bytevector
, and also the byte length of the buffer (an int
). User can put together their own callback functions, though I was planning to add more for common use cases. Here are the ones included now:
(define (hackrf-cb-rx-to-stream out)
(lambda (b bl)
(let ([bv (pointer->bytevector b bl)])
(put-bytevector out bv))))
(define (hackrf-cb-rx-to-file filename)
(hackrf-cb-rx-to-stream
(open-output-file filename)))
I could expand this by adding more such scheme functions for common use cases (e.g., FM demodulation or frequency analysis) with helper functions written in C to handle intensive mathematical operations (e.g., FFT). You can see here the power of Guile scheme, allowing user to load in any Guile scheme code they want, while I can provide helper functions coded in C to allow for maximum efficiency in critical mathematical operations.
The current code simply provides the raw 8-bit IQ data, but the user may want to receive the IQ data as 32-bit floating point numbers. This should be an easy function to add, which I will code in C to allow for SSE/AVX style compiler optimizations. It still remains to be seen if I will run into a performance bottle neck with the byte to float conversions, but since I do not need to do any IPC with hackrf-shell, I do not expect this to be a problem.
To confirm received data is not junk, I saved about 1 GB of IQ data to “out.bin”, converted the data to floating point values using Gnu Radio, and then ran the data through an FM demodulator Gnu Radio program. I was able to tune into several different radio stations recorded in the save data, such as a local country music station, and I did not hear any distortion or skips.


git clone git://git.librehacker.com/pub/git/hackrf-rkt.git
Great work!
LikeLike