From cea3b2e4ebcef444dbe626138381df5c184e4d73 Mon Sep 17 00:00:00 2001 From: curt Date: Mon, 8 Apr 2002 19:57:45 +0000 Subject: [PATCH] Added support for sending: - Throttle control position - Mixture control position - Magneto/starter control position Added support for receiving: - Engine state (off, cranking, running) - RPM - Fuel Flow - EGT - Oil Temp - Oil Pressure - Fuel tank quantity - Weight on wheels --- src/FDM/ExternalNet.cxx | 118 +++++++++++++++++++++++++---------- src/Network/native_ctrls.cxx | 8 +-- src/Network/net_fdm.hxx | 24 ++++++- src/Network/raw_ctrls.hxx | 19 ++++-- 4 files changed, 124 insertions(+), 45 deletions(-) diff --git a/src/FDM/ExternalNet.cxx b/src/FDM/ExternalNet.cxx index 509ec54a0..e35683681 100644 --- a/src/FDM/ExternalNet.cxx +++ b/src/FDM/ExternalNet.cxx @@ -65,40 +65,23 @@ static void htond (double &x) static void global2raw( FGRawCtrls *raw ) { int i; -#if 0 - // these can probably get wiped as soon as David spots them. :-) - static const SGPropertyNode *aileron - = fgGetNode("/controls/aileron"); - static const SGPropertyNode *elevator - = fgGetNode("/controls/elevator"); - static const SGPropertyNode *elevator_trim - = fgGetNode("/controls/elevator-trim"); - static const SGPropertyNode *rudder - = fgGetNode("/controls/rudder"); - static const SGPropertyNode *flaps - = fgGetNode("/controls/flaps"); -#endif - - char buf[256]; - // fill in values + SGPropertyNode * node = fgGetNode("/controls", true); raw->version = FG_RAW_CTRLS_VERSION; - raw->aileron = fgGetDouble( "/controls/aileron" ); - raw->elevator = fgGetDouble( "/controls/elevator" ); - raw->elevator_trim = fgGetDouble( "/controls/elevator-trim" ); - raw->rudder = fgGetDouble( "/controls/rudder" ); - raw->flaps = fgGetDouble( "/controls/flaps" ); - for ( i = 0; i < FG_MAX_ENGINES; ++i ) { - sprintf( buf, "/controls/throttle[%d]", i ); - raw->throttle[i] = fgGetDouble( buf ); - sprintf( buf, "/controls/mixture[%d]", i ); - raw->mixture[i] = fgGetDouble( buf ); - sprintf( buf, "/controls/propeller-pitch[%d]", i ); - raw->prop_advance[i] = fgGetDouble( buf ); + raw->aileron = node->getDoubleValue( "aileron" ); + raw->elevator = node->getDoubleValue( "elevator" ); + raw->elevator_trim = node->getDoubleValue( "elevator-trim" ); + raw->rudder = node->getDoubleValue( "rudder" ); + raw->flaps = node->getDoubleValue( "flaps" ); + for ( i = 0; i < FGRawCtrls::FG_MAX_ENGINES; ++i ) { + raw->throttle[i] = node->getDoubleValue( "throttle", i ); + raw->mixture[i] = node->getDoubleValue( "mixture", i ); + raw->prop_advance[i] = node->getDoubleValue( "propeller-pitch", i ); + raw->magnetos[i] = node->getIntValue( "magnetos", i ); + raw->starter[i] = node->getBoolValue( "starter", i ); } - for ( i = 0; i < FG_MAX_WHEELS; ++i ) { - sprintf( buf, "/controls/brakes[%d]", i ); - raw->brake[i] = fgGetDouble( buf ); + for ( i = 0; i < FGRawCtrls::FG_MAX_WHEELS; ++i ) { + raw->brake[i] = node->getDoubleValue( "brakes", i ); } raw->hground = fgGetDouble( "/environment/ground-elevation-m" ); raw->magvar = fgGetDouble("/environment/magnetic-variation-deg"); @@ -111,12 +94,14 @@ static void global2raw( FGRawCtrls *raw ) { htond(raw->elevator_trim); htond(raw->rudder); htond(raw->flaps); - for ( i = 0; i < FG_MAX_ENGINES; ++i ) { + for ( i = 0; i < FGRawCtrls::FG_MAX_ENGINES; ++i ) { htond(raw->throttle[i]); htond(raw->mixture[i]); htond(raw->prop_advance[i]); + htonl(raw->magnetos[i]); + htonl(raw->starter[i]); } - for ( i = 0; i < FG_MAX_WHEELS; ++i ) { + for ( i = 0; i < FGRawCtrls::FG_MAX_WHEELS; ++i ) { htond(raw->brake[i]); } htond(raw->hground); @@ -126,29 +111,56 @@ static void global2raw( FGRawCtrls *raw ) { static void net2global( FGNetFDM *net ) { + int i; + // Convert to the net buffer from network format net->version = ntohl(net->version); + htond(net->longitude); htond(net->latitude); htond(net->altitude); htond(net->phi); htond(net->theta); htond(net->psi); + htond(net->phidot); htond(net->thetadot); htond(net->psidot); htond(net->vcas); htond(net->climb_rate); + htond(net->A_X_pilot); htond(net->A_Y_pilot); htond(net->A_Z_pilot); + + net->num_engines = htonl(net->num_engines); + for ( i = 0; i < net->num_engines; ++i ) { + htonl(net->eng_state[i]); + htond(net->rpm[i]); + htond(net->fuel_flow[i]); + htond(net->EGT[i]); + htond(net->oil_temp[i]); + htond(net->oil_px[i]); + } + + net->num_tanks = htonl(net->num_tanks); + for ( i = 0; i < net->num_tanks; ++i ) { + htond(net->fuel_quantity[i]); + } + + net->num_wheels = htonl(net->num_wheels); + for ( i = 0; i < net->num_wheels; ++i ) { + net->wow[i] = htonl(net->wow[i]); + } + net->cur_time = ntohl(net->cur_time); net->warp = ntohl(net->warp); htond(net->visibility); if ( net->version == FG_NET_FDM_VERSION ) { // cout << "pos = " << net->longitude << " " << net->latitude << endl; - // cout << "sea level rad = " << cur_fdm_state->get_Sea_level_radius() << endl; + // cout << "sea level rad = " << cur_fdm_state->get_Sea_level_radius() + // << endl; cur_fdm_state->_updateGeodeticPosition( net->latitude, net->longitude, net->altitude @@ -164,6 +176,44 @@ static void net2global( FGNetFDM *net ) { cur_fdm_state->_set_Accels_Pilot_Body( net->A_X_pilot, net->A_Y_pilot, net->A_Z_pilot ); + + for ( i = 0; i < net->num_engines; ++i ) { + SGPropertyNode *node = fgGetNode( "engines/engine", i, true ); + + // node->setBoolValue("running", t->isRunning()); + // node->setBoolValue("cranking", t->isCranking()); + + // cout << net->eng_state[i] << endl; + if ( net->eng_state[i] == 0 ) { + node->setBoolValue( "cranking", false ); + node->setBoolValue( "running", false ); + } else if ( net->eng_state[i] == 1 ) { + node->setBoolValue( "cranking", true ); + node->setBoolValue( "running", false ); + } else if ( net->eng_state[i] == 2 ) { + node->setBoolValue( "cranking", false ); + node->setBoolValue( "running", true ); + } + + node->setDoubleValue( "rpm", net->rpm[i] ); + node->setDoubleValue( "fuel-flow-gph", net->fuel_flow[i] ); + node->setDoubleValue( "egt-degf", net->EGT[i] ); + node->setDoubleValue( "oil-temperature-degf", net->oil_temp[i] ); + node->setDoubleValue( "oil-pressure-psi", net->oil_px[i] ); + } + + for (i = 0; i < net->num_tanks; ++i ) { + SGPropertyNode * node + = fgGetNode("/consumables/fuel/tank", i, true); + node->setDoubleValue("level-gal_us", net->fuel_quantity[i] ); + } + + for (i = 0; i < net->num_wheels; ++i ) { + SGPropertyNode * node + = fgGetNode("/gear/gear", i, true); + node->setDoubleValue("wow", net->wow[i] ); + } + /* these are ignored for now ... */ /* if ( net->cur_time ) { diff --git a/src/Network/native_ctrls.cxx b/src/Network/native_ctrls.cxx index 646a1d160..8162efd0f 100644 --- a/src/Network/native_ctrls.cxx +++ b/src/Network/native_ctrls.cxx @@ -66,12 +66,12 @@ static void global2raw( const FGControls *global, FGRawCtrls *raw ) { raw->elevator_trim = globals->get_controls()->get_elevator_trim(); raw->rudder = globals->get_controls()->get_rudder(); raw->flaps = globals->get_controls()->get_flaps(); - for ( i = 0; i < FG_MAX_ENGINES; ++i ) { + for ( i = 0; i < FGRawCtrls::FG_MAX_ENGINES; ++i ) { raw->throttle[i] = globals->get_controls()->get_throttle(i); raw->mixture[i] = globals->get_controls()->get_mixture(i); raw->prop_advance[i] = globals->get_controls()->get_prop_advance(i); } - for ( i = 0; i < FG_MAX_WHEELS; ++i ) { + for ( i = 0; i < FGRawCtrls::FG_MAX_WHEELS; ++i ) { raw->brake[i] = globals->get_controls()->get_brake(i); } @@ -88,12 +88,12 @@ static void raw2global( const FGRawCtrls *raw, FGControls *global ) { globals->get_controls()->set_elevator_trim( raw->elevator_trim ); globals->get_controls()->set_rudder( raw->rudder ); globals->get_controls()->set_flaps( raw->flaps ); - for ( i = 0; i < FG_MAX_ENGINES; ++i ) { + for ( i = 0; i < FGRawCtrls::FG_MAX_ENGINES; ++i ) { globals->get_controls()->set_throttle( i, raw->throttle[i] ); globals->get_controls()->set_mixture( i, raw->mixture[i] ); globals->get_controls()->set_prop_advance( i, raw->prop_advance[i]); } - for ( i = 0; i < FG_MAX_WHEELS; ++i ) { + for ( i = 0; i < FGRawCtrls::FG_MAX_WHEELS; ++i ) { globals->get_controls()->set_brake( i, raw->brake[i] ); } scenery.set_cur_elev( raw->hground ); diff --git a/src/Network/net_fdm.hxx b/src/Network/net_fdm.hxx index cb1aacbae..e8262f021 100644 --- a/src/Network/net_fdm.hxx +++ b/src/Network/net_fdm.hxx @@ -32,7 +32,8 @@ #include // time_t -const int FG_NET_FDM_VERSION = 5; +const int FG_NET_FDM_VERSION = 6; + // Define a structure containing the top level flight dynamics model // parameters @@ -47,6 +48,10 @@ public: // SPARC, which don't like misaligned // data + static const int FG_MAX_ENGINES = 4; + static const int FG_MAX_WHEELS = 3; + static const int FG_MAX_TANKS = 2; + // Positions double longitude; // geodetic (radians) double latitude; // geodetic (radians) @@ -68,6 +73,23 @@ public: double A_Y_pilot; // Y accel in body frame ft/sec^2 double A_Z_pilot; // Z accel in body frame ft/sec^2 + // Engine status + int num_engines; // Number of valid engines + int eng_state[FG_MAX_ENGINES]; // Engine state (off, cranking, running) + double rpm[FG_MAX_ENGINES]; // Engine RPM rev/min + double fuel_flow[FG_MAX_ENGINES]; // Fuel flow gallons/hr + double EGT[FG_MAX_ENGINES]; // Exhuast gas temp deg F + double oil_temp[FG_MAX_ENGINES]; // Oil temp deg F + double oil_px[FG_MAX_ENGINES]; // Oil pressure psi + + // Consumables + int num_tanks; // Max number of fuel tanks + double fuel_quantity[FG_MAX_TANKS]; + + // Gear status + int num_wheels; + bool wow[FG_MAX_WHEELS]; + // Environment time_t cur_time; // current unix time long int warp; // offset in seconds to unix time diff --git a/src/Network/raw_ctrls.hxx b/src/Network/raw_ctrls.hxx index 001a21b59..e39591a10 100644 --- a/src/Network/raw_ctrls.hxx +++ b/src/Network/raw_ctrls.hxx @@ -30,10 +30,8 @@ # error This library requires C++ #endif -const int FG_RAW_CTRLS_VERSION = 4; +const int FG_RAW_CTRLS_VERSION = 5; -const int FG_MAX_ENGINES = 4; -const int FG_MAX_WHEELS = 3; // Define a structure containing the control parameters @@ -43,20 +41,29 @@ public: int version; // increment when data values change - // Controls + static const int FG_MAX_ENGINES = 4; + static const int FG_MAX_WHEELS = 3; + + // Aero controls double aileron; // -1 ... 1 double elevator; // -1 ... 1 double elevator_trim; // -1 ... 1 double rudder; // -1 ... 1 double flaps; // 0 ... 1 + + // Engine controls + int num_engines; // number of valid engines int magnetos[FG_MAX_ENGINES]; - bool starter[FG_MAX_ENGINES]; // true = starter engauged + bool starter[FG_MAX_ENGINES]; // true = starter engauged double throttle[FG_MAX_ENGINES]; // 0 ... 1 double mixture[FG_MAX_ENGINES]; // 0 ... 1 double prop_advance[FG_MAX_ENGINES]; // 0 ... 1 + + // Brake controls + int num_wheels; // number of valid wheels double brake[FG_MAX_WHEELS]; // 0 ... 1 - // Other interesting/useful values + // Other values of use to a remote FDM double hground; // ground elevation (meters) double magvar; // local magnetic variation in degrees. int speedup; // integer speedup multiplier -- 2.39.5