add api for manual gain mode control

This commit is contained in:
Dimitri Stolnikov 2012-05-05 00:43:32 +02:00
parent f0ac70fa41
commit 3a47e3661c
14 changed files with 239 additions and 62 deletions

View File

@ -1,6 +1,6 @@
<?xml version='1.0' encoding='ASCII'?>
<flow_graph>
<timestamp>Sat Apr 28 19:58:05 2012</timestamp>
<timestamp>Sat May 5 00:40:44 2012</timestamp>
<block>
<key>options</key>
<param>
@ -43,6 +43,10 @@
<key>run</key>
<value>True</value>
</param>
<param>
<key>max_nouts</key>
<value>0</value>
</param>
<param>
<key>realtime_scheduling</key>
<value></value>
@ -56,61 +60,6 @@
<value>0</value>
</param>
</block>
<block>
<key>variable_slider</key>
<param>
<key>id</key>
<value>gain</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>label</key>
<value></value>
</param>
<param>
<key>value</key>
<value>10</value>
</param>
<param>
<key>min</key>
<value>0</value>
</param>
<param>
<key>max</key>
<value>30</value>
</param>
<param>
<key>num_steps</key>
<value>31</value>
</param>
<param>
<key>style</key>
<value>wx.SL_HORIZONTAL</value>
</param>
<param>
<key>converver</key>
<value>float_converter</value>
</param>
<param>
<key>grid_pos</key>
<value></value>
</param>
<param>
<key>notebook</key>
<value></value>
</param>
<param>
<key>_coordinate</key>
<value>(472, 65)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
</block>
<block>
<key>variable</key>
<param>
@ -410,6 +359,57 @@
<value>0</value>
</param>
</block>
<block>
<key>variable_chooser</key>
<param>
<key>id</key>
<value>gain_chooser</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>label</key>
<value></value>
</param>
<param>
<key>value</key>
<value>9.0</value>
</param>
<param>
<key>choices</key>
<value>[-1.0, 1.5, 4.0, 6.5, 9.0, 11.5, 14.0, 16.5, 19.0, 21.5, 24.0, 29.0, 34.0, 42.0, 43.0, 45.0, 47.0, 49.0]</value>
</param>
<param>
<key>labels</key>
<value>[]</value>
</param>
<param>
<key>type</key>
<value>drop_down</value>
</param>
<param>
<key>style</key>
<value>wx.RA_HORIZONTAL</value>
</param>
<param>
<key>grid_pos</key>
<value></value>
</param>
<param>
<key>notebook</key>
<value></value>
</param>
<param>
<key>_coordinate</key>
<value>(461, 63)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
</block>
<block>
<key>osmosdr_source_c</key>
<param>
@ -446,7 +446,11 @@
</param>
<param>
<key>gain0</key>
<value>gain</value>
<value>gain_chooser</value>
</param>
<param>
<key>gain_mode0</key>
<value>1</value>
</param>
<param>
<key>ant0</key>
@ -462,7 +466,11 @@
</param>
<param>
<key>gain1</key>
<value>gain</value>
<value>gain_chooser</value>
</param>
<param>
<key>gain_mode1</key>
<value>0</value>
</param>
<param>
<key>ant1</key>
@ -480,6 +488,10 @@
<key>gain2</key>
<value>0</value>
</param>
<param>
<key>gain_mode2</key>
<value>0</value>
</param>
<param>
<key>ant2</key>
<value></value>
@ -496,6 +508,10 @@
<key>gain3</key>
<value>0</value>
</param>
<param>
<key>gain_mode3</key>
<value>0</value>
</param>
<param>
<key>ant3</key>
<value></value>
@ -512,6 +528,10 @@
<key>gain4</key>
<value>0</value>
</param>
<param>
<key>gain_mode4</key>
<value>0</value>
</param>
<param>
<key>ant4</key>
<value></value>

View File

