]> git.mxchange.org Git - flightgear.git/blob - src/Instrumentation/frequencyformatter.hxx
Handle libCurl linkage when enabled in SimGear
[flightgear.git] / src / Instrumentation / frequencyformatter.hxx
1 #ifndef __FREQUENCY_FORMATTER_HXX
2 #define __FREQUENCY_FORMATTER_HXX
3
4 /* ------------- A NAV/COMM Frequency formatter ---------------------- */
5 class FrequencyFormatterBase : public SGReferenced {
6 public:
7           virtual ~FrequencyFormatterBase()
8           {
9           }
10
11           virtual double getFrequency() const = 0;
12
13 };
14
15 class FrequencyFormatter : public FrequencyFormatterBase, public SGPropertyChangeListener {
16 public:
17   FrequencyFormatter( SGPropertyNode_ptr freqNode, SGPropertyNode_ptr fmtFreqNode, double channelSpacing, double min, double max ) :
18     _freqNode( freqNode ),
19     _fmtFreqNode( fmtFreqNode ),
20     _channelSpacing(channelSpacing),
21     _min(min),
22     _max(max)
23   {
24     _freqNode->addChangeListener( this, true );
25   }
26   virtual ~FrequencyFormatter()
27   {
28     _freqNode->removeChangeListener( this );
29   }
30
31   void valueChanged (SGPropertyNode * prop)
32   {
33     // format as fixed decimal "nnn.nn"
34     std::ostringstream buf;
35     buf << std::fixed 
36         << std::setw(5) 
37         << std::setfill('0') 
38         << std::setprecision(2)
39         << getFrequency();
40     _fmtFreqNode->setStringValue( buf.str() );
41   }
42
43   virtual double getFrequency() const
44   {
45     double d = SGMiscd::roundToInt(_freqNode->getDoubleValue() / _channelSpacing) * _channelSpacing;
46     // strip last digit, do not round
47     double f = ((int)(d*100))/100.0;
48     if( f < _min ) return _min;
49     if( f >= _max ) return _max;
50     return f;
51   }
52
53 private:
54   SGPropertyNode_ptr _freqNode;
55   SGPropertyNode_ptr _fmtFreqNode;
56   double _channelSpacing;
57   double _min;
58   double _max;
59 };
60
61
62 #endif //__FREQUENCY_FORMATTER_HXX