1
0
Fork 0
flightgear/src/FDM/Balloon.cxx
ehofman 029dda3297 In the process of changing, adding and removing files the last few years
there was the situation where four directories contained jst two files,
of which three directories were aircraft related, and one directory contained
test code from Curt that might be better of in SimGear anyhow.

This is just a patch to move a bunch of files to new locations. In case of
local changes to any of them you can do the following:

move replay.[ch]xx from src/Replay to src/Aircraft
move control.[ch]xx from src/Control to src/Aircraft
move ssgEntityArray.[ch]xx from src/Objects to simgear/screen

In addition it has been decided only to use .[ch]xx files in all directories
unless it's contained within an FDM specific directory, in which case the
author is free to do whatever (s)he wants.

In this repspect the following files have been renamed in src/Multiplayer:

tiny_xdr.[ch]pp has become tiny_xdr.[ch]xx
multiplaymgr.[ch]pp has become multiplaymgr.[ch]xx
2005-11-01 13:41:49 +00:00

209 lines
5.9 KiB
C++

/*****************************************************************************
Module: BalloonSimInterface.cxx
Author: Christian Mayer
Date started: 07.10.99
Called by:
-------- Copyright (C) 1999 Christian Mayer (fgfs@christianmayer.de) --------
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation; either version 2 of the License, or (at your option) any later
version.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
details.
You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place - Suite 330, Boston, MA 02111-1307, USA.
Further information about the GNU General Public License can also be found on
the world wide web at http://www.gnu.org.
FUNCTIONAL DESCRIPTION
------------------------------------------------------------------------------
Interface to the hot air balloon simulator
HISTORY
------------------------------------------------------------------------------
01.09.1999 Christian Mayer Created
*****************************************************************************/
/****************************************************************************/
/* INCLUDES */
/****************************************************************************/
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <simgear/compiler.h>
#ifdef SG_MATH_EXCEPTION_CLASH
# include <math.h>
#endif
#include STL_STRING
#include <simgear/constants.h>
#include <simgear/debug/logstream.hxx>
#include <simgear/math/sg_geodesy.hxx>
#include <simgear/misc/sg_path.hxx>
#include <Aircraft/aircraft.hxx>
#include <Main/globals.hxx>
#include <Main/fg_props.hxx>
#include "Balloon.h"
/****************************************************************************/
/********************************** CODE ************************************/
/****************************************************************************/
FGBalloonSim::FGBalloonSim( double dt ) {
//set the dt of the model
current_balloon.set_dt(dt);
}
FGBalloonSim::~FGBalloonSim() {
}
// Initialize the BalloonSim flight model, dt is the time increment for
// each subsequent iteration through the EOM
void FGBalloonSim::init() {
//do init common to all the FDM's
common_init();
//now do init specific to the Balloon
sgVec3 temp;
SG_LOG( SG_FLIGHT, SG_INFO, "Starting initializing BalloonSim" );
SG_LOG( SG_FLIGHT, SG_INFO, " created a balloon" );
//set position
sgSetVec3( temp,
get_Latitude(),
get_Longitude(),
get_Altitude() * SG_FEET_TO_METER);
current_balloon.setPosition( temp );
//set Euler angles (?)
sgSetVec3( temp,
get_Phi(),
get_Theta(),
get_Psi() );
current_balloon.setHPR( temp );
//set velocities
sgSetVec3( temp,
fgGetDouble("/sim/presets/uBody-fps"),
fgGetDouble("/sim/presets/vBody-fps"),
fgGetDouble("/sim/presets/wBody-fps") );
current_balloon.setVelocity( temp );
SG_LOG( SG_FLIGHT, SG_INFO, "Finished initializing BalloonSim" );
}
// Run an iteration of the EOM (equations of motion)
void FGBalloonSim::update( double dt ) {
double save_alt = 0.0;
if (is_suspended())
return;
int multiloop = _calc_multiloop(dt);
// lets try to avoid really screwing up the BalloonSim model
if ( get_Altitude() < -9000 ) {
save_alt = get_Altitude();
set_Altitude( 0.0 );
}
// set control positions
current_balloon.set_burner_strength ( globals->get_controls()->get_throttle(0) );
//not more implemented yet
// Inform BalloonSim of the local terrain altitude
current_balloon.setGroundLevel ( get_Runway_altitude() * SG_FEET_TO_METER);
// old -- FGInterface_2_JSBsim() not needed except for Init()
// translate FG to JSBsim structure
// FGInterface_2_JSBsim(f);
// printf("FG_Altitude = %.2f\n", FG_Altitude * 0.3048);
// printf("Altitude = %.2f\n", Altitude * 0.3048);
// printf("Radius to Vehicle = %.2f\n", Radius_to_vehicle * 0.3048);
/* FDMExec.GetState()->Setsim_time(State->Getsim_time()
+ State->Getdt() * multiloop); */
for ( int i = 0; i < multiloop; i++ ) {
current_balloon.update();
}
// translate BalloonSim back to FG structure so that the
// autopilot (and the rest of the sim can use the updated
// values
copy_from_BalloonSim();
/*sgVec3 temp, temp2;
current_balloon.getPosition( temp );
current_balloon.getVelocity( temp2 );
SG_LOG( SG_FLIGHT, SG_INFO, "T: " << current_balloon.getTemperature() <<
" alt: " << temp[2] <<
" gr_alt: " << get_Runway_altitude() <<
" burner: " << controls.get_elevator() <<
" v[2]: " << temp2[2]); */
// but lets restore our original bogus altitude when we are done
if ( save_alt < -9000.0 ) {
set_Altitude( save_alt );
}
}
// Convert from the FGInterface struct to the BalloonSim
bool FGBalloonSim::copy_to_BalloonSim() {
return true;
}
// Convert from the BalloonSim to the FGInterface struct
bool FGBalloonSim::copy_from_BalloonSim() {
sgVec3 temp;
// Velocities
current_balloon.getVelocity( temp );
_set_Velocities_Local( temp[0], temp[1], temp[2] );
/* ***FIXME*** */ _set_V_equiv_kts( sgLengthVec3 ( temp ) );
_set_Omega_Body( 0.0, 0.0, 0.0 );
// Positions
current_balloon.getPosition( temp );
//temp[0]: geocentric latitude
//temp[1]: longitude
//temp[2]: altitude (meters)
_updateGeocentricPosition( temp[0], temp[1], temp[2] * SG_METER_TO_FEET );
current_balloon.getHPR( temp );
set_Euler_Angles( temp[0], temp[1], temp[2] );
return true;
}