1 // TankProperties.cxx -- expose (fuel)-tank properties
3 // Written by Torsten Dreyer, started January 2011.
5 // Copyright (C) 2011 Torsten Dreyer - Torsten (at) t3r _dot_ de
7 // This program is free software; you can redistribute it and/or
8 // modify it under the terms of the GNU General Public License as
9 // published by the Free Software Foundation; either version 2 of the
10 // License, or (at your option) any later version.
12 // This program is distributed in the hope that it will be useful, but
13 // WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 // General Public License for more details.
17 // You should have received a copy of the GNU General Public License
18 // along with this program; if not, write to the Free Software
19 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
26 #include "TankProperties.hxx"
28 #include <simgear/math/SGMath.hxx>
29 #include <Main/fg_props.hxx>
31 static const double LBS_PER_KG = 2.20462262;
32 static const double KG_PER_LBS = 1.0/LBS_PER_KG;
33 static const double USGAL_PER_M3 = 1000.0/3.785411784;
34 static const double M3_PER_USGAL = 1.0/USGAL_PER_M3;
35 static const double IMPGAL_PER_M3 = 1000.0/4.54609;
36 static const double M3_PER_IMPGAL = 1.0/IMPGAL_PER_M3;
38 TankProperties::TankProperties(SGPropertyNode_ptr rootNode ) :
40 _density_kgpm3(755.0), // avg. AVGAS density (more or less)
43 _tiedProperties.setRoot( rootNode );
44 _tiedProperties.Tie("level-kg", this, &TankProperties::getContent_kg, &TankProperties::setContent_kg );
45 _tiedProperties.Tie("density-kgpm3", this, &TankProperties::getDensity_kgpm3, &TankProperties::setDensity_kgpm3 );
46 _tiedProperties.Tie("capacity-m3", this, &TankProperties::getCapacity_m3, &TankProperties::setCapacity_m3 );
47 _tiedProperties.Tie("level-m3", this, &TankProperties::getContent_m3, &TankProperties::setContent_m3 );
48 _tiedProperties.Tie("level-norm", this, &TankProperties::getContent_norm, &TankProperties::setContent_norm );
50 _tiedProperties.Tie("density-ppg", this, &TankProperties::getDensity_ppg, &TankProperties::setDensity_ppg );
51 _tiedProperties.Tie("level-lbs", this, &TankProperties::getContent_lbs, &TankProperties::setContent_lbs );
52 _tiedProperties.Tie("level-gal_us", this, &TankProperties::getContent_gal_us, &TankProperties::setContent_gal_us );
53 _tiedProperties.Tie("level-gal_imp", this, &TankProperties::getContent_gal_imp, &TankProperties::setContent_gal_imp );
54 _tiedProperties.Tie("capacity-gal_us", this, &TankProperties::getCapacity_gal_us, &TankProperties::setCapacity_gal_us );
55 _tiedProperties.Tie("capacity-gal_imp", this, &TankProperties::getCapacity_gal_imp, &TankProperties::setCapacity_gal_imp );
58 TankProperties::~TankProperties()
62 double TankProperties::getContent_kg() const
67 void TankProperties::setContent_kg( double value )
72 double TankProperties::getDensity_kgpm3() const
74 return _density_kgpm3;
77 void TankProperties::setDensity_kgpm3( double value )
79 _density_kgpm3 = value;
82 double TankProperties::getDensity_ppg() const
84 return _density_kgpm3 * LBS_PER_KG / USGAL_PER_M3;
87 void TankProperties::setDensity_ppg( double value )
89 _density_kgpm3 = value * KG_PER_LBS / M3_PER_USGAL;
92 double TankProperties::getContent_lbs() const
94 return _content_kg * LBS_PER_KG;
97 void TankProperties::setContent_lbs( double value )
99 _content_kg = value * KG_PER_LBS;
102 double TankProperties::getContent_m3() const
104 return _density_kgpm3 > SGLimitsd::min() ? _content_kg / _density_kgpm3 : 0.0;
107 void TankProperties::setContent_m3( double value )
109 _content_kg = value * _density_kgpm3;
112 double TankProperties::getContent_gal_us() const
114 return getContent_m3() * USGAL_PER_M3;
117 void TankProperties::setContent_gal_us( double value )
119 setContent_m3( value * M3_PER_USGAL );
122 double TankProperties::getContent_gal_imp() const
124 return getContent_m3() * IMPGAL_PER_M3;
127 void TankProperties::setContent_gal_imp( double value )
129 setContent_m3( value * M3_PER_IMPGAL );
132 double TankProperties::getCapacity_m3() const
137 void TankProperties::setCapacity_m3( double value )
139 _capacity_m3 = value;
142 double TankProperties::getCapacity_gal_us() const
144 return _capacity_m3 * USGAL_PER_M3;
147 void TankProperties::setCapacity_gal_us( double value )
149 _capacity_m3 = value * M3_PER_USGAL;
152 double TankProperties::getCapacity_gal_imp() const
154 return _capacity_m3 * IMPGAL_PER_M3;
157 void TankProperties::setCapacity_gal_imp( double value )
159 _capacity_m3 = value * M3_PER_IMPGAL;
162 double TankProperties::getContent_norm() const
164 return _capacity_m3 > SGLimitsd::min() ? getContent_m3() / _capacity_m3 : 0.0;
167 void TankProperties::setContent_norm( double value )
169 setContent_m3(_capacity_m3 * value);
172 TankPropertiesList::TankPropertiesList( SGPropertyNode_ptr rootNode )
174 // we don't have a global rule how many tanks we support, so I assume eight.
175 // Because hard coded values suck, make it settable by a property
176 size_type n = rootNode->getIntValue( "numtanks", 8 );
177 for( size_type i = 0; i < n; i++ ) {
178 push_back( new TankProperties( rootNode->getChild( "tank", i, true ) ) );
181 _tiedProperties.setRoot( rootNode );
182 _tiedProperties.Tie("total-fuel-kg", this, &TankPropertiesList::getTotalContent_kg );
183 _tiedProperties.Tie("total-fuel-lbs", this, &TankPropertiesList::getTotalContent_lbs );
184 _tiedProperties.Tie("total-fuel-gal_us", this, &TankPropertiesList::getTotalContent_gal_us );
185 _tiedProperties.Tie("total-fuel-gals", this, &TankPropertiesList::getTotalContent_gal_us );
186 _tiedProperties.Tie("total-fuel-gal_imp", this, &TankPropertiesList::getTotalContent_gal_imp );
187 _tiedProperties.Tie("total-fuel-norm", this, &TankPropertiesList::getTotalContent_norm );
190 double TankPropertiesList::getTotalContent_lbs() const
193 for( const_iterator it = begin(); it != end(); ++it )
194 value += (*it)->getContent_lbs();
198 double TankPropertiesList::getTotalContent_kg() const
201 for( const_iterator it = begin(); it != end(); ++it )
202 value += (*it)->getContent_kg();
206 double TankPropertiesList::getTotalContent_gal_us() const
209 for( const_iterator it = begin(); it != end(); ++it )
210 value += (*it)->getContent_gal_us();
214 double TankPropertiesList::getTotalContent_gal_imp() const
217 for( const_iterator it = begin(); it != end(); ++it )
218 value += (*it)->getContent_gal_imp();
222 double TankPropertiesList::getTotalContent_m3() const
225 for( const_iterator it = begin(); it != end(); ++it )
226 value += (*it)->getContent_m3();
230 double TankPropertiesList::getTotalContent_norm() const
232 double content = 0.0;
233 double capacity = 0.0;
234 for( const_iterator it = begin(); it != end(); ++it ) {
235 content += (*it)->getContent_m3();
236 capacity += (*it)->getCapacity_m3();
238 return capacity > SGLimitsd::min() ? content / capacity : 0.0;