Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/cpp-python-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -668,7 +668,7 @@ jobs:
find . -type f -name *.exe -exec cp {} dist/. \;
find . -type f -name *.deb -exec cp {} dist/. \;
- name: Rolling release
uses: softprops/action-gh-release@v2
uses: softprops/action-gh-release@v3
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
Expand Down Expand Up @@ -724,7 +724,7 @@ jobs:
export MSVC_VERSION=`cat MSVC_version.txt`
echo "MSVC_VERSION=$MSVC_VERSION" >> $GITHUB_ENV
- name: GitHub release
uses: softprops/action-gh-release@v2
uses: softprops/action-gh-release@v3
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
Expand Down
3 changes: 3 additions & 0 deletions JSBSim.vcxproj.filters
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,9 @@
</ClCompile>
<ClCompile Include="src\models\propulsion\FGPiston.cpp">
<Filter>Source Files</Filter>
<ClCompile Include="src\models\propulsion\FGPistonDiesel.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ClCompile>
Comment on lines +208 to 211

Copilot AI Apr 26, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This .vcxproj.filters change breaks the XML structure: the new FGPistonDiesel.cpp <ClCompile> entry is nested inside the existing FGPiston.cpp <ClCompile> element (missing a closing tag before the insertion). Visual Studio will fail to load the filters file. Close the FGPiston.cpp <ClCompile> element before adding the new sibling element.

Suggested change
<ClCompile Include="src\models\propulsion\FGPistonDiesel.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ClCompile>
</ClCompile>
<ClCompile Include="src\models\propulsion\FGPistonDiesel.cpp">
<Filter>Source Files</Filter>
</ClCompile>

Copilot uses AI. Check for mistakes.
<ClCompile Include="src\models\FGPropagate.cpp">
<Filter>Source Files</Filter>
Expand Down
1 change: 1 addition & 0 deletions JSBSimForUnreal.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,7 @@
<ClInclude Include="src\math\FGParameter.h" />
<ClInclude Include="src\models\flight_control\FGPID.h" />
<ClInclude Include="src\models\propulsion\FGPiston.h" />
<ClInclude Include="src\models\propulsion\FGPistonDiesel.h" />
<ClInclude Include="src\models\FGPropagate.h" />
<ClInclude Include="src\models\propulsion\FGPropeller.h" />
<ClInclude Include="src\input_output\FGPropertyManager.h" />
Expand Down
3 changes: 3 additions & 0 deletions JSBSimForUnreal.vcxproj.filters
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,9 @@
<ClCompile Include="src\models\propulsion\FGPiston.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\models\propulsion\FGPistonDiesel.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\models\FGPropagate.cpp">
<Filter>Source Files</Filter>
</ClCompile>
Expand Down
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,14 @@ We are also on Facebook: <https://www.facebook.com/jsbsim/>

# Legal Notice

<p><a href="https://opensource.org/licenses/LGPL-2.1">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://opensource.org/wp-content/themes/osi/assets/img/osi-badge-light.svg">
<source media="(prefers-color-scheme: light)" srcset="https://opensource.org/wp-content/uploads/2022/10/osi-badge-dark.svg">
<img src="https://opensource.org/wp-content/uploads/2022/10/osi-badge-dark.svg" alt="OSI approved license badge for LGPL-2.1" width="180">
</picture>
</a></p>

