Support compiling with Visual Studio

This commit is contained in:
Dominic Spill
2017-01-26 17:00:41 -07:00
parent a6b9f8f96d
commit 439ddaaa40
4 changed files with 73 additions and 62 deletions

View File

@ -24,12 +24,15 @@
set(INSTALL_DEFAULT_BINDIR "bin" CACHE STRING "Appended to CMAKE_INSTALL_PREFIX") set(INSTALL_DEFAULT_BINDIR "bin" CACHE STRING "Appended to CMAKE_INSTALL_PREFIX")
INCLUDE(FindPkgConfig) INCLUDE(FindPkgConfig)
pkg_check_modules(FFTW REQUIRED fftw3f)
if(MSVC) if(MSVC)
add_library(libgetopt_static STATIC add_library(libgetopt_static STATIC
../getopt/getopt.c ../getopt/getopt.c
) )
else()
pkg_check_modules(FFTW REQUIRED fftw3f)
LIST(APPEND TOOLS hackrf_sweep)
LIST(APPEND TOOLS_LINK_LIBS m fftw3f)
endif() endif()
SET(TOOLS SET(TOOLS
@ -41,7 +44,6 @@ SET(TOOLS
hackrf_cpldjtag hackrf_cpldjtag
hackrf_info hackrf_info
hackrf_operacake hackrf_operacake
hackrf_sweep
) )
if(NOT libhackrf_SOURCE_DIR) if(NOT libhackrf_SOURCE_DIR)
@ -55,8 +57,6 @@ if(MSVC)
LIST(APPEND TOOLS_LINK_LIBS libgetopt_static) LIST(APPEND TOOLS_LINK_LIBS libgetopt_static)
endif() endif()
LIST(APPEND TOOLS_LINK_LIBS m fftw3f)
foreach(tool ${TOOLS}) foreach(tool ${TOOLS})
add_executable(${tool} ${tool}.c) add_executable(${tool} ${tool}.c)
target_link_libraries(${tool} ${TOOLS_LINK_LIBS}) target_link_libraries(${tool} ${TOOLS_LINK_LIBS})

View File

@ -379,26 +379,28 @@ int rx_callback(hackrf_transfer* transfer) {
} }
} }
if (stream_size>0){ if (stream_size>0){
if ((stream_size-1+stream_head-stream_tail)%stream_size <bytes_to_write){ #ifndef _WIN32
stream_drop++; if ((stream_size-1+stream_head-stream_tail)%stream_size <bytes_to_write) {
}else{ stream_drop++;
if(stream_tail+bytes_to_write <= stream_size){ } else {
memcpy(stream_buf+stream_tail,transfer->buffer,bytes_to_write); if(stream_tail+bytes_to_write <= stream_size) {
}else{ memcpy(stream_buf+stream_tail,transfer->buffer,bytes_to_write);
memcpy(stream_buf+stream_tail,transfer->buffer,(stream_size-stream_tail)); } else {
memcpy(stream_buf,transfer->buffer+(stream_size-stream_tail),bytes_to_write-(stream_size-stream_tail)); memcpy(stream_buf+stream_tail,transfer->buffer,(stream_size-stream_tail));
}; memcpy(stream_buf,transfer->buffer+(stream_size-stream_tail),bytes_to_write-(stream_size-stream_tail));
__atomic_store_n(&stream_tail,(stream_tail+bytes_to_write)%stream_size,__ATOMIC_RELEASE); };
__atomic_store_n(&stream_tail,(stream_tail+bytes_to_write)%stream_size,__ATOMIC_RELEASE);
} }
#endif
return 0; return 0;
}else{
bytes_written = fwrite(transfer->buffer, 1, bytes_to_write, fd);
if ((bytes_written != bytes_to_write)
|| (limit_num_samples && (bytes_to_xfer == 0))) {
return -1;
} else { } else {
return 0; bytes_written = fwrite(transfer->buffer, 1, bytes_to_write, fd);
} if ((bytes_written != bytes_to_write)
|| (limit_num_samples && (bytes_to_xfer == 0))) {
return -1;
} else {
return 0;
}
} }
} else { } else {
return -1; return -1;
@ -490,7 +492,10 @@ static void usage() {
printf("\t[-s sample_rate_hz] # Sample rate in Hz (4/8/10/12.5/16/20MHz, default %sMHz).\n", printf("\t[-s sample_rate_hz] # Sample rate in Hz (4/8/10/12.5/16/20MHz, default %sMHz).\n",
u64toa((DEFAULT_SAMPLE_RATE_HZ/FREQ_ONE_MHZ),&ascii_u64_data1)); u64toa((DEFAULT_SAMPLE_RATE_HZ/FREQ_ONE_MHZ),&ascii_u64_data1));
printf("\t[-n num_samples] # Number of samples to transfer (default is unlimited).\n"); printf("\t[-n num_samples] # Number of samples to transfer (default is unlimited).\n");
#ifndef _WIN32
/* The required atomic load/store functions aren't available when using C with MSVC */
printf("\t[-S buf_size] # Enable receive streaming with buffer size buf_size.\n"); printf("\t[-S buf_size] # Enable receive streaming with buffer size buf_size.\n");
#endif
printf("\t[-c amplitude] # CW signal source mode, amplitude 0-127 (DC value to DAC).\n"); printf("\t[-c amplitude] # CW signal source mode, amplitude 0-127 (DC value to DAC).\n");
printf("\t[-R] # Repeat TX mode (default is off) \n"); printf("\t[-R] # Repeat TX mode (default is off) \n");
printf("\t[-b baseband_filter_bw_hz] # Set baseband filter bandwidth in Hz.\n\tPossible values: 1.75/2.5/3.5/5/5.5/6/7/8/9/10/12/14/15/20/24/28MHz, default < sample_rate_hz.\n" ); printf("\t[-b baseband_filter_bw_hz] # Set baseband filter bandwidth in Hz.\n\tPossible values: 1.75/2.5/3.5/5/5.5/6/7/8/9/10/12/14/15/20/24/28MHz, default < sample_rate_hz.\n" );
@ -1041,48 +1046,49 @@ int main(int argc, char** argv) {
uint32_t byte_count_now; uint32_t byte_count_now;
struct timeval time_now; struct timeval time_now;
float time_difference, rate; float time_difference, rate;
if (stream_size>0){ if (stream_size>0) {
if(stream_head==stream_tail){ #ifndef _WIN32
usleep(10000); // queue empty if(stream_head==stream_tail) {
}else{ usleep(10000); // queue empty
ssize_t len; } else {
ssize_t bytes_written; ssize_t len;
uint32_t _st= __atomic_load_n(&stream_tail,__ATOMIC_ACQUIRE); ssize_t bytes_written;
if(stream_head<_st) uint32_t _st= __atomic_load_n(&stream_tail,__ATOMIC_ACQUIRE);
len=_st-stream_head; if(stream_head<_st)
else len=_st-stream_head;
len=stream_size-stream_head; else
bytes_written = fwrite(stream_buf+stream_head, 1, len, fd); len=stream_size-stream_head;
if (len != bytes_written){ bytes_written = fwrite(stream_buf+stream_head, 1, len, fd);
printf("write failed"); if (len != bytes_written) {
do_exit=true; printf("write failed");
}; do_exit=true;
stream_head=(stream_head+len)%stream_size; };
stream_head=(stream_head+len)%stream_size;
} }
if(stream_drop>0){ if(stream_drop>0) {
uint32_t drops= __atomic_exchange_n (&stream_drop,0,__ATOMIC_SEQ_CST); uint32_t drops= __atomic_exchange_n (&stream_drop,0,__ATOMIC_SEQ_CST);
printf("dropped frames: [%d]\n",drops); printf("dropped frames: [%d]\n",drops);
} }
}else{ #endif
sleep(1); } else {
sleep(1);
gettimeofday(&time_now, NULL); gettimeofday(&time_now, NULL);
byte_count_now = byte_count; byte_count_now = byte_count;
byte_count = 0; byte_count = 0;
time_difference = TimevalDiff(&time_now, &time_start); time_difference = TimevalDiff(&time_now, &time_start);
rate = (float)byte_count_now / time_difference; rate = (float)byte_count_now / time_difference;
fprintf(stderr, "%4.1f MiB / %5.3f sec = %4.1f MiB/second\n", fprintf(stderr, "%4.1f MiB / %5.3f sec = %4.1f MiB/second\n",
(byte_count_now / 1e6f), time_difference, (rate / 1e6f) ); (byte_count_now / 1e6f), time_difference, (rate / 1e6f) );
time_start = time_now; time_start = time_now;
if (byte_count_now == 0) { if (byte_count_now == 0) {
exit_code = EXIT_FAILURE; exit_code = EXIT_FAILURE;
fprintf(stderr, "\nCouldn't transfer any bytes for one second.\n"); fprintf(stderr, "\nCouldn't transfer any bytes for one second.\n");
break; break;
} }
} }
} }

