Latest JSBSim changes, including some gear tweaking from Jon and some
fuel-reporting improvements for piston engines.
This commit is contained in:
parent
4be27ce2bf
commit
eedf9f9671
9 changed files with 87 additions and 112 deletions
|
@ -88,6 +88,9 @@ string FGConfigFile::GetNextConfigLine(void)
|
||||||
comment_length = comment_ends_at + 2 - comment_starts_at + 1;
|
comment_length = comment_ends_at + 2 - comment_starts_at + 1;
|
||||||
LineComment = CurrentLine.substr(comment_starts_at+4, comment_length-4-3);
|
LineComment = CurrentLine.substr(comment_starts_at+4, comment_length-4-3);
|
||||||
CurrentLine.erase(comment_starts_at, comment_length);
|
CurrentLine.erase(comment_starts_at, comment_length);
|
||||||
|
if (CurrentLine.find_first_not_of(" ") == string::npos) {
|
||||||
|
CurrentLine.erase();
|
||||||
|
}
|
||||||
} else if ( start_comment && !end_comment) { // <!-- ...
|
} else if ( start_comment && !end_comment) { // <!-- ...
|
||||||
CommentsOn = true;
|
CommentsOn = true;
|
||||||
comment_length = line_length - comment_starts_at;
|
comment_length = line_length - comment_starts_at;
|
||||||
|
@ -108,11 +111,12 @@ string FGConfigFile::GetNextConfigLine(void)
|
||||||
CommentString += CommentStringTemp + "\r\n";
|
CommentString += CommentStringTemp + "\r\n";
|
||||||
CurrentLine.erase(0, comment_length);
|
CurrentLine.erase(0, comment_length);
|
||||||
}
|
}
|
||||||
|
|
||||||
} while (CommentsOn);
|
} while (CommentsOn);
|
||||||
|
|
||||||
if (CurrentLine.length() == 0) GetNextConfigLine();
|
|
||||||
CurrentIndex = 0;
|
CurrentIndex = 0;
|
||||||
|
if (CurrentLine.length() == 0) {
|
||||||
|
GetNextConfigLine();
|
||||||
|
}
|
||||||
return CurrentLine;
|
return CurrentLine;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -65,28 +65,41 @@ CLASS IMPLEMENTATION
|
||||||
|
|
||||||
|
|
||||||
FGEngine::FGEngine(FGFDMExec* exec)
|
FGEngine::FGEngine(FGFDMExec* exec)
|
||||||
|
: Name(""),
|
||||||
|
Type(etUnknown),
|
||||||
|
X(0), Y(0), Z(0),
|
||||||
|
EnginePitch(0), EngineYaw(0),
|
||||||
|
SLFuelFlowMax(0), SLOxiFlowMax(0),
|
||||||
|
MaxThrottle(1.0), MinThrottle(0.0),
|
||||||
|
Thrust(0.0),
|
||||||
|
Throttle(0.0),
|
||||||
|
Mixture(1.0),
|
||||||
|
Magnetos(0),
|
||||||
|
Starter(false),
|
||||||
|
FuelNeed(0.0), OxidizerNeed(0.0),
|
||||||
|
Starved(false), Flameout(false), Running(false), Cranking(false),
|
||||||
|
PctPower(0.0),
|
||||||
|
EngineNumber(-1),
|
||||||
|
TrimMode(false),
|
||||||
|
FuelFlow_gph(0.0),
|
||||||
|
ManifoldPressure_inHg(0.0),
|
||||||
|
ExhaustGasTemp_degK(0.0),
|
||||||
|
CylinderHeadTemp_degK(0.0),
|
||||||
|
OilPressure_psi(0.0),
|
||||||
|
OilTemp_degK(0.0),
|
||||||
|
FDMExec(exec),
|
||||||
|
State(FDMExec->GetState()),
|
||||||
|
Atmosphere(FDMExec->GetAtmosphere()),
|
||||||
|
FCS(FDMExec->GetFCS()),
|
||||||
|
Propulsion(FDMExec->GetPropulsion()),
|
||||||
|
Aircraft(FDMExec->GetAircraft()),
|
||||||
|
Translation(FDMExec->GetTranslation()),
|
||||||
|
Rotation(FDMExec->GetRotation()),
|
||||||
|
Position(FDMExec->GetPosition()),
|
||||||
|
Auxiliary(FDMExec->GetAuxiliary()),
|
||||||
|
Output(FDMExec->GetOutput())
|
||||||
{
|
{
|
||||||
FDMExec = exec;
|
|
||||||
State = FDMExec->GetState();
|
|
||||||
Atmosphere = FDMExec->GetAtmosphere();
|
|
||||||
FCS = FDMExec->GetFCS();
|
|
||||||
Propulsion = FDMExec->GetPropulsion();
|
|
||||||
Aircraft = FDMExec->GetAircraft();
|
|
||||||
Translation = FDMExec->GetTranslation();
|
|
||||||
Rotation = FDMExec->GetRotation();
|
|
||||||
Position = FDMExec->GetPosition();
|
|
||||||
Auxiliary = FDMExec->GetAuxiliary();
|
|
||||||
Output = FDMExec->GetOutput();
|
|
||||||
|
|
||||||
Mixture = 1.0; // FIXME: get actual value
|
|
||||||
|
|
||||||
Thrust = PctPower = 0.0;
|
|
||||||
Starved = Flameout = false;
|
|
||||||
Running = false;
|
|
||||||
Cranking = Starter = false;
|
|
||||||
|
|
||||||
Debug(0);
|
Debug(0);
|
||||||
TrimMode = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
|
|
@ -115,17 +115,21 @@ public:
|
||||||
|
|
||||||
virtual double GetThrottleMin(void) { return MinThrottle; }
|
virtual double GetThrottleMin(void) { return MinThrottle; }
|
||||||
virtual double GetThrottleMax(void) { return MaxThrottle; }
|
virtual double GetThrottleMax(void) { return MaxThrottle; }
|
||||||
double GetThrottle(void) { return Throttle; }
|
virtual double GetThrottle(void) { return Throttle; }
|
||||||
double GetMixture(void) { return Mixture; }
|
virtual double GetMixture(void) { return Mixture; }
|
||||||
int GetMagnetos(void) { return Magnetos; }
|
virtual int GetMagnetos(void) { return Magnetos; }
|
||||||
bool GetStarter(void) { return Starter; }
|
virtual bool GetStarter(void) { return Starter; }
|
||||||
double GetThrust(void) { return Thrust; }
|
virtual double GetThrust(void) { return Thrust; }
|
||||||
bool GetStarved(void) { return Starved; }
|
virtual bool GetStarved(void) { return Starved; }
|
||||||
bool GetFlameout(void) { return Flameout; }
|
virtual bool GetFlameout(void) { return Flameout; }
|
||||||
bool GetRunning(void) { return Running; }
|
virtual bool GetRunning(void) { return Running; }
|
||||||
bool GetCranking(void) { return Cranking; }
|
virtual bool GetCranking(void) { return Cranking; }
|
||||||
int GetType(void) { return Type; }
|
virtual int GetType(void) { return Type; }
|
||||||
string GetName(void) { return Name; }
|
virtual string GetName(void) { return Name; }
|
||||||
|
|
||||||
|
virtual double getFuelFlow_gph () const {
|
||||||
|
return FuelFlow_gph;
|
||||||
|
}
|
||||||
|
|
||||||
virtual double getManifoldPressure_inHg () const {
|
virtual double getManifoldPressure_inHg () const {
|
||||||
return ManifoldPressure_inHg;
|
return ManifoldPressure_inHg;
|
||||||
|
@ -143,15 +147,15 @@ public:
|
||||||
return (OilTemp_degK - 273.0) * (9.0 / 5.0) + 32.0;
|
return (OilTemp_degK - 273.0) * (9.0 / 5.0) + 32.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetStarved(bool tt) {Starved = tt;}
|
virtual void SetStarved(bool tt) {Starved = tt;}
|
||||||
void SetStarved(void) {Starved = true;}
|
virtual void SetStarved(void) {Starved = true;}
|
||||||
|
|
||||||
void SetRunning(bool bb) { Running=bb; }
|
virtual void SetRunning(bool bb) { Running=bb; }
|
||||||
void SetName(string name) {Name = name;}
|
virtual void SetName(string name) {Name = name;}
|
||||||
void AddFeedTank(int tkID);
|
virtual void AddFeedTank(int tkID);
|
||||||
|
|
||||||
void SetMagnetos(int m) { Magnetos = m; }
|
virtual void SetMagnetos(int m) { Magnetos = m; }
|
||||||
void SetStarter(bool s) { Starter = s;}
|
virtual void SetStarter(bool s) { Starter = s;}
|
||||||
|
|
||||||
/** Calculates the thrust of the engine, and other engine functions.
|
/** Calculates the thrust of the engine, and other engine functions.
|
||||||
@param PowerRequired this is the power required to run the thrusting device
|
@param PowerRequired this is the power required to run the thrusting device
|
||||||
|
@ -165,30 +169,30 @@ public:
|
||||||
derived class' Calculate() function before any other calculations are
|
derived class' Calculate() function before any other calculations are
|
||||||
done. This base class method removes fuel from the fuel tanks as
|
done. This base class method removes fuel from the fuel tanks as
|
||||||
appropriate, and sets the starved flag if necessary. */
|
appropriate, and sets the starved flag if necessary. */
|
||||||
void ConsumeFuel(void);
|
virtual void ConsumeFuel(void);
|
||||||
|
|
||||||
/** The fuel need is calculated based on power levels and flow rate for that
|
/** The fuel need is calculated based on power levels and flow rate for that
|
||||||
power level. It is also turned from a rate into an actual amount (pounds)
|
power level. It is also turned from a rate into an actual amount (pounds)
|
||||||
by multiplying it by the delta T and the rate.
|
by multiplying it by the delta T and the rate.
|
||||||
@return Total fuel requirement for this engine in pounds. */
|
@return Total fuel requirement for this engine in pounds. */
|
||||||
double CalcFuelNeed(void);
|
virtual double CalcFuelNeed(void);
|
||||||
|
|
||||||
/** The oxidizer need is calculated based on power levels and flow rate for that
|
/** The oxidizer need is calculated based on power levels and flow rate for that
|
||||||
power level. It is also turned from a rate into an actual amount (pounds)
|
power level. It is also turned from a rate into an actual amount (pounds)
|
||||||
by multiplying it by the delta T and the rate.
|
by multiplying it by the delta T and the rate.
|
||||||
@return Total oxidizer requirement for this engine in pounds. */
|
@return Total oxidizer requirement for this engine in pounds. */
|
||||||
double CalcOxidizerNeed(void);
|
virtual double CalcOxidizerNeed(void);
|
||||||
|
|
||||||
/// Sets engine placement information
|
/// Sets engine placement information
|
||||||
void SetPlacement(double x, double y, double z, double pitch, double yaw);
|
virtual void SetPlacement(double x, double y, double z, double pitch, double yaw);
|
||||||
|
|
||||||
/// Sets the engine number
|
/// Sets the engine number
|
||||||
void SetEngineNumber(int nn) {EngineNumber = nn;}
|
virtual void SetEngineNumber(int nn) {EngineNumber = nn;}
|
||||||
|
|
||||||
virtual double GetPowerAvailable(void) {return 0.0;};
|
virtual double GetPowerAvailable(void) {return 0.0;};
|
||||||
|
|
||||||
bool GetTrimMode(void) {return TrimMode;}
|
virtual bool GetTrimMode(void) {return TrimMode;}
|
||||||
void SetTrimMode(bool state) {TrimMode = state;}
|
virtual void SetTrimMode(bool state) {TrimMode = state;}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
string Name;
|
string Name;
|
||||||
|
@ -215,6 +219,7 @@ protected:
|
||||||
int EngineNumber;
|
int EngineNumber;
|
||||||
bool TrimMode;
|
bool TrimMode;
|
||||||
|
|
||||||
|
double FuelFlow_gph;
|
||||||
double ManifoldPressure_inHg;
|
double ManifoldPressure_inHg;
|
||||||
double ExhaustGasTemp_degK;
|
double ExhaustGasTemp_degK;
|
||||||
double CylinderHeadTemp_degK;
|
double CylinderHeadTemp_degK;
|
||||||
|
|
|
@ -60,11 +60,9 @@ FGGroundReactions::~FGGroundReactions(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
|
||||||
bool FGGroundReactions::Run(void)
|
bool FGGroundReactions::Run(void)
|
||||||
{
|
{
|
||||||
// double steerAngle = 0.0;
|
|
||||||
// double xForces = 0.0, yForces = 0.0;
|
|
||||||
|
|
||||||
if (!FGModel::Run()) {
|
if (!FGModel::Run()) {
|
||||||
vForces.InitMatrix();
|
vForces.InitMatrix();
|
||||||
vMoments.InitMatrix();
|
vMoments.InitMatrix();
|
||||||
|
@ -83,55 +81,6 @@ bool FGGroundReactions::Run(void)
|
||||||
iGear++;
|
iGear++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Only execute this code when the aircraft ground speed is very, very small.
|
|
||||||
/*
|
|
||||||
if (fabs(Translation->GetUVW(eX)) < 0.1 &&
|
|
||||||
fabs(Translation->GetUVW(eZ)) < 0.1)
|
|
||||||
{
|
|
||||||
// Initialize the comparison matrices.
|
|
||||||
vMaxStaticGrip.InitMatrix();
|
|
||||||
vMaxMomentResist.InitMatrix();
|
|
||||||
iGear = lGear.begin();
|
|
||||||
// For each gear that is touching the ground (which had better be all of them!)
|
|
||||||
// calculate the X and Y direction maximum "gripping" power. Also, keep track
|
|
||||||
// of the number of gear that have weight on wheels. This is probably unnecessary.
|
|
||||||
while (iGear != lGear.end()) {
|
|
||||||
// calculate maximum gripping power for each gear here based on brake
|
|
||||||
// and steering settings
|
|
||||||
// also calculate total number of wheels with WOW set true?
|
|
||||||
if (iGear->GetWOW()) {
|
|
||||||
steerAngle = iGear->GetSteerAngle();
|
|
||||||
vMaxStaticGrip(eX) += (iGear->GetBrakeFCoeff()*cos(steerAngle) -
|
|
||||||
iGear->GetstaticFCoeff()*sin(steerAngle))*iGear->GetCompForce();
|
|
||||||
vMaxStaticGrip(eY) += iGear->GetBrakeFCoeff()*sin(steerAngle) +
|
|
||||||
iGear->GetstaticFCoeff()*cos(steerAngle)*iGear->GetCompForce();
|
|
||||||
vMaxStaticGrip(eZ) = 0.0;
|
|
||||||
// vMaxMomentResist += 1;
|
|
||||||
}
|
|
||||||
iGear++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Calculate the X and Y direction non-gear forces to counteract if needed.
|
|
||||||
xForces = -1.0 * ( Aerodynamics->GetForces(eX)
|
|
||||||
+ Propulsion->GetForces(eX)
|
|
||||||
+ Inertial->GetForces(eX));
|
|
||||||
|
|
||||||
yForces = -1.0 * ( Aerodynamics->GetForces(eY)
|
|
||||||
+ Propulsion->GetForces(eY)
|
|
||||||
+ Inertial->GetForces(eY));
|
|
||||||
|
|
||||||
// These if statement comparisons probably need some validation and work
|
|
||||||
if (fabs(xForces) < fabs(vMaxStaticGrip(eX))) { // forces exceed gear power
|
|
||||||
vForces(eX) = xForces;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fabs(yForces) < fabs(vMaxStaticGrip(eY))) { // forces exceed gear power
|
|
||||||
vForces(eY) = yForces;
|
|
||||||
}
|
|
||||||
|
|
||||||
vMoments(eZ) = -(Aerodynamics->GetMoments(eZ) + Propulsion->GetMoments(eZ));
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
} else {
|
} else {
|
||||||
// Crash Routine
|
// Crash Routine
|
||||||
}
|
}
|
||||||
|
|
|
@ -326,16 +326,6 @@ FGColumnVector3& FGLGear::Force(void)
|
||||||
WheelSlip = radtodeg*atan2(SideWhlVel, RollingWhlVel);
|
WheelSlip = radtodeg*atan2(SideWhlVel, RollingWhlVel);
|
||||||
}
|
}
|
||||||
|
|
||||||
// The following code normalizes the wheel velocity vector, reverses it, and zeroes out
|
|
||||||
// the z component of the velocity. The question is, should the Z axis velocity be zeroed
|
|
||||||
// out first before the normalization takes place or not? Subsequent to that, the Wheel
|
|
||||||
// Velocity vector now points as a unit vector backwards and parallel to the wheel
|
|
||||||
// velocity vector. It acts AT the wheel.
|
|
||||||
|
|
||||||
// Note to Jon: I commented out this line because I wasn't sure we want to do this.
|
|
||||||
// vWhlVelVec = -1.0 * vWhlVelVec.Normalize();
|
|
||||||
// vWhlVelVec(eZ) = 0.00;
|
|
||||||
|
|
||||||
// Compute the sideforce coefficients using similar assumptions to LaRCSim for now.
|
// Compute the sideforce coefficients using similar assumptions to LaRCSim for now.
|
||||||
// Allow a maximum of 10 degrees tire slip angle before wheel slides. At that point,
|
// Allow a maximum of 10 degrees tire slip angle before wheel slides. At that point,
|
||||||
// transition from static to dynamic friction. There are more complicated formulations
|
// transition from static to dynamic friction. There are more complicated formulations
|
||||||
|
@ -351,7 +341,7 @@ FGColumnVector3& FGLGear::Force(void)
|
||||||
// in paper AIAA-2000-4303 - see header prologue comments). We might consider
|
// in paper AIAA-2000-4303 - see header prologue comments). We might consider
|
||||||
// allowing for both square and linear damping force calculation. Also need to
|
// allowing for both square and linear damping force calculation. Also need to
|
||||||
// possibly give a "rebound damping factor" that differs from the compression
|
// possibly give a "rebound damping factor" that differs from the compression
|
||||||
// case. NOTE: SQUARE LAW DAMPING NO GOOD!
|
// case.
|
||||||
|
|
||||||
vLocalForce(eZ) = min(-compressLength * kSpring
|
vLocalForce(eZ) = min(-compressLength * kSpring
|
||||||
- compressSpeed * bDamp, (double)0.0);
|
- compressSpeed * bDamp, (double)0.0);
|
||||||
|
|
|
@ -78,7 +78,6 @@ FGPiston::FGPiston(FGFDMExec* exec, FGConfigFile* Eng_cfg) : FGEngine(exec),
|
||||||
else if (token == "IDLERPM") *Eng_cfg >> IdleRPM;
|
else if (token == "IDLERPM") *Eng_cfg >> IdleRPM;
|
||||||
else if (token == "MAXTHROTTLE") *Eng_cfg >> MaxThrottle;
|
else if (token == "MAXTHROTTLE") *Eng_cfg >> MaxThrottle;
|
||||||
else if (token == "MINTHROTTLE") *Eng_cfg >> MinThrottle;
|
else if (token == "MINTHROTTLE") *Eng_cfg >> MinThrottle;
|
||||||
else if (token == "SLFUELFLOWMAX") *Eng_cfg >> SLFuelFlowMax;
|
|
||||||
else cerr << "Unhandled token in Engine config file: " << token << endl;
|
else cerr << "Unhandled token in Engine config file: " << token << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -332,6 +331,10 @@ void FGPiston::doFuelFlow(void)
|
||||||
double thi_sea_level = 1.3 * Mixture;
|
double thi_sea_level = 1.3 * Mixture;
|
||||||
equivalence_ratio = thi_sea_level * p_amb_sea_level / p_amb;
|
equivalence_ratio = thi_sea_level * p_amb_sea_level / p_amb;
|
||||||
m_dot_fuel = m_dot_air / 14.7 * equivalence_ratio;
|
m_dot_fuel = m_dot_air / 14.7 * equivalence_ratio;
|
||||||
|
FuelFlow_gph = m_dot_fuel
|
||||||
|
* 3600 // seconds to hours
|
||||||
|
* 2.2046 // kg to lb
|
||||||
|
/ 6.6; // lb to gal_us of kerosene
|
||||||
}
|
}
|
||||||
|
|
||||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
@ -549,7 +552,6 @@ void FGPiston::Debug(int from)
|
||||||
cout << " IdleRPM: " << IdleRPM << endl;
|
cout << " IdleRPM: " << IdleRPM << endl;
|
||||||
cout << " MaxThrottle: " << MaxThrottle << endl;
|
cout << " MaxThrottle: " << MaxThrottle << endl;
|
||||||
cout << " MinThrottle: " << MinThrottle << endl;
|
cout << " MinThrottle: " << MinThrottle << endl;
|
||||||
cout << " SLFuelFlowMax: " << SLFuelFlowMax << endl;
|
|
||||||
|
|
||||||
cout << endl;
|
cout << endl;
|
||||||
cout << " Combustion Efficiency table:" << endl;
|
cout << " Combustion Efficiency table:" << endl;
|
||||||
|
@ -581,3 +583,9 @@ void FGPiston::Debug(int from)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double
|
||||||
|
FGPiston::CalcFuelNeed(void)
|
||||||
|
{
|
||||||
|
// FIXME: is this right?
|
||||||
|
return FuelFlow_gph * State->Getdt() * Propulsion->GetRate();
|
||||||
|
}
|
||||||
|
|
|
@ -86,6 +86,7 @@ public:
|
||||||
|
|
||||||
double Calculate(double PowerRequired);
|
double Calculate(double PowerRequired);
|
||||||
double GetPowerAvailable(void) {return PowerAvailable;}
|
double GetPowerAvailable(void) {return PowerAvailable;}
|
||||||
|
double CalcFuelNeed(void);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int crank_counter;
|
int crank_counter;
|
||||||
|
|
|
@ -136,6 +136,9 @@ public:
|
||||||
if (index <= Engines.size()-1) return Engines[index];
|
if (index <= Engines.size()-1) return Engines[index];
|
||||||
else return 0L; }
|
else return 0L; }
|
||||||
|
|
||||||
|
// Retrieves the number of tanks defined for the aircraft.
|
||||||
|
inline unsigned int GetNumTanks(void) {return Tanks.size();}
|
||||||
|
|
||||||
/** Retrieves a tank object pointer from the list of tanks.
|
/** Retrieves a tank object pointer from the list of tanks.
|
||||||
@param index the tank index within the vector container
|
@param index the tank index within the vector container
|
||||||
@return the address of the specific tank, or zero if no such tank is
|
@return the address of the specific tank, or zero if no such tank is
|
||||||
|
|
|
@ -91,6 +91,8 @@ public:
|
||||||
double inline GetY(void) {return Y;}
|
double inline GetY(void) {return Y;}
|
||||||
double inline GetZ(void) {return Z;}
|
double inline GetZ(void) {return Z;}
|
||||||
|
|
||||||
|
void SetContents(double contents) { Contents = contents; }
|
||||||
|
|
||||||
enum TankType {ttUNKNOWN, ttFUEL, ttOXIDIZER};
|
enum TankType {ttUNKNOWN, ttFUEL, ttOXIDIZER};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
Loading…
Add table
Reference in a new issue