aboutsummaryrefslogtreecommitdiffstats
path: root/lib/osmosdr
diff options
context:
space:
mode:
authorDimitri Stolnikov <horiz0n@gmx.net>2012-07-18 21:24:57 +0200
committerDimitri Stolnikov <horiz0n@gmx.net>2012-07-18 21:24:57 +0200
commit86ec5d3b7383b31a493ac0a122386abb56be5bb4 (patch)
tree2b8128722228ae8dab4d54677613d08e6c4450f0 /lib/osmosdr
parent0b5f48eb078cb5fedd4c675c30f9d966dd677abc (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.cc61
-rw-r--r--lib/osmosdr/osmosdr_src_c.h2
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 );