diff --git a/lib/bladerf/bladerf_common.cc b/lib/bladerf/bladerf_common.cc index da57e0e..094de3e 100644 --- a/lib/bladerf/bladerf_common.cc +++ b/lib/bladerf/bladerf_common.cc @@ -51,7 +51,8 @@ std::list > bladerf_common::_devs; bladerf_common::bladerf_common() : _conv_buf(NULL), _conv_buf_size(4096), - _xb_200_attached(false) + _xb_200_attached(false), + _consecutive_failures(0) { } diff --git a/lib/bladerf/bladerf_common.h b/lib/bladerf/bladerf_common.h index 3b1cb0b..f67600f 100644 --- a/lib/bladerf/bladerf_common.h +++ b/lib/bladerf/bladerf_common.h @@ -83,12 +83,15 @@ protected: std::string _pfx; bool _xb_200_attached; + unsigned int _consecutive_failures; /* BladeRF IQ correction parameters */ static const int16_t DCOFF_SCALE = 2048; static const int16_t GAIN_SCALE = 4096; static const int16_t PHASE_SCALE = 4096; + static const unsigned int MAX_CONSECUTIVE_FAILURES = 3; + private: bladerf_sptr open(const std::string &device_name); static void close(void *dev); /* called by shared_ptr */ diff --git a/lib/bladerf/bladerf_sink_c.cc b/lib/bladerf/bladerf_sink_c.cc index 4003235..4d26416 100644 --- a/lib/bladerf/bladerf_sink_c.cc +++ b/lib/bladerf/bladerf_sink_c.cc @@ -128,7 +128,17 @@ int bladerf_sink_c::work( int noutput_items, if ( ret != 0 ) { std::cerr << _pfx << "bladerf_sync_tx error: " << bladerf_strerror(ret) << std::endl; - return WORK_DONE; + + _consecutive_failures++; + + if ( _consecutive_failures >= MAX_CONSECUTIVE_FAILURES ) { + noutput_items = WORK_DONE; + std::cerr << _pfx + << "Consecutive error limit hit. Shutting down." + << std::endl; + } else { + _consecutive_failures = 0; + } } return noutput_items; diff --git a/lib/bladerf/bladerf_source_c.cc b/lib/bladerf/bladerf_source_c.cc index 4c698f1..c2fd15d 100644 --- a/lib/bladerf/bladerf_source_c.cc +++ b/lib/bladerf/bladerf_source_c.cc @@ -163,7 +163,17 @@ int bladerf_source_c::work( int noutput_items, if ( ret != 0 ) { std::cerr << _pfx << "bladerf_sync_rx error: " << bladerf_strerror(ret) << std::endl; - return WORK_DONE; + + _consecutive_failures++; + + if ( _consecutive_failures >= MAX_CONSECUTIVE_FAILURES ) { + std::cerr << _pfx + << "Consecutive error limit hit. Shutting down." + << std::endl; + return WORK_DONE; + } + } else { + _consecutive_failures = 0; } current = _conv_buf;