Maik: fix crash when using aircraft with hitches under the command
line solver. (He promises to get all the MP interaction out of the FDM in a future patch.)
This commit is contained in:
parent
ff454131d5
commit
a90a24d9dd
2 changed files with 98 additions and 88 deletions
|
@ -10,7 +10,9 @@
|
|||
namespace yasim {
|
||||
Hitch::Hitch(const char *name)
|
||||
{
|
||||
_node = fgGetNode("/sim/hitches", true)->getNode(name, true);
|
||||
if (fgGetNode("/sim/hitches", true))
|
||||
_node = fgGetNode("/sim/hitches", true)->getNode(name, true);
|
||||
else _node = 0;
|
||||
int i;
|
||||
for(i=0; i<3; i++)
|
||||
_pos[i] = _force[i] = _winchPos[i] = _mp_lpos[i]=_towEndForce[i]=_mp_force[i]=0;
|
||||
|
@ -59,91 +61,95 @@ Hitch::Hitch(const char *name)
|
|||
_mp_is_slave=false;
|
||||
_mp_open_last_state=false;
|
||||
_timeLagCorrectedDist=0;
|
||||
|
||||
_node->tie("tow/length",SGRawValuePointer<float>(&_towLength));
|
||||
_node->tie("tow/elastic-constant",SGRawValuePointer<float>(&_towElasticConstant));
|
||||
_node->tie("tow/weight-per-m-kg-m",SGRawValuePointer<float>(&_towWeightPerM));
|
||||
_node->tie("tow/brake-force",SGRawValuePointer<float>(&_towBrakeForce));
|
||||
_node->tie("winch/max-speed-m-s",SGRawValuePointer<float>(&_winchMaxSpeed));
|
||||
_node->tie("winch/rel-speed",SGRawValuePointer<float>(&_winchRelSpeed));
|
||||
_node->tie("winch/initial-tow-length-m",SGRawValuePointer<float>(&_winchInitialTowLength));
|
||||
_node->tie("winch/min-tow-length-m",SGRawValuePointer<float>(&_winchMinTowLength));
|
||||
_node->tie("winch/max-tow-length-m",SGRawValuePointer<float>(&_winchMaxTowLength));
|
||||
_node->tie("winch/global-pos-x",SGRawValuePointer<double>(&_winchPos[0]));
|
||||
_node->tie("winch/global-pos-y",SGRawValuePointer<double>(&_winchPos[1]));
|
||||
_node->tie("winch/global-pos-z",SGRawValuePointer<double>(&_winchPos[2]));
|
||||
_node->tie("winch/max-power",SGRawValuePointer<float>(&_winchPower));
|
||||
_node->tie("winch/max-force",SGRawValuePointer<float>(&_winchMaxForce));
|
||||
_node->tie("winch/actual-force",SGRawValuePointer<float>(&_winchActualForce));
|
||||
_node->tie("tow/end-force-x",SGRawValuePointer<float>(&_reportTowEndForce[0]));
|
||||
_node->tie("tow/end-force-y",SGRawValuePointer<float>(&_reportTowEndForce[1]));
|
||||
_node->tie("tow/end-force-z",SGRawValuePointer<float>(&_reportTowEndForce[2]));
|
||||
_node->tie("force",SGRawValuePointer<float>(&_forceMagnitude));
|
||||
_node->tie("open",SGRawValuePointer<bool>(&_open));
|
||||
_node->tie("force-is-calculated-by-other",SGRawValuePointer<bool>(&_forceIsCalculatedByMaster));
|
||||
_node->tie("local-pos-x",SGRawValuePointer<float>(&_pos[0]));
|
||||
_node->tie("local-pos-y",SGRawValuePointer<float>(&_pos[1]));
|
||||
_node->tie("local-pos-z",SGRawValuePointer<float>(&_pos[2]));
|
||||
_node->tie("tow/dist",SGRawValuePointer<float>(&_dist));
|
||||
_node->tie("tow/dist-time-lag-corrected",SGRawValuePointer<float>(&_timeLagCorrectedDist));
|
||||
_node->tie("tow/connected-to-property-node",SGRawValuePointer<bool>(&_towEndIsConnectedToProperty));
|
||||
_node->tie("tow/connected-to-mp-node",SGRawValuePointer<bool>(&_nodeIsMultiplayer));
|
||||
_node->tie("tow/connected-to-ai-node",SGRawValuePointer<bool>(&_nodeIsAiAircraft));
|
||||
_node->tie("tow/connected-to-ai-or-mp-id",SGRawValuePointer<int>(&_nodeID));
|
||||
_node->tie("debug/hitch-height-above-ground",SGRawValuePointer<float>(&_height_above_ground));
|
||||
_node->tie("debug/tow-end-height-above-ground",SGRawValuePointer<float>(&_winch_height_above_ground));
|
||||
_node->tie("debug/tow-rel-lo-pos",SGRawValuePointer<float>(&_loPosFrac));
|
||||
_node->tie("debug/tow-lowest-pos-height",SGRawValuePointer<float>(&_lowest_tow_height));
|
||||
_node->tie("is-slave",SGRawValuePointer<bool>(&_isSlave));
|
||||
_node->tie("speed-in-tow-direction",SGRawValuePointer<float>(&_speed_in_tow_direction));
|
||||
_node->tie("mp-auto-connect-period",SGRawValuePointer<float>(&_mpAutoConnectPeriod));
|
||||
_node->tie("mp-time-lag",SGRawValuePointer<float>(&_mp_time_lag));
|
||||
_node->setStringValue("tow/node","");
|
||||
_node->setStringValue("tow/connected-to-ai-or-mp-callsign");
|
||||
_node->setBoolValue("broken",false);
|
||||
if (_node)
|
||||
{
|
||||
_node->tie("tow/length",SGRawValuePointer<float>(&_towLength));
|
||||
_node->tie("tow/elastic-constant",SGRawValuePointer<float>(&_towElasticConstant));
|
||||
_node->tie("tow/weight-per-m-kg-m",SGRawValuePointer<float>(&_towWeightPerM));
|
||||
_node->tie("tow/brake-force",SGRawValuePointer<float>(&_towBrakeForce));
|
||||
_node->tie("winch/max-speed-m-s",SGRawValuePointer<float>(&_winchMaxSpeed));
|
||||
_node->tie("winch/rel-speed",SGRawValuePointer<float>(&_winchRelSpeed));
|
||||
_node->tie("winch/initial-tow-length-m",SGRawValuePointer<float>(&_winchInitialTowLength));
|
||||
_node->tie("winch/min-tow-length-m",SGRawValuePointer<float>(&_winchMinTowLength));
|
||||
_node->tie("winch/max-tow-length-m",SGRawValuePointer<float>(&_winchMaxTowLength));
|
||||
_node->tie("winch/global-pos-x",SGRawValuePointer<double>(&_winchPos[0]));
|
||||
_node->tie("winch/global-pos-y",SGRawValuePointer<double>(&_winchPos[1]));
|
||||
_node->tie("winch/global-pos-z",SGRawValuePointer<double>(&_winchPos[2]));
|
||||
_node->tie("winch/max-power",SGRawValuePointer<float>(&_winchPower));
|
||||
_node->tie("winch/max-force",SGRawValuePointer<float>(&_winchMaxForce));
|
||||
_node->tie("winch/actual-force",SGRawValuePointer<float>(&_winchActualForce));
|
||||
_node->tie("tow/end-force-x",SGRawValuePointer<float>(&_reportTowEndForce[0]));
|
||||
_node->tie("tow/end-force-y",SGRawValuePointer<float>(&_reportTowEndForce[1]));
|
||||
_node->tie("tow/end-force-z",SGRawValuePointer<float>(&_reportTowEndForce[2]));
|
||||
_node->tie("force",SGRawValuePointer<float>(&_forceMagnitude));
|
||||
_node->tie("open",SGRawValuePointer<bool>(&_open));
|
||||
_node->tie("force-is-calculated-by-other",SGRawValuePointer<bool>(&_forceIsCalculatedByMaster));
|
||||
_node->tie("local-pos-x",SGRawValuePointer<float>(&_pos[0]));
|
||||
_node->tie("local-pos-y",SGRawValuePointer<float>(&_pos[1]));
|
||||
_node->tie("local-pos-z",SGRawValuePointer<float>(&_pos[2]));
|
||||
_node->tie("tow/dist",SGRawValuePointer<float>(&_dist));
|
||||
_node->tie("tow/dist-time-lag-corrected",SGRawValuePointer<float>(&_timeLagCorrectedDist));
|
||||
_node->tie("tow/connected-to-property-node",SGRawValuePointer<bool>(&_towEndIsConnectedToProperty));
|
||||
_node->tie("tow/connected-to-mp-node",SGRawValuePointer<bool>(&_nodeIsMultiplayer));
|
||||
_node->tie("tow/connected-to-ai-node",SGRawValuePointer<bool>(&_nodeIsAiAircraft));
|
||||
_node->tie("tow/connected-to-ai-or-mp-id",SGRawValuePointer<int>(&_nodeID));
|
||||
_node->tie("debug/hitch-height-above-ground",SGRawValuePointer<float>(&_height_above_ground));
|
||||
_node->tie("debug/tow-end-height-above-ground",SGRawValuePointer<float>(&_winch_height_above_ground));
|
||||
_node->tie("debug/tow-rel-lo-pos",SGRawValuePointer<float>(&_loPosFrac));
|
||||
_node->tie("debug/tow-lowest-pos-height",SGRawValuePointer<float>(&_lowest_tow_height));
|
||||
_node->tie("is-slave",SGRawValuePointer<bool>(&_isSlave));
|
||||
_node->tie("speed-in-tow-direction",SGRawValuePointer<float>(&_speed_in_tow_direction));
|
||||
_node->tie("mp-auto-connect-period",SGRawValuePointer<float>(&_mpAutoConnectPeriod));
|
||||
_node->tie("mp-time-lag",SGRawValuePointer<float>(&_mp_time_lag));
|
||||
_node->setStringValue("tow/node","");
|
||||
_node->setStringValue("tow/connected-to-ai-or-mp-callsign");
|
||||
_node->setBoolValue("broken",false);
|
||||
}
|
||||
}
|
||||
|
||||
Hitch::~Hitch()
|
||||
{
|
||||
_node->untie("tow/length");
|
||||
_node->untie("tow/elastic-constant");
|
||||
_node->untie("tow/weight-per-m-kg-m");
|
||||
_node->untie("tow/brake-force");
|
||||
_node->untie("winch/max-speed-m-s");
|
||||
_node->untie("winch/rel-speed");
|
||||
_node->untie("winch/initial-tow-length-m");
|
||||
_node->untie("winch/min-tow-length-m");
|
||||
_node->untie("winch/max-tow-length-m");
|
||||
_node->untie("winch/global-pos-x");
|
||||
_node->untie("winch/global-pos-y");
|
||||
_node->untie("winch/global-pos-z");
|
||||
_node->untie("winch/max-power");
|
||||
_node->untie("winch/max-force");
|
||||
_node->untie("winch/actual-force");
|
||||
_node->untie("tow/end-force-x");
|
||||
_node->untie("tow/end-force-y");
|
||||
_node->untie("tow/end-force-z");
|
||||
_node->untie("force");
|
||||
_node->untie("open");
|
||||
_node->untie("force-is-calculated-by-other");
|
||||
_node->untie("local-pos-x");
|
||||
_node->untie("local-pos-y");
|
||||
_node->untie("local-pos-z");
|
||||
_node->untie("tow/dist");
|
||||
_node->untie("tow/dist-time-lag-corrected");
|
||||
_node->untie("tow/connected-to-property-node");
|
||||
_node->untie("tow/connected-to-mp-node");
|
||||
_node->untie("tow/connected-to-ai-node");
|
||||
_node->untie("tow/connected-to-ai-or-mp-id");
|
||||
_node->untie("debug/hitch-height-above-ground");
|
||||
_node->untie("debug/tow-end-height-above-ground");
|
||||
_node->untie("debug/tow-rel-lo-pos");
|
||||
_node->untie("debug/tow-lowest-pos-height");
|
||||
_node->untie("is-slave");
|
||||
_node->untie("speed-in-tow-direction");
|
||||
_node->untie("mp-auto-connect-period");
|
||||
_node->untie("mp-time-lag");
|
||||
|
||||
if (_node)
|
||||
{
|
||||
_node->untie("tow/length");
|
||||
_node->untie("tow/elastic-constant");
|
||||
_node->untie("tow/weight-per-m-kg-m");
|
||||
_node->untie("tow/brake-force");
|
||||
_node->untie("winch/max-speed-m-s");
|
||||
_node->untie("winch/rel-speed");
|
||||
_node->untie("winch/initial-tow-length-m");
|
||||
_node->untie("winch/min-tow-length-m");
|
||||
_node->untie("winch/max-tow-length-m");
|
||||
_node->untie("winch/global-pos-x");
|
||||
_node->untie("winch/global-pos-y");
|
||||
_node->untie("winch/global-pos-z");
|
||||
_node->untie("winch/max-power");
|
||||
_node->untie("winch/max-force");
|
||||
_node->untie("winch/actual-force");
|
||||
_node->untie("tow/end-force-x");
|
||||
_node->untie("tow/end-force-y");
|
||||
_node->untie("tow/end-force-z");
|
||||
_node->untie("force");
|
||||
_node->untie("open");
|
||||
_node->untie("force-is-calculated-by-other");
|
||||
_node->untie("local-pos-x");
|
||||
_node->untie("local-pos-y");
|
||||
_node->untie("local-pos-z");
|
||||
_node->untie("tow/dist");
|
||||
_node->untie("tow/dist-time-lag-corrected");
|
||||
_node->untie("tow/connected-to-property-node");
|
||||
_node->untie("tow/connected-to-mp-node");
|
||||
_node->untie("tow/connected-to-ai-node");
|
||||
_node->untie("tow/connected-to-ai-or-mp-id");
|
||||
_node->untie("debug/hitch-height-above-ground");
|
||||
_node->untie("debug/tow-end-height-above-ground");
|
||||
_node->untie("debug/tow-rel-lo-pos");
|
||||
_node->untie("debug/tow-lowest-pos-height");
|
||||
_node->untie("is-slave");
|
||||
_node->untie("speed-in-tow-direction");
|
||||
_node->untie("mp-auto-connect-period");
|
||||
_node->untie("mp-time-lag");
|
||||
}
|
||||
delete _state;
|
||||
}
|
||||
|
||||
|
|
|
@ -359,12 +359,14 @@ void Rotorgear::setEngineOn(int value)
|
|||
|
||||
void Rotorgear::setRotorEngineMaxRelTorque(float lval)
|
||||
{
|
||||
fgGetNode("/rotors/gear/max-rel-torque", true)->setDoubleValue(lval);
|
||||
SGPropertyNode * node = fgGetNode("/rotors/gear/max-rel-torque", true);
|
||||
if (node) node->setDoubleValue(lval);
|
||||
}
|
||||
|
||||
void Rotorgear::setRotorRelTarget(float lval)
|
||||
{
|
||||
fgGetNode("/rotors/gear/target-rel-rpm", true)->setDoubleValue(lval);
|
||||
SGPropertyNode * node = fgGetNode("/rotors/gear/target-rel-rpm", true);
|
||||
if (node) node->setDoubleValue(lval);
|
||||
}
|
||||
|
||||
void Rotor::setAlpha0(float f)
|
||||
|
@ -1376,10 +1378,10 @@ void Rotorgear::calcForces(float* torqueOut)
|
|||
}
|
||||
float max_torque_of_engine=0;
|
||||
SGPropertyNode * node=fgGetNode("/rotors/gear", true);
|
||||
float target_rel_rpm=node->getDoubleValue("target-rel-rpm",1);
|
||||
float target_rel_rpm=(node==0?1:node->getDoubleValue("target-rel-rpm",1));
|
||||
if (_engineon)
|
||||
{
|
||||
float max_rel_torque=node->getDoubleValue("max-rel-torque",1);
|
||||
float max_rel_torque=(node==0?1: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;
|
||||
|
@ -1473,8 +1475,10 @@ void Rotorgear::compile()
|
|||
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);
|
||||
SGPropertyNode * node = fgGetNode("/rotors/gear/target-rel-rpm", true);
|
||||
if (node) node->setDoubleValue(1);
|
||||
node =fgGetNode("/rotors/gear/max-rel-torque", true);
|
||||
if (node) node->setDoubleValue(1);
|
||||
}
|
||||
|
||||
void Rotorgear::getDownWash(float *pos, float * v_heli, float *downwash)
|
||||
|
|
Loading…
Add table
Reference in a new issue