#include <Scenery/scenery.hxx>
#include <string>
#include <math.h>
-
+#include <simgear/sg_inlines.h>
using std::string;
#include "ridge_lift.hxx"
-static string CreateIndexedPropertyName(string Property, int index)
-{
- std::stringstream str;
- str << index;
- string tmp;
- str >> tmp;
- return Property + "[" + tmp + "]";
-}
-
-static inline double sign(double x) {
- return x == 0 ? 0 : x > 0 ? 1.0 : -1.0;
-}
-
static const double BOUNDARY1_m = 40.0;
const double FGRidgeLift::dist_probe_m[] = { // in meters
void FGRidgeLift::bind() {
string prop;
+ _tiedProperties.setRoot( fgGetNode("/environment/ridge-lift",true));
for( int i = 0; i < 5; i++ ) {
- prop = CreateIndexedPropertyName("/environment/ridge-lift/probe-elev-m", i );
- fgTie( prop.c_str(), this, i, &FGRidgeLift::get_probe_elev_m); // read-only
-
- prop = CreateIndexedPropertyName("/environment/ridge-lift/probe-lat-deg", i );
- fgTie( prop.c_str(), this, i, &FGRidgeLift::get_probe_lat_deg); // read-only
-
- prop = CreateIndexedPropertyName("/environment/ridge-lift/probe-lon-deg", i );
- fgTie( prop.c_str(), this, i, &FGRidgeLift::get_probe_lon_deg); // read-only
+ _tiedProperties.Tie( "probe-elev-m", i, this, i, &FGRidgeLift::get_probe_elev_m );
+ _tiedProperties.Tie( "probe-lat-deg", i, this, i, &FGRidgeLift::get_probe_lat_deg );
+ _tiedProperties.Tie( "probe-lon-deg", i, this, i, &FGRidgeLift::get_probe_lon_deg );
}
for( int i = 0; i < 4; i++ ) {
- prop = CreateIndexedPropertyName("/environment/ridge-lift/slope", i );
- fgTie( prop.c_str(), this, i, &FGRidgeLift::get_slope); // read-only
+ _tiedProperties.Tie( "slope", i, this, i, &FGRidgeLift::get_slope );
}
}
void FGRidgeLift::unbind() {
- string prop;
-
- for( int i = 0; i < 5; i++ ) {
-
- prop = CreateIndexedPropertyName("/environment/ridge-lift/probe-elev-m", i );
- fgUntie( prop.c_str() );
-
- prop = CreateIndexedPropertyName("/environment/ridge-lift/probe-lat-deg", i );
- fgUntie( prop.c_str() );
-
- prop = CreateIndexedPropertyName("/environment/ridge-lift/probe-lon-deg", i );
- fgUntie( prop.c_str() );
- }
-
- for( int i = 0; i < 4; i++ ) {
- prop = CreateIndexedPropertyName("/environment/ridge-lift/slope", i );
- fgUntie( prop.c_str() );
- }
+ _tiedProperties.Untie();
}
void FGRidgeLift::update(double dt) {
// position is geodetic, need geocentric for advanceRadM
SGGeod myGeodPos = SGGeod::fromDegM( probe_lon_deg[0], probe_lat_deg[0], 20000.0 );
SGGeoc myGeocPos = SGGeoc::fromGeod( myGeodPos );
- double ground_wind_from_rad = _surface_wind_from_deg_node->getDoubleValue() * SG_DEGREES_TO_RADIANS + SG_PI;
+ double ground_wind_from_rad = _surface_wind_from_deg_node->getDoubleValue() * SG_DEGREES_TO_RADIANS;
// compute the remaining probes
- for (int i = 1; i < sizeof(probe_elev_m)/sizeof(probe_elev_m[0]); i++) {
+ for (unsigned i = 1; i < sizeof(probe_elev_m)/sizeof(probe_elev_m[0]); i++) {
SGGeoc probe = myGeocPos.advanceRadM( ground_wind_from_rad, dist_probe_m[i] );
// convert to geodetic position for ground level computation
SGGeod probeGeod = SGGeod::fromGeoc( probe );
slope[2] = (probe_elev_m[2] - probe_elev_m[3]) / dist_probe_m[3];
slope[3] = (probe_elev_m[4] - probe_elev_m[0]) / -dist_probe_m[4];
- for (int i = 0; i < sizeof(slope)/sizeof(slope[0]); i++)
- adj_slope[i] = sin(atan(5.0 * pow ( (fabs(slope[i])),1.7) ) ) *sign(slope[i]);
+ for (unsigned i = 0; i < sizeof(slope)/sizeof(slope[0]); i++)
+ adj_slope[i] = sin(atan(5.0 * pow ( (fabs(slope[i])),1.7) ) ) *SG_SIGN<double>(slope[i]);
//adjustment
adj_slope[0] *= 0.2;
//boundaries
double boundary2_m = 130.0; // in the lift
if (lift_factor < 0.0) { // in the sink
- double highest_probe_temp= max ( probe_elev_m[1], probe_elev_m[2] );
- double highest_probe_downwind_m= max ( highest_probe_temp, probe_elev_m[3] );
+ double highest_probe_temp= std::max ( probe_elev_m[1], probe_elev_m[2] );
+ double highest_probe_downwind_m= std::max ( highest_probe_temp, probe_elev_m[3] );
boundary2_m = highest_probe_downwind_m - probe_elev_m[0];
}
agl_factor = 1.0;
} else {
agl_factor = exp(-(2 + probe_elev_m[0] / 2000) *
- (user_altitude_agl_m - boundary2_m) / max(probe_elev_m[0],200.0));
+ (user_altitude_agl_m - boundary2_m) / std::max(probe_elev_m[0],200.0));
}
double ground_wind_speed_mps = _surface_wind_speed_node->getDoubleValue() * SG_NM_TO_METER / 3600;