1
0
Fork 0

YASim add surface id and export surface positions to prop tree after model compile.

This commit is contained in:
Henning Stahlke 2017-02-16 16:38:54 +01:00
parent dd420c6ff4
commit 021a9db9be
3 changed files with 35 additions and 0 deletions

View file

@ -21,6 +21,7 @@
#include "Rotor.hpp"
#include "Rotorpart.hpp"
#include "Hitch.hpp"
#include "Surface.hpp"
#include "FGFDM.hpp"
@ -118,6 +119,8 @@ Airplane* FGFDM::getAirplane()
void FGFDM::init()
{
//reset id generator, needed on simulator reset/re-init
Surface::resetIDgen();
_turb_magnitude_norm = fgGetNode("/environment/turbulence/magnitude-norm", true);
_turb_rate_hz = fgGetNode("/environment/turbulence/rate-hz", true);

View file

@ -1,10 +1,15 @@
#include <Main/fg_props.hxx>
#include "Math.hpp"
#include "Surface.hpp"
namespace yasim {
int Surface::s_idGenerator = 0;
Surface::Surface( Version * version ) :
_version(version)
{
// create id for surface
_id = s_idGenerator++;
// Start in a "sane" mode, so unset stuff doesn't freak us out
_c0 = 1;
_cx = _cy = _cz = 1;
@ -30,12 +35,21 @@ Surface::Surface( Version * version ) :
_slatAlpha = 0;
_spoilerLift = 1;
_inducedDrag = 1;
_surfN = fgGetNode("/fdm/yasim/surfaces", true);
if (_surfN != 0)
_surfN = _surfN->getChild("surface", _id, true);
}
void Surface::setPosition(float* p)
{
int i;
for(i=0; i<3; i++) _pos[i] = p[i];
if (_surfN != 0) {
_surfN->getNode("pos-x", true)->setFloatValue(p[0]);
_surfN->getNode("pos-y", true)->setFloatValue(p[1]);
_surfN->getNode("pos-z", true)->setFloatValue(p[2]);
}
}
void Surface::getPosition(float* out)
@ -136,7 +150,10 @@ void Surface::setSpoilerParams(float liftPenalty, float dragPenalty)
void Surface::setFlapPos(float pos)
{
if (_flapPos != pos) {
_flapPos = pos;
if (_surfN != 0) _surfN->getNode("flap-pos", true)->setFloatValue(pos);
}
}
void Surface::setFlapEffectiveness(float effectiveness)
@ -152,12 +169,18 @@ double Surface::getFlapEffectiveness()
void Surface::setSlatPos(float pos)
{
if (_slatPos != pos) {
_slatPos = pos;
if (_surfN != 0) _surfN->getNode("slat-pos", true)->setFloatValue(pos);
}
}
void Surface::setSpoilerPos(float pos)
{
if (_spoilerPos != pos) {
_spoilerPos = pos;
if (_surfN != 0) _surfN->getNode("spoiler-pos", true)->setFloatValue(pos);
}
}
// Calculate the aerodynamic force given a wind vector v (in the

View file

@ -1,6 +1,7 @@
#ifndef _SURFACE_HPP
#define _SURFACE_HPP
#include <simgear/props/props.hxx>
#include "Version.hpp"
namespace yasim {
@ -10,9 +11,15 @@ namespace yasim {
// front, and flaps act (in both lift and drag) toward the back.
class Surface
{
static int s_idGenerator;
int _id; //index for property tree
public:
Surface( Version * version );
int getID() { return _id; };
static void resetIDgen() { s_idGenerator = 0; };
// Position of this surface in local coords
void setPosition(float* p);
void getPosition(float* out);
@ -75,6 +82,8 @@ public:
void calcForce(float* v, float rho, float* forceOut, float* torqueOut);
private:
SGPropertyNode_ptr _surfN;
float stallFunc(float* v);
float flapLift(float alpha);
float controlDrag(float lift, float drag);