@@ -37,28 +37,27 @@ using namespace std;
37
37
38
38
#ifdef HAVE_HACKRF
39
39
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
+
40
43
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;
46
47
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 ;
51
49
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 ;
60
56
}
61
- return (0 );
57
+
58
+ memcpy ( hackrf_rx_buf+hackrf_rx_count_old, transfer->buffer , bytes_to_write );
59
+
60
+ return (ret);
62
61
}
63
62
64
63
#endif
@@ -533,22 +532,26 @@ int capture_data(
533
532
ABORT (-1 );
534
533
}
535
534
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 );
542
537
543
538
if ( result != HACKRF_SUCCESS ) {
544
539
printf (" hackrf_start_rx() failed: %s (%d)\n " , hackrf_error_name ((hackrf_error)result), result);
545
540
ABORT (-1 );
546
541
}
547
542
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
+
548
551
// Convert to complex
549
552
capbuf.set_size (CAPLENGTH);
550
553
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 );
552
555
}
553
556
554
557
#endif
0 commit comments