diff options
author | Dimitri Stolnikov <horiz0n@gmx.net> | 2012-07-18 21:24:57 +0200 |
---|---|---|
committer | Dimitri Stolnikov <horiz0n@gmx.net> | 2012-07-18 21:24:57 +0200 |
commit | 86ec5d3b7383b31a493ac0a122386abb56be5bb4 (patch) | |
tree | 2b8128722228ae8dab4d54677613d08e6c4450f0 /lib/osmosdr | |
parent | 0b5f48eb078cb5fedd4c675c30f9d966dd677abc (diff) |
add if gain setter API for rtl-sdr
and OsmoSDR devices
Observations lead to an useful gain
range from 15 to 30dB, a value of
24dB is used by default.
Diffstat (limited to 'lib/osmosdr')
-rw-r--r-- | lib/osmosdr/osmosdr_src_c.cc | 61 | ||||
-rw-r--r-- | lib/osmosdr/osmosdr_src_c.h | 2 |
2 files changed, 36 insertions, 27 deletions
diff --git a/lib/osmosdr/osmosdr_src_c.cc b/lib/osmosdr/osmosdr_src_c.cc index bba0550..68c4a27 100644 --- a/lib/osmosdr/osmosdr_src_c.cc +++ b/lib/osmosdr/osmosdr_src_c.cc @@ -131,6 +131,8 @@ osmosdr_src_c::osmosdr_src_c (const std::string &args) if (ret < 0) throw std::runtime_error("Failed to reset usb buffers."); + set_if_gain( 24 ); /* preset to a reasonable default (non-GRC use case) */ + _buf = (unsigned short **) malloc(_buf_num * sizeof(unsigned short *)); for(unsigned int i = 0; i < _buf_num; ++i) @@ -410,6 +412,34 @@ bool osmosdr_src_c::get_gain_mode( size_t chan ) double osmosdr_src_c::set_gain( double gain, size_t chan ) { osmosdr::gain_range_t rf_gains = osmosdr_src_c::get_gain_range( chan ); + + if (_dev) { + osmosdr_set_tuner_gain( _dev, int(rf_gains.clip(gain) * 10.0) ); + } + + return get_gain( chan ); +} + +double osmosdr_src_c::set_gain( double gain, const std::string & name, size_t chan) +{ + return set_gain( gain, chan ); +} + +double osmosdr_src_c::get_gain( size_t chan ) +{ + if ( _dev ) + return ((double)osmosdr_get_tuner_gain( _dev )) / 10.0; + + return 0; +} + +double osmosdr_src_c::get_gain( const std::string & name, size_t chan ) +{ + return get_gain( chan ); +} + +double osmosdr_src_c::set_if_gain(double gain, size_t chan) +{ std::vector< osmosdr::gain_range_t > if_gains; if_gains += osmosdr::gain_range_t(-3, 6, 9); @@ -419,9 +449,6 @@ double osmosdr_src_c::set_gain( double gain, size_t chan ) if_gains += osmosdr::gain_range_t(3, 15, 3); if_gains += osmosdr::gain_range_t(3, 15, 3); - double rf_gain = rf_gains.clip(gain); - double missing_gain = gain - rf_gain; - std::map< int, double > gains; /* initialize with min gains */ @@ -432,7 +459,7 @@ double osmosdr_src_c::set_gain( double gain, size_t chan ) for (int i = if_gains.size() - 1; i >= 0; i--) { osmosdr::gain_range_t range = if_gains[ i ]; - double error = missing_gain; + double error = gain; for( double g = range.start(); g <= range.stop(); g += range.step() ) { @@ -444,7 +471,7 @@ double osmosdr_src_c::set_gain( double gain, size_t chan ) sum += gains[ j + 1 ]; } - double err = abs(missing_gain - sum); + double err = abs(gain - sum); if (err < error) { error = err; gains[ i + 1 ] = g; @@ -452,7 +479,7 @@ double osmosdr_src_c::set_gain( double gain, size_t chan ) } } #if 0 - std::cerr << missing_gain << " => "; double sum = 0; + std::cerr << gain << " => "; double sum = 0; for (unsigned int i = 0; i < gains.size(); i++) { sum += gains[ i + 1 ]; std::cerr << gains[ i + 1 ] << " "; @@ -460,32 +487,12 @@ double osmosdr_src_c::set_gain( double gain, size_t chan ) std::cerr << " = " << sum << std::endl; #endif if (_dev) { - osmosdr_set_tuner_gain( _dev, int(rf_gain * 10.0) ); - for (unsigned int stage = 1; stage <= gains.size(); stage++) { osmosdr_set_tuner_if_gain( _dev, stage, int(gains[ stage ] * 10.0)); } } - return get_gain( chan ); -} - -double osmosdr_src_c::set_gain( double gain, const std::string & name, size_t chan) -{ - return set_gain( gain, chan ); -} - -double osmosdr_src_c::get_gain( size_t chan ) -{ - if ( _dev ) - return ((double)osmosdr_get_tuner_gain( _dev )) / 10.0; - - return 0; -} - -double osmosdr_src_c::get_gain( const std::string & name, size_t chan ) -{ - return get_gain( chan ); + return gain; } std::vector< std::string > osmosdr_src_c::get_antennas( size_t chan ) diff --git a/lib/osmosdr/osmosdr_src_c.h b/lib/osmosdr/osmosdr_src_c.h index 227ccae..9156454 100644 --- a/lib/osmosdr/osmosdr_src_c.h +++ b/lib/osmosdr/osmosdr_src_c.h @@ -105,6 +105,8 @@ private: double get_gain( size_t chan = 0 ); double get_gain( const std::string & name, size_t chan = 0 ); + double set_if_gain( double gain, size_t chan = 0 ); + std::vector< std::string > get_antennas( size_t chan = 0 ); std::string set_antenna( const std::string & antenna, size_t chan = 0 ); std::string get_antenna( size_t chan = 0 ); |