#include "Thruster.hpp"
#include "PropEngine.hpp"
#include "PistonEngine.hpp"
+#include "TurbineEngine.hpp"
#include "Gear.hpp"
#include "Wing.hpp"
#include "Rotor.hpp"
switch(o->type) {
case THROTTLE: ((Thruster*)obj)->setThrottle(lval); break;
case MIXTURE: ((Thruster*)obj)->setMixture(lval); break;
+ case CONDLEVER: ((TurbineEngine*)((PropEngine*)obj)->getEngine())->setCondLever(lval); break;
case STARTER: ((Thruster*)obj)->setStarter(lval != 0.0); break;
case MAGNETOS: ((PropEngine*)obj)->setMagnetos((int)lval); break;
case ADVANCE: ((PropEngine*)obj)->setAdvance(lval); break;
- case PROPPITCH: ((PropEngine*)obj)->setPropPitch(lval); break;
+ case PROPPITCH: ((PropEngine*)obj)->setPropPitch(lval); break;
+ case PROPFEATHER: ((PropEngine*)obj)->setPropFeather((int)lval); break;
case REHEAT: ((Jet*)obj)->setReheat(lval); break;
case VECTOR: ((Jet*)obj)->setRotation(lval); break;
case BRAKE: ((Gear*)obj)->setBrake(lval); break;
public:
~ControlMap();
- enum OutputType { THROTTLE, MIXTURE, STARTER, MAGNETOS,
+ enum OutputType { THROTTLE, MIXTURE, CONDLEVER, STARTER, MAGNETOS,
ADVANCE, REHEAT, PROP,
BRAKE, STEER, EXTEND,
INCIDENCE, FLAP0, FLAP1, SLAT, SPOILER, VECTOR,
- BOOST, CASTERING, PROPPITCH,
+ BOOST, CASTERING, PROPPITCH, PROPFEATHER,
COLLECTIVE, CYCLICAIL, CYCLICELE, ROTORENGINEON,
REVERSE_THRUST };
void FGFDM::setOutputProperties()
{
- char buf[256];
+ // char buf[256];
int i;
float grossWgt = _airplane.getModel()->getBody()->getTotalMass() * KG2LBS;
// Not there, make a new one.
AxisRec* a = new AxisRec();
a->name = dup(name);
+ fgGetNode( a->name, true ); // make sure the property name exists
a->handle = _airplane.getControlMap()->newInput();
_axes.add(a);
return a->handle;
{
if(eq(name, "THROTTLE")) return ControlMap::THROTTLE;
if(eq(name, "MIXTURE")) return ControlMap::MIXTURE;
+ if(eq(name, "CONDLEVER")) return ControlMap::CONDLEVER;
if(eq(name, "STARTER")) return ControlMap::STARTER;
if(eq(name, "MAGNETOS")) return ControlMap::MAGNETOS;
if(eq(name, "ADVANCE")) return ControlMap::ADVANCE;
if(eq(name, "SPOILER")) return ControlMap::SPOILER;
if(eq(name, "CASTERING")) return ControlMap::CASTERING;
if(eq(name, "PROPPITCH")) return ControlMap::PROPPITCH;
+ if(eq(name, "PROPFEATHER")) return ControlMap::PROPFEATHER;
if(eq(name, "COLLECTIVE")) return ControlMap::COLLECTIVE;
if(eq(name, "CYCLICAIL")) return ControlMap::CYCLICAIL;
if(eq(name, "CYCLICELE")) return ControlMap::CYCLICELE;
_prop->setPropPitch(proppitch);
}
+void PropEngine::setPropFeather(int state)
+{
+ // toggle prop feathering on/off
+ _prop->setPropFeather(state);
+}
+
void PropEngine::setVariableProp(float min, float max)
{
_variable = true;
_eng->setStarter(false);
_eng->setMagnetos(3);
+
+ bool running_state = _eng->isRunning();
_eng->setRunning(true);
if(_variable) {
}
// ...and back off
- _eng->setRunning(false);
+ _eng->setRunning(running_state);
}
void PropEngine::init()
void setAdvance(float advance);
void setPropPitch(float proppitch);
void setVariableProp(float min, float max);
+ void setPropFeather(int state);
void setGearRatio(float ratio) { _gearRatio = ratio; }
virtual PropEngine* getPropEngine() { return this; }
_matchTakeoff = false;
_manual = false;
_proppitch = 0;
+ _propfeather = 0;
}
void Propeller::setTakeoff(float omega0, float power0)
_proppitch = Math::clamp(proppitch, 0, 1);
}
+void Propeller::setPropFeather(int state)
+{
+ // 0 = normal, 1 = feathered
+ _propfeather = (state != 0);
+}
+
void Propeller::calc(float density, float v, float omega,
float* thrustOut, float* torqueOut)
{
void setPropPitch(float proppitch);
+ void setPropFeather(int state);
+
void setManualPitch();
void calc(float density, float v, float omega,
float _beta; // constant, ~1.48058;
float _tc0; // thrust "coefficient" at takeoff
bool _matchTakeoff; // Does _tc0 mean anything?
- bool _manual; // manual pitch mode
- float _proppitch; // prop pitch control setting (0 ~ 1.0)
+ bool _manual; // manual pitch mode
+ float _proppitch; // prop pitch control setting (0 ~ 1.0)
+ float _propfeather; // prop feather control setting (0 = norm, 1 = feather)
};
}; // namespace yasim
_mixture = Math::clamp(mixture, 0, 1);
}
+
void Thruster::setStarter(bool starter)
{
_starter = starter;
TurbineEngine::TurbineEngine(float power, float omega, float alt,
float flatRating)
{
+ // _cond_lever = 1.0;
+
_rho0 = Atmosphere::getStdDensity(0);
_maxTorque = (power/omega) * _rho0 / Atmosphere::getStdDensity(alt);
_flatRating = flatRating;
_n2 = _n2Target = _n2Min;
_torque = 0;
_fuelFlow = 0;
+
+ _running = true;
}
void TurbineEngine::setOutputFromN2()
void TurbineEngine::calc(float pressure, float temp, float omega)
{
- _running = true;
+ if ( _cond_lever < 0.001 ) {
+ _running = false;
+ } else {
+ _running = true;
+ }
+
_omega = omega;
_rho = Atmosphere::calcStdDensity(pressure, temp);
torque = _flatRating / omega;
float frac = torque / (_maxTorque * (_rho / _rho0));
- _n2Target = _n2Min + (_n2Max - _n2Min) * frac;
+
+ if ( _running ) {
+ _n2Target = _n2Min + (_n2Max - _n2Min) * frac;
+ } else {
+ _n2Target = 0;
+ }
}
}; // namespace yasim
virtual void stabilize();
virtual void integrate(float dt);
+ void setCondLever( float lever ) {
+ _cond_lever = lever;
+ }
virtual float getTorque() { return _torque; }
virtual float getFuelFlow() { return _fuelFlow; }
float getN2() { return _n2; }
private:
void setOutputFromN2();
+ float _cond_lever;
+
float _maxTorque;
float _flatRating;
float _rho0;