@ -32,6 +32,7 @@ self.\$(id).set_sample_rate(\$sample_rate)
self.\$(id).set_center_freq(\$freq$(n), $n)
self.\$(id).set_freq_corr(\$corr$(n), $n)
self.\$(id).set_gain(\$gain$(n), $n)
self.\$(id).set_gain_mode(\$gain_mode$(n), $n)
\#if \$ant$(n)()
self.\$(id).set_antenna(\$ant$(n), $n)
\#end if
@ -43,6 +44,7 @@ self.\$(id).set_antenna(\$ant$(n), $n)
<callback>set_center_freq(\$freq$(n), $n)</callback>
<callback>set_freq_corr(\$corr$(n), $n)</callback>
<callback>set_gain(\$gain$(n), $n)</callback>
<callback>set_gain_mode(\$gain_mode$(n), $n)</callback>
<callback>set_antenna(\$ant$(n), $n)</callback>
#end for
<param>
@ -125,7 +127,11 @@ Freq. Corr.:
The frequency correction factor in parts per million (ppm). Leave 0 if unknown.
Gain:
Overall gain of the device's signal path.
Overall gain of the device's signal path. For the gain setting to apply the
manual gain mode must be enabled first for some devices (namely rtlsdr).
Gain Mode:
Chooses between the automatic (default) and manual gain mode where appropriate.
Antenna:
For devices with only one antenna, this may be left blank.
@ -159,6 +165,21 @@ PARAMS_TMPL = """
<type>real</type>
<hide>\#if \$nchan() > $n then 'none' else 'all'#</hide>
</param>
<param>
<name>Ch$(n): Gain Mode</name>
<key>gain_mode$(n)</key>
<value></value>
<type>enum</type>
<hide>\#if \$nchan() > $n then 'none' else 'all'#</hide>
<option>
<name>Auto</name>
<key>0</key>
</option>
<option>
<name>Manual</name>
<key>1</key>
</option>
</param>
<param>
<name>Ch$(n): Antenna</name>
<key>ant$(n)</key>

View File

@ -145,6 +145,22 @@ public:
virtual osmosdr::gain_range_t get_gain_range( const std::string & name,
size_t chan = 0 ) = 0;
/*!
* Set the gain mode for the underlying radio hardware.
* This might be supported only for certain hardware types.
* \param mode the gain mode (true means manual gain mode)
* \param chan the channel index 0 to N-1
* \return the actual gain mode
*/
virtual bool set_gain_mode( bool mode, size_t chan = 0 ) = 0;
/*!
* Get the gain mode selected for the underlying radio hardware.
* \param chan the channel index 0 to N-1
* \return the actual gain mode
*/
virtual bool get_gain_mode( size_t chan = 0 ) = 0;
/*!
* Set the gain for the underlying radio hardware.
* This function will automatically distribute the desired gain value over

View File

@ -186,6 +186,16 @@ osmosdr::gain_range_t fcd_source::get_gain_range( const std::string & name, size
return get_gain_range( chan );
}
bool fcd_source::set_gain_mode( bool mode, size_t chan )
{
return get_gain_mode(chan);
}
bool fcd_source::get_gain_mode( size_t chan )
{
return true;
}
double fcd_source::set_gain( double gain, size_t chan )
{
_src->set_lna_gain(gain);

View File

@ -65,6 +65,8 @@ public:
std::vector<std::string> get_gain_names( size_t chan = 0 );
osmosdr::gain_range_t get_gain_range( size_t chan = 0 );
osmosdr::gain_range_t get_gain_range( const std::string & name, size_t chan = 0 );
bool set_gain_mode( bool mode, size_t chan = 0 );
bool get_gain_mode( size_t chan = 0 );
double set_gain( double gain, size_t chan = 0 );
double set_gain( double gain, const std::string & name, size_t chan = 0 );
double get_gain( size_t chan = 0 );

View File

@ -172,6 +172,16 @@ osmosdr::gain_range_t file_source_c::get_gain_range( const std::string & name, s
return get_gain_range( chan );
}
bool file_source_c::set_gain_mode( bool mode, size_t chan )
{
return get_gain_mode(chan);
}
bool file_source_c::get_gain_mode( size_t chan )
{
return true;
}
double file_source_c::set_gain( double gain, size_t chan )
{
return get_gain(chan);

View File

@ -61,6 +61,8 @@ public:
std::vector<std::string> get_gain_names( size_t chan = 0 );
osmosdr::gain_range_t get_gain_range( size_t chan = 0 );
osmosdr::gain_range_t get_gain_range( const std::string & name, size_t chan = 0 );
bool set_gain_mode( bool mode, size_t chan = 0 );
bool get_gain_mode( size_t chan = 0 );
double set_gain( double gain, size_t chan = 0 );
double set_gain( double gain, const std::string & name, size_t chan = 0 );
double get_gain( size_t chan = 0 );

View File

@ -249,6 +249,28 @@ osmosdr::gain_range_t osmosdr_source_c_impl::get_gain_range( const std::string &
return osmosdr::gain_range_t();
}
bool osmosdr_source_c_impl::set_gain_mode( bool mode, size_t chan )
{
size_t channel = 0;
BOOST_FOREACH( osmosdr_src_iface *dev, _srcs )
for (size_t i = 0; i < dev->get_num_channels(); i++)
if ( chan == channel++ )
return _srcs[chan]->set_gain_mode( mode, chan );
return false;
}
bool osmosdr_source_c_impl::get_gain_mode( size_t chan )
{
size_t channel = 0;
BOOST_FOREACH( osmosdr_src_iface *dev, _srcs )
for (size_t i = 0; i < dev->get_num_channels(); i++)
if ( chan == channel++ )
return _srcs[chan]->get_gain_mode( chan );
return false;
}
double osmosdr_source_c_impl::set_gain( double gain, size_t chan )
{
size_t channel = 0;

View File

@ -43,6 +43,8 @@ public:
std::vector<std::string> get_gain_names( size_t chan = 0 );
osmosdr::gain_range_t get_gain_range( size_t chan = 0 );
osmosdr::gain_range_t get_gain_range( const std::string & name, size_t chan = 0 );
bool set_gain_mode( bool mode, size_t chan = 0 );
bool get_gain_mode( size_t chan = 0 );
double set_gain( double gain, size_t chan = 0 );
double set_gain( double gain, const std::string & name, size_t chan = 0 );
double get_gain( size_t chan = 0 );

View File

@ -123,6 +123,22 @@ public:
virtual osmosdr::gain_range_t get_gain_range( const std::string & name,
size_t chan = 0 ) = 0;
/*!
* Set the gain mode for the underlying radio hardware.
* This might be supported only for certain hardware types.
* \param mode the gain mode (true means manual gain mode)
* \param chan the channel index 0 to N-1
* \return the actual gain mode
*/
virtual bool set_gain_mode( bool mode, size_t chan = 0 ) = 0;
/*!
* Get the gain mode selected for the underlying radio hardware.
* \param chan the channel index 0 to N-1
* \return the actual gain mode
*/
virtual bool get_gain_mode( size_t chan = 0 ) = 0;
/*!
* Set the gain for the underlying radio hardware.
* This function will automatically distribute the desired gain value over

View File

@ -145,6 +145,8 @@ rtl_source_c::rtl_source_c (const std::string &args)
_running = true;
_manual_gain = false;
_thread = gruel::thread(_rtlsdr_wait, this);
}
@ -278,7 +280,12 @@ osmosdr::meta_range_t rtl_source_c::get_sample_rates()
osmosdr::meta_range_t range;
range += osmosdr::range_t( 1024000 ); // known to work
range += osmosdr::range_t( 1800000 ); // known to work
range += osmosdr::range_t( 2048000 ); // known to work
range += osmosdr::range_t( 2400000 ); // may work
range += osmosdr::range_t( 2600000 ); // may work
range += osmosdr::range_t( 2800000 ); // may work
range += osmosdr::range_t( 3000000 ); // may work
range += osmosdr::range_t( 3200000 ); // max rate, may work
// TODO: read from the librtlsdr as soon as the api is available
@ -359,7 +366,24 @@ osmosdr::gain_range_t rtl_source_c::get_gain_range( size_t chan )
{
osmosdr::gain_range_t range;
range += osmosdr::range_t( -5, 30, 2.5 );
range += osmosdr::range_t( -1.0 );
range += osmosdr::range_t( 1.5 );
range += osmosdr::range_t( 4.0 );
range += osmosdr::range_t( 6.5 );
range += osmosdr::range_t( 9.0 );
range += osmosdr::range_t( 11.5 );
range += osmosdr::range_t( 14.0 );
range += osmosdr::range_t( 16.5 );
range += osmosdr::range_t( 19.0 );
range += osmosdr::range_t( 21.5 );
range += osmosdr::range_t( 24.0 );
range += osmosdr::range_t( 29.0 );
range += osmosdr::range_t( 34.0 );
range += osmosdr::range_t( 42.0 );
range += osmosdr::range_t( 43.0 );
range += osmosdr::range_t( 45.0 );
range += osmosdr::range_t( 47.0 );
range += osmosdr::range_t( 49.0 );
// TODO: read from the librtlsdr as soon as the api is available
@ -371,10 +395,26 @@ osmosdr::gain_range_t rtl_source_c::get_gain_range( const std::string & name, si
return get_gain_range( chan );
}
bool rtl_source_c::set_gain_mode( bool mode, size_t chan )
{
if (_dev) {
if (!rtlsdr_set_tuner_gain_mode(_dev, int(mode))) {
_manual_gain = mode;
}
}
return get_gain_mode(chan);
}
bool rtl_source_c::get_gain_mode( size_t chan )
{
return _manual_gain;
}
double rtl_source_c::set_gain( double gain, size_t chan )
{
if (_dev)
rtlsdr_set_tuner_gain( _dev, gain );
rtlsdr_set_tuner_gain( _dev, int(gain * 10.0) );
return get_gain( chan );
}
@ -387,7 +427,7 @@ double rtl_source_c::set_gain( double gain, const std::string & name, size_t cha
double rtl_source_c::get_gain( size_t chan )
{
if ( _dev )
return (double)rtlsdr_get_tuner_gain( _dev );
return ((double)rtlsdr_get_tuner_gain( _dev )) / 10.0;
return 0;
}

View File

@ -98,6 +98,8 @@ public:
std::vector<std::string> get_gain_names( size_t chan = 0 );
osmosdr::gain_range_t get_gain_range( size_t chan = 0 );
osmosdr::gain_range_t get_gain_range( const std::string & name, size_t chan = 0 );
bool set_gain_mode( bool mode, size_t chan = 0 );
bool get_gain_mode( size_t chan = 0 );
double set_gain( double gain, size_t chan = 0 );
double set_gain( double gain, const std::string & name, size_t chan = 0 );
double get_gain( size_t chan = 0 );
@ -127,6 +129,8 @@ private:
unsigned int _buf_offset;
unsigned int _samp_avail;
bool _manual_gain;
};
#endif /* INCLUDED_RTLSDR_SOURCE_C_H */

View File

@ -175,6 +175,16 @@ osmosdr::gain_range_t uhd_source_c::get_gain_range( const std::string & name, si
return range;
}
bool uhd_source_c::set_gain_mode( bool mode, size_t chan )
{
return get_gain_mode(chan);
}
bool uhd_source_c::get_gain_mode( size_t chan )
{
return true;
}
double uhd_source_c::set_gain( double gain, size_t chan )
{
_src->set_gain(gain, chan);

View File

@ -65,6 +65,8 @@ public:
std::vector<std::string> get_gain_names( size_t chan = 0 );
osmosdr::gain_range_t get_gain_range( size_t chan = 0 );
osmosdr::gain_range_t get_gain_range( const std::string & name, size_t chan = 0 );
bool set_gain_mode( bool mode, size_t chan = 0 );
bool get_gain_mode( size_t chan = 0 );
double set_gain( double gain, size_t chan = 0 );
double set_gain( double gain, const std::string & name, size_t chan = 0 );
double get_gain( size_t chan = 0 );