The JSBSim library is open source and is licensed under the [LGPL 2.1 license](https://opensource.org/licenses/LGPL-2.1). The license is included in the source code file [COPYING](https://github.com/JSBSim-Team/jsbsim/blob/master/COPYING).

The Unreal Engine Reference Application for JSBSim is open source and is licensed under the [MIT license](https://opensource.org/licenses/MIT). The license is included in the source code file [UnrealEngine/LICENSE.txt](https://github.com/JSBSim-Team/jsbsim/blob/master/UnrealEngine/LICENSE.txt).
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
#include "models/FGMassBalance.h"
#include "models/propulsion/FGThruster.h"
#include "models/propulsion/FGPiston.h"
#include "models/propulsion/FGPistonDiesel.h"
#include "models/propulsion/FGTurbine.h"
#include "models/propulsion/FGTurboProp.h"
#include "models/propulsion/FGTank.h"
Expand Down Expand Up @@ -356,7 +357,7 @@ void UJSBSimMovementComponent::TickComponent(float DeltaTime, ELevelTick TickTyp
FTransform ENUTransform = GeoReferencingSystem->GetTangentTransformAtECEFLocation(AircraftState.ECEFLocation);
FRotator LocalUERotation(AircraftState.LocalEulerAngles);
LocalUERotation.Yaw -= 90.0; // JSBSim heading is aero heading (0 at north). We have to remove 90 because in UE, 0 is pointing east.
if (GeoReferencingSystem->PlanetShape == EPlanetShape::FlatPlanet) //Fix for Flat Planet bug
if (GeoReferencingSystem->PlanetShape == EPlanetShape::FlatPlanet) //Fix for Flat Planet bug
{
LocalUERotation.Yaw -= 180.0;
ECEFForwardHorizontal.Y *= -1.0;
Expand Down Expand Up @@ -1080,6 +1081,15 @@ void UJSBSimMovementComponent::GetEnginesStates()
EngineStates[i].Magnetos = (EMagnetosMode)PistonEngine->GetMagnetos();
break;
}
case JSBSim::FGEngine::etPistonDiesel:
{
std::shared_ptr<JSBSim::FGPistonDiesel> DieselEngine =
std::static_pointer_cast<JSBSim::FGPistonDiesel>(Engine);
EngineStates[i].FuelRack = DieselEngine->getFuelRack();
EngineStates[i].CoolantTemp = DieselEngine->getCoolantTemp_degF();

Copilot AI Apr 26, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FGPistonDiesel does not define getCoolantTemp_degF(). The method in the new engine class is getCoolantTemperature_degF(), so this will not compile. Update the call site (and any other diesel-specific getters) to match the FGPistonDiesel API.

Suggested change
EngineStates[i].CoolantTemp = DieselEngine->getCoolantTemp_degF();
EngineStates[i].CoolantTemp = DieselEngine->getCoolantTemperature_degF();

Copilot uses AI. Check for mistakes.
EngineStates[i].GlowPlugOn = DieselEngine->getGlowPlugOn();
break;
}
case JSBSim::FGEngine::etTurbine:
{
// TODO
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ struct FTank
UPROPERTY(BlueprintReadOnly, VisibleAnywhere)
double TemperatureCelcius = 0;

// Possible Other Functions - Fill, Drain...
// Possible Other Functions - Fill, Drain...

FString GetDebugMessage()
{
Expand All @@ -67,7 +67,7 @@ struct FGear
double NormalizedPosition = 1;

/*
* Doesn't exist in JSBSim, but need to be set in Editor in case you want to do separate gear animations
* Doesn't exist in JSBSim, but need to be set in Editor in case you want to do separate gear animations
*/
UPROPERTY(BlueprintReadOnly, EditAnywhere)
bool IsFrontBogey = false;
Expand Down Expand Up @@ -104,12 +104,12 @@ struct FGear
UPROPERTY(BlueprintReadOnly, VisibleAnywhere)
FVector Force = FVector(FVector::ZeroVector);

// Possible Other Functions - Steering, Compression...
// Possible Other Functions - Steering, Compression...

FString GetDebugMessage()
{
FString DebugMessage;
FString UpDownState("I");
FString UpDownState("I");
if (NormalizedPosition == 0) UpDownState = FString("U");
if (NormalizedPosition == 1) UpDownState = FString("D");
DebugMessage += FString::Printf(TEXT(" NormPosition %.2f [%s] WOW %d RollLinVel %.1f Force %.1f"), NormalizedPosition, *UpDownState, HasWeightOnWheel, WheelRollLinearVelocityMetersPerSec, Force.Length()) + LINE_TERMINATOR;
Expand All @@ -123,6 +123,7 @@ enum class EEngineType : uint8 {
Unknown,
Rocket,
Piston,
PistonDiesel,
Turbine,
Turboprop,
Electric
Expand Down Expand Up @@ -151,11 +152,11 @@ struct FEngineCommand
/* Normalized [0..1] value expected */
UPROPERTY(BlueprintReadWrite, EditAnywhere)
double Throttle = 0.0f;

/* Normalized [0..1] value expected */
UPROPERTY(BlueprintReadWrite, EditAnywhere)
double Mixture = 0.0f;

UPROPERTY(BlueprintReadWrite, EditAnywhere)
bool Starter = false;
UPROPERTY(BlueprintReadWrite, EditAnywhere)
Expand All @@ -176,13 +177,13 @@ struct FEngineCommand
bool Injection = false;
UPROPERTY(BlueprintReadWrite, EditAnywhere)
int32 Ignition = 0;

// Turbine & TurboPropeller Engine Commands
UPROPERTY(BlueprintReadWrite, EditAnywhere)
bool Reverse = false;
UPROPERTY(BlueprintReadWrite, EditAnywhere)
bool CutOff = false;

// TurboPropeller Engine Commands
UPROPERTY(BlueprintReadWrite, EditAnywhere)
bool GeneratorPower = false;
Expand Down Expand Up @@ -222,7 +223,7 @@ struct FEngineState
double Thrust = 0;
UPROPERTY(BlueprintReadOnly, VisibleAnywhere)
double EngineRPM = 0;

UPROPERTY(BlueprintReadOnly, VisibleAnywhere)
double N1 = 0; // Turbine
UPROPERTY(BlueprintReadOnly, VisibleAnywhere)
Expand All @@ -236,15 +237,15 @@ struct FEngineState
UPROPERTY(BlueprintReadOnly, VisibleAnywhere)
bool CutOff = false; // Turbine + TurboProp
UPROPERTY(BlueprintReadOnly, VisibleAnywhere)
int Ignition = 0; // Turbine +
int Ignition = 0; // Turbine +
UPROPERTY(BlueprintReadOnly, VisibleAnywhere)
bool GeneratorPower = false; // TurboProp
UPROPERTY(BlueprintReadOnly, VisibleAnywhere)
bool Condition = false; // TurboProp

UPROPERTY(BlueprintReadOnly, VisibleAnywhere)
EMagnetosMode Magnetos = EMagnetosMode::Off; // Piston

FString GetDebugMessage()
{
FString DebugMessage;
Expand All @@ -254,12 +255,12 @@ struct FEngineState
{
DebugMessage += FString::Printf(TEXT(" N1 %.2f N2 %.2f CutOff %d Augmentation %d Reversed %d Injection %d Ignition %d"), N1, N2, CutOff, Augmentation, Reversed, Injection, Ignition) + LINE_TERMINATOR;
}

if (EngineType == EEngineType::Piston)
{
DebugMessage += FString::Printf(TEXT(" Magnetos %s "), *UEnum::GetValueAsName(Magnetos).ToString()) + LINE_TERMINATOR;
}

return DebugMessage;
}
};
Expand Down Expand Up @@ -387,22 +388,22 @@ struct FAircraftState
double AltitudeRateFtps = 0;
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Speed")
double StallWarning = 0;


// Transformation
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Transformation")
FVector ECEFLocation = FVector::ZeroVector;
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Transformation")
double Latitude = 0;
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Transformation")
double Longitude = 0;
double Longitude = 0;
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Transformation")
FRotator LocalEulerAngles = FRotator::ZeroRotator;
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Transformation")
FVector EulerRates = FVector::ZeroVector;
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Transformation")
FVector UEForwardHorizontal = FVector::ZeroVector;

// Misc
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Misc")
bool Crashed = false;
Expand Down Expand Up @@ -448,7 +449,7 @@ enum class ETurbType:uint8
Milspec UMETA(DisplayName = "Milspec turbulence model (Dryden spectrum)"),
//Similar to ttMilspec, this model also uses the Dryden spectrum. The main difference lies in how the transfer functions are implemented based on the specifications in the military document. It helps in simulating realistic turbulence under similar conditions as the Milspec model.
Tustin UMETA(DisplayName = "Tustin turbulence model (Dryden spectrum)") ,

};
/*
* Wind State
Expand Down Expand Up @@ -495,8 +496,8 @@ struct JSBSIMFLIGHTDYNAMICSMODEL_API FSimpleWindState
static const FSimpleWindState StandardNorthZephyr;
//South wind, a wind speed that people perceive as relatively strong.
static const FSimpleWindState StandardSouthZephyr;



};

Empty file added aircraft/gazaile/.gitkeep
Empty file.
4 changes: 4 additions & 0 deletions aircraft/gazaile/Engines/GazAile_Elec_Engine.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0"?>
<electric_engine name="GazAile_Elec_Engine">
<power unit="WATTS"> 41000 </power> <!-- 41000 Watts Equivalent to ~55hp -->
</electric_engine>
37 changes: 37 additions & 0 deletions aircraft/gazaile/Engines/GazAile_Engine.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<?xml version="1.0"?>
<!--
File: GazAile_Engine.xml
Author: Aero-Matic v 0.83

Inputs:
name: GazAile_Engine
type: piston
power: 55 hp
augmented? no
injected? no
-->

<diesel_engine name="GazAile_Engine">
<!-- PSA TUD3 — 1,360 cc IDI naturally aspirated diesel
75 mm bore × 77 mm stroke, 4-cylinder, compression ratio 22.5:1
53 PS (52 hp / 39 kW) @ 5,000 RPM, 84 N·m @ 2,500 RPM
Indirect injection with Lucas/Bosch rotary distributor pump -->

<displacement unit="IN3"> 83.0 </displacement>
<maxhp> 52 </maxhp>
<maxrpm> 5500 </maxrpm>
<rated-rpm> 5000 </rated-rpm>
<peak-torque-rpm> 2500 </peak-torque-rpm>
<idlerpm> 1700 </idlerpm>
<cycles> 4 </cycles>
<bore unit="IN"> 2.953 </bore>
<stroke unit="IN"> 3.0315 </stroke>
<cylinders> 4 </cylinders>
<compression-ratio> 22 </compression-ratio>
<static-friction unit="HP"> 1.0 </static-friction>
<starter-torque> 30.0 </starter-torque>
<starter-rpm> 2000 </starter-rpm>
<injection-type> IDI </injection-type>
<static-fmep unit="PA"> 20000 </static-fmep>
<dynamic-fmep unit="PA"> 9000 </dynamic-fmep>
</diesel_engine>
79 changes: 79 additions & 0 deletions aircraft/gazaile/Engines/GazAile_Prop.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
<?xml version="1.0"?>
<!-- Generated by Aero-Matic v 1.1

Inputs:
horsepower: 55
pitch: fixed
max engine rpm: 5000
prop diameter (ft): 5.08555

Outputs:
max prop rpm: 2660
gear ratio: 1.88
Cp0: # 0.043 # 0.046
Ct0: # 0.060
static thrust (lbs): # 92 kg
-->

<propeller version="1.01" name="prop">
<ixx> 1.20 </ixx>
<diameter unit="IN"> 61.0 </diameter>
<numblades> 2 </numblades>
<gearratio> 1.88 </gearratio> <!--gearratio> 1.36 </gearratio-->
<cp_factor> 1.00 </cp_factor>
<ct_factor> 1.30 </ct_factor>

<table name="C_THRUST" type="internal">
<tableData>
0.0 0.0991
0.1 0.0946
0.2 0.0890
0.3 0.0824
0.4 0.0748
0.5 0.0662
0.6 0.0565
0.7 0.0457
0.8 0.0340
0.9 0.0212
1.0 0.0073
1.1 -0.0071
1.2 -0.0212
</tableData>
</table>

<table name="C_POWER" type="internal">
<tableData>
0.0 0.0419
0.1 0.0485
0.2 0.0528
0.3 0.0550
0.4 0.0550
0.5 0.0528
0.6 0.0485
0.7 0.0419
0.8 0.0332
0.9 0.0222
1.0 0.0091
1.1 0.0011
1.2 -0.0069
</tableData>
</table>

<!-- thrust effects of helical tip Mach -->
<table name="CT_MACH" type="internal">
<tableData>
0.85 1.0
1.05 0.8
</tableData>
</table>

<!-- power-required effects of helical tip Mach -->
<table name="CP_MACH" type="internal">
<tableData>
0.85 1.0
1.05 1.8
2.00 1.4
</tableData>
</table>

</propeller>
Loading
Loading