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