Skip to content

Commit 70dbc76

Browse files
committed
change usage of hackrf rx in capture_data() to as it in hackrf_transfer.c
1 parent 41ff43d commit 70dbc76

File tree

2 files changed

+38
-31
lines changed

2 files changed

+38
-31
lines changed

include/capbuf.h

+10-6
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,22 @@
1616
// along with this program. If not, see <http://www.gnu.org/licenses/>.
1717

1818

19-
#ifdef HAVE_HACKRF
20-
#include "hackrf.h"
21-
#else
22-
typedef struct hackrf_device hackrf_device;
23-
#endif
24-
2519
#ifndef HAVE_CAPBUF_H
2620
#define HAVE_CAPBUF_H
2721

2822
// Number of complex samples to capture.
2923
#define CAPLENGTH 153600
3024

25+
#ifdef HAVE_HACKRF
26+
#include "hackrf.h"
27+
28+
//uint8 hackrf_rx_buf[CAPLENGTH*2]; // used for capture_data() and hackrf rx callback
29+
//int hackrf_rx_count; // used for capture_data() and hackrf rx callback
30+
31+
#else
32+
typedef struct hackrf_device hackrf_device;
33+
#endif
34+
3135

3236
typedef struct {
3337
std::vector <unsigned char> * buf;

src/capbuf.cpp

+28-25
Original file line numberDiff line numberDiff line change
@@ -37,28 +37,27 @@ using namespace std;
3737

3838
#ifdef HAVE_HACKRF
3939

40+
uint8 hackrf_rx_buf[CAPLENGTH*2]; // used for capture_data() and hackrf rx callback
41+
int hackrf_rx_count; // used for capture_data() and hackrf rx callback
42+
4043
static int capbuf_hackrf_callback(hackrf_transfer* transfer) {
41-
callback_hackrf_package_t * cp_p=(callback_hackrf_package_t *)transfer->rx_ctx;
42-
callback_hackrf_package_t & cp=*cp_p;
43-
vector <unsigned char> * capbuf_raw_p=cp.buf;
44-
vector <unsigned char> & capbuf_raw=*capbuf_raw_p;
45-
hackrf_device * dev=cp.dev;
44+
int ret = 0;
45+
size_t bytes_to_write;
46+
int hackrf_rx_count_old = hackrf_rx_count;
4647

47-
if (transfer->valid_length==0) {
48-
cerr << "Error: received no samples from HACKRF device..." << endl;
49-
ABORT(-1);
50-
}
48+
hackrf_rx_count += transfer->valid_length;
5149

52-
for (uint32 t=0;t<(uint32)( transfer->valid_length );t++) {
53-
if (capbuf_raw.size()<CAPLENGTH*2) {
54-
capbuf_raw.push_back(transfer->buffer[t]);
55-
}
56-
if (capbuf_raw.size()==CAPLENGTH*2) {
57-
hackrf_stop_rx(dev);
58-
break;
59-
}
50+
int count_left = (CAPLENGTH*2) - hackrf_rx_count;
51+
if ( count_left <= 0 ) {
52+
bytes_to_write = transfer->valid_length + count_left;
53+
ret = -1; // indicate enough!
54+
} else {
55+
bytes_to_write = transfer->valid_length;
6056
}
61-
return(0);
57+
58+
memcpy( hackrf_rx_buf+hackrf_rx_count_old, transfer->buffer, bytes_to_write );
59+
60+
return(ret);
6261
}
6362

6463
#endif
@@ -533,22 +532,26 @@ int capture_data(
533532
ABORT(-1);
534533
}
535534

536-
vector <unsigned char> capbuf_raw;
537-
capbuf_raw.reserve(CAPLENGTH*2);
538-
callback_hackrf_package_t cp;
539-
cp.buf=&capbuf_raw;
540-
cp.dev=hackrf_dev;
541-
result = hackrf_start_rx(hackrf_dev, capbuf_hackrf_callback, (void *)&cp);
535+
hackrf_rx_count = 0; // clear counter
536+
result = hackrf_start_rx(hackrf_dev, capbuf_hackrf_callback, NULL);
542537

543538
if( result != HACKRF_SUCCESS ) {
544539
printf("hackrf_start_rx() failed: %s (%d)\n", hackrf_error_name((hackrf_error)result), result);
545540
ABORT(-1);
546541
}
547542

543+
while( hackrf_rx_count<(CAPLENGTH*2) );
544+
545+
result = hackrf_stop_rx(hackrf_dev);
546+
if( result != HACKRF_SUCCESS ) {
547+
printf("hackrf_stop_rx() failed: %s (%d)\n", hackrf_error_name((hackrf_error)result), result);
548+
ABORT(-1);
549+
}
550+
548551
// Convert to complex
549552
capbuf.set_size(CAPLENGTH);
550553
for (uint32 t=0;t<CAPLENGTH;t++) {
551-
capbuf(t)=complex<double>((((double)capbuf_raw[(t<<1)])-128.0)/128.0,(((double)capbuf_raw[(t<<1)+1])-128.0)/128.0);
554+
capbuf(t)=complex<double>((((double)hackrf_rx_buf[(t<<1)])-128.0)/128.0,(((double)hackrf_rx_buf[(t<<1)+1])-128.0)/128.0);
552555
}
553556

554557
#endif

0 commit comments

Comments
 (0)