From 2d78b27ff709a4ca329da875d222d3f80cb306d1 Mon Sep 17 00:00:00 2001 From: Paulo-D2000 Date: Fri, 8 Dec 2023 12:15:20 -0300 Subject: [PATCH] CW TX working with SoapySDR API / Fixed Wrong streamWrite function overload --- .../src/soapy_api/Cariboulite.hpp | 9 ++++---- .../src/soapy_api/CaribouliteStream.cpp | 7 ++++--- .../soapy_api/CaribouliteStreamFunctions.cpp | 21 +++++++++++++++++-- 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/software/libcariboulite/src/soapy_api/Cariboulite.hpp b/software/libcariboulite/src/soapy_api/Cariboulite.hpp index a74baba..0704baa 100644 --- a/software/libcariboulite/src/soapy_api/Cariboulite.hpp +++ b/software/libcariboulite/src/soapy_api/Cariboulite.hpp @@ -83,13 +83,14 @@ public: int &flags, long long &timeNs, const long timeoutUs = 100000); - + + // writeStream signature is different from readStream!! int writeStream(SoapySDR::Stream *stream, - void * const *buffs, + const void * const *buffs, // const first! const size_t numElems, int &flags, - long long &timeNs, - const long timeoutUs); + const long long timeNs = 0, // const first, don't pass as reference ! + const long timeoutUs = 100000); // default value ? /******************************************************************* * Antenna API diff --git a/software/libcariboulite/src/soapy_api/CaribouliteStream.cpp b/software/libcariboulite/src/soapy_api/CaribouliteStream.cpp index 3f9d1cf..30508b3 100644 --- a/software/libcariboulite/src/soapy_api/CaribouliteStream.cpp +++ b/software/libcariboulite/src/soapy_api/CaribouliteStream.cpp @@ -7,7 +7,8 @@ #define NUM_BYTES_PER_CPLX_ELEM ( sizeof(cariboulite_sample_complex_int16) ) #define NUM_NATIVE_MTUS_PER_QUEUE ( 10 ) -#define USE_ASYNC ( 1 ) +// Undefine to also use TX +//#define USE_ASYNC ( 1 ) #define USE_ASYNC_OVERRIDE_WRITES ( true ) #define USE_ASYNC_BLOCK_READS ( true ) @@ -260,8 +261,8 @@ int SoapySDR::Stream::Read(cariboulite_sample_complex_int16 *buffer, size_t num_ { #if USE_ASYNC return rx_queue->get(buffer, num_samples, timeout_us); - #else - int ret = cariboulite_radio_read_samples(radio, buffer, (caribou_smi_sample_meta*)meta, num_samples); + #else // caribou_smi_sample_meta not defined... + int ret = cariboulite_radio_read_samples(radio, buffer, (cariboulite_sample_meta*)meta, num_samples); if (ret < 0) { if (ret == -1) diff --git a/software/libcariboulite/src/soapy_api/CaribouliteStreamFunctions.cpp b/software/libcariboulite/src/soapy_api/CaribouliteStreamFunctions.cpp index 5092bc1..d4faa1a 100644 --- a/software/libcariboulite/src/soapy_api/CaribouliteStreamFunctions.cpp +++ b/software/libcariboulite/src/soapy_api/CaribouliteStreamFunctions.cpp @@ -116,7 +116,24 @@ SoapySDR::Stream *Cariboulite::setupStream(const int direction, stream->setInnerStreamType(direction == SOAPY_SDR_TX ? cariboulite_channel_dir_tx : cariboulite_channel_dir_rx); + // Default: CW Output -> OFF cariboulite_radio_set_cw_outputs(radio, false, false); + + // Check if args has CW Output -> ON/OFF + for(auto it = args.cbegin(); it != args.cend(); ++it) + { + if(!it->first.compare("CW") && !it->second.compare("1")) // "CW=1" + { // SET CW ON + SoapySDR_logf(SOAPY_SDR_INFO, "CW Output: ON\n"); + cariboulite_radio_set_cw_outputs(radio, false, true); + } + else if(!it->first.compare("CW") && !it->second.compare("0")) // "CW=0" + { // SET CW OFF + SoapySDR_logf(SOAPY_SDR_INFO, "CW Output: OFF\n"); + cariboulite_radio_set_cw_outputs(radio, false, false); + } + } + cariboulite_radio_activate_channel(radio, stream->getInnerStreamType(), false); return stream; } @@ -258,10 +275,10 @@ int Cariboulite::readStream( */ int Cariboulite::writeStream( SoapySDR::Stream *stream, - void * const *buffs, + const void * const *buffs, // const void* !! const size_t numElems, int &flags, - long long &timeNs, + const long long timeNs, // const long long !! const long timeoutUs) { // Verify that it is an TX stream