15 Commits

Author SHA1 Message Date
Kilian 20aa5c2416 Update to 1.1.28 2026-04-05 17:21:46 +02:00
Kilian 01e0a155ed 1.1.26+ FS24 adjustments 2026-03-28 21:02:15 +01:00
Kilian b772119e2c 1.1.18 EFB 2026-02-21 04:25:26 +01:00
Kilian 4628c6646c 1.1.17 EFB 2026-02-16 22:57:09 +01:00
Kilian 487ed3f589 GSX synced loading of fuel 2026-02-13 21:34:56 +01:00
Kilian 69680ced03 Initial GSX Sync for fuel 2026-02-13 02:50:43 +01:00
Kilian 122a93461d Non GSX Fuel setting 2026-02-12 21:27:12 +01:00
Kilian 310b5f39dc Update to 1.1.14 2026-02-05 22:16:28 +01:00
Kilian 3b003f3363 update to 1.1.14 2026-02-05 01:04:29 +01:00
Kilian 818277edcf Build 1.1.0 2026-01-28 20:13:43 +01:00
Kilian 73ebaa311b Update configs for flap drag 2026-01-28 15:48:56 +01:00
Kilian d96ea55b31 Fix GSX deboarding 2026-01-24 21:11:40 +01:00
Kilian b379a6dccd Update to 1.1.9 2026-01-24 13:59:54 +01:00
Kilian 766d956008 2024 Build an working 2025-12-16 21:30:47 +01:00
Kilian ec9facd4d9 New Configs 2025-12-16 21:02:20 +01:00
68 changed files with 11419 additions and 9083 deletions
+6
View File
@@ -0,0 +1,6 @@
---
BasedOnStyle: LLVM
ColumnLimit: 130
IndentCaseLabels: true
AllowShortIfStatementsOnASingleLine: Always
AllowShortLoopsOnASingleLine: true
+367 -4
View File
@@ -1,20 +1,383 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Oo]ut/
[Ll]og/
[Ll]ogs/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# ASP.NET Scaffolding
ScaffoldingReadMe.txt
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# BeatPulse healthcheck temp database
healthchecksdb
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
# Ionide (cross platform F# VS Code tools) working folder
.ionide/
# Fody - auto-generated XML schema
FodyWeavers.xsda
# Custom
Packages Packages
_PackageInt _PackageInt
PackagesMetadata PackagesMetadata
PackageSources/js-bundle/__generated__ PackageSources/js-bundle/__generated__
PackageSources/js-bundle/.rollup.cache PackageSources/js-bundle/.rollup.cache
PackageSources/js-bundle/node_modules
PackageSources/html_ui PackageSources/html_ui
PackageSources/wasm-module/.vs
PackageSources/wasm-module/MSFS PackageSources/wasm-module/MSFS
PackageSources/wasm-module/x64
node_modules node_modules
*.blend1 *.blend1
*.tsbuildinfo *.tsbuildinfo
PackageSources/SimObjects/Airplanes/**/panel/*.wasm PackageSources/SimObjects/Airplanes/**/*.wasm
EFB/efb.css EFB/efb.css
EFB/efb.js EFB/efb.js
EFB/efb.html EFB/efb.html
+29
View File
@@ -0,0 +1,29 @@
{
"configurations": [
{
"name": "Win32",
"includePath": [
"${workspaceFolder}/**",
"${workspaceFolder}/.vscode",
"C:\\MSFS 2024 SDK\\WASM\\wasi-sysroot\\include",
"C:\\MSFS 2024 SDK\\WASM\\wasi-sysroot\\include\\c++\\v1",
"C:\\MSFS 2024 SDK\\WASM\\include",
"C:\\MSFS 2024 SDK\\SimConnect SDK\\include"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"compilerArgs": [
"/Zc:__cplusplus"
],
"windowsSdkVersion": "10.0.26100.0",
"compilerPath": "cl.exe",
"cStandard": "c17",
"intelliSenseMode": "windows-msvc-x64",
"cppStandard": "c++14"
}
],
"version": 4
}
+3
View File
@@ -18,5 +18,8 @@
}, },
"[xml]": { "[xml]": {
"editor.defaultFormatter": "redhat.vscode-xml" "editor.defaultFormatter": "redhat.vscode-xml"
},
"[typescriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
} }
} }
+1 -2
View File
@@ -10,6 +10,5 @@ Index: EFB.html
-<script type="text/html" import-async="false" import-script="/Pages/VCockpit/Instruments/aircraft_efb/TFDi_MD11_efb/efb.index.js"></script> -<script type="text/html" import-async="false" import-script="/Pages/VCockpit/Instruments/aircraft_efb/TFDi_MD11_efb/efb.index.js"></script>
+<script type="text/html" import-async="false" import-script="/Pages/VCockpit/Instruments/aircraft_efb/KH_TFDi_MD11_efb/efb.index.js"></script> +<script type="text/html" import-async="false" import-script="/Pages/VCockpit/Instruments/aircraft_efb/KH_TFDi_MD11_efb/efb.index.js"></script>
-<link rel="stylesheet" href="/Pages/VCockpit/Instruments/aircraft_efb/TFDi_MD11_efb/efb.css" /> <link rel="stylesheet" href="/Pages/VCockpit/Instruments/aircraft_efb/TFDi_MD11_efb/efb.css" />
+<link rel="stylesheet" href="/Pages/VCockpit/Instruments/aircraft_efb/KH_TFDi_MD11_efb/efb.css" />
+<link rel="stylesheet" href="/Pages/VCockpit/Instruments/aircraft_efb/KH_TFDi_MD11_efb/App.css" /> +<link rel="stylesheet" href="/Pages/VCockpit/Instruments/aircraft_efb/KH_TFDi_MD11_efb/App.css" />
+16 -13
View File
@@ -2,23 +2,26 @@ Index: EFB.js
=================================================================== ===================================================================
--- EFB.js --- EFB.js
+++ EFB.js +++ EFB.js
@@ -30203,9 +30203,9 @@ @@ -50833,11 +50833,11 @@
{ ),
className: "middle none center rounded-lg bg-green-700 px-6 py-3 font-sans text-xs font-bold uppercase text-white shadow-md shadow-green-500/20 transition-all hover:shadow-lg hover:shadow-green-500/40 focus:opacity-[0.85] focus:shadow-none active:opacity-[0.85] active:shadow-none disabled:pointer-events-none disabled:opacity-50 disabled:shadow-none", /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
"data-ripple-light": "true", "button",
onClick: () => getOutput(), {
- children: "Set Payload" - onClick: loadPayload,
+ children: "Manage Payload" + onClick: () => dispatch(setRoute({ path: "/payload" })),
} className: "middle none center rounded-lg bg-green-700 px-6 py-3 font-sans text-xs font-bold uppercase text-white shadow-md shadow-green-500/20 transition-all hover:shadow-lg hover:shadow-green-500/40 focus:opacity-[0.85] focus:shadow-none active:opacity-[0.85] active:shadow-none disabled:pointer-events-none disabled:opacity-50 disabled:shadow-none",
) }) }) - children: "Set payload & fuel"
] }) }) }); + children: "Manage payload & fuel"
} }
@@ -40556,8 +40556,27 @@ ),
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
"button",
@@ -51343,8 +51343,27 @@
] }) ] })
] }) }) }); ] }) }) });
} }
+ // Exports for add. script +// Exports for add. script
+ window.reactExports = __toESM(require_react()); + window.reactExports = __toESM(require_react());
+ window.reactDomExports = __toESM(require_react_dom()); + window.reactDomExports = __toESM(require_react_dom());
+ window.jsxRuntimeExports = __toESM(require_jsx_runtime()); + window.jsxRuntimeExports = __toESM(require_jsx_runtime());
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<AssetPackage Version="0.1.0"> <AssetPackage Version="1.3.0">
<ItemSettings> <ItemSettings>
<ContentType>MISC</ContentType> <ContentType>MISC</ContentType>
<Title>TFDi Design MD-11 Load Manager</Title> <Title>TFDi Design MD-11 Load Manager</Title>
@@ -10,9 +10,10 @@
<VisibleInStore>false</VisibleInStore> <VisibleInStore>false</VisibleInStore>
<CanBeReferenced>false</CanBeReferenced> <CanBeReferenced>false</CanBeReferenced>
</Flags> </Flags>
<PackageOrderHint>CUSTOM_SIMOBJECTS_PATCH</PackageOrderHint>
<AssetGroups> <AssetGroups>
<AssetGroup Name="ContentInfo"> <AssetGroup Name="ContentInfo">
<Type>ContentInfo</Type> <Type Version="0">ContentInfo</Type>
<Flags> <Flags>
<FSXCompatibility>false</FSXCompatibility> <FSXCompatibility>false</FSXCompatibility>
</Flags> </Flags>
@@ -20,7 +21,7 @@
<OutputDir>ContentInfo\xkhofmann-tfdidesign-md11-load-manager\</OutputDir> <OutputDir>ContentInfo\xkhofmann-tfdidesign-md11-load-manager\</OutputDir>
</AssetGroup> </AssetGroup>
<AssetGroup Name="html-ui"> <AssetGroup Name="html-ui">
<Type>Copy</Type> <Type Version="0">Copy</Type>
<Flags> <Flags>
<FSXCompatibility>false</FSXCompatibility> <FSXCompatibility>false</FSXCompatibility>
</Flags> </Flags>
@@ -30,14 +31,16 @@
<Exclude>vendor-*</Exclude> <Exclude>vendor-*</Exclude>
</Config> </Config>
</AssetGroup> </AssetGroup>
<AssetGroup Name="md-11-panel-config"> <AssetGroup Name="wasm">
<Type>Copy</Type> <Type Version="0">Copy</Type>
<Flags> <Flags>
<FSXCompatibility>false</FSXCompatibility> <FSXCompatibility>false</FSXCompatibility>
</Flags> </Flags>
<AssetDir>PackageSources\SimObjects\Airplanes\</AssetDir> <AssetDir>PackageSources\SimObjects\Airplanes\</AssetDir>
<OutputDir>SimObjects\Airplanes\</OutputDir> <OutputDir>SimObjects\Airplanes\</OutputDir>
<Config>
<Exclude>.gitkeep</Exclude>
</Config>
</AssetGroup> </AssetGroup>
</AssetGroups> </AssetGroups>
</AssetPackage> </AssetPackage>
@@ -7,17 +7,17 @@ visible=1
pixel_size=2048,2048 pixel_size=2048,2048
texture=vc1 texture=vc1
background_color=0,0,0 background_color=0,0,0
htmlgauge00=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=Core, 0,0,509,510 htmlgauge00=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=DU1,0,0,509,510
htmlgauge01=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=DU1,0,0,508,508 htmlgauge01=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=DU2,514,0,510,510
htmlgauge02=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=DU2,514,0,510,510 htmlgauge02=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=DU3,1027,0,510,510
htmlgauge03=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=DU3,1027,0,510,510 htmlgauge03=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=DU4,1539,0,510,510
htmlgauge04=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=DU4,1539,0,510,508 htmlgauge04=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=DU5,0,513,511,510
htmlgauge05=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=DU5,0,513,511,509 htmlgauge05=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=DU6,513,512,510,511
htmlgauge06=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=DU6,513,512,510,511 htmlgauge06=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=LMCDU, 0,1050,666,574
htmlgauge07=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=LMCDU, 0,1050,666,574 htmlgauge07=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=RMCDU,678,1050,666,574
htmlgauge08=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=RMCDU,678,1050,666,574 htmlgauge08=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=CMCDU,1353,1050,666,574
htmlgauge09=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=CMCDU,1353,1050,666,574 htmlgauge09=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=ISFD,1032,519,544,505
htmlgauge10=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=ISFD,1032,519,544,505 htmlgauge10=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=Core,0,0,1,1
//KH new gauge //KH new gauge
htmlgauge11=WasmInstrument/WasmInstrument.html?wasm_module=load-manager.wasm&wasm_gauge=Load_Manager,0,0,509,510 htmlgauge11=WasmInstrument/WasmInstrument.html?wasm_module=load-manager.wasm&wasm_gauge=Load_Manager,0,0,509,510
@@ -1,15 +1,15 @@
//TFDi Designs MD-11 (GE CF6-80C2D1F) vRC1.7.0_GE 15MAY25 //TFDi Designs MD-11 (GE CF6-80C2D1F) vRC1.8.0_GE 04FEB26
[VERSION] [VERSION]
//KH Bump major //KH Bump major
major = 4 major = 4
minor = 1 minor = 8
[WEIGHT_AND_BALANCE] [WEIGHT_AND_BALANCE]
max_gross_weight = 630500 max_gross_weight = 630500
empty_weight = 283975 empty_weight = 283975
reference_datum_position = 0, 0, 0 reference_datum_position = 0, 0, 0
empty_weight_CG_position = -13.3, 0, 0 empty_weight_CG_position = -10.0, 0, 0
CG_forward_limit = 0.12 CG_forward_limit = 0.12
CG_aft_limit = 0.34 CG_aft_limit = 0.34
empty_weight_pitch_MOI = 20897456 empty_weight_pitch_MOI = 20897456
@@ -24,21 +24,21 @@ station_load.0=190, 82.0, -2.0, 4.0, Pilot, 1
station_load.1=190, 82.0, 2.0, 4.0, First Officer, 2 station_load.1=190, 82.0, 2.0, 4.0, First Officer, 2
station_load.2=190, 80.0, 3.3, 4.0, Engineer, 0 station_load.2=190, 80.0, 3.3, 4.0, Engineer, 0
station_load.3=760, 66.0, 0.0, 4.0, Cabin crew 1, 0 station_load.3=760, 66.0, 0.0, 4.0, Cabin crew 1, 0
station_load.4=0, 45.0, -5.0, 4.0, Business 1 L, 0 station_load.4=0, 45.0, -5.0, 4.0, Business 1 L, 4
station_load.5=0, 45.0, 0.0, 4.0, Business 1 C, 0 station_load.5=0, 45.0, 0.0, 4.0, Business 1 C, 4
station_load.6=0, 45.0, 5.0, 4.0, Business 1 R, 0 station_load.6=0, 45.0, 5.0, 4.0, Business 1 R, 4
station_load.7=0, 25.0, -5.0, 4.0, Business 2 L, 0 station_load.7=0, 25.0, -5.0, 4.0, Business 2 L, 4
station_load.8=0, 25.0, 0.0, 4.0, Business 2 C, 0 station_load.8=0, 25.0, 0.0, 4.0, Business 2 C, 4
station_load.9=0, 25.0, 5.0, 4.0, Business 2 R, 0 station_load.9=0, 25.0, 5.0, 4.0, Business 2 R, 4
station_load.10=0, -20.0, -5.0, 4.0, Economy 3 L, 0 station_load.10=0, -20.0, -5.0, 4.0, Economy 3 L, 3
station_load.11=0, -20.0, 0.0, 4.0, Economy 3 C, 0 station_load.11=0, -20.0, 0.0, 4.0, Economy 3 C, 3
station_load.12=0, -20.0, 5.0, 4.0, Economy 3 R, 0 station_load.12=0, -20.0, 5.0, 4.0, Economy 3 R, 3
station_load.13=0, -50.0, -5.0, 4.0, Economy 4 L, 0 station_load.13=0, -50.0, -5.0, 4.0, Economy 4 L, 5
station_load.14=0, -50.0, 0.0, 4.0, Economy 4 C, 0 station_load.14=0, -50.0, 0.0, 4.0, Economy 4 C, 5
station_load.15=0, -50.0, 5.0, 4.0, Economy 4 R, 0 station_load.15=0, -50.0, 5.0, 4.0, Economy 4 R, 5
station_load.16=760, -55.0, 0.0, 4.0, Cabin crew 2, 0 station_load.16=760, -55.0, 0.0, 4.0, Cabin crew 2, 0
station_load.17=0, 30.0, 0.0, -4.5, Forward cargo, 0 station_load.17=0, 30.0, 0.0, -4.5, Forward cargo, 6
station_load.18=0, -30.0, 0.0, -4.5, Rear cargo, 0 station_load.18=0, -30.0, 0.0, -4.5, Rear cargo, 6
station_load.19=0, 5.0, -2.0, -4.5, Left aux tank, 0 station_load.19=0, 5.0, -2.0, -4.5, Left aux tank, 0
station_load.20=0, 5.0, 2.0, -4.5, Right aux tank, 0 station_load.20=0, 5.0, 2.0, -4.5, Right aux tank, 0
//KH END //KH END
@@ -59,7 +59,7 @@ max_speed_decreasing_steering_castering = 35
emergency_extension_type = 2 emergency_extension_type = 2
hyd_need_power_to_function= 0 hyd_need_power_to_function= 0
min_castering_angle = 0.05236 min_castering_angle = 0.05236
max_castering_angle = 1.32645 max_castering_angle = 3.142
allow_stopped_steering = 1 allow_stopped_steering = 1
point.0 = 1, 64.22, 0.00, -17.31, 1500, 0, 1.67, 70, 1.15, 1.183, 0.9, 49, 50, 0, 200, 250, 8 point.0 = 1, 64.22, 0.00, -17.31, 1500, 0, 1.67, 70, 1.15, 1.183, 0.9, 49, 50, 0, 200, 250, 8
point.1 = 1, -19.00, -17.15, -18.02, 2000, 1, 2.25, 0, 1.60, 1.116, 0.9, 51, 52, 2, 200, 250, 8 point.1 = 1, -19.00, -17.15, -18.02, 2000, 1, 2.25, 0, 1.60, 1.116, 0.9, 51, 52, 2, 200, 250, 8
@@ -88,9 +88,9 @@ LeftTip = -39.00, -74.00, 0.00, 884.00, 10.00
RightTip = -39.00, 74.00, 0.00, 884.00, 10.00 RightTip = -39.00, 74.00, 0.00, 884.00, 10.00
External1 = -70.00, 0.00, -3.00, 2371.00, 10.00 External1 = -70.00, 0.00, -3.00, 2371.00, 10.00
//KH From 5.00, -2.00, -3.00, 0.00, 10.00 //KH From 5.00, -2.00, -3.00, 0.00, 10.00
LeftAux = 5.00, -2.00, -3.00, 1917.00, 10.00 LeftAux = 5.00, -2.00, -3.00, 1973.00, 10.00
//KH From 5.00, 2.00, -3.00, 0.00, 10.0 //KH From 5.00, 2.00, -3.00, 0.00, 10.0
RightAux = 5.00, 2.00, -3.00, 1917.00, 10.00 RightAux = 5.00, 2.00, -3.00, 1973.00, 10.00
fuel_type = 2 fuel_type = 2
number_of_tank_selectors = 3 number_of_tank_selectors = 3
electric_pump = 0 electric_pump = 0
@@ -175,7 +175,7 @@ lift_coef_horizontal_incidence = 0.91357
lift_coef_flaps = 1 lift_coef_flaps = 1
lift_coef_spoilers = 0 lift_coef_spoilers = 0
drag_coef_zero_lift = 0.02539 drag_coef_zero_lift = 0.02539
drag_coef_flaps = 0.1889 drag_coef_flaps = 0.1339
drag_coef_gear = 0.0549 drag_coef_gear = 0.0549
drag_coef_spoilers = 0.05207 drag_coef_spoilers = 0.05207
side_force_slip_angle = -0.77392 side_force_slip_angle = -0.77392
@@ -265,7 +265,7 @@ cruise_lift_scalar = 1
parasite_drag_scalar = 1 parasite_drag_scalar = 1
induced_drag_scalar = 1 induced_drag_scalar = 1
flap_induced_drag_scalar = 1 flap_induced_drag_scalar = 1
elevator_effectiveness = 1 elevator_effectiveness = 1.1
elevator_maxangle_scalar = 1 elevator_maxangle_scalar = 1
aileron_effectiveness = 1 aileron_effectiveness = 1
rudder_effectiveness = 1 rudder_effectiveness = 1
@@ -319,19 +319,19 @@ max_gear_extended = 200
[INTERACTIVE POINTS] [INTERACTIVE POINTS]
number_of_interactive_points = 13 number_of_interactive_points = 13
interactive_point.0 = 0.4,75.650002,-7.92,-0.567,2,0,0,-75,33,2,33,2,2,33,0 interactive_point.0 = 0.4,75.650002,-7.92,-0.567,2,0,0,-75,33,2,33,2,2,33,-1
interactive_point.1 = 0.4,75.650002,7.92,-0.567,0,0,0,75,33,2,33,2,2,33 interactive_point.1 = 0.4,75.650002,7.92,-0.567,0,0,0,75,33,2,33,2,2,33,-1
interactive_point.2 = 0.4,33.299999,6.28,-7.18,1,0,0,90,0,0,0,0,0,0 interactive_point.2 = 0.4,33.299999,6.28,-7.18,1,0,0,90,0,0,0,0,0,0,-1
interactive_point.3 = 0.4,-51.700363,6.28,-7.180745,1,0,0,90,0,0,0,0,0,0,0 interactive_point.3 = 0.4,-51.700363,6.28,-7.180745,1,0,0,90,0,0,0,0,0,0,-1
interactive_point.4 = 0.4,-68.277824,-2.822939,-5.923376,1,2.395636,12.258935,79.089348,0,0,0,0,0,0,0 interactive_point.4 = 0.4,-68.277824,-2.822939,-5.923376,1,2.395636,12.258935,79.089348,0,0,0,0,0,0,-1
interactive_point.5 = 0,85.062134,-3.882079,4.412694,2,-0,-29.85655,42.814491,0,0,0,0,0,0,0 interactive_point.5 = 0,85.062134,-3.882079,4.412694,2,-0,-29.85655,42.814491,0,0,0,0,0,0,-1
interactive_point.6 = 0,85.062134,3.882079,4.412694,2,-0,29.85655,-42.814491,0,0,0,0,0,0,0 interactive_point.6 = 0,85.062134,3.882079,4.412694,2,-0,29.85655,-42.814491,0,0,0,0,0,0,-1
interactive_point.7 = 0.4,44.150002,-10.05,-0.567,0,0,0,-88,35,0,35,0,2,33 interactive_point.7 = 0.4,44.150002,-10.05,-0.567,0,0,0,-88,35,0,35,0,2,33,-1
interactive_point.8 = 0.4,44.150002,10.05,-0.567,0,0,0,88,35,0,35,0,2,33,0 interactive_point.8 = 0.4,44.150002,10.05,-0.567,0,0,0,88,35,0,35,0,2,33,-1
interactive_point.9 = 0.4,-2.869313,-10.049908,-0.566572,0,0,0,-90,35,0,35,0,2,33,0 interactive_point.9 = 0.4,-2.869313,-10.049908,-0.566572,0,0,0,-90,35,0,35,0,2,33,-1
interactive_point.10 = 0.4,-2.869313,10.049908,-0.566572,0,0,0,90,35,0,35,0,2,33,0 interactive_point.10 = 0.4,-2.869313,10.049908,-0.566572,0,0,0,90,35,0,35,0,2,33,-1
interactive_point.11 = 0.4,-62.995712,-8.519092,-0.565611,0,0,0,-100,35,0,35,0,2,33,0 interactive_point.11 = 0.4,-62.995712,-8.519092,-0.565611,0,0,0,-100,35,0,35,0,2,33,-1
interactive_point.12 = 0.4,-62.995712,8.519092,-0.565611,0,0,0,100,35,0,35,0,2,33,0 interactive_point.12 = 0.4,-62.995712,8.519092,-0.565611,0,0,0,100,35,0,35,0,2,33,-1
[STALL PROTECTION] [STALL PROTECTION]
stall_protection = 1 ; Alpha Protection stall_protection = 1 ; Alpha Protection
@@ -348,8 +348,8 @@ type = 1
system_type = 1 system_type = 1
span-outboard = 0.25 span-outboard = 0.25
extending-time = 22 extending-time = 22
damaging-speed = 250 damaging-speed = 280
blowout-speed = 300 blowout-speed = 310
maneuvering_flaps = 0 maneuvering_flaps = 0
lift_scalar = 0.1 lift_scalar = 0.1
drag_scalar = 1.1 drag_scalar = 1.1
@@ -357,12 +357,12 @@ pitch_scalar = 1
max_on_ground_position = 7 max_on_ground_position = 7
flaps-position.0 = 0, -1, 0 flaps-position.0 = 0, -1, 0
flaps-position.1 = 0, -1, 0 flaps-position.1 = 0, -1, 0
flaps-position.2 = 15, 215, 0.25, 2, 0, 0, 0, 1 flaps-position.2 = 15, 215, 0.45, 2, 0, 0, 0, 1
flaps-position.3 = 20, 200, 0.26, 1.1, 0, 0, 0, 1 flaps-position.3 = 20, 200, 0.46, 1.1, 0, 0, 0, 1
flaps-position.4 = 24, 185, 0.28, 1.0, 0, 0, 0, 1 flaps-position.4 = 24, 185, 0.48, 1.0, 0, 0, 0, 1
flaps-position.5 = 28, 177, 0.3, 1.0, 1.5, 0, 0 flaps-position.5 = 28, 177, 0.3, 1.0, 1.5, 0, 0
flaps-position.6 = 35, 160, 0.32, 1 flaps-position.6 = 35, 160, 0.32, 1
flaps-position.7 = 50, 150, 0.33, 1 flaps-position.7 = 50, 155, 0.43, 1
[FLAPS.1] [FLAPS.1]
@@ -370,8 +370,8 @@ type = 1
system_type = 1 system_type = 1
span-outboard = 0.7 span-outboard = 0.7
extending-time = 23 extending-time = 23
damaging-speed = 250 damaging-speed = 280
blowout-speed = 300 blowout-speed = 310
maneuvering_flaps = 0 maneuvering_flaps = 0
lift_scalar = 0.1 lift_scalar = 0.1
drag_scalar = 1.1 drag_scalar = 1.1
@@ -379,12 +379,12 @@ pitch_scalar = 1
max_on_ground_position = 7 max_on_ground_position = 7
flaps-position.0 = 0, -1, 0 flaps-position.0 = 0, -1, 0
flaps-position.1 = 0, -1, 0 flaps-position.1 = 0, -1, 0
flaps-position.2 = 15, 215, 0.25, 2, 0, 0, 0, 1 flaps-position.2 = 15, 215, 0.45, 2, 0, 0, 0, 1
flaps-position.3 = 20, 200, 0.26, 1.1, 0, 0, 0, 1 flaps-position.3 = 20, 200, 0.46, 1.1, 0, 0, 0, 1
flaps-position.4 = 24, 185, 0.28, 1.0, 0, 0, 0, 1 flaps-position.4 = 24, 185, 0.48, 1.0, 0, 0, 0, 1
flaps-position.5 = 28, 177, 0.3, 1.0, 1.5, 0, 0 flaps-position.5 = 28, 177, 0.3, 1.0, 1.5, 0, 0
flaps-position.6 = 35, 160, 0.32, 1 flaps-position.6 = 35, 160, 0.32, 1
flaps-position.7 = 50, 150, 0.33, 1 flaps-position.7 = 50, 155, 0.43, 1
[FLAPS.2] [FLAPS.2]
@@ -392,8 +392,8 @@ type = 2
system_type = 1 system_type = 1
span-outboard = 0.2 span-outboard = 0.2
extending-time = 8 extending-time = 8
damaging-speed = 250 damaging-speed = 300
blowout-speed = 300 blowout-speed = 330
maneuvering_flaps = 0 maneuvering_flaps = 0
lift_scalar = 0.5 lift_scalar = 0.5
drag_scalar = 0.75 drag_scalar = 0.75
@@ -407,8 +407,8 @@ type = 2
system_type = 1 system_type = 1
span-outboard = 0.7 span-outboard = 0.7
extending-time = 21 extending-time = 21
damaging-speed = 250 damaging-speed = 300
blowout-speed = 300 blowout-speed = 330
maneuvering_flaps = 0 maneuvering_flaps = 0
lift_scalar = 0.5 lift_scalar = 0.5
drag_scalar = 0.75 drag_scalar = 0.75
@@ -0,0 +1,418 @@
//TFDi Designs MD-11 (GE CF6-80C2D1F) vRC1.8.0_GE 04FEB26
[VERSION]
//KH Bump major
major = 4
minor = 8
[WEIGHT_AND_BALANCE]
max_gross_weight = 630500
empty_weight = 283975
reference_datum_position = 0, 0, 0
empty_weight_CG_position = -10.0, 0, 0
CG_forward_limit = 0.12
CG_aft_limit = 0.34
empty_weight_pitch_MOI = 20897456
empty_weight_roll_MOI = 6368555
empty_weight_yaw_MOI = 40761191
empty_weight_coupled_MOI = 0
activate_mach_limit_based_on_cg = 0
activate_cg_limit_based_on_mach = 0
max_number_of_stations = 21
//KH START Empty default
station_load.0=190, 82.0, -2.0, 4.0, Pilot, 1
station_load.1=190, 82.0, 2.0, 4.0, First Officer, 2
station_load.2=190, 80.0, 3.3, 4.0, Engineer, 0
station_load.3=760, 66.0, 0.0, 4.0, Cabin crew 1, 0
station_load.4=0, 45.0, -5.0, 4.0, Business 1 L, 4
station_load.5=0, 45.0, 0.0, 4.0, Business 1 C, 4
station_load.6=0, 45.0, 5.0, 4.0, Business 1 R, 4
station_load.7=0, 25.0, -5.0, 4.0, Business 2 L, 4
station_load.8=0, 25.0, 0.0, 4.0, Business 2 C, 4
station_load.9=0, 25.0, 5.0, 4.0, Business 2 R, 4
station_load.10=0, -20.0, -5.0, 4.0, Economy 3 L, 3
station_load.11=0, -20.0, 0.0, 4.0, Economy 3 C, 3
station_load.12=0, -20.0, 5.0, 4.0, Economy 3 R, 3
station_load.13=0, -50.0, -5.0, 4.0, Economy 4 L, 5
station_load.14=0, -50.0, 0.0, 4.0, Economy 4 C, 5
station_load.15=0, -50.0, 5.0, 4.0, Economy 4 R, 5
station_load.16=760, -55.0, 0.0, 4.0, Cabin crew 2, 0
station_load.17=0, 30.0, 0.0, -4.5, Forward cargo, 6
station_load.18=0, -30.0, 0.0, -4.5, Rear cargo, 6
station_load.19=0, 5.0, -2.0, -4.5, Left aux tank, 0
station_load.20=0, 5.0, 2.0, -4.5, Right aux tank, 0
//KH END
[CONTACT_POINTS]
static_pitch = 0
static_cg_height = 16.4
gear_system_type = 1
tailwheel_lock = 0
max_number_of_points = 16
gear_locked_on_ground = 0
gear_locked_above_speed = -1
max_speed_full_steering = 25
min_available_steering_angle_pct = 0.2
max_speed_decreasing_steering = 45
max_speed_full_steering_castering = 20
max_speed_decreasing_steering_castering = 35
emergency_extension_type = 2
hyd_need_power_to_function= 0
min_castering_angle = 0.05236
max_castering_angle = 3.142
allow_stopped_steering = 1
point.0 = 1, 64.22, 0.00, -17.31, 1500, 0, 1.67, 70, 1.15, 1.183, 0.9, 49, 50, 0, 200, 250, 8
point.1 = 1, -19.00, -17.15, -18.02, 2000, 1, 2.25, 0, 1.60, 1.116, 0.9, 51, 52, 2, 200, 250, 8
point.2 = 1, -19.00, 17.15, -18.02, 2000, 2, 2.25, 0, 1.60, 1.116, 0.9, 53, 54, 3, 200, 250, 8
point.3 = 1, -19.00, 0.00, -18.02, 2000, 2, 2.25, 0, 1.60, 1.116, 0.9, 55, 56, 3, 200, 250, 8
point.4 = 2, 93.0, 0.0, 0.0, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 9, 0, 0, 1
point.5 = 2, -48, -82.5, 0.0, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 5, 0, 0, 1
point.6 = 2, -48, 82.5, 0.0, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 6, 0, 0, 1
point.7 = 2, 60, 0.0, -9.0, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 9, 0, 0, 1
point.8 = 2, 60, 0.0, 11.0, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 9, 0, 0, 1
point.9 = 2, 16.0, -28.00, -13.00, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 4, 0, 0, 1
point.10 = 2, 16.0, 28.00, -13.00, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 4, 0, 0, 1
point.11 = 2, -110.0, 0.00, 14.20, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 4, 0, 0, 1
point.12 = 2, -96.5, 0.0, 42.0, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 4, 0, 0, 1
point.13 = 2, -94.5, -30.0, 8.0, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 4, 0, 0, 1
point.14 = 2, -94.5, 30.0, 8.05, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 4, 0, 0, 1
point.15 = 2, -52.0, 0.0, -9.0, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 9, 0, 0, 1
[FUEL]
LeftMain = -20.00, -38.00, -1.0, 8938, 10.00
RightMain = -20.00, 38.00, -1.0, 8938, 10.00
Center1 = 10.00, 0.00, -3.00, 13000.00, 10.00
Center2 = 0.00, 0.00, -1.00, 1642.00, 10.00
Center3 = 0.00, 0.00, -5.00, 1958.00, 11.00
LeftTip = -39.00, -74.00, 0.00, 884.00, 10.00
RightTip = -39.00, 74.00, 0.00, 884.00, 10.00
External1 = -70.00, 0.00, -3.00, 2371.00, 10.00
//KH From 5.00, -2.00, -3.00, 0.00, 10.00
LeftAux = 5.00, -2.00, -3.00, 1973.00, 10.00
//KH From 5.00, 2.00, -3.00, 0.00, 10.0
RightAux = 5.00, 2.00, -3.00, 1973.00, 10.00
fuel_type = 2
number_of_tank_selectors = 3
electric_pump = 0
engine_driven_pump = 1
manual_transfer_pump = 0
manual_pump = 0
anemometer_pump = 0
fuel_dump_rate = 0.02
default_fuel_tank_selector.1 = 1
default_fuel_tank_selector.2 = 1
default_fuel_tank_selector.3 = 1
[AIRPLANE_GEOMETRY]
wing_area = 3648
wing_span = 170.5
wing_root_chord = 34.68
wing_camber = 1
wing_thickness_ratio = 0.04
wing_dihedral = 2.2
wing_incidence = 1.5
wing_twist = -0.5
oswald_efficiency_factor = 0.72
wing_winglets_flag = 1
wing_sweep = 38
wing_pos_apex_lon = 1
wing_pos_apex_vert = -2.75
htail_area = 920
htail_span = 59.5
htail_pos_lon = -88
htail_pos_vert = 5.0
htail_incidence = 0.8
htail_sweep = 36.5
htail_thickness_ratio = 0.02
vtail_area = 760
vtail_span = 28.1
vtail_sweep = 43
vtail_pos_lon = -79.5
vtail_pos_vert = 28
vtail_thickness_ratio = 0.03
fuselage_length = 202.16
fuselage_diameter = 19.75
fuselage_center_pos = 10, 0, 1.0
elevator_area = 327.0
aileron_area = 225.0
rudder_area = 190.0
elevator_up_limit = 25
elevator_down_limit = 15
aileron_up_limit = 25
aileron_down_limit = 15
rudder_limit = 23
rudder_trim_limit = 20
elevator_trim_limit = 30
spoiler_limit = 60
spoilerons_available = 1
aileron_to_spoileron_gain = 3
min_ailerons_for_spoilerons = 10
min_flaps_for_spoilerons = 0
spoiler_extension_time = 2.0
spoiler_handle_available = 1
auto_spoiler_available = 1
auto_spoiler_auto_retracts = 0
auto_spoiler_min_speed = 72
positive_g_limit_flaps_up = 5.0
positive_g_limit_flaps_down = 4.0
negative_g_limit_flaps_up = -4.0
negative_g_limit_flaps_down = -3.0
load_safety_factor = 1.5
elevator_trim_neutral = -1
aileron_to_rudder_scale = 0
flap_to_aileron_scale = 0
fly_by_wire = 0
elevator_elasticity_table = 0:0.7, 87:0.3, 210:0.5, 315:0.5
aileron_elasticity_table = 0:1, 300:0.7, 600:0.6, 1500:0.4
rudder_elasticity_table = 0:1, 300:1, 800:1, 1000:0.7
elevator_trim_elasticity_table = 0:0.0, 87:0.40, 240:0.60, 295:1.00, 315:1.00
[AERODYNAMICS]
lift_coef_pitch_rate = -8.09375
lift_coef_daoa = 2.68359
lift_coef_delta_elevator = -0.28906
lift_coef_horizontal_incidence = 0.91357
lift_coef_flaps = 1
lift_coef_spoilers = 0
drag_coef_zero_lift = 0.02539
drag_coef_flaps = 0.1339
drag_coef_gear = 0.0549
drag_coef_spoilers = 0.05207
side_force_slip_angle = -0.77392
side_force_roll_rate = 0.15478
side_force_yaw_rate = 0
side_force_delta_rudder = -0.14746
pitch_moment_horizontal_incidence = 4.24755
pitch_moment_delta_elevator = -2.37011
pitch_moment_delta_trim = 0
pitch_moment_pitch_damping = -214.1455
pitch_moment_aoa_0 = 0.11621
pitch_moment_daoa = 8.87255
pitch_moment_flaps = 0.0105
pitch_moment_gear = 0.0171
pitch_moment_spoilers = 0
pitch_moment_delta_elevator_propwash = -2.37011
pitch_moment_pitch_propwash = -214.1455
roll_moment_slip_angle = 0.26855
roll_moment_roll_damping = -3.40869
roll_moment_yaw_rate = -0.27197
roll_moment_spoilers = 0.07
roll_moment_delta_aileron = -0.34521
roll_moment_delta_rudder = 0.01660
roll_moment_delta_aileron_trim_scalar = -0.2
yaw_moment_slip_angle = 0.18066
yaw_moment_roll = 0.07470
yaw_moment_yaw_damping = -2.49023
yaw_moment_yaw_propwash = 0
yaw_moment_delta_aileron = -0.00683
yaw_moment_delta_rudder = 0.07128
yaw_moment_delta_rudder_propwash = 0.075
yaw_moment_delta_rudder_trim_scalar = -0.2
compute_aero_center = 0
aero_center_lift = -13.75
lift_coef_aoa_table = -3.15:0, -2.36:0.36, -1.57:0, -0.349:-1.2, 0:-0.022, 0.0314:0.6082, 0.221:2.049, 0.244:1.15, 0.349:0.6, 0.436:0.5, 0.698:0.1, 1.963:-0.359, 2.356:-0.5, 3.15:0
lift_coef_ground_effect_mach_table = 0.06:0.50, 0.227:0.80, 0.242:0.80, 0.3:1.0, 0.9:1.0
lift_coef_mach_table = 0:1
lift_coef_delta_elevator_mach_table = 0:0
lift_coef_daoa_mach_table = 0:0
lift_coef_pitch_rate_mach_table = 0:0
lift_coef_horizontal_incidence_mach_table = 0:0
drag_coef_zero_lift_mach_tab = 0:0, 0.4:0.0054, 0.5:0.0056, 0.6:0.0059, 0.7:0.0062, 0.72:0.0062, 0.8:0.0063, 0.8:0.0063, 1:0.0337, 1.2:0.0337, 1.4:0.0337, 1.6:0.0337, 1.8:0.0337, 2.0:0.0337
side_force_slip_angle_mach_table = 0:0
side_force_delta_rudder_mach_table = 0:0
side_force_yaw_rate_mach_table = 0:0
side_force_roll_rate_mach_table = 0:0
pitch_moment_aoa_table = -3.15:-2, -0.436:-0.626, -0.262:-0.434, 0:-0.146, 0.087:-0.05, 0.175:0.0466, 0.262:0.143, 0.314:0.2, 0.349:0.1, 0.436:0.15, 3.15:2
pitch_moment_delta_elevator_aoa_table = -180:-1, -40:0.05, -20:0.455, -14:0.853, -7:1.007, 0:1, 7:0.839, 14:0.693, 20:0.381, 40:-0.08, 180:-1
pitch_moment_horizontal_incidence_aoa_table = 0:1
pitch_moment_daoa_aoa_table = 0:1
pitch_moment_pitch_alpha_table = 0:1
pitch_moment_delta_elevator_mach_table = 0:0
pitch_moment_daoa_mach_table = 0:0
pitch_moment_pitch_rate_mach_table = 0:0
pitch_moment_horizontal_incidence_mach_table = 0:0
pitch_moment_aoa_0_mach_table = 0:0
roll_moment_aoa_table = 0:0
roll_moment_slip_angle_aoa_table = 0:1
roll_moment_roll_rate_aoa_table = 0:1
roll_moment_delta_aileron_aoa_table = 0:1
roll_moment_slip_angle_mach_table = 0:0
roll_moment_delta_rudder_mach_table = 0:0
roll_moment_delta_aileron_mach_table = 0:0
roll_moment_yaw_rate_mach_table = 0:0
roll_moment_roll_rate_mach_table = 0:0
yaw_moment_aoa_table = 0:0
yaw_moment_slip_angle_aoa_table = 0:1
yaw_moment_yaw_rate_aoa_table = 0:1
yaw_moment_delta_rudder_aoa_table = 0:1
yaw_moment_slip_angle_mach_table = 0:0
yaw_moment_delta_rudder_mach_table = 0:0
yaw_moment_delta_aileron_mach_table = 0:0
yaw_moment_yaw_rate_mach_table = 0:0
yaw_moment_roll_rate_mach_table = 0:0
elevator_scaling_table = -0.785:0.5, -0.524:0.85, -0.175:0.9, 0:1, 0.175:0.9, 0.524:0.85, 0.785:0.5 ; 0:1
aileron_scaling_table = -0.785:1 ;0:1
rudder_scaling_table = -0.785:0.5, -0.524:0.6, -0.175:0.9, 0:1, 0.175:0.9, 0.524:0.6, 0.785:0.5 ;0:1
elevator_lift_coef=3
rudder_lift_coef=2
aileron_load_factor_effectiveness_table = 0:1
lift_coef_at_drag_zero = 0.1
lift_coef_at_drag_zero_flaps = 0.1
[FLIGHT_TUNING]
modern_fm_only = 1
cruise_lift_scalar = 1
parasite_drag_scalar = 1
induced_drag_scalar = 1
flap_induced_drag_scalar = 1
elevator_effectiveness = 1.1
elevator_maxangle_scalar = 1
aileron_effectiveness = 1
rudder_effectiveness = 1
rudder_maxangle_scalar = 1
pitch_stability = 5
roll_stability = 1
yaw_stability = 1
pitch_gyro_stability = 1
roll_gyro_stability = 1
yaw_gyro_stability = 1
empty_CG_deviation_limit=0
elevator_trim_effectiveness = 1.5
aileron_trim_effectiveness = 1
rudder_trim_effectiveness = 1
hi_alpha_on_roll = 0
hi_alpha_on_yaw = 0
p_factor_on_yaw = 0
torque_on_roll = 0
gyro_precession_on_roll = 0
gyro_precession_on_yaw = 0
engine_wash_on_roll = 0
wingflex_scalar = 2
wingflex_offset = 0
stall_coef_at_min_weight = 0.71
ground_crosswind_effect_zero_speed=10
ground_crosswind_effect_max_speed=150
ground_high_speed_steeringwheel_static_friction_scalar=1.5
ground_high_speed_otherwheel_static_friction_scalar=1.2
[REFERENCE SPEEDS]
full_flaps_stall_speed = 115
flaps_up_stall_speed = 149
cruise_speed = 345
cruise_mach = 0.85
crossover_speed = 330
max_mach = 0.9
max_indicated_speed = 395
max_flaps_extended = 170
normal_operating_speed = 325
airspeed_indicator_max = 562.5
rotation_speed_min = 145
climb_speed = 250
cruise_alt = 41000
takeoff_speed = 165
spawn_cruise_altitude = 5000
spawn_descent_altitude = 500
best_angle_climb_speed = 0
approach_speed = 0
best_glide = 0
max_gear_extended = 200
[INTERACTIVE POINTS]
number_of_interactive_points = 13
interactive_point.0 = 0.4,75.650002,-7.92,-0.567,2,0,0,-75,33,2,33,2,2,33,-1
interactive_point.1 = 0.4,75.650002,7.92,-0.567,0,0,0,75,33,2,33,2,2,33,-1
interactive_point.2 = 0.4,33.299999,6.28,-7.18,1,0,0,90,0,0,0,0,0,0,-1
interactive_point.3 = 0.4,-51.700363,6.28,-7.180745,1,0,0,90,0,0,0,0,0,0,-1
interactive_point.4 = 0.4,-68.277824,-2.822939,-5.923376,1,2.395636,12.258935,79.089348,0,0,0,0,0,0,-1
interactive_point.5 = 0,85.062134,-3.882079,4.412694,2,-0,-29.85655,42.814491,0,0,0,0,0,0,-1
interactive_point.6 = 0,85.062134,3.882079,4.412694,2,-0,29.85655,-42.814491,0,0,0,0,0,0,-1
interactive_point.7 = 0.4,44.150002,-10.05,-0.567,0,0,0,-88,35,0,35,0,2,33,-1
interactive_point.8 = 0.4,44.150002,10.05,-0.567,0,0,0,88,35,0,35,0,2,33,-1
interactive_point.9 = 0.4,-2.869313,-10.049908,-0.566572,0,0,0,-90,35,0,35,0,2,33,-1
interactive_point.10 = 0.4,-2.869313,10.049908,-0.566572,0,0,0,90,35,0,35,0,2,33,-1
interactive_point.11 = 0.4,-62.995712,-8.519092,-0.565611,0,0,0,-100,35,0,35,0,2,33,-1
interactive_point.12 = 0.4,-62.995712,8.519092,-0.565611,0,0,0,100,35,0,35,0,2,33,-1
[STALL PROTECTION]
stall_protection = 1 ; Alpha Protection
off_limit = 11.5 ; Alpha below which the Alpha Protection can be disabled (If also below off_yoke_limit)
off_yoke_limit = 1 ; Yoke position (in Pct) below which the Alpha Protection can be disabled (If also below off_limit)
on_limit = 14 ; Alpha above which the Alpha Protection timer starts
on_goal = 10 ; The alpha that the Alpha Protection will attempt to reach when triggered
timer_trigger = 1.0 ; Duration (in Sec) the alpha must be above on_limit before the Alpha Protection is triggered
;===================== FLAPS =====================
[FLAPS.0]
type = 1
system_type = 1
span-outboard = 0.25
extending-time = 22
damaging-speed = 280
blowout-speed = 310
maneuvering_flaps = 0
lift_scalar = 0.1
drag_scalar = 1.1
pitch_scalar = 1
max_on_ground_position = 7
flaps-position.0 = 0, -1, 0
flaps-position.1 = 0, -1, 0
flaps-position.2 = 15, 215, 0.45, 2, 0, 0, 0, 1
flaps-position.3 = 20, 200, 0.46, 1.1, 0, 0, 0, 1
flaps-position.4 = 24, 185, 0.48, 1.0, 0, 0, 0, 1
flaps-position.5 = 28, 177, 0.3, 1.0, 1.5, 0, 0
flaps-position.6 = 35, 160, 0.32, 1
flaps-position.7 = 50, 155, 0.43, 1
[FLAPS.1]
type = 1
system_type = 1
span-outboard = 0.7
extending-time = 23
damaging-speed = 280
blowout-speed = 310
maneuvering_flaps = 0
lift_scalar = 0.1
drag_scalar = 1.1
pitch_scalar = 1
max_on_ground_position = 7
flaps-position.0 = 0, -1, 0
flaps-position.1 = 0, -1, 0
flaps-position.2 = 15, 215, 0.45, 2, 0, 0, 0, 1
flaps-position.3 = 20, 200, 0.46, 1.1, 0, 0, 0, 1
flaps-position.4 = 24, 185, 0.48, 1.0, 0, 0, 0, 1
flaps-position.5 = 28, 177, 0.3, 1.0, 1.5, 0, 0
flaps-position.6 = 35, 160, 0.32, 1
flaps-position.7 = 50, 155, 0.43, 1
[FLAPS.2]
type = 2
system_type = 1
span-outboard = 0.2
extending-time = 8
damaging-speed = 300
blowout-speed = 330
maneuvering_flaps = 0
lift_scalar = 0.5
drag_scalar = 0.75
pitch_scalar = 1
max_on_ground_position = 1
flaps-position.0 = 0, -1, 0
flaps-position.1 = 20, 215, 0.5, 0.5
[FLAPS.3]
type = 2
system_type = 1
span-outboard = 0.7
extending-time = 21
damaging-speed = 300
blowout-speed = 330
maneuvering_flaps = 0
lift_scalar = 0.5
drag_scalar = 0.75
pitch_scalar = 1
max_on_ground_position = 1
flaps-position.0 = 0, -1, 0
flaps-position.1 = 20, 215, 0.5, 0.5
@@ -0,0 +1,417 @@
; TFDi Designs MD-11 (PW4462) vRC1.8.0_PW 04FEB26
[MODULAR_MERGE]
auto = true
[VERSION]
//KH Bump major
major = 4
minor = 8
[WEIGHT_AND_BALANCE]
max_gross_weight = 630500
empty_weight = 283975
reference_datum_position = 0, 0, 0
empty_weight_CG_position = -10.0, 0, 0
CG_forward_limit = 0.12
CG_aft_limit = 0.34
empty_weight_pitch_MOI = 20897456
empty_weight_roll_MOI = 6368555
empty_weight_yaw_MOI = 40761191
empty_weight_coupled_MOI = 0
activate_mach_limit_based_on_cg = 0
activate_cg_limit_based_on_mach = 0
max_number_of_stations = 21
//KH START Empty default
station_load.0=190, 82.0, -2.0, 4.0, Pilot, 1
station_load.1=190, 82.0, 2.0, 4.0, First Officer, 2
station_load.2=190, 80.0, 3.3, 4.0, Engineer, 0
station_load.3=760, 66.0, 0.0, 4.0, Cabin crew 1, 0
station_load.4=0, 45.0, -5.0, 4.0, Business 1 L, 4
station_load.5=0, 45.0, 0.0, 4.0, Business 1 C, 4
station_load.6=0, 45.0, 5.0, 4.0, Business 1 R, 4
station_load.7=0, 25.0, -5.0, 4.0, Business 2 L, 4
station_load.8=0, 25.0, 0.0, 4.0, Business 2 C, 4
station_load.9=0, 25.0, 5.0, 4.0, Business 2 R, 4
station_load.10=0, -20.0, -5.0, 4.0, Economy 3 L, 3
station_load.11=0, -20.0, 0.0, 4.0, Economy 3 C, 3
station_load.12=0, -20.0, 5.0, 4.0, Economy 3 R, 3
station_load.13=0, -50.0, -5.0, 4.0, Economy 4 L, 5
station_load.14=0, -50.0, 0.0, 4.0, Economy 4 C, 5
station_load.15=0, -50.0, 5.0, 4.0, Economy 4 R, 5
station_load.16=760, -55.0, 0.0, 4.0, Cabin crew 2, 0
station_load.17=0, 30.0, 0.0, -4.5, Forward cargo, 6
station_load.18=0, -30.0, 0.0, -4.5, Rear cargo, 6
station_load.19=0, 5.0, -2.0, -4.5, Left aux tank, 0
station_load.20=0, 5.0, 2.0, -4.5, Right aux tank, 0
//KH END
[CONTACT_POINTS]
static_pitch = 0
static_cg_height = 16.4
gear_system_type = 1
tailwheel_lock = 0
max_number_of_points = 16
gear_locked_on_ground = 0
gear_locked_above_speed = -1
max_speed_full_steering = 25
min_available_steering_angle_pct = 0.2
max_speed_decreasing_steering = 45
max_speed_full_steering_castering = 20
max_speed_decreasing_steering_castering = 35
emergency_extension_type = 2
hyd_need_power_to_function= 0
min_castering_angle = 0.05236
max_castering_angle = 3.142
allow_stopped_steering = 1
point.0 = 1, 64.22, 0.00, -17.31, 1500, 0, 1.67, 70, 1.15, 1.183, 0.9, 49, 50, 0, 200, 250, 8
point.1 = 1, -19.00, -17.15, -18.02, 2000, 1, 2.25, 0, 1.60, 1.116, 0.9, 51, 52, 2, 200, 250, 8
point.2 = 1, -19.00, 17.15, -18.02, 2000, 2, 2.25, 0, 1.60, 1.116, 0.9, 53, 54, 3, 200, 250, 8
point.3 = 1, -19.00, 0.00, -18.02, 2000, 2, 2.25, 0, 1.60, 1.116, 0.9, 55, 56, 3, 200, 250, 8
point.4 = 2, 93.0, 0.0, 0.0, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 9, 0, 0, 1
point.5 = 2, -48, -82.5, 0.0, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 5, 0, 0, 1
point.6 = 2, -48, 82.5, 0.0, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 6, 0, 0, 1
point.7 = 2, 60, 0.0, -9.0, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 9, 0, 0, 1
point.8 = 2, 60, 0.0, 11.0, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 9, 0, 0, 1
point.9 = 2, 16.0, -28.00, -13.00, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 4, 0, 0, 1
point.10 = 2, 16.0, 28.00, -13.00, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 4, 0, 0, 1
point.11 = 2, -110.0, 0.00, 14.20, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 4, 0, 0, 1
point.12 = 2, -96.5, 0.0, 42.0, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 4, 0, 0, 1
point.13 = 2, -94.5, -30.0, 8.0, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 4, 0, 0, 1
point.14 = 2, -94.5, 30.0, 8.05, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 4, 0, 0, 1
point.15 = 2, -52.0, 0.0, -9.0, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 9, 0, 0, 1
[FUEL]
LeftMain = -20.00, -38.00, -1.0, 8938, 10.00
RightMain = -20.00, 38.00, -1.0, 8938, 10.00
Center1 = 10.00, 0.00, -3.00, 13000.00, 10.00
Center2 = 0.00, 0.00, -1.00, 1642.00, 10.00
Center3 = 0.00, 0.00, -5.00, 1958.00, 11.00
LeftTip = -39.00, -74.00, 0.00, 884.00, 10.00
RightTip = -39.00, 74.00, 0.00, 884.00, 10.00
External1 = -70.00, 0.00, -3.00, 2371.00, 10.00
LeftAux = 5.00, -2.00, -3.00, 1973.00, 10.00
RightAux = 5.00, 2.00, -3.00, 1973.00, 10.00
fuel_type = 2
number_of_tank_selectors = 3
electric_pump = 0
engine_driven_pump = 1
manual_transfer_pump = 0
manual_pump = 0
anemometer_pump = 0
fuel_dump_rate = 0.02
default_fuel_tank_selector.1 = 1
default_fuel_tank_selector.2 = 1
default_fuel_tank_selector.3 = 1
[AIRPLANE_GEOMETRY]
wing_area = 3648
wing_span = 170.5
wing_root_chord = 34.68
wing_camber = 1
wing_thickness_ratio = 0.04
wing_dihedral = 2.2
wing_incidence = 1.5
wing_twist = -0.5
oswald_efficiency_factor = 0.72
wing_winglets_flag = 1
wing_sweep = 38
wing_pos_apex_lon = 1
wing_pos_apex_vert = -2.75
htail_area = 920
htail_span = 59.5
htail_pos_lon = -88
htail_pos_vert = 5.0
htail_incidence = 0.8
htail_sweep = 36.5
htail_thickness_ratio = 0.02
vtail_area = 760
vtail_span = 28.1
vtail_sweep = 43
vtail_pos_lon = -79.5
vtail_pos_vert = 28
vtail_thickness_ratio = 0.03
fuselage_length = 200.92
fuselage_diameter = 19.75
fuselage_center_pos = 10, 0, 1.0
elevator_area = 327.0
aileron_area = 225.0
rudder_area = 190.0
elevator_up_limit = 25
elevator_down_limit = 15
aileron_up_limit = 25
aileron_down_limit = 15
rudder_limit = 23
rudder_trim_limit = 20
elevator_trim_limit = 30
spoiler_limit = 60
spoilerons_available = 1
aileron_to_spoileron_gain = 3
min_ailerons_for_spoilerons = 10
min_flaps_for_spoilerons = 0
spoiler_extension_time = 2.0
spoiler_handle_available = 1
auto_spoiler_available = 1
auto_spoiler_auto_retracts = 0
auto_spoiler_min_speed = 72
positive_g_limit_flaps_up = 5.0
positive_g_limit_flaps_down = 4.0
negative_g_limit_flaps_up = -4.0
negative_g_limit_flaps_down = -3.0
load_safety_factor = 1.5
elevator_trim_neutral = -1
aileron_to_rudder_scale = 0
flap_to_aileron_scale = 0
fly_by_wire = 0
elevator_elasticity_table = 0:0.7, 87:0.3, 210:0.5, 315:0.5
aileron_elasticity_table = 0:1, 300:0.7, 600:0.6, 1500:0.4
rudder_elasticity_table = 0:1, 300:1, 800:1, 1000:0.7
elevator_trim_elasticity_table = 0:0.0, 87:0.40, 240:0.60, 295:1.00, 315:1.00
[AERODYNAMICS]
lift_coef_pitch_rate = -8.09375
lift_coef_daoa = 2.68359
lift_coef_delta_elevator = -0.28906
lift_coef_horizontal_incidence = 0.91357
lift_coef_flaps = 1
lift_coef_spoilers = 0
drag_coef_zero_lift = 0.02539
drag_coef_flaps = 0.1339
drag_coef_gear = 0.0549
drag_coef_spoilers = 0.05207
side_force_slip_angle = -0.77392
side_force_roll_rate = 0.15478
side_force_yaw_rate = 0
side_force_delta_rudder = -0.14746
pitch_moment_horizontal_incidence = 4.24755
pitch_moment_delta_elevator = -2.37011
pitch_moment_delta_trim = 0
pitch_moment_pitch_damping = -214.1455
pitch_moment_aoa_0 = 0.11621
pitch_moment_daoa = 8.87255
pitch_moment_flaps = 0.0105
pitch_moment_gear = 0.0171
pitch_moment_spoilers = 0
pitch_moment_delta_elevator_propwash = -2.37011
pitch_moment_pitch_propwash = -214.1455
roll_moment_slip_angle = 0.26855
roll_moment_roll_damping = -3.40869
roll_moment_yaw_rate = -0.27197
roll_moment_spoilers = 0.07
roll_moment_delta_aileron = -0.34521
roll_moment_delta_rudder = 0.01660
roll_moment_delta_aileron_trim_scalar = -0.2
yaw_moment_slip_angle = 0.18066
yaw_moment_roll = 0.07470
yaw_moment_yaw_damping = -2.49023
yaw_moment_yaw_propwash = 0
yaw_moment_delta_aileron = -0.00683
yaw_moment_delta_rudder = 0.07128
yaw_moment_delta_rudder_propwash = 0.075
yaw_moment_delta_rudder_trim_scalar = -0.2
compute_aero_center = 0
aero_center_lift = -13.75
lift_coef_aoa_table = -3.15:0, -2.36:0.36, -1.57:0, -0.349:-1.2, 0:-0.022, 0.0314:0.6082, 0.221:2.049, 0.244:1.15, 0.349:0.6, 0.436:0.5, 0.698:0.1, 1.963:-0.359, 2.356:-0.5, 3.15:0
lift_coef_ground_effect_mach_table = 0.06:0.50, 0.227:0.80, 0.242:0.80, 0.3:1.0, 0.9:1.0
lift_coef_mach_table = 0:1
lift_coef_delta_elevator_mach_table = 0:0
lift_coef_daoa_mach_table = 0:0
lift_coef_pitch_rate_mach_table = 0:0
lift_coef_horizontal_incidence_mach_table = 0:0
drag_coef_zero_lift_mach_tab = 0:0, 0.4:0.0054, 0.5:0.0056, 0.6:0.0059, 0.7:0.0062, 0.72:0.0062, 0.8:0.0063, 0.8:0.0063, 1:0.0337, 1.2:0.0337, 1.4:0.0337, 1.6:0.0337, 1.8:0.0337, 2.0:0.0337
side_force_slip_angle_mach_table = 0:0
side_force_delta_rudder_mach_table = 0:0
side_force_yaw_rate_mach_table = 0:0
side_force_roll_rate_mach_table = 0:0
pitch_moment_aoa_table = -3.15:-2, -0.436:-0.626, -0.262:-0.434, 0:-0.146, 0.087:-0.05, 0.175:0.0466, 0.262:0.143, 0.314:0.2, 0.349:0.1, 0.436:0.15, 3.15:2
pitch_moment_delta_elevator_aoa_table = -180:-1, -40:0.05, -20:0.455, -14:0.853, -7:1.007, 0:1, 7:0.839, 14:0.693, 20:0.381, 40:-0.08, 180:-1
pitch_moment_horizontal_incidence_aoa_table = 0:1
pitch_moment_daoa_aoa_table = 0:1
pitch_moment_pitch_alpha_table = 0:1
pitch_moment_delta_elevator_mach_table = 0:0
pitch_moment_daoa_mach_table = 0:0
pitch_moment_pitch_rate_mach_table = 0:0
pitch_moment_horizontal_incidence_mach_table = 0:0
pitch_moment_aoa_0_mach_table = 0:0
roll_moment_aoa_table = 0:0
roll_moment_slip_angle_aoa_table = 0:1
roll_moment_roll_rate_aoa_table = 0:1
roll_moment_delta_aileron_aoa_table = 0:1
roll_moment_slip_angle_mach_table = 0:0
roll_moment_delta_rudder_mach_table = 0:0
roll_moment_delta_aileron_mach_table = 0:0
roll_moment_yaw_rate_mach_table = 0:0
roll_moment_roll_rate_mach_table = 0:0
yaw_moment_aoa_table = 0:0
yaw_moment_slip_angle_aoa_table = 0:1
yaw_moment_yaw_rate_aoa_table = 0:1
yaw_moment_delta_rudder_aoa_table = 0:1
yaw_moment_slip_angle_mach_table = 0:0
yaw_moment_delta_rudder_mach_table = 0:0
yaw_moment_delta_aileron_mach_table = 0:0
yaw_moment_yaw_rate_mach_table = 0:0
yaw_moment_roll_rate_mach_table = 0:0
elevator_scaling_table = -0.785:0.5, -0.524:0.85, -0.175:0.9, 0:1, 0.175:0.9, 0.524:0.85, 0.785:0.5 ; 0:1
aileron_scaling_table = -0.785:1 ;0:1
rudder_scaling_table = -0.785:0.5, -0.524:0.6, -0.175:0.9, 0:1, 0.175:0.9, 0.524:0.6, 0.785:0.5 ;0:1
elevator_lift_coef=3
rudder_lift_coef=2
aileron_load_factor_effectiveness_table = 0:1
lift_coef_at_drag_zero = 0.1
lift_coef_at_drag_zero_flaps = 0.1
[FLIGHT_TUNING]
modern_fm_only = 1
cruise_lift_scalar = 1
parasite_drag_scalar = 1
induced_drag_scalar = 1
flap_induced_drag_scalar = 1
elevator_effectiveness = 1.1
elevator_maxangle_scalar = 1
aileron_effectiveness = 1
rudder_effectiveness = 1
rudder_maxangle_scalar = 1
pitch_stability = 5
roll_stability = 1
yaw_stability = 1
pitch_gyro_stability = 1
roll_gyro_stability = 1
yaw_gyro_stability = 1
empty_CG_deviation_limit=0
elevator_trim_effectiveness = 1.5
aileron_trim_effectiveness = 1
rudder_trim_effectiveness = 1
hi_alpha_on_roll = 0
hi_alpha_on_yaw = 0
p_factor_on_yaw = 0
torque_on_roll = 0
gyro_precession_on_roll = 0
gyro_precession_on_yaw = 0
engine_wash_on_roll = 0
wingflex_scalar = 2
wingflex_offset = 0
stall_coef_at_min_weight = 0.71
ground_crosswind_effect_zero_speed=10
ground_crosswind_effect_max_speed=150
ground_high_speed_steeringwheel_static_friction_scalar=1.5
ground_high_speed_otherwheel_static_friction_scalar=1.2
[REFERENCE SPEEDS]
full_flaps_stall_speed = 115
flaps_up_stall_speed = 149
cruise_speed = 345
cruise_mach = 0.85
crossover_speed = 330
max_mach = 0.9
max_indicated_speed = 395
max_flaps_extended = 170
normal_operating_speed = 325
airspeed_indicator_max = 562.5
rotation_speed_min = 145
climb_speed = 250
cruise_alt = 41000
takeoff_speed = 165
spawn_cruise_altitude = 5000
spawn_descent_altitude = 500
best_angle_climb_speed = 0
approach_speed = 0
best_glide = 0
max_gear_extended = 200
[INTERACTIVE POINTS]
number_of_interactive_points = 13
interactive_point.0 = 0.4,75.650002,-7.92,-0.567,2,0,0,-75,33,2,33,2,2,33,-1
interactive_point.1 = 0.4,75.650002,7.92,-0.567,0,0,0,75,33,2,33,2,2,33,-1
interactive_point.2 = 0.4,33.299999,6.28,-7.18,1,0,0,90,0,0,0,0,0,0,-1
interactive_point.3 = 0.4,-51.700363,6.28,-7.180745,1,0,0,90,0,0,0,0,0,0,-1
interactive_point.4 = 0.4,-68.277824,-2.822939,-5.923376,1,2.395636,12.258935,79.089348,0,0,0,0,0,0,-1
interactive_point.5 = 0,85.062134,-3.882079,4.412694,2,-0,-29.85655,42.814491,0,0,0,0,0,0,-1
interactive_point.6 = 0,85.062134,3.882079,4.412694,2,-0,29.85655,-42.814491,0,0,0,0,0,0,-1
interactive_point.7 = 0.4,44.150002,-10.05,-0.567,0,0,0,-88,35,0,35,0,2,33,-1
interactive_point.8 = 0.4,44.150002,10.05,-0.567,0,0,0,88,35,0,35,0,2,33,-1
interactive_point.9 = 0.4,-2.869313,-10.049908,-0.566572,0,0,0,-90,35,0,35,0,2,33,-1
interactive_point.10 = 0.4,-2.869313,10.049908,-0.566572,0,0,0,90,35,0,35,0,2,33,-1
interactive_point.11 = 0.4,-62.995712,-8.519092,-0.565611,0,0,0,-100,35,0,35,0,2,33,-1
interactive_point.12 = 0.4,-62.995712,8.519092,-0.565611,0,0,0,100,35,0,35,0,2,33,-1
[STALL PROTECTION]
stall_protection = 1 ; Alpha Protection
off_limit = 11.5 ; Alpha below which the Alpha Protection can be disabled (If also below off_yoke_limit)
off_yoke_limit = 1 ; Yoke position (in Pct) below which the Alpha Protection can be disabled (If also below off_limit)
on_limit = 14 ; Alpha above which the Alpha Protection timer starts
on_goal = 10 ; The alpha that the Alpha Protection will attempt to reach when triggered
timer_trigger = 1.0 ; Duration (in Sec) the alpha must be above on_limit before the Alpha Protection is triggered
;===================== FLAPS =====================
[FLAPS.0]
type = 1
system_type = 1
span-outboard = 0.25
extending-time = 22
damaging-speed = 280
blowout-speed = 310
maneuvering_flaps = 0
lift_scalar = 0.1
drag_scalar = 1.1
pitch_scalar = 1
max_on_ground_position = 7
flaps-position.0 = 0, -1, 0
flaps-position.1 = 0, -1, 0
flaps-position.2 = 15, 215, 0.45, 2, 0, 0, 0, 1
flaps-position.3 = 20, 200, 0.46, 1.1, 0, 0, 0, 1
flaps-position.4 = 24, 185, 0.48, 1.0, 0, 0, 0, 1
flaps-position.5 = 28, 177, 0.3, 1.0, 1.5, 0, 0
flaps-position.6 = 35, 160, 0.32, 1
flaps-position.7 = 50, 155, 0.43, 1
[FLAPS.1]
type = 1
system_type = 1
span-outboard = 0.7
extending-time = 23
damaging-speed = 280
blowout-speed = 310
maneuvering_flaps = 0
lift_scalar = 0.1
drag_scalar = 1.1
pitch_scalar = 1
max_on_ground_position = 7
flaps-position.0 = 0, -1, 0
flaps-position.1 = 0, -1, 0
flaps-position.2 = 15, 215, 0.45, 2, 0, 0, 0, 1
flaps-position.3 = 20, 200, 0.46, 1.1, 0, 0, 0, 1
flaps-position.4 = 24, 185, 0.48, 1.0, 0, 0, 0, 1
flaps-position.5 = 28, 177, 0.3, 1.0, 1.5, 0, 0
flaps-position.6 = 35, 160, 0.32, 1
flaps-position.7 = 50, 155, 0.43, 1
[FLAPS.2]
type = 2
system_type = 1
span-outboard = 0.2
extending-time = 8
damaging-speed = 300
blowout-speed = 330
maneuvering_flaps = 0
lift_scalar = 0.5
drag_scalar = 0.75
pitch_scalar = 1
max_on_ground_position = 1
flaps-position.0 = 0, -1, 0
flaps-position.1 = 20, 215, 0.5, 0.5
[FLAPS.3]
type = 2
system_type = 1
span-outboard = 0.7
extending-time = 21
damaging-speed = 300
blowout-speed = 330
maneuvering_flaps = 0
lift_scalar = 0.5
drag_scalar = 0.75
pitch_scalar = 1
max_on_ground_position = 1
flaps-position.0 = 0, -1, 0
flaps-position.1 = 20, 215, 0.5, 0.5
@@ -1,15 +1,18 @@
//TFDi Designs MD-11 (PW4460) vRC1.7.0_PW 15MAY25 ; TFDi Designs MD-11 (PW4462) vRC1.8.0_PW 04FEB26
[MODULAR_MERGE]
auto = true
[VERSION] [VERSION]
//KH Bump major //KH Bump major
major = 4 major = 4
minor = 1 minor = 8
[WEIGHT_AND_BALANCE] [WEIGHT_AND_BALANCE]
max_gross_weight = 630500 max_gross_weight = 630500
empty_weight = 283975 empty_weight = 283975
reference_datum_position = 0, 0, 0 reference_datum_position = 0, 0, 0
empty_weight_CG_position = -13.3, 0, 0 empty_weight_CG_position = -10.0, 0, 0
CG_forward_limit = 0.12 CG_forward_limit = 0.12
CG_aft_limit = 0.34 CG_aft_limit = 0.34
empty_weight_pitch_MOI = 20897456 empty_weight_pitch_MOI = 20897456
@@ -24,21 +27,21 @@ station_load.0=190, 82.0, -2.0, 4.0, Pilot, 1
station_load.1=190, 82.0, 2.0, 4.0, First Officer, 2 station_load.1=190, 82.0, 2.0, 4.0, First Officer, 2
station_load.2=190, 80.0, 3.3, 4.0, Engineer, 0 station_load.2=190, 80.0, 3.3, 4.0, Engineer, 0
station_load.3=760, 66.0, 0.0, 4.0, Cabin crew 1, 0 station_load.3=760, 66.0, 0.0, 4.0, Cabin crew 1, 0
station_load.4=0, 45.0, -5.0, 4.0, Business 1 L, 0 station_load.4=0, 45.0, -5.0, 4.0, Business 1 L, 4
station_load.5=0, 45.0, 0.0, 4.0, Business 1 C, 0 station_load.5=0, 45.0, 0.0, 4.0, Business 1 C, 4
station_load.6=0, 45.0, 5.0, 4.0, Business 1 R, 0 station_load.6=0, 45.0, 5.0, 4.0, Business 1 R, 4
station_load.7=0, 25.0, -5.0, 4.0, Business 2 L, 0 station_load.7=0, 25.0, -5.0, 4.0, Business 2 L, 4
station_load.8=0, 25.0, 0.0, 4.0, Business 2 C, 0 station_load.8=0, 25.0, 0.0, 4.0, Business 2 C, 4
station_load.9=0, 25.0, 5.0, 4.0, Business 2 R, 0 station_load.9=0, 25.0, 5.0, 4.0, Business 2 R, 4
station_load.10=0, -20.0, -5.0, 4.0, Economy 3 L, 0 station_load.10=0, -20.0, -5.0, 4.0, Economy 3 L, 3
station_load.11=0, -20.0, 0.0, 4.0, Economy 3 C, 0 station_load.11=0, -20.0, 0.0, 4.0, Economy 3 C, 3
station_load.12=0, -20.0, 5.0, 4.0, Economy 3 R, 0 station_load.12=0, -20.0, 5.0, 4.0, Economy 3 R, 3
station_load.13=0, -50.0, -5.0, 4.0, Economy 4 L, 0 station_load.13=0, -50.0, -5.0, 4.0, Economy 4 L, 5
station_load.14=0, -50.0, 0.0, 4.0, Economy 4 C, 0 station_load.14=0, -50.0, 0.0, 4.0, Economy 4 C, 5
station_load.15=0, -50.0, 5.0, 4.0, Economy 4 R, 0 station_load.15=0, -50.0, 5.0, 4.0, Economy 4 R, 5
station_load.16=760, -55.0, 0.0, 4.0, Cabin crew 2, 0 station_load.16=760, -55.0, 0.0, 4.0, Cabin crew 2, 0
station_load.17=0, 30.0, 0.0, -4.5, Forward cargo, 0 station_load.17=0, 30.0, 0.0, -4.5, Forward cargo, 6
station_load.18=0, -30.0, 0.0, -4.5, Rear cargo, 0 station_load.18=0, -30.0, 0.0, -4.5, Rear cargo, 6
station_load.19=0, 5.0, -2.0, -4.5, Left aux tank, 0 station_load.19=0, 5.0, -2.0, -4.5, Left aux tank, 0
station_load.20=0, 5.0, 2.0, -4.5, Right aux tank, 0 station_load.20=0, 5.0, 2.0, -4.5, Right aux tank, 0
//KH END //KH END
@@ -59,7 +62,7 @@ max_speed_decreasing_steering_castering = 35
emergency_extension_type = 2 emergency_extension_type = 2
hyd_need_power_to_function= 0 hyd_need_power_to_function= 0
min_castering_angle = 0.05236 min_castering_angle = 0.05236
max_castering_angle = 1.32645 max_castering_angle = 3.142
allow_stopped_steering = 1 allow_stopped_steering = 1
point.0 = 1, 64.22, 0.00, -17.31, 1500, 0, 1.67, 70, 1.15, 1.183, 0.9, 49, 50, 0, 200, 250, 8 point.0 = 1, 64.22, 0.00, -17.31, 1500, 0, 1.67, 70, 1.15, 1.183, 0.9, 49, 50, 0, 200, 250, 8
point.1 = 1, -19.00, -17.15, -18.02, 2000, 1, 2.25, 0, 1.60, 1.116, 0.9, 51, 52, 2, 200, 250, 8 point.1 = 1, -19.00, -17.15, -18.02, 2000, 1, 2.25, 0, 1.60, 1.116, 0.9, 51, 52, 2, 200, 250, 8
@@ -88,9 +91,9 @@ LeftTip = -39.00, -74.00, 0.00, 884.00, 10.00
RightTip = -39.00, 74.00, 0.00, 884.00, 10.00 RightTip = -39.00, 74.00, 0.00, 884.00, 10.00
External1 = -70.00, 0.00, -3.00, 2371.00, 10.00 External1 = -70.00, 0.00, -3.00, 2371.00, 10.00
//KH From 5.00, -2.00, -3.00, 0.00, 10.00 //KH From 5.00, -2.00, -3.00, 0.00, 10.00
LeftAux = 5.00, -2.00, -3.00, 1917.00, 10.00 LeftAux = 5.00, -2.00, -3.00, 1973.00, 10.00
//KH From 5.00, 2.00, -3.00, 0.00, 10.0 //KH From 5.00, 2.00, -3.00, 0.00, 10.0
RightAux = 5.00, 2.00, -3.00, 1917.00, 10.00 RightAux = 5.00, 2.00, -3.00, 1973.00, 10.00
fuel_type = 2 fuel_type = 2
number_of_tank_selectors = 3 number_of_tank_selectors = 3
electric_pump = 0 electric_pump = 0
@@ -175,7 +178,7 @@ lift_coef_horizontal_incidence = 0.91357
lift_coef_flaps = 1 lift_coef_flaps = 1
lift_coef_spoilers = 0 lift_coef_spoilers = 0
drag_coef_zero_lift = 0.02539 drag_coef_zero_lift = 0.02539
drag_coef_flaps = 0.1889 drag_coef_flaps = 0.1339
drag_coef_gear = 0.0549 drag_coef_gear = 0.0549
drag_coef_spoilers = 0.05207 drag_coef_spoilers = 0.05207
side_force_slip_angle = -0.77392 side_force_slip_angle = -0.77392
@@ -265,7 +268,7 @@ cruise_lift_scalar = 1
parasite_drag_scalar = 1 parasite_drag_scalar = 1
induced_drag_scalar = 1 induced_drag_scalar = 1
flap_induced_drag_scalar = 1 flap_induced_drag_scalar = 1
elevator_effectiveness = 1 elevator_effectiveness = 1.1
elevator_maxangle_scalar = 1 elevator_maxangle_scalar = 1
aileron_effectiveness = 1 aileron_effectiveness = 1
rudder_effectiveness = 1 rudder_effectiveness = 1
@@ -319,19 +322,19 @@ max_gear_extended = 200
[INTERACTIVE POINTS] [INTERACTIVE POINTS]
number_of_interactive_points = 13 number_of_interactive_points = 13
interactive_point.0 = 0.4,75.650002,-7.92,-0.567,2,0,0,-75,33,2,33,2,2,33,0 interactive_point.0 = 0.4,75.650002,-7.92,-0.567,2,0,0,-75,33,2,33,2,2,33,-1
interactive_point.1 = 0.4,75.650002,7.92,-0.567,0,0,0,75,33,2,33,2,2,33 interactive_point.1 = 0.4,75.650002,7.92,-0.567,0,0,0,75,33,2,33,2,2,33,-1
interactive_point.2 = 0.4,33.299999,6.28,-7.18,1,0,0,90,0,0,0,0,0,0 interactive_point.2 = 0.4,33.299999,6.28,-7.18,1,0,0,90,0,0,0,0,0,0,-1
interactive_point.3 = 0.4,-51.700363,6.28,-7.180745,1,0,0,90,0,0,0,0,0,0,0 interactive_point.3 = 0.4,-51.700363,6.28,-7.180745,1,0,0,90,0,0,0,0,0,0,-1
interactive_point.4 = 0.4,-68.277824,-2.822939,-5.923376,1,2.395636,12.258935,79.089348,0,0,0,0,0,0,0 interactive_point.4 = 0.4,-68.277824,-2.822939,-5.923376,1,2.395636,12.258935,79.089348,0,0,0,0,0,0,-1
interactive_point.5 = 0,85.062134,-3.882079,4.412694,2,-0,-29.85655,42.814491,0,0,0,0,0,0,0 interactive_point.5 = 0,85.062134,-3.882079,4.412694,2,-0,-29.85655,42.814491,0,0,0,0,0,0,-1
interactive_point.6 = 0,85.062134,3.882079,4.412694,2,-0,29.85655,-42.814491,0,0,0,0,0,0,0 interactive_point.6 = 0,85.062134,3.882079,4.412694,2,-0,29.85655,-42.814491,0,0,0,0,0,0,-1
interactive_point.7 = 0.4,44.150002,-10.05,-0.567,0,0,0,-88,35,0,35,0,2,33 interactive_point.7 = 0.4,44.150002,-10.05,-0.567,0,0,0,-88,35,0,35,0,2,33,-1
interactive_point.8 = 0.4,44.150002,10.05,-0.567,0,0,0,88,35,0,35,0,2,33,0 interactive_point.8 = 0.4,44.150002,10.05,-0.567,0,0,0,88,35,0,35,0,2,33,-1
interactive_point.9 = 0.4,-2.869313,-10.049908,-0.566572,0,0,0,-90,35,0,35,0,2,33,0 interactive_point.9 = 0.4,-2.869313,-10.049908,-0.566572,0,0,0,-90,35,0,35,0,2,33,-1
interactive_point.10 = 0.4,-2.869313,10.049908,-0.566572,0,0,0,90,35,0,35,0,2,33,0 interactive_point.10 = 0.4,-2.869313,10.049908,-0.566572,0,0,0,90,35,0,35,0,2,33,-1
interactive_point.11 = 0.4,-62.995712,-8.519092,-0.565611,0,0,0,-100,35,0,35,0,2,33,0 interactive_point.11 = 0.4,-62.995712,-8.519092,-0.565611,0,0,0,-100,35,0,35,0,2,33,-1
interactive_point.12 = 0.4,-62.995712,8.519092,-0.565611,0,0,0,100,35,0,35,0,2,33,0 interactive_point.12 = 0.4,-62.995712,8.519092,-0.565611,0,0,0,100,35,0,35,0,2,33,-1
[STALL PROTECTION] [STALL PROTECTION]
stall_protection = 1 ; Alpha Protection stall_protection = 1 ; Alpha Protection
@@ -348,8 +351,8 @@ type = 1
system_type = 1 system_type = 1
span-outboard = 0.25 span-outboard = 0.25
extending-time = 22 extending-time = 22
damaging-speed = 250 damaging-speed = 280
blowout-speed = 300 blowout-speed = 310
maneuvering_flaps = 0 maneuvering_flaps = 0
lift_scalar = 0.1 lift_scalar = 0.1
drag_scalar = 1.1 drag_scalar = 1.1
@@ -357,20 +360,20 @@ pitch_scalar = 1
max_on_ground_position = 7 max_on_ground_position = 7
flaps-position.0 = 0, -1, 0 flaps-position.0 = 0, -1, 0
flaps-position.1 = 0, -1, 0 flaps-position.1 = 0, -1, 0
flaps-position.2 = 15, 215, 0.25, 2, 0, 0, 0, 1 flaps-position.2 = 15, 215, 0.45, 2, 0, 0, 0, 1
flaps-position.3 = 20, 200, 0.26, 1.1, 0, 0, 0, 1 flaps-position.3 = 20, 200, 0.46, 1.1, 0, 0, 0, 1
flaps-position.4 = 24, 185, 0.28, 1.0, 0, 0, 0, 1 flaps-position.4 = 24, 185, 0.48, 1.0, 0, 0, 0, 1
flaps-position.5 = 28, 177, 0.3, 1.0, 1.5, 0, 0 flaps-position.5 = 28, 177, 0.3, 1.0, 1.5, 0, 0
flaps-position.6 = 35, 160, 0.32, 1 flaps-position.6 = 35, 160, 0.32, 1
flaps-position.7 = 50, 150, 0.33, 1 flaps-position.7 = 50, 155, 0.43, 1
[FLAPS.1] [FLAPS.1]
type = 1 type = 1
system_type = 1 system_type = 1
span-outboard = 0.7 span-outboard = 0.7
extending-time = 23 extending-time = 23
damaging-speed = 250 damaging-speed = 280
blowout-speed = 300 blowout-speed = 310
maneuvering_flaps = 0 maneuvering_flaps = 0
lift_scalar = 0.1 lift_scalar = 0.1
drag_scalar = 1.1 drag_scalar = 1.1
@@ -378,20 +381,20 @@ pitch_scalar = 1
max_on_ground_position = 7 max_on_ground_position = 7
flaps-position.0 = 0, -1, 0 flaps-position.0 = 0, -1, 0
flaps-position.1 = 0, -1, 0 flaps-position.1 = 0, -1, 0
flaps-position.2 = 15, 215, 0.25, 2, 0, 0, 0, 1 flaps-position.2 = 15, 215, 0.45, 2, 0, 0, 0, 1
flaps-position.3 = 20, 200, 0.26, 1.1, 0, 0, 0, 1 flaps-position.3 = 20, 200, 0.46, 1.1, 0, 0, 0, 1
flaps-position.4 = 24, 185, 0.28, 1.0, 0, 0, 0, 1 flaps-position.4 = 24, 185, 0.48, 1.0, 0, 0, 0, 1
flaps-position.5 = 28, 177, 0.3, 1.0, 1.5, 0, 0 flaps-position.5 = 28, 177, 0.3, 1.0, 1.5, 0, 0
flaps-position.6 = 35, 160, 0.32, 1 flaps-position.6 = 35, 160, 0.32, 1
flaps-position.7 = 50, 150, 0.33, 1 flaps-position.7 = 50, 155, 0.43, 1
[FLAPS.2] [FLAPS.2]
type = 2 type = 2
system_type = 1 system_type = 1
span-outboard = 0.2 span-outboard = 0.2
extending-time = 8 extending-time = 8
damaging-speed = 250 damaging-speed = 300
blowout-speed = 300 blowout-speed = 330
maneuvering_flaps = 0 maneuvering_flaps = 0
lift_scalar = 0.5 lift_scalar = 0.5
drag_scalar = 0.75 drag_scalar = 0.75
@@ -405,8 +408,8 @@ type = 2
system_type = 1 system_type = 1
span-outboard = 0.7 span-outboard = 0.7
extending-time = 21 extending-time = 21
damaging-speed = 250 damaging-speed = 300
blowout-speed = 300 blowout-speed = 330
maneuvering_flaps = 0 maneuvering_flaps = 0
lift_scalar = 0.5 lift_scalar = 0.5
drag_scalar = 0.75 drag_scalar = 0.75
@@ -1,15 +1,18 @@
//TFDi Designs MD-11F (GE CF6-80C2D1F) vRC1.7.0_GE_F 15MAY25 ; TFDi Designs MD-11F (GE CF6-80C2D1F) vRC1.8.0_GE_F 04FEB26
[MODULAR_MERGE]
auto = true
[VERSION] [VERSION]
//KH Bump major //KH Bump major
major = 4 major = 4
minor = 1 minor = 8
[WEIGHT_AND_BALANCE] [WEIGHT_AND_BALANCE]
max_gross_weight = 630500 max_gross_weight = 630500
empty_weight = 248567 empty_weight = 248567
reference_datum_position = 0, 0, 0 reference_datum_position = 0, 0, 0
empty_weight_CG_position = -13.3, 0, 0 empty_weight_CG_position = -10.0, 0, 0
CG_forward_limit = 0.12 CG_forward_limit = 0.12
CG_aft_limit = 0.34 CG_aft_limit = 0.34
empty_weight_pitch_MOI = 20897456 empty_weight_pitch_MOI = 20897456
@@ -20,9 +23,9 @@ activate_mach_limit_based_on_cg = 0
activate_cg_limit_based_on_mach = 0 activate_cg_limit_based_on_mach = 0
max_number_of_stations = 15 max_number_of_stations = 15
//KH START Empty default //KH START Empty default
station_load.0=190, 82.0, -2.0, 4.0, Pilot, 1 station_load.0=190.0, 82.0, -2.0, 4.0, Pilot, 1
station_load.1=190, 82.0, 2.0, 4.0, First Officer, 2 station_load.1=190.0, 82.0, 2.0, 4.0, First Officer, 2
station_load.2=190, 80.0, 3.3, 4.0, Engineer, 0 station_load.2=190.0, 80.0, 3.3, 4.0, Engineer, 0
station_load.3=0, 55.0, -5.0, 4.0, Upper zone 1 L, 0 station_load.3=0, 55.0, -5.0, 4.0, Upper zone 1 L, 0
station_load.4=0, 55.0, 5.0, 4.0, Upper zone 1 R, 0 station_load.4=0, 55.0, 5.0, 4.0, Upper zone 1 R, 0
station_load.5=0, 20.0, -5.0, 4.0, Upper zone 2 L, 0 station_load.5=0, 20.0, -5.0, 4.0, Upper zone 2 L, 0
@@ -53,7 +56,7 @@ max_speed_decreasing_steering_castering = 35
emergency_extension_type = 2 emergency_extension_type = 2
hyd_need_power_to_function= 0 hyd_need_power_to_function= 0
min_castering_angle = 0.05236 min_castering_angle = 0.05236
max_castering_angle = 1.32645 max_castering_angle = 3.142
allow_stopped_steering = 1 allow_stopped_steering = 1
point.0 = 1, 64.22, 0.00, -17.31, 1500, 0, 1.67, 70, 1.15, 1.183, 0.9, 49, 50, 0, 200, 250, 8 point.0 = 1, 64.22, 0.00, -17.31, 1500, 0, 1.67, 70, 1.15, 1.183, 0.9, 49, 50, 0, 200, 250, 8
point.1 = 1, -19.00, -17.15, -18.02, 2000, 1, 2.25, 0, 1.60, 1.116, 0.9, 51, 52, 2, 200, 250, 8 point.1 = 1, -19.00, -17.15, -18.02, 2000, 1, 2.25, 0, 1.60, 1.116, 0.9, 51, 52, 2, 200, 250, 8
@@ -82,9 +85,9 @@ LeftTip = -39.00, -74.00, 0.00, 884.00, 10.00
RightTip = -39.00, 74.00, 0.00, 884.00, 10.00 RightTip = -39.00, 74.00, 0.00, 884.00, 10.00
External1 = -70.00, 0.00, -3.00, 2371.00, 10.00 External1 = -70.00, 0.00, -3.00, 2371.00, 10.00
//KH From 5.00, -2.00, -3.00, 0.00, 10.00 //KH From 5.00, -2.00, -3.00, 0.00, 10.00
LeftAux = 5.00, -2.00, -3.00, 1917.00, 10.00 LeftAux = 5.00, -2.00, -3.00, 1973.00, 10.00
//KH From 5.00, 2.00, -3.00, 0.00, 10.0 //KH From 5.00, 2.00, -3.00, 0.00, 10.0
RightAux = 5.00, 2.00, -3.00, 1917.00, 10.00 RightAux = 5.00, 2.00, -3.00, 1973.00, 10.00
fuel_type = 2 fuel_type = 2
number_of_tank_selectors = 3 number_of_tank_selectors = 3
electric_pump = 0 electric_pump = 0
@@ -169,7 +172,7 @@ lift_coef_horizontal_incidence = 0.91357
lift_coef_flaps = 1 lift_coef_flaps = 1
lift_coef_spoilers = 0 lift_coef_spoilers = 0
drag_coef_zero_lift = 0.02539 drag_coef_zero_lift = 0.02539
drag_coef_flaps = 0.1889 drag_coef_flaps = 0.1339
drag_coef_gear = 0.0549 drag_coef_gear = 0.0549
drag_coef_spoilers = 0.05207 drag_coef_spoilers = 0.05207
side_force_slip_angle = -0.77392 side_force_slip_angle = -0.77392
@@ -259,7 +262,7 @@ cruise_lift_scalar = 1
parasite_drag_scalar = 1 parasite_drag_scalar = 1
induced_drag_scalar = 1 induced_drag_scalar = 1
flap_induced_drag_scalar = 1 flap_induced_drag_scalar = 1
elevator_effectiveness = 1 elevator_effectiveness = 1.1
elevator_maxangle_scalar = 1 elevator_maxangle_scalar = 1
aileron_effectiveness = 1 aileron_effectiveness = 1
rudder_effectiveness = 1 rudder_effectiveness = 1
@@ -313,14 +316,14 @@ max_gear_extended = 200
[INTERACTIVE POINTS] [INTERACTIVE POINTS]
number_of_interactive_points = 8 number_of_interactive_points = 8
interactive_point.0 = 0.4,75.650002,-7.92,-0.567,0,0,0,-75,33,2,33,2,2,33,0 interactive_point.0 = 0.4,75.650002,-7.92,-0.567,0,0,0,-75,33,2,33,2,2,33,-1
interactive_point.1 = 0.4,75.650002,7.92,-0.567,0,0,0,75,33,2,33,2,2,33 interactive_point.1 = 0.4,75.650002,7.92,-0.567,0,0,0,75,33,2,33,2,2,33,-1
interactive_point.2 = 0.4,33.299999,6.28,-7.18,1,0,0,90,0,0,0,0,0,0 interactive_point.2 = 0.4,33.299999,6.28,-7.18,1,0,0,90,0,0,0,0,0,0,-1
interactive_point.3 = 0.4,-51.700363,6.28,-7.180745,1,0,0,90,0,0,0,0,0,0,0 interactive_point.3 = 0.4,-51.700363,6.28,-7.180745,1,0,0,90,0,0,0,0,0,0,-1
interactive_point.4 = 0.4,-68.277824,-2.822939,-5.923376,1,2.395636,12.258935,79.089348,0,0,0,0,0,0,0 interactive_point.4 = 0.4,-68.277824,-2.822939,-5.923376,1,2.395636,12.258935,79.089348,0,0,0,0,0,0,-1
interactive_point.5 = 0,85.062134,-3.882079,4.412694,2,-0,-29.85655,42.814491,0,0,0,0,0,0,0 interactive_point.5 = 0,85.062134,-3.882079,4.412694,2,-0,-29.85655,42.814491,0,0,0,0,0,0,-1
interactive_point.6 = 0,85.062134,3.882079,4.412694,2,-0,29.85655,-42.814491,0,0,0,0,0,0,0 interactive_point.6 = 0,85.062134,3.882079,4.412694,2,-0,29.85655,-42.814491,0,0,0,0,0,0,-1
interactive_point.7 = 0,54.038418,-9.45901,-0.003025,1,0,0,0,0,0,0,0,0,0,0 interactive_point.7 = 0,54.038418,-9.45901,-0.003025,1,0,0,0,0,0,0,0,0,0,-1
[STALL PROTECTION] [STALL PROTECTION]
stall_protection = 1 ; Alpha Protection stall_protection = 1 ; Alpha Protection
@@ -337,8 +340,8 @@ type = 1
system_type = 1 system_type = 1
span-outboard = 0.25 span-outboard = 0.25
extending-time = 22 extending-time = 22
damaging-speed = 250 damaging-speed = 280
blowout-speed = 300 blowout-speed = 310
maneuvering_flaps = 0 maneuvering_flaps = 0
lift_scalar = 0.1 lift_scalar = 0.1
drag_scalar = 1.1 drag_scalar = 1.1
@@ -346,20 +349,21 @@ pitch_scalar = 1
max_on_ground_position = 7 max_on_ground_position = 7
flaps-position.0 = 0, -1, 0 flaps-position.0 = 0, -1, 0
flaps-position.1 = 0, -1, 0 flaps-position.1 = 0, -1, 0
flaps-position.2 = 15, 215, 0.25, 2, 0, 0, 0, 1 flaps-position.2 = 15, 215, 0.45, 2, 0, 0, 0, 1
flaps-position.3 = 20, 200, 0.26, 1.1, 0, 0, 0, 1 flaps-position.3 = 20, 200, 0.46, 1.1, 0, 0, 0, 1
flaps-position.4 = 24, 185, 0.28, 1.0, 0, 0, 0, 1 flaps-position.4 = 24, 185, 0.48, 1.0, 0, 0, 0, 1
flaps-position.5 = 28, 177, 0.3, 1.0, 1.5, 0, 0 flaps-position.5 = 28, 177, 0.3, 1.0, 1.5, 0, 0
flaps-position.6 = 35, 160, 0.32, 1 flaps-position.6 = 35, 160, 0.32, 1
flaps-position.7 = 50, 150, 0.33, 1 flaps-position.7 = 50, 155, 0.43, 1
[FLAPS.1] [FLAPS.1]
type = 1 type = 1
system_type = 1 system_type = 1
span-outboard = 0.7 span-outboard = 0.7
extending-time = 23 extending-time = 23
damaging-speed = 250 damaging-speed = 280
blowout-speed = 300 blowout-speed = 310
maneuvering_flaps = 0 maneuvering_flaps = 0
lift_scalar = 0.1 lift_scalar = 0.1
drag_scalar = 1.1 drag_scalar = 1.1
@@ -367,20 +371,20 @@ pitch_scalar = 1
max_on_ground_position = 7 max_on_ground_position = 7
flaps-position.0 = 0, -1, 0 flaps-position.0 = 0, -1, 0
flaps-position.1 = 0, -1, 0 flaps-position.1 = 0, -1, 0
flaps-position.2 = 15, 215, 0.25, 2, 0, 0, 0, 1 flaps-position.2 = 15, 215, 0.45, 2, 0, 0, 0, 1
flaps-position.3 = 20, 200, 0.26, 1.1, 0, 0, 0, 1 flaps-position.3 = 20, 200, 0.46, 1.1, 0, 0, 0, 1
flaps-position.4 = 24, 185, 0.28, 1.0, 0, 0, 0, 1 flaps-position.4 = 24, 185, 0.48, 1.0, 0, 0, 0, 1
flaps-position.5 = 28, 177, 0.3, 1.0, 1.5, 0, 0 flaps-position.5 = 28, 177, 0.3, 1.0, 1.5, 0, 0
flaps-position.6 = 35, 160, 0.32, 1 flaps-position.6 = 35, 160, 0.32, 1
flaps-position.7 = 50, 150, 0.33, 1 flaps-position.7 = 50, 155, 0.43, 1
[FLAPS.2] [FLAPS.2]
type = 2 type = 2
system_type = 1 system_type = 1
span-outboard = 0.2 span-outboard = 0.2
extending-time = 8 extending-time = 8
damaging-speed = 250 damaging-speed = 300
blowout-speed = 300 blowout-speed = 330
maneuvering_flaps = 0 maneuvering_flaps = 0
lift_scalar = 0.5 lift_scalar = 0.5
drag_scalar = 0.75 drag_scalar = 0.75
@@ -394,8 +398,8 @@ type = 2
system_type = 1 system_type = 1
span-outboard = 0.7 span-outboard = 0.7
extending-time = 21 extending-time = 21
damaging-speed = 250 damaging-speed = 300
blowout-speed = 300 blowout-speed = 330
maneuvering_flaps = 0 maneuvering_flaps = 0
lift_scalar = 0.5 lift_scalar = 0.5
drag_scalar = 0.75 drag_scalar = 0.75
@@ -0,0 +1,409 @@
; TFDi Designs MD-11F (GE CF6-80C2D1F) vRC1.8.0_GE_F 04FEB26
[MODULAR_MERGE]
auto = true
[VERSION]
//KH Bump major
major = 4
minor = 8
[WEIGHT_AND_BALANCE]
max_gross_weight = 630500
empty_weight = 248567
reference_datum_position = 0, 0, 0
empty_weight_CG_position = -10.0, 0, 0
CG_forward_limit = 0.12
CG_aft_limit = 0.34
empty_weight_pitch_MOI = 20897456
empty_weight_roll_MOI = 6368555
empty_weight_yaw_MOI = 40761191
empty_weight_coupled_MOI = 0
activate_mach_limit_based_on_cg = 0
activate_cg_limit_based_on_mach = 0
max_number_of_stations = 15
//KH START Empty default
station_load.0=190.0, 82.0, -2.0, 4.0, Pilot, 1
station_load.1=190.0, 82.0, 2.0, 4.0, First Officer, 2
station_load.2=190.0, 80.0, 3.3, 4.0, Engineer, 0
station_load.3=0, 55.0, -5.0, 4.0, Upper zone 1 L, 0
station_load.4=0, 55.0, 5.0, 4.0, Upper zone 1 R, 0
station_load.5=0, 20.0, -5.0, 4.0, Upper zone 2 L, 0
station_load.6=0, 20.0, 5.0, 4.0, Upper zone 2 R, 0
station_load.7=0, -20.0, -5.0, 4.0, Upper zone 3 L, 0
station_load.8=0, -20.0, 5.0, 4.0, Upper zone 3 R, 0
station_load.9=0, -50.0, -5.0, 4.0, Upper zone 4 L, 0
station_load.10=0, -50.0, 5.0, 4.0, Upper zone 4 R, 0
station_load.11=0, 30.0, 0.0, -4.5, Lower forward cargo, 0
station_load.12=0, -30.0, 0.0, -4.5, Lower rear cargo, 0
station_load.13=0, 5.0, -2.0, -4.5, Left aux tank, 0
station_load.14=0, 5.0, 2.0, -4.5, Right aux tank, 0
//KH END
[CONTACT_POINTS]
static_pitch = 0
static_cg_height = 16.4
gear_system_type = 1
tailwheel_lock = 0
max_number_of_points = 16
gear_locked_on_ground = 0
gear_locked_above_speed = -1
max_speed_full_steering = 25
min_available_steering_angle_pct = 0.2
max_speed_decreasing_steering = 45
max_speed_full_steering_castering = 20
max_speed_decreasing_steering_castering = 35
emergency_extension_type = 2
hyd_need_power_to_function= 0
min_castering_angle = 0.05236
max_castering_angle = 3.142
allow_stopped_steering = 1
point.0 = 1, 64.22, 0.00, -17.31, 1500, 0, 1.67, 70, 1.15, 1.183, 0.9, 49, 50, 0, 200, 250, 8
point.1 = 1, -19.00, -17.15, -18.02, 2000, 1, 2.25, 0, 1.60, 1.116, 0.9, 51, 52, 2, 200, 250, 8
point.2 = 1, -19.00, 17.15, -18.02, 2000, 2, 2.25, 0, 1.60, 1.116, 0.9, 53, 54, 3, 200, 250, 8
point.3 = 1, -19.00, 0.00, -18.02, 2000, 2, 2.25, 0, 1.60, 1.116, 0.9, 55, 56, 3, 200, 250, 8
point.4 = 2, 93.0, 0.0, 0.0, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 9, 0, 0, 1
point.5 = 2, -48, -82.5, 0.0, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 5, 0, 0, 1
point.6 = 2, -48, 82.5, 0.0, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 6, 0, 0, 1
point.7 = 2, 60, 0.0, -9.0, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 9, 0, 0, 1
point.8 = 2, 60, 0.0, 11.0, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 9, 0, 0, 1
point.9 = 2, 16.0, -28.00, -13.00, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 4, 0, 0, 1
point.10 = 2, 16.0, 28.00, -13.00, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 4, 0, 0, 1
point.11 = 2, -110.0, 0.00, 14.20, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 4, 0, 0, 1
point.12 = 2, -96.5, 0.0, 42.0, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 4, 0, 0, 1
point.13 = 2, -94.5, -30.0, 8.0, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 4, 0, 0, 1
point.14 = 2, -94.5, 30.0, 8.05, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 4, 0, 0, 1
point.15 = 2, -52.0, 0.0, -9.0, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 9, 0, 0, 1
[FUEL]
LeftMain = -20.00, -38.00, -1.0, 8938, 10.00
RightMain = -20.00, 38.00, -1.0, 8938, 10.00
Center1 = 10.00, 0.00, -3.00, 13000.00, 10.00
Center2 = 0.00, 0.00, -1.00, 1642.00, 10.00
Center3 = 0.00, 0.00, -5.00, 1958.00, 11.00
LeftTip = -39.00, -74.00, 0.00, 884.00, 10.00
RightTip = -39.00, 74.00, 0.00, 884.00, 10.00
External1 = -70.00, 0.00, -3.00, 2371.00, 10.00
//KH From 5.00, -2.00, -3.00, 0.00, 10.00
LeftAux = 5.00, -2.00, -3.00, 1973.00, 10.00
//KH From 5.00, 2.00, -3.00, 0.00, 10.0
RightAux = 5.00, 2.00, -3.00, 1973.00, 10.00
fuel_type = 2
number_of_tank_selectors = 3
electric_pump = 0
engine_driven_pump = 1
manual_transfer_pump = 0
manual_pump = 0
anemometer_pump = 0
fuel_dump_rate = 0.02
default_fuel_tank_selector.1 = 1
default_fuel_tank_selector.2 = 1
default_fuel_tank_selector.3 = 1
[AIRPLANE_GEOMETRY]
wing_area = 3648
wing_span = 170.5
wing_root_chord = 34.68
wing_camber = 1
wing_thickness_ratio = 0.04
wing_dihedral = 2.2
wing_incidence = 1.5
wing_twist = -0.5
oswald_efficiency_factor = 0.72
wing_winglets_flag = 1
wing_sweep = 38
wing_pos_apex_lon = 1
wing_pos_apex_vert = -2.75
htail_area = 920
htail_span = 59.5
htail_pos_lon = -88
htail_pos_vert = 5.0
htail_incidence = 0.8
htail_sweep = 36.5
htail_thickness_ratio = 0.02
vtail_area = 760
vtail_span = 28.1
vtail_sweep = 43
vtail_pos_lon = -79.5
vtail_pos_vert = 28
vtail_thickness_ratio = 0.03
fuselage_length = 202.16
fuselage_diameter = 19.75
fuselage_center_pos = 10, 0, 1.0
elevator_area = 327.0
aileron_area = 225.0
rudder_area = 190.0
elevator_up_limit = 25
elevator_down_limit = 15
aileron_up_limit = 25
aileron_down_limit = 15
rudder_limit = 23
rudder_trim_limit = 20
elevator_trim_limit = 30
spoiler_limit = 60
spoilerons_available = 1
aileron_to_spoileron_gain = 3
min_ailerons_for_spoilerons = 10
min_flaps_for_spoilerons = 0
spoiler_extension_time = 2.0
spoiler_handle_available = 1
auto_spoiler_available = 1
auto_spoiler_auto_retracts = 0
auto_spoiler_min_speed = 72
positive_g_limit_flaps_up = 5.0
positive_g_limit_flaps_down = 4.0
negative_g_limit_flaps_up = -4.0
negative_g_limit_flaps_down = -3.0
load_safety_factor = 1.5
elevator_trim_neutral = -1
aileron_to_rudder_scale = 0
flap_to_aileron_scale = 0
fly_by_wire = 0
elevator_elasticity_table = 0:0.7, 87:0.3, 210:0.5, 315:0.5
aileron_elasticity_table = 0:1, 300:0.7, 600:0.6, 1500:0.4
rudder_elasticity_table = 0:1, 300:1, 800:1, 1000:0.7
elevator_trim_elasticity_table = 0:0.0, 87:0.40, 240:0.60, 295:1.00, 315:1.00
[AERODYNAMICS]
lift_coef_pitch_rate = -8.09375
lift_coef_daoa = 2.68359
lift_coef_delta_elevator = -0.28906
lift_coef_horizontal_incidence = 0.91357
lift_coef_flaps = 1
lift_coef_spoilers = 0
drag_coef_zero_lift = 0.02539
drag_coef_flaps = 0.1339
drag_coef_gear = 0.0549
drag_coef_spoilers = 0.05207
side_force_slip_angle = -0.77392
side_force_roll_rate = 0.15478
side_force_yaw_rate = 0
side_force_delta_rudder = -0.14746
pitch_moment_horizontal_incidence = 4.24755
pitch_moment_delta_elevator = -2.37011
pitch_moment_delta_trim = 0
pitch_moment_pitch_damping = -214.1455
pitch_moment_aoa_0 = 0.11621
pitch_moment_daoa = 8.87255
pitch_moment_flaps = 0.0105
pitch_moment_gear = 0.0171
pitch_moment_spoilers = 0
pitch_moment_delta_elevator_propwash = -2.37011
pitch_moment_pitch_propwash = -214.1455
roll_moment_slip_angle = 0.26855
roll_moment_roll_damping = -3.40869
roll_moment_yaw_rate = -0.27197
roll_moment_spoilers = 0.07
roll_moment_delta_aileron = -0.34521
roll_moment_delta_rudder = 0.01660
roll_moment_delta_aileron_trim_scalar = -0.2
yaw_moment_slip_angle = 0.18066
yaw_moment_roll = 0.07470
yaw_moment_yaw_damping = -2.49023
yaw_moment_yaw_propwash = 0
yaw_moment_delta_aileron = -0.00683
yaw_moment_delta_rudder = 0.07128
yaw_moment_delta_rudder_propwash = 0.075
yaw_moment_delta_rudder_trim_scalar = -0.2
compute_aero_center = 0
aero_center_lift = -13.75
lift_coef_aoa_table = -3.15:0, -2.36:0.36, -1.57:0, -0.349:-1.2, 0:-0.022, 0.0314:0.6082, 0.221:2.049, 0.244:1.15, 0.349:0.6, 0.436:0.5, 0.698:0.1, 1.963:-0.359, 2.356:-0.5, 3.15:0
lift_coef_ground_effect_mach_table = 0.06:0.50, 0.227:0.80, 0.242:0.80, 0.3:1.0, 0.9:1.0
lift_coef_mach_table = 0:1
lift_coef_delta_elevator_mach_table = 0:0
lift_coef_daoa_mach_table = 0:0
lift_coef_pitch_rate_mach_table = 0:0
lift_coef_horizontal_incidence_mach_table = 0:0
drag_coef_zero_lift_mach_tab = 0:0, 0.4:0.0054, 0.5:0.0056, 0.6:0.0059, 0.7:0.0062, 0.72:0.0062, 0.8:0.0063, 0.8:0.0063, 1:0.0337, 1.2:0.0337, 1.4:0.0337, 1.6:0.0337, 1.8:0.0337, 2.0:0.0337
side_force_slip_angle_mach_table = 0:0
side_force_delta_rudder_mach_table = 0:0
side_force_yaw_rate_mach_table = 0:0
side_force_roll_rate_mach_table = 0:0
pitch_moment_aoa_table = -3.15:-2, -0.436:-0.626, -0.262:-0.434, 0:-0.146, 0.087:-0.05, 0.175:0.0466, 0.262:0.143, 0.314:0.2, 0.349:0.1, 0.436:0.15, 3.15:2
pitch_moment_delta_elevator_aoa_table = -180:-1, -40:0.05, -20:0.455, -14:0.853, -7:1.007, 0:1, 7:0.839, 14:0.693, 20:0.381, 40:-0.08, 180:-1
pitch_moment_horizontal_incidence_aoa_table = 0:1
pitch_moment_daoa_aoa_table = 0:1
pitch_moment_pitch_alpha_table = 0:1
pitch_moment_delta_elevator_mach_table = 0:0
pitch_moment_daoa_mach_table = 0:0
pitch_moment_pitch_rate_mach_table = 0:0
pitch_moment_horizontal_incidence_mach_table = 0:0
pitch_moment_aoa_0_mach_table = 0:0
roll_moment_aoa_table = 0:0
roll_moment_slip_angle_aoa_table = 0:1
roll_moment_roll_rate_aoa_table = 0:1
roll_moment_delta_aileron_aoa_table = 0:1
roll_moment_slip_angle_mach_table = 0:0
roll_moment_delta_rudder_mach_table = 0:0
roll_moment_delta_aileron_mach_table = 0:0
roll_moment_yaw_rate_mach_table = 0:0
roll_moment_roll_rate_mach_table = 0:0
yaw_moment_aoa_table = 0:0
yaw_moment_slip_angle_aoa_table = 0:1
yaw_moment_yaw_rate_aoa_table = 0:1
yaw_moment_delta_rudder_aoa_table = 0:1
yaw_moment_slip_angle_mach_table = 0:0
yaw_moment_delta_rudder_mach_table = 0:0
yaw_moment_delta_aileron_mach_table = 0:0
yaw_moment_yaw_rate_mach_table = 0:0
yaw_moment_roll_rate_mach_table = 0:0
elevator_scaling_table = -0.785:0.5, -0.524:0.85, -0.175:0.9, 0:1, 0.175:0.9, 0.524:0.85, 0.785:0.5 ; 0:1
aileron_scaling_table = -0.785:1 ;0:1
rudder_scaling_table = -0.785:0.5, -0.524:0.6, -0.175:0.9, 0:1, 0.175:0.9, 0.524:0.6, 0.785:0.5 ;0:1
elevator_lift_coef=3
rudder_lift_coef=2
aileron_load_factor_effectiveness_table = 0:1
lift_coef_at_drag_zero = 0.1
lift_coef_at_drag_zero_flaps = 0.1
[FLIGHT_TUNING]
modern_fm_only = 1
cruise_lift_scalar = 1
parasite_drag_scalar = 1
induced_drag_scalar = 1
flap_induced_drag_scalar = 1
elevator_effectiveness = 1.1
elevator_maxangle_scalar = 1
aileron_effectiveness = 1
rudder_effectiveness = 1
rudder_maxangle_scalar = 1
pitch_stability = 5
roll_stability = 1
yaw_stability = 1
pitch_gyro_stability = 1
roll_gyro_stability = 1
yaw_gyro_stability = 1
empty_CG_deviation_limit=0
elevator_trim_effectiveness = 1.5
aileron_trim_effectiveness = 1
rudder_trim_effectiveness = 1
hi_alpha_on_roll = 0
hi_alpha_on_yaw = 0
p_factor_on_yaw = 0
torque_on_roll = 0
gyro_precession_on_roll = 0
gyro_precession_on_yaw = 0
engine_wash_on_roll = 0
wingflex_scalar = 2
wingflex_offset = 0
stall_coef_at_min_weight = 0.71
ground_crosswind_effect_zero_speed=10
ground_crosswind_effect_max_speed=150
ground_high_speed_steeringwheel_static_friction_scalar=1.5
ground_high_speed_otherwheel_static_friction_scalar=1.2
[REFERENCE SPEEDS]
full_flaps_stall_speed = 115
flaps_up_stall_speed = 149
cruise_speed = 345
cruise_mach = 0.85
crossover_speed = 330
max_mach = 0.9
max_indicated_speed = 395
max_flaps_extended = 170
normal_operating_speed = 325
airspeed_indicator_max = 562.5
rotation_speed_min = 145
climb_speed = 250
cruise_alt = 41000
takeoff_speed = 165
spawn_cruise_altitude = 5000
spawn_descent_altitude = 500
best_angle_climb_speed = 0
approach_speed = 0
best_glide = 0
max_gear_extended = 200
[INTERACTIVE POINTS]
number_of_interactive_points = 8
interactive_point.0 = 0.4,75.650002,-7.92,-0.567,0,0,0,-75,33,2,33,2,2,33,-1
interactive_point.1 = 0.4,75.650002,7.92,-0.567,0,0,0,75,33,2,33,2,2,33,-1
interactive_point.2 = 0.4,33.299999,6.28,-7.18,1,0,0,90,0,0,0,0,0,0,-1
interactive_point.3 = 0.4,-51.700363,6.28,-7.180745,1,0,0,90,0,0,0,0,0,0,-1
interactive_point.4 = 0.4,-68.277824,-2.822939,-5.923376,1,2.395636,12.258935,79.089348,0,0,0,0,0,0,-1
interactive_point.5 = 0,85.062134,-3.882079,4.412694,2,-0,-29.85655,42.814491,0,0,0,0,0,0,-1
interactive_point.6 = 0,85.062134,3.882079,4.412694,2,-0,29.85655,-42.814491,0,0,0,0,0,0,-1
interactive_point.7 = 0,54.038418,-9.45901,-0.003025,1,0,0,0,0,0,0,0,0,0,-1
[STALL PROTECTION]
stall_protection = 1 ; Alpha Protection
off_limit = 11.5 ; Alpha below which the Alpha Protection can be disabled (If also below off_yoke_limit)
off_yoke_limit = 1 ; Yoke position (in Pct) below which the Alpha Protection can be disabled (If also below off_limit)
on_limit = 14 ; Alpha above which the Alpha Protection timer starts
on_goal = 10 ; The alpha that the Alpha Protection will attempt to reach when triggered
timer_trigger = 1.0 ; Duration (in Sec) the alpha must be above on_limit before the Alpha Protection is triggered
;===================== FLAPS =====================
[FLAPS.0]
type = 1
system_type = 1
span-outboard = 0.25
extending-time = 22
damaging-speed = 280
blowout-speed = 310
maneuvering_flaps = 0
lift_scalar = 0.1
drag_scalar = 1.1
pitch_scalar = 1
max_on_ground_position = 7
flaps-position.0 = 0, -1, 0
flaps-position.1 = 0, -1, 0
flaps-position.2 = 15, 215, 0.45, 2, 0, 0, 0, 1
flaps-position.3 = 20, 200, 0.46, 1.1, 0, 0, 0, 1
flaps-position.4 = 24, 185, 0.48, 1.0, 0, 0, 0, 1
flaps-position.5 = 28, 177, 0.3, 1.0, 1.5, 0, 0
flaps-position.6 = 35, 160, 0.32, 1
flaps-position.7 = 50, 155, 0.43, 1
[FLAPS.1]
type = 1
system_type = 1
span-outboard = 0.7
extending-time = 23
damaging-speed = 280
blowout-speed = 310
maneuvering_flaps = 0
lift_scalar = 0.1
drag_scalar = 1.1
pitch_scalar = 1
max_on_ground_position = 7
flaps-position.0 = 0, -1, 0
flaps-position.1 = 0, -1, 0
flaps-position.2 = 15, 215, 0.45, 2, 0, 0, 0, 1
flaps-position.3 = 20, 200, 0.46, 1.1, 0, 0, 0, 1
flaps-position.4 = 24, 185, 0.48, 1.0, 0, 0, 0, 1
flaps-position.5 = 28, 177, 0.3, 1.0, 1.5, 0, 0
flaps-position.6 = 35, 160, 0.32, 1
flaps-position.7 = 50, 155, 0.43, 1
[FLAPS.2]
type = 2
system_type = 1
span-outboard = 0.2
extending-time = 8
damaging-speed = 300
blowout-speed = 330
maneuvering_flaps = 0
lift_scalar = 0.5
drag_scalar = 0.75
pitch_scalar = 1
max_on_ground_position = 1
flaps-position.0 = 0, -1, 0
flaps-position.1 = 20, 215, 0.5, 0.5
[FLAPS.3]
type = 2
system_type = 1
span-outboard = 0.7
extending-time = 21
damaging-speed = 300
blowout-speed = 330
maneuvering_flaps = 0
lift_scalar = 0.5
drag_scalar = 0.75
pitch_scalar = 1
max_on_ground_position = 1
flaps-position.0 = 0, -1, 0
flaps-position.1 = 20, 215, 0.5, 0.5
@@ -1,15 +1,18 @@
//TFDi Designs MD-11F (P&W PW4660) vRC1.7.0_PW_F 15MAY25 ; TFDi Designs MD-11F (P&W PW4662) vRC1.8.0_PW_F 04FEB26
[MODULAR_MERGE]
auto = true
[VERSION] [VERSION]
//KH Bump major //KH Bump major
major = 4 major = 4
minor = 1 minor = 8
[WEIGHT_AND_BALANCE] [WEIGHT_AND_BALANCE]
max_gross_weight = 630500 max_gross_weight = 630500
empty_weight = 248567 empty_weight = 248567
reference_datum_position = 0, 0, 0 reference_datum_position = 0, 0, 0
empty_weight_CG_position = -13.3, 0, 0 empty_weight_CG_position = -10.0, 0, 0
CG_forward_limit = 0.12 CG_forward_limit = 0.12
CG_aft_limit = 0.34 CG_aft_limit = 0.34
empty_weight_pitch_MOI = 20897456 empty_weight_pitch_MOI = 20897456
@@ -20,9 +23,9 @@ activate_mach_limit_based_on_cg = 0
activate_cg_limit_based_on_mach = 0 activate_cg_limit_based_on_mach = 0
max_number_of_stations = 15 max_number_of_stations = 15
//KH START Empty default //KH START Empty default
station_load.0=190, 82.0, -2.0, 4.0, Pilot, 1 station_load.0=190.0, 82.0, -2.0, 4.0, Pilot, 1
station_load.1=190, 82.0, 2.0, 4.0, First Officer, 2 station_load.1=190.0, 82.0, 2.0, 4.0, First Officer, 2
station_load.2=190, 80.0, 3.3, 4.0, Engineer, 0 station_load.2=190.0, 80.0, 3.3, 4.0, Engineer, 0
station_load.3=0, 55.0, -5.0, 4.0, Upper zone 1 L, 0 station_load.3=0, 55.0, -5.0, 4.0, Upper zone 1 L, 0
station_load.4=0, 55.0, 5.0, 4.0, Upper zone 1 R, 0 station_load.4=0, 55.0, 5.0, 4.0, Upper zone 1 R, 0
station_load.5=0, 20.0, -5.0, 4.0, Upper zone 2 L, 0 station_load.5=0, 20.0, -5.0, 4.0, Upper zone 2 L, 0
@@ -53,7 +56,7 @@ max_speed_decreasing_steering_castering = 35
emergency_extension_type = 2 emergency_extension_type = 2
hyd_need_power_to_function= 0 hyd_need_power_to_function= 0
min_castering_angle = 0.05236 min_castering_angle = 0.05236
max_castering_angle = 1.32645 max_castering_angle = 3.142
allow_stopped_steering = 1 allow_stopped_steering = 1
point.0 = 1, 64.22, 0.00, -17.31, 1500, 0, 1.67, 70, 1.15, 1.183, 0.9, 49, 50, 0, 200, 250, 8 point.0 = 1, 64.22, 0.00, -17.31, 1500, 0, 1.67, 70, 1.15, 1.183, 0.9, 49, 50, 0, 200, 250, 8
point.1 = 1, -19.00, -17.15, -18.02, 2000, 1, 2.25, 0, 1.60, 1.116, 0.9, 51, 52, 2, 200, 250, 8 point.1 = 1, -19.00, -17.15, -18.02, 2000, 1, 2.25, 0, 1.60, 1.116, 0.9, 51, 52, 2, 200, 250, 8
@@ -82,9 +85,9 @@ LeftTip = -39.00, -74.00, 0.00, 884.00, 10.00
RightTip = -39.00, 74.00, 0.00, 884.00, 10.00 RightTip = -39.00, 74.00, 0.00, 884.00, 10.00
External1 = -70.00, 0.00, -3.00, 2371.00, 10.00 External1 = -70.00, 0.00, -3.00, 2371.00, 10.00
//KH From 5.00, -2.00, -3.00, 0.00, 10.00 //KH From 5.00, -2.00, -3.00, 0.00, 10.00
LeftAux = 5.00, -2.00, -3.00, 1917.00, 10.00 LeftAux = 5.00, -2.00, -3.00, 1973.00, 10.00
//KH From 5.00, 2.00, -3.00, 0.00, 10.0 //KH From 5.00, 2.00, -3.00, 0.00, 10.0
RightAux = 5.00, 2.00, -3.00, 1917.00, 10.00 RightAux = 5.00, 2.00, -3.00, 1973.00, 10.00
fuel_type = 2 fuel_type = 2
number_of_tank_selectors = 3 number_of_tank_selectors = 3
electric_pump = 0 electric_pump = 0
@@ -169,7 +172,7 @@ lift_coef_horizontal_incidence = 0.91357
lift_coef_flaps = 1 lift_coef_flaps = 1
lift_coef_spoilers = 0 lift_coef_spoilers = 0
drag_coef_zero_lift = 0.02539 drag_coef_zero_lift = 0.02539
drag_coef_flaps = 0.1889 drag_coef_flaps = 0.1339
drag_coef_gear = 0.0549 drag_coef_gear = 0.0549
drag_coef_spoilers = 0.05207 drag_coef_spoilers = 0.05207
side_force_slip_angle = -0.77392 side_force_slip_angle = -0.77392
@@ -259,7 +262,7 @@ cruise_lift_scalar = 1
parasite_drag_scalar = 1 parasite_drag_scalar = 1
induced_drag_scalar = 1 induced_drag_scalar = 1
flap_induced_drag_scalar = 1 flap_induced_drag_scalar = 1
elevator_effectiveness = 1 elevator_effectiveness = 1.1
elevator_maxangle_scalar = 1 elevator_maxangle_scalar = 1
aileron_effectiveness = 1 aileron_effectiveness = 1
rudder_effectiveness = 1 rudder_effectiveness = 1
@@ -313,14 +316,14 @@ max_gear_extended = 200
[INTERACTIVE POINTS] [INTERACTIVE POINTS]
number_of_interactive_points = 8 number_of_interactive_points = 8
interactive_point.0 = 0.4,75.650002,-7.92,-0.567,0,0,0,-75,33,2,33,2,2,33,0 interactive_point.0 = 0.4,75.650002,-7.92,-0.567,0,0,0,-75,33,2,33,2,2,33,-1
interactive_point.1 = 0.4,75.650002,7.92,-0.567,0,0,0,75,33,2,33,2,2,33 interactive_point.1 = 0.4,75.650002,7.92,-0.567,0,0,0,75,33,2,33,2,2,33,-1
interactive_point.2 = 0.4,33.299999,6.28,-7.18,1,0,0,90,0,0,0,0,0,0 interactive_point.2 = 0.4,33.299999,6.28,-7.18,1,0,0,90,0,0,0,0,0,0,-1
interactive_point.3 = 0.4,-51.700363,6.28,-7.180745,1,0,0,90,0,0,0,0,0,0,0 interactive_point.3 = 0.4,-51.700363,6.28,-7.180745,1,0,0,90,0,0,0,0,0,0,-1
interactive_point.4 = 0.4,-68.277824,-2.822939,-5.923376,1,2.395636,12.258935,79.089348,0,0,0,0,0,0,0 interactive_point.4 = 0.4,-68.277824,-2.822939,-5.923376,1,2.395636,12.258935,79.089348,0,0,0,0,0,0,-1
interactive_point.5 = 0,85.062134,-3.882079,4.412694,2,-0,-29.85655,42.814491,0,0,0,0,0,0,0 interactive_point.5 = 0,85.062134,-3.882079,4.412694,2,-0,-29.85655,42.814491,0,0,0,0,0,0,-1
interactive_point.6 = 0,85.062134,3.882079,4.412694,2,-0,29.85655,-42.814491,0,0,0,0,0,0,0 interactive_point.6 = 0,85.062134,3.882079,4.412694,2,-0,29.85655,-42.814491,0,0,0,0,0,0,-1
interactive_point.7 = 0,54.038418,-9.45901,-0.003025,1,0,0,0,0,0,0,0,0,0,0 interactive_point.7 = 0,54.038418,-9.45901,-0.003025,1,0,0,0,0,0,0,0,0,0,-1
[STALL PROTECTION] [STALL PROTECTION]
stall_protection = 1 ; Alpha Protection stall_protection = 1 ; Alpha Protection
@@ -337,8 +340,8 @@ type = 1
system_type = 1 system_type = 1
span-outboard = 0.25 span-outboard = 0.25
extending-time = 22 extending-time = 22
damaging-speed = 250 damaging-speed = 280
blowout-speed = 300 blowout-speed = 310
maneuvering_flaps = 0 maneuvering_flaps = 0
lift_scalar = 0.1 lift_scalar = 0.1
drag_scalar = 1.1 drag_scalar = 1.1
@@ -346,20 +349,20 @@ pitch_scalar = 1
max_on_ground_position = 7 max_on_ground_position = 7
flaps-position.0 = 0, -1, 0 flaps-position.0 = 0, -1, 0
flaps-position.1 = 0, -1, 0 flaps-position.1 = 0, -1, 0
flaps-position.2 = 15, 215, 0.25, 2, 0, 0, 0, 1 flaps-position.2 = 15, 215, 0.45, 2, 0, 0, 0, 1
flaps-position.3 = 20, 200, 0.26, 1.1, 0, 0, 0, 1 flaps-position.3 = 20, 200, 0.46, 1.1, 0, 0, 0, 1
flaps-position.4 = 24, 185, 0.28, 1.0, 0, 0, 0, 1 flaps-position.4 = 24, 185, 0.48, 1.0, 0, 0, 0, 1
flaps-position.5 = 28, 177, 0.3, 1.0, 1.5, 0, 0 flaps-position.5 = 28, 177, 0.3, 1.0, 1.5, 0, 0
flaps-position.6 = 35, 160, 0.32, 1 flaps-position.6 = 35, 160, 0.32, 1
flaps-position.7 = 50, 150, 0.33, 1 flaps-position.7 = 50, 155, 0.43, 1
[FLAPS.1] [FLAPS.1]
type = 1 type = 1
system_type = 1 system_type = 1
span-outboard = 0.7 span-outboard = 0.7
extending-time = 23 extending-time = 23
damaging-speed = 250 damaging-speed = 280
blowout-speed = 300 blowout-speed = 310
maneuvering_flaps = 0 maneuvering_flaps = 0
lift_scalar = 0.1 lift_scalar = 0.1
drag_scalar = 1.1 drag_scalar = 1.1
@@ -367,20 +370,20 @@ pitch_scalar = 1
max_on_ground_position = 7 max_on_ground_position = 7
flaps-position.0 = 0, -1, 0 flaps-position.0 = 0, -1, 0
flaps-position.1 = 0, -1, 0 flaps-position.1 = 0, -1, 0
flaps-position.2 = 15, 215, 0.25, 2, 0, 0, 0, 1 flaps-position.2 = 15, 215, 0.45, 2, 0, 0, 0, 1
flaps-position.3 = 20, 200, 0.26, 1.1, 0, 0, 0, 1 flaps-position.3 = 20, 200, 0.46, 1.1, 0, 0, 0, 1
flaps-position.4 = 24, 185, 0.28, 1.0, 0, 0, 0, 1 flaps-position.4 = 24, 185, 0.48, 1.0, 0, 0, 0, 1
flaps-position.5 = 28, 177, 0.3, 1.0, 1.5, 0, 0 flaps-position.5 = 28, 177, 0.3, 1.0, 1.5, 0, 0
flaps-position.6 = 35, 160, 0.32, 1 flaps-position.6 = 35, 160, 0.32, 1
flaps-position.7 = 50, 150, 0.33, 1 flaps-position.7 = 50, 155, 0.43, 1
[FLAPS.2] [FLAPS.2]
type = 2 type = 2
system_type = 1 system_type = 1
span-outboard = 0.2 span-outboard = 0.2
extending-time = 8 extending-time = 8
damaging-speed = 250 damaging-speed = 300
blowout-speed = 300 blowout-speed = 330
maneuvering_flaps = 0 maneuvering_flaps = 0
lift_scalar = 0.5 lift_scalar = 0.5
drag_scalar = 0.75 drag_scalar = 0.75
@@ -394,8 +397,8 @@ type = 2
system_type = 1 system_type = 1
span-outboard = 0.7 span-outboard = 0.7
extending-time = 21 extending-time = 21
damaging-speed = 250 damaging-speed = 300
blowout-speed = 300 blowout-speed = 330
maneuvering_flaps = 0 maneuvering_flaps = 0
lift_scalar = 0.5 lift_scalar = 0.5
drag_scalar = 0.75 drag_scalar = 0.75
@@ -0,0 +1,408 @@
; TFDi Designs MD-11F (P&W PW4662) vRC1.8.0_PW_F 04FEB26
[MODULAR_MERGE]
auto = true
[VERSION]
//KH Bump major
major = 4
minor = 8
[WEIGHT_AND_BALANCE]
max_gross_weight = 630500
empty_weight = 248567
reference_datum_position = 0, 0, 0
empty_weight_CG_position = -10.0, 0, 0
CG_forward_limit = 0.12
CG_aft_limit = 0.34
empty_weight_pitch_MOI = 20897456
empty_weight_roll_MOI = 6368555
empty_weight_yaw_MOI = 40761191
empty_weight_coupled_MOI = 0
activate_mach_limit_based_on_cg = 0
activate_cg_limit_based_on_mach = 0
max_number_of_stations = 15
//KH START Empty default
station_load.0=190.0, 82.0, -2.0, 4.0, Pilot, 1
station_load.1=190.0, 82.0, 2.0, 4.0, First Officer, 2
station_load.2=190.0, 80.0, 3.3, 4.0, Engineer, 0
station_load.3=0, 55.0, -5.0, 4.0, Upper zone 1 L, 0
station_load.4=0, 55.0, 5.0, 4.0, Upper zone 1 R, 0
station_load.5=0, 20.0, -5.0, 4.0, Upper zone 2 L, 0
station_load.6=0, 20.0, 5.0, 4.0, Upper zone 2 R, 0
station_load.7=0, -20.0, -5.0, 4.0, Upper zone 3 L, 0
station_load.8=0, -20.0, 5.0, 4.0, Upper zone 3 R, 0
station_load.9=0, -50.0, -5.0, 4.0, Upper zone 4 L, 0
station_load.10=0, -50.0, 5.0, 4.0, Upper zone 4 R, 0
station_load.11=0, 30.0, 0.0, -4.5, Lower forward cargo, 0
station_load.12=0, -30.0, 0.0, -4.5, Lower rear cargo, 0
station_load.13=0, 5.0, -2.0, -4.5, Left aux tank, 0
station_load.14=0, 5.0, 2.0, -4.5, Right aux tank, 0
//KH END
[CONTACT_POINTS]
static_pitch = 0
static_cg_height = 16.4
gear_system_type = 1
tailwheel_lock = 0
max_number_of_points = 16
gear_locked_on_ground = 0
gear_locked_above_speed = -1
max_speed_full_steering = 25
min_available_steering_angle_pct = 0.2
max_speed_decreasing_steering = 45
max_speed_full_steering_castering = 20
max_speed_decreasing_steering_castering = 35
emergency_extension_type = 2
hyd_need_power_to_function= 0
min_castering_angle = 0.05236
max_castering_angle = 3.142
allow_stopped_steering = 1
point.0 = 1, 64.22, 0.00, -17.31, 1500, 0, 1.67, 70, 1.15, 1.183, 0.9, 49, 50, 0, 200, 250, 8
point.1 = 1, -19.00, -17.15, -18.02, 2000, 1, 2.25, 0, 1.60, 1.116, 0.9, 51, 52, 2, 200, 250, 8
point.2 = 1, -19.00, 17.15, -18.02, 2000, 2, 2.25, 0, 1.60, 1.116, 0.9, 53, 54, 3, 200, 250, 8
point.3 = 1, -19.00, 0.00, -18.02, 2000, 2, 2.25, 0, 1.60, 1.116, 0.9, 55, 56, 3, 200, 250, 8
point.4 = 2, 93.0, 0.0, 0.0, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 9, 0, 0, 1
point.5 = 2, -48, -82.5, 0.0, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 5, 0, 0, 1
point.6 = 2, -48, 82.5, 0.0, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 6, 0, 0, 1
point.7 = 2, 60, 0.0, -9.0, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 9, 0, 0, 1
point.8 = 2, 60, 0.0, 11.0, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 9, 0, 0, 1
point.9 = 2, 16.0, -28.00, -13.00, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 4, 0, 0, 1
point.10 = 2, 16.0, 28.00, -13.00, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 4, 0, 0, 1
point.11 = 2, -110.0, 0.00, 14.20, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 4, 0, 0, 1
point.12 = 2, -96.5, 0.0, 42.0, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 4, 0, 0, 1
point.13 = 2, -94.5, -30.0, 8.0, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 4, 0, 0, 1
point.14 = 2, -94.5, 30.0, 8.05, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 4, 0, 0, 1
point.15 = 2, -52.0, 0.0, -9.0, 787, 0, 0.0, 0, 0.00, 0.0, 0.0, 0.0, 0.0, 9, 0, 0, 1
[FUEL]
LeftMain = -20.00, -38.00, -1.0, 8938, 10.00
RightMain = -20.00, 38.00, -1.0, 8938, 10.00
Center1 = 10.00, 0.00, -3.00, 13000.00, 10.00
Center2 = 0.00, 0.00, -1.00, 1642.00, 10.00
Center3 = 0.00, 0.00, -5.00, 1958.00, 11.00
LeftTip = -39.00, -74.00, 0.00, 884.00, 10.00
RightTip = -39.00, 74.00, 0.00, 884.00, 10.00
External1 = -70.00, 0.00, -3.00, 2371.00, 10.00
//KH From 5.00, -2.00, -3.00, 0.00, 10.00
LeftAux = 5.00, -2.00, -3.00, 1973.00, 10.00
//KH From 5.00, 2.00, -3.00, 0.00, 10.0
RightAux = 5.00, 2.00, -3.00, 1973.00, 10.00
fuel_type = 2
number_of_tank_selectors = 3
electric_pump = 0
engine_driven_pump = 1
manual_transfer_pump = 0
manual_pump = 0
anemometer_pump = 0
fuel_dump_rate = 0.02
default_fuel_tank_selector.1 = 1
default_fuel_tank_selector.2 = 1
default_fuel_tank_selector.3 = 1
[AIRPLANE_GEOMETRY]
wing_area = 3648
wing_span = 170.5
wing_root_chord = 34.68
wing_camber = 1
wing_thickness_ratio = 0.04
wing_dihedral = 2.2
wing_incidence = 1.5
wing_twist = -0.5
oswald_efficiency_factor = 0.72
wing_winglets_flag = 1
wing_sweep = 38
wing_pos_apex_lon = 1
wing_pos_apex_vert = -2.75
htail_area = 920
htail_span = 59.5
htail_pos_lon = -88
htail_pos_vert = 5.0
htail_incidence = 0.8
htail_sweep = 36.5
htail_thickness_ratio = 0.02
vtail_area = 760
vtail_span = 28.1
vtail_sweep = 43
vtail_pos_lon = -79.5
vtail_pos_vert = 28
vtail_thickness_ratio = 0.03
fuselage_length = 200.92
fuselage_diameter = 19.75
fuselage_center_pos = 10, 0, 1.0
elevator_area = 327.0
aileron_area = 225.0
rudder_area = 190.0
elevator_up_limit = 25
elevator_down_limit = 15
aileron_up_limit = 25
aileron_down_limit = 15
rudder_limit = 23
rudder_trim_limit = 20
elevator_trim_limit = 30
spoiler_limit = 60
spoilerons_available = 1
aileron_to_spoileron_gain = 3
min_ailerons_for_spoilerons = 10
min_flaps_for_spoilerons = 0
spoiler_extension_time = 2.0
spoiler_handle_available = 1
auto_spoiler_available = 1
auto_spoiler_auto_retracts = 0
auto_spoiler_min_speed = 72
positive_g_limit_flaps_up = 5.0
positive_g_limit_flaps_down = 4.0
negative_g_limit_flaps_up = -4.0
negative_g_limit_flaps_down = -3.0
load_safety_factor = 1.5
elevator_trim_neutral = -1
aileron_to_rudder_scale = 0
flap_to_aileron_scale = 0
fly_by_wire = 0
elevator_elasticity_table = 0:0.7, 87:0.3, 210:0.5, 315:0.5
aileron_elasticity_table = 0:1, 300:0.7, 600:0.6, 1500:0.4
rudder_elasticity_table = 0:1, 300:1, 800:1, 1000:0.7
elevator_trim_elasticity_table = 0:0.0, 87:0.40, 240:0.60, 295:1.00, 315:1.00
[AERODYNAMICS]
lift_coef_pitch_rate = -8.09375
lift_coef_daoa = 2.68359
lift_coef_delta_elevator = -0.28906
lift_coef_horizontal_incidence = 0.91357
lift_coef_flaps = 1
lift_coef_spoilers = 0
drag_coef_zero_lift = 0.02539
drag_coef_flaps = 0.1339
drag_coef_gear = 0.0549
drag_coef_spoilers = 0.05207
side_force_slip_angle = -0.77392
side_force_roll_rate = 0.15478
side_force_yaw_rate = 0
side_force_delta_rudder = -0.14746
pitch_moment_horizontal_incidence = 4.24755
pitch_moment_delta_elevator = -2.37011
pitch_moment_delta_trim = 0
pitch_moment_pitch_damping = -214.1455
pitch_moment_aoa_0 = 0.11621
pitch_moment_daoa = 8.87255
pitch_moment_flaps = 0.0105
pitch_moment_gear = 0.0171
pitch_moment_spoilers = 0
pitch_moment_delta_elevator_propwash = -2.37011
pitch_moment_pitch_propwash = -214.1455
roll_moment_slip_angle = 0.26855
roll_moment_roll_damping = -3.40869
roll_moment_yaw_rate = -0.27197
roll_moment_spoilers = 0.07
roll_moment_delta_aileron = -0.34521
roll_moment_delta_rudder = 0.01660
roll_moment_delta_aileron_trim_scalar = -0.2
yaw_moment_slip_angle = 0.18066
yaw_moment_roll = 0.07470
yaw_moment_yaw_damping = -2.49023
yaw_moment_yaw_propwash = 0
yaw_moment_delta_aileron = -0.00683
yaw_moment_delta_rudder = 0.07128
yaw_moment_delta_rudder_propwash = 0.075
yaw_moment_delta_rudder_trim_scalar = -0.2
compute_aero_center = 0
aero_center_lift = -13.75
lift_coef_aoa_table = -3.15:0, -2.36:0.36, -1.57:0, -0.349:-1.2, 0:-0.022, 0.0314:0.6082, 0.221:2.049, 0.244:1.15, 0.349:0.6, 0.436:0.5, 0.698:0.1, 1.963:-0.359, 2.356:-0.5, 3.15:0
lift_coef_ground_effect_mach_table = 0.06:0.50, 0.227:0.80, 0.242:0.80, 0.3:1.0, 0.9:1.0
lift_coef_mach_table = 0:1
lift_coef_delta_elevator_mach_table = 0:0
lift_coef_daoa_mach_table = 0:0
lift_coef_pitch_rate_mach_table = 0:0
lift_coef_horizontal_incidence_mach_table = 0:0
drag_coef_zero_lift_mach_tab = 0:0, 0.4:0.0054, 0.5:0.0056, 0.6:0.0059, 0.7:0.0062, 0.72:0.0062, 0.8:0.0063, 0.8:0.0063, 1:0.0337, 1.2:0.0337, 1.4:0.0337, 1.6:0.0337, 1.8:0.0337, 2.0:0.0337
side_force_slip_angle_mach_table = 0:0
side_force_delta_rudder_mach_table = 0:0
side_force_yaw_rate_mach_table = 0:0
side_force_roll_rate_mach_table = 0:0
pitch_moment_aoa_table = -3.15:-2, -0.436:-0.626, -0.262:-0.434, 0:-0.146, 0.087:-0.05, 0.175:0.0466, 0.262:0.143, 0.314:0.2, 0.349:0.1, 0.436:0.15, 3.15:2
pitch_moment_delta_elevator_aoa_table = -180:-1, -40:0.05, -20:0.455, -14:0.853, -7:1.007, 0:1, 7:0.839, 14:0.693, 20:0.381, 40:-0.08, 180:-1
pitch_moment_horizontal_incidence_aoa_table = 0:1
pitch_moment_daoa_aoa_table = 0:1
pitch_moment_pitch_alpha_table = 0:1
pitch_moment_delta_elevator_mach_table = 0:0
pitch_moment_daoa_mach_table = 0:0
pitch_moment_pitch_rate_mach_table = 0:0
pitch_moment_horizontal_incidence_mach_table = 0:0
pitch_moment_aoa_0_mach_table = 0:0
roll_moment_aoa_table = 0:0
roll_moment_slip_angle_aoa_table = 0:1
roll_moment_roll_rate_aoa_table = 0:1
roll_moment_delta_aileron_aoa_table = 0:1
roll_moment_slip_angle_mach_table = 0:0
roll_moment_delta_rudder_mach_table = 0:0
roll_moment_delta_aileron_mach_table = 0:0
roll_moment_yaw_rate_mach_table = 0:0
roll_moment_roll_rate_mach_table = 0:0
yaw_moment_aoa_table = 0:0
yaw_moment_slip_angle_aoa_table = 0:1
yaw_moment_yaw_rate_aoa_table = 0:1
yaw_moment_delta_rudder_aoa_table = 0:1
yaw_moment_slip_angle_mach_table = 0:0
yaw_moment_delta_rudder_mach_table = 0:0
yaw_moment_delta_aileron_mach_table = 0:0
yaw_moment_yaw_rate_mach_table = 0:0
yaw_moment_roll_rate_mach_table = 0:0
elevator_scaling_table = -0.785:0.5, -0.524:0.85, -0.175:0.9, 0:1, 0.175:0.9, 0.524:0.85, 0.785:0.5 ; 0:1
aileron_scaling_table = -0.785:1 ;0:1
rudder_scaling_table = -0.785:0.5, -0.524:0.6, -0.175:0.9, 0:1, 0.175:0.9, 0.524:0.6, 0.785:0.5 ;0:1
elevator_lift_coef=3
rudder_lift_coef=2
aileron_load_factor_effectiveness_table = 0:1
lift_coef_at_drag_zero = 0.1
lift_coef_at_drag_zero_flaps = 0.1
[FLIGHT_TUNING]
modern_fm_only = 1
cruise_lift_scalar = 1
parasite_drag_scalar = 1
induced_drag_scalar = 1
flap_induced_drag_scalar = 1
elevator_effectiveness = 1.1
elevator_maxangle_scalar = 1
aileron_effectiveness = 1
rudder_effectiveness = 1
rudder_maxangle_scalar = 1
pitch_stability = 5
roll_stability = 1
yaw_stability = 1
pitch_gyro_stability = 1
roll_gyro_stability = 1
yaw_gyro_stability = 1
empty_CG_deviation_limit=0
elevator_trim_effectiveness = 1.5
aileron_trim_effectiveness = 1
rudder_trim_effectiveness = 1
hi_alpha_on_roll = 0
hi_alpha_on_yaw = 0
p_factor_on_yaw = 0
torque_on_roll = 0
gyro_precession_on_roll = 0
gyro_precession_on_yaw = 0
engine_wash_on_roll = 0
wingflex_scalar = 2
wingflex_offset = 0
stall_coef_at_min_weight = 0.71
ground_crosswind_effect_zero_speed=10
ground_crosswind_effect_max_speed=150
ground_high_speed_steeringwheel_static_friction_scalar=1.5
ground_high_speed_otherwheel_static_friction_scalar=1.2
[REFERENCE SPEEDS]
full_flaps_stall_speed = 115
flaps_up_stall_speed = 149
cruise_speed = 345
cruise_mach = 0.85
crossover_speed = 330
max_mach = 0.9
max_indicated_speed = 395
max_flaps_extended = 170
normal_operating_speed = 325
airspeed_indicator_max = 562.5
rotation_speed_min = 145
climb_speed = 250
cruise_alt = 41000
takeoff_speed = 165
spawn_cruise_altitude = 5000
spawn_descent_altitude = 500
best_angle_climb_speed = 0
approach_speed = 0
best_glide = 0
max_gear_extended = 200
[INTERACTIVE POINTS]
number_of_interactive_points = 8
interactive_point.0 = 0.4,75.650002,-7.92,-0.567,0,0,0,-75,33,2,33,2,2,33,-1
interactive_point.1 = 0.4,75.650002,7.92,-0.567,0,0,0,75,33,2,33,2,2,33,-1
interactive_point.2 = 0.4,33.299999,6.28,-7.18,1,0,0,90,0,0,0,0,0,0,-1
interactive_point.3 = 0.4,-51.700363,6.28,-7.180745,1,0,0,90,0,0,0,0,0,0,-1
interactive_point.4 = 0.4,-68.277824,-2.822939,-5.923376,1,2.395636,12.258935,79.089348,0,0,0,0,0,0,-1
interactive_point.5 = 0,85.062134,-3.882079,4.412694,2,-0,-29.85655,42.814491,0,0,0,0,0,0,-1
interactive_point.6 = 0,85.062134,3.882079,4.412694,2,-0,29.85655,-42.814491,0,0,0,0,0,0,-1
interactive_point.7 = 0,54.038418,-9.45901,-0.003025,1,0,0,0,0,0,0,0,0,0,-1
[STALL PROTECTION]
stall_protection = 1 ; Alpha Protection
off_limit = 11.5 ; Alpha below which the Alpha Protection can be disabled (If also below off_yoke_limit)
off_yoke_limit = 1 ; Yoke position (in Pct) below which the Alpha Protection can be disabled (If also below off_limit)
on_limit = 14 ; Alpha above which the Alpha Protection timer starts
on_goal = 10 ; The alpha that the Alpha Protection will attempt to reach when triggered
timer_trigger = 1.0 ; Duration (in Sec) the alpha must be above on_limit before the Alpha Protection is triggered
;===================== FLAPS =====================
[FLAPS.0]
type = 1
system_type = 1
span-outboard = 0.25
extending-time = 22
damaging-speed = 280
blowout-speed = 310
maneuvering_flaps = 0
lift_scalar = 0.1
drag_scalar = 1.1
pitch_scalar = 1
max_on_ground_position = 7
flaps-position.0 = 0, -1, 0
flaps-position.1 = 0, -1, 0
flaps-position.2 = 15, 215, 0.45, 2, 0, 0, 0, 1
flaps-position.3 = 20, 200, 0.46, 1.1, 0, 0, 0, 1
flaps-position.4 = 24, 185, 0.48, 1.0, 0, 0, 0, 1
flaps-position.5 = 28, 177, 0.3, 1.0, 1.5, 0, 0
flaps-position.6 = 35, 160, 0.32, 1
flaps-position.7 = 50, 155, 0.43, 1
[FLAPS.1]
type = 1
system_type = 1
span-outboard = 0.7
extending-time = 23
damaging-speed = 280
blowout-speed = 310
maneuvering_flaps = 0
lift_scalar = 0.1
drag_scalar = 1.1
pitch_scalar = 1
max_on_ground_position = 7
flaps-position.0 = 0, -1, 0
flaps-position.1 = 0, -1, 0
flaps-position.2 = 15, 215, 0.45, 2, 0, 0, 0, 1
flaps-position.3 = 20, 200, 0.46, 1.1, 0, 0, 0, 1
flaps-position.4 = 24, 185, 0.48, 1.0, 0, 0, 0, 1
flaps-position.5 = 28, 177, 0.3, 1.0, 1.5, 0, 0
flaps-position.6 = 35, 160, 0.32, 1
flaps-position.7 = 50, 155, 0.43, 1
[FLAPS.2]
type = 2
system_type = 1
span-outboard = 0.2
extending-time = 8
damaging-speed = 300
blowout-speed = 330
maneuvering_flaps = 0
lift_scalar = 0.5
drag_scalar = 0.75
pitch_scalar = 1
max_on_ground_position = 1
flaps-position.0 = 0, -1, 0
flaps-position.1 = 20, 215, 0.5, 0.5
[FLAPS.3]
type = 2
system_type = 1
span-outboard = 0.7
extending-time = 21
damaging-speed = 300
blowout-speed = 330
maneuvering_flaps = 0
lift_scalar = 0.5
drag_scalar = 0.75
pitch_scalar = 1
max_on_ground_position = 1
flaps-position.0 = 0, -1, 0
flaps-position.1 = 20, 215, 0.5, 0.5
+2 -2
View File
@@ -1,6 +1,6 @@
{ {
"name": "tfdidesign-md11-load-manager", "name": "js-bundle",
"version": "0.1.186", "version": "0.2.34",
"description": "", "description": "",
"main": "index.js", "main": "index.js",
"type": "module", "type": "module",
@@ -1,40 +1,41 @@
| Department | Related to | Name | License period | Material not material | License type | Link | Remote version | Installed version | Defined version | Author | | Department | Related to | Name | License period | Material not material | License type | Link | Remote version | Installed version | Defined version | Author |
| :--------- | :--------- | :------------------------------- | :------------- | :-------------------- | :----------- | :------------------------------------------------------------------------ | :------------- | :---------------- | :-------------- | :---------------------------------------------------------- | | :--------- | :--------- | :------------------------------- | :------------- | :-------------------- | :------------ | :------------------------------------------------------------------------ | :------------- | :---------------- | :-------------- | :---------------------------------------------------------- |
| kessler | stuff | react | perpetual | material | MIT | git+https://github.com/facebook/react.git | 19.2.0 | 19.1.0 | ^19.1.0 | n/a | | kessler | stuff | lucide-react | perpetual | material | ISC | git+https://github.com/lucide-icons/lucide.git | 0.555.0 | 0.555.0 | ^0.555.0 | Eric Fennis |
| kessler | stuff | react-dom | perpetual | material | MIT | git+https://github.com/facebook/react.git | 19.2.0 | 19.1.0 | ^19.1.0 | n/a | | kessler | stuff | react | perpetual | material | MIT | git+https://github.com/facebook/react.git | 19.2.4 | 19.2.4 | ^19.1.0 | n/a |
| kessler | stuff | uuid | perpetual | material | MIT | git+https://github.com/uuidjs/uuid.git | 11.1.0 | 11.1.0 | ^11.1.0 | n/a | | kessler | stuff | react-dom | perpetual | material | MIT | git+https://github.com/facebook/react.git | 19.2.4 | 19.2.4 | ^19.1.0 | n/a |
| kessler | stuff | @microsoft/msfs-types | perpetual | material | MIT | git+https://github.com/microsoft/msfs-avionics-mirror.git | 1.14.6 | 1.14.6 | ^1.14.6 | Asobo Studio / Working Title Simulations | | kessler | stuff | uuid | perpetual | material | MIT | git+https://github.com/uuidjs/uuid.git | 11.1.0 | 11.1.0 | ^11.1.0 | n/a |
| kessler | stuff | @rollup/plugin-commonjs | perpetual | material | MIT | git+https://github.com/rollup/plugins.git | 28.0.9 | 28.0.3 | ^28.0.3 | Rich Harris <richard.a.harris@gmail.com> | | kessler | stuff | @microsoft/msfs-types | perpetual | material | MIT | git+https://github.com/microsoft/msfs-avionics-mirror.git | 1.14.6 | 1.14.6 | ^1.14.6 | Asobo Studio / Working Title Simulations |
| kessler | stuff | @rollup/plugin-json | perpetual | material | MIT | git+https://github.com/rollup/plugins.git | 6.1.0 | 6.1.0 | ^6.1.0 | rollup | | kessler | stuff | @rollup/plugin-commonjs | perpetual | material | MIT | git+https://github.com/rollup/plugins.git | 28.0.9 | 28.0.9 | ^28.0.3 | Rich Harris <richard.a.harris@gmail.com> |
| kessler | stuff | @rollup/plugin-node-resolve | perpetual | material | MIT | git+https://github.com/rollup/plugins.git | 16.0.3 | 16.0.1 | ^16.0.1 | Rich Harris <richard.a.harris@gmail.com> | | kessler | stuff | @rollup/plugin-json | perpetual | material | MIT | git+https://github.com/rollup/plugins.git | 6.1.0 | 6.1.0 | ^6.1.0 | rollup |
| kessler | stuff | @rollup/plugin-replace | perpetual | material | MIT | git+https://github.com/rollup/plugins.git | 6.0.3 | 6.0.2 | ^6.0.2 | Rich Harris <richard.a.harris@gmail.com> | | kessler | stuff | @rollup/plugin-node-resolve | perpetual | material | MIT | git+https://github.com/rollup/plugins.git | 16.0.3 | 16.0.3 | ^16.0.1 | Rich Harris <richard.a.harris@gmail.com> |
| kessler | stuff | @rollup/plugin-terser | perpetual | material | MIT | git+https://github.com/rollup/plugins.git | 0.4.4 | 0.4.4 | ^0.4.4 | Peter Placzek <peter.placzek1996@gmail.com> | | kessler | stuff | @rollup/plugin-replace | perpetual | material | MIT | git+https://github.com/rollup/plugins.git | 6.0.3 | 6.0.3 | ^6.0.2 | Rich Harris <richard.a.harris@gmail.com> |
| kessler | stuff | @rollup/plugin-typescript | perpetual | material | MIT | git+https://github.com/rollup/plugins.git | 12.3.0 | 12.1.2 | ^12.1.2 | Oskar Segersvärd | | kessler | stuff | @rollup/plugin-terser | perpetual | material | MIT | git+https://github.com/rollup/plugins.git | 0.4.4 | 0.4.4 | ^0.4.4 | Peter Placzek <peter.placzek1996@gmail.com> |
| kessler | stuff | @types/node | perpetual | material | MIT | https://github.com/DefinitelyTyped/DefinitelyTyped.git | 24.10.1 | 24.3.1 | ^24.3.1 | n/a | | kessler | stuff | @rollup/plugin-typescript | perpetual | material | MIT | git+https://github.com/rollup/plugins.git | 12.3.0 | 12.3.0 | ^12.1.2 | Oskar Segersvärd |
| kessler | stuff | @types/react | perpetual | material | MIT | https://github.com/DefinitelyTyped/DefinitelyTyped.git | 19.2.7 | 19.1.6 | ^19.1.6 | n/a | | kessler | stuff | @types/node | perpetual | material | MIT | https://github.com/DefinitelyTyped/DefinitelyTyped.git | 24.12.2 | 24.12.0 | ^24.3.1 | n/a |
| kessler | stuff | @types/react-dom | perpetual | material | MIT | https://github.com/DefinitelyTyped/DefinitelyTyped.git | 19.2.3 | 19.1.6 | ^19.1.6 | n/a | | kessler | stuff | @types/react | perpetual | material | MIT | https://github.com/DefinitelyTyped/DefinitelyTyped.git | 19.2.14 | 19.2.14 | ^19.1.6 | n/a |
| kessler | stuff | @types/uuid | perpetual | material | MIT | https://github.com/DefinitelyTyped/DefinitelyTyped.git | 10.0.0 | 10.0.0 | ^10.0.0 | n/a | | kessler | stuff | @types/react-dom | perpetual | material | MIT | https://github.com/DefinitelyTyped/DefinitelyTyped.git | 19.2.3 | 19.2.3 | ^19.1.6 | n/a |
| kessler | stuff | @typescript-eslint/eslint-plugin | perpetual | material | MIT | git+https://github.com/typescript-eslint/typescript-eslint.git | 6.21.0 | 6.21.0 | ^6.21.0 | n/a | | kessler | stuff | @types/uuid | perpetual | material | MIT | https://github.com/DefinitelyTyped/DefinitelyTyped.git | 10.0.0 | 10.0.0 | ^10.0.0 | n/a |
| kessler | stuff | @typescript-eslint/parser | perpetual | material | BSD-2-Clause | git+https://github.com/typescript-eslint/typescript-eslint.git | 6.21.0 | 6.21.0 | ^6.21.0 | n/a | | kessler | stuff | @typescript-eslint/eslint-plugin | perpetual | material | MIT | git+https://github.com/typescript-eslint/typescript-eslint.git | 6.21.0 | 6.21.0 | ^6.21.0 | n/a |
| kessler | stuff | autoprefixer | perpetual | material | MIT | git+https://github.com/postcss/autoprefixer.git | 10.4.22 | 10.4.21 | ^10.4.21 | Andrey Sitnik <andrey@sitnik.ru> | | kessler | stuff | @typescript-eslint/parser | perpetual | material | BSD-2-Clause | git+https://github.com/typescript-eslint/typescript-eslint.git | 6.21.0 | 6.21.0 | ^6.21.0 | n/a |
| kessler | stuff | cross-env | perpetual | material | MIT | git+https://github.com/kentcdodds/cross-env.git | 7.0.3 | 7.0.3 | ^7.0.3 | Kent C. Dodds <me@kentcdodds.com> (https://kentcdodds.com) | | kessler | stuff | autoprefixer | perpetual | material | MIT | git+https://github.com/postcss/autoprefixer.git | 10.4.27 | 10.4.27 | ^10.4.21 | Andrey Sitnik <andrey@sitnik.ru> |
| kessler | stuff | eslint | perpetual | material | MIT | git+https://github.com/eslint/eslint.git | 8.57.1 | 8.57.1 | ^8.57.1 | Nicholas C. Zakas <nicholas+npm@nczconsulting.com> | | kessler | stuff | cross-env | perpetual | material | MIT | git+https://github.com/kentcdodds/cross-env.git | 7.0.3 | 7.0.3 | ^7.0.3 | Kent C. Dodds <me@kentcdodds.com> (https://kentcdodds.com) |
| kessler | stuff | eslint-plugin-import | perpetual | material | MIT | git+https://github.com/import-js/eslint-plugin-import.git | 2.32.0 | 2.31.0 | ^2.31.0 | Ben Mosher <me@benmosher.com> | | kessler | stuff | eslint | perpetual | material | MIT | git+https://github.com/eslint/eslint.git | 8.57.1 | 8.57.1 | ^8.57.1 | Nicholas C. Zakas <nicholas+npm@nczconsulting.com> |
| kessler | stuff | eslint-plugin-react | perpetual | material | MIT | git+https://github.com/jsx-eslint/eslint-plugin-react.git | 7.37.5 | 7.37.5 | ^7.37.5 | Yannick Croissant <yannick.croissant+npm@gmail.com> | | kessler | stuff | eslint-plugin-import | perpetual | material | MIT | git+https://github.com/import-js/eslint-plugin-import.git | 2.32.0 | 2.32.0 | ^2.31.0 | Ben Mosher <me@benmosher.com> |
| kessler | stuff | eslint-plugin-react-hooks | perpetual | material | MIT | git+https://github.com/facebook/react.git | 4.6.2 | 4.6.2 | ^4.6.2 | n/a | | kessler | stuff | eslint-plugin-react | perpetual | material | MIT | git+https://github.com/jsx-eslint/eslint-plugin-react.git | 7.37.5 | 7.37.5 | ^7.37.5 | Yannick Croissant <yannick.croissant+npm@gmail.com> |
| kessler | stuff | license-report | perpetual | material | MIT | git+https://github.com/kessler/license-report.git | 6.8.1 | 6.7.2 | ^6.7.2 | Yaniv Kessler | | kessler | stuff | eslint-plugin-react-hooks | perpetual | material | MIT | git+https://github.com/facebook/react.git | 4.6.2 | 4.6.2 | ^4.6.2 | n/a |
| kessler | stuff | postcss | perpetual | material | MIT | git+https://github.com/postcss/postcss.git | 8.5.6 | 8.5.4 | ^8.5.4 | Andrey Sitnik <andrey@sitnik.ru> | | kessler | stuff | license-report | perpetual | material | MIT | git+https://github.com/kessler/license-report.git | 6.8.2 | 6.8.2 | ^6.7.2 | Yaniv Kessler |
| kessler | stuff | postcss-import | perpetual | material | MIT | git+https://github.com/postcss/postcss-import.git | 16.1.1 | 16.1.0 | ^16.1.0 | Maxime Thirouin | | kessler | stuff | postcss | perpetual | material | MIT | git+https://github.com/postcss/postcss.git | 8.5.8 | 8.5.8 | ^8.5.4 | Andrey Sitnik <andrey@sitnik.ru> |
| kessler | stuff | prettier | perpetual | material | MIT | git+https://github.com/prettier/prettier.git | 3.7.3 | 3.5.3 | ^3.5.3 | James Long | | kessler | stuff | postcss-import | perpetual | material | MIT | git+https://github.com/postcss/postcss-import.git | 16.1.1 | 16.1.1 | ^16.1.0 | Maxime Thirouin |
| kessler | stuff | prettier-plugin-organize-imports | perpetual | material | MIT | git+https://github.com/simonhaenisch/prettier-plugin-organize-imports.git | 4.3.0 | 4.1.0 | ^4.1.0 | Simon Haenisch (https://github.com/simonhaenisch) | | kessler | stuff | prettier | perpetual | material | MIT | git+https://github.com/prettier/prettier.git | 3.8.1 | 3.8.1 | ^3.5.3 | James Long |
| kessler | stuff | rimraf | perpetual | material | ISC | git+ssh://git@github.com/isaacs/rimraf.git | 6.1.2 | 6.0.1 | ^6.0.1 | Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/) | | kessler | stuff | prettier-plugin-organize-imports | perpetual | material | MIT | git+https://github.com/simonhaenisch/prettier-plugin-organize-imports.git | 4.3.0 | 4.3.0 | ^4.1.0 | Simon Haenisch (https://github.com/simonhaenisch) |
| kessler | stuff | rollup | perpetual | material | MIT | git+https://github.com/rollup/rollup.git | 4.53.3 | 4.42.0 | ^4.42.0 | Rich Harris | | kessler | stuff | rimraf | perpetual | material | BlueOak-1.0.0 | git+ssh://git@github.com/isaacs/rimraf.git | 6.1.3 | 6.1.3 | ^6.0.1 | Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/) |
| kessler | stuff | rollup-plugin-copy | perpetual | material | MIT | git+https://github.com/vladshcherbin/rollup-plugin-copy.git | 3.5.0 | 3.5.0 | ^3.5.0 | Vlad Shcherbin <vlad.shcherbin@gmail.com> | | kessler | stuff | rollup | perpetual | material | MIT | git+https://github.com/rollup/rollup.git | 4.60.1 | 4.60.0 | ^4.42.0 | Rich Harris |
| kessler | stuff | rollup-plugin-postcss | perpetual | material | MIT | git+https://github.com/egoist/rollup-plugin-postcss.git | 4.0.2 | 4.0.2 | ^4.0.2 | EGOIST <0x142857@gmail.com> | | kessler | stuff | rollup-plugin-copy | perpetual | material | MIT | git+https://github.com/vladshcherbin/rollup-plugin-copy.git | 3.5.0 | 3.5.0 | ^3.5.0 | Vlad Shcherbin <vlad.shcherbin@gmail.com> |
| kessler | stuff | rollup-plugin-react-svg | perpetual | material | MIT | git+https://github.com/boopathi/react-svg-loader.git | 3.0.3 | 3.0.3 | ^3.0.3 | boopathi | | kessler | stuff | rollup-plugin-postcss | perpetual | material | MIT | git+https://github.com/egoist/rollup-plugin-postcss.git | 4.0.2 | 4.0.2 | ^4.0.2 | EGOIST <0x142857@gmail.com> |
| kessler | stuff | rollup-plugin-version-injector | perpetual | material | ISC | git+https://github.com/djhouseknecht/rollup-plugin-version-injector.git | 1.3.3 | 1.3.3 | ^1.3.3 | David Houseknecht <david.j.houseknecht@gmail.com> | | kessler | stuff | rollup-plugin-react-svg | perpetual | material | MIT | git+https://github.com/boopathi/react-svg-loader.git | 3.0.3 | 3.0.3 | ^3.0.3 | boopathi |
| kessler | stuff | sass | perpetual | material | MIT | git+https://github.com/sass/dart-sass.git | 1.94.2 | 1.89.1 | ^1.89.1 | Natalie Weizenbaum nweiz@google.com https://github.com/nex3 | | kessler | stuff | rollup-plugin-version-injector | perpetual | material | ISC | git+https://github.com/djhouseknecht/rollup-plugin-version-injector.git | 1.3.3 | 1.3.3 | ^1.3.3 | David Houseknecht <david.j.houseknecht@gmail.com> |
| kessler | stuff | tslib | perpetual | material | 0BSD | git+https://github.com/Microsoft/tslib.git | 2.8.1 | 2.8.1 | ^2.8.1 | Microsoft Corp. | | kessler | stuff | sass | perpetual | material | MIT | git+https://github.com/sass/dart-sass.git | 1.99.0 | 1.98.0 | ^1.89.1 | Natalie Weizenbaum nweiz@google.com https://github.com/nex3 |
| kessler | stuff | typed-scss-modules | perpetual | material | MIT | git+https://github.com/skovy/typed-scss-modules.git | 8.1.1 | 8.1.1 | ^8.1.1 | Spencer Miskoviak <smiskoviak@gmail.com> | | kessler | stuff | tslib | perpetual | material | 0BSD | git+https://github.com/Microsoft/tslib.git | 2.8.1 | 2.8.1 | ^2.8.1 | Microsoft Corp. |
| kessler | stuff | typescript | perpetual | material | Apache-2.0 | git+https://github.com/microsoft/TypeScript.git | 5.8.3 | 5.8.3 | 5.8.3 | Microsoft Corp. | | kessler | stuff | typed-scss-modules | perpetual | material | MIT | git+https://github.com/skovy/typed-scss-modules.git | 8.1.1 | 8.1.1 | ^8.1.1 | Spencer Miskoviak <smiskoviak@gmail.com> |
| kessler | stuff | typescript | perpetual | material | Apache-2.0 | git+https://github.com/microsoft/TypeScript.git | 5.8.3 | 5.8.3 | 5.8.3 | Microsoft Corp. |
@@ -2,7 +2,7 @@ import { FC, useEffect, useState } from 'react';
import { WASMDataF } from '../../types/WASMData'; import { WASMDataF } from '../../types/WASMData';
import { LoadingState, SimBrief } from '../../types/general'; import { LoadingState, SimBrief } from '../../types/general';
import { ImportFlightPlanKH } from '../../utils/TFDISBImport'; import { ImportFlightPlanKH } from '../../utils/TFDISBImport';
import { CoherentCallSBEntryF, inRangeOf, loadAircraft, unloadAircraft } from '../../utils/utils'; import { CoherentCallSBEntryF, loadAircraft, unloadAircraft } from '../../utils/utils';
import CGSelect from '../CGSelect/CGSelect'; import CGSelect from '../CGSelect/CGSelect';
import ActionBar from '../actionbar/ActionBar'; import ActionBar from '../actionbar/ActionBar';
import Input from '../input/Input'; import Input from '../input/Input';
@@ -11,13 +11,13 @@ interface SBEntryProps {
WASMData: WASMDataF; WASMData: WASMDataF;
loadingState: LoadingState; loadingState: LoadingState;
gsxActive: boolean; gsxActive: boolean;
gsxFuelActive: boolean;
setLoadingState: (newState: LoadingState) => void; setLoadingState: (newState: LoadingState) => void;
} }
const SBEntryF: FC<SBEntryProps> = ({ WASMData, loadingState, gsxActive, setLoadingState }) => { const SBEntryF: FC<SBEntryProps> = ({ WASMData, loadingState, gsxActive, gsxFuelActive, setLoadingState }) => {
const [CGTarget, setCGTarget] = useState(WASMData.targetPayload.CGTarget); const [CGTarget, setCGTarget] = useState(WASMData.targetPayload.CGTarget);
const [fuel, setFuel] = useState(Math.round(WASMData.livePayload.fuel)); const [fuel, setFuel] = useState(Math.round(WASMData.targetPayload.fuel));
const [fuelEnabled, setFuelEnabled] = useState(true);
const [SBInFlight, setSBInFlight] = useState(false); const [SBInFlight, setSBInFlight] = useState(false);
// FROM EFB // FROM EFB
@@ -52,6 +52,11 @@ const SBEntryF: FC<SBEntryProps> = ({ WASMData, loadingState, gsxActive, setLoad
} }
}; };
const updateData = (SBPlan?: SimBrief, _fuel?: number) => {
CoherentCallSBEntryF(CGTarget, _fuel ?? fuel, SBPlan);
};
useEffect(() => updateData(), [CGTarget, fuel]);
useEffect(() => { useEffect(() => {
if (!simBrief || gsxActive) return; if (!simBrief || gsxActive) return;
@@ -70,12 +75,13 @@ const SBEntryF: FC<SBEntryProps> = ({ WASMData, loadingState, gsxActive, setLoad
return; return;
} }
updateData(undefined, SBResponse.message as SimBrief); const _fuel = parseFloat((SBResponse.message as SimBrief).fuel as unknown as string) ?? 0;
setFuel(parseFloat((SBResponse.message as SimBrief).fuel as unknown as string) ?? 0); updateData(SBResponse.message as SimBrief, _fuel);
setFuel(_fuel);
setSBInFlight(false); setSBInFlight(false);
}, [simBrief, gsxActive]); }, [simBrief, gsxActive]);
useEffect( useEffect(
() => () =>
setFuel((prev) => { setFuel((prev) => {
@@ -84,13 +90,6 @@ const SBEntryF: FC<SBEntryProps> = ({ WASMData, loadingState, gsxActive, setLoad
}), }),
[WASMData.userData.isER] [WASMData.userData.isER]
); );
useEffect(() => {
setFuelEnabled((prev) => (!prev ? inRangeOf(Math.round(WASMData.livePayload.fuel), fuel) : prev));
}, [WASMData.livePayload.fuel]);
const updateData = (_CGTarget?: number, SBPlan?: SimBrief) => {
CoherentCallSBEntryF(_CGTarget ?? CGTarget, SBPlan);
};
return ( return (
<> <>
@@ -104,24 +103,8 @@ const SBEntryF: FC<SBEntryProps> = ({ WASMData, loadingState, gsxActive, setLoad
className={`w-1/2 rounded-lg border border-white bg-zinc-700 px-3 py-2 text-right`} className={`w-1/2 rounded-lg border border-white bg-zinc-700 px-3 py-2 text-right`}
value={fuel} value={fuel}
onChange={(value) => handleInput(value, WASMData.limits.maxFuel, setFuel)} onChange={(value) => handleInput(value, WASMData.limits.maxFuel, setFuel)}
disabled={loadingState !== 'preview' || gsxActive} disabled={loadingState !== 'preview' || gsxFuelActive}
/> />
<button
className="middle none center rounded-lg bg-green-600 px-6 py-3 font-sans text-xs font-bold uppercase text-white shadow-md shadow-green-500/20 transition-all hover:shadow-lg hover:shadow-green-500/40 focus:opacity-[0.85] focus:shadow-none active:opacity-[0.85] active:shadow-none disabled:pointer-events-none disabled:opacity-50 disabled:shadow-none"
data-ripple-light="true"
onClick={() => {
SimVar.SetSimVarValue(
'L:MD11_EFB_PAYLOAD_FUEL',
'lbs',
WASMData.userData.isImperial ? fuel : fuel * 2.20462262185
);
SimVar.SetSimVarValue('L:MD11_EFB_READ_READY', 'bool', true);
setFuelEnabled(WASMData.livePayload.fuel === fuel);
}}
disabled={loadingState !== 'preview' || !fuelEnabled || gsxActive}
>
Load Fuel
</button>
</div> </div>
</div> </div>
</div> </div>
@@ -164,14 +147,12 @@ const SBEntryF: FC<SBEntryProps> = ({ WASMData, loadingState, gsxActive, setLoad
increase={() => increase={() =>
setCGTarget((prev) => { setCGTarget((prev) => {
const _new = prev + 0.1; const _new = prev + 0.1;
updateData(_new);
return _new; return _new;
}) })
} }
decrease={() => decrease={() =>
setCGTarget((prev) => { setCGTarget((prev) => {
const _new = prev - 0.1; const _new = prev - 0.1;
updateData(_new);
return _new; return _new;
}) })
} }
@@ -2,7 +2,7 @@ import { FC, useEffect, useState } from 'react';
import { WASMDataPax } from '../../types/WASMData'; import { WASMDataPax } from '../../types/WASMData';
import { LoadingState, SimBrief } from '../../types/general'; import { LoadingState, SimBrief } from '../../types/general';
import { ImportFlightPlanKH } from '../../utils/TFDISBImport'; import { ImportFlightPlanKH } from '../../utils/TFDISBImport';
import { CoherentCallSBEntryPax, inRangeOf, loadAircraft, unloadAircraft } from '../../utils/utils'; import { CoherentCallSBEntryPax, loadAircraft, unloadAircraft } from '../../utils/utils';
import CGSelect from '../CGSelect/CGSelect'; import CGSelect from '../CGSelect/CGSelect';
import ActionBar from '../actionbar/ActionBar'; import ActionBar from '../actionbar/ActionBar';
import Input from '../input/Input'; import Input from '../input/Input';
@@ -11,13 +11,13 @@ interface SBEntryProps {
WASMData: WASMDataPax; WASMData: WASMDataPax;
loadingState: LoadingState; loadingState: LoadingState;
gsxActive: boolean; gsxActive: boolean;
gsxFuelActive: boolean;
setLoadingState: (newState: LoadingState) => void; setLoadingState: (newState: LoadingState) => void;
} }
const SBEntryPax: FC<SBEntryProps> = ({ WASMData, loadingState, gsxActive, setLoadingState }) => { const SBEntryPax: FC<SBEntryProps> = ({ WASMData, loadingState, gsxActive, gsxFuelActive, setLoadingState }) => {
const [CGTarget, setCGTarget] = useState(WASMData.targetPayload.CGTarget); const [CGTarget, setCGTarget] = useState(WASMData.targetPayload.CGTarget);
const [fuel, setFuel] = useState(Math.round(WASMData.livePayload.fuel)); const [fuel, setFuel] = useState(Math.round(WASMData.targetPayload.fuel));
const [fuelEnabled, setFuelEnabled] = useState(true);
const [SBInFlight, setSBInFlight] = useState(false); const [SBInFlight, setSBInFlight] = useState(false);
// FROM EFB // FROM EFB
@@ -52,6 +52,10 @@ const SBEntryPax: FC<SBEntryProps> = ({ WASMData, loadingState, gsxActive, setLo
} }
}; };
const updateData = (SBPlan?: SimBrief, _fuel?: number) => {
CoherentCallSBEntryPax(CGTarget, _fuel ?? fuel, SBPlan);
};
useEffect(() => { useEffect(() => {
if (!simBrief || gsxActive) return; if (!simBrief || gsxActive) return;
@@ -70,12 +74,17 @@ const SBEntryPax: FC<SBEntryProps> = ({ WASMData, loadingState, gsxActive, setLo
return; return;
} }
updateData(undefined, SBResponse.message as SimBrief); const _fuel = parseFloat((SBResponse.message as SimBrief).fuel as unknown as string) ?? 0;
updateData(SBResponse.message as SimBrief, _fuel);
setFuel(_fuel);
setFuel(parseFloat((SBResponse.message as SimBrief).fuel as unknown as string) ?? 0); setFuel(parseFloat((SBResponse.message as SimBrief).fuel as unknown as string) ?? 0);
setSBInFlight(false); setSBInFlight(false);
}, [simBrief, gsxActive]); }, [simBrief, gsxActive]);
useEffect(() => updateData(), [CGTarget, fuel]);
useEffect( useEffect(
() => () =>
setFuel((prev) => { setFuel((prev) => {
@@ -84,13 +93,6 @@ const SBEntryPax: FC<SBEntryProps> = ({ WASMData, loadingState, gsxActive, setLo
}), }),
[WASMData.userData.isER] [WASMData.userData.isER]
); );
useEffect(() => {
setFuelEnabled((prev) => (!prev ? inRangeOf(Math.round(WASMData.livePayload.fuel), fuel) : prev));
}, [WASMData.livePayload.fuel]);
const updateData = (_CGTarget?: number, SBPlan?: SimBrief) => {
CoherentCallSBEntryPax(_CGTarget ?? CGTarget, SBPlan);
};
return ( return (
<> <>
@@ -104,24 +106,8 @@ const SBEntryPax: FC<SBEntryProps> = ({ WASMData, loadingState, gsxActive, setLo
className={`w-1/2 rounded-lg border border-white bg-zinc-700 px-3 py-2 text-right`} className={`w-1/2 rounded-lg border border-white bg-zinc-700 px-3 py-2 text-right`}
value={fuel} value={fuel}
onChange={(value) => handleInput(value, WASMData.limits.maxFuel, setFuel)} onChange={(value) => handleInput(value, WASMData.limits.maxFuel, setFuel)}
disabled={loadingState !== 'preview' || gsxActive} disabled={loadingState !== 'preview' || gsxFuelActive}
/> />
<button
className="middle none center rounded-lg bg-green-600 px-6 py-3 font-sans text-xs font-bold uppercase text-white shadow-md shadow-green-500/20 transition-all hover:shadow-lg hover:shadow-green-500/40 focus:opacity-[0.85] focus:shadow-none active:opacity-[0.85] active:shadow-none disabled:pointer-events-none disabled:opacity-50 disabled:shadow-none"
data-ripple-light="true"
onClick={() => {
SimVar.SetSimVarValue(
'L:MD11_EFB_PAYLOAD_FUEL',
'lbs',
WASMData.userData.isImperial ? fuel : fuel * 2.20462262185
);
SimVar.SetSimVarValue('L:MD11_EFB_READ_READY', 'bool', true);
setFuelEnabled(WASMData.livePayload.fuel === fuel);
}}
disabled={loadingState !== 'preview' || !fuelEnabled || gsxActive}
>
Load Fuel
</button>
</div> </div>
</div> </div>
</div> </div>
@@ -164,14 +150,12 @@ const SBEntryPax: FC<SBEntryProps> = ({ WASMData, loadingState, gsxActive, setLo
increase={() => increase={() =>
setCGTarget((prev) => { setCGTarget((prev) => {
const _new = prev + 0.1; const _new = prev + 0.1;
updateData(_new);
return _new; return _new;
}) })
} }
decrease={() => decrease={() =>
setCGTarget((prev) => { setCGTarget((prev) => {
const _new = prev - 0.1; const _new = prev - 0.1;
updateData(_new);
return _new; return _new;
}) })
} }
@@ -1,6 +1,6 @@
import { FC, useEffect, useState } from 'react'; import { FC, useEffect, useState } from 'react';
import { LoadingState } from '../../types/general'; import { LoadingState } from '../../types/general';
import { GSXLoadingState, WASMDataF } from '../../types/WASMData'; import { GSXFuelingState, GSXLoadingState, WASMDataF } from '../../types/WASMData';
import OptionsF from '../options/OptionsF'; import OptionsF from '../options/OptionsF';
import Profile from '../profile/Profile'; import Profile from '../profile/Profile';
import SBEntryF from '../SBEntry/SBEntryF'; import SBEntryF from '../SBEntry/SBEntryF';
@@ -65,6 +65,9 @@ const Freighter: FC<FreighterProps> = ({ WASMData, username }) => {
WASMData.GSX.loadingState !== GSXLoadingState.DEBOARDED WASMData.GSX.loadingState !== GSXLoadingState.DEBOARDED
); );
}; };
const GSXFuelActive = () => {
return WASMData.GSX.couatlStarted && WASMData.GSX.fuelingState !== GSXFuelingState.IDLE;
};
const CGs = (): [string, boolean, string, boolean] => { const CGs = (): [string, boolean, string, boolean] => {
if (loadingState !== 'loaded' && !GSXActive()) { if (loadingState !== 'loaded' && !GSXActive()) {
@@ -118,9 +121,7 @@ const Freighter: FC<FreighterProps> = ({ WASMData, username }) => {
} }
/> />
<Tabbar <Tabbar
tabs={ tabs={username ? ['Simbrief', 'ZFW', 'Cargo', 'Options'] : ['ZFW', 'Cargo', 'Options']}
username ? ['Simbrief', 'ZFW', 'Cargo', 'Options'] : ['ZFW', 'Cargo', 'Options']
}
selectedTab={selectedTab} selectedTab={selectedTab}
setSelectedTab={setSelectedTab} setSelectedTab={setSelectedTab}
/> />
@@ -130,6 +131,7 @@ const Freighter: FC<FreighterProps> = ({ WASMData, username }) => {
loadingState={loadingState} loadingState={loadingState}
setLoadingState={setLoadingState} setLoadingState={setLoadingState}
gsxActive={GSXActive()} gsxActive={GSXActive()}
gsxFuelActive={GSXFuelActive()}
/> />
)} )}
{((username && selectedTab === 1) || (!username && selectedTab === 0)) && ( {((username && selectedTab === 1) || (!username && selectedTab === 0)) && (
@@ -138,6 +140,7 @@ const Freighter: FC<FreighterProps> = ({ WASMData, username }) => {
loadingState={loadingState} loadingState={loadingState}
setLoadingState={setLoadingState} setLoadingState={setLoadingState}
gsxActive={GSXActive()} gsxActive={GSXActive()}
gsxFuelActive={GSXFuelActive()}
/> />
)} )}
{((username && selectedTab === 2) || (!username && selectedTab === 1)) && ( {((username && selectedTab === 2) || (!username && selectedTab === 1)) && (
@@ -146,6 +149,7 @@ const Freighter: FC<FreighterProps> = ({ WASMData, username }) => {
loadingState={loadingState} loadingState={loadingState}
setLoadingState={setLoadingState} setLoadingState={setLoadingState}
gsxActive={GSXActive()} gsxActive={GSXActive()}
gsxFuelActive={GSXFuelActive()}
/> />
)} )}
{((username && selectedTab === 3) || (!username && selectedTab === 2)) && ( {((username && selectedTab === 3) || (!username && selectedTab === 2)) && (
@@ -5,11 +5,11 @@ import Keyboard from '../keyboard/Keyboard';
export default function Input(props: { export default function Input(props: {
type?: string; type?: string;
topKeyboard?: boolean; topKeyboard?: boolean;
value: any; value: number | string;
min?: number; min?: number;
max?: number; max?: number;
step?: number; step?: number;
placeholder?: any; placeholder?: string;
className?: string; className?: string;
disabled?: boolean; disabled?: boolean;
onChange?: (value: string) => void; onChange?: (value: string) => void;
@@ -21,14 +21,28 @@ export default function Input(props: {
const blurRef = useRef<boolean>(false); const blurRef = useRef<boolean>(false);
const [isFocused, setFocused] = useState(false); const [isFocused, setFocused] = useState(false);
const [showKeyboard, setShowKeyboard] = useState(false); const [showKeyboard, setShowKeyboard] = useState(false);
const [unfocusTimer, setUnfocusTimer] = useState<NodeJS.Timeout | null>(null);
useEffect(() => { useEffect(() => {
if (unfocusTimer) {
clearTimeout(unfocusTimer);
setUnfocusTimer(null);
}
if (isFocused) { if (isFocused) {
setUnfocusTimer(setTimeout(() => ref.current?.blur(), 5e3));
Coherent.trigger('FOCUS_INPUT_FIELD', guid, '', '', '', false); Coherent.trigger('FOCUS_INPUT_FIELD', guid, '', '', '', false);
} else { } else {
console.log('UNFOCUS_INPUT_FIELD'); console.log('UNFOCUS_INPUT_FIELD');
Coherent.trigger('UNFOCUS_INPUT_FIELD', guid); Coherent.trigger('UNFOCUS_INPUT_FIELD', guid);
} }
return () => {
if (unfocusTimer) {
clearTimeout(unfocusTimer);
setUnfocusTimer(null);
}
};
}, [isFocused, guid]); }, [isFocused, guid]);
return ( return (
@@ -60,6 +74,11 @@ export default function Input(props: {
}} }}
onChange={(e) => { onChange={(e) => {
if (props.onChange) props.onChange(e.target.value); if (props.onChange) props.onChange(e.target.value);
if (unfocusTimer) {
clearTimeout(unfocusTimer);
setUnfocusTimer(null);
}
if (isFocused) setUnfocusTimer(setTimeout(() => ref.current?.blur(), 5e3));
}} }}
value={props.value} value={props.value}
className={props.className} className={props.className}
@@ -103,5 +103,6 @@ const Keyboard = forwardRef<
document.body document.body
); );
}); });
Keyboard.displayName = "Keyboard"
export default Keyboard; export default Keyboard;
@@ -48,7 +48,7 @@ const OptionsF: FC<OptionsFProps> = ({ WASMData, loadingState, gsxActive }) => {
<td className="p-1 px-2">0 {WASMData.userData.isImperial ? 'lbs' : 'kg'}</td> <td className="p-1 px-2">0 {WASMData.userData.isImperial ? 'lbs' : 'kg'}</td>
</tr> </tr>
<tr> <tr>
<td className="p-1 px-2">Empty Weight</td> <td className="p-1 px-2">Empty Weight (inc. crew)</td>
<td className="p-1 px-2">{WASMData.userData.isImperial ? '249537 lbs' : '113188 kg'}</td> <td className="p-1 px-2">{WASMData.userData.isImperial ? '249537 lbs' : '113188 kg'}</td>
</tr> </tr>
<tr> <tr>
@@ -84,7 +84,7 @@ const OptionsF: FC<OptionsFProps> = ({ WASMData, loadingState, gsxActive }) => {
<td className="p-1 px-2">0 {WASMData.userData.isImperial ? 'lbs' : 'kg'}</td> <td className="p-1 px-2">0 {WASMData.userData.isImperial ? 'lbs' : 'kg'}</td>
</tr> </tr>
<tr> <tr>
<td className="p-1 px-2">Empty Weight</td> <td className="p-1 px-2">Empty Weight (inc. crew)</td>
<td className="p-1 px-2">{WASMData.userData.isImperial ? '249137 lbs' : '113006 kg'}</td> <td className="p-1 px-2">{WASMData.userData.isImperial ? '249137 lbs' : '113006 kg'}</td>
</tr> </tr>
<tr> <tr>
@@ -2,8 +2,8 @@ import { FC, useEffect, useState } from 'react';
import { LoadingState } from '../../types/general'; import { LoadingState } from '../../types/general';
import { WASMDataPax } from '../../types/WASMData'; import { WASMDataPax } from '../../types/WASMData';
import { CoherentCallGSXReset, CoherentCallOptionsSet } from '../../utils/utils'; import { CoherentCallGSXReset, CoherentCallOptionsSet } from '../../utils/utils';
import ToggleComponentKH from '../toggleComponent/ToggleComponent';
import Input from '../input/Input'; import Input from '../input/Input';
import ToggleComponentKH from '../toggleComponent/ToggleComponent';
interface OptionsPaxProps { interface OptionsPaxProps {
WASMData: WASMDataPax; WASMData: WASMDataPax;
@@ -105,8 +105,8 @@ const OptionsPax: FC<OptionsPaxProps> = ({ WASMData, loadingState, gsxActive })
</td> </td>
</tr> </tr>
<tr> <tr>
<td className="p-1 px-2">Empty Weight</td> <td className="p-1 px-2">Empty Weight (inc. crew)</td>
<td className="p-1 px-2">{WASMData.userData.isImperial ? '284375 lbs' : '128991 kg'}</td> <td className="p-1 px-2">{WASMData.userData.isImperial ? '286465 lbs' : '129937 kg'}</td>
</tr> </tr>
<tr> <tr>
<td className="p-1 px-2">Max Zero Fuel Weight</td> <td className="p-1 px-2">Max Zero Fuel Weight</td>
@@ -145,8 +145,8 @@ const OptionsPax: FC<OptionsPaxProps> = ({ WASMData, loadingState, gsxActive })
</td> </td>
</tr> </tr>
<tr> <tr>
<td className="p-1 px-2">Empty Weight</td> <td className="p-1 px-2">Empty Weight (inc. crew)</td>
<td className="p-1 px-2">{WASMData.userData.isImperial ? '283975 lbs' : '128809 kg'}</td> <td className="p-1 px-2">{WASMData.userData.isImperial ? '286065 lbs' : '129755 kg'}</td>
</tr> </tr>
<tr> <tr>
<td className="p-1 px-2">Max Zero Fuel Weight</td> <td className="p-1 px-2">Max Zero Fuel Weight</td>
@@ -1,6 +1,6 @@
import { FC, useEffect, useState } from 'react'; import { FC, useEffect, useState } from 'react';
import { LoadingState } from '../../types/general'; import { LoadingState } from '../../types/general';
import { GSXLoadingState, WASMDataPax } from '../../types/WASMData'; import { GSXFuelingState, GSXLoadingState, WASMDataPax } from '../../types/WASMData';
import OptionsPax from '../options/OptionsPax'; import OptionsPax from '../options/OptionsPax';
import Profile from '../profile/Profile'; import Profile from '../profile/Profile';
import SBEntryPax from '../SBEntry/SBEntryPax'; import SBEntryPax from '../SBEntry/SBEntryPax';
@@ -65,6 +65,9 @@ const Pax: FC<PaxProps> = ({ WASMData, username }) => {
WASMData.GSX.loadingState !== GSXLoadingState.DEBOARDED WASMData.GSX.loadingState !== GSXLoadingState.DEBOARDED
); );
}; };
const GSXFuelActive = () => {
return WASMData.GSX.couatlStarted && WASMData.GSX.fuelingState !== GSXFuelingState.IDLE;
};
const CGs = (): [string, boolean, string, boolean] => { const CGs = (): [string, boolean, string, boolean] => {
if (loadingState !== 'loaded' && !GSXActive()) { if (loadingState !== 'loaded' && !GSXActive()) {
@@ -134,6 +137,7 @@ const Pax: FC<PaxProps> = ({ WASMData, username }) => {
loadingState={loadingState} loadingState={loadingState}
setLoadingState={setLoadingState} setLoadingState={setLoadingState}
gsxActive={GSXActive()} gsxActive={GSXActive()}
gsxFuelActive={GSXFuelActive()}
/> />
)} )}
{((username && selectedTab === 1) || (!username && selectedTab === 0)) && ( {((username && selectedTab === 1) || (!username && selectedTab === 0)) && (
@@ -142,6 +146,7 @@ const Pax: FC<PaxProps> = ({ WASMData, username }) => {
loadingState={loadingState} loadingState={loadingState}
setLoadingState={setLoadingState} setLoadingState={setLoadingState}
gsxActive={GSXActive()} gsxActive={GSXActive()}
gsxFuelActive={GSXFuelActive()}
/> />
)} )}
{((username && selectedTab === 2) || (!username && selectedTab === 1)) && ( {((username && selectedTab === 2) || (!username && selectedTab === 1)) && (
@@ -150,6 +155,7 @@ const Pax: FC<PaxProps> = ({ WASMData, username }) => {
loadingState={loadingState} loadingState={loadingState}
setLoadingState={setLoadingState} setLoadingState={setLoadingState}
gsxActive={GSXActive()} gsxActive={GSXActive()}
gsxFuelActive={GSXFuelActive()}
/> />
)} )}
{((username && selectedTab === 3) || (!username && selectedTab === 2)) && ( {((username && selectedTab === 3) || (!username && selectedTab === 2)) && (
@@ -1,7 +1,7 @@
import { FC, useEffect, useState } from 'react'; import { FC, useEffect, useState } from 'react';
import { LoadingState } from '../../types/general'; import { LoadingState } from '../../types/general';
import { WASMDataF } from '../../types/WASMData'; import { WASMDataF } from '../../types/WASMData';
import { CoherentCallStationEntryF, inRangeOf, loadAircraft, unloadAircraft } from '../../utils/utils'; import { CoherentCallStationEntryF, loadAircraft, unloadAircraft } from '../../utils/utils';
import ActionBar from '../actionbar/ActionBar'; import ActionBar from '../actionbar/ActionBar';
import Input from '../input/Input'; import Input from '../input/Input';
@@ -9,18 +9,18 @@ interface StationEntryProps {
WASMData: WASMDataF; WASMData: WASMDataF;
loadingState: LoadingState; loadingState: LoadingState;
gsxActive: boolean; gsxActive: boolean;
gsxFuelActive: boolean;
setLoadingState: (newState: LoadingState) => void; setLoadingState: (newState: LoadingState) => void;
} }
const StationEntryF: FC<StationEntryProps> = ({ WASMData, loadingState, gsxActive, setLoadingState }) => { const StationEntryF: FC<StationEntryProps> = ({ WASMData, loadingState, gsxActive, gsxFuelActive, setLoadingState }) => {
const [upper1, setUpper1] = useState(WASMData.targetPayload.upper1); const [upper1, setUpper1] = useState(WASMData.targetPayload.upper1);
const [upper2, setUpper2] = useState(WASMData.targetPayload.upper2); const [upper2, setUpper2] = useState(WASMData.targetPayload.upper2);
const [upper3, setUpper3] = useState(WASMData.targetPayload.upper3); const [upper3, setUpper3] = useState(WASMData.targetPayload.upper3);
const [upper4, setUpper4] = useState(WASMData.targetPayload.upper4); const [upper4, setUpper4] = useState(WASMData.targetPayload.upper4);
const [lowerForward, setLowerForward] = useState(WASMData.targetPayload.lowerForward); const [lowerForward, setLowerForward] = useState(WASMData.targetPayload.lowerForward);
const [lowerRear, setLowerRear] = useState(WASMData.targetPayload.lowerRear); const [lowerRear, setLowerRear] = useState(WASMData.targetPayload.lowerRear);
const [fuel, setFuel] = useState(Math.round(WASMData.livePayload.fuel)); const [fuel, setFuel] = useState(Math.round(WASMData.targetPayload.fuel));
const [fuelEnabled, setFuelEnabled] = useState(true);
const ZFW = () => { const ZFW = () => {
if (loadingState !== 'loaded' && !gsxActive) return Math.round(WASMData.targetPayload.total); if (loadingState !== 'loaded' && !gsxActive) return Math.round(WASMData.targetPayload.total);
@@ -52,10 +52,10 @@ const StationEntryF: FC<StationEntryProps> = ({ WASMData, loadingState, gsxActiv
}; };
const updateData = () => { const updateData = () => {
CoherentCallStationEntryF(upper1, upper2, upper3, upper4, lowerForward, lowerRear); CoherentCallStationEntryF(upper1, upper2, upper3, upper4, lowerForward, lowerRear, fuel);
}; };
useEffect(() => updateData(), [upper1, upper2, upper3, upper4, lowerForward, lowerRear]); useEffect(() => updateData(), [upper1, upper2, upper3, upper4, lowerForward, lowerRear, fuel]);
useEffect( useEffect(
() => () =>
setFuel((prev) => { setFuel((prev) => {
@@ -64,9 +64,6 @@ const StationEntryF: FC<StationEntryProps> = ({ WASMData, loadingState, gsxActiv
}), }),
[WASMData.userData.isER] [WASMData.userData.isER]
); );
useEffect(() => {
setFuelEnabled((prev) => (!prev ? inRangeOf(Math.round(WASMData.livePayload.fuel), fuel) : prev));
}, [WASMData.livePayload.fuel]);
return ( return (
<> <>
@@ -80,24 +77,8 @@ const StationEntryF: FC<StationEntryProps> = ({ WASMData, loadingState, gsxActiv
className={`w-1/2 rounded-lg border border-white bg-zinc-700 px-3 py-2 text-right`} className={`w-1/2 rounded-lg border border-white bg-zinc-700 px-3 py-2 text-right`}
value={fuel} value={fuel}
onChange={(value) => handleInput(value, WASMData.limits.maxFuel, setFuel)} onChange={(value) => handleInput(value, WASMData.limits.maxFuel, setFuel)}
disabled={loadingState !== 'preview' || gsxActive} disabled={loadingState !== 'preview' || gsxFuelActive}
/> />
<button
className="middle none center rounded-lg bg-green-600 px-6 py-3 font-sans text-xs font-bold uppercase text-white shadow-md shadow-green-500/20 transition-all hover:shadow-lg hover:shadow-green-500/40 focus:opacity-[0.85] focus:shadow-none active:opacity-[0.85] active:shadow-none disabled:pointer-events-none disabled:opacity-50 disabled:shadow-none"
data-ripple-light="true"
onClick={() => {
SimVar.SetSimVarValue(
'L:MD11_EFB_PAYLOAD_FUEL',
'lbs',
WASMData.userData.isImperial ? fuel : fuel * 2.20462262185
);
SimVar.SetSimVarValue('L:MD11_EFB_READ_READY', 'bool', true);
setFuelEnabled(WASMData.livePayload.fuel === fuel);
}}
disabled={loadingState !== 'preview' || !fuelEnabled || gsxActive}
>
Load Fuel
</button>
</div> </div>
</div> </div>
</div> </div>
@@ -1,7 +1,7 @@
import { FC, useEffect, useState } from 'react'; import { FC, useEffect, useState } from 'react';
import { LoadingState } from '../../types/general'; import { LoadingState } from '../../types/general';
import { WASMDataPax } from '../../types/WASMData'; import { WASMDataPax } from '../../types/WASMData';
import { CoherentCallStationEntryPax, inRangeOf, loadAircraft, unloadAircraft } from '../../utils/utils'; import { CoherentCallStationEntryPax, loadAircraft, unloadAircraft } from '../../utils/utils';
import ActionBar from '../actionbar/ActionBar'; import ActionBar from '../actionbar/ActionBar';
import Input from '../input/Input'; import Input from '../input/Input';
@@ -9,18 +9,24 @@ interface StationEntryProps {
WASMData: WASMDataPax; WASMData: WASMDataPax;
loadingState: LoadingState; loadingState: LoadingState;
gsxActive: boolean; gsxActive: boolean;
gsxFuelActive: boolean;
setLoadingState: (newState: LoadingState) => void; setLoadingState: (newState: LoadingState) => void;
} }
const StationEntryPax: FC<StationEntryProps> = ({ WASMData, loadingState, gsxActive, setLoadingState }) => { const StationEntryPax: FC<StationEntryProps> = ({
WASMData,
loadingState,
gsxActive,
gsxFuelActive,
setLoadingState,
}) => {
const [business1, setBusiness1] = useState(WASMData.targetPayload.business1); const [business1, setBusiness1] = useState(WASMData.targetPayload.business1);
const [business2, setBusiness2] = useState(WASMData.targetPayload.business2); const [business2, setBusiness2] = useState(WASMData.targetPayload.business2);
const [economy1, setEconomy1] = useState(WASMData.targetPayload.economy1); const [economy1, setEconomy1] = useState(WASMData.targetPayload.economy1);
const [economy2, setEconomy2] = useState(WASMData.targetPayload.economy2); const [economy2, setEconomy2] = useState(WASMData.targetPayload.economy2);
const [forwardCargo, setForwardCargo] = useState(WASMData.targetPayload.forwardCargo); const [forwardCargo, setForwardCargo] = useState(WASMData.targetPayload.forwardCargo);
const [rearCargo, setRearCargo] = useState(WASMData.targetPayload.rearCargo); const [rearCargo, setRearCargo] = useState(WASMData.targetPayload.rearCargo);
const [fuel, setFuel] = useState(Math.round(WASMData.livePayload.fuel)); const [fuel, setFuel] = useState(Math.round(WASMData.targetPayload.fuel));
const [fuelEnabled, setFuelEnabled] = useState(true);
const ZFW = () => { const ZFW = () => {
if (loadingState !== 'loaded' && !gsxActive) return Math.round(WASMData.targetPayload.total); if (loadingState !== 'loaded' && !gsxActive) return Math.round(WASMData.targetPayload.total);
@@ -52,10 +58,10 @@ const StationEntryPax: FC<StationEntryProps> = ({ WASMData, loadingState, gsxAct
}; };
const updateData = () => { const updateData = () => {
CoherentCallStationEntryPax(business1, business2, economy1, economy2, forwardCargo, rearCargo); CoherentCallStationEntryPax(business1, business2, economy1, economy2, forwardCargo, rearCargo, fuel);
}; };
useEffect(() => updateData(), [business1, business2, economy1, economy2, forwardCargo, rearCargo]); useEffect(() => updateData(), [business1, business2, economy1, economy2, forwardCargo, rearCargo, fuel]);
useEffect( useEffect(
() => () =>
setFuel((prev) => { setFuel((prev) => {
@@ -64,9 +70,6 @@ const StationEntryPax: FC<StationEntryProps> = ({ WASMData, loadingState, gsxAct
}), }),
[WASMData.userData.isER] [WASMData.userData.isER]
); );
useEffect(() => {
setFuelEnabled((prev) => (!prev ? inRangeOf(Math.round(WASMData.livePayload.fuel), fuel) : prev));
}, [WASMData.livePayload.fuel]);
return ( return (
<> <>
@@ -80,24 +83,8 @@ const StationEntryPax: FC<StationEntryProps> = ({ WASMData, loadingState, gsxAct
className={`w-1/2 rounded-lg border border-white bg-zinc-700 px-3 py-2 text-right`} className={`w-1/2 rounded-lg border border-white bg-zinc-700 px-3 py-2 text-right`}
value={fuel} value={fuel}
onChange={(value) => handleInput(value, WASMData.limits.maxFuel, setFuel)} onChange={(value) => handleInput(value, WASMData.limits.maxFuel, setFuel)}
disabled={loadingState !== 'preview' || gsxActive} disabled={loadingState !== 'preview' || gsxFuelActive}
/> />
<button
className="middle none center rounded-lg bg-green-600 px-6 py-3 font-sans text-xs font-bold uppercase text-white shadow-md shadow-green-500/20 transition-all hover:shadow-lg hover:shadow-green-500/40 focus:opacity-[0.85] focus:shadow-none active:opacity-[0.85] active:shadow-none disabled:pointer-events-none disabled:opacity-50 disabled:shadow-none"
data-ripple-light="true"
onClick={() => {
SimVar.SetSimVarValue(
'L:MD11_EFB_PAYLOAD_FUEL',
'lbs',
WASMData.userData.isImperial ? fuel : fuel * 2.20462262185
);
SimVar.SetSimVarValue('L:MD11_EFB_READ_READY', 'bool', true);
setFuelEnabled(WASMData.livePayload.fuel === fuel);
}}
disabled={loadingState !== 'preview' || !fuelEnabled || gsxActive}
>
Load Fuel
</button>
</div> </div>
</div> </div>
</div> </div>
@@ -1,7 +1,7 @@
import { FC, useEffect, useState } from 'react'; import { FC, useEffect, useState } from 'react';
import { WASMDataF } from '../../types/WASMData'; import { WASMDataF } from '../../types/WASMData';
import { LoadingState } from '../../types/general'; import { LoadingState } from '../../types/general';
import { CoherentCallZFWEntry, inRangeOf, loadAircraft, unloadAircraft } from '../../utils/utils'; import { CoherentCallZFWEntry, loadAircraft, unloadAircraft } from '../../utils/utils';
import CGSelect from '../CGSelect/CGSelect'; import CGSelect from '../CGSelect/CGSelect';
import ActionBar from '../actionbar/ActionBar'; import ActionBar from '../actionbar/ActionBar';
import Input from '../input/Input'; import Input from '../input/Input';
@@ -10,14 +10,14 @@ interface ZFWEntryProps {
WASMData: WASMDataF; WASMData: WASMDataF;
loadingState: LoadingState; loadingState: LoadingState;
gsxActive: boolean; gsxActive: boolean;
gsxFuelActive: boolean;
setLoadingState: (newState: LoadingState) => void; setLoadingState: (newState: LoadingState) => void;
} }
const ZFWEntryF: FC<ZFWEntryProps> = ({ WASMData, loadingState, gsxActive, setLoadingState }) => { const ZFWEntryF: FC<ZFWEntryProps> = ({ WASMData, loadingState, gsxActive, gsxFuelActive, setLoadingState }) => {
const [CGTarget, setCGTarget] = useState(WASMData.targetPayload.CGTarget); const [CGTarget, setCGTarget] = useState(WASMData.targetPayload.CGTarget);
const [fuel, setFuel] = useState(Math.round(WASMData.livePayload.fuel)); const [fuel, setFuel] = useState(Math.round(WASMData.targetPayload.fuel));
const [ZFWTarget, setZFWTarget] = useState(Math.round(WASMData.targetPayload.total)); const [ZFWTarget, setZFWTarget] = useState(Math.round(WASMData.targetPayload.total));
const [fuelEnabled, setFuelEnabled] = useState(true);
const ZFW = () => { const ZFW = () => {
if (loadingState !== 'loaded' && !gsxActive) return ZFWTarget; if (loadingState !== 'loaded' && !gsxActive) return ZFWTarget;
@@ -55,12 +55,13 @@ const ZFWEntryF: FC<ZFWEntryProps> = ({ WASMData, loadingState, gsxActive, setLo
const converted = parseInt(input); const converted = parseInt(input);
if (converted) { if (converted) {
if (converted < 0) setZFWTarget(Math.round(WASMData.targetPayload.empty + WASMData.targetPayload.crew)); if (converted <= 0) setZFWTarget(Math.round(WASMData.targetPayload.empty + WASMData.targetPayload.crew));
else if (converted > WASMData.limits.maxZFW) setZFWTarget(WASMData.limits.maxZFW); else if (converted > WASMData.limits.maxZFW) setZFWTarget(WASMData.limits.maxZFW);
else setZFWTarget(converted); else setZFWTarget(converted);
} }
}; };
const handleBlur = (input: string) => {
const handleBlurZFW = (input: string) => {
const minZFW = Math.round(WASMData.targetPayload.empty + WASMData.targetPayload.crew); const minZFW = Math.round(WASMData.targetPayload.empty + WASMData.targetPayload.crew);
if (!input) { if (!input) {
@@ -74,10 +75,13 @@ const ZFWEntryF: FC<ZFWEntryProps> = ({ WASMData, loadingState, gsxActive, setLo
else if (converted > WASMData.limits.maxZFW) setZFWTarget(WASMData.limits.maxZFW); else if (converted > WASMData.limits.maxZFW) setZFWTarget(WASMData.limits.maxZFW);
else setZFWTarget(converted); else setZFWTarget(converted);
} }
updateData(converted);
}; };
const updateData = () => {
CoherentCallZFWEntry(ZFWTarget, CGTarget, fuel);
};
useEffect(() => updateData(), [ZFWTarget, CGTarget, fuel]);
useEffect( useEffect(
() => () =>
setFuel((prev) => { setFuel((prev) => {
@@ -86,13 +90,6 @@ const ZFWEntryF: FC<ZFWEntryProps> = ({ WASMData, loadingState, gsxActive, setLo
}), }),
[WASMData.userData.isER] [WASMData.userData.isER]
); );
useEffect(() => {
setFuelEnabled((prev) => (!prev ? inRangeOf(Math.round(WASMData.livePayload.fuel), fuel) : prev));
}, [WASMData.livePayload.fuel]);
const updateData = (_ZFWTarget?: number, _CGTarget?: number) => {
CoherentCallZFWEntry(_ZFWTarget ?? ZFWTarget, _CGTarget ?? CGTarget);
};
return ( return (
<> <>
@@ -106,24 +103,8 @@ const ZFWEntryF: FC<ZFWEntryProps> = ({ WASMData, loadingState, gsxActive, setLo
className={`w-1/2 rounded-lg border border-white bg-zinc-700 px-3 py-2 text-right`} className={`w-1/2 rounded-lg border border-white bg-zinc-700 px-3 py-2 text-right`}
value={fuel} value={fuel}
onChange={(value) => handleInput(value, WASMData.limits.maxFuel, setFuel)} onChange={(value) => handleInput(value, WASMData.limits.maxFuel, setFuel)}
disabled={loadingState !== 'preview' || gsxActive} disabled={loadingState !== 'preview' || gsxFuelActive}
/> />
<button
className="middle none center rounded-lg bg-green-600 px-6 py-3 font-sans text-xs font-bold uppercase text-white shadow-md shadow-green-500/20 transition-all hover:shadow-lg hover:shadow-green-500/40 focus:opacity-[0.85] focus:shadow-none active:opacity-[0.85] active:shadow-none disabled:pointer-events-none disabled:opacity-50 disabled:shadow-none"
data-ripple-light="true"
onClick={() => {
SimVar.SetSimVarValue(
'L:MD11_EFB_PAYLOAD_FUEL',
'lbs',
WASMData.userData.isImperial ? fuel : fuel * 2.20462262185
);
SimVar.SetSimVarValue('L:MD11_EFB_READ_READY', 'bool', true);
setFuelEnabled(WASMData.livePayload.fuel === fuel);
}}
disabled={loadingState !== 'preview' || !fuelEnabled || gsxActive}
>
Load Fuel
</button>
</div> </div>
</div> </div>
</div> </div>
@@ -138,7 +119,7 @@ const ZFWEntryF: FC<ZFWEntryProps> = ({ WASMData, loadingState, gsxActive, setLo
className="w-1/2 rounded-lg border border-white bg-zinc-700 px-3 py-2 text-right focus:border-blue-600 focus:ring-blue-600" className="w-1/2 rounded-lg border border-white bg-zinc-700 px-3 py-2 text-right focus:border-blue-600 focus:ring-blue-600"
value={ZFWTarget} value={ZFWTarget}
onChange={(value) => handleInputZFW(value)} onChange={(value) => handleInputZFW(value)}
onBlur={(value) => handleBlur(value)} onBlur={(value) => handleBlurZFW(value)}
disabled={loadingState !== 'preview' || gsxActive} disabled={loadingState !== 'preview' || gsxActive}
/> />
</div> </div>
@@ -156,14 +137,12 @@ const ZFWEntryF: FC<ZFWEntryProps> = ({ WASMData, loadingState, gsxActive, setLo
increase={() => increase={() =>
setCGTarget((prev) => { setCGTarget((prev) => {
const _new = prev + 0.1; const _new = prev + 0.1;
updateData(undefined, _new);
return _new; return _new;
}) })
} }
decrease={() => decrease={() =>
setCGTarget((prev) => { setCGTarget((prev) => {
const _new = prev - 0.1; const _new = prev - 0.1;
updateData(undefined, _new);
return _new; return _new;
}) })
} }
@@ -1,7 +1,7 @@
import { FC, useEffect, useState } from 'react'; import { FC, useEffect, useState } from 'react';
import { WASMDataPax } from '../../types/WASMData'; import { WASMDataPax } from '../../types/WASMData';
import { LoadingState } from '../../types/general'; import { LoadingState } from '../../types/general';
import { CoherentCallZFWEntry, inRangeOf, loadAircraft, unloadAircraft } from '../../utils/utils'; import { CoherentCallZFWEntry, loadAircraft, unloadAircraft } from '../../utils/utils';
import CGSelect from '../CGSelect/CGSelect'; import CGSelect from '../CGSelect/CGSelect';
import ActionBar from '../actionbar/ActionBar'; import ActionBar from '../actionbar/ActionBar';
import Input from '../input/Input'; import Input from '../input/Input';
@@ -10,14 +10,14 @@ interface ZFWEntryProps {
WASMData: WASMDataPax; WASMData: WASMDataPax;
loadingState: LoadingState; loadingState: LoadingState;
gsxActive: boolean; gsxActive: boolean;
gsxFuelActive: boolean;
setLoadingState: (newState: LoadingState) => void; setLoadingState: (newState: LoadingState) => void;
} }
const ZFWEntryPax: FC<ZFWEntryProps> = ({ WASMData, loadingState, gsxActive, setLoadingState }) => { const ZFWEntryPax: FC<ZFWEntryProps> = ({ WASMData, loadingState, gsxActive, gsxFuelActive, setLoadingState }) => {
const [CGTarget, setCGTarget] = useState(WASMData.targetPayload.CGTarget); const [CGTarget, setCGTarget] = useState(WASMData.targetPayload.CGTarget);
const [fuel, setFuel] = useState(Math.round(WASMData.livePayload.fuel)); const [fuel, setFuel] = useState(Math.round(WASMData.targetPayload.fuel));
const [ZFWTarget, setZFWTarget] = useState(Math.round(WASMData.targetPayload.total)); const [ZFWTarget, setZFWTarget] = useState(Math.round(WASMData.targetPayload.total));
const [fuelEnabled, setFuelEnabled] = useState(true);
const ZFW = () => { const ZFW = () => {
if (loadingState !== 'loaded' && !gsxActive) return ZFWTarget; if (loadingState !== 'loaded' && !gsxActive) return ZFWTarget;
@@ -60,7 +60,8 @@ const ZFWEntryPax: FC<ZFWEntryProps> = ({ WASMData, loadingState, gsxActive, set
else setZFWTarget(converted); else setZFWTarget(converted);
} }
}; };
const handleBlur = (input: string) => {
const handleBlurZFW = (input: string) => {
const minZFW = Math.round(WASMData.targetPayload.empty + WASMData.targetPayload.crew); const minZFW = Math.round(WASMData.targetPayload.empty + WASMData.targetPayload.crew);
if (!input) { if (!input) {
@@ -74,10 +75,13 @@ const ZFWEntryPax: FC<ZFWEntryProps> = ({ WASMData, loadingState, gsxActive, set
else if (converted > WASMData.limits.maxZFW) setZFWTarget(WASMData.limits.maxZFW); else if (converted > WASMData.limits.maxZFW) setZFWTarget(WASMData.limits.maxZFW);
else setZFWTarget(converted); else setZFWTarget(converted);
} }
updateData(converted);
}; };
const updateData = () => {
CoherentCallZFWEntry(ZFWTarget, CGTarget, fuel);
};
useEffect(() => updateData(), [ZFWTarget, CGTarget, fuel]);
useEffect( useEffect(
() => () =>
setFuel((prev) => { setFuel((prev) => {
@@ -86,13 +90,6 @@ const ZFWEntryPax: FC<ZFWEntryProps> = ({ WASMData, loadingState, gsxActive, set
}), }),
[WASMData.userData.isER] [WASMData.userData.isER]
); );
useEffect(() => {
setFuelEnabled((prev) => (!prev ? inRangeOf(Math.round(WASMData.livePayload.fuel), fuel) : prev));
}, [WASMData.livePayload.fuel]);
const updateData = (_ZFWTarget?: number, _CGTarget?: number) => {
CoherentCallZFWEntry(_ZFWTarget ?? ZFWTarget, _CGTarget ?? CGTarget);
};
return ( return (
<> <>
@@ -106,24 +103,8 @@ const ZFWEntryPax: FC<ZFWEntryProps> = ({ WASMData, loadingState, gsxActive, set
className={`w-1/2 rounded-lg border border-white bg-zinc-700 px-3 py-2 text-right`} className={`w-1/2 rounded-lg border border-white bg-zinc-700 px-3 py-2 text-right`}
value={fuel} value={fuel}
onChange={(value) => handleInput(value, WASMData.limits.maxFuel, setFuel)} onChange={(value) => handleInput(value, WASMData.limits.maxFuel, setFuel)}
disabled={loadingState !== 'preview' || gsxActive} disabled={loadingState !== 'preview' || gsxFuelActive}
/> />
<button
className="middle none center rounded-lg bg-green-600 px-6 py-3 font-sans text-xs font-bold uppercase text-white shadow-md shadow-green-500/20 transition-all hover:shadow-lg hover:shadow-green-500/40 focus:opacity-[0.85] focus:shadow-none active:opacity-[0.85] active:shadow-none disabled:pointer-events-none disabled:opacity-50 disabled:shadow-none"
data-ripple-light="true"
onClick={() => {
SimVar.SetSimVarValue(
'L:MD11_EFB_PAYLOAD_FUEL',
'lbs',
WASMData.userData.isImperial ? fuel : fuel * 2.20462262185
);
SimVar.SetSimVarValue('L:MD11_EFB_READ_READY', 'bool', true);
setFuelEnabled(WASMData.livePayload.fuel === fuel);
}}
disabled={loadingState !== 'preview' || !fuelEnabled || gsxActive}
>
Load Fuel
</button>
</div> </div>
</div> </div>
</div> </div>
@@ -138,7 +119,7 @@ const ZFWEntryPax: FC<ZFWEntryProps> = ({ WASMData, loadingState, gsxActive, set
className="w-1/2 rounded-lg border border-white bg-zinc-700 px-3 py-2 text-right focus:border-blue-600 focus:ring-blue-600" className="w-1/2 rounded-lg border border-white bg-zinc-700 px-3 py-2 text-right focus:border-blue-600 focus:ring-blue-600"
value={ZFWTarget} value={ZFWTarget}
onChange={(value) => handleInputZFW(value)} onChange={(value) => handleInputZFW(value)}
onBlur={(value) => handleBlur(value)} onBlur={(value) => handleBlurZFW(value)}
disabled={loadingState !== 'preview' || gsxActive} disabled={loadingState !== 'preview' || gsxActive}
/> />
</div> </div>
@@ -156,14 +137,12 @@ const ZFWEntryPax: FC<ZFWEntryProps> = ({ WASMData, loadingState, gsxActive, set
increase={() => increase={() =>
setCGTarget((prev) => { setCGTarget((prev) => {
const _new = prev + 0.1; const _new = prev + 0.1;
updateData(undefined, _new);
return _new; return _new;
}) })
} }
decrease={() => decrease={() =>
setCGTarget((prev) => { setCGTarget((prev) => {
const _new = prev - 0.1; const _new = prev - 0.1;
updateData(undefined, _new);
return _new; return _new;
}) })
} }
+10 -6
View File
@@ -5,6 +5,7 @@ interface WASMData {
sbPlanned: { sbPlanned: {
ZFW: number; ZFW: number;
GW: number; GW: number;
fuel: number;
}; };
loaded: boolean; loaded: boolean;
} }
@@ -26,6 +27,7 @@ interface TargetPayload {
ZFWCG: number; ZFWCG: number;
TOCG: number; TOCG: number;
total: number; total: number;
fuel: number;
} }
interface TargetPayloadPax extends TargetPayload { interface TargetPayloadPax extends TargetPayload {
@@ -39,9 +41,7 @@ interface TargetPayloadPax extends TargetPayload {
rearCargo: number; rearCargo: number;
} }
interface LivePayloadPax extends TargetPayloadPax { type LivePayloadPax = TargetPayloadPax;
fuel: number;
}
interface TargetPayloadF extends TargetPayload { interface TargetPayloadF extends TargetPayload {
empty: number; empty: number;
@@ -54,13 +54,12 @@ interface TargetPayloadF extends TargetPayload {
lowerRear: number; lowerRear: number;
} }
interface LivePayloadF extends TargetPayloadF { type LivePayloadF = TargetPayloadF;
fuel: number;
}
interface GSX { interface GSX {
couatlStarted: boolean; couatlStarted: boolean;
loadingState: GSXLoadingState; loadingState: GSXLoadingState;
fuelingState: GSXFuelingState;
} }
interface Limits { interface Limits {
@@ -109,3 +108,8 @@ export enum GSXLoadingState {
DEBOARDING = 3, DEBOARDING = 3,
DEBOARDED = 4, DEBOARDED = 4,
} }
export enum GSXFuelingState {
IDLE = 0,
FUELING = 1,
}
+12 -5
View File
@@ -25,7 +25,7 @@ export const inRangeOf = (value: number, target: number, tolerance: number = 10)
return Math.abs(value - target) < tolerance; return Math.abs(value - target) < tolerance;
}; };
export const CoherentCallZFWEntry = (ZFWTarget: number, CGTarget: number) => { export const CoherentCallZFWEntry = (ZFWTarget: number, CGTarget: number, fuelTarget: number) => {
Coherent.call( Coherent.call(
COHERENT_COMM_BUS_WASM_CALL, COHERENT_COMM_BUS_WASM_CALL,
CommBusEvent.UPDATE_TARGET, CommBusEvent.UPDATE_TARGET,
@@ -33,6 +33,7 @@ export const CoherentCallZFWEntry = (ZFWTarget: number, CGTarget: number) => {
mode: CallMode.ZFW_SET, mode: CallMode.ZFW_SET,
ZFWTarget: ZFWTarget, ZFWTarget: ZFWTarget,
CGTarget: CGTarget, CGTarget: CGTarget,
fuelTarget: fuelTarget,
}) })
); );
}; };
@@ -43,7 +44,8 @@ export const CoherentCallStationEntryPax = (
economy1: number, economy1: number,
economy2: number, economy2: number,
forwardCargo: number, forwardCargo: number,
rearCargo: number rearCargo: number,
fuelTarget: number
) => { ) => {
Coherent.call( Coherent.call(
COHERENT_COMM_BUS_WASM_CALL, COHERENT_COMM_BUS_WASM_CALL,
@@ -56,6 +58,7 @@ export const CoherentCallStationEntryPax = (
economy2, economy2,
forwardCargo, forwardCargo,
rearCargo, rearCargo,
fuelTarget,
}) })
); );
}; };
@@ -66,7 +69,8 @@ export const CoherentCallStationEntryF = (
upper3: number, upper3: number,
upper4: number, upper4: number,
lowerForward: number, lowerForward: number,
lowerRear: number lowerRear: number,
fuelTarget: number
) => { ) => {
Coherent.call( Coherent.call(
COHERENT_COMM_BUS_WASM_CALL, COHERENT_COMM_BUS_WASM_CALL,
@@ -79,11 +83,12 @@ export const CoherentCallStationEntryF = (
upper4, upper4,
lowerForward, lowerForward,
lowerRear, lowerRear,
fuelTarget,
}) })
); );
}; };
export const CoherentCallSBEntryPax = (CGTarget: number, SBPlan?: SimBrief) => { export const CoherentCallSBEntryPax = (CGTarget: number, fuel: number, SBPlan?: SimBrief) => {
Coherent.call( Coherent.call(
COHERENT_COMM_BUS_WASM_CALL, COHERENT_COMM_BUS_WASM_CALL,
CommBusEvent.UPDATE_TARGET, CommBusEvent.UPDATE_TARGET,
@@ -94,11 +99,12 @@ export const CoherentCallSBEntryPax = (CGTarget: number, SBPlan?: SimBrief) => {
CGTarget: CGTarget, CGTarget: CGTarget,
plannedZFW: SBPlan?.plannedZFW, plannedZFW: SBPlan?.plannedZFW,
plannedGW: SBPlan?.plannedGW, plannedGW: SBPlan?.plannedGW,
fuel: fuel,
}) })
); );
}; };
export const CoherentCallSBEntryF = (CGTarget: number, SBPlan?: SimBrief) => { export const CoherentCallSBEntryF = (CGTarget: number, fuel: number, SBPlan?: SimBrief) => {
Coherent.call( Coherent.call(
COHERENT_COMM_BUS_WASM_CALL, COHERENT_COMM_BUS_WASM_CALL,
CommBusEvent.UPDATE_TARGET, CommBusEvent.UPDATE_TARGET,
@@ -108,6 +114,7 @@ export const CoherentCallSBEntryF = (CGTarget: number, SBPlan?: SimBrief) => {
CGTarget: CGTarget, CGTarget: CGTarget,
plannedZFW: SBPlan?.plannedZFW, plannedZFW: SBPlan?.plannedZFW,
plannedGW: SBPlan?.plannedGW, plannedGW: SBPlan?.plannedGW,
fuel: SBPlan?.fuel,
}) })
); );
}; };
File diff suppressed because it is too large Load Diff
-306
View File
@@ -1,306 +0,0 @@
#include "freighter.h"
// ZFW Entry
void distribute(fPayloadData_t* const targetPayload, const FuelData_t* const fuel, const double ZFWTarget, const UserData_t* const userData) {
// Find payload, num pax and extra cargo
double payload = ZFWTarget - targetPayload->empty - targetPayload->pilot - targetPayload->firstOfficer - targetPayload->engineer -
targetPayload->leftAux - targetPayload->rightAux;
unsigned int cargo = round(payload);
distribute(targetPayload, fuel, cargo, userData);
}
// SimBrief Entry
void distribute(fPayloadData_t* const targetPayload, const FuelData_t* const fuel, unsigned int cargo, const UserData_t* const userData) {
// Clear
targetPayload->stations.upper1 = targetPayload->stations.upper2 = targetPayload->stations.upper3 = targetPayload->stations.upper4 =
targetPayload->stations.total = 0;
targetPayload->lowerForward = targetPayload->lowerRear = 0;
unsigned short _cargo = 0;
unsigned int count = MAX_UPPER_CARGO(userData->isImperial) * 4 + MAX_FRONT_CARGO(userData->isImperial) + MAX_REAR_CARGO(userData->isImperial, userData->isER);
// Initial distributiob
while (cargo > 0 && count > 0) {
if (cargo >= 6) {
if (targetPayload->stations.upper1 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper1++;
_cargo++;
}
if (targetPayload->stations.upper2 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper2++;
_cargo++;
}
if (targetPayload->stations.upper3 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper3++;
_cargo++;
}
if (targetPayload->stations.upper4 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper4++;
_cargo++;
}
if (targetPayload->lowerForward < MAX_FRONT_CARGO(userData->isImperial)) {
targetPayload->lowerForward++;
_cargo++;
}
if (targetPayload->lowerRear < MAX_REAR_CARGO(userData->isImperial, userData->isER)) {
targetPayload->lowerRear++;
_cargo++;
}
} else if (cargo == 5) {
if (targetPayload->stations.upper1 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper1++;
_cargo++;
}
if (targetPayload->stations.upper2 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper2++;
_cargo++;
}
if (targetPayload->stations.upper3 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper3++;
_cargo++;
}
if (targetPayload->stations.upper4 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper4++;
_cargo++;
}
if (targetPayload->lowerForward < MAX_FRONT_CARGO(userData->isImperial)) {
targetPayload->lowerForward++;
_cargo++;
}
}
else if (cargo == 4) {
if (targetPayload->stations.upper1 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper1++;
_cargo++;
}
if (targetPayload->stations.upper2 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper2++;
_cargo++;
}
if (targetPayload->stations.upper3 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper3++;
_cargo++;
}
if (targetPayload->stations.upper4 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper4++;
_cargo++;
}
}
else if (cargo == 3) {
if (targetPayload->stations.upper1 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper1++;
_cargo++;
}
if (targetPayload->stations.upper2 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper2++;
_cargo++;
}
if (targetPayload->stations.upper3 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper3++;
_cargo++;
}
}
else if (cargo == 2) {
if (targetPayload->stations.upper1 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper1++;
_cargo++;
}
if (targetPayload->stations.upper2 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper2++;
_cargo++;
}
}
else if (cargo == 1) {
if (targetPayload->stations.upper1 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper1++;
_cargo++;
}
}
cargo -= _cargo;
targetPayload->stations.total += _cargo;
_cargo = 0;
count--;
}
// Refinement
count = MAX_UPPER_CARGO(userData->isImperial) * 4 + MAX_FRONT_CARGO(userData->isImperial) + MAX_REAR_CARGO(userData->isImperial, userData->isER);
while (count > 0) {
generatePayload(targetPayload, userData->isImperial);
calculateCGs(targetPayload, fuel, &targetPayload->ZFWCG, &targetPayload->TOCG, userData->isImperial);
// in front of target
if (targetPayload->ZFWCG < targetPayload->CGTarget - CG_TOLERANCE) {
if (targetPayload->stations.upper1 > 0) {
targetPayload->stations.upper1--;
}
else if (targetPayload->stations.upper2 > 0) {
targetPayload->stations.upper2--;
}
else if (targetPayload->stations.upper3 > 0) {
targetPayload->stations.upper3--;
}
else {
break;
}
if (targetPayload->stations.upper4 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper4++;
}
else if (targetPayload->stations.upper3 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper3++;
}
else if (targetPayload->stations.upper2 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper2++;
}
else {
targetPayload->stations.upper1++;
}
}
// behind target
else if (targetPayload->ZFWCG > targetPayload->CGTarget + CG_TOLERANCE) {
if (targetPayload->stations.upper4 > 0) {
targetPayload->stations.upper4--;
}
else if (targetPayload->stations.upper3 > 0) {
targetPayload->stations.upper3--;
}
else if (targetPayload->stations.upper2 > 0) {
targetPayload->stations.upper2--;
}
else {
break;
}
if (targetPayload->stations.upper1 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper1++;
}
else if (targetPayload->stations.upper2 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper2++;
}
else if (targetPayload->stations.upper3 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper3++;
}
else {
targetPayload->stations.upper4++;
}
}
else {
break;
}
count--;
}
// Refinement cargo
count = MAX_FRONT_CARGO(userData->isImperial) + MAX_REAR_CARGO(userData->isImperial, userData->isER);
while (count > 0) {
generatePayload(targetPayload, userData->isImperial);
calculateCGs(targetPayload, fuel, &targetPayload->ZFWCG, &targetPayload->TOCG, userData->isImperial);
// in front of target
if (targetPayload->ZFWCG < targetPayload->CGTarget - CG_TOLERANCE) {
if (targetPayload->lowerForward > 0 && targetPayload->lowerRear < MAX_REAR_CARGO(userData->isImperial, userData->isER)) {
targetPayload->lowerForward--;
targetPayload->lowerRear++;
}
else {
break;
}
}
// behind target
else if (targetPayload->ZFWCG > targetPayload->CGTarget + CG_TOLERANCE) {
if (targetPayload->lowerRear > 0 && targetPayload->lowerForward < MAX_FRONT_CARGO(userData->isImperial)) {
targetPayload->lowerRear--;
targetPayload->lowerForward++;
}
else {
break;
}
}
else {
break;
}
count--;
}
}
// Updates pax stations with their respective weights
// Used internally and used for Station Entry (pax only, cargo is set directly)
void generatePayload(fPayloadData_t* const targetPayload, const bool isImperial) {
targetPayload->upper1Left = targetPayload->upper1Right = (targetPayload->stations.upper1 / 2.0);
targetPayload->upper2Left = targetPayload->upper2Right = (targetPayload->stations.upper2 / 2.0);
targetPayload->upper3Left = targetPayload->upper3Right = (targetPayload->stations.upper3 / 2.0);
targetPayload->upper4Left = targetPayload->upper4Right = (targetPayload->stations.upper4 / 2.0);
targetPayload->total = targetPayload->empty + targetPayload->pilot + targetPayload->firstOfficer + targetPayload->engineer + targetPayload->upper1Left +
targetPayload->upper1Right + targetPayload->upper2Left + targetPayload->upper2Right + targetPayload->upper3Left +
targetPayload->upper3Right + targetPayload->upper4Left + targetPayload->upper4Right + targetPayload->lowerForward +
targetPayload->lowerRear + targetPayload->leftAux + targetPayload->rightAux;
}
// Normalise to Pounds
// MANDATORY BEFORE SETTING WEIGHTS
// USE ON COPY OF GLOBAL STATE ONLY
void normalisePayload(fPayloadData_t* const targetPayload, const bool isImperial) {
targetPayload->empty = TO_POUNDS(isImperial, targetPayload->empty);
targetPayload->pilot = TO_POUNDS(isImperial, targetPayload->pilot);
targetPayload->firstOfficer = TO_POUNDS(isImperial, targetPayload->firstOfficer);
targetPayload->engineer = TO_POUNDS(isImperial, targetPayload->engineer);
targetPayload->upper1Left = TO_POUNDS(isImperial, targetPayload->upper1Left);
targetPayload->upper1Right = TO_POUNDS(isImperial, targetPayload->upper1Right);
targetPayload->upper2Left = TO_POUNDS(isImperial, targetPayload->upper2Left);
targetPayload->upper2Right = TO_POUNDS(isImperial, targetPayload->upper2Right);
targetPayload->upper3Left = TO_POUNDS(isImperial, targetPayload->upper3Left);
targetPayload->upper3Right = TO_POUNDS(isImperial, targetPayload->upper3Right);
targetPayload->upper4Left = TO_POUNDS(isImperial, targetPayload->upper4Left);
targetPayload->upper4Right = TO_POUNDS(isImperial, targetPayload->upper4Right);
targetPayload->lowerForward = TO_POUNDS(isImperial, targetPayload->lowerForward);
targetPayload->lowerRear = TO_POUNDS(isImperial, targetPayload->lowerRear);
targetPayload->leftAux = TO_POUNDS(isImperial, targetPayload->leftAux);
targetPayload->rightAux = TO_POUNDS(isImperial, targetPayload->rightAux);
}
void calculateCGs(const fPayloadData_t* const targetPayload, const FuelData_t* const fuel, double* const ZFWCG, double* const TOCG, const bool isImperial) {
fPayloadData_t localPayload = {};
memcpy(&localPayload, targetPayload, sizeof(localPayload));
normalisePayload(&localPayload, isImperial);
double totalMoment = localPayload.empty * ARM_EMPTY + localPayload.pilot * ARM_PILOT + localPayload.firstOfficer * ARM_FIRST_OFFICER +
localPayload.engineer * ARM_ENGINEER + localPayload.upper1Left * ARM_F_UPPER1_LEFT + localPayload.upper1Right * ARM_F_UPPER1_RIGHT +
localPayload.upper2Left * ARM_F_UPPER2_LEFT + localPayload.upper2Right * ARM_F_UPPER2_RIGHT + localPayload.upper3Left * ARM_F_UPPER3_LEFT +
localPayload.upper3Right * ARM_F_UPPER3_RIGHT + localPayload.upper4Left * ARM_F_UPPER4_LEFT + localPayload.upper4Right * ARM_F_UPPER4_RIGHT +
localPayload.lowerForward * ARM_FORWARD_CARGO + localPayload.lowerRear * ARM_REAR_CARGO + localPayload.leftAux * ARM_LEFT_AUX +
localPayload.rightAux * ARM_RIGHT_AUX;
double totalWeight = localPayload.empty + localPayload.pilot + localPayload.firstOfficer + localPayload.engineer + localPayload.upper1Left +
localPayload.upper1Right + localPayload.upper2Left + localPayload.upper2Right + localPayload.upper3Left + localPayload.upper3Right +
localPayload.upper4Left + localPayload.upper4Right + localPayload.lowerForward + localPayload.lowerRear + localPayload.leftAux +
localPayload.rightAux;
*ZFWCG = TO_PERCENT_MAC(totalMoment / totalWeight);
totalMoment += fuel->main1 * ARM_MAIN1 + fuel->main3 * ARM_MAIN3 + fuel->main2 * ARM_MAIN2 + fuel->upperAux * ARM_UPPER_AUX +
fuel->lowerAux * ARM_LOWER_AUX + fuel->main1Tip * ARM_MAIN1_TIP + fuel->main3Tip * ARM_MAIN3_TIP +
fuel->tail * ARM_TAIL + fuel->forwardAux1 * ARM_FORWARD_AUX1 + fuel->forwardAux2 * ARM_FORWARD_AUX2;
totalWeight += fuel->total;
*TOCG = TO_PERCENT_MAC(totalMoment / totalWeight);
}
void load(const fPayloadData_t* const targetPayload, const HANDLE simConnect, const bool isImperial) {
fPayloadData_t localPayload = {};
memcpy(&localPayload, targetPayload, sizeof(localPayload));
normalisePayload(&localPayload, isImperial);
SimConnect_SetDataOnSimObject(simConnect, DATA_DEFINITION_PAYLOAD_F, SIMCONNECT_OBJECT_ID_USER, 0, 0, sizeof(fPayloadDataSet_t), &localPayload);
}
void unloadF(const HANDLE simConnect, const bool isER) {
fPayloadData_t localPayload = {};
localPayload.leftAux = localPayload.rightAux = isER ? AUX_WEIGHT(true) : 0;
localPayload.pilot = localPayload.firstOfficer = localPayload.engineer = PILOT_WEIGHT(true);
SimConnect_SetDataOnSimObject(simConnect, DATA_DEFINITION_PAYLOAD_F, SIMCONNECT_OBJECT_ID_USER, 0, 0, sizeof(fPayloadDataSet_t), &localPayload);
}
-111
View File
@@ -1,111 +0,0 @@
#pragma once
#ifndef __INTELLISENSE__
# define MODULE_EXPORT __attribute__( ( visibility( "default" ) ) )
# define MODULE_WASM_MODNAME(mod) __attribute__((import_module(mod)))
#else
# define MODULE_EXPORT
# define MODULE_WASM_MODNAME(mod)
# define __attribute__(x)
# define __restrict__
#endif
/********************************* Headers *********************************/
// MSFS headers
#include <MSFS/MSFS_WindowsTypes.h>
#include <SimConnect.h>
// C headers
#include <math.h>
// C++ headers
#include <algorithm>
// Own headers
#include "shared.h"
/******************************** Constants ********************************/
//PMC pallet due to 104in door
#define MAX_UPPER_CARGO(IS_IMPERIAL) ((IS_IMPERIAL) ? (6.5 * 15000.0) : (6.5 * 6804.0))
// Max ZFW
#define MAX_F_ZFW(IS_IMPERIAL) ((IS_IMPERIAL) ? (451300) : (204706))
// Arms
#define ARM_F_UPPER1_LEFT 660
#define ARM_F_UPPER1_RIGHT 660
#define ARM_F_UPPER2_LEFT 240
#define ARM_F_UPPER2_RIGHT 240
#define ARM_F_UPPER3_LEFT -240
#define ARM_F_UPPER3_RIGHT -240
#define ARM_F_UPPER4_LEFT -600
#define ARM_F_UPPER4_RIGHT -600
/***************************** Data structures *****************************/
typedef struct {
// SimConnect mapped
double pilot;
double firstOfficer;
double engineer;
double upper1Left;
double upper1Right;
double upper2Left;
double upper2Right;
double upper3Left;
double upper3Right;
double upper4Left;
double upper4Right;
double lowerForward;
double lowerRear;
double leftAux;
double rightAux;
// Additional properties
double empty;
double total;
double CGTarget;
double ZFWCG;
double TOCG;
struct stations {
unsigned int upper1;
unsigned int upper2;
unsigned int upper3;
unsigned int upper4;
unsigned int total;
} stations;
struct sbPlanned {
double ZFW;
double GW;
unsigned int cargo;
} sbPlanned;
} fPayloadData_t;
typedef struct {
// SimConnect mapped
double pilot;
double firstOfficer;
double engineer;
double upper1Left;
double upper1Right;
double upper2Left;
double upper2Right;
double upper3Left;
double upper3Right;
double upper4Left;
double upper4Right;
double lowerForward;
double lowerRear;
double leftAux;
double rightAux;
} fPayloadDataSet_t;
/******************************** Functions ********************************/
// ZFW Entry
void distribute(fPayloadData_t* const targetPayload, const FuelData_t* const fuel, const double ZFWTarget, const UserData_t* const userData);
// SimBrief Entry
void distribute(fPayloadData_t* const targetPayload, const FuelData_t* const fuel, unsigned int cargo, const UserData_t* const userData);
// Updates pax stations with their respective weights
// Used internally and used for Station Entry (pax only, cargo is ste directly)
// STATION WEIGHTS ARE NOT NORMALISED TO POUNDS
void generatePayload(fPayloadData_t* const targetPayload, const bool isImperial);
// Normalise to Pounds
// For Station Entry: CALL AFTER `generatePayload`
void normalisePayload(fPayloadData_t* const targetPayload, const bool isImperial);
void calculateCGs(const fPayloadData_t* const targetPayload, const FuelData_t* const fuel, double* const ZFWCG, double* const TOCG, const bool isImperial);
void load(const fPayloadData_t* const targetPayload, const HANDLE simConnect, const bool isImperial);
void unloadF(const HANDLE simConnect, const bool isER);
@@ -0,0 +1,119 @@
#pragma once
#ifndef __INTELLISENSE__
#define MODULE_EXPORT __attribute__((visibility("default")))
#define MODULE_WASM_MODNAME(mod) __attribute__((import_module(mod)))
#else
#define MODULE_EXPORT
#define MODULE_WASM_MODNAME(mod)
#define __attribute__(x)
#define __restrict__
#endif
/********************************* Headers *********************************/
// MSFS headers
#include <MSFS/MSFS_WindowsTypes.h>
#include <SimConnect.h>
// C headers
#include <math.h>
// C++ headers
#include <algorithm>
// Own headers
#include "fuel.h"
#include "log.h"
#include "shared.h"
/******************************** Constants ********************************/
// PMC pallet due to 104in door
#define MAX_UPPER_CARGO(IS_IMPERIAL) ((IS_IMPERIAL) ? (6.5 * 15000.0) : (6.5 * 6804.0))
// Max ZFW
#define MAX_F_ZFW(IS_IMPERIAL) ((IS_IMPERIAL) ? (451300) : (204706))
// Arms
#define ARM_F_UPPER1_LEFT 660
#define ARM_F_UPPER1_RIGHT 660
#define ARM_F_UPPER2_LEFT 240
#define ARM_F_UPPER2_RIGHT 240
#define ARM_F_UPPER3_LEFT -240
#define ARM_F_UPPER3_RIGHT -240
#define ARM_F_UPPER4_LEFT -600
#define ARM_F_UPPER4_RIGHT -600
/***************************** Data structures *****************************/
typedef struct {
// SimConnect mapped
double pilot;
double firstOfficer;
double engineer;
double upper1Left;
double upper1Right;
double upper2Left;
double upper2Right;
double upper3Left;
double upper3Right;
double upper4Left;
double upper4Right;
double lowerForward;
double lowerRear;
double leftAux;
double rightAux;
double _ZFWCG; // DO NOT USE
// Additional properties
double empty;
double total;
double CGTarget;
double ZFWCG;
double TOCG;
struct stations {
unsigned int upper1;
unsigned int upper2;
unsigned int upper3;
unsigned int upper4;
unsigned int total;
} stations;
struct sbPlanned {
double ZFW;
double GW;
double fuel;
unsigned int cargo;
} sbPlanned;
} fPayloadData_t;
typedef struct {
// SimConnect mapped
double pilot;
double firstOfficer;
double engineer;
double upper1Left;
double upper1Right;
double upper2Left;
double upper2Right;
double upper3Left;
double upper3Right;
double upper4Left;
double upper4Right;
double lowerForward;
double lowerRear;
double leftAux;
double rightAux;
double ZFWCG;
} fPayloadDataSet_t;
/******************************** Functions ********************************/
// ZFW Entry
void distribute(fPayloadData_t *const targetPayload, const FuelData_t *const fuel, const double ZFWTarget,
const UserData_t *const userData);
// SimBrief Entry
void distribute(fPayloadData_t *const targetPayload, const FuelData_t *const fuel, unsigned int cargo,
const UserData_t *const userData);
// Updates pax stations with their respective weights
// Used internally and used for Station Entry (pax only, cargo is ste directly)
// STATION WEIGHTS ARE NOT NORMALISED TO POUNDS
void generatePayload(fPayloadData_t *const targetPayload);
// Normalise to Pounds
// For Station Entry: CALL AFTER `generatePayload`
void normalisePayload(fPayloadData_t *const targetPayload, const bool isImperial);
void calculateCGs(fPayloadData_t *const targetPayload, const FuelData_t *const fuel, const bool isImperial);
void load(const fPayloadData_t *const targetPayload, const FuelData_t *const fuel, const HANDLE simConnect,
const bool isImperial);
void unloadF(const HANDLE simConnect, const FuelData_t *const fuel, const double empty, const bool isER);
+94
View File
@@ -0,0 +1,94 @@
#pragma once
#ifndef __INTELLISENSE__
#define MODULE_EXPORT __attribute__((visibility("default")))
#define MODULE_WASM_MODNAME(mod) __attribute__((import_module(mod)))
#else
#define MODULE_EXPORT
#define MODULE_WASM_MODNAME(mod)
#define __attribute__(x)
#define __restrict__
#endif
/********************************* Headers *********************************/
// MSFS headers
#include <MSFS/MSFS_WindowsTypes.h>
#include <SimConnect.h>
// C headers
#include <math.h>
// C++ headers
#include <algorithm>
// Own headers
#include "shared.h"
/******************************** Constants ********************************/
// Pounds to gallons conversion
#define LBS_PER_GAL 6.699999809
// Fueling rate
#define FUELING_RATE ((LBS_PER_GAL * 1000) / 60)
// Max tank capacity gallons
#define MAX_TANK_1_3_MAIN_GAL 5167.907
#define MAX_TANK_1_3_TIP_GAL 874.5
#define MAX_TANK_1_3_GAL (5167.907 + 874.5)
#define MAX_TANK_2_GAL 9556.95
#define MAX_UPR_AUX_GAL 12998.58
#define MAX_LWR_AUX_GAL 1641.82
#define MAX_TAIL_GAL 1957.779
#define MAX_FWD_AUX_GAL 1970.8
// Max tank capacity pounds
#define MAX_TANK_1_3_MAIN_LBS (LBS_PER_GAL * MAX_TANK_1_3_MAIN_GAL)
#define MAX_TANK_1_3_TIP_LBS (LBS_PER_GAL * MAX_TANK_1_3_TIP_GAL)
#define MAX_TANK_1_3_LBS (LBS_PER_GAL * MAX_TANK_1_3_GAL)
#define MAX_TANK_2_LBS (LBS_PER_GAL * MAX_TANK_2_GAL)
#define MAX_UPR_AUX_LBS (LBS_PER_GAL * MAX_UPR_AUX_GAL)
#define MAX_LWR_AUX_LBS (LBS_PER_GAL * MAX_LWR_AUX_GAL)
#define MAX_TAIL_LBS (LBS_PER_GAL * MAX_TAIL_GAL)
#define MAX_FWD_AUX_LBS (LBS_PER_GAL * MAX_FWD_AUX_GAL)
// Max Fuel
#define MAX_FUEL(IS_IMPERIAL) ((IS_IMPERIAL) ? (256207) : (116213))
#define MAX_FUEL_ER(IS_IMPERIAL) ((IS_IMPERIAL) ? (282619) : (128193))
// Arms Fuel
#define ARM_MAIN1 -240.0
#define ARM_MAIN3 -240.0
#define ARM_MAIN2 120.0
#define ARM_UPPER_AUX 0.0
#define ARM_LOWER_AUX 0.0
#define ARM_MAIN1_TIP -468.0
#define ARM_MAIN3_TIP -468.0
#define ARM_TAIL -840.0
#define ARM_FORWARD_AUX1 60.0
#define ARM_FORWARD_AUX2 60.0
/***************************** Data structures *****************************/
typedef struct {
// SimConnect mapped
double main1;
double main3;
double main2;
double upperAux;
double lowerAux;
double main1Tip;
double main3Tip;
double tail;
double forwardAux1;
double forwardAux2;
// Additional properties
double total;
} FuelData_t;
typedef struct {
double main1;
double main3;
double main2;
double upperAux;
double lowerAux;
double tail;
double forwardAux1;
double forwardAux2;
} FuelDataSet_t;
/******************************** Functions ********************************/
void distribute(FuelData_t *const targetFuel, const double fuelTarget, const bool isImperial, const bool isER);
void distribute(FuelData_t *const targetFuel, const double fuelTarget, const UserData_t *const userData);
void fuel(const FuelData_t *const targetFuel, const HANDLE simConnect);
@@ -1,45 +1,43 @@
#pragma once #pragma once
#ifndef __INTELLISENSE__ #ifndef __INTELLISENSE__
# define MODULE_EXPORT __attribute__( ( visibility( "default" ) ) ) #define MODULE_EXPORT __attribute__((visibility("default")))
# define MODULE_WASM_MODNAME(mod) __attribute__((import_module(mod))) #define MODULE_WASM_MODNAME(mod) __attribute__((import_module(mod)))
#else #else
# define MODULE_EXPORT #define MODULE_EXPORT
# define MODULE_WASM_MODNAME(mod) #define MODULE_WASM_MODNAME(mod)
# define __attribute__(x) #define __attribute__(x)
# define __restrict__ #define __restrict__
#endif #endif
/********************************* Headers *********************************/ /********************************* Headers *********************************/
// MSFS headers // MSFS headers
#include "rapidjson/filewritestream.h"
#include <MSFS/MSFS.h> #include <MSFS/MSFS.h>
#include <MSFS/MSFS_CommBus.h> #include <MSFS/MSFS_CommBus.h>
#include <MSFS/Legacy/gauges.h> #include <MSFS/MSFS_Core.h>
#include <MSFS/MSFS_GaugeContext.h>
#include <MSFS/MSFS_WindowsTypes.h>
#include <SimConnect.h>
#include <rapidjson/document.h> #include <rapidjson/document.h>
#include <rapidjson/filereadstream.h> #include <rapidjson/filereadstream.h>
#include "rapidjson/filewritestream.h"
#include <rapidjson/writer.h> #include <rapidjson/writer.h>
#include <SimConnect.h>
// C headers
#include <string.h>
// C++ headers
#include <ctime>
// Own headers // Own headers
#include "shared.h"
#include "pax.h"
#include "freighter.h" #include "freighter.h"
#include "fuel.h"
#include "log.h"
#include "pax.h"
#include "shared.h"
/******************************** Constants ********************************/ /******************************** Constants ********************************/
// Module identification // Module identification
#define MODULE_NAME "[KHOFMANN TFDi MD-11 Load Manager] "
#define VERSION_STRING "1.6"
// COMM BUS // COMM BUS
#define COMM_BUS_LIVE_DATA_EVENT "khofmann_tfdi_md-11_load_manager_live_data" #define COMM_BUS_LIVE_DATA_EVENT "khofmann_tfdi_md-11_load_manager_live_data"
#define COMM_BUS_UPDATE_TARGET_EVENT "khofmann_tfdi_md-11_load_manager_update_target" #define COMM_BUS_UPDATE_TARGET_EVENT "khofmann_tfdi_md-11_load_manager_update_target"
/******************************** Functions ********************************/ /******************************** Functions ********************************/
void commBusUpdateTargetCallback(const char* args, unsigned int size, void* ctx); void commBusUpdateTargetCallback(const char *args, unsigned int size, void *ctx);
int receiveData(const char* buf); int receiveData(const char *buf);
void sendData(); void sendData();
void CALLBACK MyDispatchProc(SIMCONNECT_RECV* pData, DWORD cbData, void* pContext); void CALLBACK MyDispatchProc(SIMCONNECT_RECV *pData, DWORD cbData, void *pContext);
void log(FILE* file, const char* format, void* optionalElement = NULL);
+25
View File
@@ -0,0 +1,25 @@
#pragma once
#ifndef __INTELLISENSE__
#define MODULE_EXPORT __attribute__((visibility("default")))
#define MODULE_WASM_MODNAME(mod) __attribute__((import_module(mod)))
#else
#define MODULE_EXPORT
#define MODULE_WASM_MODNAME(mod)
#define __attribute__(x)
#define __restrict__
#endif
// C headers
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// C++ headers
#include <ctime>
/******************************** Constants ********************************/
// Module identification
#define MODULE_NAME "[KHOFMANN TFDi MD-11 Load Manager] "
#define VERSION_STRING "2.40"
void toLog(FILE *file, const char *format, double *optional = nullptr);
+156
View File
@@ -0,0 +1,156 @@
#pragma once
#ifndef __INTELLISENSE__
#define MODULE_EXPORT __attribute__((visibility("default")))
#define MODULE_WASM_MODNAME(mod) __attribute__((import_module(mod)))
#else
#define MODULE_EXPORT
#define MODULE_WASM_MODNAME(mod)
#define __attribute__(x)
#define __restrict__
#endif
/********************************* Headers *********************************/
// MSFS headers
#include <MSFS/MSFS_WindowsTypes.h>
#include <SimConnect.h>
// C headers
#include <math.h>
// C++ headers
#include <algorithm>
// Own headers
#include "fuel.h"
#include "log.h"
#include "shared.h"
/******************************** Constants ********************************/
// 2x 190lbs default
#define FRONT_CREW_WEIGHT(IS_IMPERIAL) ((IS_IMPERIAL) ? (760.0) : (344.0))
// 2x 190lbs default
#define REAR_CREW_WEIGHT(IS_IMPERIAL) ((IS_IMPERIAL) ? (760.0) : (344.0))
// All actual Business seats
#define MAX_BUSINESS_1 18
// First 5 rows of economy
#define MAX_BUSINESS_2 45
// Next 10 rows
#define MAX_ECONOMY_1 86
// Remaining rows
// 12 x 9
// 6 x 8
// 4 x 2
#define MAX_ECONOMY_2 164
// Total
#define MAX_PAX 313
// Max ZFW
#define MAX_PAX_ZFW(IS_IMPERIAL) ((IS_IMPERIAL) ? (400000) : (181437))
// Arms
#define ARM_PAX_CABIN_CREW_FRONT 792.0
#define ARM_PAX_BUSINESS1_LEFT 540.0
#define ARM_PAX_BUSINESS1_CENTER 540.0
#define ARM_PAX_BUSINESS1_RIGHT 540.0
#define ARM_PAX_BUSINESS2_LEFT 300.0
#define ARM_PAX_BUSINESS2_CENTER 300.0
#define ARM_PAX_BUSINESS2_RIGHT 300.0
#define ARM_PAX_ECONOMY1_LEFT -240.0
#define ARM_PAX_ECONOMY1_CENTER -240.0
#define ARM_PAX_ECONOMY1_RIGHT -240.0
#define ARM_PAX_ECONOMY2_LEFT -600.0
#define ARM_PAX_ECONOMY2_CENTER -600.0
#define ARM_PAX_ECONOMY2_RIGHT -600.0
#define ARM_PAX_CABIN_CREW_REAR -660.0
/***************************** Data structures *****************************/
typedef struct {
// SimConnect mapped
double pilot;
double firstOfficer;
double engineer;
double cabinCrewFront;
double business1Left;
double business1Center;
double business1Right;
double business2Left;
double business2Center;
double business2Right;
double economy1Left;
double economy1Center;
double economy1Right;
double economy2Left;
double economy2Center;
double economy2Right;
double cabinCrewRear;
double forwardCargo;
double rearCargo;
double leftAux;
double rightAux;
double _ZFWCG; // DO NOT USE
// Additional properties
double empty;
double total;
double CGTarget;
double ZFWCG;
double TOCG;
struct paxCount {
unsigned char business1;
unsigned char business2;
unsigned char economy1;
unsigned char economy2;
unsigned short total;
} paxCount;
struct sbPlanned {
double ZFW;
double GW;
double fuel;
unsigned short pax;
unsigned int cargo;
} sbPlanned;
} paxPayloadData_t;
typedef struct {
double pilot;
double firstOfficer;
double engineer;
double cabinCrewFront;
double business1Left;
double business1Center;
double business1Right;
double business2Left;
double business2Center;
double business2Right;
double economy1Left;
double economy1Center;
double economy1Right;
double economy2Left;
double economy2Center;
double economy2Right;
double cabinCrewRear;
double forwardCargo;
double rearCargo;
double leftAux;
double rightAux;
double ZFWCG;
} paxPayloadDataSet_t;
/******************************** Functions ********************************/
// ZFW Entry, fill pax first (pax+bag), rest is cargo
void distribute(paxPayloadData_t *const targetPayload, const FuelData_t *const fuel, const double ZFWTarget,
const UserData_t *const userData, const UserOptions_t *const userOptions);
// SimBrief Entry, SB pax count and total cargo
void distribute(paxPayloadData_t *const targetPayload, const FuelData_t *const fuel, unsigned short numPax, unsigned int cargo,
const UserData_t *const userData, const UserOptions_t *const userOptions);
// Updates pax stations with their respective weights
// Used internally and used for Station Entry (pax only, cargo is ste directly)
// STATION WEIGHTS ARE NOT NORMALISED TO POUNDS
void generatePayload(paxPayloadData_t *const targetPayload, const bool isImperial, const UserOptions_t *const userOptions);
// Normalise to Pounds
// For Station Entry: CALL AFTER `generatePayload`
void normalisePayload(paxPayloadData_t *const targetPayload, const bool isImperial);
void calculateCGs(paxPayloadData_t *const targetPayload, const FuelData_t *const fuel, const bool isImperial);
void load(const paxPayloadData_t *const targetPayload, const FuelData_t *const fuel, const HANDLE simConnect,
const bool isImperial);
void unload(const HANDLE simConnect, const FuelData_t *const fuel, const double empty, const bool isER);
// Based on ICAO/LH findings
double PAX_WEIGHT(const bool isImperial, const UserOptions_t *const options);
// Based on ICAO/LH findings
double BAG_WEIGHT(const bool isImperial, const UserOptions_t *const options);
+131
View File
@@ -0,0 +1,131 @@
#pragma once
#ifndef __INTELLISENSE__
#define MODULE_EXPORT __attribute__((visibility("default")))
#define MODULE_WASM_MODNAME(mod) __attribute__((import_module(mod)))
#else
#define MODULE_EXPORT
#define MODULE_WASM_MODNAME(mod)
#define __attribute__(x)
#define __restrict__
#endif
/******************************** Constants ********************************/
// 190lbs default
#define PILOT_WEIGHT(IS_IMPERIAL) ((IS_IMPERIAL) ? (190.0) : (86.0))
// 200lbs per tank (one LD3)
#define AUX_WEIGHT(IS_IMPERIAL) ((IS_IMPERIAL) ? (200.0) : (91.0))
// PMC pallet due to 104in door
#define MAX_FRONT_CARGO(IS_IMPERIAL) ((IS_IMPERIAL) ? (6.0 * 15000.0) : (6.0 * 6804.0))
// LD3s due to 70in door, ER option takes up two slots
#define MAX_REAR_CARGO(IS_IMPERIAL, IS_ER) ((IS_IMPERIAL) ? ((IS_ER ? 12.0 : 14.0) * 3500.0) : ((IS_ER ? 12.0 : 14.0) * 1588.0))
// Max TOW
#define MAX_TOW(IS_IMPERIAL) ((IS_IMPERIAL) ? (625500) : (283722))
#define MAX_TOW_ER(IS_IMPERIAL) ((IS_IMPERIAL) ? (630500) : (285990))
// Arms Shared
#define ARM_EMPTY -120.0
#define ARM_PILOT 984.0
#define ARM_FIRST_OFFICER 984.0
#define ARM_ENGINEER 960.0
#define ARM_FORWARD_CARGO 360.0
#define ARM_REAR_CARGO -360.0
#define ARM_LEFT_AUX 60.0
#define ARM_RIGHT_AUX 60.0
// MAC
#define ROOT_CHORD 34.68
#define WING_SPAN 170.5
#define WING_AREA 3648.0
#define QUARTER_MAC -165.0 // aero_center
#define TIP_CHORD ((2.0 * WING_AREA) / WING_SPAN - ROOT_CHORD)
#define TAPER_RATIO (TIP_CHORD / ROOT_CHORD)
#define MAC ((2.0 / 3.0) * ROOT_CHORD * ((1.0 + TAPER_RATIO + (TAPER_RATIO * TAPER_RATIO)) / (1.0 + TAPER_RATIO)) * 12.0)
#define LEMAC (QUARTER_MAC + (1.0 / 4.0) * MAC)
// CG Limits
#define MIN_CG 12.0
#define MAX_CG 34.0
#define CG_TOLERANCE 0.05
// GSX States
#define GSX_SERVICE_IDLE 1
#define GSX_SERVICE_CALLED 4
#define GSX_SERVICE_ACTIVE 5
#define GSX_SERVICE_FINISHED 6
/********************************* Macros **********************************/
// Conversions
#define TO_POUNDS(IS_IMPERIAL, VALUE) ((IS_IMPERIAL) ? (VALUE) : (VALUE)*2.20462262185)
#define FROM_POUNDS(IS_IMPERIAL, VALUE) ((IS_IMPERIAL) ? (VALUE) : (VALUE) * (1.0 / 2.20462262185))
// MAC
#define TO_PERCENT_MAC(POS) ((((POS)-LEMAC) / MAC) * -100.0)
/********************************** ENUMS **********************************/
enum DATA_DEFINITIONS {
DATA_DEFINITION_EMPTY_WEIGHT,
DATA_DEFINITION_PAYLOAD_PAX,
DATA_DEFINITION_PAYLOAD_F,
DATA_DEFINITION_FUEL,
DATA_DEFINITION_FUEL_SET,
DATA_DEFINITION_GSX,
DATA_DEFINITION_USER_DATA,
};
enum DATA_REQUESTS {
DATA_REQUEST_EMPTY_WEIGHT,
DATA_REQUEST_PAYLOAD_PAX,
DATA_REQUEST_PAYLOAD_F,
DATA_REQUEST_FUEL,
DATA_REQUEST_FUEL_SET,
DATA_REQUEST_GSX,
DATA_REQUEST_USER_DATA,
};
enum LOADING_STATES {
LOADING_STATE_IDLE,
LOADING_STATE_BOARDING,
LOADING_STATE_BOARDED,
LOADING_STATE_DEBOARDING,
LOADING_STATE_DEBOARDED,
};
enum FUELING_STATES { FUELING_STATE_IDLE, FUELING_STATE_CALLED, FUELING_STATE_FUELING, FUELING_STATE_FUELED };
enum CALL_MODES {
CALL_MODE_SB_SET,
CALL_MODE_ZFW_SET,
CALL_MODE_STATION_SET,
CALL_MODE_LOAD_SET,
CALL_MODE_UNLOAD_SET,
CALL_MODE_OPTIONS_SET,
CALL_MODE_GSX_RESET,
};
/***************************** Data structures *****************************/
typedef struct {
double isCargo;
double isER;
double isImperial;
} UserData_t;
typedef struct {
// SimConnect mapped
double couatlStarted; // boolean
double boardingState; // See manual, 5 => active
double deboardingState; // See manual, 5 => active
double refuelingState; // See manual, 5 => active
double passengersBoarded; // Num pax
double passengersDeboarded; // Num pax
double cargoBoarded; // In percent
double cargoDeboarded; // In percent
double fuelConnected; // boolean
// Additional properties
enum LOADING_STATES loadingState;
enum FUELING_STATES fuelingState;
} GSXData_t;
typedef struct {
bool GSXSync;
double paxWeightKG;
double bagWeightKG;
double paxWeightLBS;
double bagWeightLBS;
} UserOptions_t;
@@ -1,25 +0,0 @@
// load-manager-cli.cpp : This file contains the 'main' function. Program execution begins and ends there.
//
#include "../wasm-module/pax.h"
int main()
{
bool isImperial = false;
bool isER = true;
paxPayloadData_t targetPaxPayloadData = paxPayloadData_t();
targetPaxPayloadData.empty = FROM_POUNDS(isImperial, 283975);
targetPaxPayloadData.pilot = PAX_WEIGHT(isImperial);
targetPaxPayloadData.firstOfficer = PAX_WEIGHT(isImperial);
targetPaxPayloadData.engineer = PAX_WEIGHT(isImperial);
targetPaxPayloadData.cabinCrewFront = FRONT_CREW_WEIGHT(isImperial);
targetPaxPayloadData.cabinCrewRear = REAR_CREW_WEIGHT(isImperial);
targetPaxPayloadData.leftAux = isER ? AUX_WEIGHT(isImperial) : 0;
targetPaxPayloadData.rightAux = isER ? AUX_WEIGHT(isImperial) : 0;
FuelData_t liveFuelData = FuelData_t();
distribute(&targetPaxPayloadData, &liveFuelData, 162000.0, 20.5, isImperial);
}
@@ -1,109 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>17.0</VCProjectVersion>
<Keyword>Win32Proj</Keyword>
<ProjectGuid>{992caf4b-b3f6-4a86-a1c1-663686082c5e}</ProjectGuid>
<RootNamespace>loadmanagercli</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<IntDir>$(Platform)\$(Configuration)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<IntDir>$(Platform)\$(Configuration)\</IntDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="pax.cpp" />
<ClCompile Include="load-manager-cli.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="pax.h" />
<ClInclude Include="types.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
@@ -1,34 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>
rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="load-manager-cli.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="pax.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="pax.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="types.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
</Project>
@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup />
</Project>
File diff suppressed because it is too large Load Diff
@@ -5,28 +5,16 @@ VisualStudioVersion = 17.13.36105.23
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "load-manager", "load-manager.vcxproj", "{A5468B35-BBBD-4C55-97ED-81BFE343B0E4}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "load-manager", "load-manager.vcxproj", "{A5468B35-BBBD-4C55-97ED-81BFE343B0E4}"
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "load-manager-cli", "load-manager-cli.vcxproj", "{992CAF4B-B3F6-4A86-A1C1-663686082C5E}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|MSFS = Debug|MSFS Debug|MSFS = Debug|MSFS
Debug|x64 = Debug|x64
Release|MSFS = Release|MSFS Release|MSFS = Release|MSFS
Release|x64 = Release|x64
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution GlobalSection(ProjectConfigurationPlatforms) = postSolution
{A5468B35-BBBD-4C55-97ED-81BFE343B0E4}.Debug|MSFS.ActiveCfg = Debug|MSFS {A5468B35-BBBD-4C55-97ED-81BFE343B0E4}.Debug|MSFS.ActiveCfg = Debug|MSFS
{A5468B35-BBBD-4C55-97ED-81BFE343B0E4}.Debug|MSFS.Build.0 = Debug|MSFS {A5468B35-BBBD-4C55-97ED-81BFE343B0E4}.Debug|MSFS.Build.0 = Debug|MSFS
{A5468B35-BBBD-4C55-97ED-81BFE343B0E4}.Debug|x64.ActiveCfg = Debug|x64
{A5468B35-BBBD-4C55-97ED-81BFE343B0E4}.Release|MSFS.ActiveCfg = Release|MSFS {A5468B35-BBBD-4C55-97ED-81BFE343B0E4}.Release|MSFS.ActiveCfg = Release|MSFS
{A5468B35-BBBD-4C55-97ED-81BFE343B0E4}.Release|MSFS.Build.0 = Release|MSFS {A5468B35-BBBD-4C55-97ED-81BFE343B0E4}.Release|MSFS.Build.0 = Release|MSFS
{A5468B35-BBBD-4C55-97ED-81BFE343B0E4}.Release|x64.ActiveCfg = Release|MSFS
{992CAF4B-B3F6-4A86-A1C1-663686082C5E}.Debug|MSFS.ActiveCfg = Debug|x64
{992CAF4B-B3F6-4A86-A1C1-663686082C5E}.Debug|x64.ActiveCfg = Debug|x64
{992CAF4B-B3F6-4A86-A1C1-663686082C5E}.Debug|x64.Build.0 = Debug|x64
{992CAF4B-B3F6-4A86-A1C1-663686082C5E}.Release|MSFS.ActiveCfg = Release|x64
{992CAF4B-B3F6-4A86-A1C1-663686082C5E}.Release|x64.ActiveCfg = Release|x64
{992CAF4B-B3F6-4A86-A1C1-663686082C5E}.Release|x64.Build.0 = Release|x64
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
+19 -146
View File
@@ -5,18 +5,10 @@
<Configuration>Debug</Configuration> <Configuration>Debug</Configuration>
<Platform>MSFS</Platform> <Platform>MSFS</Platform>
</ProjectConfiguration> </ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|MSFS"> <ProjectConfiguration Include="Release|MSFS">
<Configuration>Release</Configuration> <Configuration>Release</Configuration>
<Platform>MSFS</Platform> <Platform>MSFS</Platform>
</ProjectConfiguration> </ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup> </ItemGroup>
<PropertyGroup Label="Globals"> <PropertyGroup Label="Globals">
<VCProjectVersion>16.0</VCProjectVersion> <VCProjectVersion>16.0</VCProjectVersion>
@@ -29,26 +21,13 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|MSFS'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|MSFS'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries> <UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>MSFS</PlatformToolset> <PlatformToolset>MSFS2024</PlatformToolset>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>MSFS</PlatformToolset>
<CharacterSet>MultiByte</CharacterSet> <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|MSFS'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|MSFS'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries> <UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>MSFS</PlatformToolset> <PlatformToolset>MSFS2024</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>MSFS</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet> <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup> </PropertyGroup>
@@ -60,37 +39,20 @@
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|MSFS'" Label="PropertySheets"> <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|MSFS'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup> </ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|MSFS'" Label="PropertySheets"> <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|MSFS'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup> </ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" /> <PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|MSFS'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|MSFS'">
<TargetExt>.wasm</TargetExt> <TargetExt>.wasm</TargetExt>
<GenerateManifest /> <GenerateManifest />
<LinkIncremental /> <LinkIncremental />
<IncludePath>$(MSFS_IncludePath)</IncludePath> <IncludePath>$(MSFS_IncludePath);$(ProjectDir)include</IncludePath>
<TargetName>$(ProjectName)</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<TargetExt>.wasm</TargetExt>
<GenerateManifest />
<LinkIncremental />
<IncludePath>$(MSFS_IncludePath)</IncludePath>
<TargetName>$(ProjectName)</TargetName> <TargetName>$(ProjectName)</TargetName>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|MSFS'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|MSFS'">
<TargetExt>.wasm</TargetExt> <TargetExt>.wasm</TargetExt>
<IncludePath>$(MSFS_IncludePath)</IncludePath> <IncludePath>$(MSFS_IncludePath);$(ProjectDir)include</IncludePath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<TargetExt>.wasm</TargetExt>
<IncludePath>$(MSFS_IncludePath)</IncludePath>
</PropertyGroup> </PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|MSFS'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|MSFS'">
<ClCompile> <ClCompile>
@@ -114,7 +76,8 @@
</BasicRuntimeChecks> </BasicRuntimeChecks>
<LanguageStandard>stdcpp14</LanguageStandard> <LanguageStandard>stdcpp14</LanguageStandard>
<MultiProcessorCompilation>true</MultiProcessorCompilation> <MultiProcessorCompilation>true</MultiProcessorCompilation>
<AdditionalOptions>/clang:-fstack-usage %(AdditionalOptions)</AdditionalOptions> <AdditionalOptions>/clang:-Wall /clang:-Wextra /clang:-pedantic /clang:-Wno-missing-braces
/clang:-Wno-unused-const-variable /clang:-fstack-usage %(AdditionalOptions)</AdditionalOptions>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem> <SubSystem>
@@ -144,57 +107,6 @@
Powershell.exe -File .\copy-debug.ps1</Command> Powershell.exe -File .\copy-debug.ps1</Command>
</PostBuildEvent> </PostBuildEvent>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<SDLCheck>
</SDLCheck>
<ConformanceMode>true</ConformanceMode>
<BufferSecurityCheck>false</BufferSecurityCheck>
<AdditionalIncludeDirectories>
</AdditionalIncludeDirectories>
<PreprocessorDefinitions>__wasi__;_STRING_H_CPLUSPLUS_98_CONFORMANCE_;_WCHAR_H_CPLUSPLUS_98_CONFORMANCE_;_LIBCPP_HAS_NO_THREADS;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ShowIncludes>false</ShowIncludes>
<ExceptionHandling>false</ExceptionHandling>
<RuntimeTypeInfo>
</RuntimeTypeInfo>
<SupportJustMyCode>
</SupportJustMyCode>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<BasicRuntimeChecks>
</BasicRuntimeChecks>
<LanguageStandard>stdcpp14</LanguageStandard>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
<Link>
<SubSystem>
</SubSystem>
<AdditionalDependencies>
</AdditionalDependencies>
<IgnoreAllDefaultLibraries>
</IgnoreAllDefaultLibraries>
<NoEntryPoint>true</NoEntryPoint>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<RandomizedBaseAddress>
</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>
</ProgramDatabaseFile>
<ImportLibrary>
</ImportLibrary>
<ProfileGuidedDatabase>
</ProfileGuidedDatabase>
<AdditionalLibraryDirectories>
</AdditionalLibraryDirectories>
</Link>
<PostBuildEvent>
<Command>
</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|MSFS'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|MSFS'">
<ClCompile> <ClCompile>
<WarningLevel>Level3</WarningLevel> <WarningLevel>Level3</WarningLevel>
@@ -212,7 +124,8 @@ Powershell.exe -File .\copy-debug.ps1</Command>
<SupportJustMyCode> <SupportJustMyCode>
</SupportJustMyCode> </SupportJustMyCode>
<LanguageStandard>stdcpp14</LanguageStandard> <LanguageStandard>stdcpp14</LanguageStandard>
<AdditionalOptions>/clang:-fstack-usage %(AdditionalOptions)</AdditionalOptions> <AdditionalOptions>/clang:-Wall /clang:-Wextra /clang:-pedantic /clang:-Wno-missing-braces
/clang:-Wno-unused-const-variable /clang:-fstack-usage %(AdditionalOptions)</AdditionalOptions>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem> <SubSystem>
@@ -240,60 +153,20 @@ Powershell.exe -File .\copy-debug.ps1</Command>
Powershell.exe -File .\copy-release.ps1</Command> Powershell.exe -File .\copy-release.ps1</Command>
</PostBuildEvent> </PostBuildEvent>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>
</AdditionalIncludeDirectories>
<PreprocessorDefinitions>__wasi__;__wasm32__;_STRING_H_CPLUSPLUS_98_CONFORMANCE_;_WCHAR_H_CPLUSPLUS_98_CONFORMANCE_;_LIBCPP_NO_EXCEPTIONS;_LIBCPP_HAS_NO_THREADS;_LIBCPP_STD_VER=14;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<BufferSecurityCheck>false</BufferSecurityCheck>
<ExceptionHandling>false</ExceptionHandling>
<DebugInformationFormat>false</DebugInformationFormat>
<SupportJustMyCode>
</SupportJustMyCode>
<LanguageStandard>stdcpp14</LanguageStandard>
</ClCompile>
<Link>
<SubSystem>
</SubSystem>
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
<IgnoreAllDefaultLibraries>
</IgnoreAllDefaultLibraries>
<NoEntryPoint>true</NoEntryPoint>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<RandomizedBaseAddress>
</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<GenerateDebugInformation>false</GenerateDebugInformation>
<ProgramDatabaseFile>
</ProgramDatabaseFile>
<ImportLibrary>
</ImportLibrary>
<ProfileGuidedDatabase>
</ProfileGuidedDatabase>
<AdditionalLibraryDirectories>$(OutDir)</AdditionalLibraryDirectories>
</Link>
<PostBuildEvent>
<Command>
</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="freighter.cpp" /> <ClCompile Include="src/freighter.cpp" />
<ClCompile Include="load-manager.cpp" /> <ClCompile Include="src/load-manager.cpp" />
<ClCompile Include="pax.cpp" /> <ClCompile Include="src/log.cpp" />
<ClCompile Include="src/pax.cpp" />
<ClCompile Include="src/fuel.cpp" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="freighter.h" /> <ClInclude Include="include/freighter.h" />
<ClInclude Include="load-manager.h" /> <ClInclude Include="include/load-manager.h" />
<ClInclude Include="pax.h" /> <ClInclude Include="include/log.h" />
<ClInclude Include="shared.h" /> <ClInclude Include="include/pax.h" />
<ClInclude Include="include/shared.h" />
<ClInclude Include="include/fuel.h" />
</ItemGroup> </ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets"> <ImportGroup Label="ExtensionTargets">
@@ -1,27 +1,39 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup> <ItemGroup>
<ClCompile Include="load-manager.cpp"> <ClCompile Include="src/freighter.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="pax.cpp"> <ClCompile Include="src/load-manager.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="freighter.cpp"> <ClCompile Include="src/log.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src/pax.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src/fuel.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="pax.h"> <ClInclude Include="include/freighter.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="load-manager.h"> <ClInclude Include="include/load-manager.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="shared.h"> <ClInclude Include="include/log.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="freighter.h"> <ClInclude Include="include/pax.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include/shared.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include/fuel.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
</ItemGroup> </ItemGroup>
+15
View File
@@ -0,0 +1,15 @@
{
"name": "wasm-module",
"version": "0.0.16",
"description": "Load Manager WASM module",
"scripts": {
"clean": "rimraf ../SimObjects/Airplanes/TFDi_Design_MD-11/panel/load-manager.wasm && rimraf MSFS",
"build": "MSBuild.exe ./load-manager.sln /p:Platform=MSFS",
"build:rel": "MSBuild.exe ./load-manager.sln /p:Platform=MSFS /p:Configuration=Release",
"release": "pnpm clean && npm version patch && pnpm build:rel && node stack-analysis"
},
"keywords": [],
"author": "Kilian Kurt Hofmann",
"license": "MIT",
"packageManager": "pnpm@10.25.0"
}
-329
View File
@@ -1,329 +0,0 @@
#include "pax.h"
// ZFW Entry, fill pax first (pax+bag), rest is cargo
void distribute(paxPayloadData_t* const targetPayload, const FuelData_t* const fuel, const double ZFWTarget, const UserData_t* const userData,
const UserOptions_t* const userOptions) {
// Find payload, num pax and extra cargo
double payload = ZFWTarget - targetPayload->empty - targetPayload->pilot - targetPayload->firstOfficer - targetPayload->engineer -
targetPayload->cabinCrewFront - targetPayload->cabinCrewRear - targetPayload->leftAux - targetPayload->rightAux;
unsigned short numPax = max(0.0, min((double)MAX_PAX, floor(payload / (PAX_WEIGHT(userData->isImperial, userOptions) +
BAG_WEIGHT(userData->isImperial, userOptions)))));
unsigned int cargo = round(payload - numPax * PAX_WEIGHT(userData->isImperial, userOptions) - numPax * BAG_WEIGHT(userData->isImperial, userOptions));
distribute(targetPayload, fuel, numPax, cargo, userData, userOptions);
}
// SimBrief Entry, SB pax count and extra cargo
void distribute(paxPayloadData_t* const targetPayload, const FuelData_t* const fuel, unsigned short numPax, unsigned int cargo, const UserData_t* const userData,
const UserOptions_t* const userOptions) {
// Clear
targetPayload->paxCount.business1 = targetPayload->paxCount.business2 = targetPayload->paxCount.economy1 = targetPayload->paxCount.economy2 =
targetPayload->paxCount.total = 0;
targetPayload->forwardCargo = targetPayload->rearCargo = 0;
unsigned short _numPax = 0;
unsigned int count = MAX_PAX;
// Initial distribution pax + bags
while (numPax > 0 && count > 0) {
if (numPax >= 4) {
if (targetPayload->paxCount.business1 < MAX_BUSINESS_1) {
targetPayload->paxCount.business1++;
_numPax++;
}
if (targetPayload->paxCount.business2 < MAX_BUSINESS_2) {
targetPayload->paxCount.business2++;
_numPax++;
}
if (targetPayload->paxCount.economy1 < MAX_ECONOMY_1) {
targetPayload->paxCount.economy1++;
_numPax++;
}
if (targetPayload->paxCount.economy2 < MAX_ECONOMY_2) {
targetPayload->paxCount.economy2++;
_numPax++;
}
}
else if (numPax == 3) {
if (targetPayload->paxCount.business2 < MAX_BUSINESS_2) {
targetPayload->paxCount.business2++;
_numPax++;
}
if (targetPayload->paxCount.economy1 < MAX_ECONOMY_1) {
targetPayload->paxCount.economy1++;
_numPax++;
}
if (targetPayload->paxCount.economy2 < MAX_ECONOMY_2) {
targetPayload->paxCount.economy2++;
_numPax++;
}
}
else if (numPax == 2) {
if (targetPayload->paxCount.economy1 < MAX_ECONOMY_1) {
targetPayload->paxCount.economy1++;
_numPax++;
}
if (targetPayload->paxCount.economy2 < MAX_ECONOMY_2) {
targetPayload->paxCount.economy2++;
_numPax++;
}
}
else if (numPax == 1) {
if (targetPayload->paxCount.economy2 < MAX_ECONOMY_2) {
targetPayload->paxCount.economy2++;
_numPax++;
}
}
numPax -= _numPax;
targetPayload->paxCount.total += _numPax;
if (_numPax % 2 == 0) {
targetPayload->forwardCargo += (_numPax / 2) * BAG_WEIGHT(userData->isImperial, userOptions);
targetPayload->rearCargo += (_numPax / 2) * BAG_WEIGHT(userData->isImperial, userOptions);
}
else {
_numPax--;
targetPayload->forwardCargo += (_numPax / 2 + 1) * BAG_WEIGHT(userData->isImperial, userOptions);
targetPayload->rearCargo += (_numPax / 2) * BAG_WEIGHT(userData->isImperial, userOptions);
}
_numPax = 0;
count--;
}
count = MAX_FRONT_CARGO(userData->isImperial);
// Initial distibution of remaining cargo
while (cargo > 0 && count > 0) {
if (targetPayload->forwardCargo < MAX_FRONT_CARGO(userData->isImperial)) {
targetPayload->forwardCargo++;
cargo--;
}
if (targetPayload->rearCargo < MAX_REAR_CARGO(userData->isImperial, userData->isER) && cargo > 0) {
targetPayload->rearCargo++;
cargo--;
}
count--;
}
// Refinement pax
count = MAX_PAX;
unsigned char minBusiness1 = round(targetPayload->paxCount.business1 / 3);
unsigned char minBusiness2 = round(targetPayload->paxCount.business2 / 3);
unsigned char minEconomy1 = round(targetPayload->paxCount.economy1 / 3);
unsigned char minEconomy2 = round(targetPayload->paxCount.economy2 / 3);
while (count > 0) {
generatePayload(targetPayload, userData->isImperial, userOptions);
calculateCGs(targetPayload, fuel, &targetPayload->ZFWCG, &targetPayload->TOCG, userData->isImperial);
// in front of target
if (targetPayload->ZFWCG < targetPayload->CGTarget - CG_TOLERANCE) {
if (targetPayload->paxCount.business1 > minBusiness1) {
targetPayload->paxCount.business1--;
}
else if (targetPayload->paxCount.business2 > minBusiness2) {
targetPayload->paxCount.business2--;
}
else if (targetPayload->paxCount.economy1 > minEconomy1) {
targetPayload->paxCount.economy1--;
}
else {
break;
}
if (targetPayload->paxCount.economy2 < MAX_ECONOMY_2) {
targetPayload->paxCount.economy2++;
}
else if (targetPayload->paxCount.economy1 < MAX_ECONOMY_1) {
targetPayload->paxCount.economy1++;
}
else if (targetPayload->paxCount.business2 < MAX_BUSINESS_2) {
targetPayload->paxCount.business2++;
}
else {
targetPayload->paxCount.business1++;
}
}
// behind target
else if (targetPayload->ZFWCG > targetPayload->CGTarget + CG_TOLERANCE) {
if (targetPayload->paxCount.economy2 > minEconomy2) {
targetPayload->paxCount.economy2--;
}
else if (targetPayload->paxCount.economy1 > minEconomy1) {
targetPayload->paxCount.economy1--;
}
else if (targetPayload->paxCount.business2 > minBusiness2) {
targetPayload->paxCount.business2--;
}
else {
break;
}
if (targetPayload->paxCount.business1 < MAX_BUSINESS_1) {
targetPayload->paxCount.business1++;
}
else if (targetPayload->paxCount.business2 < MAX_BUSINESS_2) {
targetPayload->paxCount.business2++;
}
else if (targetPayload->paxCount.economy1 < MAX_ECONOMY_1) {
targetPayload->paxCount.economy1++;
}
else {
targetPayload->paxCount.economy2++;
}
}
else {
break;
}
count--;
}
// Refinement cargo
count = MAX_FRONT_CARGO(userData->isImperial) + MAX_REAR_CARGO(userData->isImperial, userData->isER);
while (count > 0) {
generatePayload(targetPayload, userData->isImperial, userOptions);
calculateCGs(targetPayload, fuel, &targetPayload->ZFWCG, &targetPayload->TOCG, userData->isImperial);
// in front of target
if (targetPayload->ZFWCG < targetPayload->CGTarget - CG_TOLERANCE) {
if (targetPayload->forwardCargo > 0 && targetPayload->rearCargo < MAX_REAR_CARGO(userData->isImperial, userData->isER)) {
if (targetPayload->forwardCargo > BAG_WEIGHT(userData->isImperial, userOptions) &&
targetPayload->rearCargo < MAX_FRONT_CARGO(userData->isImperial) - BAG_WEIGHT(userData->isImperial, userOptions)) {
targetPayload->forwardCargo -= BAG_WEIGHT(userData->isImperial, userOptions);
targetPayload->rearCargo += BAG_WEIGHT(userData->isImperial, userOptions);
}
else {
targetPayload->forwardCargo--;
targetPayload->rearCargo++;
}
}
else {
break;
}
}
// behind target
else if (targetPayload->ZFWCG > targetPayload->CGTarget + CG_TOLERANCE) {
if (targetPayload->rearCargo > 0 && targetPayload->forwardCargo < MAX_FRONT_CARGO(userData->isImperial)) {
if (targetPayload->rearCargo > BAG_WEIGHT(userData->isImperial, userOptions) &&
targetPayload->forwardCargo < MAX_REAR_CARGO(userData->isImperial, userData->isER) - BAG_WEIGHT(userData->isImperial, userOptions)) {
targetPayload->rearCargo -= BAG_WEIGHT(userData->isImperial, userOptions);
targetPayload->forwardCargo += BAG_WEIGHT(userData->isImperial, userOptions);
}
else {
targetPayload->rearCargo--;
targetPayload->forwardCargo++;
}
}
else {
break;
}
}
else {
break;
}
count--;
}
}
// Updates pax stations with their respective weights
// Used internally and used for Station Entry (pax only, cargo is set directly)
void generatePayload(paxPayloadData_t* const targetPayload, const bool isImperial, const UserOptions_t* const userOptions) {
targetPayload->business1Left = targetPayload->business1Center = targetPayload->business1Right = (targetPayload->paxCount.business1 / 3.0) * PAX_WEIGHT(isImperial, userOptions);
targetPayload->business2Left = targetPayload->business2Center = targetPayload->business2Right = (targetPayload->paxCount.business2 / 3.0) * PAX_WEIGHT(isImperial, userOptions);
targetPayload->economy1Left = targetPayload->economy1Center = targetPayload->economy1Right = (targetPayload->paxCount.economy1 / 3.0) * PAX_WEIGHT(isImperial, userOptions);
targetPayload->economy2Left = targetPayload->economy2Center = targetPayload->economy2Right = (targetPayload->paxCount.economy2 / 3.0) * PAX_WEIGHT(isImperial, userOptions);
targetPayload->total = targetPayload->empty + targetPayload->pilot + targetPayload->firstOfficer + targetPayload->engineer + targetPayload->cabinCrewFront +
targetPayload->business1Left + targetPayload->business1Center + targetPayload->business1Right + targetPayload->business2Left +
targetPayload->business2Center + targetPayload->business2Right + targetPayload->economy1Left + targetPayload->economy1Center +
targetPayload->economy1Right + targetPayload->economy2Left + targetPayload->economy2Center + targetPayload->economy2Right +
targetPayload->cabinCrewRear + targetPayload->forwardCargo + targetPayload->rearCargo + targetPayload->leftAux + targetPayload->rightAux;
}
// Normalise to Pounds
// MANDATORY BEFORE SETTING WEIGHTS
// USE ON COPY OF GLOBAL STATE ONLY
void normalisePayload(paxPayloadData_t* const targetPayload, const bool isImperial) {
targetPayload->empty = TO_POUNDS(isImperial, targetPayload->empty);
targetPayload->pilot = TO_POUNDS(isImperial, targetPayload->pilot);
targetPayload->firstOfficer = TO_POUNDS(isImperial, targetPayload->firstOfficer);
targetPayload->engineer = TO_POUNDS(isImperial, targetPayload->engineer);
targetPayload->cabinCrewFront = TO_POUNDS(isImperial, targetPayload->cabinCrewFront);
targetPayload->business1Left = TO_POUNDS(isImperial, targetPayload->business1Left);
targetPayload->business1Center = TO_POUNDS(isImperial, targetPayload->business1Center);
targetPayload->business1Right = TO_POUNDS(isImperial, targetPayload->business1Right);
targetPayload->business2Left = TO_POUNDS(isImperial, targetPayload->business2Left);
targetPayload->business2Center = TO_POUNDS(isImperial, targetPayload->business2Center);
targetPayload->business2Right = TO_POUNDS(isImperial, targetPayload->business2Right);
targetPayload->economy1Left = TO_POUNDS(isImperial, targetPayload->economy1Left);
targetPayload->economy1Center = TO_POUNDS(isImperial, targetPayload->economy1Center);
targetPayload->economy1Right = TO_POUNDS(isImperial, targetPayload->economy1Right);
targetPayload->economy2Left = TO_POUNDS(isImperial, targetPayload->economy2Left);
targetPayload->economy2Center = TO_POUNDS(isImperial, targetPayload->economy2Center);
targetPayload->economy2Right = TO_POUNDS(isImperial, targetPayload->economy2Right);
targetPayload->cabinCrewRear = TO_POUNDS(isImperial, targetPayload->cabinCrewRear);
targetPayload->forwardCargo = TO_POUNDS(isImperial, targetPayload->forwardCargo);
targetPayload->rearCargo = TO_POUNDS(isImperial, targetPayload->rearCargo);
targetPayload->leftAux = TO_POUNDS(isImperial, targetPayload->leftAux);
targetPayload->rightAux = TO_POUNDS(isImperial, targetPayload->rightAux);
}
void calculateCGs(const paxPayloadData_t* const targetPayload, const FuelData_t* const fuel, double* const ZFWCG, double* const TOCG, const bool isImperial) {
paxPayloadData_t localPayload = {};
memcpy(&localPayload, targetPayload, sizeof(localPayload));
normalisePayload(&localPayload, isImperial);
double totalMoment = localPayload.empty * ARM_EMPTY + localPayload.pilot * ARM_PILOT + localPayload.firstOfficer * ARM_FIRST_OFFICER +
localPayload.engineer * ARM_ENGINEER + localPayload.cabinCrewFront * ARM_PAX_CABIN_CREW_FRONT +
localPayload.business1Left * ARM_PAX_BUSINESS1_LEFT + localPayload.business1Center * ARM_PAX_BUSINESS1_CENTER +
localPayload.business1Right * ARM_PAX_BUSINESS1_RIGHT + localPayload.business2Left * ARM_PAX_BUSINESS2_LEFT +
localPayload.business2Center * ARM_PAX_BUSINESS2_CENTER + localPayload.business2Right * ARM_PAX_BUSINESS2_RIGHT +
localPayload.economy1Left * ARM_PAX_ECONOMY1_LEFT + localPayload.economy1Center * ARM_PAX_ECONOMY1_CENTER +
localPayload.economy1Right * ARM_PAX_ECONOMY1_RIGHT + localPayload.economy2Left * ARM_PAX_ECONOMY2_LEFT +
localPayload.economy2Center * ARM_PAX_ECONOMY2_CENTER + localPayload.economy2Right * ARM_PAX_ECONOMY2_RIGHT +
localPayload.cabinCrewRear * ARM_PAX_CABIN_CREW_REAR + localPayload.forwardCargo * ARM_FORWARD_CARGO +
localPayload.rearCargo * ARM_REAR_CARGO + localPayload.leftAux * ARM_LEFT_AUX + localPayload.rightAux * ARM_RIGHT_AUX;
double totalWeight = localPayload.empty + localPayload.pilot + localPayload.firstOfficer + localPayload.engineer + localPayload.cabinCrewFront +
localPayload.business1Left + localPayload.business1Center + localPayload.business1Right + localPayload.business2Left +
localPayload.business2Center + localPayload.business2Right + localPayload.economy1Left + localPayload.economy1Center +
localPayload.economy1Right + localPayload.economy2Left + localPayload.economy2Center + localPayload.economy2Right +
localPayload.cabinCrewRear + localPayload.forwardCargo + localPayload.rearCargo + localPayload.leftAux + localPayload.rightAux;
*ZFWCG = TO_PERCENT_MAC(totalMoment / totalWeight);
totalMoment += fuel->main1 * ARM_MAIN1 + fuel->main3 * ARM_MAIN3 + fuel->main2 * ARM_MAIN2 + fuel->upperAux * ARM_UPPER_AUX +
fuel->lowerAux * ARM_LOWER_AUX + fuel->main1Tip * ARM_MAIN1_TIP + fuel->main3Tip * ARM_MAIN3_TIP +
fuel->tail * ARM_TAIL + fuel->forwardAux1 * ARM_FORWARD_AUX1 + fuel->forwardAux2 * ARM_FORWARD_AUX2;
totalWeight += fuel->total;
*TOCG = TO_PERCENT_MAC(totalMoment / totalWeight);
}
void load(const paxPayloadData_t* const targetPayload, const HANDLE simConnect, const bool isImperial) {
paxPayloadData_t localPayload = {};
memcpy(&localPayload, targetPayload, sizeof(localPayload));
normalisePayload(&localPayload, isImperial);
SimConnect_SetDataOnSimObject(simConnect, DATA_DEFINITION_PAYLOAD_PAX, SIMCONNECT_OBJECT_ID_USER, 0, 0, sizeof(paxPayloadDataSet_t), &localPayload);
}
void unload(const HANDLE simConnect, const bool isER) {
paxPayloadDataSet_t localPayload = {};
localPayload.cabinCrewFront = FRONT_CREW_WEIGHT(true);
localPayload.cabinCrewRear = REAR_CREW_WEIGHT(true);
localPayload.leftAux = localPayload.rightAux = isER ? AUX_WEIGHT(true) : 0;
localPayload.pilot = localPayload.firstOfficer = localPayload.engineer = PILOT_WEIGHT(true);
SimConnect_SetDataOnSimObject(simConnect, DATA_DEFINITION_PAYLOAD_PAX, SIMCONNECT_OBJECT_ID_USER, 0, 0, sizeof(paxPayloadDataSet_t), &localPayload);
}
const double PAX_WEIGHT(const bool isImperial, const UserOptions_t* const options) {
return (isImperial) ? (options->paxWeightLBS) : (options->paxWeightKG);
}
const double BAG_WEIGHT(const bool isImperial, const UserOptions_t* const options) {
return (isImperial) ? (options->bagWeightLBS) : (options->bagWeightKG);
}
-150
View File
@@ -1,150 +0,0 @@
#pragma once
#ifndef __INTELLISENSE__
# define MODULE_EXPORT __attribute__( ( visibility( "default" ) ) )
# define MODULE_WASM_MODNAME(mod) __attribute__((import_module(mod)))
#else
# define MODULE_EXPORT
# define MODULE_WASM_MODNAME(mod)
# define __attribute__(x)
# define __restrict__
#endif
/********************************* Headers *********************************/
// MSFS headers
#include <MSFS/MSFS_WindowsTypes.h>
#include <SimConnect.h>
// C headers
#include <math.h>
// C++ headers
#include <algorithm>
// Own headers
#include "shared.h"
/******************************** Constants ********************************/
// 2x 190lbs default
#define FRONT_CREW_WEIGHT(IS_IMPERIAL) ((IS_IMPERIAL) ? (760.0) : (344.0))
// 2x 190lbs default
#define REAR_CREW_WEIGHT(IS_IMPERIAL) ((IS_IMPERIAL) ? (760.0) : (344.0))
// All actual Business seats
#define MAX_BUSINESS_1 18
// First 5 rows of economy
#define MAX_BUSINESS_2 45
// Next 10 rows
#define MAX_ECONOMY_1 86
// Remaining rows
// 12 x 9
// 6 x 8
// 4 x 2
#define MAX_ECONOMY_2 164
// Total
#define MAX_PAX 313
// Max ZFW
#define MAX_PAX_ZFW(IS_IMPERIAL) ((IS_IMPERIAL) ? (400000) : (181437))
// Arms
#define ARM_PAX_CABIN_CREW_FRONT 792.0
#define ARM_PAX_BUSINESS1_LEFT 540.0
#define ARM_PAX_BUSINESS1_CENTER 540.0
#define ARM_PAX_BUSINESS1_RIGHT 540.0
#define ARM_PAX_BUSINESS2_LEFT 300.0
#define ARM_PAX_BUSINESS2_CENTER 300.0
#define ARM_PAX_BUSINESS2_RIGHT 300.0
#define ARM_PAX_ECONOMY1_LEFT -240.0
#define ARM_PAX_ECONOMY1_CENTER -240.0
#define ARM_PAX_ECONOMY1_RIGHT -240.0
#define ARM_PAX_ECONOMY2_LEFT -600.0
#define ARM_PAX_ECONOMY2_CENTER -600.0
#define ARM_PAX_ECONOMY2_RIGHT -600.0
#define ARM_PAX_CABIN_CREW_REAR -660.0
/***************************** Data structures *****************************/
typedef struct {
// SimConnect mapped
double pilot;
double firstOfficer;
double engineer;
double cabinCrewFront;
double business1Left;
double business1Center;
double business1Right;
double business2Left;
double business2Center;
double business2Right;
double economy1Left;
double economy1Center;
double economy1Right;
double economy2Left;
double economy2Center;
double economy2Right;
double cabinCrewRear;
double forwardCargo;
double rearCargo;
double leftAux;
double rightAux;
// Additional properties
double empty;
double total;
double CGTarget;
double ZFWCG;
double TOCG;
struct paxCount {
unsigned char business1;
unsigned char business2;
unsigned char economy1;
unsigned char economy2;
unsigned short total;
} paxCount;
struct sbPlanned {
double ZFW;
double GW;
unsigned short pax;
unsigned int cargo;
} sbPlanned;
} paxPayloadData_t;
typedef struct {
double pilot;
double firstOfficer;
double engineer;
double cabinCrewFront;
double business1Left;
double business1Center;
double business1Right;
double business2Left;
double business2Center;
double business2Right;
double economy1Left;
double economy1Center;
double economy1Right;
double economy2Left;
double economy2Center;
double economy2Right;
double cabinCrewRear;
double forwardCargo;
double rearCargo;
double leftAux;
double rightAux;
} paxPayloadDataSet_t;
/******************************** Functions ********************************/
//ZFW Entry, fill pax first (pax+bag), rest is cargo
void distribute(paxPayloadData_t* const targetPayload, const FuelData_t* const fuel, const double ZFWTarget, const UserData_t* const userData,
const UserOptions_t* const userOptions);
//SimBrief Entry, SB pax count and total cargo
void distribute(paxPayloadData_t* const targetPayload, const FuelData_t* const fuel, unsigned short numPax, unsigned int cargo, const UserData_t* const userData,
const UserOptions_t* const userOptions);
// Updates pax stations with their respective weights
// Used internally and used for Station Entry (pax only, cargo is ste directly)
// STATION WEIGHTS ARE NOT NORMALISED TO POUNDS
void generatePayload(paxPayloadData_t* const targetPayload, const bool isImperial, const UserOptions_t* const userOptions);
// Normalise to Pounds
// For Station Entry: CALL AFTER `generatePayload`
void normalisePayload(paxPayloadData_t* const targetPayload, const bool isImperial);
void calculateCGs(const paxPayloadData_t* const targetPayload, const FuelData_t* const fuel, double* const ZFWCG, double* const TOCG, const bool isImperial);
void load(const paxPayloadData_t* const targetPayload, const HANDLE simConnect, const bool isImperial);
void unload(const HANDLE simConnect, const bool isER);
// Based on ICAO/LH findings
const double PAX_WEIGHT(const bool isImperial, const UserOptions_t* const options);
// Based on ICAO/LH findings
const double BAG_WEIGHT(const bool isImperial, const UserOptions_t* const options);
-154
View File
@@ -1,154 +0,0 @@
#pragma once
#ifndef __INTELLISENSE__
# define MODULE_EXPORT __attribute__( ( visibility( "default" ) ) )
# define MODULE_WASM_MODNAME(mod) __attribute__((import_module(mod)))
#else
# define MODULE_EXPORT
# define MODULE_WASM_MODNAME(mod)
# define __attribute__(x)
# define __restrict__
#endif
/******************************** Constants ********************************/
// 190lbs default
#define PILOT_WEIGHT(IS_IMPERIAL) ((IS_IMPERIAL) ? (190.0) : (86.0))
// 200lbs per tank (one LD3)
#define AUX_WEIGHT(IS_IMPERIAL) ((IS_IMPERIAL) ? (200.0) : (91.0))
//PMC pallet due to 104in door
#define MAX_FRONT_CARGO(IS_IMPERIAL) ((IS_IMPERIAL) ? (6.0 * 15000.0) : (6.0 * 6804.0))
//LD3s due to 70in door, ER option takes up two slots
#define MAX_REAR_CARGO(IS_IMPERIAL, IS_ER) ((IS_IMPERIAL) ? ((IS_ER ? 12.0 : 14.0) * 3500.0) : ((IS_ER ? 12.0 : 14.0) * 1588.0))
// Max TOW
#define MAX_TOW(IS_IMPERIAL) ((IS_IMPERIAL) ? (625500) : (283722))
#define MAX_TOW_ER(IS_IMPERIAL) ((IS_IMPERIAL) ? (630500) : (285990))
// Max Fuel
#define MAX_FUEL(IS_IMPERIAL) ((IS_IMPERIAL) ? (256207) : (116213))
#define MAX_FUEL_ER(IS_IMPERIAL) ((IS_IMPERIAL) ? (282619) : (128193))
// Arms Shared
#define ARM_EMPTY -159.6
#define ARM_PILOT 984.0
#define ARM_FIRST_OFFICER 984.0
#define ARM_ENGINEER 960.0
#define ARM_FORWARD_CARGO 360.0
#define ARM_REAR_CARGO -360.0
#define ARM_LEFT_AUX 60.0
#define ARM_RIGHT_AUX 60.0
// Arms Fuel
#define ARM_MAIN1 -240.0
#define ARM_MAIN3 -240.0
#define ARM_MAIN2 120.0
#define ARM_UPPER_AUX 0.0
#define ARM_LOWER_AUX 0.0
#define ARM_MAIN1_TIP -468.0
#define ARM_MAIN3_TIP -468.0
#define ARM_TAIL -840.0
#define ARM_FORWARD_AUX1 60.0
#define ARM_FORWARD_AUX2 60.0
// MAC
#define ROOT_CHORD 34.68
#define WING_SPAN 170.5
#define WING_AREA 3648.0
#define QUARTER_MAC -165.0 //aero_center
#define TIP_CHORD ((2.0 * WING_AREA) / WING_SPAN - ROOT_CHORD)
#define TAPER_RATIO (TIP_CHORD / ROOT_CHORD)
#define MAC ((2.0 / 3.0) * ROOT_CHORD * ((1.0 + TAPER_RATIO + (TAPER_RATIO * TAPER_RATIO)) / (1.0 + TAPER_RATIO)) * 12.0)
#define LEMAC (QUARTER_MAC + (1.0 / 4.0) * MAC)
// CG Limits
#define MIN_CG 12.0
#define MAX_CG 34.0
#define CG_TOLERANCE 0.05
// GSX States
#define GSX_SERVICE_ACTIVE 5
#define GSX_SERVICE_FINISHED 6
/********************************* Macros **********************************/
// Conversions
#define TO_POUNDS(IS_IMPERIAL, VALUE) ((IS_IMPERIAL) ? (VALUE) : (VALUE) * 2.20462262185)
#define FROM_POUNDS(IS_IMPERIAL, VALUE) ((IS_IMPERIAL) ? (VALUE) : (VALUE) * (1.0 / 2.20462262185))
// MAC
#define TO_PERCENT_MAC(POS) ((((POS) - LEMAC) / MAC) * -100.0)
/********************************** ENUMS **********************************/
enum DATA_DEFINITIONS {
DATA_DEFINITION_EMPTY_WEIGHT,
DATA_DEFINITION_PAYLOAD_PAX,
DATA_DEFINITION_PAYLOAD_F,
DATA_DEFINITION_FUEL,
DATA_DEFINITION_GSX,
DATA_DEFINITION_USER_DATA,
};
enum DATA_REQUESTS {
DATA_REQUEST_EMPTY_WEIGHT,
DATA_REQUEST_PAYLOAD_PAX,
DATA_REQUEST_PAYLOAD_F,
DATA_REQUEST_FUEL,
DATA_REQUEST_GSX,
DATA_REQUEST_USER_DATA,
};
enum LOADING_STATES {
LOADING_STATE_IDLE,
LOADING_STATE_BOARDING,
LOADING_STATE_BOARDED,
LOADING_STATE_DEBOARDING,
LOADING_STATE_DEBOARDED,
};
enum CALL_MODES {
CALL_MODE_SB_SET,
CALL_MODE_ZFW_SET,
CALL_MODE_STATION_SET,
CALL_MODE_LOAD_SET,
CALL_MODE_UNLOAD_SET,
CALL_MODE_OPTIONS_SET,
CALL_MODE_GSX_RESET,
};
/***************************** Data structures *****************************/
typedef struct {
double isCargo;
double isER;
double isImperial;
} UserData_t;
typedef struct {
// SimConnect mapped
double couatlStarted; // boolean
double boardingState; // See manual, 5 => active
double deboardingState; // See manual, 5 => active
double passengersBoarded; // Num pax
double passengersDeboarded; // Num pax
double cargoBoarded; // In percent
double cargoDeboarded; // In percent
// Additional properties
enum LOADING_STATES loadingState;
} GSXData_t;
typedef struct {
// SimConnect mapped
double poundsPerGallon; // DO NOT USE
double main1;
double main3;
double main2;
double upperAux;
double lowerAux;
double main1Tip;
double main3Tip;
double tail;
double forwardAux1;
double forwardAux2;
// Additional properties
double total;
} FuelData_t;
typedef struct {
bool GSXSync;
double paxWeightKG;
double bagWeightKG;
double paxWeightLBS;
double bagWeightLBS;
} UserOptions_t;
@@ -0,0 +1,307 @@
#include "freighter.h"
// ZFW Entry
void distribute(fPayloadData_t *const targetPayload, const FuelData_t *const fuel, const double ZFWTarget,
const UserData_t *const userData) {
// Find payload, num pax and extra cargo
double payload = ZFWTarget - targetPayload->empty - targetPayload->pilot - targetPayload->firstOfficer -
targetPayload->engineer - targetPayload->leftAux - targetPayload->rightAux;
unsigned int cargo = round(payload);
distribute(targetPayload, fuel, cargo, userData);
}
// SimBrief Entry
void distribute(fPayloadData_t *const targetPayload, const FuelData_t *const fuel, unsigned int cargo,
const UserData_t *const userData) {
// Clear
targetPayload->stations.upper1 = targetPayload->stations.upper2 = targetPayload->stations.upper3 =
targetPayload->stations.upper4 = targetPayload->stations.total = 0;
targetPayload->lowerForward = targetPayload->lowerRear = 0;
unsigned short _cargo = 0;
unsigned int count = MAX_UPPER_CARGO(userData->isImperial) * 4 + MAX_FRONT_CARGO(userData->isImperial) +
MAX_REAR_CARGO(userData->isImperial, userData->isER);
// Initial distribution
while (cargo > 0 && count > 0) {
if (cargo >= 6) {
if (targetPayload->stations.upper1 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper1++;
_cargo++;
}
if (targetPayload->stations.upper2 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper2++;
_cargo++;
}
if (targetPayload->stations.upper3 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper3++;
_cargo++;
}
if (targetPayload->stations.upper4 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper4++;
_cargo++;
}
if (targetPayload->lowerForward < MAX_FRONT_CARGO(userData->isImperial)) {
targetPayload->lowerForward++;
_cargo++;
}
if (targetPayload->lowerRear < MAX_REAR_CARGO(userData->isImperial, userData->isER)) {
targetPayload->lowerRear++;
_cargo++;
}
} else if (cargo == 5) {
if (targetPayload->stations.upper1 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper1++;
_cargo++;
}
if (targetPayload->stations.upper2 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper2++;
_cargo++;
}
if (targetPayload->stations.upper3 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper3++;
_cargo++;
}
if (targetPayload->stations.upper4 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper4++;
_cargo++;
}
if (targetPayload->lowerForward < MAX_FRONT_CARGO(userData->isImperial)) {
targetPayload->lowerForward++;
_cargo++;
}
} else if (cargo == 4) {
if (targetPayload->stations.upper1 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper1++;
_cargo++;
}
if (targetPayload->stations.upper2 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper2++;
_cargo++;
}
if (targetPayload->stations.upper3 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper3++;
_cargo++;
}
if (targetPayload->stations.upper4 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper4++;
_cargo++;
}
} else if (cargo == 3) {
if (targetPayload->stations.upper1 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper1++;
_cargo++;
}
if (targetPayload->stations.upper2 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper2++;
_cargo++;
}
if (targetPayload->stations.upper3 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper3++;
_cargo++;
}
} else if (cargo == 2) {
if (targetPayload->stations.upper1 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper1++;
_cargo++;
}
if (targetPayload->stations.upper2 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper2++;
_cargo++;
}
} else if (cargo == 1) {
if (targetPayload->stations.upper1 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper1++;
_cargo++;
}
}
cargo -= _cargo;
targetPayload->stations.total += _cargo;
_cargo = 0;
count--;
}
// Refinement
count = MAX_UPPER_CARGO(userData->isImperial) * 4 + MAX_FRONT_CARGO(userData->isImperial) +
MAX_REAR_CARGO(userData->isImperial, userData->isER);
while (count > 0) {
generatePayload(targetPayload);
calculateCGs(targetPayload, fuel, userData->isImperial);
// in front of target
if (targetPayload->ZFWCG < targetPayload->CGTarget - CG_TOLERANCE) {
if (targetPayload->stations.upper1 > 0) {
targetPayload->stations.upper1--;
} else if (targetPayload->stations.upper2 > 0) {
targetPayload->stations.upper2--;
} else if (targetPayload->stations.upper3 > 0) {
targetPayload->stations.upper3--;
} else {
break;
}
if (targetPayload->stations.upper4 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper4++;
} else if (targetPayload->stations.upper3 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper3++;
} else if (targetPayload->stations.upper2 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper2++;
} else {
targetPayload->stations.upper1++;
}
}
// behind target
else if (targetPayload->ZFWCG > targetPayload->CGTarget + CG_TOLERANCE) {
if (targetPayload->stations.upper4 > 0) {
targetPayload->stations.upper4--;
} else if (targetPayload->stations.upper3 > 0) {
targetPayload->stations.upper3--;
} else if (targetPayload->stations.upper2 > 0) {
targetPayload->stations.upper2--;
} else {
break;
}
if (targetPayload->stations.upper1 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper1++;
} else if (targetPayload->stations.upper2 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper2++;
} else if (targetPayload->stations.upper3 < MAX_UPPER_CARGO(userData->isImperial)) {
targetPayload->stations.upper3++;
} else {
targetPayload->stations.upper4++;
}
} else {
break;
}
count--;
}
// Refinement cargo
count = MAX_FRONT_CARGO(userData->isImperial) + MAX_REAR_CARGO(userData->isImperial, userData->isER);
while (count > 0) {
generatePayload(targetPayload);
calculateCGs(targetPayload, fuel, userData->isImperial);
// in front of target
if (targetPayload->ZFWCG < targetPayload->CGTarget - CG_TOLERANCE) {
if (targetPayload->lowerForward > 0 && targetPayload->lowerRear < MAX_REAR_CARGO(userData->isImperial, userData->isER)) {
targetPayload->lowerForward--;
targetPayload->lowerRear++;
} else {
break;
}
}
// behind target
else if (targetPayload->ZFWCG > targetPayload->CGTarget + CG_TOLERANCE) {
if (targetPayload->lowerRear > 0 && targetPayload->lowerForward < MAX_FRONT_CARGO(userData->isImperial)) {
targetPayload->lowerRear--;
targetPayload->lowerForward++;
} else {
break;
}
} else {
break;
}
count--;
}
}
// Updates pax stations with their respective weights
// Used internally and used for Station Entry (pax only, cargo is set directly)
void generatePayload(fPayloadData_t *const targetPayload) {
targetPayload->upper1Left = targetPayload->upper1Right = (targetPayload->stations.upper1 / 2.0);
targetPayload->upper2Left = targetPayload->upper2Right = (targetPayload->stations.upper2 / 2.0);
targetPayload->upper3Left = targetPayload->upper3Right = (targetPayload->stations.upper3 / 2.0);
targetPayload->upper4Left = targetPayload->upper4Right = (targetPayload->stations.upper4 / 2.0);
targetPayload->total = targetPayload->empty + targetPayload->pilot + targetPayload->firstOfficer + targetPayload->engineer +
targetPayload->upper1Left + targetPayload->upper1Right + targetPayload->upper2Left +
targetPayload->upper2Right + targetPayload->upper3Left + targetPayload->upper3Right +
targetPayload->upper4Left + targetPayload->upper4Right + targetPayload->lowerForward +
targetPayload->lowerRear + targetPayload->leftAux + targetPayload->rightAux;
}
// Normalise to Pounds
// MANDATORY BEFORE SETTING WEIGHTS
// USE ON COPY OF GLOBAL STATE ONLY
void normalisePayload(fPayloadData_t *const targetPayload, const bool isImperial) {
targetPayload->empty = TO_POUNDS(isImperial, targetPayload->empty);
targetPayload->pilot = TO_POUNDS(isImperial, targetPayload->pilot);
targetPayload->firstOfficer = TO_POUNDS(isImperial, targetPayload->firstOfficer);
targetPayload->engineer = TO_POUNDS(isImperial, targetPayload->engineer);
targetPayload->upper1Left = TO_POUNDS(isImperial, targetPayload->upper1Left);
targetPayload->upper1Right = TO_POUNDS(isImperial, targetPayload->upper1Right);
targetPayload->upper2Left = TO_POUNDS(isImperial, targetPayload->upper2Left);
targetPayload->upper2Right = TO_POUNDS(isImperial, targetPayload->upper2Right);
targetPayload->upper3Left = TO_POUNDS(isImperial, targetPayload->upper3Left);
targetPayload->upper3Right = TO_POUNDS(isImperial, targetPayload->upper3Right);
targetPayload->upper4Left = TO_POUNDS(isImperial, targetPayload->upper4Left);
targetPayload->upper4Right = TO_POUNDS(isImperial, targetPayload->upper4Right);
targetPayload->lowerForward = TO_POUNDS(isImperial, targetPayload->lowerForward);
targetPayload->lowerRear = TO_POUNDS(isImperial, targetPayload->lowerRear);
targetPayload->leftAux = TO_POUNDS(isImperial, targetPayload->leftAux);
targetPayload->rightAux = TO_POUNDS(isImperial, targetPayload->rightAux);
}
void calculateCGs(fPayloadData_t *const targetPayload, const FuelData_t *const fuel, const bool isImperial) {
fPayloadData_t localPayload = {};
memcpy(&localPayload, targetPayload, sizeof(localPayload));
normalisePayload(&localPayload, isImperial);
double totalMoment = localPayload.empty * ARM_EMPTY + localPayload.pilot * ARM_PILOT +
localPayload.firstOfficer * ARM_FIRST_OFFICER + localPayload.engineer * ARM_ENGINEER +
localPayload.upper1Left * ARM_F_UPPER1_LEFT + localPayload.upper1Right * ARM_F_UPPER1_RIGHT +
localPayload.upper2Left * ARM_F_UPPER2_LEFT + localPayload.upper2Right * ARM_F_UPPER2_RIGHT +
localPayload.upper3Left * ARM_F_UPPER3_LEFT + localPayload.upper3Right * ARM_F_UPPER3_RIGHT +
localPayload.upper4Left * ARM_F_UPPER4_LEFT + localPayload.upper4Right * ARM_F_UPPER4_RIGHT +
localPayload.lowerForward * ARM_FORWARD_CARGO + localPayload.lowerRear * ARM_REAR_CARGO +
localPayload.leftAux * ARM_LEFT_AUX + localPayload.rightAux * ARM_RIGHT_AUX;
double totalWeight = localPayload.empty + localPayload.pilot + localPayload.firstOfficer + localPayload.engineer +
localPayload.upper1Left + localPayload.upper1Right + localPayload.upper2Left + localPayload.upper2Right +
localPayload.upper3Left + localPayload.upper3Right + localPayload.upper4Left + localPayload.upper4Right +
localPayload.lowerForward + localPayload.lowerRear + localPayload.leftAux + localPayload.rightAux;
targetPayload->ZFWCG = TO_PERCENT_MAC(totalMoment / totalWeight);
totalMoment += fuel->main1 * ARM_MAIN1 + fuel->main3 * ARM_MAIN3 + fuel->main2 * ARM_MAIN2 + fuel->upperAux * ARM_UPPER_AUX +
fuel->lowerAux * ARM_LOWER_AUX + fuel->main1Tip * ARM_MAIN1_TIP + fuel->main3Tip * ARM_MAIN3_TIP +
fuel->tail * ARM_TAIL + fuel->forwardAux1 * ARM_FORWARD_AUX1 + fuel->forwardAux2 * ARM_FORWARD_AUX2;
totalWeight += fuel->total;
targetPayload->TOCG = TO_PERCENT_MAC(totalMoment / totalWeight);
}
void load(const fPayloadData_t *const targetPayload, const FuelData_t *const fuel, const HANDLE simConnect,
const bool isImperial) {
fPayloadData_t localPayload = {};
memcpy(&localPayload, targetPayload, sizeof(localPayload));
normalisePayload(&localPayload, isImperial);
calculateCGs(&localPayload, fuel, isImperial);
localPayload._ZFWCG = localPayload.ZFWCG / 100.0;
toLog(stdout, "Payload set with ZFWCG: %f.\n", &localPayload.ZFWCG);
SimConnect_SetDataOnSimObject(simConnect, DATA_DEFINITION_PAYLOAD_F, SIMCONNECT_OBJECT_ID_USER_AIRCRAFT, 0, 0,
sizeof(fPayloadDataSet_t), &localPayload);
}
void unloadF(const HANDLE simConnect, const FuelData_t *const fuel, const double empty, const bool isER) {
fPayloadData_t localPayload = {};
localPayload.empty = empty;
localPayload.leftAux = localPayload.rightAux = isER ? AUX_WEIGHT(true) : 0;
localPayload.pilot = localPayload.firstOfficer = localPayload.engineer = PILOT_WEIGHT(true);
calculateCGs(&localPayload, fuel, true);
localPayload._ZFWCG = localPayload.ZFWCG / 100.0;
toLog(stdout, "Payload set with ZFWCG: %f.\n", &localPayload.ZFWCG);
SimConnect_SetDataOnSimObject(simConnect, DATA_DEFINITION_PAYLOAD_F, SIMCONNECT_OBJECT_ID_USER_AIRCRAFT, 0, 0,
sizeof(fPayloadDataSet_t), &localPayload);
}
+138
View File
@@ -0,0 +1,138 @@
#include "fuel.h"
void distribute(FuelData_t *const targetFuel, const double fuelTarget, const bool isImperial, const bool isER) {
double fuelLbs = TO_POUNDS(isImperial, fuelTarget);
// Equal mains
if (fuelLbs <= MAX_TANK_1_3_LBS * 3) {
double tanks = fuelLbs / 3;
// Only main
if (tanks <= MAX_TANK_1_3_TIP_LBS) {
targetFuel->main1 = tanks;
targetFuel->main3 = tanks;
targetFuel->main1Tip = 0;
targetFuel->main3Tip = 0;
}
// Tips
else if (tanks <= MAX_TANK_1_3_TIP_LBS * 2) {
double tips = tanks - MAX_TANK_1_3_TIP_LBS;
targetFuel->main1 = MAX_TANK_1_3_TIP_LBS;
targetFuel->main3 = MAX_TANK_1_3_TIP_LBS;
targetFuel->main1Tip = tips;
targetFuel->main3Tip = tips;
}
// Max tip
else {
double mains = tanks - MAX_TANK_1_3_TIP_LBS;
targetFuel->main1 = mains;
targetFuel->main3 = mains;
targetFuel->main1Tip = MAX_TANK_1_3_TIP_LBS;
targetFuel->main3Tip = MAX_TANK_1_3_TIP_LBS;
}
targetFuel->main2 = tanks;
targetFuel->upperAux = 0;
targetFuel->lowerAux = 0;
targetFuel->tail = 0;
targetFuel->forwardAux1 = 0;
targetFuel->forwardAux2 = 0;
}
// No Aux
else if (fuelLbs <= MAX_TANK_1_3_LBS * 2 + MAX_TANK_2_LBS) {
targetFuel->main1 = MAX_TANK_1_3_MAIN_LBS;
targetFuel->main3 = MAX_TANK_1_3_MAIN_LBS;
targetFuel->main1Tip = MAX_TANK_1_3_TIP_LBS;
targetFuel->main3Tip = MAX_TANK_1_3_TIP_LBS;
targetFuel->main2 = fuelLbs - MAX_TANK_1_3_LBS * 2;
targetFuel->upperAux = 0;
targetFuel->lowerAux = 0;
targetFuel->tail = 0;
targetFuel->forwardAux1 = 0;
targetFuel->forwardAux2 = 0;
}
// UPR AUX
else if (fuelLbs <= MAX_TANK_1_3_LBS * 2 + MAX_TANK_2_LBS + MAX_UPR_AUX_LBS) {
targetFuel->main1 = MAX_TANK_1_3_MAIN_LBS;
targetFuel->main3 = MAX_TANK_1_3_MAIN_LBS;
targetFuel->main1Tip = MAX_TANK_1_3_TIP_LBS;
targetFuel->main3Tip = MAX_TANK_1_3_TIP_LBS;
targetFuel->main2 = MAX_TANK_2_LBS;
targetFuel->upperAux = fuelLbs - MAX_TANK_1_3_LBS * 2 - MAX_TANK_2_LBS;
targetFuel->lowerAux = 0;
targetFuel->tail = 0;
targetFuel->forwardAux1 = 0;
targetFuel->forwardAux2 = 0;
}
// LWR AUX
else if (fuelLbs <= MAX_TANK_1_3_LBS * 2 + MAX_TANK_2_LBS + MAX_UPR_AUX_LBS + MAX_LWR_AUX_LBS) {
targetFuel->main1 = MAX_TANK_1_3_MAIN_LBS;
targetFuel->main3 = MAX_TANK_1_3_MAIN_LBS;
targetFuel->main1Tip = MAX_TANK_1_3_TIP_LBS;
targetFuel->main3Tip = MAX_TANK_1_3_TIP_LBS;
targetFuel->main2 = MAX_TANK_2_LBS;
targetFuel->upperAux = MAX_UPR_AUX_LBS;
targetFuel->lowerAux = fuelLbs - MAX_TANK_1_3_LBS * 2 - MAX_TANK_2_LBS - MAX_UPR_AUX_LBS;
targetFuel->tail = 0;
targetFuel->forwardAux1 = 0;
targetFuel->forwardAux2 = 0;
}
// Tail
else if (fuelLbs <= MAX_TANK_1_3_LBS * 2 + MAX_TANK_2_LBS + MAX_UPR_AUX_LBS + MAX_LWR_AUX_LBS + MAX_TAIL_LBS) {
targetFuel->main1 = MAX_TANK_1_3_MAIN_LBS;
targetFuel->main3 = MAX_TANK_1_3_MAIN_LBS;
targetFuel->main1Tip = MAX_TANK_1_3_TIP_LBS;
targetFuel->main3Tip = MAX_TANK_1_3_TIP_LBS;
targetFuel->main2 = MAX_TANK_2_LBS;
targetFuel->upperAux = MAX_UPR_AUX_LBS;
targetFuel->lowerAux = MAX_LWR_AUX_LBS;
targetFuel->tail = fuelLbs - MAX_TANK_1_3_LBS * 2 - MAX_TANK_2_LBS - MAX_UPR_AUX_LBS - MAX_LWR_AUX_LBS;
targetFuel->forwardAux1 = 0;
targetFuel->forwardAux2 = 0;
} else if (isER) {
targetFuel->main1 = MAX_TANK_1_3_MAIN_LBS;
targetFuel->main3 = MAX_TANK_1_3_MAIN_LBS;
targetFuel->main1Tip = MAX_TANK_1_3_TIP_LBS;
targetFuel->main3Tip = MAX_TANK_1_3_TIP_LBS;
targetFuel->main2 = MAX_TANK_2_LBS;
targetFuel->upperAux = MAX_UPR_AUX_LBS;
targetFuel->lowerAux = MAX_LWR_AUX_LBS;
targetFuel->tail = MAX_TAIL_LBS;
fuelLbs = fuelLbs - MAX_TANK_1_3_LBS * 2 - MAX_TANK_2_LBS - MAX_UPR_AUX_LBS - MAX_LWR_AUX_LBS - MAX_TAIL_LBS;
targetFuel->forwardAux1 = min(fuelLbs / 2, MAX_FWD_AUX_LBS);
targetFuel->forwardAux2 = min(fuelLbs / 2, MAX_FWD_AUX_LBS);
}
targetFuel->total = targetFuel->main1 + targetFuel->main3 + targetFuel->main2 + targetFuel->upperAux + targetFuel->lowerAux +
targetFuel->main1Tip + targetFuel->main3Tip + targetFuel->tail + targetFuel->forwardAux1 +
targetFuel->forwardAux2;
}
void distribute(FuelData_t *const targetFuel, const double fuelTarget, const UserData_t *const userData) {
distribute(targetFuel, fuelTarget, userData->isImperial, userData->isER);
}
void fuel(const FuelData_t *const targetFuel, const HANDLE simConnect) {
FuelDataSet_t localFuel = {};
localFuel.main1 = min(MAX_TANK_1_3_GAL, (targetFuel->main1 + targetFuel->main1Tip) / LBS_PER_GAL);
localFuel.main2 = min(MAX_TANK_2_GAL, targetFuel->main2 / LBS_PER_GAL);
localFuel.main3 = min(MAX_TANK_1_3_GAL, (targetFuel->main3 + targetFuel->main3Tip) / LBS_PER_GAL);
localFuel.upperAux = min(MAX_UPR_AUX_GAL, targetFuel->upperAux / LBS_PER_GAL);
localFuel.lowerAux = min(MAX_LWR_AUX_GAL, targetFuel->lowerAux / LBS_PER_GAL);
localFuel.tail = min(MAX_TAIL_GAL, targetFuel->tail / LBS_PER_GAL);
localFuel.forwardAux1 = min(MAX_FWD_AUX_GAL, targetFuel->forwardAux1 / LBS_PER_GAL);
localFuel.forwardAux2 = min(MAX_FWD_AUX_GAL, targetFuel->forwardAux2 / LBS_PER_GAL);
SimConnect_SetDataOnSimObject(simConnect, DATA_DEFINITION_FUEL_SET, SIMCONNECT_OBJECT_ID_USER_AIRCRAFT, 0, 0,
sizeof(FuelDataSet_t), &localFuel);
}
File diff suppressed because it is too large Load Diff
+49
View File
@@ -0,0 +1,49 @@
#include "log.h"
void toLog(FILE *file, const char *format, double *optional) {
static FILE *logFile;
static bool logFileFailed = false;
if (logFile == NULL) {
logFile = fopen("\\work\\toLog.txt", "w");
if (logFile == NULL) {
logFileFailed = true;
toLog(stderr, "Error creating logfile.\n");
} else {
toLog(stdout, "Logfile created.\n");
}
}
if (!logFileFailed) {
time_t rawtime;
time(&rawtime);
char *_new = (char *)calloc(strlen(format) + 24 + 1, sizeof(char));
if (_new == NULL) {
fprintf(stderr, MODULE_NAME "Failed to allocate string for toLog.\n");
return;
}
strftime(_new, 24, "%FT%TZ | ", gmtime(&rawtime));
strncat(_new, format, strlen(format));
if (optional != nullptr) fprintf(logFile, _new, *optional);
else
fprintf(logFile, _new);
fflush(logFile);
free(_new);
}
char *_new = (char *)calloc(strlen(format) + strlen(MODULE_NAME) + 1, sizeof(char));
if (_new == NULL) {
fprintf(stderr, MODULE_NAME "Failed to allocate string for internal console.\n");
return;
}
strncpy(_new, MODULE_NAME, strlen(MODULE_NAME));
strncat(_new, format, strlen(format));
if (optional != nullptr) fprintf(file, _new, *optional);
else
fprintf(file, _new);
free(_new);
}
+333
View File
@@ -0,0 +1,333 @@
#include "pax.h"
// ZFW Entry, fill pax first (pax+bag), rest is cargo
void distribute(paxPayloadData_t *const targetPayload, const FuelData_t *const fuel, const double ZFWTarget,
const UserData_t *const userData, const UserOptions_t *const userOptions) {
// Find payload, num pax and extra cargo
double payload = ZFWTarget - targetPayload->empty - targetPayload->pilot - targetPayload->firstOfficer -
targetPayload->engineer - targetPayload->cabinCrewFront - targetPayload->cabinCrewRear -
targetPayload->leftAux - targetPayload->rightAux;
unsigned short numPax = max(0.0, min((double)MAX_PAX, floor(payload / (PAX_WEIGHT(userData->isImperial, userOptions) +
BAG_WEIGHT(userData->isImperial, userOptions)))));
unsigned int cargo = round(payload - numPax * PAX_WEIGHT(userData->isImperial, userOptions) -
numPax * BAG_WEIGHT(userData->isImperial, userOptions));
distribute(targetPayload, fuel, numPax, cargo, userData, userOptions);
}
// SimBrief Entry, SB pax count and extra cargo
void distribute(paxPayloadData_t *const targetPayload, const FuelData_t *const fuel, unsigned short numPax, unsigned int cargo,
const UserData_t *const userData, const UserOptions_t *const userOptions) {
// Clear
targetPayload->paxCount.business1 = targetPayload->paxCount.business2 = targetPayload->paxCount.economy1 =
targetPayload->paxCount.economy2 = targetPayload->paxCount.total = 0;
targetPayload->forwardCargo = targetPayload->rearCargo = 0;
unsigned short _numPax = 0;
unsigned int count = MAX_PAX;
// Initial distribution pax + bags
while (numPax > 0 && count > 0) {
if (numPax >= 4) {
if (targetPayload->paxCount.business1 < MAX_BUSINESS_1) {
targetPayload->paxCount.business1++;
_numPax++;
}
if (targetPayload->paxCount.business2 < MAX_BUSINESS_2) {
targetPayload->paxCount.business2++;
_numPax++;
}
if (targetPayload->paxCount.economy1 < MAX_ECONOMY_1) {
targetPayload->paxCount.economy1++;
_numPax++;
}
if (targetPayload->paxCount.economy2 < MAX_ECONOMY_2) {
targetPayload->paxCount.economy2++;
_numPax++;
}
} else if (numPax == 3) {
if (targetPayload->paxCount.business2 < MAX_BUSINESS_2) {
targetPayload->paxCount.business2++;
_numPax++;
}
if (targetPayload->paxCount.economy1 < MAX_ECONOMY_1) {
targetPayload->paxCount.economy1++;
_numPax++;
}
if (targetPayload->paxCount.economy2 < MAX_ECONOMY_2) {
targetPayload->paxCount.economy2++;
_numPax++;
}
} else if (numPax == 2) {
if (targetPayload->paxCount.economy1 < MAX_ECONOMY_1) {
targetPayload->paxCount.economy1++;
_numPax++;
}
if (targetPayload->paxCount.economy2 < MAX_ECONOMY_2) {
targetPayload->paxCount.economy2++;
_numPax++;
}
} else if (numPax == 1) {
if (targetPayload->paxCount.economy2 < MAX_ECONOMY_2) {
targetPayload->paxCount.economy2++;
_numPax++;
}
}
numPax -= _numPax;
targetPayload->paxCount.total += _numPax;
if (_numPax % 2 == 0) {
targetPayload->forwardCargo += (_numPax / 2) * BAG_WEIGHT(userData->isImperial, userOptions);
targetPayload->rearCargo += (_numPax / 2) * BAG_WEIGHT(userData->isImperial, userOptions);
} else {
_numPax--;
targetPayload->forwardCargo += (_numPax / 2 + 1) * BAG_WEIGHT(userData->isImperial, userOptions);
targetPayload->rearCargo += (_numPax / 2) * BAG_WEIGHT(userData->isImperial, userOptions);
}
_numPax = 0;
count--;
}
count = MAX_FRONT_CARGO(userData->isImperial);
// Initial distribution of remaining cargo
while (cargo > 0 && count > 0) {
if (targetPayload->forwardCargo < MAX_FRONT_CARGO(userData->isImperial)) {
targetPayload->forwardCargo++;
cargo--;
}
if (targetPayload->rearCargo < MAX_REAR_CARGO(userData->isImperial, userData->isER) && cargo > 0) {
targetPayload->rearCargo++;
cargo--;
}
count--;
}
// Refinement pax
count = MAX_PAX;
unsigned char minBusiness1 = round(targetPayload->paxCount.business1 / 3);
unsigned char minBusiness2 = round(targetPayload->paxCount.business2 / 3);
unsigned char minEconomy1 = round(targetPayload->paxCount.economy1 / 3);
unsigned char minEconomy2 = round(targetPayload->paxCount.economy2 / 3);
while (count > 0) {
generatePayload(targetPayload, userData->isImperial, userOptions);
calculateCGs(targetPayload, fuel, userData->isImperial);
// in front of target
if (targetPayload->ZFWCG < targetPayload->CGTarget - CG_TOLERANCE) {
if (targetPayload->paxCount.business1 > minBusiness1) {
targetPayload->paxCount.business1--;
} else if (targetPayload->paxCount.business2 > minBusiness2) {
targetPayload->paxCount.business2--;
} else if (targetPayload->paxCount.economy1 > minEconomy1) {
targetPayload->paxCount.economy1--;
} else {
break;
}
if (targetPayload->paxCount.economy2 < MAX_ECONOMY_2) {
targetPayload->paxCount.economy2++;
} else if (targetPayload->paxCount.economy1 < MAX_ECONOMY_1) {
targetPayload->paxCount.economy1++;
} else if (targetPayload->paxCount.business2 < MAX_BUSINESS_2) {
targetPayload->paxCount.business2++;
} else {
targetPayload->paxCount.business1++;
}
}
// behind target
else if (targetPayload->ZFWCG > targetPayload->CGTarget + CG_TOLERANCE) {
if (targetPayload->paxCount.economy2 > minEconomy2) {
targetPayload->paxCount.economy2--;
} else if (targetPayload->paxCount.economy1 > minEconomy1) {
targetPayload->paxCount.economy1--;
} else if (targetPayload->paxCount.business2 > minBusiness2) {
targetPayload->paxCount.business2--;
} else {
break;
}
if (targetPayload->paxCount.business1 < MAX_BUSINESS_1) {
targetPayload->paxCount.business1++;
} else if (targetPayload->paxCount.business2 < MAX_BUSINESS_2) {
targetPayload->paxCount.business2++;
} else if (targetPayload->paxCount.economy1 < MAX_ECONOMY_1) {
targetPayload->paxCount.economy1++;
} else {
targetPayload->paxCount.economy2++;
}
} else {
break;
}
count--;
}
// Refinement cargo
count = MAX_FRONT_CARGO(userData->isImperial) + MAX_REAR_CARGO(userData->isImperial, userData->isER);
while (count > 0) {
generatePayload(targetPayload, userData->isImperial, userOptions);
calculateCGs(targetPayload, fuel, userData->isImperial);
// in front of target
if (targetPayload->ZFWCG < targetPayload->CGTarget - CG_TOLERANCE) {
if (targetPayload->forwardCargo > 0 && targetPayload->rearCargo < MAX_REAR_CARGO(userData->isImperial, userData->isER)) {
if (targetPayload->forwardCargo > BAG_WEIGHT(userData->isImperial, userOptions) &&
targetPayload->rearCargo < MAX_FRONT_CARGO(userData->isImperial) - BAG_WEIGHT(userData->isImperial, userOptions)) {
targetPayload->forwardCargo -= BAG_WEIGHT(userData->isImperial, userOptions);
targetPayload->rearCargo += BAG_WEIGHT(userData->isImperial, userOptions);
} else {
targetPayload->forwardCargo--;
targetPayload->rearCargo++;
}
} else {
break;
}
}
// behind target
else if (targetPayload->ZFWCG > targetPayload->CGTarget + CG_TOLERANCE) {
if (targetPayload->rearCargo > 0 && targetPayload->forwardCargo < MAX_FRONT_CARGO(userData->isImperial)) {
if (targetPayload->rearCargo > BAG_WEIGHT(userData->isImperial, userOptions) &&
targetPayload->forwardCargo <
MAX_REAR_CARGO(userData->isImperial, userData->isER) - BAG_WEIGHT(userData->isImperial, userOptions)) {
targetPayload->rearCargo -= BAG_WEIGHT(userData->isImperial, userOptions);
targetPayload->forwardCargo += BAG_WEIGHT(userData->isImperial, userOptions);
} else {
targetPayload->rearCargo--;
targetPayload->forwardCargo++;
}
} else {
break;
}
} else {
break;
}
count--;
}
}
// Updates pax stations with their respective weights
// Used internally and used for Station Entry (pax only, cargo is set directly)
void generatePayload(paxPayloadData_t *const targetPayload, const bool isImperial, const UserOptions_t *const userOptions) {
targetPayload->business1Left = targetPayload->business1Center = targetPayload->business1Right =
(targetPayload->paxCount.business1 / 3.0) * PAX_WEIGHT(isImperial, userOptions);
targetPayload->business2Left = targetPayload->business2Center = targetPayload->business2Right =
(targetPayload->paxCount.business2 / 3.0) * PAX_WEIGHT(isImperial, userOptions);
targetPayload->economy1Left = targetPayload->economy1Center = targetPayload->economy1Right =
(targetPayload->paxCount.economy1 / 3.0) * PAX_WEIGHT(isImperial, userOptions);
targetPayload->economy2Left = targetPayload->economy2Center = targetPayload->economy2Right =
(targetPayload->paxCount.economy2 / 3.0) * PAX_WEIGHT(isImperial, userOptions);
targetPayload->total = targetPayload->empty + targetPayload->pilot + targetPayload->firstOfficer + targetPayload->engineer +
targetPayload->cabinCrewFront + targetPayload->business1Left + targetPayload->business1Center +
targetPayload->business1Right + targetPayload->business2Left + targetPayload->business2Center +
targetPayload->business2Right + targetPayload->economy1Left + targetPayload->economy1Center +
targetPayload->economy1Right + targetPayload->economy2Left + targetPayload->economy2Center +
targetPayload->economy2Right + targetPayload->cabinCrewRear + targetPayload->forwardCargo +
targetPayload->rearCargo + targetPayload->leftAux + targetPayload->rightAux;
}
// Normalise to Pounds
// MANDATORY BEFORE SETTING WEIGHTS
// USE ON COPY OF GLOBAL STATE ONLY
void normalisePayload(paxPayloadData_t *const targetPayload, const bool isImperial) {
targetPayload->empty = TO_POUNDS(isImperial, targetPayload->empty);
targetPayload->pilot = TO_POUNDS(isImperial, targetPayload->pilot);
targetPayload->firstOfficer = TO_POUNDS(isImperial, targetPayload->firstOfficer);
targetPayload->engineer = TO_POUNDS(isImperial, targetPayload->engineer);
targetPayload->cabinCrewFront = TO_POUNDS(isImperial, targetPayload->cabinCrewFront);
targetPayload->business1Left = TO_POUNDS(isImperial, targetPayload->business1Left);
targetPayload->business1Center = TO_POUNDS(isImperial, targetPayload->business1Center);
targetPayload->business1Right = TO_POUNDS(isImperial, targetPayload->business1Right);
targetPayload->business2Left = TO_POUNDS(isImperial, targetPayload->business2Left);
targetPayload->business2Center = TO_POUNDS(isImperial, targetPayload->business2Center);
targetPayload->business2Right = TO_POUNDS(isImperial, targetPayload->business2Right);
targetPayload->economy1Left = TO_POUNDS(isImperial, targetPayload->economy1Left);
targetPayload->economy1Center = TO_POUNDS(isImperial, targetPayload->economy1Center);
targetPayload->economy1Right = TO_POUNDS(isImperial, targetPayload->economy1Right);
targetPayload->economy2Left = TO_POUNDS(isImperial, targetPayload->economy2Left);
targetPayload->economy2Center = TO_POUNDS(isImperial, targetPayload->economy2Center);
targetPayload->economy2Right = TO_POUNDS(isImperial, targetPayload->economy2Right);
targetPayload->cabinCrewRear = TO_POUNDS(isImperial, targetPayload->cabinCrewRear);
targetPayload->forwardCargo = TO_POUNDS(isImperial, targetPayload->forwardCargo);
targetPayload->rearCargo = TO_POUNDS(isImperial, targetPayload->rearCargo);
targetPayload->leftAux = TO_POUNDS(isImperial, targetPayload->leftAux);
targetPayload->rightAux = TO_POUNDS(isImperial, targetPayload->rightAux);
}
void calculateCGs(paxPayloadData_t *const targetPayload, const FuelData_t *const fuel, const bool isImperial) {
paxPayloadData_t localPayload = {};
memcpy(&localPayload, targetPayload, sizeof(localPayload));
normalisePayload(&localPayload, isImperial);
double totalMoment =
localPayload.empty * ARM_EMPTY + localPayload.pilot * ARM_PILOT + localPayload.firstOfficer * ARM_FIRST_OFFICER +
localPayload.engineer * ARM_ENGINEER + localPayload.cabinCrewFront * ARM_PAX_CABIN_CREW_FRONT +
localPayload.business1Left * ARM_PAX_BUSINESS1_LEFT + localPayload.business1Center * ARM_PAX_BUSINESS1_CENTER +
localPayload.business1Right * ARM_PAX_BUSINESS1_RIGHT + localPayload.business2Left * ARM_PAX_BUSINESS2_LEFT +
localPayload.business2Center * ARM_PAX_BUSINESS2_CENTER + localPayload.business2Right * ARM_PAX_BUSINESS2_RIGHT +
localPayload.economy1Left * ARM_PAX_ECONOMY1_LEFT + localPayload.economy1Center * ARM_PAX_ECONOMY1_CENTER +
localPayload.economy1Right * ARM_PAX_ECONOMY1_RIGHT + localPayload.economy2Left * ARM_PAX_ECONOMY2_LEFT +
localPayload.economy2Center * ARM_PAX_ECONOMY2_CENTER + localPayload.economy2Right * ARM_PAX_ECONOMY2_RIGHT +
localPayload.cabinCrewRear * ARM_PAX_CABIN_CREW_REAR + localPayload.forwardCargo * ARM_FORWARD_CARGO +
localPayload.rearCargo * ARM_REAR_CARGO + localPayload.leftAux * ARM_LEFT_AUX + localPayload.rightAux * ARM_RIGHT_AUX;
double totalWeight = localPayload.empty + localPayload.pilot + localPayload.firstOfficer + localPayload.engineer +
localPayload.cabinCrewFront + localPayload.business1Left + localPayload.business1Center +
localPayload.business1Right + localPayload.business2Left + localPayload.business2Center +
localPayload.business2Right + localPayload.economy1Left + localPayload.economy1Center +
localPayload.economy1Right + localPayload.economy2Left + localPayload.economy2Center +
localPayload.economy2Right + localPayload.cabinCrewRear + localPayload.forwardCargo +
localPayload.rearCargo + localPayload.leftAux + localPayload.rightAux;
targetPayload->ZFWCG = TO_PERCENT_MAC(totalMoment / totalWeight);
totalMoment += fuel->main1 * ARM_MAIN1 + fuel->main3 * ARM_MAIN3 + fuel->main2 * ARM_MAIN2 + fuel->upperAux * ARM_UPPER_AUX +
fuel->lowerAux * ARM_LOWER_AUX + fuel->main1Tip * ARM_MAIN1_TIP + fuel->main3Tip * ARM_MAIN3_TIP +
fuel->tail * ARM_TAIL + fuel->forwardAux1 * ARM_FORWARD_AUX1 + fuel->forwardAux2 * ARM_FORWARD_AUX2;
totalWeight += fuel->total;
targetPayload->TOCG = TO_PERCENT_MAC(totalMoment / totalWeight);
}
void load(const paxPayloadData_t *const targetPayload, const FuelData_t *const fuel, const HANDLE simConnect,
const bool isImperial) {
paxPayloadData_t localPayload = {};
memcpy(&localPayload, targetPayload, sizeof(localPayload));
normalisePayload(&localPayload, isImperial);
calculateCGs(&localPayload, fuel, isImperial);
localPayload._ZFWCG = localPayload.ZFWCG / 100.0;
toLog(stdout, "Payload set with ZFWCG: %f.\n", &localPayload.ZFWCG);
SimConnect_SetDataOnSimObject(simConnect, DATA_DEFINITION_PAYLOAD_PAX, SIMCONNECT_OBJECT_ID_USER_AIRCRAFT, 0, 0,
sizeof(paxPayloadDataSet_t), &localPayload);
}
void unload(const HANDLE simConnect, const FuelData_t *const fuel, const double empty, const bool isER) {
paxPayloadData_t localPayload = {};
localPayload.empty = empty;
localPayload.cabinCrewFront = FRONT_CREW_WEIGHT(true);
localPayload.cabinCrewRear = REAR_CREW_WEIGHT(true);
localPayload.leftAux = localPayload.rightAux = isER ? AUX_WEIGHT(true) : 0;
localPayload.pilot = localPayload.firstOfficer = localPayload.engineer = PILOT_WEIGHT(true);
calculateCGs(&localPayload, fuel, true);
localPayload._ZFWCG = localPayload.ZFWCG / 100.0;
toLog(stdout, "Payload set with ZFWCG: %f.\n", &localPayload.ZFWCG);
SimConnect_SetDataOnSimObject(simConnect, DATA_DEFINITION_PAYLOAD_PAX, SIMCONNECT_OBJECT_ID_USER_AIRCRAFT, 0, 0,
sizeof(paxPayloadDataSet_t), &localPayload);
}
double PAX_WEIGHT(const bool isImperial, const UserOptions_t *const options) {
return (isImperial) ? (options->paxWeightLBS) : (options->paxWeightKG);
}
double BAG_WEIGHT(const bool isImperial, const UserOptions_t *const options) {
return (isImperial) ? (options->bagWeightLBS) : (options->bagWeightKG);
}
@@ -0,0 +1,64 @@
const fs = require('fs');
const path = require('path');
const BASE_DIRS = ['.'];
let THRESHOLD = parseInt(process.argv.at(-1) ?? 2048);
THRESHOLD = isNaN(THRESHOLD) ? 2048 : THRESHOLD;
console.log(`Threshold at ${THRESHOLD} bytes`);
let LEVEL =
process.argv.includes('--level') ? process.argv[process.argv.findIndex((p) => p === '--level') + 1] : undefined;
if (LEVEL !== 'info') LEVEL = undefined;
console.log(`Log level ${LEVEL ?? 'default'}`);
BASE_DIRS.forEach((BASE_DIR) => {
console.log(`Analysis for ${BASE_DIR}`);
const output = fs.openSync(path.join(BASE_DIR, 'stack-analysis.log'), 'w');
let functions = [];
let files = fs.readdirSync(BASE_DIR);
files = files.filter((file) => file.endsWith('.su'));
files.forEach((file) => {
const content = fs.readFileSync(path.join(BASE_DIR, file), {
encoding: 'utf8',
});
const _functions = content.split('\n');
_functions.forEach((_function) => {
const fields = _function.split('\t');
if (fields.length != 3) return;
functions.push({
name: fields[0],
cost: parseInt(fields[1]),
type: fields[2],
});
});
fs.unlinkSync(path.join(BASE_DIR, file));
});
functions = functions.sort((a, b) => b.cost - a.cost);
functions.forEach((_function) => {
if (_function.cost === THRESHOLD) {
console.warn(
`\x1b[33mFunction \x1b[1m${_function.name}\x1b[0m \x1b[33mat threshold (\x1b[1m${_function.cost}\x1b[0m\x1b[33m)\x1b[0m`
);
} else if (_function.cost >= THRESHOLD) {
console.error(
`\x1b[31mFunction \x1b[1m${_function.name}\x1b[0m \x1b[31mexceeds threshold (\x1b[1m${_function.cost}\x1b[0m\x1b[31m)\x1b[0m`
);
} else if (LEVEL === 'info') {
console.error(
`\x1b[32mFunction \x1b[1m${_function.name}\x1b[0m \x1b[32mbelow threshold (\x1b[1m${_function.cost}\x1b[0m\x1b[32m)\x1b[0m`
);
}
fs.writeSync(output, `${_function.cost}\t${_function.type}\t${_function.name}\n`, null, { encoding: 'utf8' });
});
fs.closeSync(output);
});
View File
+1 -1
View File
@@ -1 +1 @@
Copy-Item .\PackageSources\wasm-module\MSFS\Debug\load-manager.wasm .\PackageSources\SimObjects\Airplanes\TFDi_Design_MD-11\panel Copy-Item .\PackageSources\wasm-module\MSFS\Debug\load-manager.wasm .\PackageSources\SimObjects\Airplanes\TFDi_Design_MD-11\common\panel
+1 -1
View File
@@ -1 +1 @@
Copy-Item .\PackageSources\wasm-module\MSFS\Release\load-manager.wasm .\PackageSources\SimObjects\Airplanes\TFDi_Design_MD-11\panel Copy-Item .\PackageSources\wasm-module\MSFS\Release\load-manager.wasm .\PackageSources\SimObjects\Airplanes\TFDi_Design_MD-11\common\panel
+19 -24
View File
@@ -1,45 +1,40 @@
const { applyPatch } = require("diff"); const { applyPatch } = require('diff');
const fs = require("fs"); const fs = require('fs');
const util = require("node:util"); const readline = require('readline');
const exec = util.promisify(require("node:child_process").exec);
const readline = require("readline");
const outPath = const outPath = './PackageSources/html_ui/Pages/VCockpit/Instruments/aircraft_efb/KH_TFDi_MD11_efb';
"./PackageSources/html_ui/Pages/VCockpit/Instruments/aircraft_efb/KH_TFDi_MD11_efb";
fs.copyFileSync("./EFB/efb.css", `${outPath}/efb.css`); let file1Contents = fs.readFileSync('./EFB/efb.js').toString();
let patch = fs.readFileSync('./EFB/efb-js.patch').toString();
let file1Contents = fs.readFileSync("./EFB/efb.js").toString();
let patch = fs.readFileSync("./EFB/efb-js.patch").toString();
let patchedFile = applyPatch(file1Contents, patch); let patchedFile = applyPatch(file1Contents, patch);
fs.writeFileSync(`${outPath}/efb.js`, patchedFile); fs.writeFileSync(`${outPath}/efb.js`, patchedFile);
file1Contents = fs.readFileSync("./EFB/efb.index.js").toString(); file1Contents = fs.readFileSync('./EFB/efb.index.js').toString();
patch = fs.readFileSync("./EFB/efb-index-js.patch").toString(); patch = fs.readFileSync('./EFB/efb-index-js.patch').toString();
patchedFile = applyPatch(file1Contents, patch); patchedFile = applyPatch(file1Contents, patch);
fs.writeFileSync(`${outPath}/efb.index.js`, patchedFile); fs.writeFileSync(`${outPath}/efb.index.js`, patchedFile);
file1Contents = fs.readFileSync("./EFB/efb.html").toString(); file1Contents = fs.readFileSync('./EFB/efb.html').toString();
patch = fs.readFileSync("./EFB/efb-html.patch").toString(); patch = fs.readFileSync('./EFB/efb-html.patch').toString();
patchedFile = applyPatch(file1Contents, patch); patchedFile = applyPatch(file1Contents, patch);
fs.writeFileSync(`${outPath}/efb.html`, patchedFile); fs.writeFileSync(`${outPath}/efb.html`, patchedFile);
var output = ""; var output = '';
var lineReader = readline.createInterface({ var lineReader = readline.createInterface({
input: fs.createReadStream(`${outPath}/App.js`), input: fs.createReadStream(`${outPath}/App.js`),
}); });
lineReader.on("line", (line) => { lineReader.on('line', (line) => {
if (line.startsWith("import")) { if (line.startsWith('import')) {
output += "// " + line + "\n"; output += '// ' + line + '\n';
} else if (line.startsWith("export")) { } else if (line.startsWith('export')) {
output += "window.KH_LM = App;\n"; output += 'window.KH_LM = App;\n';
} else { } else {
output += line + "\n"; output += line + '\n';
} }
}); });
lineReader.on("close", () => { lineReader.on('close', () => {
fs.writeFile(`${outPath}/App.js`, output, (err) => { fs.writeFile(`${outPath}/App.js`, output, (err) => {
if (err) console.log(err); if (err) console.log(err);
console.log("Import/Export removed."); console.log('Import/Export removed.');
}); });
}); });
+24 -3
View File
@@ -1,5 +1,26 @@
{ {
"devDependencies": { "name": "xkhofmann-tfdidesign-md11-load-manager",
"diff": "^8.0.2" "version": "0.0.1",
} "description": "TFDi MD11 Load Manager project",
"scripts": {
"debugger": "cd \"$env:MSFS_SDK/Tools/CoherentGT Debugger\" && ./Debugger.exe",
"locale": "cd \"$env:MSFS_SDK/Tools/MSFS_Localization\" && ./MSFSLocalizationManager.exe",
"build": "pnpm -r build",
"release": "pnpm -r release",
"archive:2024": "Compress-Archive -Path Packages/xkhofmann-tfdidesign-md11-load-manager -DestinationPath Packages/xkhofmann-tfdidesign-md11-load-manager",
"package": "rimraf Packages && pnpm release && & \"$env:MSFS2024_SDK/Tools/bin/fspackagetool.exe\" -nopause xkhofmann-tfdidesign-md11-load-manager.xml && pnpm archive:2024"
},
"keywords": [],
"author": "Kilian Kurt Hofmann",
"license": "MIT",
"packageManager": "pnpm@10.25.0",
"engines": {
"node": ">=22"
},
"devDependencies": {
"diff": "^8.0.2"
},
"dependencies": {
"rimraf": "^6.1.3"
}
} }
+6012
View File
File diff suppressed because it is too large Load Diff
+3
View File
@@ -0,0 +1,3 @@
packages:
- PackageSources/js-bundle
- PackageSources/wasm-module
@@ -1,19 +1,51 @@
{ {
"folders": [ "folders": [
{ {
"path": "." "path": ".",
} },
], ],
"settings": { "settings": {
"cSpell.words": [ "cSpell.words": [
"AUXLWR",
"AUXUPR",
"bksp",
"CMCDU",
"couatl", "couatl",
"Deboarded",
"DEBOARDED", "DEBOARDED",
"deboarding", "deboarding",
"Deinitialized",
"EXTCTL",
"FCOMs",
"FSDT",
"fspackagetool",
"FUELHOSE",
"FWDAUXL",
"FWDAUXR",
"HRESULT",
"htmlgauge",
"ISFD",
"khofmann", "khofmann",
"LEMAC",
"LMCDU",
"mbelow",
"mexceeds",
"msfs",
"MSFS",
"nopause",
"NUMPASSENGERS",
"RMCDU",
"SIMCONNECT",
"SIMOBJECT",
"SIMOBJECTS",
"tfdi", "tfdi",
"TFDI", "TFDI",
"tfdidesign",
"TOCG", "TOCG",
"ZFWCG" "Vcockpit",
] "xkhofmann",
} "XPNDR",
"ZFWCG",
],
},
} }
@@ -0,0 +1,9 @@
<UserSettings>
<CheckedOutPackages>
<Package Name="xkhofmann-tfdidesign-md11-load-manager"/>
</CheckedOutPackages>
<SelectedPackages/>
<Filter/>
<ShowOnlyEdited>false</ShowOnlyEdited>
</UserSettings>