Refactored dataref manipulation operations to the DataManager class.
This commit is contained in:
551
xpcPlugin/DataManager.cpp
Normal file
551
xpcPlugin/DataManager.cpp
Normal file
@@ -0,0 +1,551 @@
|
|||||||
|
//Copyright (c) 2013-2015 United States Government as represented by the Administrator of the
|
||||||
|
//National Aeronautics and Space Administration. All Rights Reserved.
|
||||||
|
//
|
||||||
|
//X-Plane API
|
||||||
|
//Copyright(c) 2008, Sandy Barbour and Ben Supnik All rights reserved.
|
||||||
|
//Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
|
||||||
|
//associated documentation files(the "Software"), to deal in the Software without restriction,
|
||||||
|
//including without limitation the rights to use, copy, modify, merge, publish, distribute,
|
||||||
|
//sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is
|
||||||
|
//furnished to do so, subject to the following conditions :
|
||||||
|
// * Redistributions of source code must retain the above copyright notice,
|
||||||
|
// this list of conditions and the following disclaimer.
|
||||||
|
// * Neither the names of the authors nor that of X - Plane or Laminar Research
|
||||||
|
// may be used to endorse or promote products derived from this software
|
||||||
|
// without specific prior written permission from the authors or
|
||||||
|
// Laminar Research, respectively.
|
||||||
|
#include "DataManager.h"
|
||||||
|
#include "Log.h"
|
||||||
|
|
||||||
|
#include "XPLMDataAccess.h"
|
||||||
|
#include "XPLMGraphics.h"
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
|
#include <unordered_map>
|
||||||
|
|
||||||
|
namespace XPC
|
||||||
|
{
|
||||||
|
static std::unordered_map<DREF, XPLMDataRef> drefs;
|
||||||
|
static std::unordered_map<DREF, XPLMDataRef> mdrefs[20];
|
||||||
|
static std::unordered_map<std::string, XPLMDataRef> sdrefs;
|
||||||
|
|
||||||
|
void DataManager::Initialize()
|
||||||
|
{
|
||||||
|
drefs = std::unordered_map<DREF, XPLMDataRef>(
|
||||||
|
{
|
||||||
|
{ DREF::None, XPLMFindDataRef("sim/test/test_float") },
|
||||||
|
|
||||||
|
{ DREF::Pause, XPLMFindDataRef("sim/operation/override/override_planepath") },
|
||||||
|
{ DREF::PauseAI, XPLMFindDataRef("sim/operation/override/override_plane_ai_autopilot") },
|
||||||
|
|
||||||
|
{ DREF::TotalRuntime, XPLMFindDataRef("sim/time/total_running_time_sec") },
|
||||||
|
{ DREF::TotalFlighttime, XPLMFindDataRef("sim/time/total_flight_time_sec") },
|
||||||
|
{ DREF::TimerElapsedtime, XPLMFindDataRef("sim/time/timer_elapsed_time_sec") },
|
||||||
|
|
||||||
|
{ DREF::IndicatedAirspeed, XPLMFindDataRef("sim/flightmodel/position/indicated_airspeed") },
|
||||||
|
{ DREF::TrueAirspeed, XPLMFindDataRef("sim/flightmodel/position/true_airspeed") },
|
||||||
|
{ DREF::GroundSpeed, XPLMFindDataRef("sim/flightmodel/position/groundspeed") },
|
||||||
|
|
||||||
|
{ DREF::MachNumber, XPLMFindDataRef("sim/flightmodel/misc/machno") },
|
||||||
|
{ DREF::GForceNormal, XPLMFindDataRef("sim/flightmodel2/misc/gforce_normal") },
|
||||||
|
{ DREF::GForceAxial, XPLMFindDataRef("sim/flightmodel2/misc/gforce_axial") },
|
||||||
|
{ DREF::GForceSide, XPLMFindDataRef("sim/flightmodel2/misc/gforce_side") },
|
||||||
|
|
||||||
|
{ DREF::BarometerSealevelInHg, XPLMFindDataRef("sim/weather/barometer_sealevel_inhg") },
|
||||||
|
{ DREF::TemperaturSealevelC, XPLMFindDataRef("sim/weather/temperature_sealevel_c") },
|
||||||
|
{ DREF::WindSpeedKts, XPLMFindDataRef("sim/cockpit2/gauges/indicators/wind_speed_kts") },
|
||||||
|
|
||||||
|
{ DREF::YokePitch, XPLMFindDataRef("sim/joystick/yoke_pitch_ratio") },
|
||||||
|
{ DREF::YokeRoll, XPLMFindDataRef("sim/joystick/yoke_roll_ratio") },
|
||||||
|
{ DREF::YokeHeading, XPLMFindDataRef("sim/joystick/yoke_heading_ratio") },
|
||||||
|
|
||||||
|
{ DREF::Elevator, XPLMFindDataRef("sim/cockpit2/controls/yoke_pitch_ratio") },
|
||||||
|
{ DREF::Aileron, XPLMFindDataRef("sim/cockpit2/controls/yoke_roll_ratio") },
|
||||||
|
{ DREF::Rudder, XPLMFindDataRef("sim/cockpit2/controls/yoke_heading_ratio") },
|
||||||
|
|
||||||
|
{ DREF::FlapSetting, XPLMFindDataRef("sim/flightmodel/controls/flaprqst") },
|
||||||
|
{ DREF::FlapActual, XPLMFindDataRef("sim/flightmodel/controls/flaprat") },
|
||||||
|
|
||||||
|
{ DREF::GearDeploy, XPLMFindDataRef("sim/aircraft/parts/acf_gear_deploy") },
|
||||||
|
{ DREF::GearHandle, XPLMFindDataRef("sim/cockpit/switches/gear_handle_status") },
|
||||||
|
{ DREF::BrakeParking, XPLMFindDataRef("sim/flightmodel/controls/parkbrakel") },
|
||||||
|
{ DREF::BrakeLeft, XPLMFindDataRef("sim/cockpit2/controls/left_brake_ratio") },
|
||||||
|
{ DREF::BrakeRight, XPLMFindDataRef("sim/cockpit2/controls/right_brake_ratio") },
|
||||||
|
|
||||||
|
{ DREF::M, XPLMFindDataRef("sim/flightmodel/position/M") },
|
||||||
|
{ DREF::L, XPLMFindDataRef("sim/flightmodel/position/L") },
|
||||||
|
{ DREF::N, XPLMFindDataRef("sim/flightmodel/position/N") },
|
||||||
|
|
||||||
|
{ DREF::QRad, XPLMFindDataRef("sim/flightmodel/position/Qrad") },
|
||||||
|
{ DREF::PRad, XPLMFindDataRef("sim/flightmodel/position/Prad") },
|
||||||
|
{ DREF::RRad, XPLMFindDataRef("sim/flightmodel/position/Rrad") },
|
||||||
|
{ DREF::Q, XPLMFindDataRef("sim/flightmodel/position/Q") },
|
||||||
|
{ DREF::P, XPLMFindDataRef("sim/flightmodel/position/P") },
|
||||||
|
{ DREF::R, XPLMFindDataRef("sim/flightmodel/position/R") },
|
||||||
|
|
||||||
|
{ DREF::Pitch, XPLMFindDataRef("sim/flightmodel/position/theta") },
|
||||||
|
{ DREF::Roll, XPLMFindDataRef("sim/flightmodel/position/phi") },
|
||||||
|
{ DREF::HeadingTrue, XPLMFindDataRef("sim/flightmodel/position/psi") },
|
||||||
|
{ DREF::HeadingMag, XPLMFindDataRef("sim/flightmodel/position/magpsi") },
|
||||||
|
{ DREF::Quaternion, XPLMFindDataRef("sim/flightmodel/position/q") },
|
||||||
|
|
||||||
|
{ DREF::AngleOfAttack, XPLMFindDataRef("sim/flightmodel/position/alpha") },
|
||||||
|
{ DREF::Sideslip, XPLMFindDataRef("sim/cockpit2/gauges/indicators/sideslip_degrees") },
|
||||||
|
{ DREF::HPath, XPLMFindDataRef("sim/flightmodel/position/hpath") },
|
||||||
|
{ DREF::VPath, XPLMFindDataRef("sim/flightmodel/position/vpath") },
|
||||||
|
|
||||||
|
{ DREF::VPath, XPLMFindDataRef("sim/flightmodel/position/magnetic_variation") },
|
||||||
|
|
||||||
|
{ DREF::Latitude, XPLMFindDataRef("sim/flightmodel/position/latitude") },
|
||||||
|
{ DREF::Longitude, XPLMFindDataRef("sim/flightmodel/position/longitude") },
|
||||||
|
{ DREF::AGL, XPLMFindDataRef("sim/flightmodel/position/y_agl") },
|
||||||
|
|
||||||
|
{ DREF::LocalX, XPLMFindDataRef("sim/flightmodel/position/local_x") },
|
||||||
|
{ DREF::LocalY, XPLMFindDataRef("sim/flightmodel/position/local_y") },
|
||||||
|
{ DREF::LocalZ, XPLMFindDataRef("sim/flightmodel/position/local_z") },
|
||||||
|
{ DREF::LocalVX, XPLMFindDataRef("sim/flightmodel/position/local_vx") },
|
||||||
|
{ DREF::LocalVY, XPLMFindDataRef("sim/flightmodel/position/local_vy") },
|
||||||
|
{ DREF::LocalVZ, XPLMFindDataRef("sim/flightmodel/position/local_vz") },
|
||||||
|
|
||||||
|
{ DREF::ThrottleSet, XPLMFindDataRef("sim/flightmodel/engine/ENGN_thro") },
|
||||||
|
{ DREF::ThrottleActual, XPLMFindDataRef("sim/flightmodel2/engines/throttle_used_ratio") },
|
||||||
|
|
||||||
|
{ DREF::MP1Lat, XPLMFindDataRef("sim/multiplayer/position/plane1_lat") },
|
||||||
|
{ DREF::MP2Lat, XPLMFindDataRef("sim/multiplayer/position/plane2_lat") },
|
||||||
|
{ DREF::MP3Lat, XPLMFindDataRef("sim/multiplayer/position/plane3_lat") },
|
||||||
|
{ DREF::MP4Lat, XPLMFindDataRef("sim/multiplayer/position/plane4_lat") },
|
||||||
|
{ DREF::MP5Lat, XPLMFindDataRef("sim/multiplayer/position/plane5_lat") },
|
||||||
|
{ DREF::MP6Lat, XPLMFindDataRef("sim/multiplayer/position/plane6_lat") },
|
||||||
|
{ DREF::MP7Lat, XPLMFindDataRef("sim/multiplayer/position/plane7_lat") },
|
||||||
|
|
||||||
|
{ DREF::MP1Lon, XPLMFindDataRef("sim/multiplayer/position/plane1_lon") },
|
||||||
|
{ DREF::MP2Lon, XPLMFindDataRef("sim/multiplayer/position/plane2_lon") },
|
||||||
|
{ DREF::MP3Lon, XPLMFindDataRef("sim/multiplayer/position/plane3_lon") },
|
||||||
|
{ DREF::MP4Lon, XPLMFindDataRef("sim/multiplayer/position/plane4_lon") },
|
||||||
|
{ DREF::MP5Lon, XPLMFindDataRef("sim/multiplayer/position/plane5_lon") },
|
||||||
|
{ DREF::MP6Lon, XPLMFindDataRef("sim/multiplayer/position/plane6_lon") },
|
||||||
|
{ DREF::MP7Lon, XPLMFindDataRef("sim/multiplayer/position/plane7_lon") },
|
||||||
|
|
||||||
|
{ DREF::MP1Alt, XPLMFindDataRef("sim/multiplayer/position/plane1_el") },
|
||||||
|
{ DREF::MP2Alt, XPLMFindDataRef("sim/multiplayer/position/plane2_el") },
|
||||||
|
{ DREF::MP3Alt, XPLMFindDataRef("sim/multiplayer/position/plane3_el") },
|
||||||
|
{ DREF::MP4Alt, XPLMFindDataRef("sim/multiplayer/position/plane4_el") },
|
||||||
|
{ DREF::MP5Alt, XPLMFindDataRef("sim/multiplayer/position/plane5_el") },
|
||||||
|
{ DREF::MP6Alt, XPLMFindDataRef("sim/multiplayer/position/plane6_el") },
|
||||||
|
{ DREF::MP7Alt, XPLMFindDataRef("sim/multiplayer/position/plane7_el") },
|
||||||
|
});
|
||||||
|
|
||||||
|
char multi[256];
|
||||||
|
for (int i = 1; i < 20; i++)
|
||||||
|
{
|
||||||
|
sprintf(multi, "sim/multiplayer/position/plane%i_x", i); // X
|
||||||
|
mdrefs[i][DREF::LocalX] = XPLMFindDataRef(multi);
|
||||||
|
sprintf(multi, "sim/multiplayer/position/plane%i_y", i); // Y
|
||||||
|
mdrefs[i][DREF::LocalY] = XPLMFindDataRef(multi);
|
||||||
|
sprintf(multi, "sim/multiplayer/position/plane%i_z", i); // Z
|
||||||
|
mdrefs[i][DREF::LocalZ] = XPLMFindDataRef(multi);
|
||||||
|
sprintf(multi, "sim/multiplayer/position/plane%i_the", i); // Theta (Pitch)
|
||||||
|
mdrefs[i][DREF::Pitch] = XPLMFindDataRef(multi);
|
||||||
|
sprintf(multi, "sim/multiplayer/position/plane%i_phi", i); // Phi (Roll)
|
||||||
|
mdrefs[i][DREF::Roll] = XPLMFindDataRef(multi);
|
||||||
|
sprintf(multi, "sim/multiplayer/position/plane%i_psi", i); // Psi (Heading-True)
|
||||||
|
mdrefs[i][DREF::HeadingTrue] = XPLMFindDataRef(multi);
|
||||||
|
sprintf(multi, "sim/multiplayer/position/plane%i_gear_deploy", i); // Landing Gear
|
||||||
|
mdrefs[i][DREF::GearDeploy] = XPLMFindDataRef(multi);
|
||||||
|
sprintf(multi, "sim/multiplayer/position/plane%i_flap_ratio", i);
|
||||||
|
mdrefs[i][DREF::FlapSetting] = XPLMFindDataRef(multi); // Can't set the actual flap setting on npc aircraft
|
||||||
|
mdrefs[i][DREF::FlapActual] = XPLMFindDataRef(multi);
|
||||||
|
sprintf(multi, "sim/multiplayer/position/plane%i_flap_ratio2", i);
|
||||||
|
mdrefs[i][DREF::FlapActual2] = XPLMFindDataRef(multi);
|
||||||
|
sprintf(multi, "sim/multiplayer/position/plane%i_spoiler_ratio", i);
|
||||||
|
mdrefs[i][DREF::Spoiler] = XPLMFindDataRef(multi);
|
||||||
|
sprintf(multi, "sim/multiplayer/position/plane%i_speedbrake_ratio", i);
|
||||||
|
mdrefs[i][DREF::BrakeSpeed] = XPLMFindDataRef(multi);
|
||||||
|
sprintf(multi, "sim/multiplayer/position/plane%i_slat_ratio", i);
|
||||||
|
mdrefs[i][DREF::Slats] = XPLMFindDataRef(multi);
|
||||||
|
sprintf(multi, "sim/multiplayer/position/plane%i_wing_sweep", i);
|
||||||
|
mdrefs[i][DREF::Sweep] = XPLMFindDataRef(multi);
|
||||||
|
sprintf(multi, "sim/multiplayer/position/plane%i_throttle", i);
|
||||||
|
mdrefs[i][DREF::ThrottleActual] = XPLMFindDataRef(multi);
|
||||||
|
sprintf(multi, "sim/multiplayer/position/plane%i_yolk_pitch", i);
|
||||||
|
mdrefs[i][DREF::YokePitch] = XPLMFindDataRef(multi);
|
||||||
|
sprintf(multi, "sim/multiplayer/position/plane%i_yolk_roll", i);
|
||||||
|
mdrefs[i][DREF::YokeRoll] = XPLMFindDataRef(multi);
|
||||||
|
sprintf(multi, "sim/multiplayer/position/plane%i_yolk_yaw", i);
|
||||||
|
mdrefs[i][DREF::YokeHeading] = XPLMFindDataRef(multi);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::size_t DataManager::Get(std::string dref, float values[], std::size_t size)
|
||||||
|
{
|
||||||
|
XPLMDataRef& xdref = sdrefs[dref];
|
||||||
|
if (xdref == nullptr)
|
||||||
|
{
|
||||||
|
xdref = XPLMFindDataRef(dref.c_str());
|
||||||
|
}
|
||||||
|
if (!xdref)
|
||||||
|
{
|
||||||
|
// DREF does not exist
|
||||||
|
#if LOG_VERBOSITY > 0
|
||||||
|
Log::WriteLine("[DMAN] ERROR: invalid DREF");
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
XPLMDataTypeID dataType = XPLMGetDataRefTypes(xdref);
|
||||||
|
#if LOG_VERBOSITY > 4
|
||||||
|
Log::FormatLine("[DMAN] Get DREF %s (x:%X) type %i", dref.c_str(), xdref, dataType);
|
||||||
|
#endif
|
||||||
|
switch (dataType)
|
||||||
|
{
|
||||||
|
case 1: // Integer
|
||||||
|
{
|
||||||
|
values[0] = XPLMGetDatai(xdref);
|
||||||
|
#if LOG_VERBOSITY > 4
|
||||||
|
Log::FormatLine(" value was %i", (int)values[0]);
|
||||||
|
#endif
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
case 4: // Double
|
||||||
|
{
|
||||||
|
values[0] = XPLMGetDatad(xdref);
|
||||||
|
#if LOG_VERBOSITY > 4
|
||||||
|
Log::FormatLine(" value was %f", values[0]);
|
||||||
|
#endif
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
case 8: // Float Array
|
||||||
|
{
|
||||||
|
int drefSize = XPLMGetDatavf(xdref, NULL, 0, 0);
|
||||||
|
drefSize = min(drefSize, size);
|
||||||
|
XPLMGetDatavf(xdref, values, 0, drefSize);
|
||||||
|
#if LOG_VERBOSITY > 4
|
||||||
|
Log::FormatLine(" value count was %i", drefSize);
|
||||||
|
#endif
|
||||||
|
return drefSize;
|
||||||
|
}
|
||||||
|
case 16: // Integer Array
|
||||||
|
{
|
||||||
|
int iValues[64];
|
||||||
|
int drefSize = XPLMGetDatavi(xdref, NULL, 0, 0);
|
||||||
|
drefSize = min(drefSize, size);
|
||||||
|
drefSize = min(drefSize, 64);
|
||||||
|
XPLMGetDatavi(xdref, iValues, 0, drefSize);
|
||||||
|
for (int i = 0; i < drefSize; ++i)
|
||||||
|
{
|
||||||
|
values[i] = iValues[i];
|
||||||
|
}
|
||||||
|
#if LOG_VERBOSITY > 4
|
||||||
|
Log::FormatLine(" value count was %i", drefSize);
|
||||||
|
#endif
|
||||||
|
return drefSize;
|
||||||
|
}
|
||||||
|
default: // Assume float
|
||||||
|
{
|
||||||
|
values[0] = XPLMGetDataf(xdref);
|
||||||
|
#if LOG_VERBOSITY > 4
|
||||||
|
Log::FormatLine(" value was %f", values[0]);
|
||||||
|
#endif
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
double DataManager::GetDouble(DREF dref, std::uint8_t aircraft)
|
||||||
|
{
|
||||||
|
const XPLMDataRef& xdref = aircraft == 0 ? drefs[dref] : mdrefs[aircraft][dref];
|
||||||
|
double value = XPLMGetDatad(xdref);
|
||||||
|
#if LOG_VERBOSITY > 4
|
||||||
|
Log::FormatLine("[DMAN] Get DREF %i (x:%X) result %f for a/c %i", dref, xdref, value, aircraft);
|
||||||
|
#endif
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
float DataManager::GetFloat(DREF dref, std::uint8_t aircraft)
|
||||||
|
{
|
||||||
|
const XPLMDataRef& xdref = aircraft == 0 ? drefs[dref] : mdrefs[aircraft][dref];
|
||||||
|
float value = XPLMGetDataf(xdref);
|
||||||
|
#if LOG_VERBOSITY > 4
|
||||||
|
Log::FormatLine("[DMAN] Get DREF %i (x:%X) result %f for a/c %i", dref, xdref, value, aircraft);
|
||||||
|
#endif
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
int DataManager::GetInt(DREF dref, std::uint8_t aircraft)
|
||||||
|
{
|
||||||
|
const XPLMDataRef& xdref = aircraft == 0 ? drefs[dref] : mdrefs[aircraft][dref];
|
||||||
|
int value = XPLMGetDatai(xdref);
|
||||||
|
#if LOG_VERBOSITY > 4
|
||||||
|
Log::FormatLine("[DMAN] Get DREF %i (x:%X) result %i for a/c %i", dref, xdref, value, aircraft);
|
||||||
|
#endif
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::size_t DataManager::GetFloatArray(DREF dref, float values[], std::size_t size, std::uint8_t aircraft)
|
||||||
|
{
|
||||||
|
const XPLMDataRef& xdref = aircraft == 0 ? drefs[dref] : mdrefs[aircraft][dref];
|
||||||
|
int resultSize = XPLMGetDatavf(xdref, values, 0, size);
|
||||||
|
#if LOG_VERBOSITY > 4
|
||||||
|
Log::FormatLine("[DMAN] Get DREF %i (x:%X) result size %i for a/c %i", dref, xdref, resultSize, aircraft);
|
||||||
|
#endif
|
||||||
|
return resultSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::size_t DataManager::GetIntArray(DREF dref, int values[], std::size_t size, std::uint8_t aircraft)
|
||||||
|
{
|
||||||
|
const XPLMDataRef& xdref = aircraft == 0 ? drefs[dref] : mdrefs[aircraft][dref];
|
||||||
|
int resultSize = XPLMGetDatavi(xdref, values, 0, size);
|
||||||
|
#if LOG_VERBOSITY > 4
|
||||||
|
Log::FormatLine("[DMAN] Get DREF %i (x:%X) result size %i for a/c %i", dref, xdref, resultSize, aircraft);
|
||||||
|
#endif
|
||||||
|
return resultSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DataManager::Set(DREF dref, double value, std::uint8_t aircraft)
|
||||||
|
{
|
||||||
|
const XPLMDataRef& xdref = aircraft == 0 ? drefs[dref] : mdrefs[aircraft][dref];
|
||||||
|
#if LOG_VERBOSITY > 4
|
||||||
|
Log::FormatLine("[DMAN] Setting DREF %i (x:%X) to %f for a/c %i", dref, xdref, value, aircraft);
|
||||||
|
#endif
|
||||||
|
XPLMSetDatad(xdref, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DataManager::Set(DREF dref, float value, std::uint8_t aircraft)
|
||||||
|
{
|
||||||
|
const XPLMDataRef& xdref = aircraft == 0 ? drefs[dref] : mdrefs[aircraft][dref];
|
||||||
|
#if LOG_VERBOSITY > 4
|
||||||
|
Log::FormatLine("[DMAN] Set DREF %i (x:%X) to %f for a/c %i", dref, xdref, value, aircraft);
|
||||||
|
#endif
|
||||||
|
XPLMSetDataf(xdref, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DataManager::Set(DREF dref, int value, std::uint8_t aircraft)
|
||||||
|
{
|
||||||
|
const XPLMDataRef& xdref = aircraft == 0 ? drefs[dref] : mdrefs[aircraft][dref];
|
||||||
|
#if LOG_VERBOSITY > 4
|
||||||
|
Log::FormatLine("[DMAN] Set DREF %i (x:%X) to %i for a/c %i", dref, xdref, value, aircraft);
|
||||||
|
#endif
|
||||||
|
XPLMSetDatai(xdref, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DataManager::Set(DREF dref, float values[], std::size_t size, std::uint8_t aircraft)
|
||||||
|
{
|
||||||
|
const XPLMDataRef& xdref = aircraft == 0 ? drefs[dref] : mdrefs[aircraft][dref];
|
||||||
|
#if LOG_VERBOSITY > 4
|
||||||
|
Log::FormatLine("[DMAN] Set DREF %i (x:%X) (%i values) for a/c %i", dref, xdref, size, aircraft);
|
||||||
|
#endif
|
||||||
|
std::size_t drefSize = XPLMGetDatavf(xdref, NULL, 0, 0);
|
||||||
|
drefSize = min(drefSize, size);
|
||||||
|
XPLMSetDatavf(xdref, values, 0, drefSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DataManager::Set(DREF dref, int values[], std::size_t size, std::uint8_t aircraft)
|
||||||
|
{
|
||||||
|
const XPLMDataRef& xdref = aircraft == 0 ? drefs[dref] : mdrefs[aircraft][dref];
|
||||||
|
#if LOG_VERBOSITY > 4
|
||||||
|
Log::FormatLine("[DMAN] Setting DREF %i (x:%X) (%i values) for a/c %i", dref, xdref, size, aircraft);
|
||||||
|
#endif
|
||||||
|
std::size_t drefSize = XPLMGetDatavi(xdref, NULL, 0, 0);
|
||||||
|
drefSize = min(drefSize, size);
|
||||||
|
XPLMSetDatavi(xdref, values, 0, drefSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DataManager::Set(std::string dref, float values[], std::size_t size)
|
||||||
|
{
|
||||||
|
XPLMDataRef& xdref = sdrefs[dref];
|
||||||
|
if (xdref == nullptr)
|
||||||
|
{
|
||||||
|
xdref = XPLMFindDataRef(dref.c_str());
|
||||||
|
}
|
||||||
|
#if LOG_VERBOSITY > 4
|
||||||
|
Log::FormatLine("[DMAN] Setting DREF %s (x:%X) (%i values)", dref.c_str(), xdref, size);
|
||||||
|
#endif
|
||||||
|
if (!xdref)
|
||||||
|
{
|
||||||
|
// DREF does not exist
|
||||||
|
#if LOG_VERBOSITY > 0
|
||||||
|
Log::WriteLine("[DMAN] ERROR: invalid DREF");
|
||||||
|
#endif
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (std::isnan(values[0]))
|
||||||
|
{
|
||||||
|
#if LOG_VERBOSITY > 0
|
||||||
|
Log::WriteLine("[DMAN] ERROR: Value must be a number (NaN received)");
|
||||||
|
#endif
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
XPLMDataTypeID dataType = XPLMGetDataRefTypes(xdref);
|
||||||
|
switch (dataType)
|
||||||
|
{
|
||||||
|
case 1: // Integer
|
||||||
|
{
|
||||||
|
XPLMSetDatai(xdref, (int)values[0]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 4: // Double
|
||||||
|
{
|
||||||
|
XPLMSetDatad(xdref, values[0]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 8: // Float Array
|
||||||
|
{
|
||||||
|
int drefSize = XPLMGetDatavf(xdref, NULL, 0, 0);
|
||||||
|
drefSize = min(drefSize, size);
|
||||||
|
XPLMSetDatavf(xdref, values, 0, drefSize);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 16: // Integer Array
|
||||||
|
{
|
||||||
|
int iValues[64];
|
||||||
|
int drefSize = XPLMGetDatavi(xdref, NULL, 0, 0);
|
||||||
|
drefSize = min(drefSize, size);
|
||||||
|
drefSize = min(drefSize, 64);
|
||||||
|
for (int i = 0; i < drefSize; ++i)
|
||||||
|
{
|
||||||
|
iValues[i] = (int)values[i];
|
||||||
|
}
|
||||||
|
XPLMSetDatavi(xdref, iValues, 0, drefSize);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: // Assume float
|
||||||
|
{
|
||||||
|
XPLMSetDataf(xdref, values[0]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DataManager::SetGear(float gear, bool immediate, std::uint8_t aircraft)
|
||||||
|
{
|
||||||
|
#if LOG_VERBOSITY > 3
|
||||||
|
Log::FormatLine("[DMAN] Setting gear (value:%f, immediate:%i) for aircraft %i", gear, immediate, aircraft);
|
||||||
|
#endif
|
||||||
|
float gearArray[10];
|
||||||
|
|
||||||
|
if ((gear < -8.5f && gear > 9.5f) || (gear < -997.9f && gear > -999.1f))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (std::isnan(gear) || gear < 0 || gear > 1)
|
||||||
|
{
|
||||||
|
Log::WriteLine("[GEAR] ERROR: Value must be 0 or 1");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < 10; i++)
|
||||||
|
{
|
||||||
|
gearArray[i] = gear;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (aircraft == 0) // Own aircraft
|
||||||
|
{
|
||||||
|
Set(DREF::GearHandle, (int)gear);
|
||||||
|
if (immediate)
|
||||||
|
{
|
||||||
|
Set(DREF::GearDeploy, gearArray, 10);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else // Multiplayer aircraft
|
||||||
|
{
|
||||||
|
XPLMSetDatavf(mdrefs[aircraft][DREF::GearDeploy], gearArray, 0, 10);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DataManager::SetPosition(float pos[3], std::uint8_t aircraft)
|
||||||
|
{
|
||||||
|
#if LOG_VERBOSITY > 3
|
||||||
|
Log::FormatLine("[DMAN] Setting position (%f, %f, %f) for aircraft %i", pos[0], pos[1], pos[2], aircraft);
|
||||||
|
#endif
|
||||||
|
if (std::isnan(pos[0] + pos[1] + pos[2]))
|
||||||
|
{
|
||||||
|
#if LOG_VERBOSITY > 0
|
||||||
|
Log::WriteLine("[DMAN] ERROR: Position must be a number (NaN received)");
|
||||||
|
#endif
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
double local[3] = { 0 };
|
||||||
|
XPLMWorldToLocal(pos[0], pos[1], pos[2], &local[0], &local[1], &local[2]);
|
||||||
|
if (aircraft == 0) // Player aircraft
|
||||||
|
{
|
||||||
|
// If the sim is paused, setting global position won't update the
|
||||||
|
// local position, so set them just in case.
|
||||||
|
Set(DREF::LocalX, local[0]);
|
||||||
|
Set(DREF::LocalY, local[1]);
|
||||||
|
Set(DREF::LocalZ, local[2]);
|
||||||
|
// If the sim is unpaused, this will override the above settings.
|
||||||
|
Set(DREF::Latitude, (double)pos[0]);
|
||||||
|
Set(DREF::Longitude, (double)pos[1]);
|
||||||
|
Set(DREF::AGL, (double)pos[2]);
|
||||||
|
}
|
||||||
|
else // Multiplayer
|
||||||
|
{
|
||||||
|
XPLMSetDatad(mdrefs[aircraft][DREF::LocalX], local[0]);
|
||||||
|
XPLMSetDatad(mdrefs[aircraft][DREF::LocalY], local[1]);
|
||||||
|
XPLMSetDatad(mdrefs[aircraft][DREF::LocalZ], local[2]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DataManager::SetOrientation(float orient[3], std::uint8_t aircraft)
|
||||||
|
{
|
||||||
|
#if LOG_VERBOSITY > 3
|
||||||
|
Log::FormatLine("[DMAN] Setting orientation (%f, %f, %f) for aircraft %i",
|
||||||
|
orient[0], orient[1], orient[2], aircraft);
|
||||||
|
#endif
|
||||||
|
if (std::isnan(orient[0] + orient[1] + orient[2]))
|
||||||
|
{
|
||||||
|
#if LOG_VERBOSITY > 0
|
||||||
|
Log::WriteLine("[DMAN] ERROR: Orientation must be a number (NaN received)");
|
||||||
|
#endif
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (aircraft == 0) // Player aircraft
|
||||||
|
{
|
||||||
|
// If the sim is paused, setting the quaternion won't update these values,
|
||||||
|
// so we set them here just in case.
|
||||||
|
Set(DREF::Pitch, orient[0]);
|
||||||
|
Set(DREF::Roll, orient[1]);
|
||||||
|
Set(DREF::HeadingTrue, orient[2]);
|
||||||
|
|
||||||
|
// Convert to Quaternions
|
||||||
|
// from: http://www.xsquawkbox.net/xpsdk/mediawiki/MovingThePlane
|
||||||
|
// http://ntrs.nasa.gov/archive/nasa/casi.ntrs.nasa.gov/19770024290.pdf
|
||||||
|
float q[4] = { 0 };
|
||||||
|
float halfRad = 0.00872664625997F;
|
||||||
|
orient[2] = halfRad * orient[2];
|
||||||
|
orient[0] = halfRad * orient[0];
|
||||||
|
orient[1] = halfRad * orient[1];
|
||||||
|
q[0] = cos(orient[2]) * cos(orient[0]) * cos(orient[1]) + sin(orient[2]) * sin(orient[0]) * sin(orient[1]);
|
||||||
|
q[1] = cos(orient[2]) * cos(orient[0]) * sin(orient[1]) - sin(orient[2]) * sin(orient[0]) * cos(orient[1]);
|
||||||
|
q[2] = cos(orient[2]) * sin(orient[0]) * cos(orient[1]) + sin(orient[2]) * cos(orient[0]) * sin(orient[1]);
|
||||||
|
q[3] = sin(orient[2]) * cos(orient[0]) * cos(orient[1]) - cos(orient[2]) * sin(orient[0]) * sin(orient[1]);
|
||||||
|
|
||||||
|
// If the sim is un-paused, this will overwrite the pitch/roll/yaw
|
||||||
|
// values set above.
|
||||||
|
Set(DREF::Quaternion, q, 4);
|
||||||
|
}
|
||||||
|
else // Multiplayer
|
||||||
|
{
|
||||||
|
XPLMSetDataf(mdrefs[aircraft][DREF::Pitch], orient[0]);
|
||||||
|
XPLMSetDataf(mdrefs[aircraft][DREF::Roll], orient[1]);
|
||||||
|
XPLMSetDataf(mdrefs[aircraft][DREF::HeadingTrue], orient[2]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DataManager::SetFlaps(float value)
|
||||||
|
{
|
||||||
|
if (std::isnan(value))
|
||||||
|
{
|
||||||
|
Log::WriteLine("[FLAP] ERROR: Value must be a number (NaN received)");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
value = max(value, 0);
|
||||||
|
value = min(value, 1);
|
||||||
|
|
||||||
|
Set(DREF::FlapSetting, value);
|
||||||
|
Set(DREF::FlapActual, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
176
xpcPlugin/DataManager.h
Normal file
176
xpcPlugin/DataManager.h
Normal file
@@ -0,0 +1,176 @@
|
|||||||
|
//Copyright (c) 2013-2015 United States Government as represented by the Administrator of the
|
||||||
|
//National Aeronautics and Space Administration. All Rights Reserved.
|
||||||
|
#ifndef XPC_DATAMANAGER_H
|
||||||
|
#define XPC_DATAMANAGER_H
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace XPC
|
||||||
|
{
|
||||||
|
enum class DREF
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
|
||||||
|
Pause,
|
||||||
|
PauseAI,
|
||||||
|
|
||||||
|
// Times
|
||||||
|
TotalRuntime = 100,
|
||||||
|
TotalFlighttime,
|
||||||
|
TimerElapsedtime,
|
||||||
|
|
||||||
|
// Velocities
|
||||||
|
IndicatedAirspeed = 300,
|
||||||
|
TrueAirspeed,
|
||||||
|
GroundSpeed,
|
||||||
|
|
||||||
|
// Mach, VVI, G-loads
|
||||||
|
MachNumber = 400,
|
||||||
|
GForceNormal,
|
||||||
|
GForceAxial,
|
||||||
|
GForceSide,
|
||||||
|
|
||||||
|
// Atmosphere: Weather
|
||||||
|
BarometerSealevelInHg = 500,
|
||||||
|
TemperaturSealevelC,
|
||||||
|
WindSpeedKts,
|
||||||
|
|
||||||
|
// Joystick
|
||||||
|
YokePitch = 800,
|
||||||
|
YokeRoll,
|
||||||
|
YokeHeading,
|
||||||
|
|
||||||
|
// Control Surfaces
|
||||||
|
Elevator = 1100,
|
||||||
|
Aileron,
|
||||||
|
Rudder,
|
||||||
|
|
||||||
|
// Flaps
|
||||||
|
FlapSetting = 1300,
|
||||||
|
FlapActual,
|
||||||
|
|
||||||
|
// Gear & Brakes
|
||||||
|
GearDeploy = 1400,
|
||||||
|
GearHandle,
|
||||||
|
BrakeParking,
|
||||||
|
BrakeLeft,
|
||||||
|
BrakeRight,
|
||||||
|
|
||||||
|
// MNR (Angular Moments)
|
||||||
|
M = 1500,
|
||||||
|
L,
|
||||||
|
N,
|
||||||
|
|
||||||
|
//PQR (Angular Velocities)
|
||||||
|
QRad = 1600,
|
||||||
|
PRad,
|
||||||
|
RRad,
|
||||||
|
Q,
|
||||||
|
P,
|
||||||
|
R,
|
||||||
|
|
||||||
|
// Orientation: pitch, roll, yaw, heading
|
||||||
|
Pitch = 1700,
|
||||||
|
Roll,
|
||||||
|
HeadingTrue,
|
||||||
|
HeadingMag,
|
||||||
|
Quaternion,
|
||||||
|
|
||||||
|
// Orientation: alpha beta hpath vpath slip
|
||||||
|
AngleOfAttack = 1800,
|
||||||
|
Sideslip,
|
||||||
|
HPath,
|
||||||
|
VPath,
|
||||||
|
|
||||||
|
MagneticVariation = 1901,
|
||||||
|
|
||||||
|
// Global Position
|
||||||
|
Latitude = 2000,
|
||||||
|
Longitude,
|
||||||
|
AGL,
|
||||||
|
|
||||||
|
// Local Postion & Velocity
|
||||||
|
LocalX = 2100,
|
||||||
|
LocalY,
|
||||||
|
LocalZ,
|
||||||
|
LocalVX,
|
||||||
|
LocalVY,
|
||||||
|
LocalVZ,
|
||||||
|
|
||||||
|
ThrottleSet = 2200,
|
||||||
|
ThrottleActual = 2300,
|
||||||
|
|
||||||
|
// Multiplayer Aircraft
|
||||||
|
FlapActual2,
|
||||||
|
Spoiler,
|
||||||
|
BrakeSpeed,
|
||||||
|
Sweep,
|
||||||
|
Slats,
|
||||||
|
|
||||||
|
// Mulitplayer positon
|
||||||
|
MP1Lat,
|
||||||
|
MP2Lat,
|
||||||
|
MP3Lat,
|
||||||
|
MP4Lat,
|
||||||
|
MP5Lat,
|
||||||
|
MP6Lat,
|
||||||
|
MP7Lat,
|
||||||
|
|
||||||
|
MP1Lon,
|
||||||
|
MP2Lon,
|
||||||
|
MP3Lon,
|
||||||
|
MP4Lon,
|
||||||
|
MP5Lon,
|
||||||
|
MP6Lon,
|
||||||
|
MP7Lon,
|
||||||
|
|
||||||
|
MP1Alt,
|
||||||
|
MP2Alt,
|
||||||
|
MP3Alt,
|
||||||
|
MP4Alt,
|
||||||
|
MP5Alt,
|
||||||
|
MP6Alt,
|
||||||
|
MP7Alt,
|
||||||
|
};
|
||||||
|
|
||||||
|
class DataManager
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static void Initialize();
|
||||||
|
|
||||||
|
static std::size_t Get(std::string dref, float values[], std::size_t size);
|
||||||
|
|
||||||
|
static double GetDouble(DREF dref, std::uint8_t aircraft = 0);
|
||||||
|
|
||||||
|
static float GetFloat(DREF dref, std::uint8_t aircraft = 0);
|
||||||
|
|
||||||
|
static int GetInt(DREF dref, std::uint8_t aircraft = 0);
|
||||||
|
|
||||||
|
static std::size_t GetFloatArray(DREF dref, float values[], std::size_t size, std::uint8_t aircraft = 0);
|
||||||
|
|
||||||
|
static std::size_t GetIntArray(DREF dref, int values[], std::size_t size, std::uint8_t aircraft = 0);
|
||||||
|
|
||||||
|
static void Set(DREF dref, double value, std::uint8_t aircraft = 0);
|
||||||
|
|
||||||
|
static void Set(DREF dref, float value, std::uint8_t aircraft = 0);
|
||||||
|
|
||||||
|
static void Set(DREF dref, int value, std::uint8_t aircraft = 0);
|
||||||
|
|
||||||
|
static void Set(DREF dref, float values[], std::size_t size, std::uint8_t aircraft = 0);
|
||||||
|
|
||||||
|
static void Set(DREF dref, int values[], std::size_t size, std::uint8_t aircraft = 0);
|
||||||
|
|
||||||
|
static void Set(std::string dref, float values[], std::size_t size);
|
||||||
|
|
||||||
|
static void SetGear(float gear, bool immediate, std::uint8_t aircraft = 0);
|
||||||
|
|
||||||
|
static void SetPosition(float pos[3], std::uint8_t aircraft = 0);
|
||||||
|
|
||||||
|
static void SetOrientation(float orient[3], std::uint8_t aircraft = 0);
|
||||||
|
|
||||||
|
static void SetFlaps(float value);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
80
xpcPlugin/DataMaps.cpp
Normal file
80
xpcPlugin/DataMaps.cpp
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
//Copyright (c) 2013-2015 United States Government as represented by the Administrator of the
|
||||||
|
//National Aeronautics and Space Administration. All Rights Reserved.
|
||||||
|
#include "DataManager.h"
|
||||||
|
|
||||||
|
namespace XPC
|
||||||
|
{
|
||||||
|
DREF XPData[134][8]
|
||||||
|
{
|
||||||
|
{}, // Row 0: Frame Rates
|
||||||
|
{ // Row 1: Times
|
||||||
|
DREF::None, DREF::TotalRuntime, DREF::TotalFlighttime, DREF::TimerElapsedtime,
|
||||||
|
},
|
||||||
|
{}, // Row 2: Sim stats
|
||||||
|
{ // Row 3: Velocities
|
||||||
|
DREF::IndicatedAirspeed, DREF::None, DREF::TrueAirspeed, DREF::GroundSpeed
|
||||||
|
},
|
||||||
|
{ // Row 4: Mach, VVI, G-Loads
|
||||||
|
DREF::MachNumber, DREF::None, DREF::None, DREF::None,
|
||||||
|
DREF::GForceNormal, DREF::GForceAxial, DREF::GForceSide
|
||||||
|
},
|
||||||
|
{ // Row 5: Atmosphere: Weather
|
||||||
|
DREF::BarometerSealevelInHg, DREF::TemperaturSealevelC, DREF::None, DREF::WindSpeedKts
|
||||||
|
},
|
||||||
|
{}, // Row 6: Atmosphere: Aircraft
|
||||||
|
{}, // Row 7: System Pressures
|
||||||
|
{ // Row 8: Joystick
|
||||||
|
DREF::YokePitch, DREF::YokeRoll, DREF::YokeHeading
|
||||||
|
},
|
||||||
|
{}, // Row 9: Other Flight Controls
|
||||||
|
{}, // Row 10: Art stab ail/elv/rud
|
||||||
|
{ // Row 11: Control Surfaces
|
||||||
|
DREF::Elevator, DREF::Aileron, DREF::Rudder
|
||||||
|
},
|
||||||
|
{}, // Row 12: Wing Sweep/Trust Vec
|
||||||
|
{ // Row 13: trip/flap/slat/s-brakes
|
||||||
|
DREF::None, DREF::None, DREF::None, DREF::FlapSetting, DREF::FlapActual
|
||||||
|
},
|
||||||
|
{ // Row 14: Gear, Braks
|
||||||
|
DREF::GearDeploy, DREF::BrakeParking, DREF::BrakeLeft, DREF::BrakeRight,
|
||||||
|
DREF::None, DREF::None, DREF::None,
|
||||||
|
DREF::GearHandle
|
||||||
|
},
|
||||||
|
{ // Row 15: MNR (Angular Moments)
|
||||||
|
DREF::M, DREF::L, DREF::N
|
||||||
|
},
|
||||||
|
{ // Row 16: PQR (Angular Velocities)
|
||||||
|
DREF::QRad, DREF::PRad, DREF::RRad, DREF::Q, DREF::P, DREF::R
|
||||||
|
},
|
||||||
|
{ // Row 17: Orientation: pitch, roll, yaw, heading
|
||||||
|
DREF::Pitch, DREF::Roll, DREF::HeadingTrue, DREF::HeadingMag, DREF::Quaternion
|
||||||
|
},
|
||||||
|
{ // Row 18: Orientation: alpha beta hpath vpath slip
|
||||||
|
DREF::AngleOfAttack, DREF::Sideslip, DREF::HPath, DREF::VPath, DREF::Sideslip
|
||||||
|
},
|
||||||
|
{ // Row 19: Mag Compass
|
||||||
|
DREF::HeadingMag, DREF::MagneticVariation
|
||||||
|
},
|
||||||
|
{ // Row 20: Global Position
|
||||||
|
DREF::Latitude, DREF::Longitude, DREF::AGL
|
||||||
|
},
|
||||||
|
{ // Row 21: Local Position, Velocity
|
||||||
|
DREF::LocalX, DREF::LocalY, DREF::LocalZ, DREF::LocalVX, DREF::LocalVY, DREF::LocalVZ
|
||||||
|
},
|
||||||
|
{ // Row 22: All Planes: Lat
|
||||||
|
DREF::Latitude, DREF::MP1Lat, DREF::MP2Lat, DREF::MP3Lat, DREF::MP4Lat, DREF::MP5Lat, DREF::MP6Lat, DREF::MP7Lat
|
||||||
|
},
|
||||||
|
{ // Row 23: All Planes: Lon
|
||||||
|
DREF::Longitude, DREF::MP1Lon, DREF::MP2Lon, DREF::MP3Lon, DREF::MP4Lon, DREF::MP5Lon, DREF::MP6Lon, DREF::MP7Lon
|
||||||
|
},
|
||||||
|
{ // Row 24: All Planes: Alt
|
||||||
|
DREF::AGL, DREF::MP1Alt, DREF::MP2Alt, DREF::MP3Alt, DREF::MP4Alt, DREF::MP5Alt, DREF::MP6Alt, DREF::MP7Alt
|
||||||
|
},
|
||||||
|
{ // Row 25: Throttle Command
|
||||||
|
DREF::ThrottleSet
|
||||||
|
},
|
||||||
|
{ // Row 26: Throttle Actual
|
||||||
|
DREF::ThrottleActual
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
12
xpcPlugin/DataMaps.h
Normal file
12
xpcPlugin/DataMaps.h
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
//Copyright (c) 2013-2015 United States Government as represented by the Administrator of the
|
||||||
|
//National Aeronautics and Space Administration. All Rights Reserved.
|
||||||
|
#ifndef XPC_DATAMAPS_H
|
||||||
|
#define XPC_DATAMAPS_H
|
||||||
|
#include "DataManager.h"
|
||||||
|
|
||||||
|
namespace XPC
|
||||||
|
{
|
||||||
|
extern DREF XPData[134][8];
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
#define XPC_LOG_H
|
#define XPC_LOG_H
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#define LOG_VERBOSITY 2
|
#define LOG_VERBOSITY 999
|
||||||
|
|
||||||
namespace XPC
|
namespace XPC
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -72,17 +72,17 @@ namespace XPC
|
|||||||
Log::WriteLine(ss.str());
|
Log::WriteLine(ss.str());
|
||||||
|
|
||||||
ss.str("");
|
ss.str("");
|
||||||
ss << "[" << GetHead() << "-DEBUG](" << buffer[4] << ")";
|
ss << "[" << GetHead() << "-DEBUG] (" << GetSize() << ")";
|
||||||
switch (GetMagicNumber())
|
switch (GetMagicNumber()) // Binary version of head
|
||||||
{
|
{
|
||||||
case 0x434F4E4E: // CONN
|
case 0x4E4EF443: // CONN
|
||||||
case 0x57595054: // WYPT
|
case 0x54505957: // WYPT
|
||||||
case 0x54455854: // TEXT
|
case 0x54584554: // TEXT
|
||||||
{
|
{
|
||||||
Log::WriteLine(ss.str());
|
Log::WriteLine(ss.str());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 0x4354524C: // CTRL
|
case 0x4C525443: // CTRL
|
||||||
{
|
{
|
||||||
xpcCtrl ctrl = parseCTRL((char*)buffer);
|
xpcCtrl ctrl = parseCTRL((char*)buffer);
|
||||||
ss << " (" << ctrl.pitch << " " << ctrl.roll << " " << ctrl.yaw << ") ";
|
ss << " (" << ctrl.pitch << " " << ctrl.roll << " " << ctrl.yaw << ") ";
|
||||||
@@ -90,7 +90,7 @@ namespace XPC
|
|||||||
Log::WriteLine(ss.str());
|
Log::WriteLine(ss.str());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 0x44415441: // DATA
|
case 0x41544144: // DATA
|
||||||
{
|
{
|
||||||
float dataRef[30][9];
|
float dataRef[30][9];
|
||||||
short numCols = parseDATA((char*)buffer, size, dataRef);
|
short numCols = parseDATA((char*)buffer, size, dataRef);
|
||||||
@@ -108,7 +108,7 @@ namespace XPC
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 0x44524546: // DREF
|
case 0x46455244: // DREF
|
||||||
{
|
{
|
||||||
Log::WriteLine(ss.str());
|
Log::WriteLine(ss.str());
|
||||||
std::string dref((char*)buffer + 6, buffer[5]);
|
std::string dref((char*)buffer + 6, buffer[5]);
|
||||||
@@ -123,19 +123,19 @@ namespace XPC
|
|||||||
Log::WriteLine(ss.str());
|
Log::WriteLine(ss.str());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 0x47455444: // GETD
|
case 0x44544547: // GETD
|
||||||
{
|
{
|
||||||
Log::WriteLine(ss.str());
|
Log::WriteLine(ss.str());
|
||||||
int cur = 6;
|
int cur = 6;
|
||||||
for (int i = 0; i < buffer[5]; ++i)
|
for (int i = 0; i < buffer[5]; ++i)
|
||||||
{
|
{
|
||||||
std::string dref((char*)buffer + cur + 1, buffer[cur]);
|
std::string dref((char*)buffer + cur + 1, buffer[cur]);
|
||||||
Log::FormatLine("\t#%i/%i (size:%i) %s", i + 1, buffer[5], dref.length(), dref);
|
Log::FormatLine("\t#%i/%i (size:%i) %s", i + 1, buffer[5], dref.length(), dref.c_str());
|
||||||
cur += 1 + buffer[cur];
|
cur += 1 + buffer[cur];
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 0x504F5349: // POSI
|
case 0x49534F50: // POSI
|
||||||
{
|
{
|
||||||
float position[6] = { 0.0 };
|
float position[6] = { 0.0 };
|
||||||
short aircraft = 0;
|
short aircraft = 0;
|
||||||
@@ -148,15 +148,15 @@ namespace XPC
|
|||||||
Log::WriteLine(ss.str());
|
Log::WriteLine(ss.str());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 0x53494D55: // SIMU
|
case 0x554D4953: // SIMU
|
||||||
{
|
{
|
||||||
ss << ' ' << buffer[5];
|
ss << ' ' << (int)buffer[5];
|
||||||
Log::WriteLine(ss.str());
|
Log::WriteLine(ss.str());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
ss << " UNKNOWN HEADER";
|
ss << " UNKNOWN HEADER ";
|
||||||
Log::WriteLine(ss.str());
|
Log::WriteLine(ss.str());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -62,6 +62,8 @@
|
|||||||
|
|
||||||
// XPC Includes
|
// XPC Includes
|
||||||
#include "Log.h"
|
#include "Log.h"
|
||||||
|
#include "DataManager.h"
|
||||||
|
#include "DataMaps.h"
|
||||||
#include "Drawing.h"
|
#include "Drawing.h"
|
||||||
#include "Message.h"
|
#include "Message.h"
|
||||||
#include "UDPSocket.h"
|
#include "UDPSocket.h"
|
||||||
@@ -88,7 +90,6 @@
|
|||||||
#define SENDPORT 49097 // Port that the plugin sends on
|
#define SENDPORT 49097 // Port that the plugin sends on
|
||||||
#define OPS_PER_CYCLE 20 // Max Number of operations per cycle
|
#define OPS_PER_CYCLE 20 // Max Number of operations per cycle
|
||||||
|
|
||||||
static XPLMDataRef XPLMSwitch; // for turning on/off simulation
|
|
||||||
XPC::UDPSocket* recvSocket = nullptr;
|
XPC::UDPSocket* recvSocket = nullptr;
|
||||||
XPC::UDPSocket* sendSocket = nullptr;
|
XPC::UDPSocket* sendSocket = nullptr;
|
||||||
|
|
||||||
@@ -109,7 +110,7 @@ struct connectionHistory
|
|||||||
unsigned short recPort;
|
unsigned short recPort;
|
||||||
unsigned short fromPort;
|
unsigned short fromPort;
|
||||||
short requestLength;
|
short requestLength;
|
||||||
XPLMDataRef XPLMRequestedDRefs[100];
|
std::string XPLMRequestedDRefs[100];
|
||||||
};
|
};
|
||||||
|
|
||||||
connectionHistory connectionList[MAXCONN];
|
connectionHistory connectionList[MAXCONN];
|
||||||
@@ -133,11 +134,6 @@ int handleDATA(char *buf, int buflen);
|
|||||||
int handleTEXT(char *buf, int len);
|
int handleTEXT(char *buf, int len);
|
||||||
short handleInput(XPC::Message& msg);
|
short handleInput(XPC::Message& msg);
|
||||||
|
|
||||||
char setPOSI(short aircraft, float pos[3]);
|
|
||||||
char setORIENT(short aircraft, float orient[3]);
|
|
||||||
char setDREF(XPLMDataRef theDREF, float floatarray[], short arrayStart, short arraySize);
|
|
||||||
char setGEAR(short aircraft, float gear, char posi);
|
|
||||||
char setFLAP(float flap);
|
|
||||||
void sendBUF(char buf[], int buflen);
|
void sendBUF(char buf[], int buflen);
|
||||||
|
|
||||||
PLUGIN_API int XPluginStart( char * outName,
|
PLUGIN_API int XPluginStart( char * outName,
|
||||||
@@ -168,12 +164,7 @@ PLUGIN_API int XPluginStart( char * outName,
|
|||||||
1000000000.0;
|
1000000000.0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
XPC::DataManager::Initialize();
|
||||||
// Build the DataRef Array
|
|
||||||
buildXPLMDataRefs();
|
|
||||||
|
|
||||||
//On/Off Switch for simulation
|
|
||||||
XPLMSwitch = XPLMFindDataRef("sim/operation/override/override_planepath");
|
|
||||||
|
|
||||||
XPLMRegisterFlightLoopCallback(
|
XPLMRegisterFlightLoopCallback(
|
||||||
MyFlightLoopCallback, /* Callback */
|
MyFlightLoopCallback, /* Callback */
|
||||||
@@ -470,7 +461,8 @@ int handleSIMU(char buf[])
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
XPLMSetDatavi(XPLMSwitch, SIMUArray, 0, 1);
|
int value = buf[5];
|
||||||
|
XPC::DataManager::Set(XPC::DREF::Pause, &value, 1);
|
||||||
|
|
||||||
if (buf[5] == 0)
|
if (buf[5] == 0)
|
||||||
{
|
{
|
||||||
@@ -509,197 +501,6 @@ int handleTEXT(char *buf, int len)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
char setDREF(XPLMDataRef theDREF, float floatarray[], short arrayStart, short arraySize)
|
|
||||||
{
|
|
||||||
XPLMDataTypeID dataType;
|
|
||||||
short i=arrayStart;
|
|
||||||
|
|
||||||
if ((floatarray[i]<-997.5 && floatarray[i]>-999.5))
|
|
||||||
{
|
|
||||||
return 0; // Do not change
|
|
||||||
}
|
|
||||||
|
|
||||||
if (theDREF == XPLMDataRefs[0][0])
|
|
||||||
{
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (theDREF) // VALID POINTER
|
|
||||||
{
|
|
||||||
if (floatarray[i] != floatarray[i]) // Is NaN
|
|
||||||
{
|
|
||||||
goto NANMessage;
|
|
||||||
}
|
|
||||||
|
|
||||||
dataType = XPLMGetDataRefTypes(theDREF);
|
|
||||||
switch (dataType)
|
|
||||||
{
|
|
||||||
{case 1: //Integer
|
|
||||||
XPLMSetDatai(theDREF,(int) floatarray[i]);
|
|
||||||
break;}
|
|
||||||
|
|
||||||
{case 4: //Double
|
|
||||||
XPLMSetDatad(theDREF,(double) floatarray[i]);
|
|
||||||
break;}
|
|
||||||
|
|
||||||
{case 8: //Float Array
|
|
||||||
fmini(XPLMGetDatavf(theDREF,NULL,0,8),arraySize); //find size of array
|
|
||||||
if ( floatarray[0] != floatarray[0] ) // NaN Check
|
|
||||||
{
|
|
||||||
goto NANMessage;
|
|
||||||
}
|
|
||||||
|
|
||||||
XPLMSetDatavf(theDREF,floatarray,arrayStart,arraySize);
|
|
||||||
break;}
|
|
||||||
|
|
||||||
{case 16: //Integer Array
|
|
||||||
int intArray[20];
|
|
||||||
short length;
|
|
||||||
length = fmini(XPLMGetDatavi(theDREF,NULL,0,8),arraySize); //find size of array
|
|
||||||
for (i=arrayStart; i < arrayStart+length; i++)
|
|
||||||
{
|
|
||||||
intArray[i] = (int) floatarray[i];
|
|
||||||
}
|
|
||||||
XPLMSetDatavi(theDREF,intArray,0,length);
|
|
||||||
break;}
|
|
||||||
|
|
||||||
{default: //Float
|
|
||||||
XPLMSetDataf(theDREF,floatarray[i]);
|
|
||||||
break;}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
XPC::Log::WriteLine("[DREF] ERROR: invalid DREF");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
NANMessage:
|
|
||||||
XPC::Log::WriteLine("[DREF] ERROR: Value must be a number (NaN received)");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
char setGEAR(short aircraft, float gear, char posi)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
float gearArray[8];
|
|
||||||
|
|
||||||
if ((gear < - 8.5f && gear > 9.5f) || (gear < -997.9f && gear > -999.1f))
|
|
||||||
{
|
|
||||||
return -1; // Don't change command
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( ( gear != gear ) || ( gear < -1.f ) || ( gear > 1.f ) ) // NaN & Positive test
|
|
||||||
{
|
|
||||||
XPC::Log::WriteLine("[GEAR] ERROR: Value must be 0 or 1");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i=0;i<8;i++)
|
|
||||||
{
|
|
||||||
gearArray[i] = gear;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!aircraft)
|
|
||||||
{ // Own Aircraft
|
|
||||||
setDREF(XPLMDataRefs[14][7], gearArray, 0, 8);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{ // Multiplayer
|
|
||||||
setDREF(multiplayer[aircraft][6], gearArray, 0, 8);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (posi)
|
|
||||||
{
|
|
||||||
XPLMSetDatavf(XPLMDataRefs[14][0], gearArray, 0, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
char setPOSI(short aircraft, float pos[3])
|
|
||||||
{
|
|
||||||
double local[3] = {0};
|
|
||||||
int i;
|
|
||||||
float tPos = pos[0] + pos[1] + pos[2];
|
|
||||||
|
|
||||||
if (tPos != tPos) // Is NaN
|
|
||||||
{
|
|
||||||
XPC::Log::WriteLine("[POSI] ERROR: Position must be a number (NaN received)");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
XPLMWorldToLocal(pos[0],pos[1],pos[2],&local[0],&local[1],&local[2]);
|
|
||||||
if (aircraft <= 0)
|
|
||||||
{ // Main aircraft
|
|
||||||
for (i=0; i<3; i++)
|
|
||||||
{
|
|
||||||
XPLMSetDatad(XPLMDataRefs[21][i],local[i]);
|
|
||||||
XPLMSetDatad(XPLMDataRefs[20][i], pos[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{ // Multiplayer
|
|
||||||
for (i=0; i<3; i++)
|
|
||||||
{
|
|
||||||
XPLMSetDatad(multiplayer[aircraft][i], local[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
char setORIENT(short aircraft, float orient[3])
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
float q[4] = {0};
|
|
||||||
float pi = (float) 0.00872664625997; // 1/2 rad
|
|
||||||
float tOrient = orient[0] + orient[1] + orient[2];
|
|
||||||
|
|
||||||
if ( tOrient != tOrient ) // Is NaN
|
|
||||||
{
|
|
||||||
XPC::Log::WriteLine("[ORIENT] ERROR: Orientation must be a number (NaN received)");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( aircraft <= 0 ) // Main aircraft
|
|
||||||
{
|
|
||||||
XPLMSetDataf(XPLMDataRefs[17][0],orient[0]);
|
|
||||||
XPLMSetDataf(XPLMDataRefs[17][1],orient[1]);
|
|
||||||
XPLMSetDataf(XPLMDataRefs[17][2],orient[2]);
|
|
||||||
|
|
||||||
//Convert to Quartonians (from: http://www.xsquawkbox.net/xpsdk/mediawiki/MovingThePlane), http://ntrs.nasa.gov/archive/nasa/casi.ntrs.nasa.gov/19770024290.pdf pA2)
|
|
||||||
orient[2] = pi * orient[2]; // 1/2 raidians
|
|
||||||
orient[0] = pi * orient[0]; // 1/2 raidians
|
|
||||||
orient[1] = pi * orient[1]; // 1/2 raidians
|
|
||||||
q[0] = cos(orient[2]) * cos(orient[0]) * cos(orient[1]) + sin(orient[2]) * sin(orient[0]) * sin(orient[1]);
|
|
||||||
q[1] = cos(orient[2]) * cos(orient[0]) * sin(orient[1]) - sin(orient[2]) * sin(orient[0]) * cos(orient[1]);
|
|
||||||
q[2] = cos(orient[2]) * sin(orient[0]) * cos(orient[1]) + sin(orient[2]) * cos(orient[0]) * sin(orient[1]);
|
|
||||||
q[3] = sin(orient[2]) * cos(orient[0]) * cos(orient[1]) - cos(orient[2]) * sin(orient[0]) * sin(orient[1]);
|
|
||||||
|
|
||||||
XPLMSetDatavf(XPLMDataRefs[17][4],q,0,4);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
for (i=0; i<3; i++)
|
|
||||||
{
|
|
||||||
XPLMSetDataf(multiplayer[aircraft][i+3],orient[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
char setFLAP(float flap)
|
|
||||||
{
|
|
||||||
float floatArray[1] = {flap};
|
|
||||||
setDREF(XPLMDataRefs[13][3],floatArray,0,1);
|
|
||||||
setDREF(XPLMDataRefs[13][4],floatArray,0,1);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int handlePOSI(char buf[])
|
int handlePOSI(char buf[])
|
||||||
{
|
{
|
||||||
float position[8] = {0.0};
|
float position[8] = {0.0};
|
||||||
@@ -713,26 +514,30 @@ int handlePOSI(char buf[])
|
|||||||
|
|
||||||
aircraft = fmini(parsePOSI(buf,position,6, &gear),19);
|
aircraft = fmini(parsePOSI(buf,position,6, &gear),19);
|
||||||
|
|
||||||
//ADD AIRCRAFT HANDLING- (-1 = single aircraft for player)
|
if (aircraft > 0)
|
||||||
if (aircraft > 0) // Multiplayer aircraft
|
|
||||||
{
|
{
|
||||||
XPLMGetDatavi(AIswitch, autopilot, 0, 20);
|
// Enable AI for the aircraft we are setting
|
||||||
autopilot[aircraft] = 1;
|
float ai[20];
|
||||||
XPLMSetDatavi(AIswitch, autopilot, 0, 20);
|
std::size_t result = XPC::DataManager::GetFloatArray(XPC::DREF::PauseAI, ai, 20);
|
||||||
|
if (result == 20) // Only set values if they were retrieved successfully.
|
||||||
|
{
|
||||||
|
ai[aircraft] = 1;
|
||||||
|
XPC::DataManager::Set(XPC::DREF::PauseAI, ai, 0, 20);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Position
|
// Position
|
||||||
memcpy(pos,position,3*sizeof(float));
|
memcpy(pos,position,3*sizeof(float));
|
||||||
setPOSI(aircraft, pos);
|
XPC::DataManager::SetPosition(pos, aircraft);
|
||||||
|
|
||||||
// Orientation
|
// Orientation
|
||||||
memcpy(orient,&position[3],3*sizeof(float));
|
memcpy(orient,&position[3],3*sizeof(float));
|
||||||
setORIENT(aircraft, orient);
|
XPC::DataManager::SetOrientation(orient, aircraft);
|
||||||
|
|
||||||
//Landing Gear
|
//Landing Gear
|
||||||
if (gear != -1)
|
if (gear != -1)
|
||||||
{
|
{
|
||||||
setGEAR(aircraft, gear, 1);
|
XPC::DataManager::SetGear(gear, false, aircraft);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -756,62 +561,32 @@ int handleCTRL(char buf[])
|
|||||||
{
|
{
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
if (ctrl.aircraft == 0) //player aircraft
|
// SET CONTROLS
|
||||||
|
XPC::DataManager::Set(XPC::DREF::YokePitch, ctrl.pitch, ctrl.aircraft);
|
||||||
|
XPC::DataManager::Set(XPC::DREF::YokeRoll, ctrl.roll, ctrl.aircraft);
|
||||||
|
XPC::DataManager::Set(XPC::DREF::YokeHeading, ctrl.yaw, ctrl.aircraft);
|
||||||
|
|
||||||
|
// SET Throttle
|
||||||
|
for (i = 0; i<8; i++)
|
||||||
{
|
{
|
||||||
// SET CONTROLS
|
thr[i] = ctrl.throttle;
|
||||||
XPLMSetDataf(XPLMDataRefs[11][0], ctrl.pitch);
|
|
||||||
XPLMSetDataf(XPLMDataRefs[11][1], ctrl.roll);
|
|
||||||
XPLMSetDataf(XPLMDataRefs[11][2], ctrl.yaw);
|
|
||||||
|
|
||||||
// SET Throttle
|
|
||||||
for (i = 0; i<8; i++)
|
|
||||||
{
|
|
||||||
thr[i] = ctrl.throttle;
|
|
||||||
}
|
|
||||||
XPLMSetDatavf(XPLMDataRefs[25][0], thr, 0, 8);
|
|
||||||
XPLMSetDatavf(XPLMDataRefs[26][0], thr, 0, 8);
|
|
||||||
setDREF(XPLMFindDataRef("sim/flightmodel/engine/ENGN_thro_override"), thr, 0, 1);
|
|
||||||
|
|
||||||
// SET Gear/Flaps
|
|
||||||
if (ctrl.gear != -1)
|
|
||||||
{
|
|
||||||
setGEAR(0, ctrl.gear, 0); // Gear
|
|
||||||
}
|
|
||||||
if (ctrl.flaps < -999.5 || ctrl.flaps > -997.5) // Flaps
|
|
||||||
{
|
|
||||||
XPLMSetDataf(XPLMDataRefs[13][3], ctrl.flaps);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else //non-player aircraft
|
XPC::DataManager::Set(XPC::DREF::ThrottleSet, thr, 8, ctrl.aircraft);
|
||||||
|
XPC::DataManager::Set(XPC::DREF::ThrottleActual, thr, 8, ctrl.aircraft);
|
||||||
|
if (ctrl.aircraft == 0)
|
||||||
{
|
{
|
||||||
// SET CONTROLS
|
XPC::DataManager::Set("sim/flightmodel/engine/ENGN_thro_override", thr, 1);
|
||||||
XPLMSetDataf(multiplayer[ctrl.aircraft][14], ctrl.pitch);
|
}
|
||||||
XPLMSetDataf(multiplayer[ctrl.aircraft][15], ctrl.roll);
|
|
||||||
XPLMSetDataf(multiplayer[ctrl.aircraft][16], ctrl.yaw);
|
|
||||||
|
|
||||||
// SET Throttle
|
// SET Gear/Flaps
|
||||||
for (i = 0; i<8; i++)
|
if (ctrl.gear != -1)
|
||||||
{
|
{
|
||||||
thr[i] = ctrl.throttle;
|
XPC::DataManager::SetGear(ctrl.gear, false, ctrl.aircraft);
|
||||||
}
|
}
|
||||||
XPLMSetDatavf(multiplayer[ctrl.aircraft][13], thr, 0, 8);
|
if (ctrl.flaps < -999.5 || ctrl.flaps > -997.5) // Flaps
|
||||||
|
{
|
||||||
// SET Gear/Flaps
|
XPC::DataManager::Set(XPC::DREF::FlapSetting, ctrl.flaps, ctrl.aircraft);
|
||||||
if (ctrl.gear != -1)
|
}
|
||||||
{
|
|
||||||
float gear[10];
|
|
||||||
for (int i = 0; i < 10; ++i)
|
|
||||||
{
|
|
||||||
gear[i] = ctrl.gear;
|
|
||||||
}
|
|
||||||
XPLMSetDatavf(multiplayer[ctrl.aircraft][6], gear, 0, 10);
|
|
||||||
}
|
|
||||||
if (ctrl.flaps < -999.5 || ctrl.flaps > -997.5) // Flaps
|
|
||||||
{
|
|
||||||
XPLMSetDataf(multiplayer[ctrl.aircraft][7], ctrl.flaps);
|
|
||||||
XPLMSetDataf(multiplayer[ctrl.aircraft][8], ctrl.flaps);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -850,21 +625,10 @@ int handleWYPT(char buf[], int len)
|
|||||||
|
|
||||||
int handleGETD(char buf[])
|
int handleGETD(char buf[])
|
||||||
{
|
{
|
||||||
int length,i,k;
|
int DREFSizes[100] = { 0 };
|
||||||
XPLMDataTypeID dataType;
|
|
||||||
int listLength = buf[5];
|
|
||||||
char the_message[5000];
|
|
||||||
char header[5] = {0};
|
|
||||||
int count = 6;
|
|
||||||
float values[100] = {-998};
|
|
||||||
int intArray[100] = {-998};
|
|
||||||
int DREFSizes[100] = {0};
|
|
||||||
char *DREFArray[100];
|
char *DREFArray[100];
|
||||||
|
std::uint8_t drefCount = buf[5];
|
||||||
strncpy(header,"RESP",4);
|
if (drefCount == 0) // USE LAST REQUEST
|
||||||
memcpy(&the_message,&header,4);
|
|
||||||
|
|
||||||
if (listLength == 0) // USE LAST REQUEST
|
|
||||||
{
|
{
|
||||||
XPC::Log::FormatLine("[GETD] DATA Requested- repeat last request from connection %i (%i data refs)",
|
XPC::Log::FormatLine("[GETD] DATA Requested- repeat last request from connection %i (%i data refs)",
|
||||||
current_connection + 1,
|
current_connection + 1,
|
||||||
@@ -876,83 +640,41 @@ int handleGETD(char buf[])
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (listLength > 0) // NEW REQUEST
|
else if (drefCount > 0) // NEW REQUEST
|
||||||
{
|
{
|
||||||
connectionList[current_connection].requestLength = (short) listLength;
|
connectionList[current_connection].requestLength = (short)drefCount;
|
||||||
|
|
||||||
for (int i = 0; i < connectionList[current_connection].requestLength; i++)
|
for (int i = 0; i < connectionList[current_connection].requestLength; i++)
|
||||||
{
|
{
|
||||||
DREFArray[i] = (char *) malloc(100);
|
DREFArray[i] = (char *)malloc(100);
|
||||||
memset(DREFArray[i],0,100);
|
memset(DREFArray[i], 0, 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
parseGETD(buf,DREFArray,DREFSizes);
|
parseGETD(buf, DREFArray, DREFSizes);
|
||||||
XPC::Log::FormatLine("[GETD] DATA Requested- New Request for connection %i [%i]:",
|
XPC::Log::FormatLine("[GETD] DATA Requested- New Request for connection %i [%i]:",
|
||||||
current_connection + 1,
|
current_connection + 1,
|
||||||
listLength);
|
drefCount);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i=0;i<connectionList[current_connection].requestLength;i++)
|
|
||||||
{
|
|
||||||
if (listLength > 0)
|
|
||||||
{
|
|
||||||
connectionList[current_connection].XPLMRequestedDRefs[i] = XPLMFindDataRef(DREFArray[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (connectionList[current_connection].XPLMRequestedDRefs[i]) //Valid Pointer
|
|
||||||
{
|
|
||||||
dataType = XPLMGetDataRefTypes(connectionList[current_connection].XPLMRequestedDRefs[i]);
|
|
||||||
switch (dataType)
|
|
||||||
{
|
|
||||||
{case 1: //Integer
|
|
||||||
length = 1;
|
|
||||||
values[0] = (float) XPLMGetDatai(connectionList[current_connection].XPLMRequestedDRefs[i]);
|
|
||||||
break;}
|
|
||||||
|
|
||||||
{case 4: //Double
|
|
||||||
length = 1;
|
|
||||||
values[0] = (float) XPLMGetDatad(connectionList[current_connection].XPLMRequestedDRefs[i]);
|
|
||||||
break;}
|
|
||||||
|
|
||||||
{case 8: //Float Array
|
|
||||||
length = XPLMGetDatavf(connectionList[current_connection].XPLMRequestedDRefs[i],NULL,0,8); //find size of array
|
|
||||||
XPLMGetDatavf(connectionList[current_connection].XPLMRequestedDRefs[i],values,0,fminl(length,100));
|
|
||||||
break;}
|
|
||||||
|
|
||||||
{case 16: //Integer Array
|
|
||||||
length = XPLMGetDatavi(connectionList[current_connection].XPLMRequestedDRefs[i],NULL,0,8); //find size of array
|
|
||||||
XPLMGetDatavi(connectionList[current_connection].XPLMRequestedDRefs[i],intArray,0,fminl(length,100));
|
|
||||||
for (k=0; k < length; k++) {
|
|
||||||
values[k]=(float) intArray[k];
|
|
||||||
}
|
|
||||||
break;}
|
|
||||||
|
|
||||||
{default: //Float
|
|
||||||
length = 1;
|
|
||||||
values[0] = XPLMGetDataf(connectionList[current_connection].XPLMRequestedDRefs[i]);
|
|
||||||
break;}
|
|
||||||
}
|
|
||||||
the_message[count] = length;
|
|
||||||
memcpy(&the_message[count+1],&values,length*sizeof(float));
|
|
||||||
count += 1 + length*sizeof(float);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
XPC::Log::FormatLine("%s-ERROR: invalid DREF", DREFArray[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
the_message[5] = (char) connectionList[current_connection].requestLength;
|
|
||||||
|
|
||||||
if (count > 6)
|
std::uint8_t response[4096] = "RESP";
|
||||||
|
response[5] = drefCount;
|
||||||
|
std::size_t cur = 6;
|
||||||
|
for (int i = 0; i < drefCount; ++i)
|
||||||
{
|
{
|
||||||
char* host = connectionList[current_connection].IP;
|
float values[255];
|
||||||
std::uint16_t port = connectionList[current_connection].recPort;
|
std::size_t count = XPC::DataManager::Get(DREFArray[i], values, 255);
|
||||||
sendSocket->SendTo((std::uint8_t*)the_message, count, host, port);
|
response[cur] = count;
|
||||||
|
memcpy(response + 1 + cur, values, count * sizeof(float));
|
||||||
|
cur += 1 + count * sizeof(float);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char* host = connectionList[current_connection].IP;
|
||||||
|
std::uint16_t port = connectionList[current_connection].recPort;
|
||||||
|
sendSocket->SendTo(response, cur, host, port);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -963,7 +685,6 @@ int handleDREF(char buf[])
|
|||||||
unsigned short lenDREF = 0;
|
unsigned short lenDREF = 0;
|
||||||
unsigned short lenVALUE = 0;
|
unsigned short lenVALUE = 0;
|
||||||
float values[40] = {0.0};
|
float values[40] = {0.0};
|
||||||
XPLMDataRef theDREF;
|
|
||||||
|
|
||||||
parseDREF(buf, DREF, &lenDREF,values,&lenVALUE);
|
parseDREF(buf, DREF, &lenDREF,values,&lenVALUE);
|
||||||
|
|
||||||
@@ -976,8 +697,7 @@ int handleDREF(char buf[])
|
|||||||
// Handle DREF
|
// Handle DREF
|
||||||
XPC::Log::FormatLine("[DREF] Request to set DREF value received (Conn %i): %s", current_connection + 1, DREF);
|
XPC::Log::FormatLine("[DREF] Request to set DREF value received (Conn %i): %s", current_connection + 1, DREF);
|
||||||
|
|
||||||
theDREF = XPLMFindDataRef(DREF);
|
XPC::DataManager::Set(DREF, values, lenVALUE);
|
||||||
setDREF(theDREF, values, 0, lenVALUE);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -1028,17 +748,17 @@ int handleDATA(char buf[], int buflen)
|
|||||||
|
|
||||||
float theta, alpha, hpath,v;
|
float theta, alpha, hpath,v;
|
||||||
int ind[3] = {1,3,4};
|
int ind[3] = {1,3,4};
|
||||||
theta = XPLMGetDataf(XPLMDataRefs[17][0]); //Theta
|
theta = XPC::DataManager::GetFloat(XPC::DREF::Pitch);
|
||||||
|
|
||||||
if (savedAlpha != -998)
|
if (savedAlpha != -998)
|
||||||
alpha = savedAlpha;
|
alpha = savedAlpha;
|
||||||
else
|
else
|
||||||
alpha = XPLMGetDataf(XPLMDataRefs[18][0]); //Alpha
|
alpha = XPC::DataManager::GetFloat(XPC::DREF::AngleOfAttack);
|
||||||
|
|
||||||
if (savedHPath != -998)
|
if (savedHPath != -998)
|
||||||
hpath = savedHPath;
|
hpath = savedHPath;
|
||||||
else
|
else
|
||||||
hpath = XPLMGetDataf(XPLMDataRefs[18][2]); //Velocity Heading
|
hpath = XPC::DataManager::GetFloat(XPC::DREF::HPath); //Velocity Heading
|
||||||
|
|
||||||
if ( ( hpath != hpath ) && ( alpha != alpha ) && ( theta != theta ) ) // NaN Check
|
if ( ( hpath != hpath ) && ( alpha != alpha ) && ( theta != theta ) ) // NaN Check
|
||||||
{
|
{
|
||||||
@@ -1051,24 +771,21 @@ int handleDATA(char buf[], int buflen)
|
|||||||
if (recValues[i][ind[j]] != -998)
|
if (recValues[i][ind[j]] != -998)
|
||||||
{
|
{
|
||||||
v = recValues[i][ind[j]];
|
v = recValues[i][ind[j]];
|
||||||
|
|
||||||
XPLMSetDataf(XPLMDataRefs[21][3],v*cos((theta-alpha)*deg2rad)*sin(hpath*deg2rad));
|
XPC::DataManager::Set(XPC::DREF::LocalVX, v*cos((theta - alpha)*deg2rad)*sin(hpath*deg2rad));
|
||||||
XPLMSetDataf(XPLMDataRefs[21][4],v*sin((theta-alpha)*deg2rad));
|
XPC::DataManager::Set(XPC::DREF::LocalVY, v*sin((theta - alpha)*deg2rad));
|
||||||
XPLMSetDataf(XPLMDataRefs[21][5],-v*cos((theta-alpha)*deg2rad)*cos(hpath*deg2rad));
|
XPC::DataManager::Set(XPC::DREF::LocalVZ, -v*cos((theta - alpha)*deg2rad)*cos(hpath*deg2rad));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;}
|
break;}
|
||||||
{case 17: // Orientation
|
{case 17: // Orientation
|
||||||
float orient[3] = {0};
|
float orient[3]
|
||||||
|
{
|
||||||
for (j=1; j<4; j++)
|
recValues[i][1] == -998 ? XPC::DataManager::GetFloat(XPC::DREF::Pitch) : recValues[i][1],
|
||||||
if (recValues[i][j] == -998)
|
recValues[i][2] == -998 ? XPC::DataManager::GetFloat(XPC::DREF::Roll) : recValues[i][2],
|
||||||
recValues[i][j] = XPLMGetDataf(XPLMDataRefs[17][j-1]);
|
recValues[i][3] == -998 ? XPC::DataManager::GetFloat(XPC::DREF::HeadingTrue) : recValues[i][3]
|
||||||
|
};
|
||||||
memcpy(orient,&recValues[i][1],3*sizeof(float));
|
XPC::DataManager::SetOrientation(orient);
|
||||||
|
|
||||||
setORIENT(0, orient);
|
|
||||||
|
|
||||||
break;}
|
break;}
|
||||||
|
|
||||||
{case 18: // Alpha, hpath etc.
|
{case 18: // Alpha, hpath etc.
|
||||||
@@ -1087,15 +804,13 @@ int handleDATA(char buf[], int buflen)
|
|||||||
break;}
|
break;}
|
||||||
|
|
||||||
{case 20: // Position
|
{case 20: // Position
|
||||||
float local[3] = {0};
|
float pos[3]
|
||||||
|
{
|
||||||
for (j=1; j<4; j++)
|
recValues[i][2] == -998 ? XPC::DataManager::GetFloat(XPC::DREF::Latitude) : recValues[i][2],
|
||||||
if (recValues[i][j+1] == -998)
|
recValues[i][3] == -998 ? XPC::DataManager::GetFloat(XPC::DREF::Longitude) : recValues[i][3],
|
||||||
recValues[i][j+1] = XPLMGetDataf(XPLMDataRefs[20][j]);
|
recValues[i][4] == -998 ? XPC::DataManager::GetFloat(XPC::DREF::AGL) : recValues[i][4]
|
||||||
|
};
|
||||||
memcpy(local,&recValues[i][1],3*sizeof(float));
|
XPC::DataManager::SetPosition(pos);
|
||||||
setPOSI(0, local);
|
|
||||||
|
|
||||||
break;}
|
break;}
|
||||||
|
|
||||||
{case 25: // Throttle
|
{case 25: // Throttle
|
||||||
@@ -1108,7 +823,7 @@ int handleDATA(char buf[], int buflen)
|
|||||||
for (j=0; j<8; j++)
|
for (j=0; j<8; j++)
|
||||||
floatArray[j] = recValues[i][1];
|
floatArray[j] = recValues[i][1];
|
||||||
|
|
||||||
XPLMSetDatavf(XPLMDataRefs[25][0],floatArray,0,8);
|
XPC::DataManager::Set(XPC::DREF::ThrottleSet, floatArray, 8);
|
||||||
break;}
|
break;}
|
||||||
|
|
||||||
{default: // Non-Special dataRefs (everything else)
|
{default: // Non-Special dataRefs (everything else)
|
||||||
@@ -1122,13 +837,19 @@ int handleDATA(char buf[], int buflen)
|
|||||||
|
|
||||||
if (dataRef==14 && j==0)
|
if (dataRef==14 && j==0)
|
||||||
{
|
{
|
||||||
setGEAR(0, recValues[i][j+1], 1); // Landing Gear
|
XPC::DataManager::SetGear(recValues[i][j + 1], false);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set DATAREF
|
XPC::DREF dref = XPC::XPData[dataRef][j];
|
||||||
if (setDREF(XPLMDataRefs[dataRef][j],floatArray,j,8) == -1)
|
if (dref == XPC::DREF::None)
|
||||||
sendBUF(buf,buflen);
|
{
|
||||||
|
sendBUF(buf, buflen);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
XPC::DataManager::Set(dref, floatArray, 8);
|
||||||
|
}
|
||||||
} //End for j=1:8
|
} //End for j=1:8
|
||||||
break;}
|
break;}
|
||||||
} // End switch(dataRef)
|
} // End switch(dataRef)
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
@@ -99,6 +99,8 @@
|
|||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="..\..\C\src\xplaneConnect.h" />
|
<ClInclude Include="..\..\C\src\xplaneConnect.h" />
|
||||||
|
<ClInclude Include="..\DataManager.h" />
|
||||||
|
<ClInclude Include="..\DataMaps.h" />
|
||||||
<ClInclude Include="..\Drawing.h" />
|
<ClInclude Include="..\Drawing.h" />
|
||||||
<ClInclude Include="..\Log.h" />
|
<ClInclude Include="..\Log.h" />
|
||||||
<ClInclude Include="..\Message.h" />
|
<ClInclude Include="..\Message.h" />
|
||||||
@@ -107,6 +109,7 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="..\..\C\src\xplaneConnect.c" />
|
<ClCompile Include="..\..\C\src\xplaneConnect.c" />
|
||||||
|
<ClCompile Include="..\DataManager.cpp" />
|
||||||
<ClCompile Include="..\Drawing.cpp" />
|
<ClCompile Include="..\Drawing.cpp" />
|
||||||
<ClCompile Include="..\Log.cpp" />
|
<ClCompile Include="..\Log.cpp" />
|
||||||
<ClCompile Include="..\Message.cpp" />
|
<ClCompile Include="..\Message.cpp" />
|
||||||
|
|||||||
@@ -18,9 +18,6 @@
|
|||||||
<ClInclude Include="..\..\C\src\xplaneConnect.h">
|
<ClInclude Include="..\..\C\src\xplaneConnect.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="..\xpcPluginTools.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\Log.h">
|
<ClInclude Include="..\Log.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
@@ -33,6 +30,15 @@
|
|||||||
<ClInclude Include="..\Message.h">
|
<ClInclude Include="..\Message.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\DataManager.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\DataMaps.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\xpcPluginTools.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="..\..\C\src\xplaneConnect.c">
|
<ClCompile Include="..\..\C\src\xplaneConnect.c">
|
||||||
@@ -41,9 +47,6 @@
|
|||||||
<ClCompile Include="..\XPCPlugin.cpp">
|
<ClCompile Include="..\XPCPlugin.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\xpcPluginTools.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\Log.cpp">
|
<ClCompile Include="..\Log.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
@@ -56,6 +59,12 @@
|
|||||||
<ClCompile Include="..\Message.cpp">
|
<ClCompile Include="..\Message.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\DataManager.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\xpcPluginTools.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Library Include="..\SDK\Libraries\Win\XPLM.lib">
|
<Library Include="..\SDK\Libraries\Win\XPLM.lib">
|
||||||
|
|||||||
@@ -32,233 +32,6 @@
|
|||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include "xpcPluginTools.h"
|
#include "xpcPluginTools.h"
|
||||||
|
|
||||||
XPLMDataRef XPLMDataRefs[134][8];
|
|
||||||
XPLMDataRef multiplayer[20][17];
|
|
||||||
XPLMDataRef AIswitch;
|
|
||||||
|
|
||||||
void buildXPLMDataRefs()
|
|
||||||
{
|
|
||||||
int i, j;
|
|
||||||
char multi[50] = {0};
|
|
||||||
|
|
||||||
for (i=0; i<134; i++)
|
|
||||||
{
|
|
||||||
for (j=0; j<8; j++)
|
|
||||||
{
|
|
||||||
XPLMDataRefs[i][j] = XPLMFindDataRef("sim/test/test_float");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Prefetch the sim variables we will use. */
|
|
||||||
//Row 0: Frame Rates
|
|
||||||
|
|
||||||
//Row 1: Times
|
|
||||||
XPLMDataRefs[1][1] = XPLMFindDataRef("sim/time/total_running_time_sec");
|
|
||||||
XPLMDataRefs[1][2] = XPLMFindDataRef("sim/time/total_flight_time_sec");
|
|
||||||
XPLMDataRefs[1][3] = XPLMFindDataRef("sim/time/timer_elapsed_time_sec");
|
|
||||||
|
|
||||||
//cockpit2/clock_time/zulu_time_hours
|
|
||||||
//cockpit2/clock_time/zulu_time_minutes
|
|
||||||
//cockpit2/clock_time/zulu_time_seconds
|
|
||||||
|
|
||||||
//cockpit2/clock_time/local_time_hours
|
|
||||||
|
|
||||||
//cockpit2/clock_time/hobbs_time_hours
|
|
||||||
|
|
||||||
//Row 2: Sim Stats
|
|
||||||
|
|
||||||
//Row 3: Velocities
|
|
||||||
//READ ONLY
|
|
||||||
XPLMDataRefs[3][0] = XPLMFindDataRef("sim/flightmodel/position/indicated_airspeed"); //Vind knots indicated airspeed TEST
|
|
||||||
|
|
||||||
//Vind knots equivilent airspeed (considering compressible flow)
|
|
||||||
XPLMDataRefs[3][2] = XPLMFindDataRef("sim/flightmodel/position/true_airspeed"); //Vtrue knots true airspeed
|
|
||||||
XPLMDataRefs[3][3] = XPLMFindDataRef("sim/flightmodel/position/groundspeed"); //Vtrue Knots true ground speed
|
|
||||||
|
|
||||||
//XPLMDataRefs[3][5] = Vind mph
|
|
||||||
//XPLMDataRefs[3][6] = Vtrue mphas
|
|
||||||
//XPLMDataRefs[3][7] = Vtre mphgs
|
|
||||||
|
|
||||||
//Row 4: Mach, VVI, G-loads
|
|
||||||
XPLMDataRefs[4][0] = XPLMFindDataRef("sim/flightmodel/misc/machno"); // Mach Number
|
|
||||||
XPLMDataRefs[4][4] = XPLMFindDataRef("sim/flightmodel2/misc/gforce_normal");
|
|
||||||
XPLMDataRefs[4][5] = XPLMFindDataRef("sim/flightmodel2/misc/gforce_axial");
|
|
||||||
XPLMDataRefs[4][6] = XPLMFindDataRef("sim/flightmodel2/misc/gforce_side");
|
|
||||||
|
|
||||||
//Row 5: Atmosphere: Weather
|
|
||||||
XPLMDataRefs[5][0] = XPLMFindDataRef("sim/weather/barometer_sealevel_inhg");
|
|
||||||
XPLMDataRefs[5][1] = XPLMFindDataRef("sim/weather/temperature_sealevel_c");
|
|
||||||
XPLMDataRefs[5][3] = XPLMFindDataRef("sim/cockpit2/gauges/indicators/wind_speed_kts");
|
|
||||||
|
|
||||||
//Row 6: Atmosphere: Aircraft
|
|
||||||
|
|
||||||
//Row 7: System Pressures
|
|
||||||
|
|
||||||
//Row 8: Joystick
|
|
||||||
XPLMDataRefs[8][0] = XPLMFindDataRef("sim/joystick/yoke_pitch_ratio");
|
|
||||||
XPLMDataRefs[8][1] = XPLMFindDataRef("sim/joystick/yoke_roll_ratio");
|
|
||||||
XPLMDataRefs[8][2] = XPLMFindDataRef("sim/joystick/yoke_heading_ratio");
|
|
||||||
|
|
||||||
//Row 9: Other Flight Controls
|
|
||||||
|
|
||||||
//Row 10: Art stab ail/elv/rud
|
|
||||||
|
|
||||||
//Row 11: Control Surfaces
|
|
||||||
XPLMDataRefs[11][0] = XPLMFindDataRef("sim/cockpit2/controls/yoke_pitch_ratio"); //Elevator Position
|
|
||||||
XPLMDataRefs[11][1] = XPLMFindDataRef("sim/cockpit2/controls/yoke_roll_ratio"); //Aileron Position
|
|
||||||
XPLMDataRefs[11][2] = XPLMFindDataRef("sim/cockpit2/controls/yoke_heading_ratio"); //Rudder Position
|
|
||||||
XPLMDataRefs[11][3] = NULL;
|
|
||||||
XPLMDataRefs[11][4] = NULL;
|
|
||||||
XPLMDataRefs[11][5] = NULL;
|
|
||||||
XPLMDataRefs[11][6] = NULL;
|
|
||||||
XPLMDataRefs[11][7] = NULL;
|
|
||||||
|
|
||||||
//Row 12: Wing Sweep/Trust Vec
|
|
||||||
|
|
||||||
//Row 13: trip/flap/slat/s-brakes
|
|
||||||
XPLMDataRefs[13][3] = XPLMFindDataRef("sim/flightmodel/controls/flaprqst");
|
|
||||||
XPLMDataRefs[13][4] = XPLMFindDataRef("sim/flightmodel/controls/flaprat");// should be equal to flap2rat
|
|
||||||
|
|
||||||
//Row 14: Gear, Brakes
|
|
||||||
XPLMDataRefs[14][0] = XPLMFindDataRef("sim/aircraft/parts/acf_gear_deploy"); //Landing Gear-SPECIAL (Float[10])
|
|
||||||
XPLMDataRefs[14][1] = XPLMFindDataRef("sim/flightmodel/controls/parkbrake"); //Parking Brake
|
|
||||||
XPLMDataRefs[14][2] = XPLMFindDataRef("sim/cockpit2/controls/left_brake_ratio");
|
|
||||||
XPLMDataRefs[14][3] = XPLMFindDataRef("sim/cockpit2/controls/right_brake_ratio");
|
|
||||||
|
|
||||||
XPLMDataRefs[14][7] = XPLMFindDataRef("sim/cockpit/switches/gear_handle_status"); //Landing Gear Handle
|
|
||||||
|
|
||||||
//Row 15: MNR (Angular Moments)
|
|
||||||
//READ ONLY
|
|
||||||
XPLMDataRefs[15][0] = XPLMFindDataRef("sim/flightmodel/position/M");
|
|
||||||
XPLMDataRefs[15][1] = XPLMFindDataRef("sim/flightmodel/position/L");
|
|
||||||
XPLMDataRefs[15][2] = XPLMFindDataRef("sim/flightmodel/position/N");
|
|
||||||
|
|
||||||
//Row 16: PQR (Angular Velocities)
|
|
||||||
XPLMDataRefs[16][0] = XPLMFindDataRef("sim/flightmodel/position/Qrad");
|
|
||||||
XPLMDataRefs[16][1] = XPLMFindDataRef("sim/flightmodel/position/Prad");
|
|
||||||
XPLMDataRefs[16][2] = XPLMFindDataRef("sim/flightmodel/position/Rrad");
|
|
||||||
XPLMDataRefs[16][3] = XPLMFindDataRef("sim/flightmodel/position/Q");
|
|
||||||
XPLMDataRefs[16][4] = XPLMFindDataRef("sim/flightmodel/position/P");
|
|
||||||
XPLMDataRefs[16][5] = XPLMFindDataRef("sim/flightmodel/position/R");
|
|
||||||
|
|
||||||
//Row 17: Orientation: pitch, roll, yaw, heading
|
|
||||||
XPLMDataRefs[17][0] = XPLMFindDataRef("sim/flightmodel/position/theta"); //Pitch
|
|
||||||
XPLMDataRefs[17][1] = XPLMFindDataRef("sim/flightmodel/position/phi"); //roll
|
|
||||||
XPLMDataRefs[17][2] = XPLMFindDataRef("sim/flightmodel/position/psi"); //true heading (where nose is pointing)
|
|
||||||
|
|
||||||
//READ ONLY (always)
|
|
||||||
XPLMDataRefs[17][3] = XPLMFindDataRef("sim/flightmodel/position/magpsi"); //magnetic heading
|
|
||||||
|
|
||||||
//WRITABLE
|
|
||||||
XPLMDataRefs[17][4] = XPLMFindDataRef("sim/flightmodel/position/q"); //Quartonian
|
|
||||||
|
|
||||||
//Row 18: Orientation: alpha beta hpath vpath slip
|
|
||||||
XPLMDataRefs[18][0] = XPLMFindDataRef("sim/flightmodel/position/alpha"); //Angle of Attack
|
|
||||||
XPLMDataRefs[18][1] = XPLMFindDataRef("sim/cockpit2/gauges/indicators/sideslip_degrees"); //fix to beta
|
|
||||||
XPLMDataRefs[18][2] = XPLMFindDataRef("sim/flightmodel/position/hpath"); //Heading the aircraft flies (velocity vector) TEST
|
|
||||||
XPLMDataRefs[18][3] = XPLMFindDataRef("sim/flightmodel/position/vpath"); //VPath TEST
|
|
||||||
XPLMDataRefs[18][7] = XPLMFindDataRef("sim/cockpit2/gauges/indicators/sideslip_degrees");
|
|
||||||
|
|
||||||
//Row 19: Mag Compass
|
|
||||||
XPLMDataRefs[19][0] = XPLMFindDataRef("sim/flightmodel/position/magpsi");
|
|
||||||
|
|
||||||
//READ ONLY
|
|
||||||
XPLMDataRefs[19][1] = XPLMFindDataRef("sim/flightmodel/position/magnetic_variation");
|
|
||||||
|
|
||||||
//Row 20: Global Position
|
|
||||||
//READ ONLY
|
|
||||||
XPLMDataRefs[20][0] = XPLMFindDataRef("sim/flightmodel/position/latitude"); // Read Only
|
|
||||||
XPLMDataRefs[20][1] = XPLMFindDataRef("sim/flightmodel/position/longitude"); // Read Only
|
|
||||||
XPLMDataRefs[20][3] = XPLMFindDataRef("sim/flightmodel/position/y_agl"); // Read Only
|
|
||||||
|
|
||||||
//Row 21: Local Position, Velocity
|
|
||||||
XPLMDataRefs[21][0] = XPLMFindDataRef("sim/flightmodel/position/local_x");
|
|
||||||
XPLMDataRefs[21][1] = XPLMFindDataRef("sim/flightmodel/position/local_y");
|
|
||||||
XPLMDataRefs[21][2] = XPLMFindDataRef("sim/flightmodel/position/local_z");
|
|
||||||
XPLMDataRefs[21][3] = XPLMFindDataRef("sim/flightmodel/position/local_vx");
|
|
||||||
XPLMDataRefs[21][4] = XPLMFindDataRef("sim/flightmodel/position/local_vy");
|
|
||||||
XPLMDataRefs[21][5] = XPLMFindDataRef("sim/flightmodel/position/local_vz");
|
|
||||||
|
|
||||||
//Row 22: All Planes: Lat (READ ONLY)
|
|
||||||
XPLMDataRefs[22][0] = XPLMDataRefs[20][0];
|
|
||||||
XPLMDataRefs[22][1] = XPLMFindDataRef("sim/multiplayer/position/plane1_lat");
|
|
||||||
XPLMDataRefs[22][2] = XPLMFindDataRef("sim/multiplayer/position/plane2_lat");
|
|
||||||
XPLMDataRefs[22][3] = XPLMFindDataRef("sim/multiplayer/position/plane3_lat");
|
|
||||||
XPLMDataRefs[22][4] = XPLMFindDataRef("sim/multiplayer/position/plane4_lat");
|
|
||||||
XPLMDataRefs[22][5] = XPLMFindDataRef("sim/multiplayer/position/plane5_lat");
|
|
||||||
XPLMDataRefs[22][6] = XPLMFindDataRef("sim/multiplayer/position/plane6_lat");
|
|
||||||
XPLMDataRefs[22][7] = XPLMFindDataRef("sim/multiplayer/position/plane7_lat");
|
|
||||||
|
|
||||||
//Row 23: All Planes: Lon
|
|
||||||
XPLMDataRefs[23][0] = XPLMDataRefs[20][1];
|
|
||||||
XPLMDataRefs[23][1] = XPLMFindDataRef("sim/multiplayer/position/plane1_lon");
|
|
||||||
XPLMDataRefs[23][2] = XPLMFindDataRef("sim/multiplayer/position/plane2_lon");
|
|
||||||
XPLMDataRefs[23][3] = XPLMFindDataRef("sim/multiplayer/position/plane3_lon");
|
|
||||||
XPLMDataRefs[23][4] = XPLMFindDataRef("sim/multiplayer/position/plane4_lon");
|
|
||||||
XPLMDataRefs[23][5] = XPLMFindDataRef("sim/multiplayer/position/plane5_lon");
|
|
||||||
XPLMDataRefs[23][6] = XPLMFindDataRef("sim/multiplayer/position/plane6_lon");
|
|
||||||
XPLMDataRefs[23][7] = XPLMFindDataRef("sim/multiplayer/position/plane7_lon");
|
|
||||||
|
|
||||||
//Row 24: All Planes: Alt
|
|
||||||
XPLMDataRefs[24][0] = XPLMDataRefs[20][2];
|
|
||||||
XPLMDataRefs[24][1] = XPLMFindDataRef("sim/multiplayer/position/plane1_el");
|
|
||||||
XPLMDataRefs[24][2] = XPLMFindDataRef("sim/multiplayer/position/plane2_el");
|
|
||||||
XPLMDataRefs[24][3] = XPLMFindDataRef("sim/multiplayer/position/plane3_el");
|
|
||||||
XPLMDataRefs[24][4] = XPLMFindDataRef("sim/multiplayer/position/plane4_el");
|
|
||||||
XPLMDataRefs[24][5] = XPLMFindDataRef("sim/multiplayer/position/plane5_el");
|
|
||||||
XPLMDataRefs[24][6] = XPLMFindDataRef("sim/multiplayer/position/plane6_el");
|
|
||||||
XPLMDataRefs[24][7] = XPLMFindDataRef("sim/multiplayer/position/plane7_el");
|
|
||||||
|
|
||||||
//Row 25: Throttle Command
|
|
||||||
XPLMDataRefs[25][0] = XPLMFindDataRef("sim/flightmodel/engine/ENGN_thro"); //Throttle (array 8)
|
|
||||||
|
|
||||||
//Row 26: Throttle Actual
|
|
||||||
XPLMDataRefs[26][0] = XPLMFindDataRef("sim/flightmodel2/engines/throttle_used_ratio"); // Trottle Actual (array 8) (Read Only)
|
|
||||||
|
|
||||||
//Row 27:
|
|
||||||
|
|
||||||
|
|
||||||
// Multiplayer
|
|
||||||
for ( i = 1; i < 20; i++ )
|
|
||||||
{
|
|
||||||
sprintf(multi, "sim/multiplayer/position/plane%i_x", i); // X
|
|
||||||
multiplayer[i][0] = XPLMFindDataRef(multi);
|
|
||||||
sprintf(multi, "sim/multiplayer/position/plane%i_y", i); // Y
|
|
||||||
multiplayer[i][1] = XPLMFindDataRef(multi);
|
|
||||||
sprintf(multi,"sim/multiplayer/position/plane%i_z", i); // Z
|
|
||||||
multiplayer[i][2] = XPLMFindDataRef(multi);
|
|
||||||
sprintf(multi,"sim/multiplayer/position/plane%i_the", i); // Theta (Pitch)
|
|
||||||
multiplayer[i][3] = XPLMFindDataRef(multi);
|
|
||||||
sprintf(multi,"sim/multiplayer/position/plane%i_phi", i); // Phi (Roll)
|
|
||||||
multiplayer[i][4] = XPLMFindDataRef(multi);
|
|
||||||
sprintf(multi,"sim/multiplayer/position/plane%i_psi", i); // Psi (Heading-True)
|
|
||||||
multiplayer[i][5] = XPLMFindDataRef(multi);
|
|
||||||
sprintf(multi, "sim/multiplayer/position/plane%i_gear_deploy", i); // Landing Gear
|
|
||||||
multiplayer[i][6] = XPLMFindDataRef(multi);
|
|
||||||
sprintf(multi, "sim/multiplayer/position/plane%i_flap_ratio", i);
|
|
||||||
multiplayer[i][7] = XPLMFindDataRef(multi);
|
|
||||||
sprintf(multi, "sim/multiplayer/position/plane%i_flap_ratio2", i);
|
|
||||||
multiplayer[i][8] = XPLMFindDataRef(multi);
|
|
||||||
sprintf(multi, "sim/multiplayer/position/plane%i_spoiler_ratio", i);
|
|
||||||
multiplayer[i][9] = XPLMFindDataRef(multi);
|
|
||||||
sprintf(multi, "sim/multiplayer/position/plane%i_speedbrake_ratio", i);
|
|
||||||
multiplayer[i][10] = XPLMFindDataRef(multi);
|
|
||||||
sprintf(multi, "sim/multiplayer/position/plane%i_slat_ratio", i);
|
|
||||||
multiplayer[i][11] = XPLMFindDataRef(multi);
|
|
||||||
sprintf(multi, "sim/multiplayer/position/plane%i_wing_sweep", i);
|
|
||||||
multiplayer[i][12] = XPLMFindDataRef(multi);
|
|
||||||
sprintf(multi, "sim/multiplayer/position/plane%i_throttle", i);
|
|
||||||
multiplayer[i][13] = XPLMFindDataRef(multi);
|
|
||||||
sprintf(multi, "sim/multiplayer/position/plane%i_yolk_pitch", i);
|
|
||||||
multiplayer[i][14] = XPLMFindDataRef(multi);
|
|
||||||
sprintf(multi, "sim/multiplayer/position/plane%i_yolk_roll", i);
|
|
||||||
multiplayer[i][15] = XPLMFindDataRef(multi);
|
|
||||||
sprintf(multi, "sim/multiplayer/position/plane%i_yolk_yaw", i);
|
|
||||||
multiplayer[i][16] = XPLMFindDataRef(multi);
|
|
||||||
}
|
|
||||||
AIswitch = XPLMFindDataRef("sim/operation/override/override_plane_ai_autopilot");
|
|
||||||
}
|
|
||||||
|
|
||||||
int fmini(int a, int b)
|
int fmini(int a, int b)
|
||||||
{
|
{
|
||||||
// Returns the minimum value of two integers
|
// Returns the minimum value of two integers
|
||||||
|
|||||||
@@ -8,18 +8,9 @@
|
|||||||
|
|
||||||
#ifndef xpcPlugin_xpcPluginTools_h
|
#ifndef xpcPlugin_xpcPluginTools_h
|
||||||
#define xpcPlugin_xpcPluginTools_h
|
#define xpcPlugin_xpcPluginTools_h
|
||||||
|
|
||||||
#include "UDPSocket.h"
|
|
||||||
|
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include "xplaneConnect.h"
|
#include "xplaneConnect.h"
|
||||||
#include "XPLMDataAccess.h"
|
|
||||||
|
|
||||||
extern XPLMDataRef XPLMDataRefs[134][8];
|
|
||||||
extern XPLMDataRef multiplayer[20][17];
|
|
||||||
extern XPLMDataRef AIswitch;
|
|
||||||
|
|
||||||
void buildXPLMDataRefs(void);
|
|
||||||
|
|
||||||
int almostequal(float arg1, float arg2, float tol);
|
int almostequal(float arg1, float arg2, float tol);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user