View File

@ -26,6 +26,11 @@ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSI
#include <stdlib.h> #include <stdlib.h>
#include <libusb.h> #include <libusb.h>
#ifdef _WIN32
/* Avoid redefinition of timespec from time.h (included by libusb.h) */
#define HAVE_STRUCT_TIMESPEC 1
#endif
#include <pthread.h> #include <pthread.h>
#ifndef bool #ifndef bool
@ -396,7 +401,7 @@ hackrf_device_list_t* ADDCALL hackrf_device_list()
serial_number_length = libusb_get_string_descriptor_ascii(usb_device, serial_descriptor_index, (unsigned char*)serial_number, sizeof(serial_number)); serial_number_length = libusb_get_string_descriptor_ascii(usb_device, serial_descriptor_index, (unsigned char*)serial_number, sizeof(serial_number));
if( serial_number_length == 32 ) { if( serial_number_length == 32 ) {
serial_number[32] = 0; serial_number[32] = 0;
list->serial_numbers[idx] = strndup(serial_number, serial_number_length); list->serial_numbers[idx] = strdup(serial_number);
} }
libusb_close(usb_device); libusb_close(usb_device);

View File

@ -216,8 +216,8 @@ extern ADDAPI int ADDCALL hackrf_init_sweep(hackrf_device* device,
int length, uint32_t dwell_time); int length, uint32_t dwell_time);
/* Operacake functions */ /* Operacake functions */
int ADDCALL hackrf_get_operacake_boards(hackrf_device* device, uint8_t* boards); extern ADDAPI int ADDCALL hackrf_get_operacake_boards(hackrf_device* device, uint8_t* boards);
int ADDCALL hackrf_set_operacake_ports(hackrf_device* device, extern ADDAPI int ADDCALL hackrf_set_operacake_ports(hackrf_device* device,
uint8_t address, uint8_t address,
uint8_t port_a, uint8_t port_a,
uint8_t port_b); uint8_t port_b);