#include "ControlMap.hpp"
#include "Model.hpp"
#include "Wing.hpp"
+#include "Rotor.hpp"
#include "Vector.hpp"
namespace yasim {
class Gear;
+class Hook;
+class Launchbar;
class Thruster;
+class Hitch;
class Airplane {
public:
~Airplane();
void iterate(float dt);
- void consumeFuel(float dt);
+ void calcFuelWeights();
ControlMap* getControlMap();
Model* getModel();
void addVStab(Wing* vstab);
void addFuselage(float* front, float* back, float width,
- float taper=1, float mid=0.5);
+ float taper=1, float mid=0.5,
+ float cx=1, float cy=1, float cz=1, float idrag=1);
int addTank(float* pos, float cap, float fuelDensity);
void addGear(Gear* g);
+ void addHook(Hook* h);
+ void addLaunchbar(Launchbar* l);
void addThruster(Thruster* t, float mass, float* cg);
void addBallast(float* pos, float mass);
+ void addHitch(Hitch* h);
int addWeight(float* pos, float size);
void setWeight(int handle, float mass);
- void setApproach(float speed, float altitude);
- void setApproach(float speed, float altitude, float aoa);
- void setCruise(float speed, float altitude);
+ void setApproach(float speed, float altitude, float aoa, float fuel, float gla);
+ void setCruise(float speed, float altitude, float fuel, float gla);
void setElevatorControl(int control);
void addApproachControl(int control, float val);
void addCruiseControl(int control, float val);
+ void addSolutionWeight(bool approach, int idx, float wgt);
+
int numGear();
Gear* getGear(int g);
-
+ Hook* getHook();
+ int numHitches() { return _hitches.size(); }
+ Hitch* getHitch(int h);
+ Rotorgear* getRotorgear();
+ Launchbar* getLaunchbar();
+
+ int numThrusters() { return _thrusters.size(); }
+ Thruster* getThruster(int n) {
+ return ((ThrustRec*)_thrusters.get(n))->thruster; }
+
int numTanks();
void setFuelFraction(float frac); // 0-1, total amount of fuel
float getFuel(int tank); // in kg!
+ float setFuel(int tank, float fuel); // in kg!
float getFuelDensity(int tank); // kg/m^3
float getTankCapacity(int tank);
float getCruiseAoA();
float getTailIncidence();
float getApproachElevator() { return _approachElevator.val; }
- char* getFailureMsg();
+ const char* getFailureMsg();
+
+ static void setupState(float aoa, float speed, float gla, State* s); // utility
private:
struct Tank { float pos[3]; float cap; float fill;
float density; int handle; };
- struct Fuselage { float front[3], back[3], width, taper, mid; };
+ struct Fuselage { float front[3], back[3], width, taper, mid, _cx, _cy, _cz, _idrag; };
struct GearRec { Gear* gear; Surface* surf; float wgt; };
struct ThrustRec { Thruster* thruster;
int handle; float cg[3]; float mass; };
struct Control { int control; float val; };
struct WeightRec { int handle; Surface* surf; };
+ struct SolveWeight { bool approach; int idx; float wgt; };
+ struct ContactRec { Gear* gear; float p[3]; };
void runCruise();
void runApproach();
- void setupState(float aoa, float speed, State* s);
void solveGear();
void solve();
+ void solveHelicopter();
float compileWing(Wing* w);
+ void compileRotorgear();
float compileFuselage(Fuselage* f);
void compileGear(GearRec* gr);
void applyDragFactor(float factor);
void compileContactPoints();
float normFactor(float f);
void updateGearState();
+ void setupWeights(bool isApproach);
Model _model;
ControlMap _controls;
Vector _contacts; // non-gear ground contact points
Vector _weights;
Vector _surfs; // NON-wing Surfaces
+ Vector _hitches; //for airtow and winch
+
+ Vector _solveWeights;
Vector _cruiseControls;
State _cruiseState;
float _cruiseT;
float _cruiseSpeed;
float _cruiseWeight;
+ float _cruiseFuel;
+ float _cruiseGlideAngle;
Vector _approachControls;
State _approachState;
float _approachSpeed;
float _approachAoA;
float _approachWeight;
+ float _approachFuel;
+ float _approachGlideAngle;
int _solutionIterations;
float _dragFactor;
float _cruiseAoA;
float _tailIncidence;
Control _approachElevator;
- char* _failureMsg;
+ const char* _failureMsg;
};
}; // namespace yasim