case COLLECTIVE: ((Rotor*)obj)->setCollective(lval); break;
case CYCLICAIL: ((Rotor*)obj)->setCyclicail(lval,rval); break;
case CYCLICELE: ((Rotor*)obj)->setCyclicele(lval,rval); break;
- case ROTORBRAKE: ((Rotorgear*)obj)->setRotorBrake(lval); break;
- case ROTORENGINEON: ((Rotorgear*)obj)->setEngineOn((int)lval); break;
+ case ROTORBRAKE: ((Rotorgear*)obj)->setRotorBrake(lval); break;
+ case ROTORENGINEON:
+ ((Rotorgear*)obj)->setEngineOn((int)lval); break;
+ case ROTORENGINEMAXRELTORQUE:
+ ((Rotorgear*)obj)->setRotorEngineMaxRelTorque(lval); break;
+ case ROTORELTARGET:
+ ((Rotorgear*)obj)->setRotorRelTarget(lval); break;
case REVERSE_THRUST: ((Jet*)obj)->setReverse(lval != 0); break;
case BOOST:
((PistonEngine*)((Thruster*)obj)->getEngine())->setBoost(lval);
INCIDENCE, FLAP0, FLAP1, SLAT, SPOILER, VECTOR,
BOOST, CASTERING, PROPPITCH, PROPFEATHER,
COLLECTIVE, CYCLICAIL, CYCLICELE, ROTORENGINEON,
- ROTORBRAKE,
+ ROTORBRAKE, ROTORENGINEMAXRELTORQUE, ROTORELTARGET,
REVERSE_THRUST, WASTEGATE,
WINCHRELSPEED, HITCHOPEN, PLACEWINCH, FINDAITOW};
if(eq(name, "CYCLICELE")) return ControlMap::CYCLICELE;
if(eq(name, "ROTORGEARENGINEON")) return ControlMap::ROTORENGINEON;
if(eq(name, "ROTORBRAKE")) return ControlMap::ROTORBRAKE;
+ if(eq(name, "ROTORENGINEMAXRELTORQUE"))
+ return ControlMap::ROTORENGINEMAXRELTORQUE;
+ if(eq(name, "ROTORELTARGET")) return ControlMap::ROTORELTARGET;
if(eq(name, "REVERSE_THRUST")) return ControlMap::REVERSE_THRUST;
if(eq(name, "WASTEGATE")) return ControlMap::WASTEGATE;
if(eq(name, "WINCHRELSPEED")) return ControlMap::WINCHRELSPEED;
Math::mul3(Math::sin(_roll),side,help);
Math::add3(_normal_with_yaw_roll,help,_normal_with_yaw_roll);
+
+ //update balance
+ if ((_balance1*_balance2 < 0.97) && (_balance1>-1))
+ {
+ _balance1-=(0.97-_balance1*_balance2)*(0.97-_balance1*_balance2)*0.00001;
+ if (_balance1<-1) _balance1=-1;
+ }
}
float Rotor::calcStall(float incidence,float speed)
if (j==0)
{
sprintf(text,"/rotors/%s/cone-deg", _name);
- *f=( ((Rotorpart*)getRotorpart(0))->getrealAlpha()
+ *f=(_balance1>-1)?( ((Rotorpart*)getRotorpart(0))->getrealAlpha()
+((Rotorpart*)getRotorpart(1*(_number_of_parts>>2)))->getrealAlpha()
+((Rotorpart*)getRotorpart(2*(_number_of_parts>>2)))->getrealAlpha()
+((Rotorpart*)getRotorpart(3*(_number_of_parts>>2)))->getrealAlpha()
- )/4*180/pi;
+ )/4*180/pi:0;
}
else
if (j==1)
_roll = ( ((Rotorpart*)getRotorpart(0))->getrealAlpha()
-((Rotorpart*)getRotorpart(2*(_number_of_parts>>2)))->getrealAlpha()
)/2*(_ccw?-1:1);
- *f=_roll *180/pi;
+ *f=(_balance1>-1)?_roll *180/pi:0;
}
else
if (j==2)
_yaw=( ((Rotorpart*)getRotorpart(1*(_number_of_parts>>2)))->getrealAlpha()
-((Rotorpart*)getRotorpart(3*(_number_of_parts>>2)))->getrealAlpha()
)/2;
- *f=_yaw*180/pi;
+ *f=(_balance1>-1)?_yaw*180/pi:0;
}
else
if (j==3)
_engineon=value;
}
+void Rotorgear::setRotorEngineMaxRelTorque(float lval)
+{
+ fgGetNode("/rotors/gear/max-rel-torque", true)->setDoubleValue(lval);
+}
+
+void Rotorgear::setRotorRelTarget(float lval)
+{
+ fgGetNode("/rotors/gear/target-rel-rpm", true)->setDoubleValue(lval);
+}
+
void Rotor::setAlpha0(float f)
{
_alpha0=f;
total_torque+=r->getTorque()*omegan;
}
float max_torque_of_engine=0;
+ SGPropertyNode * node=fgGetNode("/rotors/gear", true);
+ float target_rel_rpm=node->getDoubleValue("target-rel-rpm",1);
if (_engineon)
{
- max_torque_of_engine=_max_power_engine;
- float df=1-omegarel;
+ float max_rel_torque=node->getDoubleValue("max-rel-torque",1);
+ max_torque_of_engine=_max_power_engine*max_rel_torque;
+ float df=target_rel_rpm-omegarel;
df/=_engine_prop_factor;
df = Math::clamp(df, 0, 1);
- max_torque_of_engine = df * _max_power_engine;
+ max_torque_of_engine = df * _max_power_engine*max_rel_torque;
}
total_torque*=-1;
_ddt_omegarel=0;
//change the rotation of the rotors
if ((max_torque_of_engine<total_torque) //decreasing rotation
- ||((max_torque_of_engine>total_torque)&&(omegarel<1))
+ ||((max_torque_of_engine>total_torque)&&(omegarel<target_rel_rpm))
//increasing rotation due to engine
||(total_torque<0) ) //increasing rotation due to autorotation
{
Rotor* r = (Rotor*)_rotors.get(j);
r->compile();
}
+ fgGetNode("/rotors/gear/target-rel-rpm", true)->setDoubleValue(1);
+ fgGetNode("/rotors/gear/max-rel-torque", true)->setDoubleValue(1);
}
void Rotorgear::getDownWash(float *pos, float * v_heli, float *downwash)