Compare commits
32 Commits
95637c9f7f
...
2024
| Author | SHA1 | Date | |
|---|---|---|---|
| 122a93461d | |||
| 310b5f39dc | |||
| 3b003f3363 | |||
| 818277edcf | |||
| 73ebaa311b | |||
| d96ea55b31 | |||
| b379a6dccd | |||
| 766d956008 | |||
| ec9facd4d9 | |||
| d805d315f8 | |||
| ccb96e15e2 | |||
| f708bbf72c | |||
| 695e02d143 | |||
| 22a41749d6 | |||
| cd1f2048b0 | |||
| dcc1161012 | |||
| 98f72d5c83 | |||
| 5e60d0d45e | |||
| 872161bc8a | |||
| 9432dd1d84 | |||
| 5ad5f16bdb | |||
| 3d2e439674 | |||
| 5a80249f0e | |||
| 16de21ffec | |||
| b266a82905 | |||
| e27aee0f14 | |||
| ee43ae9363 | |||
| acf4b9ee47 | |||
| 04e5ec4251 | |||
| dee5447bed | |||
| 9000d516ae | |||
| d75518517a |
@@ -0,0 +1,6 @@
|
||||
---
|
||||
BasedOnStyle: LLVM
|
||||
ColumnLimit: 130
|
||||
IndentCaseLabels: true
|
||||
AllowShortIfStatementsOnASingleLine: Always
|
||||
AllowShortLoopsOnASingleLine: true
|
||||
+9
-1
@@ -1,5 +1,6 @@
|
||||
Packages
|
||||
_PackageInt
|
||||
PackagesMetadata
|
||||
PackageSources/js-bundle/__generated__
|
||||
PackageSources/js-bundle/.rollup.cache
|
||||
PackageSources/js-bundle/node_modules
|
||||
@@ -13,4 +14,11 @@ node_modules
|
||||
*.blend1
|
||||
*.tsbuildinfo
|
||||
|
||||
PackageSources/SimObjects/Airplanes/**/panel/*.wasm
|
||||
PackageSources/SimObjects/Airplanes/**/panel/*.wasm
|
||||
EFB/efb.css
|
||||
EFB/efb.js
|
||||
EFB/efb.html
|
||||
EFB/efb.index.js
|
||||
EFB/patched/
|
||||
|
||||
*.su
|
||||
Vendored
+3
@@ -18,5 +18,8 @@
|
||||
},
|
||||
"[xml]": {
|
||||
"editor.defaultFormatter": "redhat.vscode-xml"
|
||||
},
|
||||
"[typescriptreact]": {
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||
}
|
||||
}
|
||||
+10
-8
@@ -1,13 +1,15 @@
|
||||
diff --git a/PackageSources/html_ui/Pages/VCockpit/Instruments/aircraft_efb/KH_TFDi_MD11_efb/efb.html b/PackageSources/html_ui/Pages/VCockpit/Instruments/aircraft_efb/KH_TFDi_MD11_efb/efb.html
|
||||
index a2e14f7..515e0d9 100644
|
||||
--- a/PackageSources/html_ui/Pages/VCockpit/Instruments/aircraft_efb/KH_TFDi_MD11_efb/efb.html
|
||||
+++ b/PackageSources/html_ui/Pages/VCockpit/Instruments/aircraft_efb/KH_TFDi_MD11_efb/efb.html
|
||||
@@ -7,4 +7,6 @@
|
||||
Index: EFB.html
|
||||
===================================================================
|
||||
--- EFB.html
|
||||
+++ EFB.html
|
||||
@@ -4,7 +4,8 @@
|
||||
</div>
|
||||
</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>
|
||||
|
||||
-<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" />
|
||||
-<script type="text/html" import-script="/Pages/VCockpit/Instruments/aircraft_efb/TFDi_MD11_efb/efb.js" import-async="false"></script>
|
||||
+<script type="text/html" import-script="/Pages/VCockpit/Instruments/aircraft_efb/KH_TFDi_MD11_efb/efb.js" import-async="false"></script>
|
||||
+<script type="text/html" import-script="/Pages/VCockpit/Instruments/aircraft_efb/KH_TFDi_MD11_efb/App.js" import-async="false"></script>
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
Index: EFB.index.js
|
||||
===================================================================
|
||||
--- EFB.index.js
|
||||
+++ EFB.index.js
|
||||
@@ -27,9 +27,9 @@
|
||||
}
|
||||
|
||||
connectedCallback() {
|
||||
super.connectedCallback();
|
||||
- Include.addScript("/Pages/VCockpit/Instruments/aircraft_efb/TFDi_MD11_efb/efb.js");
|
||||
+ Include.addScript("/Pages/VCockpit/Instruments/aircraft_efb/KH_TFDi_MD11_efb/efb.js");
|
||||
}
|
||||
|
||||
Update() {
|
||||
super.Update();
|
||||
+30
-28
@@ -1,44 +1,46 @@
|
||||
diff --git a/PackageSources/html_ui/Pages/VCockpit/Instruments/aircraft_efb/KH_TFDi_MD11_efb/efb.js b/PackageSources/html_ui/Pages/VCockpit/Instruments/aircraft_efb/KH_TFDi_MD11_efb/efb.js
|
||||
index 0904cc9..d2bcd02 100644
|
||||
--- a/PackageSources/html_ui/Pages/VCockpit/Instruments/aircraft_efb/KH_TFDi_MD11_efb/efb.js
|
||||
+++ b/PackageSources/html_ui/Pages/VCockpit/Instruments/aircraft_efb/KH_TFDi_MD11_efb/efb.js
|
||||
@@ -42333,9 +42333,16 @@ Take a look at the reducer(s) handling this action type: ${action.type}.
|
||||
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
|
||||
Index: EFB.js
|
||||
===================================================================
|
||||
--- EFB.js
|
||||
+++ EFB.js
|
||||
@@ -40265,11 +40265,11 @@
|
||||
),
|
||||
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
||||
"button",
|
||||
{
|
||||
- onClick: loadPayload,
|
||||
+ onClick: () => dispatch(
|
||||
+ setRoute({
|
||||
+ path: "/payload",
|
||||
+ params: {
|
||||
+ icao: simBrief.plan.origin.icao_code
|
||||
+ }
|
||||
+ })
|
||||
+ ),
|
||||
+ 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"
|
||||
}
|
||||
),
|
||||
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
|
||||
@@ -42842,6 +42849,11 @@ Take a look at the reducer(s) handling this action type: ${action.type}.
|
||||
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
||||
"button",
|
||||
@@ -40767,8 +40767,27 @@
|
||||
] })
|
||||
] }) }) });
|
||||
}
|
||||
|
||||
+ // Exports for add. script
|
||||
+// Exports for add. script
|
||||
+ window.reactExports = __toESM(require_react());
|
||||
+ window.reactDomExports = __toESM(require_react_dom());
|
||||
+ window.jsxRuntimeExports = __toESM(require_jsx_runtime());
|
||||
+ window.useSelector = useSelector
|
||||
+ window.useSelector = useSelector;
|
||||
+ window.v4 = v4_default;
|
||||
+ window.ArrowBigUp = ArrowBigUp;
|
||||
+ window.Delete = Delete;
|
||||
+ window.Space = Space;
|
||||
+ window.X = X;
|
||||
+ // Include
|
||||
+ var script = document.createElement('script');
|
||||
+ script.onload = function () {
|
||||
+ console.log("LM App injected");
|
||||
+ routes["/payload"].page = window.KH_LM
|
||||
+ };
|
||||
+ script.src = "/Pages/VCockpit/Instruments/aircraft_efb/KH_TFDi_MD11_efb/App.js";
|
||||
+ document.head.appendChild(script); //or something of the likes
|
||||
+
|
||||
// src/components/Router.tsx
|
||||
init_common();
|
||||
var import_jsx_runtime14 = __toESM(require_jsx_runtime());
|
||||
@@ -42858,7 +42870,7 @@ Take a look at the reducer(s) handling this action type: ${action.type}.
|
||||
title: "Payload",
|
||||
icon: faWeightHanging
|
||||
},
|
||||
- page: PayloadPage
|
||||
+ page: App
|
||||
},
|
||||
"/perf": {
|
||||
button: {
|
||||
var import_jsx_runtime15 = __toESM(require_jsx_runtime());
|
||||
var routes = {
|
||||
|
||||
-1813
File diff suppressed because it is too large
Load Diff
@@ -1,10 +0,0 @@
|
||||
<script type="text/html" id="TFDi_MD11_efb">
|
||||
<div id="MSFS_REACT_MOUNT">
|
||||
<h1>If you're seeing this, instrument didn't load.</h1>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="/Pages/VCockpit/Instruments/aircraft_efb/TFDi_MD11_efb/efb.css" />
|
||||
<script type="text/html" import-script="/Pages/VCockpit/Instruments/aircraft_efb/TFDi_MD11_efb/efb.js" import-async="false"></script>
|
||||
-43207
File diff suppressed because one or more lines are too long
@@ -0,0 +1,26 @@
|
||||
const { createTwoFilesPatch } = require("diff");
|
||||
const fs = require("fs");
|
||||
|
||||
// HTML
|
||||
|
||||
let file1Contents = fs.readFileSync("EFB.html").toString();
|
||||
let file2Contents = fs.readFileSync("patched/EFB.html").toString();
|
||||
let patch = createTwoFilesPatch(
|
||||
"EFB.html",
|
||||
"EFB.html",
|
||||
file1Contents,
|
||||
file2Contents
|
||||
);
|
||||
fs.writeFileSync("efb-html.patch", patch);
|
||||
|
||||
// JS
|
||||
|
||||
file1Contents = fs.readFileSync("EFB.index.js").toString();
|
||||
file2Contents = fs.readFileSync("patched/EFB.index.js").toString();
|
||||
patch = createTwoFilesPatch("EFB.index.js", "EFB.index.js", file1Contents, file2Contents);
|
||||
fs.writeFileSync("efb-index-js.patch", patch);
|
||||
|
||||
file1Contents = fs.readFileSync("EFB.js").toString();
|
||||
file2Contents = fs.readFileSync("patched/EFB.js").toString();
|
||||
patch = createTwoFilesPatch("EFB.js", "EFB.js", file1Contents, file2Contents);
|
||||
fs.writeFileSync("efb-js.patch", patch);
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<AssetPackage Version="0.1.0">
|
||||
<AssetPackage Version="1.1.0">
|
||||
<ItemSettings>
|
||||
<ContentType>MISC</ContentType>
|
||||
<Title>TFDi Design MD-11 Load Manager</Title>
|
||||
@@ -10,9 +10,10 @@
|
||||
<VisibleInStore>false</VisibleInStore>
|
||||
<CanBeReferenced>false</CanBeReferenced>
|
||||
</Flags>
|
||||
<PackageOrderHint>CUSTOM_SIMOBJECTS_PATCH</PackageOrderHint>
|
||||
<AssetGroups>
|
||||
<AssetGroup Name="ContentInfo">
|
||||
<Type>ContentInfo</Type>
|
||||
<Type Version="0">ContentInfo</Type>
|
||||
<Flags>
|
||||
<FSXCompatibility>false</FSXCompatibility>
|
||||
</Flags>
|
||||
@@ -20,7 +21,7 @@
|
||||
<OutputDir>ContentInfo\xkhofmann-tfdidesign-md11-load-manager\</OutputDir>
|
||||
</AssetGroup>
|
||||
<AssetGroup Name="html-ui">
|
||||
<Type>Copy</Type>
|
||||
<Type Version="0">Copy</Type>
|
||||
<Flags>
|
||||
<FSXCompatibility>false</FSXCompatibility>
|
||||
</Flags>
|
||||
@@ -31,7 +32,7 @@
|
||||
</Config>
|
||||
</AssetGroup>
|
||||
<AssetGroup Name="md-11-panel-config">
|
||||
<Type>Copy</Type>
|
||||
<Type Version="0">Copy</Type>
|
||||
<Flags>
|
||||
<FSXCompatibility>false</FSXCompatibility>
|
||||
</Flags>
|
||||
@@ -40,4 +41,3 @@
|
||||
</AssetGroup>
|
||||
</AssetGroups>
|
||||
</AssetPackage>
|
||||
|
||||
|
||||
+7
-7
@@ -5,7 +5,7 @@
|
||||
size_mm=2048,2048
|
||||
visible=1
|
||||
pixel_size=2048,2048
|
||||
texture=$vc1
|
||||
texture=vc1
|
||||
background_color=0,0,0
|
||||
htmlgauge00=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=Core, 0,0,509,510
|
||||
htmlgauge01=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=DU1,0,0,508,508
|
||||
@@ -14,9 +14,9 @@ htmlgauge03=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_ga
|
||||
htmlgauge04=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=DU4,1539,0,510,508
|
||||
htmlgauge05=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=DU5,0,513,511,509
|
||||
htmlgauge06=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=DU6,513,512,510,511
|
||||
htmlgauge07=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=LMCDU, 0,1046,333,287
|
||||
htmlgauge08=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=RMCDU,0,1386,334,288
|
||||
htmlgauge09=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=CMCDU,0,1728,333,285
|
||||
htmlgauge07=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=LMCDU, 0,1050,666,574
|
||||
htmlgauge08=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=RMCDU,678,1050,666,574
|
||||
htmlgauge09=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=CMCDU,1353,1050,666,574
|
||||
htmlgauge10=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=ISFD,1032,519,544,505
|
||||
//KH new gauge
|
||||
htmlgauge11=WasmInstrument/WasmInstrument.html?wasm_module=load-manager.wasm&wasm_gauge=Load_Manager,0,0,509,510
|
||||
@@ -34,7 +34,7 @@ Background_color=0,0,0
|
||||
size_mm=1024,1024
|
||||
visible=1
|
||||
pixel_size=1024,1024
|
||||
texture=$vc2
|
||||
texture=vc2
|
||||
|
||||
htmlgauge00=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=AFS,3,0,1015,185
|
||||
htmlgauge01=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=FUEL,4,200,1016,196
|
||||
@@ -45,7 +45,7 @@ Background_color=0,0,0
|
||||
size_mm=1024,1024
|
||||
visible=1
|
||||
pixel_size=1024,1024
|
||||
texture=$RADIOS_XPNDR
|
||||
texture=RADIOS_XPNDR
|
||||
|
||||
htmlgauge00=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=RADIOS_XPNDR,0,5,1019,295
|
||||
|
||||
@@ -54,6 +54,6 @@ Background_color=0,0,0
|
||||
size_mm=1536,1024
|
||||
visible=1
|
||||
pixel_size=1536,1024
|
||||
texture=$EFB
|
||||
texture=EFB
|
||||
|
||||
htmlgauge00=aircraft_efb/KH_TFDi_MD11_efb/efb.html,0,0,1536,1024
|
||||
+418
@@ -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
|
||||
+418
@@ -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
|
||||
+417
@@ -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
|
||||
+419
@@ -0,0 +1,419 @@
|
||||
; 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
|
||||
//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 = 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
|
||||
+41
-31
@@ -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]
|
||||
//KH Bump major
|
||||
major = 4
|
||||
minor = 1
|
||||
minor = 8
|
||||
|
||||
[WEIGHT_AND_BALANCE]
|
||||
max_gross_weight = 630500
|
||||
empty_weight = 248567
|
||||
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_aft_limit = 0.34
|
||||
empty_weight_pitch_MOI = 20897456
|
||||
@@ -20,9 +23,9 @@ 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=0, 82.0, -2.0, 4.0, Pilot, 1
|
||||
station_load.1=0, 82.0, 2.0, 4.0, First Officer, 2
|
||||
station_load.2=0, 80.0, 3.3, 4.0, Engineer, 0
|
||||
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
|
||||
@@ -53,7 +56,7 @@ max_speed_decreasing_steering_castering = 35
|
||||
emergency_extension_type = 2
|
||||
hyd_need_power_to_function= 0
|
||||
min_castering_angle = 0.05236
|
||||
max_castering_angle = 1.32645
|
||||
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
|
||||
@@ -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
|
||||
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, 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
|
||||
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
|
||||
number_of_tank_selectors = 3
|
||||
electric_pump = 0
|
||||
@@ -169,7 +172,7 @@ lift_coef_horizontal_incidence = 0.91357
|
||||
lift_coef_flaps = 1
|
||||
lift_coef_spoilers = 0
|
||||
drag_coef_zero_lift = 0.02539
|
||||
drag_coef_flaps = 0.1889
|
||||
drag_coef_flaps = 0.1339
|
||||
drag_coef_gear = 0.0549
|
||||
drag_coef_spoilers = 0.05207
|
||||
side_force_slip_angle = -0.77392
|
||||
@@ -259,7 +262,7 @@ cruise_lift_scalar = 1
|
||||
parasite_drag_scalar = 1
|
||||
induced_drag_scalar = 1
|
||||
flap_induced_drag_scalar = 1
|
||||
elevator_effectiveness = 1
|
||||
elevator_effectiveness = 1.1
|
||||
elevator_maxangle_scalar = 1
|
||||
aileron_effectiveness = 1
|
||||
rudder_effectiveness = 1
|
||||
@@ -312,9 +315,15 @@ best_glide = 0
|
||||
max_gear_extended = 200
|
||||
|
||||
[INTERACTIVE POINTS]
|
||||
number_of_interactive_points = 2
|
||||
interactive_point.0 = 0.4, 75.65, -8.12, -0.567, 0, 0, 0, -75, 33, 2, 33, 2, 2, 33
|
||||
interactive_point.1 = 0.4, 33.3, 6.28, -7.18, 1, 0, 0, 90, 0, 0, 0, 0, 0, 0
|
||||
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
|
||||
@@ -331,8 +340,8 @@ type = 1
|
||||
system_type = 1
|
||||
span-outboard = 0.25
|
||||
extending-time = 22
|
||||
damaging-speed = 250
|
||||
blowout-speed = 300
|
||||
damaging-speed = 280
|
||||
blowout-speed = 310
|
||||
maneuvering_flaps = 0
|
||||
lift_scalar = 0.1
|
||||
drag_scalar = 1.1
|
||||
@@ -340,20 +349,21 @@ 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.25, 2, 0, 0, 0, 1
|
||||
flaps-position.3 = 20, 200, 0.26, 1.1, 0, 0, 0, 1
|
||||
flaps-position.4 = 24, 185, 0.28, 1.0, 0, 0, 0, 1
|
||||
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, 150, 0.33, 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 = 250
|
||||
blowout-speed = 300
|
||||
damaging-speed = 280
|
||||
blowout-speed = 310
|
||||
maneuvering_flaps = 0
|
||||
lift_scalar = 0.1
|
||||
drag_scalar = 1.1
|
||||
@@ -361,20 +371,20 @@ 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.25, 2, 0, 0, 0, 1
|
||||
flaps-position.3 = 20, 200, 0.26, 1.1, 0, 0, 0, 1
|
||||
flaps-position.4 = 24, 185, 0.28, 1.0, 0, 0, 0, 1
|
||||
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, 150, 0.33, 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 = 250
|
||||
blowout-speed = 300
|
||||
damaging-speed = 300
|
||||
blowout-speed = 330
|
||||
maneuvering_flaps = 0
|
||||
lift_scalar = 0.5
|
||||
drag_scalar = 0.75
|
||||
@@ -388,12 +398,12 @@ type = 2
|
||||
system_type = 1
|
||||
span-outboard = 0.7
|
||||
extending-time = 21
|
||||
damaging-speed = 250
|
||||
blowout-speed = 300
|
||||
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-position.1 = 20, 215, 0.5, 0.5
|
||||
+53
-52
@@ -1,15 +1,18 @@
|
||||
//TFDi Designs MD-11 (GE CF6-80C2D1F) vRC1.7.0_GE 15MAY25
|
||||
; TFDi Designs MD-11F (GE CF6-80C2D1F) vRC1.8.0_GE_F 04FEB26
|
||||
|
||||
[MODULAR_MERGE]
|
||||
auto = true
|
||||
|
||||
[VERSION]
|
||||
//KH Bump major
|
||||
major = 4
|
||||
minor = 1
|
||||
minor = 8
|
||||
|
||||
[WEIGHT_AND_BALANCE]
|
||||
max_gross_weight = 630500
|
||||
empty_weight = 283975
|
||||
empty_weight = 248567
|
||||
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_aft_limit = 0.34
|
||||
empty_weight_pitch_MOI = 20897456
|
||||
@@ -18,29 +21,23 @@ 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
|
||||
max_number_of_stations = 15
|
||||
//KH START Empty default
|
||||
station_load.0=0, 82.0, -2.0, 4.0, Pilot, 1
|
||||
station_load.1=0, 82.0, 2.0, 4.0, First Officer, 2
|
||||
station_load.2=0, 80.0, 3.3, 4.0, Engineer, 0
|
||||
station_load.3=0, 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.5=0, 45.0, 0.0, 4.0, Business 1 C, 0
|
||||
station_load.6=0, 45.0, 5.0, 4.0, Business 1 R, 0
|
||||
station_load.7=0, 25.0, -5.0, 4.0, Business 2 L, 0
|
||||
station_load.8=0, 25.0, 0.0, 4.0, Business 2 C, 0
|
||||
station_load.9=0, 25.0, 5.0, 4.0, Business 2 R, 0
|
||||
station_load.10=0, -20.0, -5.0, 4.0, Economy 3 L, 0
|
||||
station_load.11=0, -20.0, 0.0, 4.0, Economy 3 C, 0
|
||||
station_load.12=0, -20.0, 5.0, 4.0, Economy 3 R, 0
|
||||
station_load.13=0, -50.0, -5.0, 4.0, Economy 4 L, 0
|
||||
station_load.14=0, -50.0, 0.0, 4.0, Economy 4 C, 0
|
||||
station_load.15=0, -50.0, 5.0, 4.0, Economy 4 R, 0
|
||||
station_load.16=0, -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.18=0, -30.0, 0.0, -4.5, Rear cargo, 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.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]
|
||||
@@ -59,7 +56,7 @@ max_speed_decreasing_steering_castering = 35
|
||||
emergency_extension_type = 2
|
||||
hyd_need_power_to_function= 0
|
||||
min_castering_angle = 0.05236
|
||||
max_castering_angle = 1.32645
|
||||
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
|
||||
@@ -88,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
|
||||
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, 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
|
||||
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
|
||||
number_of_tank_selectors = 3
|
||||
electric_pump = 0
|
||||
@@ -175,7 +172,7 @@ lift_coef_horizontal_incidence = 0.91357
|
||||
lift_coef_flaps = 1
|
||||
lift_coef_spoilers = 0
|
||||
drag_coef_zero_lift = 0.02539
|
||||
drag_coef_flaps = 0.1889
|
||||
drag_coef_flaps = 0.1339
|
||||
drag_coef_gear = 0.0549
|
||||
drag_coef_spoilers = 0.05207
|
||||
side_force_slip_angle = -0.77392
|
||||
@@ -265,7 +262,7 @@ cruise_lift_scalar = 1
|
||||
parasite_drag_scalar = 1
|
||||
induced_drag_scalar = 1
|
||||
flap_induced_drag_scalar = 1
|
||||
elevator_effectiveness = 1
|
||||
elevator_effectiveness = 1.1
|
||||
elevator_maxangle_scalar = 1
|
||||
aileron_effectiveness = 1
|
||||
rudder_effectiveness = 1
|
||||
@@ -318,10 +315,15 @@ best_glide = 0
|
||||
max_gear_extended = 200
|
||||
|
||||
[INTERACTIVE POINTS]
|
||||
number_of_interactive_points = 3
|
||||
interactive_point.0 = 0.4, 44.15, -10.05, -0.567, 0, 0, 0, -88, 35, 0, 35, 0, 2, 33
|
||||
interactive_point.1 = 0.4, 75.65, 7.92, -0.567, 0, 0, 0, 75, 33, 2, 33, 2, 2, 33
|
||||
interactive_point.2 = 0.4, 33.3, 6.28, -7.18, 1, 0, 0, 90, 0, 0, 0, 0, 0, 0
|
||||
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
|
||||
@@ -338,8 +340,8 @@ type = 1
|
||||
system_type = 1
|
||||
span-outboard = 0.25
|
||||
extending-time = 22
|
||||
damaging-speed = 250
|
||||
blowout-speed = 300
|
||||
damaging-speed = 280
|
||||
blowout-speed = 310
|
||||
maneuvering_flaps = 0
|
||||
lift_scalar = 0.1
|
||||
drag_scalar = 1.1
|
||||
@@ -347,12 +349,12 @@ 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.25, 2, 0, 0, 0, 1
|
||||
flaps-position.3 = 20, 200, 0.26, 1.1, 0, 0, 0, 1
|
||||
flaps-position.4 = 24, 185, 0.28, 1.0, 0, 0, 0, 1
|
||||
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, 150, 0.33, 1
|
||||
flaps-position.7 = 50, 155, 0.43, 1
|
||||
|
||||
|
||||
[FLAPS.1]
|
||||
@@ -360,8 +362,8 @@ type = 1
|
||||
system_type = 1
|
||||
span-outboard = 0.7
|
||||
extending-time = 23
|
||||
damaging-speed = 250
|
||||
blowout-speed = 300
|
||||
damaging-speed = 280
|
||||
blowout-speed = 310
|
||||
maneuvering_flaps = 0
|
||||
lift_scalar = 0.1
|
||||
drag_scalar = 1.1
|
||||
@@ -369,21 +371,20 @@ 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.25, 2, 0, 0, 0, 1
|
||||
flaps-position.3 = 20, 200, 0.26, 1.1, 0, 0, 0, 1
|
||||
flaps-position.4 = 24, 185, 0.28, 1.0, 0, 0, 0, 1
|
||||
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, 150, 0.33, 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 = 250
|
||||
blowout-speed = 300
|
||||
damaging-speed = 300
|
||||
blowout-speed = 330
|
||||
maneuvering_flaps = 0
|
||||
lift_scalar = 0.5
|
||||
drag_scalar = 0.75
|
||||
@@ -397,8 +398,8 @@ type = 2
|
||||
system_type = 1
|
||||
span-outboard = 0.7
|
||||
extending-time = 21
|
||||
damaging-speed = 250
|
||||
blowout-speed = 300
|
||||
damaging-speed = 300
|
||||
blowout-speed = 330
|
||||
maneuvering_flaps = 0
|
||||
lift_scalar = 0.5
|
||||
drag_scalar = 0.75
|
||||
+40
-31
@@ -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]
|
||||
//KH Bump major
|
||||
major = 4
|
||||
minor = 1
|
||||
minor = 8
|
||||
|
||||
[WEIGHT_AND_BALANCE]
|
||||
max_gross_weight = 630500
|
||||
empty_weight = 248567
|
||||
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_aft_limit = 0.34
|
||||
empty_weight_pitch_MOI = 20897456
|
||||
@@ -20,9 +23,9 @@ 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=0, 82.0, -2.0, 4.0, Pilot, 1
|
||||
station_load.1=0, 82.0, 2.0, 4.0, First Officer, 2
|
||||
station_load.2=0, 80.0, 3.3, 4.0, Engineer, 0
|
||||
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
|
||||
@@ -53,7 +56,7 @@ max_speed_decreasing_steering_castering = 35
|
||||
emergency_extension_type = 2
|
||||
hyd_need_power_to_function= 0
|
||||
min_castering_angle = 0.05236
|
||||
max_castering_angle = 1.32645
|
||||
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
|
||||
@@ -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
|
||||
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, 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
|
||||
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
|
||||
number_of_tank_selectors = 3
|
||||
electric_pump = 0
|
||||
@@ -169,7 +172,7 @@ lift_coef_horizontal_incidence = 0.91357
|
||||
lift_coef_flaps = 1
|
||||
lift_coef_spoilers = 0
|
||||
drag_coef_zero_lift = 0.02539
|
||||
drag_coef_flaps = 0.1889
|
||||
drag_coef_flaps = 0.1339
|
||||
drag_coef_gear = 0.0549
|
||||
drag_coef_spoilers = 0.05207
|
||||
side_force_slip_angle = -0.77392
|
||||
@@ -259,7 +262,7 @@ cruise_lift_scalar = 1
|
||||
parasite_drag_scalar = 1
|
||||
induced_drag_scalar = 1
|
||||
flap_induced_drag_scalar = 1
|
||||
elevator_effectiveness = 1
|
||||
elevator_effectiveness = 1.1
|
||||
elevator_maxangle_scalar = 1
|
||||
aileron_effectiveness = 1
|
||||
rudder_effectiveness = 1
|
||||
@@ -312,9 +315,15 @@ best_glide = 0
|
||||
max_gear_extended = 200
|
||||
|
||||
[INTERACTIVE POINTS]
|
||||
number_of_interactive_points = 2
|
||||
interactive_point.0 = 0.4, 75.65, -8.12, -0.567, 0, 0, 0, -75, 33, 2, 33, 2, 2, 33
|
||||
interactive_point.1 = 0.4, 33.3, 6.28, -7.18, 1, 0, 0, 90, 0, 0, 0, 0, 0, 0
|
||||
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
|
||||
@@ -331,8 +340,8 @@ type = 1
|
||||
system_type = 1
|
||||
span-outboard = 0.25
|
||||
extending-time = 22
|
||||
damaging-speed = 250
|
||||
blowout-speed = 300
|
||||
damaging-speed = 280
|
||||
blowout-speed = 310
|
||||
maneuvering_flaps = 0
|
||||
lift_scalar = 0.1
|
||||
drag_scalar = 1.1
|
||||
@@ -340,20 +349,20 @@ 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.25, 2, 0, 0, 0, 1
|
||||
flaps-position.3 = 20, 200, 0.26, 1.1, 0, 0, 0, 1
|
||||
flaps-position.4 = 24, 185, 0.28, 1.0, 0, 0, 0, 1
|
||||
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, 150, 0.33, 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 = 250
|
||||
blowout-speed = 300
|
||||
damaging-speed = 280
|
||||
blowout-speed = 310
|
||||
maneuvering_flaps = 0
|
||||
lift_scalar = 0.1
|
||||
drag_scalar = 1.1
|
||||
@@ -361,20 +370,20 @@ 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.25, 2, 0, 0, 0, 1
|
||||
flaps-position.3 = 20, 200, 0.26, 1.1, 0, 0, 0, 1
|
||||
flaps-position.4 = 24, 185, 0.28, 1.0, 0, 0, 0, 1
|
||||
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, 150, 0.33, 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 = 250
|
||||
blowout-speed = 300
|
||||
damaging-speed = 300
|
||||
blowout-speed = 330
|
||||
maneuvering_flaps = 0
|
||||
lift_scalar = 0.5
|
||||
drag_scalar = 0.75
|
||||
@@ -388,12 +397,12 @@ type = 2
|
||||
system_type = 1
|
||||
span-outboard = 0.7
|
||||
extending-time = 21
|
||||
damaging-speed = 250
|
||||
blowout-speed = 300
|
||||
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-position.1 = 20, 215, 0.5, 0.5
|
||||
+53
-51
@@ -1,15 +1,18 @@
|
||||
//TFDi Designs MD-11 (PW4460) vRC1.7.0_PW 15MAY25
|
||||
; TFDi Designs MD-11F (P&W PW4662) vRC1.8.0_PW_F 04FEB26
|
||||
|
||||
[MODULAR_MERGE]
|
||||
auto = true
|
||||
|
||||
[VERSION]
|
||||
//KH Bump major
|
||||
major = 4
|
||||
minor = 1
|
||||
minor = 8
|
||||
|
||||
[WEIGHT_AND_BALANCE]
|
||||
max_gross_weight = 630500
|
||||
empty_weight = 283975
|
||||
empty_weight = 248567
|
||||
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_aft_limit = 0.34
|
||||
empty_weight_pitch_MOI = 20897456
|
||||
@@ -18,29 +21,23 @@ 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
|
||||
max_number_of_stations = 15
|
||||
//KH START Empty default
|
||||
station_load.0=0, 82.0, -2.0, 4.0, Pilot, 1
|
||||
station_load.1=0, 82.0, 2.0, 4.0, First Officer, 2
|
||||
station_load.2=0, 80.0, 3.3, 4.0, Engineer, 0
|
||||
station_load.3=0, 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.5=0, 45.0, 0.0, 4.0, Business 1 C, 0
|
||||
station_load.6=0, 45.0, 5.0, 4.0, Business 1 R, 0
|
||||
station_load.7=0, 25.0, -5.0, 4.0, Business 2 L, 0
|
||||
station_load.8=0, 25.0, 0.0, 4.0, Business 2 C, 0
|
||||
station_load.9=0, 25.0, 5.0, 4.0, Business 2 R, 0
|
||||
station_load.10=0, -20.0, -5.0, 4.0, Economy 3 L, 0
|
||||
station_load.11=0, -20.0, 0.0, 4.0, Economy 3 C, 0
|
||||
station_load.12=0, -20.0, 5.0, 4.0, Economy 3 R, 0
|
||||
station_load.13=0, -50.0, -5.0, 4.0, Economy 4 L, 0
|
||||
station_load.14=0, -50.0, 0.0, 4.0, Economy 4 C, 0
|
||||
station_load.15=0, -50.0, 5.0, 4.0, Economy 4 R, 0
|
||||
station_load.16=0, -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.18=0, -30.0, 0.0, -4.5, Rear cargo, 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.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]
|
||||
@@ -59,7 +56,7 @@ max_speed_decreasing_steering_castering = 35
|
||||
emergency_extension_type = 2
|
||||
hyd_need_power_to_function= 0
|
||||
min_castering_angle = 0.05236
|
||||
max_castering_angle = 1.32645
|
||||
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
|
||||
@@ -88,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
|
||||
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, 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
|
||||
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
|
||||
number_of_tank_selectors = 3
|
||||
electric_pump = 0
|
||||
@@ -175,7 +172,7 @@ lift_coef_horizontal_incidence = 0.91357
|
||||
lift_coef_flaps = 1
|
||||
lift_coef_spoilers = 0
|
||||
drag_coef_zero_lift = 0.02539
|
||||
drag_coef_flaps = 0.1889
|
||||
drag_coef_flaps = 0.1339
|
||||
drag_coef_gear = 0.0549
|
||||
drag_coef_spoilers = 0.05207
|
||||
side_force_slip_angle = -0.77392
|
||||
@@ -265,7 +262,7 @@ cruise_lift_scalar = 1
|
||||
parasite_drag_scalar = 1
|
||||
induced_drag_scalar = 1
|
||||
flap_induced_drag_scalar = 1
|
||||
elevator_effectiveness = 1
|
||||
elevator_effectiveness = 1.1
|
||||
elevator_maxangle_scalar = 1
|
||||
aileron_effectiveness = 1
|
||||
rudder_effectiveness = 1
|
||||
@@ -318,10 +315,15 @@ best_glide = 0
|
||||
max_gear_extended = 200
|
||||
|
||||
[INTERACTIVE POINTS]
|
||||
number_of_interactive_points = 3
|
||||
interactive_point.0 = 0.4, 44.15, -10.05, -0.567, 0, 0, 0, -88, 35, 0, 35, 0, 2, 33
|
||||
interactive_point.1 = 0.4, 75.65, 7.92, -0.567, 0, 0, 0, 75, 33, 2, 33, 2, 2, 33
|
||||
interactive_point.2 = 0.4, 33.3, 6.28, -7.18, 1, 0, 0, 90, 0, 0, 0, 0, 0, 0
|
||||
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
|
||||
@@ -338,8 +340,8 @@ type = 1
|
||||
system_type = 1
|
||||
span-outboard = 0.25
|
||||
extending-time = 22
|
||||
damaging-speed = 250
|
||||
blowout-speed = 300
|
||||
damaging-speed = 280
|
||||
blowout-speed = 310
|
||||
maneuvering_flaps = 0
|
||||
lift_scalar = 0.1
|
||||
drag_scalar = 1.1
|
||||
@@ -347,20 +349,20 @@ 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.25, 2, 0, 0, 0, 1
|
||||
flaps-position.3 = 20, 200, 0.26, 1.1, 0, 0, 0, 1
|
||||
flaps-position.4 = 24, 185, 0.28, 1.0, 0, 0, 0, 1
|
||||
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, 150, 0.33, 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 = 250
|
||||
blowout-speed = 300
|
||||
damaging-speed = 280
|
||||
blowout-speed = 310
|
||||
maneuvering_flaps = 0
|
||||
lift_scalar = 0.1
|
||||
drag_scalar = 1.1
|
||||
@@ -368,20 +370,20 @@ 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.25, 2, 0, 0, 0, 1
|
||||
flaps-position.3 = 20, 200, 0.26, 1.1, 0, 0, 0, 1
|
||||
flaps-position.4 = 24, 185, 0.28, 1.0, 0, 0, 0, 1
|
||||
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, 150, 0.33, 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 = 250
|
||||
blowout-speed = 300
|
||||
damaging-speed = 300
|
||||
blowout-speed = 330
|
||||
maneuvering_flaps = 0
|
||||
lift_scalar = 0.5
|
||||
drag_scalar = 0.75
|
||||
@@ -395,8 +397,8 @@ type = 2
|
||||
system_type = 1
|
||||
span-outboard = 0.7
|
||||
extending-time = 21
|
||||
damaging-speed = 250
|
||||
blowout-speed = 300
|
||||
damaging-speed = 300
|
||||
blowout-speed = 330
|
||||
maneuvering_flaps = 0
|
||||
lift_scalar = 0.5
|
||||
drag_scalar = 0.75
|
||||
@@ -1,59 +0,0 @@
|
||||
// Panel Configuration File
|
||||
// TFDi Design MD-11
|
||||
|
||||
[VCockpit01]
|
||||
size_mm=2048,2048
|
||||
visible=1
|
||||
pixel_size=2048,2048
|
||||
texture=$vc1
|
||||
background_color=0,0,0
|
||||
htmlgauge00=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=Core, 0,0,509,510,PW
|
||||
htmlgauge01=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=DU1,0,0,508,508
|
||||
htmlgauge02=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=DU2,514,0,510,510
|
||||
htmlgauge03=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=DU3,1027,0,510,510
|
||||
htmlgauge04=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=DU4,1539,0,510,508
|
||||
htmlgauge05=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=DU5,0,513,511,509
|
||||
htmlgauge06=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=DU6,513,512,510,511
|
||||
htmlgauge07=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=LMCDU, 0,1046,333,287
|
||||
htmlgauge08=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=RMCDU,0,1386,334,288
|
||||
htmlgauge09=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=CMCDU,0,1728,333,285
|
||||
htmlgauge10=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=ISFD,1032,519,544,505
|
||||
//KH new gauge
|
||||
htmlgauge11=WasmInstrument/WasmInstrument.html?wasm_module=load-manager.wasm&wasm_gauge=Load_Manager,0,0,509,510
|
||||
|
||||
[VIEWS]
|
||||
VIEW_FORWARD_DIR=2.000, 0.000, 0.000
|
||||
|
||||
[Color]
|
||||
Day=255,255,255
|
||||
Night=255,255,255
|
||||
Luminous=201,64,64
|
||||
|
||||
[Vcockpit02]
|
||||
Background_color=0,0,0
|
||||
size_mm=1024,1024
|
||||
visible=1
|
||||
pixel_size=1024,1024
|
||||
texture=$vc2
|
||||
|
||||
htmlgauge00=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=AFS,3,0,1015,185
|
||||
htmlgauge01=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=FUEL,4,200,1016,196
|
||||
//above should actually be 3,192,1018,199 - moved due to visual offset
|
||||
|
||||
[Vcockpit03]
|
||||
Background_color=0,0,0
|
||||
size_mm=1024,1024
|
||||
visible=1
|
||||
pixel_size=1024,1024
|
||||
texture=$RADIOS_XPNDR
|
||||
|
||||
htmlgauge00=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=RADIOS_XPNDR,0,5,1019,295
|
||||
|
||||
[VCockpit04]
|
||||
Background_color=0,0,0
|
||||
size_mm=1536,1024
|
||||
visible=1
|
||||
pixel_size=1536,1024
|
||||
texture=$EFB
|
||||
|
||||
htmlgauge00=aircraft_efb/KH_TFDi_MD11_efb/efb.html,0,0,1536,1024
|
||||
@@ -1,59 +0,0 @@
|
||||
// Panel Configuration File
|
||||
// TFDi Design MD-11
|
||||
|
||||
[VCockpit01]
|
||||
size_mm=2048,2048
|
||||
visible=1
|
||||
pixel_size=2048,2048
|
||||
texture=$vc1
|
||||
background_color=0,0,0
|
||||
htmlgauge00=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=Core, 0,0,509,510
|
||||
htmlgauge01=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=DU1,0,0,508,508
|
||||
htmlgauge02=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=DU2,514,0,510,510
|
||||
htmlgauge03=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=DU3,1027,0,510,510
|
||||
htmlgauge04=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=DU4,1539,0,510,508
|
||||
htmlgauge05=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=DU5,0,513,511,509
|
||||
htmlgauge06=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=DU6,513,512,510,511
|
||||
htmlgauge07=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=LMCDU, 0,1046,333,287
|
||||
htmlgauge08=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=RMCDU,0,1386,334,288
|
||||
htmlgauge09=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=CMCDU,0,1728,333,285
|
||||
htmlgauge10=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=ISFD,1032,519,544,505
|
||||
//KH new gauge
|
||||
htmlgauge11=WasmInstrument/WasmInstrument.html?wasm_module=load-manager.wasm&wasm_gauge=Load_Manager,0,0,509,510
|
||||
|
||||
[VIEWS]
|
||||
VIEW_FORWARD_DIR=2.000, 0.000, 0.000
|
||||
|
||||
[Color]
|
||||
Day=255,255,255
|
||||
Night=255,255,255
|
||||
Luminous=201,64,64
|
||||
|
||||
[Vcockpit02]
|
||||
Background_color=0,0,0
|
||||
size_mm=1024,1024
|
||||
visible=1
|
||||
pixel_size=1024,1024
|
||||
texture=$vc2
|
||||
|
||||
htmlgauge00=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=AFS,3,0,1015,185
|
||||
htmlgauge01=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=FUEL,4,200,1016,196
|
||||
//above should actually be 3,192,1018,199 - moved due to visual offset
|
||||
|
||||
[Vcockpit03]
|
||||
Background_color=0,0,0
|
||||
size_mm=1024,1024
|
||||
visible=1
|
||||
pixel_size=1024,1024
|
||||
texture=$RADIOS_XPNDR
|
||||
|
||||
htmlgauge00=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=RADIOS_XPNDR,0,5,1019,295
|
||||
|
||||
[VCockpit04]
|
||||
Background_color=0,0,0
|
||||
size_mm=1536,1024
|
||||
visible=1
|
||||
pixel_size=1536,1024
|
||||
texture=$EFB
|
||||
|
||||
htmlgauge00=aircraft_efb/KH_TFDi_MD11_efb/efb.html,0,0,1536,1024
|
||||
@@ -1,59 +0,0 @@
|
||||
// Panel Configuration File
|
||||
// TFDi Design MD-11
|
||||
|
||||
[VCockpit01]
|
||||
size_mm=2048,2048
|
||||
visible=1
|
||||
pixel_size=2048,2048
|
||||
texture=$vc1
|
||||
background_color=0,0,0
|
||||
htmlgauge00=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=Core, 0,0,509,510,PW
|
||||
htmlgauge01=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=DU1,0,0,508,508
|
||||
htmlgauge02=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=DU2,514,0,510,510
|
||||
htmlgauge03=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=DU3,1027,0,510,510
|
||||
htmlgauge04=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=DU4,1539,0,510,508
|
||||
htmlgauge05=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=DU5,0,513,511,509
|
||||
htmlgauge06=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=DU6,513,512,510,511
|
||||
htmlgauge07=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=LMCDU, 0,1046,333,287
|
||||
htmlgauge08=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=RMCDU,0,1386,334,288
|
||||
htmlgauge09=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=CMCDU,0,1728,333,285
|
||||
htmlgauge10=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=ISFD,1032,519,544,505
|
||||
//KH new gauge
|
||||
htmlgauge11=WasmInstrument/WasmInstrument.html?wasm_module=load-manager.wasm&wasm_gauge=Load_Manager,0,0,509,510
|
||||
|
||||
[VIEWS]
|
||||
VIEW_FORWARD_DIR=2.000, 0.000, 0.000
|
||||
|
||||
[Color]
|
||||
Day=255,255,255
|
||||
Night=255,255,255
|
||||
Luminous=201,64,64
|
||||
|
||||
[Vcockpit02]
|
||||
Background_color=0,0,0
|
||||
size_mm=1024,1024
|
||||
visible=1
|
||||
pixel_size=1024,1024
|
||||
texture=$vc2
|
||||
|
||||
htmlgauge00=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=AFS,3,0,1015,185
|
||||
htmlgauge01=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=FUEL,4,200,1016,196
|
||||
//above should actually be 3,192,1018,199 - moved due to visual offset
|
||||
|
||||
[Vcockpit03]
|
||||
Background_color=0,0,0
|
||||
size_mm=1024,1024
|
||||
visible=1
|
||||
pixel_size=1024,1024
|
||||
texture=$RADIOS_XPNDR
|
||||
|
||||
htmlgauge00=WasmInstrument/WasmInstrument.html?wasm_module=md11host.wasm&wasm_gauge=RADIOS_XPNDR,0,5,1019,295
|
||||
|
||||
[VCockpit04]
|
||||
Background_color=0,0,0
|
||||
size_mm=1536,1024
|
||||
visible=1
|
||||
pixel_size=1536,1024
|
||||
texture=$EFB
|
||||
|
||||
htmlgauge00=aircraft_efb/KH_TFDi_MD11_efb/efb.html,0,0,1536,1024
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "tfdidesign-md11-load-manager",
|
||||
"version": "0.1.98",
|
||||
"version": "0.2.8",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"type": "module",
|
||||
@@ -13,8 +13,8 @@
|
||||
"clean": "rimraf ..\\html_ui\\Pages\\VCockpit\\Instruments\\aircraft_efb\\KH_TFDi_MD11_efb",
|
||||
"dev": "npx rollup -c -w",
|
||||
"build": "npm version patch && npx rollup -c && pnpm efb",
|
||||
"release": "pnpm types && pnpm lint && pnpm run licenses && pnpm clean && npm version patch && cross-env NODE_ENV=production npx rollup -c && pnpm efb",
|
||||
"efb": "cd ..\\.. && node insert-efb"
|
||||
"release": "pnpm types && pnpm lint && pnpm run licenses && pnpm clean && npm version patch && cross-env NODE_ENV=production npx rollup -c && pnpm efb ",
|
||||
"efb": "cd ..\\.. && node insert-efb && rm PackageSources\\html_ui\\Pages\\VCockpit\\Instruments\\aircraft_efb\\KH_TFDi_MD11_efb/vendor*"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=22"
|
||||
@@ -30,6 +30,7 @@
|
||||
"@rollup/plugin-replace": "^6.0.2",
|
||||
"@rollup/plugin-terser": "^0.4.4",
|
||||
"@rollup/plugin-typescript": "^12.1.2",
|
||||
"@types/node": "^24.3.1",
|
||||
"@types/react": "^19.1.6",
|
||||
"@types/react-dom": "^19.1.6",
|
||||
"@types/uuid": "^10.0.0",
|
||||
@@ -58,6 +59,7 @@
|
||||
"typescript": "5.8.3"
|
||||
},
|
||||
"dependencies": {
|
||||
"lucide-react": "^0.555.0",
|
||||
"react": "^19.1.0",
|
||||
"react-dom": "^19.1.0",
|
||||
"uuid": "^11.1.0"
|
||||
|
||||
Generated
+24
-9
@@ -8,6 +8,9 @@ importers:
|
||||
|
||||
.:
|
||||
dependencies:
|
||||
lucide-react:
|
||||
specifier: ^0.555.0
|
||||
version: 0.555.0(react@19.1.0)
|
||||
react:
|
||||
specifier: ^19.1.0
|
||||
version: 19.1.0
|
||||
@@ -39,6 +42,9 @@ importers:
|
||||
'@rollup/plugin-typescript':
|
||||
specifier: ^12.1.2
|
||||
version: 12.1.2(rollup@4.42.0)(tslib@2.8.1)(typescript@5.8.3)
|
||||
'@types/node':
|
||||
specifier: ^24.3.1
|
||||
version: 24.3.1
|
||||
'@types/react':
|
||||
specifier: ^19.1.6
|
||||
version: 19.1.6
|
||||
@@ -728,8 +734,8 @@ packages:
|
||||
'@types/minimatch@5.1.2':
|
||||
resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==}
|
||||
|
||||
'@types/node@22.15.30':
|
||||
resolution: {integrity: sha512-6Q7lr06bEHdlfplU6YRbgG1SFBdlsfNC4/lX+SkhiTs0cpJkOElmWls8PxDFv4yY/xKb8Y6SO0OmSX4wgqTZbA==}
|
||||
'@types/node@24.3.1':
|
||||
resolution: {integrity: sha512-3vXmQDXy+woz+gnrTvuvNrPzekOi+Ds0ReMxw0LzBiK3a+1k0kQn9f2NWk+lgD4rJehFUmYy2gMhJ2ZI+7YP9g==}
|
||||
|
||||
'@types/q@1.5.8':
|
||||
resolution: {integrity: sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==}
|
||||
@@ -1894,6 +1900,11 @@ packages:
|
||||
lru-cache@5.1.1:
|
||||
resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
|
||||
|
||||
lucide-react@0.555.0:
|
||||
resolution: {integrity: sha512-D8FvHUGbxWBRQM90NZeIyhAvkFfsh3u9ekrMvJ30Z6gnpBHS6HC6ldLg7tL45hwiIz/u66eKDtdA23gwwGsAHA==}
|
||||
peerDependencies:
|
||||
react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0
|
||||
|
||||
magic-string@0.30.17:
|
||||
resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==}
|
||||
|
||||
@@ -2788,8 +2799,8 @@ packages:
|
||||
resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
||||
undici-types@6.21.0:
|
||||
resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
|
||||
undici-types@7.10.0:
|
||||
resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==}
|
||||
|
||||
universalify@0.1.2:
|
||||
resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==}
|
||||
@@ -3389,12 +3400,12 @@ snapshots:
|
||||
|
||||
'@types/fs-extra@8.1.5':
|
||||
dependencies:
|
||||
'@types/node': 22.15.30
|
||||
'@types/node': 24.3.1
|
||||
|
||||
'@types/glob@7.2.0':
|
||||
dependencies:
|
||||
'@types/minimatch': 5.1.2
|
||||
'@types/node': 22.15.30
|
||||
'@types/node': 24.3.1
|
||||
|
||||
'@types/http-cache-semantics@4.0.4': {}
|
||||
|
||||
@@ -3404,9 +3415,9 @@ snapshots:
|
||||
|
||||
'@types/minimatch@5.1.2': {}
|
||||
|
||||
'@types/node@22.15.30':
|
||||
'@types/node@24.3.1':
|
||||
dependencies:
|
||||
undici-types: 6.21.0
|
||||
undici-types: 7.10.0
|
||||
|
||||
'@types/q@1.5.8': {}
|
||||
|
||||
@@ -4839,6 +4850,10 @@ snapshots:
|
||||
dependencies:
|
||||
yallist: 3.1.1
|
||||
|
||||
lucide-react@0.555.0(react@19.1.0):
|
||||
dependencies:
|
||||
react: 19.1.0
|
||||
|
||||
magic-string@0.30.17:
|
||||
dependencies:
|
||||
'@jridgewell/sourcemap-codec': 1.5.0
|
||||
@@ -5828,7 +5843,7 @@ snapshots:
|
||||
has-symbols: 1.1.0
|
||||
which-boxed-primitive: 1.1.1
|
||||
|
||||
undici-types@6.21.0: {}
|
||||
undici-types@7.10.0: {}
|
||||
|
||||
universalify@0.1.2: {}
|
||||
|
||||
|
||||
@@ -2,7 +2,6 @@ import commonjs from '@rollup/plugin-commonjs';
|
||||
import json from '@rollup/plugin-json';
|
||||
import resolve from '@rollup/plugin-node-resolve';
|
||||
import replace from '@rollup/plugin-replace';
|
||||
import terser from '@rollup/plugin-terser';
|
||||
import typescript from '@rollup/plugin-typescript';
|
||||
import autoprefixer from 'autoprefixer';
|
||||
import atImport from 'postcss-import';
|
||||
@@ -31,9 +30,8 @@ export default {
|
||||
},
|
||||
plugins: [
|
||||
replace({
|
||||
'process.env.NODE_ENV': JSON.stringify(targetEnv),
|
||||
'import.meta.env': true,
|
||||
'import.meta.env.MODE': JSON.stringify(targetEnv),
|
||||
'process.env.NODE_ENV': targetEnv,
|
||||
preventAssignment: true,
|
||||
}),
|
||||
versionInjector(),
|
||||
postcss({
|
||||
@@ -46,11 +44,13 @@ export default {
|
||||
reactSvg(),
|
||||
resolve(),
|
||||
json(),
|
||||
typescript(),
|
||||
typescript({
|
||||
outputToFilesystem: false,
|
||||
}),
|
||||
commonjs({
|
||||
requireReturnsDefault: 'auto',
|
||||
}),
|
||||
targetEnv === 'production' && terser(),
|
||||
// targetEnv === 'production' && terser(), // Disabled due to script running afterwards
|
||||
copy({
|
||||
targets: [{ src: ['src/assets/*', '!**/*.svg'], dest: `${panelDirBase}/assets` }],
|
||||
}),
|
||||
|
||||
@@ -1,42 +1,40 @@
|
||||
import { FC, useCallback, useEffect, useState } from 'react';
|
||||
import Freighter from './components/freighter/Freighter';
|
||||
import Pax from './components/pax/Pax';
|
||||
import {
|
||||
COHERENT_COMM_BUS_WASM_CALL,
|
||||
COMM_BUS_LIVE_DATA_EVENT,
|
||||
TFDI_SIMBRIEF_USERNAME_CALL,
|
||||
TFDI_SIMBRIEF_USERNAME_EVENT,
|
||||
} from './constants';
|
||||
import { COHERENT_COMM_BUS_WASM_CALL } from './constants';
|
||||
import { WASMDataF, WASMDataPax } from './types/WASMData';
|
||||
import { CommBusCall, CommBusEvent } from './types/general';
|
||||
|
||||
const App: FC = () => {
|
||||
const [SBUsername, setSBUsername] = useState<string>();
|
||||
const [WASMData, setWASMData] = useState<WASMDataPax | WASMDataF>();
|
||||
const [isReady, setIsReady] = useState(false);
|
||||
|
||||
// CommBus
|
||||
const usernameCallback = useCallback((username: string) => {
|
||||
setSBUsername(username);
|
||||
setIsReady(true);
|
||||
}, []);
|
||||
const wasmCallback = useCallback((data: string) => {
|
||||
setWASMData(JSON.parse(data));
|
||||
}, []);
|
||||
useEffect(() => {
|
||||
console.log('Initializing CommBus');
|
||||
console.log(
|
||||
'[KHOFMANN TFDi MD-11 Load Manager] JS Version [VI]{version}[/VI]: process.env.NODE_ENV [VI]{date}[/VI]'
|
||||
);
|
||||
|
||||
console.log('[KHOFMANN TFDi MD-11 Load Manager] Initialising CommBus');
|
||||
|
||||
const commBus = RegisterViewListener('JS_LISTENER_COMM_BUS');
|
||||
|
||||
commBus.on(TFDI_SIMBRIEF_USERNAME_EVENT, usernameCallback);
|
||||
commBus.on(COMM_BUS_LIVE_DATA_EVENT, wasmCallback);
|
||||
commBus.on(CommBusEvent.TFDI_SIMBRIEF_USERNAME, usernameCallback);
|
||||
commBus.on(CommBusEvent.LIVE_DATA, wasmCallback);
|
||||
|
||||
Coherent.call(COHERENT_COMM_BUS_WASM_CALL, TFDI_SIMBRIEF_USERNAME_CALL, 'null');
|
||||
Coherent.call(COHERENT_COMM_BUS_WASM_CALL, CommBusCall.TFDI_SIMBRIEF_USERNAME, 'null');
|
||||
|
||||
return () => {
|
||||
console.log('De-Initializing CommBus');
|
||||
console.log('[KHOFMANN TFDi MD-11 Load Manager] De-Initialising CommBus');
|
||||
|
||||
commBus.off(TFDI_SIMBRIEF_USERNAME_EVENT, usernameCallback);
|
||||
commBus.off(COMM_BUS_LIVE_DATA_EVENT, wasmCallback);
|
||||
commBus.off(CommBusEvent.TFDI_SIMBRIEF_USERNAME, usernameCallback);
|
||||
commBus.off(CommBusEvent.LIVE_DATA, wasmCallback);
|
||||
|
||||
commBus.unregister();
|
||||
};
|
||||
@@ -45,7 +43,7 @@ const App: FC = () => {
|
||||
return (
|
||||
<div className="flex w-full justify-center py-5 bg-zinc-900">
|
||||
<div className="flex w-3/4 flex-col items-center">
|
||||
{isReady && WASMData ? (
|
||||
{WASMData ? (
|
||||
WASMData.userData.isCargo ? (
|
||||
<Freighter WASMData={WASMData as WASMDataF} username={SBUsername} />
|
||||
) : (
|
||||
|
||||
@@ -1,38 +1,40 @@
|
||||
| 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.1.1 | 19.1.0 | ^19.1.0 | n/a |
|
||||
| kessler | stuff | react-dom | perpetual | material | MIT | git+https://github.com/facebook/react.git | 19.1.1 | 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 | perpetual | material | MIT | git+https://github.com/facebook/react.git | 19.2.4 | 19.1.0 | ^19.1.0 | n/a |
|
||||
| kessler | stuff | react-dom | perpetual | material | MIT | git+https://github.com/facebook/react.git | 19.2.4 | 19.1.0 | ^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 | @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-commonjs | perpetual | material | MIT | git+https://github.com/rollup/plugins.git | 28.0.6 | 28.0.3 | ^28.0.3 | Rich Harris <richard.a.harris@gmail.com> |
|
||||
| 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 | @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-node-resolve | perpetual | material | MIT | git+https://github.com/rollup/plugins.git | 16.0.1 | 16.0.1 | ^16.0.1 | Rich Harris <richard.a.harris@gmail.com> |
|
||||
| kessler | stuff | @rollup/plugin-replace | perpetual | material | MIT | git+https://github.com/rollup/plugins.git | 6.0.2 | 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.1 | ^16.0.1 | Rich Harris <richard.a.harris@gmail.com> |
|
||||
| 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-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-typescript | perpetual | material | MIT | git+https://github.com/rollup/plugins.git | 12.1.4 | 12.1.2 | ^12.1.2 | Oskar Segersvärd |
|
||||
| kessler | stuff | @types/react | perpetual | material | MIT | https://github.com/DefinitelyTyped/DefinitelyTyped.git | 19.1.12 | 19.1.6 | ^19.1.6 | n/a |
|
||||
| kessler | stuff | @types/react-dom | perpetual | material | MIT | https://github.com/DefinitelyTyped/DefinitelyTyped.git | 19.1.9 | 19.1.6 | ^19.1.6 | n/a |
|
||||
| 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 | @types/node | perpetual | material | MIT | https://github.com/DefinitelyTyped/DefinitelyTyped.git | 24.10.11 | 24.3.1 | ^24.3.1 | n/a |
|
||||
| kessler | stuff | @types/react | perpetual | material | MIT | https://github.com/DefinitelyTyped/DefinitelyTyped.git | 19.2.13 | 19.1.6 | ^19.1.6 | 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/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/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 | @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 | autoprefixer | perpetual | material | MIT | git+https://github.com/postcss/autoprefixer.git | 10.4.21 | 10.4.21 | ^10.4.21 | Andrey Sitnik <andrey@sitnik.ru> |
|
||||
| kessler | stuff | autoprefixer | perpetual | material | MIT | git+https://github.com/postcss/autoprefixer.git | 10.4.24 | 10.4.21 | ^10.4.21 | Andrey Sitnik <andrey@sitnik.ru> |
|
||||
| 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 | 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-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-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-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 | license-report | perpetual | material | MIT | git+https://github.com/kessler/license-report.git | 6.8.0 | 6.7.2 | ^6.7.2 | Yaniv Kessler |
|
||||
| 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 | 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 | 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 | prettier | perpetual | material | MIT | git+https://github.com/prettier/prettier.git | 3.6.2 | 3.5.3 | ^3.5.3 | James Long |
|
||||
| kessler | stuff | prettier-plugin-organize-imports | perpetual | material | MIT | git+https://github.com/simonhaenisch/prettier-plugin-organize-imports.git | 4.2.0 | 4.1.0 | ^4.1.0 | Simon Haenisch (https://github.com/simonhaenisch) |
|
||||
| kessler | stuff | rimraf | perpetual | material | ISC | git://github.com/isaacs/rimraf.git | 6.0.1 | 6.0.1 | ^6.0.1 | Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/) |
|
||||
| kessler | stuff | rollup | perpetual | material | MIT | git+https://github.com/rollup/rollup.git | 4.50.0 | 4.42.0 | ^4.42.0 | Rich Harris |
|
||||
| kessler | stuff | prettier | perpetual | material | MIT | git+https://github.com/prettier/prettier.git | 3.8.1 | 3.5.3 | ^3.5.3 | James Long |
|
||||
| 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 | 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 | rollup | perpetual | material | MIT | git+https://github.com/rollup/rollup.git | 4.57.1 | 4.42.0 | ^4.42.0 | Rich Harris |
|
||||
| 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-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-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-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 | sass | perpetual | material | MIT | git+https://github.com/sass/dart-sass.git | 1.92.0 | 1.89.1 | ^1.89.1 | Natalie Weizenbaum nweiz@google.com https://github.com/nex3 |
|
||||
| kessler | stuff | sass | perpetual | material | MIT | git+https://github.com/sass/dart-sass.git | 1.97.3 | 1.89.1 | ^1.89.1 | Natalie Weizenbaum nweiz@google.com https://github.com/nex3 |
|
||||
| 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 | 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. |
|
||||
|
||||
@@ -1,29 +1,29 @@
|
||||
import { FC, useEffect, useState } from 'react';
|
||||
import { GSX_SERVICE_CALLED, GSX_SERVICE_FINISHED } from '../../constants';
|
||||
import { WASMDataF } from '../../types/WASMData';
|
||||
import { LoadingState, SimBrief } from '../../types/general';
|
||||
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 ActionBar from '../actionbar/ActionBar';
|
||||
import Input from '../input/Input';
|
||||
|
||||
interface SBEntryProps {
|
||||
WASMData: WASMDataF;
|
||||
loadingState: LoadingState;
|
||||
gsxActive: boolean;
|
||||
setLoadingState: (newState: LoadingState) => void;
|
||||
}
|
||||
|
||||
const SBEntryF: FC<SBEntryProps> = ({ WASMData, loadingState, setLoadingState }) => {
|
||||
const SBEntryF: FC<SBEntryProps> = ({ WASMData, loadingState, gsxActive, setLoadingState }) => {
|
||||
const [CGTarget, setCGTarget] = useState(WASMData.targetPayload.CGTarget);
|
||||
const [fuel, setFuel] = useState(Math.round(WASMData.livePayload.fuel));
|
||||
const [fuelEnabled, setFuelEnabled] = useState(true);
|
||||
const [fuel, setFuel] = useState(Math.round(WASMData.targetPayload.fuel));
|
||||
const [SBInFlight, setSBInFlight] = useState(false);
|
||||
|
||||
// FROM EFB
|
||||
const simBrief = useSelector((state) => state.simbrief.plan);
|
||||
|
||||
const ZFW = () => {
|
||||
if (loadingState !== 'loaded' && !GSXActive()) return Math.round(WASMData.targetPayload.total);
|
||||
if (loadingState !== 'loaded' && !gsxActive) return Math.round(WASMData.targetPayload.total);
|
||||
|
||||
return Math.round(WASMData.livePayload.total);
|
||||
};
|
||||
@@ -37,13 +37,6 @@ const SBEntryF: FC<SBEntryProps> = ({ WASMData, loadingState, setLoadingState })
|
||||
return GW() <= WASMData.limits.maxTOW;
|
||||
};
|
||||
|
||||
const GSXActive = () => {
|
||||
return (
|
||||
(WASMData.GSX.boardingState >= GSX_SERVICE_CALLED || WASMData.GSX.deboardingState >= GSX_SERVICE_CALLED) &&
|
||||
WASMData.GSX.deboardingState !== GSX_SERVICE_FINISHED
|
||||
);
|
||||
};
|
||||
|
||||
const handleInput = (input: string, maxValue: number, setter: (value: number) => void) => {
|
||||
if (!input) {
|
||||
setter(0);
|
||||
@@ -58,8 +51,13 @@ const SBEntryF: FC<SBEntryProps> = ({ WASMData, loadingState, setLoadingState })
|
||||
}
|
||||
};
|
||||
|
||||
const updateData = (SBPlan?: SimBrief, _fuel?: number) => {
|
||||
CoherentCallSBEntryF(CGTarget, _fuel ?? fuel, SBPlan);
|
||||
};
|
||||
|
||||
useEffect(() => updateData(), [CGTarget, fuel]);
|
||||
useEffect(() => {
|
||||
if (!simBrief || GSXActive()) return;
|
||||
if (!simBrief || gsxActive) return;
|
||||
|
||||
setSBInFlight(true);
|
||||
|
||||
@@ -76,12 +74,13 @@ const SBEntryF: FC<SBEntryProps> = ({ WASMData, loadingState, setLoadingState })
|
||||
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);
|
||||
}, [simBrief, GSXActive()]);
|
||||
|
||||
}, [simBrief, gsxActive]);
|
||||
useEffect(
|
||||
() =>
|
||||
setFuel((prev) => {
|
||||
@@ -90,13 +89,6 @@ const SBEntryF: FC<SBEntryProps> = ({ WASMData, loadingState, setLoadingState })
|
||||
}),
|
||||
[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 (
|
||||
<>
|
||||
@@ -104,30 +96,14 @@ const SBEntryF: FC<SBEntryProps> = ({ WASMData, loadingState, setLoadingState })
|
||||
<div className="relative flex w-full items-center justify-between rounded-md bg-zinc-600 p-2 px-4">
|
||||
<div className="flex w-full items-center justify-between text-xs">
|
||||
<label>Fuel ({WASMData.userData.isImperial ? 'lbs' : 'kg'})</label>
|
||||
<input
|
||||
<Input
|
||||
type="text"
|
||||
placeholder=""
|
||||
className={`w-1/2 rounded-lg border border-white bg-zinc-700 px-3 py-2 text-right`}
|
||||
value={fuel}
|
||||
onChange={(e) => handleInput(e.target.value, WASMData.limits.maxFuel, setFuel)}
|
||||
disabled={loadingState !== 'preview' || GSXActive()}
|
||||
onChange={(value) => handleInput(value, WASMData.limits.maxFuel, setFuel)}
|
||||
disabled={loadingState !== 'preview' || gsxActive}
|
||||
/>
|
||||
<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>
|
||||
@@ -166,18 +142,16 @@ const SBEntryF: FC<SBEntryProps> = ({ WASMData, loadingState, setLoadingState })
|
||||
minCG={WASMData.limits.minCG}
|
||||
maxCG={WASMData.limits.maxCG}
|
||||
value={CGTarget}
|
||||
disabled={loadingState !== 'preview' || GSXActive()}
|
||||
disabled={loadingState !== 'preview' || gsxActive}
|
||||
increase={() =>
|
||||
setCGTarget((prev) => {
|
||||
const _new = prev + 0.1;
|
||||
updateData(_new);
|
||||
return _new;
|
||||
})
|
||||
}
|
||||
decrease={() =>
|
||||
setCGTarget((prev) => {
|
||||
const _new = prev - 0.1;
|
||||
updateData(_new);
|
||||
return _new;
|
||||
})
|
||||
}
|
||||
@@ -190,7 +164,7 @@ const SBEntryF: FC<SBEntryProps> = ({ WASMData, loadingState, setLoadingState })
|
||||
<div className="relative flex w-full items-center justify-between rounded-t-md bg-zinc-600 p-2 px-4">
|
||||
<div className="flex w-full items-center justify-between text-xs">
|
||||
<label>
|
||||
{loadingState !== 'loaded' && !GSXActive() ? 'Expected' : 'Actual'} ZFW (
|
||||
{loadingState !== 'loaded' && !gsxActive ? 'Expected' : 'Actual'} ZFW (
|
||||
{WASMData.userData.isImperial ? 'lbs' : 'kg'})
|
||||
</label>
|
||||
<input
|
||||
@@ -205,7 +179,7 @@ const SBEntryF: FC<SBEntryProps> = ({ WASMData, loadingState, setLoadingState })
|
||||
<div className="relative flex w-full items-center justify-between rounded-b-md bg-zinc-700 p-2 px-4">
|
||||
<div className="flex w-full items-center justify-between text-xs">
|
||||
<label>
|
||||
{loadingState !== 'loaded' && !GSXActive() ? 'Expected' : 'Actual'} GW (
|
||||
{loadingState !== 'loaded' && !gsxActive ? 'Expected' : 'Actual'} GW (
|
||||
{WASMData.userData.isImperial ? 'lbs' : 'kg'})
|
||||
</label>
|
||||
<input
|
||||
|
||||
@@ -1,21 +1,22 @@
|
||||
import { FC, useEffect, useState } from 'react';
|
||||
import { GSX_SERVICE_CALLED, GSX_SERVICE_FINISHED } from '../../constants';
|
||||
import { WASMDataPax } from '../../types/WASMData';
|
||||
import { LoadingState, SimBrief } from '../../types/general';
|
||||
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 ActionBar from '../actionbar/ActionBar';
|
||||
import Input from '../input/Input';
|
||||
|
||||
interface SBEntryProps {
|
||||
WASMData: WASMDataPax;
|
||||
loadingState: LoadingState;
|
||||
gsxActive: boolean;
|
||||
setLoadingState: (newState: LoadingState) => void;
|
||||
}
|
||||
|
||||
const SBEntryPax: FC<SBEntryProps> = ({ WASMData, loadingState, setLoadingState }) => {
|
||||
const SBEntryPax: FC<SBEntryProps> = ({ WASMData, loadingState, gsxActive, setLoadingState }) => {
|
||||
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);
|
||||
|
||||
@@ -23,7 +24,7 @@ const SBEntryPax: FC<SBEntryProps> = ({ WASMData, loadingState, setLoadingState
|
||||
const simBrief = useSelector((state) => state.simbrief.plan);
|
||||
|
||||
const ZFW = () => {
|
||||
if (loadingState !== 'loaded' && !GSXActive()) return Math.round(WASMData.targetPayload.total);
|
||||
if (loadingState !== 'loaded' && !gsxActive) return Math.round(WASMData.targetPayload.total);
|
||||
|
||||
return Math.round(WASMData.livePayload.total);
|
||||
};
|
||||
@@ -37,13 +38,6 @@ const SBEntryPax: FC<SBEntryProps> = ({ WASMData, loadingState, setLoadingState
|
||||
return GW() <= WASMData.limits.maxTOW;
|
||||
};
|
||||
|
||||
const GSXActive = () => {
|
||||
return (
|
||||
(WASMData.GSX.boardingState >= GSX_SERVICE_CALLED || WASMData.GSX.deboardingState >= GSX_SERVICE_CALLED) &&
|
||||
WASMData.GSX.deboardingState !== GSX_SERVICE_FINISHED
|
||||
);
|
||||
};
|
||||
|
||||
const handleInput = (input: string, maxValue: number, setter: (value: number) => void) => {
|
||||
if (!input) {
|
||||
setter(0);
|
||||
@@ -58,8 +52,12 @@ const SBEntryPax: FC<SBEntryProps> = ({ WASMData, loadingState, setLoadingState
|
||||
}
|
||||
};
|
||||
|
||||
const updateData = (SBPlan?: SimBrief, _fuel?: number) => {
|
||||
CoherentCallSBEntryPax(CGTarget, _fuel ?? fuel, SBPlan);
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
if (!simBrief || GSXActive()) return;
|
||||
if (!simBrief || gsxActive) return;
|
||||
|
||||
setSBInFlight(true);
|
||||
|
||||
@@ -76,12 +74,17 @@ const SBEntryPax: FC<SBEntryProps> = ({ WASMData, loadingState, setLoadingState
|
||||
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);
|
||||
setSBInFlight(false);
|
||||
}, [simBrief, GSXActive()]);
|
||||
}, [simBrief, gsxActive]);
|
||||
|
||||
useEffect(() => updateData(), [CGTarget, fuel]);
|
||||
useEffect(
|
||||
() =>
|
||||
setFuel((prev) => {
|
||||
@@ -90,13 +93,6 @@ const SBEntryPax: FC<SBEntryProps> = ({ WASMData, loadingState, setLoadingState
|
||||
}),
|
||||
[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 (
|
||||
<>
|
||||
@@ -104,30 +100,14 @@ const SBEntryPax: FC<SBEntryProps> = ({ WASMData, loadingState, setLoadingState
|
||||
<div className="flex w-full items-center justify-between rounded-md bg-zinc-600 p-2 px-4">
|
||||
<div className="flex w-full items-center justify-between text-xs">
|
||||
<label>Fuel ({WASMData.userData.isImperial ? 'lbs' : 'kg'})</label>
|
||||
<input
|
||||
<Input
|
||||
type="text"
|
||||
placeholder=""
|
||||
className={`w-1/2 rounded-lg border border-white bg-zinc-700 px-3 py-2 text-right`}
|
||||
value={fuel}
|
||||
onChange={(e) => handleInput(e.target.value, WASMData.limits.maxFuel, setFuel)}
|
||||
disabled={loadingState !== 'preview' || GSXActive()}
|
||||
onChange={(value) => handleInput(value, WASMData.limits.maxFuel, setFuel)}
|
||||
disabled={loadingState !== 'preview' || gsxActive}
|
||||
/>
|
||||
<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>
|
||||
@@ -166,18 +146,16 @@ const SBEntryPax: FC<SBEntryProps> = ({ WASMData, loadingState, setLoadingState
|
||||
minCG={WASMData.limits.minCG}
|
||||
maxCG={WASMData.limits.maxCG}
|
||||
value={CGTarget}
|
||||
disabled={loadingState !== 'preview' || GSXActive()}
|
||||
disabled={loadingState !== 'preview' || gsxActive}
|
||||
increase={() =>
|
||||
setCGTarget((prev) => {
|
||||
const _new = prev + 0.1;
|
||||
updateData(_new);
|
||||
return _new;
|
||||
})
|
||||
}
|
||||
decrease={() =>
|
||||
setCGTarget((prev) => {
|
||||
const _new = prev - 0.1;
|
||||
updateData(_new);
|
||||
return _new;
|
||||
})
|
||||
}
|
||||
@@ -190,7 +168,7 @@ const SBEntryPax: FC<SBEntryProps> = ({ WASMData, loadingState, setLoadingState
|
||||
<div className="flex w-full items-center justify-between rounded-t-md bg-zinc-600 p-2 px-4">
|
||||
<div className="flex w-full items-center justify-between text-xs">
|
||||
<label>
|
||||
{loadingState !== 'loaded' && !GSXActive() ? 'Expected' : 'Actual'} ZFW (
|
||||
{loadingState !== 'loaded' && !gsxActive ? 'Expected' : 'Actual'} ZFW (
|
||||
{WASMData.userData.isImperial ? 'lbs' : 'kg'})
|
||||
</label>
|
||||
<input
|
||||
@@ -205,7 +183,7 @@ const SBEntryPax: FC<SBEntryProps> = ({ WASMData, loadingState, setLoadingState
|
||||
<div className="flex w-full items-center justify-between rounded-b-md bg-zinc-700 p-2 px-4">
|
||||
<div className="flex w-full items-center justify-between text-xs">
|
||||
<label>
|
||||
{loadingState !== 'loaded' && !GSXActive() ? 'Expected' : 'Actual'} GW (
|
||||
{loadingState !== 'loaded' && !gsxActive ? 'Expected' : 'Actual'} GW (
|
||||
{WASMData.userData.isImperial ? 'lbs' : 'kg'})
|
||||
</label>
|
||||
<input
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import { FC, useEffect, useState } from 'react';
|
||||
import { GSX_SERVICE_CALLED, GSX_SERVICE_FINISHED } from '../../constants';
|
||||
import { LoadingState } from '../../types/general';
|
||||
import { WASMDataF } from '../../types/WASMData';
|
||||
import { GSXLoadingState, WASMDataF } from '../../types/WASMData';
|
||||
import OptionsF from '../options/OptionsF';
|
||||
import Profile from '../profile/Profile';
|
||||
import SBEntryF from '../SBEntry/SBEntryF';
|
||||
@@ -61,8 +60,9 @@ const Freighter: FC<FreighterProps> = ({ WASMData, username }) => {
|
||||
|
||||
const GSXActive = () => {
|
||||
return (
|
||||
(WASMData.GSX.boardingState >= GSX_SERVICE_CALLED || WASMData.GSX.deboardingState >= GSX_SERVICE_CALLED) &&
|
||||
WASMData.GSX.deboardingState !== GSX_SERVICE_FINISHED
|
||||
WASMData.GSX.couatlStarted &&
|
||||
WASMData.GSX.loadingState !== GSXLoadingState.IDLE &&
|
||||
WASMData.GSX.loadingState !== GSXLoadingState.DEBOARDED
|
||||
);
|
||||
};
|
||||
|
||||
@@ -76,7 +76,7 @@ const Freighter: FC<FreighterProps> = ({ WASMData, username }) => {
|
||||
];
|
||||
}
|
||||
|
||||
if (WASMData.options.GSXSync && GSXActive() && WASMData.GSX.boardingState !== GSX_SERVICE_FINISHED) {
|
||||
if (WASMData.options.GSXSync && GSXActive() && WASMData.GSX.loadingState === GSXLoadingState.BOARDING) {
|
||||
return [
|
||||
WASMData.targetPayload.ZFWCG.toFixed(1),
|
||||
WASMData.targetPayload.ZFWCG < WASMData.limits.minCG || WASMData.targetPayload.ZFWCG > WASMData.limits.maxCG,
|
||||
@@ -114,30 +114,42 @@ const Freighter: FC<FreighterProps> = ({ WASMData, username }) => {
|
||||
inPreview={loadingState !== 'loaded' && !GSXActive()}
|
||||
CGs={CGs()}
|
||||
done={
|
||||
WASMData.options.GSXSync
|
||||
? WASMData.GSX.boardingState === GSX_SERVICE_FINISHED &&
|
||||
WASMData.GSX.deboardingState !== GSX_SERVICE_FINISHED
|
||||
: loadingState !== 'preview'
|
||||
WASMData.options.GSXSync ? WASMData.GSX.loadingState === GSXLoadingState.BOARDED : loadingState !== 'preview'
|
||||
}
|
||||
/>
|
||||
<Tabbar
|
||||
tabs={
|
||||
username ? ['Simbrief', 'ZFW', 'Passengers & Cargo', 'Options'] : ['ZFW', 'Passengers & Cargo', 'Options']
|
||||
username ? ['Simbrief', 'ZFW', 'Cargo', 'Options'] : ['ZFW', 'Cargo', 'Options']
|
||||
}
|
||||
selectedTab={selectedTab}
|
||||
setSelectedTab={setSelectedTab}
|
||||
/>
|
||||
{username && selectedTab === 0 && (
|
||||
<SBEntryF WASMData={WASMData} loadingState={loadingState} setLoadingState={setLoadingState} />
|
||||
<SBEntryF
|
||||
WASMData={WASMData}
|
||||
loadingState={loadingState}
|
||||
setLoadingState={setLoadingState}
|
||||
gsxActive={GSXActive()}
|
||||
/>
|
||||
)}
|
||||
{((username && selectedTab === 1) || (!username && selectedTab === 0)) && (
|
||||
<ZFWEntryF WASMData={WASMData} loadingState={loadingState} setLoadingState={setLoadingState} />
|
||||
<ZFWEntryF
|
||||
WASMData={WASMData}
|
||||
loadingState={loadingState}
|
||||
setLoadingState={setLoadingState}
|
||||
gsxActive={GSXActive()}
|
||||
/>
|
||||
)}
|
||||
{((username && selectedTab === 2) || (!username && selectedTab === 1)) && (
|
||||
<StationEntryF WASMData={WASMData} loadingState={loadingState} setLoadingState={setLoadingState} />
|
||||
<StationEntryF
|
||||
WASMData={WASMData}
|
||||
loadingState={loadingState}
|
||||
setLoadingState={setLoadingState}
|
||||
gsxActive={GSXActive()}
|
||||
/>
|
||||
)}
|
||||
{((username && selectedTab === 3) || (!username && selectedTab === 2)) && (
|
||||
<OptionsF WASMData={WASMData} loadingState={loadingState} />
|
||||
<OptionsF WASMData={WASMData} loadingState={loadingState} gsxActive={GSXActive()} />
|
||||
)}
|
||||
</>
|
||||
);
|
||||
|
||||
@@ -0,0 +1,83 @@
|
||||
import { useEffect, useRef, useState } from 'react';
|
||||
import { v4 } from 'uuid';
|
||||
import Keyboard from '../keyboard/Keyboard';
|
||||
|
||||
export default function Input(props: {
|
||||
type?: string;
|
||||
topKeyboard?: boolean;
|
||||
value: number | string;
|
||||
min?: number;
|
||||
max?: number;
|
||||
step?: number;
|
||||
placeholder?: string;
|
||||
className?: string;
|
||||
disabled?: boolean;
|
||||
onChange?: (value: string) => void;
|
||||
onBlur?: (value: string) => void;
|
||||
}) {
|
||||
const [guid] = useState(v4());
|
||||
const ref = useRef<HTMLInputElement>(null);
|
||||
const keyboardRef = useRef<HTMLDivElement>(null);
|
||||
const blurRef = useRef<boolean>(false);
|
||||
const [isFocused, setFocused] = useState(false);
|
||||
const [showKeyboard, setShowKeyboard] = useState(false);
|
||||
|
||||
useEffect(() => {
|
||||
if (isFocused) {
|
||||
Coherent.trigger('FOCUS_INPUT_FIELD', guid, '', '', '', false);
|
||||
} else {
|
||||
console.log('UNFOCUS_INPUT_FIELD');
|
||||
Coherent.trigger('UNFOCUS_INPUT_FIELD', guid);
|
||||
}
|
||||
}, [isFocused, guid]);
|
||||
|
||||
return (
|
||||
<>
|
||||
<input
|
||||
ref={ref}
|
||||
type={props.type ? props.type : 'text'}
|
||||
min={props.min}
|
||||
max={props.max}
|
||||
step={props.step}
|
||||
placeholder={props.placeholder}
|
||||
disabled={props.disabled}
|
||||
onFocus={() => {
|
||||
if (!isFocused) {
|
||||
setFocused(true);
|
||||
setShowKeyboard(true);
|
||||
ref.current?.select();
|
||||
}
|
||||
}}
|
||||
onBlur={(e) => {
|
||||
if (blurRef.current && isFocused) ref.current?.focus();
|
||||
else {
|
||||
props.onBlur?.(e.target.value);
|
||||
setShowKeyboard(false);
|
||||
setFocused(false);
|
||||
ref.current?.blur();
|
||||
}
|
||||
blurRef.current = false;
|
||||
}}
|
||||
onChange={(e) => {
|
||||
if (props.onChange) props.onChange(e.target.value);
|
||||
}}
|
||||
value={props.value}
|
||||
className={props.className}
|
||||
/>
|
||||
{showKeyboard && (
|
||||
<Keyboard
|
||||
ref={keyboardRef}
|
||||
top={props.topKeyboard}
|
||||
value={String(props.value)}
|
||||
blurRef={blurRef}
|
||||
onInput={(value) => props.onChange && props.onChange(value)}
|
||||
onClose={() => {
|
||||
setShowKeyboard(false);
|
||||
setFocused(false);
|
||||
ref.current?.blur();
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,108 @@
|
||||
import { ArrowBigUp, Delete, Space, X } from 'lucide-react';
|
||||
import { forwardRef, RefObject, useState } from 'react';
|
||||
import { createPortal } from 'react-dom';
|
||||
|
||||
const defaultLayout = {
|
||||
default: [
|
||||
'1 2 3 4 5 6 7 8 9 0 {bksp}',
|
||||
'q w e r t y u i o p',
|
||||
'a s d f g h j k l',
|
||||
'{shift} z x c v b n m /',
|
||||
'{space} {close}',
|
||||
],
|
||||
shift: [
|
||||
'1 2 3 4 5 6 7 8 9 0 {bksp}',
|
||||
'Q W E R T Y U I O P',
|
||||
'A S D F G H J K L',
|
||||
'{shift} Z X C V B N M /',
|
||||
'{space} {close}',
|
||||
],
|
||||
};
|
||||
|
||||
const Keyboard = forwardRef<
|
||||
HTMLDivElement,
|
||||
{
|
||||
value: string;
|
||||
blurRef: RefObject<boolean>;
|
||||
top?: boolean;
|
||||
onInput: (value: string) => void;
|
||||
onClose: () => void;
|
||||
}
|
||||
>(({ value, top, blurRef, onInput, onClose }, ref) => {
|
||||
const [shift, setShift] = useState(false);
|
||||
|
||||
const layout = shift ? defaultLayout.shift : defaultLayout.default;
|
||||
|
||||
const handleKeyPress = (key: string) => {
|
||||
console.log('KEY PRESSED', key);
|
||||
|
||||
if (key === '{close}') {
|
||||
onClose();
|
||||
return;
|
||||
}
|
||||
|
||||
blurRef.current = true;
|
||||
|
||||
if (key === '{shift}') {
|
||||
setShift(!shift);
|
||||
return;
|
||||
}
|
||||
|
||||
let newValue = value;
|
||||
|
||||
if (key === '{bksp}') {
|
||||
newValue = value.slice(0, -1);
|
||||
} else if (key === '{space}') {
|
||||
newValue = value + ' ';
|
||||
} else if (key.length === 1) {
|
||||
newValue = value + key;
|
||||
}
|
||||
|
||||
onInput(newValue);
|
||||
};
|
||||
|
||||
return createPortal(
|
||||
<div
|
||||
ref={ref}
|
||||
className={`absolute ${top ? 'top-0' : 'bottom-0'} left-0 z-50 box-border w-full touch-manipulation select-none overflow-hidden bg-zinc-800 p-2 text-white`}
|
||||
>
|
||||
{layout.map((row, rowIndex) => (
|
||||
<div key={`row-${rowIndex}`} className="mb-1 flex w-full justify-center gap-1">
|
||||
{row.split(' ').map((key, keyIndex) => {
|
||||
let keyIdent = <>{key}</>;
|
||||
switch (key) {
|
||||
case '{shift}':
|
||||
keyIdent = <ArrowBigUp />;
|
||||
break;
|
||||
case '{bksp}':
|
||||
keyIdent = <Delete />;
|
||||
break;
|
||||
case '{close}':
|
||||
keyIdent = <X />;
|
||||
break;
|
||||
case '{space}':
|
||||
keyIdent = <Space />;
|
||||
break;
|
||||
}
|
||||
|
||||
return (
|
||||
<button
|
||||
key={`key-${rowIndex}-${keyIndex}`}
|
||||
className={`flex justify-center rounded-md p-4 ${
|
||||
key === '{close}' ? 'bg-zinc-700 px-12 focus:bg-zinc-600' : 'flex-1 bg-zinc-600'
|
||||
}`}
|
||||
onMouseDown={() => handleKeyPress(key)}
|
||||
>
|
||||
{keyIdent}
|
||||
</button>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
))}
|
||||
</div>,
|
||||
document.body
|
||||
);
|
||||
});
|
||||
Keyboard.displayName = "Keyboard"
|
||||
|
||||
export default Keyboard;
|
||||
@@ -1,23 +1,16 @@
|
||||
import { FC } from 'react';
|
||||
import { GSX_SERVICE_CALLED, GSX_SERVICE_FINISHED } from '../../constants';
|
||||
import { LoadingState } from '../../types/general';
|
||||
import { WASMDataF } from '../../types/WASMData';
|
||||
import { CoherentCallOptionsSet } from '../../utils/utils';
|
||||
import { CoherentCallGSXReset, CoherentCallOptionsSet } from '../../utils/utils';
|
||||
import ToggleComponentKH from '../toggleComponent/ToggleComponent';
|
||||
|
||||
interface OptionsFProps {
|
||||
WASMData: WASMDataF;
|
||||
loadingState: LoadingState;
|
||||
gsxActive: boolean;
|
||||
}
|
||||
|
||||
const OptionsF: FC<OptionsFProps> = ({ WASMData, loadingState }) => {
|
||||
const GSXActive = () => {
|
||||
return (
|
||||
(WASMData.GSX.boardingState >= GSX_SERVICE_CALLED || WASMData.GSX.deboardingState >= GSX_SERVICE_CALLED) &&
|
||||
WASMData.GSX.deboardingState !== GSX_SERVICE_FINISHED
|
||||
);
|
||||
};
|
||||
|
||||
const OptionsF: FC<OptionsFProps> = ({ WASMData, loadingState, gsxActive }) => {
|
||||
return (
|
||||
<>
|
||||
<div className="block flex w-full flex-col opacity-100 transition-opacity duration-150 ease-linear mb-4">
|
||||
@@ -31,7 +24,7 @@ const OptionsF: FC<OptionsFProps> = ({ WASMData, loadingState }) => {
|
||||
setValue={(value) => {
|
||||
CoherentCallOptionsSet(value);
|
||||
}}
|
||||
disabled={loadingState !== 'preview' || GSXActive()}
|
||||
disabled={loadingState !== 'preview' || gsxActive}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -41,34 +34,36 @@ const OptionsF: FC<OptionsFProps> = ({ WASMData, loadingState }) => {
|
||||
<>
|
||||
<h2 className="text-sm font-medium uppercase">SimBrief Profile Settings - ER Variant</h2>
|
||||
<table className="text-xs">
|
||||
<tr>
|
||||
<td className="p-1 px-2">Max Passengers</td>
|
||||
<td className="p-1 px-2">0</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td className="p-1 px-2">Passenger Weight</td>
|
||||
<td className="p-1 px-2">1 {WASMData.userData.isImperial ? 'lbs' : 'kg'}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td className="p-1 px-2">Bag Weight</td>
|
||||
<td className="p-1 px-2">0 {WASMData.userData.isImperial ? 'lbs' : 'kg'}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td className="p-1 px-2">Empty Weight</td>
|
||||
<td className="p-1 px-2">{WASMData.userData.isImperial ? '249537 lbs' : '113188 kg'}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td className="p-1 px-2">Max Zero Fuel Weight</td>
|
||||
<td className="p-1 px-2">{WASMData.userData.isImperial ? '451300 lbs' : '204706 kg'}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td className="p-1 px-2">Max Takeoff Weight</td>
|
||||
<td className="p-1 px-2">{WASMData.userData.isImperial ? '630500 lbs' : '285990 kg'}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td className="p-1 px-2">Max Fuel Capacity</td>
|
||||
<td className="p-1 px-2">{WASMData.userData.isImperial ? '282619 lbs' : '128193 kg'}</td>
|
||||
</tr>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td className="p-1 px-2">Max Passengers</td>
|
||||
<td className="p-1 px-2">0</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td className="p-1 px-2">Passenger Weight</td>
|
||||
<td className="p-1 px-2">1 {WASMData.userData.isImperial ? 'lbs' : 'kg'}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td className="p-1 px-2">Bag Weight</td>
|
||||
<td className="p-1 px-2">0 {WASMData.userData.isImperial ? 'lbs' : 'kg'}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<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>
|
||||
</tr>
|
||||
<tr>
|
||||
<td className="p-1 px-2">Max Zero Fuel Weight</td>
|
||||
<td className="p-1 px-2">{WASMData.userData.isImperial ? '451300 lbs' : '204706 kg'}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td className="p-1 px-2">Max Takeoff Weight</td>
|
||||
<td className="p-1 px-2">{WASMData.userData.isImperial ? '630500 lbs' : '285990 kg'}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td className="p-1 px-2">Max Fuel Capacity</td>
|
||||
<td className="p-1 px-2">{WASMData.userData.isImperial ? '282619 lbs' : '128193 kg'}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</>
|
||||
) : (
|
||||
@@ -89,7 +84,7 @@ const OptionsF: FC<OptionsFProps> = ({ WASMData, loadingState }) => {
|
||||
<td className="p-1 px-2">0 {WASMData.userData.isImperial ? 'lbs' : 'kg'}</td>
|
||||
</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>
|
||||
</tr>
|
||||
<tr>
|
||||
@@ -109,6 +104,16 @@ const OptionsF: FC<OptionsFProps> = ({ WASMData, loadingState }) => {
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
|
||||
<div className="block flex w-full flex-col opacity-100 transition-opacity duration-150 ease-linear mb-4">
|
||||
<button
|
||||
className="middle none center rounded-lg bg-red-600 px-6 py-3 font-sans text-xs font-bold uppercase text-white shadow-md shadow-red-500/20 transition-all hover:shadow-lg hover:shadow-red-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={CoherentCallGSXReset}
|
||||
>
|
||||
Reset internal GSX state
|
||||
</button>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -1,26 +1,20 @@
|
||||
import { FC, useEffect, useState } from 'react';
|
||||
import { GSX_SERVICE_CALLED, GSX_SERVICE_FINISHED } from '../../constants';
|
||||
import { LoadingState } from '../../types/general';
|
||||
import { WASMDataPax } from '../../types/WASMData';
|
||||
import { CoherentCallOptionsSet } from '../../utils/utils';
|
||||
import { CoherentCallGSXReset, CoherentCallOptionsSet } from '../../utils/utils';
|
||||
import Input from '../input/Input';
|
||||
import ToggleComponentKH from '../toggleComponent/ToggleComponent';
|
||||
|
||||
interface OptionsPaxProps {
|
||||
WASMData: WASMDataPax;
|
||||
loadingState: LoadingState;
|
||||
gsxActive: boolean;
|
||||
}
|
||||
|
||||
const OptionsPax: FC<OptionsPaxProps> = ({ WASMData, loadingState }) => {
|
||||
const OptionsPax: FC<OptionsPaxProps> = ({ WASMData, loadingState, gsxActive }) => {
|
||||
const [paxWeight, setPaxWeight] = useState(WASMData.options.paxWeight);
|
||||
const [bagWeight, setBagWeight] = useState(WASMData.options.bagWeight);
|
||||
|
||||
const GSXActive = () => {
|
||||
return (
|
||||
(WASMData.GSX.boardingState >= GSX_SERVICE_CALLED || WASMData.GSX.deboardingState >= GSX_SERVICE_CALLED) &&
|
||||
WASMData.GSX.deboardingState !== GSX_SERVICE_FINISHED
|
||||
);
|
||||
};
|
||||
|
||||
const updateData = () => {
|
||||
CoherentCallOptionsSet(undefined, paxWeight, bagWeight);
|
||||
};
|
||||
@@ -54,7 +48,7 @@ const OptionsPax: FC<OptionsPaxProps> = ({ WASMData, loadingState }) => {
|
||||
setValue={(value) => {
|
||||
CoherentCallOptionsSet(value);
|
||||
}}
|
||||
disabled={loadingState !== 'preview' || GSXActive()}
|
||||
disabled={loadingState !== 'preview' || gsxActive}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -63,26 +57,26 @@ const OptionsPax: FC<OptionsPaxProps> = ({ WASMData, loadingState }) => {
|
||||
<div className="relative flex w-full items-center justify-between rounded-t-md bg-zinc-600 p-2 px-4">
|
||||
<div className="flex w-full items-center justify-between text-xs">
|
||||
<label>Pax Weight ({WASMData.userData.isImperial ? 'lbs' : 'kg'})</label>
|
||||
<input
|
||||
<Input
|
||||
type="text"
|
||||
placeholder=""
|
||||
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={paxWeight}
|
||||
onChange={(e) => handleInput(e.target.value, Number.MAX_VALUE, setPaxWeight)}
|
||||
disabled={loadingState !== 'preview' || GSXActive()}
|
||||
onChange={(value) => handleInput(value, Number.MAX_VALUE, setPaxWeight)}
|
||||
disabled={loadingState !== 'preview' || gsxActive}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div className="relative flex w-full items-center justify-between rounded-b-md bg-zinc-700 p-2 px-4">
|
||||
<div className="flex w-full items-center justify-between text-xs">
|
||||
<label>Bag Weight ({WASMData.userData.isImperial ? 'lbs' : 'kg'})</label>
|
||||
<input
|
||||
<Input
|
||||
type="text"
|
||||
placeholder=""
|
||||
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={bagWeight}
|
||||
onChange={(e) => handleInput(e.target.value, Number.MAX_VALUE, setBagWeight)}
|
||||
disabled={loadingState !== 'preview' || GSXActive()}
|
||||
onChange={(value) => handleInput(value, Number.MAX_VALUE, setBagWeight)}
|
||||
disabled={loadingState !== 'preview' || gsxActive}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -92,49 +86,11 @@ const OptionsPax: FC<OptionsPaxProps> = ({ WASMData, loadingState }) => {
|
||||
{WASMData.userData.isER ? (
|
||||
<>
|
||||
<h2 className="text-sm font-medium uppercase">SimBrief Profile Settings - ER Variant</h2>
|
||||
<table className="text-xs">
|
||||
<tr>
|
||||
<td className="p-1 px-2">Max Passengers</td>
|
||||
<td className="p-1 px-2">298</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td className="p-1 px-2">Passenger Weight</td>
|
||||
<td className="p-1 px-2">
|
||||
{WASMData.options.paxWeight} {WASMData.userData.isImperial ? 'lbs' : 'kg'}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td className="p-1 px-2">Bag Weight</td>
|
||||
<td className="p-1 px-2">
|
||||
{WASMData.options.bagWeight} {WASMData.userData.isImperial ? 'lbs' : 'kg'}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td className="p-1 px-2">Empty Weight</td>
|
||||
<td className="p-1 px-2">{WASMData.userData.isImperial ? '286275 lbs' : '129851 kg'}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td className="p-1 px-2">Max Zero Fuel Weight</td>
|
||||
<td className="p-1 px-2">{WASMData.userData.isImperial ? '400000 lbs' : '181437 kg'}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td className="p-1 px-2">Max Takeoff Weight</td>
|
||||
<td className="p-1 px-2">{WASMData.userData.isImperial ? '630500 lbs' : '285990 kg'}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td className="p-1 px-2">Max Fuel Capacity</td>
|
||||
<td className="p-1 px-2">{WASMData.userData.isImperial ? '282619 lbs' : '128193 kg'}</td>
|
||||
</tr>
|
||||
</table>
|
||||
</>
|
||||
) : (
|
||||
<>
|
||||
<h2 className="text-sm font-medium uppercase">SimBrief Profile Settings - Normal variant</h2>
|
||||
<table className="text-xs">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td className="p-1 px-2">Max Passengers</td>
|
||||
<td className="p-1 px-2">298</td>
|
||||
<td className="p-1 px-2">313</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td className="p-1 px-2">Passenger Weight</td>
|
||||
@@ -149,8 +105,48 @@ const OptionsPax: FC<OptionsPaxProps> = ({ WASMData, loadingState }) => {
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td className="p-1 px-2">Empty Weight</td>
|
||||
<td className="p-1 px-2">{WASMData.userData.isImperial ? '285875 lbs' : '129671 kg'}</td>
|
||||
<td className="p-1 px-2">Empty Weight (inc. crew)</td>
|
||||
<td className="p-1 px-2">{WASMData.userData.isImperial ? '286465 lbs' : '129937 kg'}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td className="p-1 px-2">Max Zero Fuel Weight</td>
|
||||
<td className="p-1 px-2">{WASMData.userData.isImperial ? '400000 lbs' : '181437 kg'}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td className="p-1 px-2">Max Takeoff Weight</td>
|
||||
<td className="p-1 px-2">{WASMData.userData.isImperial ? '630500 lbs' : '285990 kg'}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td className="p-1 px-2">Max Fuel Capacity</td>
|
||||
<td className="p-1 px-2">{WASMData.userData.isImperial ? '282619 lbs' : '128193 kg'}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</>
|
||||
) : (
|
||||
<>
|
||||
<h2 className="text-sm font-medium uppercase">SimBrief Profile Settings - Normal variant</h2>
|
||||
<table className="text-xs">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td className="p-1 px-2">Max Passengers</td>
|
||||
<td className="p-1 px-2">313</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td className="p-1 px-2">Passenger Weight</td>
|
||||
<td className="p-1 px-2">
|
||||
{WASMData.options.paxWeight} {WASMData.userData.isImperial ? 'lbs' : 'kg'}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td className="p-1 px-2">Bag Weight</td>
|
||||
<td className="p-1 px-2">
|
||||
{WASMData.options.bagWeight} {WASMData.userData.isImperial ? 'lbs' : 'kg'}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td className="p-1 px-2">Empty Weight (inc. crew)</td>
|
||||
<td className="p-1 px-2">{WASMData.userData.isImperial ? '286065 lbs' : '129755 kg'}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td className="p-1 px-2">Max Zero Fuel Weight</td>
|
||||
@@ -169,6 +165,16 @@ const OptionsPax: FC<OptionsPaxProps> = ({ WASMData, loadingState }) => {
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
|
||||
<div className="block flex w-full flex-col opacity-100 transition-opacity duration-150 ease-linear mb-4">
|
||||
<button
|
||||
className="middle none center rounded-lg bg-red-600 px-6 py-3 font-sans text-xs font-bold uppercase text-white shadow-md shadow-red-500/20 transition-all hover:shadow-lg hover:shadow-red-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={CoherentCallGSXReset}
|
||||
>
|
||||
Reset internal GSX state & disable SYNC
|
||||
</button>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import { FC, useEffect, useState } from 'react';
|
||||
import { GSX_SERVICE_CALLED, GSX_SERVICE_FINISHED } from '../../constants';
|
||||
import { LoadingState } from '../../types/general';
|
||||
import { WASMDataPax } from '../../types/WASMData';
|
||||
import { GSXLoadingState, WASMDataPax } from '../../types/WASMData';
|
||||
import OptionsPax from '../options/OptionsPax';
|
||||
import Profile from '../profile/Profile';
|
||||
import SBEntryPax from '../SBEntry/SBEntryPax';
|
||||
@@ -61,8 +60,9 @@ const Pax: FC<PaxProps> = ({ WASMData, username }) => {
|
||||
|
||||
const GSXActive = () => {
|
||||
return (
|
||||
(WASMData.GSX.boardingState >= GSX_SERVICE_CALLED || WASMData.GSX.deboardingState >= GSX_SERVICE_CALLED) &&
|
||||
WASMData.GSX.deboardingState !== GSX_SERVICE_FINISHED
|
||||
WASMData.GSX.couatlStarted &&
|
||||
WASMData.GSX.loadingState !== GSXLoadingState.IDLE &&
|
||||
WASMData.GSX.loadingState !== GSXLoadingState.DEBOARDED
|
||||
);
|
||||
};
|
||||
|
||||
@@ -76,7 +76,7 @@ const Pax: FC<PaxProps> = ({ WASMData, username }) => {
|
||||
];
|
||||
}
|
||||
|
||||
if (WASMData.options.GSXSync && GSXActive() && WASMData.GSX.boardingState !== GSX_SERVICE_FINISHED) {
|
||||
if (WASMData.options.GSXSync && GSXActive() && WASMData.GSX.loadingState === GSXLoadingState.BOARDING) {
|
||||
return [
|
||||
WASMData.targetPayload.ZFWCG.toFixed(1),
|
||||
WASMData.targetPayload.ZFWCG < WASMData.limits.minCG || WASMData.targetPayload.ZFWCG > WASMData.limits.maxCG,
|
||||
@@ -118,10 +118,7 @@ const Pax: FC<PaxProps> = ({ WASMData, username }) => {
|
||||
inPreview={loadingState !== 'loaded' && !GSXActive()}
|
||||
CGs={CGs()}
|
||||
done={
|
||||
WASMData.options.GSXSync
|
||||
? WASMData.GSX.boardingState === GSX_SERVICE_FINISHED &&
|
||||
WASMData.GSX.deboardingState !== GSX_SERVICE_FINISHED
|
||||
: loadingState !== 'preview'
|
||||
WASMData.options.GSXSync ? WASMData.GSX.loadingState === GSXLoadingState.BOARDED : loadingState !== 'preview'
|
||||
}
|
||||
/>
|
||||
<Tabbar
|
||||
@@ -132,16 +129,31 @@ const Pax: FC<PaxProps> = ({ WASMData, username }) => {
|
||||
setSelectedTab={setSelectedTab}
|
||||
/>
|
||||
{username && selectedTab === 0 && (
|
||||
<SBEntryPax WASMData={WASMData} loadingState={loadingState} setLoadingState={setLoadingState} />
|
||||
<SBEntryPax
|
||||
WASMData={WASMData}
|
||||
loadingState={loadingState}
|
||||
setLoadingState={setLoadingState}
|
||||
gsxActive={GSXActive()}
|
||||
/>
|
||||
)}
|
||||
{((username && selectedTab === 1) || (!username && selectedTab === 0)) && (
|
||||
<ZFWEntryPax WASMData={WASMData} loadingState={loadingState} setLoadingState={setLoadingState} />
|
||||
<ZFWEntryPax
|
||||
WASMData={WASMData}
|
||||
loadingState={loadingState}
|
||||
setLoadingState={setLoadingState}
|
||||
gsxActive={GSXActive()}
|
||||
/>
|
||||
)}
|
||||
{((username && selectedTab === 2) || (!username && selectedTab === 1)) && (
|
||||
<StationEntryPax WASMData={WASMData} loadingState={loadingState} setLoadingState={setLoadingState} />
|
||||
<StationEntryPax
|
||||
WASMData={WASMData}
|
||||
loadingState={loadingState}
|
||||
setLoadingState={setLoadingState}
|
||||
gsxActive={GSXActive()}
|
||||
/>
|
||||
)}
|
||||
{((username && selectedTab === 3) || (!username && selectedTab === 2)) && (
|
||||
<OptionsPax WASMData={WASMData} loadingState={loadingState} />
|
||||
<OptionsPax WASMData={WASMData} loadingState={loadingState} gsxActive={GSXActive()} />
|
||||
)}
|
||||
</>
|
||||
);
|
||||
|
||||
@@ -1,28 +1,28 @@
|
||||
import { FC, useEffect, useState } from 'react';
|
||||
import { GSX_SERVICE_CALLED, GSX_SERVICE_FINISHED } from '../../constants';
|
||||
import { LoadingState } from '../../types/general';
|
||||
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 Input from '../input/Input';
|
||||
|
||||
interface StationEntryProps {
|
||||
WASMData: WASMDataF;
|
||||
loadingState: LoadingState;
|
||||
gsxActive: boolean;
|
||||
setLoadingState: (newState: LoadingState) => void;
|
||||
}
|
||||
|
||||
const StationEntryF: FC<StationEntryProps> = ({ WASMData, loadingState, setLoadingState }) => {
|
||||
const StationEntryF: FC<StationEntryProps> = ({ WASMData, loadingState, gsxActive, setLoadingState }) => {
|
||||
const [upper1, setUpper1] = useState(WASMData.targetPayload.upper1);
|
||||
const [upper2, setUpper2] = useState(WASMData.targetPayload.upper2);
|
||||
const [upper3, setUpper3] = useState(WASMData.targetPayload.upper3);
|
||||
const [upper4, setUpper4] = useState(WASMData.targetPayload.upper4);
|
||||
const [lowerForward, setLowerForward] = useState(WASMData.targetPayload.lowerForward);
|
||||
const [lowerRear, setLowerRear] = useState(WASMData.targetPayload.lowerRear);
|
||||
const [fuel, setFuel] = useState(Math.round(WASMData.livePayload.fuel));
|
||||
const [fuelEnabled, setFuelEnabled] = useState(true);
|
||||
const [fuel, setFuel] = useState(Math.round(WASMData.targetPayload.fuel));
|
||||
|
||||
const ZFW = () => {
|
||||
if (loadingState !== 'loaded' && !GSXActive()) return Math.round(WASMData.targetPayload.total);
|
||||
if (loadingState !== 'loaded' && !gsxActive) return Math.round(WASMData.targetPayload.total);
|
||||
|
||||
return Math.round(WASMData.livePayload.total);
|
||||
};
|
||||
@@ -36,13 +36,6 @@ const StationEntryF: FC<StationEntryProps> = ({ WASMData, loadingState, setLoadi
|
||||
return GW() <= WASMData.limits.maxTOW;
|
||||
};
|
||||
|
||||
const GSXActive = () => {
|
||||
return (
|
||||
(WASMData.GSX.boardingState >= GSX_SERVICE_CALLED || WASMData.GSX.deboardingState >= GSX_SERVICE_CALLED) &&
|
||||
WASMData.GSX.deboardingState !== GSX_SERVICE_FINISHED
|
||||
);
|
||||
};
|
||||
|
||||
const handleInput = (input: string, maxValue: number, setter: (value: number) => void) => {
|
||||
if (!input) {
|
||||
setter(0);
|
||||
@@ -58,10 +51,10 @@ const StationEntryF: FC<StationEntryProps> = ({ WASMData, loadingState, setLoadi
|
||||
};
|
||||
|
||||
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(
|
||||
() =>
|
||||
setFuel((prev) => {
|
||||
@@ -70,9 +63,6 @@ const StationEntryF: FC<StationEntryProps> = ({ WASMData, loadingState, setLoadi
|
||||
}),
|
||||
[WASMData.userData.isER]
|
||||
);
|
||||
useEffect(() => {
|
||||
setFuelEnabled((prev) => (!prev ? inRangeOf(Math.round(WASMData.livePayload.fuel), fuel) : prev));
|
||||
}, [WASMData.livePayload.fuel]);
|
||||
|
||||
return (
|
||||
<>
|
||||
@@ -80,30 +70,14 @@ const StationEntryF: FC<StationEntryProps> = ({ WASMData, loadingState, setLoadi
|
||||
<div className="relative flex w-full items-center justify-between rounded-md bg-zinc-600 p-2 px-4">
|
||||
<div className="flex w-full items-center justify-between text-xs">
|
||||
<label>Fuel ({WASMData.userData.isImperial ? 'lbs' : 'kg'})</label>
|
||||
<input
|
||||
<Input
|
||||
type="text"
|
||||
placeholder=""
|
||||
className={`w-1/2 rounded-lg border border-white bg-zinc-700 px-3 py-2 text-right`}
|
||||
value={fuel}
|
||||
onChange={(e) => handleInput(e.target.value, WASMData.limits.maxFuel, setFuel)}
|
||||
disabled={loadingState !== 'preview' || GSXActive()}
|
||||
onChange={(value) => handleInput(value, WASMData.limits.maxFuel, setFuel)}
|
||||
disabled={loadingState !== 'preview' || gsxActive}
|
||||
/>
|
||||
<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>
|
||||
@@ -112,78 +86,80 @@ const StationEntryF: FC<StationEntryProps> = ({ WASMData, loadingState, setLoadi
|
||||
<div className="relative flex w-full items-center justify-between rounded-t-md bg-zinc-600 p-2 px-4">
|
||||
<div className="flex w-full items-center justify-between text-xs">
|
||||
<label>Upper 1</label>
|
||||
<input
|
||||
<Input
|
||||
type="text"
|
||||
placeholder=""
|
||||
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={upper1}
|
||||
onChange={(e) => handleInput(e.target.value, WASMData.limits.upper1, setUpper1)}
|
||||
disabled={loadingState !== 'preview' || GSXActive()}
|
||||
onChange={(value) => handleInput(value, WASMData.limits.upper1, setUpper1)}
|
||||
disabled={loadingState !== 'preview' || gsxActive}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div className="relative flex w-full items-center justify-between bg-zinc-700 p-2 px-4">
|
||||
<div className="flex w-full items-center justify-between text-xs">
|
||||
<label>Upper 2</label>
|
||||
<input
|
||||
<Input
|
||||
type="text"
|
||||
placeholder=""
|
||||
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={upper2}
|
||||
onChange={(e) => handleInput(e.target.value, WASMData.limits.upper2, setUpper2)}
|
||||
disabled={loadingState !== 'preview' || GSXActive()}
|
||||
onChange={(value) => handleInput(value, WASMData.limits.upper2, setUpper2)}
|
||||
disabled={loadingState !== 'preview' || gsxActive}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div className="relative flex w-full items-center justify-between bg-zinc-600 p-2 px-4">
|
||||
<div className="flex w-full items-center justify-between text-xs">
|
||||
<label>Upper 3</label>
|
||||
<input
|
||||
<Input
|
||||
type="text"
|
||||
placeholder=""
|
||||
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={upper3}
|
||||
onChange={(e) => handleInput(e.target.value, WASMData.limits.upper3, setUpper3)}
|
||||
disabled={loadingState !== 'preview' || GSXActive()}
|
||||
onChange={(value) => handleInput(value, WASMData.limits.upper3, setUpper3)}
|
||||
disabled={loadingState !== 'preview' || gsxActive}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div className="relative flex w-full items-center justify-between bg-zinc-700 p-2 px-4">
|
||||
<div className="flex w-full items-center justify-between text-xs">
|
||||
<label>Upper 4</label>
|
||||
<input
|
||||
<Input
|
||||
type="text"
|
||||
placeholder=""
|
||||
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={upper4}
|
||||
onChange={(e) => handleInput(e.target.value, WASMData.limits.upper4, setUpper4)}
|
||||
disabled={loadingState !== 'preview' || GSXActive()}
|
||||
onChange={(value) => handleInput(value, WASMData.limits.upper4, setUpper4)}
|
||||
disabled={loadingState !== 'preview' || gsxActive}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div className="relative flex w-full items-center justify-between bg-zinc-600 p-2 px-4">
|
||||
<div className="flex w-full items-center justify-between text-xs">
|
||||
<label>Forward Cargo ({WASMData.userData.isImperial ? 'lbs' : 'kg'})</label>
|
||||
<input
|
||||
<Input
|
||||
type="text"
|
||||
topKeyboard
|
||||
placeholder=""
|
||||
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={lowerForward}
|
||||
onChange={(e) => handleInput(e.target.value, WASMData.limits.lowerForward, setLowerForward)}
|
||||
disabled={loadingState !== 'preview' || GSXActive()}
|
||||
onChange={(value) => handleInput(value, WASMData.limits.lowerForward, setLowerForward)}
|
||||
disabled={loadingState !== 'preview' || gsxActive}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div className="relative flex w-full items-center justify-between rounded-b-md bg-zinc-700 p-2 px-4">
|
||||
<div className="flex w-full items-center justify-between text-xs">
|
||||
<label>Aft Cargo ({WASMData.userData.isImperial ? 'lbs' : 'kg'})</label>
|
||||
<input
|
||||
<Input
|
||||
type="text"
|
||||
topKeyboard
|
||||
placeholder=""
|
||||
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={lowerRear}
|
||||
onChange={(e) => handleInput(e.target.value, WASMData.limits.lowerRear, setLowerRear)}
|
||||
disabled={loadingState !== 'preview' || GSXActive()}
|
||||
onChange={(value) => handleInput(value, WASMData.limits.lowerRear, setLowerRear)}
|
||||
disabled={loadingState !== 'preview' || gsxActive}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -193,7 +169,7 @@ const StationEntryF: FC<StationEntryProps> = ({ WASMData, loadingState, setLoadi
|
||||
<div className="relative flex w-full items-center justify-between rounded-t-md bg-zinc-600 p-2 px-4">
|
||||
<div className="flex w-full items-center justify-between text-xs">
|
||||
<label>
|
||||
{loadingState !== 'loaded' && !GSXActive() ? 'Expected' : 'Actual'} ZFW (
|
||||
{loadingState !== 'loaded' && !gsxActive ? 'Expected' : 'Actual'} ZFW (
|
||||
{WASMData.userData.isImperial ? 'lbs' : 'kg'})
|
||||
</label>
|
||||
<input
|
||||
@@ -208,7 +184,7 @@ const StationEntryF: FC<StationEntryProps> = ({ WASMData, loadingState, setLoadi
|
||||
<div className="relative flex w-full items-center justify-between rounded-b-md bg-zinc-700 p-2 px-4">
|
||||
<div className="flex w-full items-center justify-between text-xs">
|
||||
<label>
|
||||
{loadingState !== 'loaded' && !GSXActive() ? 'Expected' : 'Actual'} GW (
|
||||
{loadingState !== 'loaded' && !gsxActive ? 'Expected' : 'Actual'} GW (
|
||||
{WASMData.userData.isImperial ? 'lbs' : 'kg'})
|
||||
</label>
|
||||
<input
|
||||
|
||||
@@ -1,17 +1,18 @@
|
||||
import { FC, useEffect, useState } from 'react';
|
||||
import { GSX_SERVICE_CALLED, GSX_SERVICE_FINISHED } from '../../constants';
|
||||
import { LoadingState } from '../../types/general';
|
||||
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 Input from '../input/Input';
|
||||
|
||||
interface StationEntryProps {
|
||||
WASMData: WASMDataPax;
|
||||
loadingState: LoadingState;
|
||||
gsxActive: boolean;
|
||||
setLoadingState: (newState: LoadingState) => void;
|
||||
}
|
||||
|
||||
const StationEntryPax: FC<StationEntryProps> = ({ WASMData, loadingState, setLoadingState }) => {
|
||||
const StationEntryPax: FC<StationEntryProps> = ({ WASMData, loadingState, gsxActive, setLoadingState }) => {
|
||||
const [business1, setBusiness1] = useState(WASMData.targetPayload.business1);
|
||||
const [business2, setBusiness2] = useState(WASMData.targetPayload.business2);
|
||||
const [economy1, setEconomy1] = useState(WASMData.targetPayload.economy1);
|
||||
@@ -19,10 +20,9 @@ const StationEntryPax: FC<StationEntryProps> = ({ WASMData, loadingState, setLoa
|
||||
const [forwardCargo, setForwardCargo] = useState(WASMData.targetPayload.forwardCargo);
|
||||
const [rearCargo, setRearCargo] = useState(WASMData.targetPayload.rearCargo);
|
||||
const [fuel, setFuel] = useState(Math.round(WASMData.livePayload.fuel));
|
||||
const [fuelEnabled, setFuelEnabled] = useState(true);
|
||||
|
||||
const ZFW = () => {
|
||||
if (loadingState !== 'loaded' && !GSXActive()) return Math.round(WASMData.targetPayload.total);
|
||||
if (loadingState !== 'loaded' && !gsxActive) return Math.round(WASMData.targetPayload.total);
|
||||
|
||||
return Math.round(WASMData.livePayload.total);
|
||||
};
|
||||
@@ -36,13 +36,6 @@ const StationEntryPax: FC<StationEntryProps> = ({ WASMData, loadingState, setLoa
|
||||
return GW() <= WASMData.limits.maxTOW;
|
||||
};
|
||||
|
||||
const GSXActive = () => {
|
||||
return (
|
||||
(WASMData.GSX.boardingState >= GSX_SERVICE_CALLED || WASMData.GSX.deboardingState >= GSX_SERVICE_CALLED) &&
|
||||
WASMData.GSX.deboardingState !== GSX_SERVICE_FINISHED
|
||||
);
|
||||
};
|
||||
|
||||
const handleInput = (input: string, maxValue: number, setter: (value: number) => void) => {
|
||||
if (!input) {
|
||||
setter(0);
|
||||
@@ -58,10 +51,10 @@ const StationEntryPax: FC<StationEntryProps> = ({ WASMData, loadingState, setLoa
|
||||
};
|
||||
|
||||
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(
|
||||
() =>
|
||||
setFuel((prev) => {
|
||||
@@ -70,9 +63,6 @@ const StationEntryPax: FC<StationEntryProps> = ({ WASMData, loadingState, setLoa
|
||||
}),
|
||||
[WASMData.userData.isER]
|
||||
);
|
||||
useEffect(() => {
|
||||
setFuelEnabled((prev) => (!prev ? inRangeOf(Math.round(WASMData.livePayload.fuel), fuel) : prev));
|
||||
}, [WASMData.livePayload.fuel]);
|
||||
|
||||
return (
|
||||
<>
|
||||
@@ -80,30 +70,14 @@ const StationEntryPax: FC<StationEntryProps> = ({ WASMData, loadingState, setLoa
|
||||
<div className="relative flex w-full items-center justify-between rounded-md bg-zinc-600 p-2 px-4">
|
||||
<div className="flex w-full items-center justify-between text-xs">
|
||||
<label>Fuel ({WASMData.userData.isImperial ? 'lbs' : 'kg'})</label>
|
||||
<input
|
||||
<Input
|
||||
type="text"
|
||||
placeholder=""
|
||||
className={`w-1/2 rounded-lg border border-white bg-zinc-700 px-3 py-2 text-right`}
|
||||
value={fuel}
|
||||
onChange={(e) => handleInput(e.target.value, WASMData.limits.maxFuel, setFuel)}
|
||||
disabled={loadingState !== 'preview' || GSXActive()}
|
||||
onChange={(value) => handleInput(value, WASMData.limits.maxFuel, setFuel)}
|
||||
disabled={loadingState !== 'preview' || gsxActive}
|
||||
/>
|
||||
<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>
|
||||
@@ -112,78 +86,80 @@ const StationEntryPax: FC<StationEntryProps> = ({ WASMData, loadingState, setLoa
|
||||
<div className="relative flex w-full items-center justify-between rounded-t-md bg-zinc-600 p-2 px-4">
|
||||
<div className="flex w-full items-center justify-between text-xs">
|
||||
<label>Business</label>
|
||||
<input
|
||||
<Input
|
||||
type="text"
|
||||
placeholder=""
|
||||
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={business1}
|
||||
onChange={(e) => handleInput(e.target.value, WASMData.limits.business1, setBusiness1)}
|
||||
disabled={loadingState !== 'preview' || GSXActive()}
|
||||
onChange={(value) => handleInput(value, WASMData.limits.business1, setBusiness1)}
|
||||
disabled={loadingState !== 'preview' || gsxActive}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div className="relative flex w-full items-center justify-between bg-zinc-700 p-2 px-4">
|
||||
<div className="flex w-full items-center justify-between text-xs">
|
||||
<label>Premium Economy</label>
|
||||
<input
|
||||
<Input
|
||||
type="text"
|
||||
placeholder=""
|
||||
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={business2}
|
||||
onChange={(e) => handleInput(e.target.value, WASMData.limits.business2, setBusiness2)}
|
||||
disabled={loadingState !== 'preview' || GSXActive()}
|
||||
onChange={(value) => handleInput(value, WASMData.limits.business2, setBusiness2)}
|
||||
disabled={loadingState !== 'preview' || gsxActive}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div className="relative flex w-full items-center justify-between bg-zinc-600 p-2 px-4">
|
||||
<div className="flex w-full items-center justify-between text-xs">
|
||||
<label>Forward Economy</label>
|
||||
<input
|
||||
<Input
|
||||
type="text"
|
||||
placeholder=""
|
||||
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={economy1}
|
||||
onChange={(e) => handleInput(e.target.value, WASMData.limits.economy1, setEconomy1)}
|
||||
disabled={loadingState !== 'preview' || GSXActive()}
|
||||
onChange={(value) => handleInput(value, WASMData.limits.economy1, setEconomy1)}
|
||||
disabled={loadingState !== 'preview' || gsxActive}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div className="relative flex w-full items-center justify-between bg-zinc-700 p-2 px-4">
|
||||
<div className="flex w-full items-center justify-between text-xs">
|
||||
<label>Aft Economy</label>
|
||||
<input
|
||||
<Input
|
||||
type="text"
|
||||
placeholder=""
|
||||
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={economy2}
|
||||
onChange={(e) => handleInput(e.target.value, WASMData.limits.economy2, setEconomy2)}
|
||||
disabled={loadingState !== 'preview' || GSXActive()}
|
||||
onChange={(value) => handleInput(value, WASMData.limits.economy2, setEconomy2)}
|
||||
disabled={loadingState !== 'preview' || gsxActive}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div className="relative flex w-full items-center justify-between bg-zinc-600 p-2 px-4">
|
||||
<div className="flex w-full items-center justify-between text-xs">
|
||||
<label>Forward Cargo ({WASMData.userData.isImperial ? 'lbs' : 'kg'})</label>
|
||||
<input
|
||||
<Input
|
||||
type="text"
|
||||
topKeyboard
|
||||
placeholder=""
|
||||
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={forwardCargo}
|
||||
onChange={(e) => handleInput(e.target.value, WASMData.limits.forwardCargo, setForwardCargo)}
|
||||
disabled={loadingState !== 'preview' || GSXActive()}
|
||||
onChange={(value) => handleInput(value, WASMData.limits.forwardCargo, setForwardCargo)}
|
||||
disabled={loadingState !== 'preview' || gsxActive}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div className="relative flex w-full items-center justify-between rounded-b-md bg-zinc-700 p-2 px-4">
|
||||
<div className="flex w-full items-center justify-between text-xs">
|
||||
<label>Aft Cargo ({WASMData.userData.isImperial ? 'lbs' : 'kg'})</label>
|
||||
<input
|
||||
<Input
|
||||
type="text"
|
||||
topKeyboard
|
||||
placeholder=""
|
||||
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={rearCargo}
|
||||
onChange={(e) => handleInput(e.target.value, WASMData.limits.rearCargo, setRearCargo)}
|
||||
disabled={loadingState !== 'preview' || GSXActive()}
|
||||
onChange={(value) => handleInput(value, WASMData.limits.rearCargo, setRearCargo)}
|
||||
disabled={loadingState !== 'preview' || gsxActive}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -193,7 +169,7 @@ const StationEntryPax: FC<StationEntryProps> = ({ WASMData, loadingState, setLoa
|
||||
<div className="relative flex w-full items-center justify-between rounded-t-md bg-zinc-600 p-2 px-4">
|
||||
<div className="flex w-full items-center justify-between text-xs">
|
||||
<label>
|
||||
{loadingState !== 'loaded' && !GSXActive() ? 'Expected' : 'Actual'} ZFW (
|
||||
{loadingState !== 'loaded' && !gsxActive ? 'Expected' : 'Actual'} ZFW (
|
||||
{WASMData.userData.isImperial ? 'lbs' : 'kg'})
|
||||
</label>
|
||||
<input
|
||||
@@ -208,7 +184,7 @@ const StationEntryPax: FC<StationEntryProps> = ({ WASMData, loadingState, setLoa
|
||||
<div className="relative flex w-full items-center justify-between rounded-b-md bg-zinc-700 p-2 px-4">
|
||||
<div className="flex w-full items-center justify-between text-xs">
|
||||
<label>
|
||||
{loadingState !== 'loaded' && !GSXActive() ? 'Expected' : 'Actual'} GW (
|
||||
{loadingState !== 'loaded' && !gsxActive ? 'Expected' : 'Actual'} GW (
|
||||
{WASMData.userData.isImperial ? 'lbs' : 'kg'})
|
||||
</label>
|
||||
<input
|
||||
|
||||
@@ -1,25 +1,25 @@
|
||||
import { FC, useEffect, useState } from 'react';
|
||||
import { GSX_SERVICE_CALLED, GSX_SERVICE_FINISHED } from '../../constants';
|
||||
import { WASMDataF } from '../../types/WASMData';
|
||||
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 ActionBar from '../actionbar/ActionBar';
|
||||
import Input from '../input/Input';
|
||||
|
||||
interface ZFWEntryProps {
|
||||
WASMData: WASMDataF;
|
||||
loadingState: LoadingState;
|
||||
gsxActive: boolean;
|
||||
setLoadingState: (newState: LoadingState) => void;
|
||||
}
|
||||
|
||||
const ZFWEntryF: FC<ZFWEntryProps> = ({ WASMData, loadingState, setLoadingState }) => {
|
||||
const ZFWEntryF: FC<ZFWEntryProps> = ({ WASMData, loadingState, gsxActive, setLoadingState }) => {
|
||||
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 [fuelEnabled, setFuelEnabled] = useState(true);
|
||||
|
||||
const ZFW = () => {
|
||||
if (loadingState !== 'loaded' && !GSXActive()) return ZFWTarget;
|
||||
if (loadingState !== 'loaded' && !gsxActive) return ZFWTarget;
|
||||
|
||||
return Math.round(WASMData.livePayload.total);
|
||||
};
|
||||
@@ -33,13 +33,6 @@ const ZFWEntryF: FC<ZFWEntryProps> = ({ WASMData, loadingState, setLoadingState
|
||||
return GW() <= WASMData.limits.maxTOW;
|
||||
};
|
||||
|
||||
const GSXActive = () => {
|
||||
return (
|
||||
(WASMData.GSX.boardingState >= GSX_SERVICE_CALLED || WASMData.GSX.deboardingState >= GSX_SERVICE_CALLED) &&
|
||||
WASMData.GSX.deboardingState !== GSX_SERVICE_FINISHED
|
||||
);
|
||||
};
|
||||
|
||||
const handleInput = (input: string, maxValue: number, setter: (value: number) => void) => {
|
||||
if (!input) {
|
||||
setter(0);
|
||||
@@ -54,16 +47,20 @@ const ZFWEntryF: FC<ZFWEntryProps> = ({ WASMData, loadingState, setLoadingState
|
||||
}
|
||||
};
|
||||
const handleInputZFW = (input: string) => {
|
||||
if (!input) return;
|
||||
if (!input) {
|
||||
setZFWTarget(0);
|
||||
return;
|
||||
}
|
||||
|
||||
const converted = parseInt(input);
|
||||
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 setZFWTarget(converted);
|
||||
}
|
||||
};
|
||||
const handleBlur = (input: string) => {
|
||||
|
||||
const handleBlurZFW = (input: string) => {
|
||||
const minZFW = Math.round(WASMData.targetPayload.empty + WASMData.targetPayload.crew);
|
||||
|
||||
if (!input) {
|
||||
@@ -77,10 +74,13 @@ const ZFWEntryF: FC<ZFWEntryProps> = ({ WASMData, loadingState, setLoadingState
|
||||
else if (converted > WASMData.limits.maxZFW) setZFWTarget(WASMData.limits.maxZFW);
|
||||
else setZFWTarget(converted);
|
||||
}
|
||||
|
||||
updateData(converted);
|
||||
};
|
||||
|
||||
const updateData = () => {
|
||||
CoherentCallZFWEntry(ZFWTarget, CGTarget, fuel);
|
||||
};
|
||||
|
||||
useEffect(() => updateData(), [ZFWTarget, CGTarget, fuel]);
|
||||
useEffect(
|
||||
() =>
|
||||
setFuel((prev) => {
|
||||
@@ -89,13 +89,6 @@ const ZFWEntryF: FC<ZFWEntryProps> = ({ WASMData, loadingState, setLoadingState
|
||||
}),
|
||||
[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 (
|
||||
<>
|
||||
@@ -103,30 +96,14 @@ const ZFWEntryF: FC<ZFWEntryProps> = ({ WASMData, loadingState, setLoadingState
|
||||
<div className="relative flex w-full items-center justify-between rounded-md bg-zinc-600 p-2 px-4">
|
||||
<div className="flex w-full items-center justify-between text-xs">
|
||||
<label>Fuel ({WASMData.userData.isImperial ? 'lbs' : 'kg'})</label>
|
||||
<input
|
||||
<Input
|
||||
type="text"
|
||||
placeholder=""
|
||||
className={`w-1/2 rounded-lg border border-white bg-zinc-700 px-3 py-2 text-right`}
|
||||
value={fuel}
|
||||
onChange={(e) => handleInput(e.target.value, WASMData.limits.maxFuel, setFuel)}
|
||||
disabled={loadingState !== 'preview' || GSXActive()}
|
||||
onChange={(value) => handleInput(value, WASMData.limits.maxFuel, setFuel)}
|
||||
disabled={loadingState !== 'preview' || gsxActive}
|
||||
/>
|
||||
<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>
|
||||
@@ -135,14 +112,14 @@ const ZFWEntryF: FC<ZFWEntryProps> = ({ WASMData, loadingState, setLoadingState
|
||||
<div className="relative flex w-full items-center justify-between rounded-t-md bg-zinc-600 p-2 px-4">
|
||||
<div className="flex w-full items-center justify-between text-xs">
|
||||
<label>Target ZFW ({WASMData.userData.isImperial ? 'lbs' : 'kg'})</label>
|
||||
<input
|
||||
<Input
|
||||
type="text"
|
||||
placeholder=""
|
||||
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}
|
||||
onChange={(e) => handleInputZFW(e.target.value)}
|
||||
onBlur={(e) => handleBlur(e.target.value)}
|
||||
disabled={loadingState !== 'preview' || GSXActive()}
|
||||
onChange={(value) => handleInputZFW(value)}
|
||||
onBlur={(value) => handleBlurZFW(value)}
|
||||
disabled={loadingState !== 'preview' || gsxActive}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -155,18 +132,16 @@ const ZFWEntryF: FC<ZFWEntryProps> = ({ WASMData, loadingState, setLoadingState
|
||||
minCG={WASMData.limits.minCG}
|
||||
maxCG={WASMData.limits.maxCG}
|
||||
value={CGTarget}
|
||||
disabled={loadingState !== 'preview' || GSXActive()}
|
||||
disabled={loadingState !== 'preview' || gsxActive}
|
||||
increase={() =>
|
||||
setCGTarget((prev) => {
|
||||
const _new = prev + 0.1;
|
||||
updateData(undefined, _new);
|
||||
return _new;
|
||||
})
|
||||
}
|
||||
decrease={() =>
|
||||
setCGTarget((prev) => {
|
||||
const _new = prev - 0.1;
|
||||
updateData(undefined, _new);
|
||||
return _new;
|
||||
})
|
||||
}
|
||||
@@ -179,7 +154,7 @@ const ZFWEntryF: FC<ZFWEntryProps> = ({ WASMData, loadingState, setLoadingState
|
||||
<div className="relative flex w-full items-center justify-between rounded-t-md bg-zinc-600 p-2 px-4">
|
||||
<div className="flex w-full items-center justify-between text-xs">
|
||||
<label>
|
||||
{loadingState !== 'loaded' && !GSXActive() ? 'Expected' : 'Actual'} ZFW (
|
||||
{loadingState !== 'loaded' && !gsxActive ? 'Expected' : 'Actual'} ZFW (
|
||||
{WASMData.userData.isImperial ? 'lbs' : 'kg'})
|
||||
</label>
|
||||
<input
|
||||
@@ -194,7 +169,7 @@ const ZFWEntryF: FC<ZFWEntryProps> = ({ WASMData, loadingState, setLoadingState
|
||||
<div className="relative flex w-full items-center justify-between rounded-b-md bg-zinc-700 p-2 px-4">
|
||||
<div className="flex w-full items-center justify-between text-xs">
|
||||
<label>
|
||||
{loadingState !== 'loaded' && !GSXActive() ? 'Expected' : 'Actual'} GW (
|
||||
{loadingState !== 'loaded' && !gsxActive ? 'Expected' : 'Actual'} GW (
|
||||
{WASMData.userData.isImperial ? 'lbs' : 'kg'})
|
||||
</label>
|
||||
<input
|
||||
|
||||
@@ -1,25 +1,25 @@
|
||||
import { FC, useEffect, useState } from 'react';
|
||||
import { GSX_SERVICE_CALLED, GSX_SERVICE_FINISHED } from '../../constants';
|
||||
import { WASMDataPax } from '../../types/WASMData';
|
||||
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 ActionBar from '../actionbar/ActionBar';
|
||||
import Input from '../input/Input';
|
||||
|
||||
interface ZFWEntryProps {
|
||||
WASMData: WASMDataPax;
|
||||
loadingState: LoadingState;
|
||||
gsxActive: boolean;
|
||||
setLoadingState: (newState: LoadingState) => void;
|
||||
}
|
||||
|
||||
const ZFWEntryPax: FC<ZFWEntryProps> = ({ WASMData, loadingState, setLoadingState }) => {
|
||||
const ZFWEntryPax: FC<ZFWEntryProps> = ({ WASMData, loadingState, gsxActive, setLoadingState }) => {
|
||||
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 [fuelEnabled, setFuelEnabled] = useState(true);
|
||||
|
||||
const ZFW = () => {
|
||||
if (loadingState !== 'loaded' && !GSXActive()) return ZFWTarget;
|
||||
if (loadingState !== 'loaded' && !gsxActive) return ZFWTarget;
|
||||
|
||||
return Math.round(WASMData.livePayload.total);
|
||||
};
|
||||
@@ -33,13 +33,6 @@ const ZFWEntryPax: FC<ZFWEntryProps> = ({ WASMData, loadingState, setLoadingStat
|
||||
return GW() <= WASMData.limits.maxTOW;
|
||||
};
|
||||
|
||||
const GSXActive = () => {
|
||||
return (
|
||||
(WASMData.GSX.boardingState >= GSX_SERVICE_CALLED || WASMData.GSX.deboardingState >= GSX_SERVICE_CALLED) &&
|
||||
WASMData.GSX.deboardingState !== GSX_SERVICE_FINISHED
|
||||
);
|
||||
};
|
||||
|
||||
const handleInput = (input: string, maxValue: number, setter: (value: number) => void) => {
|
||||
if (!input) {
|
||||
setter(0);
|
||||
@@ -54,7 +47,10 @@ const ZFWEntryPax: FC<ZFWEntryProps> = ({ WASMData, loadingState, setLoadingStat
|
||||
}
|
||||
};
|
||||
const handleInputZFW = (input: string) => {
|
||||
if (!input) return;
|
||||
if (!input) {
|
||||
setZFWTarget(0);
|
||||
return;
|
||||
}
|
||||
|
||||
const converted = parseInt(input);
|
||||
if (converted) {
|
||||
@@ -63,7 +59,8 @@ const ZFWEntryPax: FC<ZFWEntryProps> = ({ WASMData, loadingState, setLoadingStat
|
||||
else setZFWTarget(converted);
|
||||
}
|
||||
};
|
||||
const handleBlur = (input: string) => {
|
||||
|
||||
const handleBlurZFW = (input: string) => {
|
||||
const minZFW = Math.round(WASMData.targetPayload.empty + WASMData.targetPayload.crew);
|
||||
|
||||
if (!input) {
|
||||
@@ -77,10 +74,13 @@ const ZFWEntryPax: FC<ZFWEntryProps> = ({ WASMData, loadingState, setLoadingStat
|
||||
else if (converted > WASMData.limits.maxZFW) setZFWTarget(WASMData.limits.maxZFW);
|
||||
else setZFWTarget(converted);
|
||||
}
|
||||
|
||||
updateData(converted);
|
||||
};
|
||||
|
||||
const updateData = () => {
|
||||
CoherentCallZFWEntry(ZFWTarget, CGTarget, fuel);
|
||||
};
|
||||
|
||||
useEffect(() => updateData(), [ZFWTarget, CGTarget, fuel]);
|
||||
useEffect(
|
||||
() =>
|
||||
setFuel((prev) => {
|
||||
@@ -89,13 +89,6 @@ const ZFWEntryPax: FC<ZFWEntryProps> = ({ WASMData, loadingState, setLoadingStat
|
||||
}),
|
||||
[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 (
|
||||
<>
|
||||
@@ -103,30 +96,14 @@ const ZFWEntryPax: FC<ZFWEntryProps> = ({ WASMData, loadingState, setLoadingStat
|
||||
<div className="relative flex w-full items-center justify-between rounded-md bg-zinc-600 p-2 px-4">
|
||||
<div className="flex w-full items-center justify-between text-xs">
|
||||
<label>Fuel ({WASMData.userData.isImperial ? 'lbs' : 'kg'})</label>
|
||||
<input
|
||||
<Input
|
||||
type="text"
|
||||
placeholder=""
|
||||
className={`w-1/2 rounded-lg border border-white bg-zinc-700 px-3 py-2 text-right`}
|
||||
value={fuel}
|
||||
onChange={(e) => handleInput(e.target.value, WASMData.limits.maxFuel, setFuel)}
|
||||
disabled={loadingState !== 'preview' || GSXActive()}
|
||||
onChange={(value) => handleInput(value, WASMData.limits.maxFuel, setFuel)}
|
||||
disabled={loadingState !== 'preview' || gsxActive}
|
||||
/>
|
||||
<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>
|
||||
@@ -135,14 +112,14 @@ const ZFWEntryPax: FC<ZFWEntryProps> = ({ WASMData, loadingState, setLoadingStat
|
||||
<div className="relative flex w-full items-center justify-between rounded-t-md bg-zinc-600 p-2 px-4">
|
||||
<div className="flex w-full items-center justify-between text-xs">
|
||||
<label>Target ZFW ({WASMData.userData.isImperial ? 'lbs' : 'kg'})</label>
|
||||
<input
|
||||
<Input
|
||||
type="text"
|
||||
placeholder=""
|
||||
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}
|
||||
onChange={(e) => handleInputZFW(e.target.value)}
|
||||
onBlur={(e) => handleBlur(e.target.value)}
|
||||
disabled={loadingState !== 'preview' || GSXActive()}
|
||||
onChange={(value) => handleInputZFW(value)}
|
||||
onBlur={(value) => handleBlurZFW(value)}
|
||||
disabled={loadingState !== 'preview' || gsxActive}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -155,18 +132,16 @@ const ZFWEntryPax: FC<ZFWEntryProps> = ({ WASMData, loadingState, setLoadingStat
|
||||
minCG={WASMData.limits.minCG}
|
||||
maxCG={WASMData.limits.maxCG}
|
||||
value={CGTarget}
|
||||
disabled={loadingState !== 'preview' || GSXActive()}
|
||||
disabled={loadingState !== 'preview' || gsxActive}
|
||||
increase={() =>
|
||||
setCGTarget((prev) => {
|
||||
const _new = prev + 0.1;
|
||||
updateData(undefined, _new);
|
||||
return _new;
|
||||
})
|
||||
}
|
||||
decrease={() =>
|
||||
setCGTarget((prev) => {
|
||||
const _new = prev - 0.1;
|
||||
updateData(undefined, _new);
|
||||
return _new;
|
||||
})
|
||||
}
|
||||
@@ -179,7 +154,7 @@ const ZFWEntryPax: FC<ZFWEntryProps> = ({ WASMData, loadingState, setLoadingStat
|
||||
<div className="relative flex w-full items-center justify-between rounded-t-md bg-zinc-600 p-2 px-4">
|
||||
<div className="flex w-full items-center justify-between text-xs">
|
||||
<label>
|
||||
{loadingState !== 'loaded' && !GSXActive() ? 'Expected' : 'Actual'} ZFW (
|
||||
{loadingState !== 'loaded' && !gsxActive ? 'Expected' : 'Actual'} ZFW (
|
||||
{WASMData.userData.isImperial ? 'lbs' : 'kg'})
|
||||
</label>
|
||||
<input
|
||||
@@ -194,7 +169,7 @@ const ZFWEntryPax: FC<ZFWEntryProps> = ({ WASMData, loadingState, setLoadingStat
|
||||
<div className="relative flex w-full items-center justify-between rounded-b-md bg-zinc-700 p-2 px-4">
|
||||
<div className="flex w-full items-center justify-between text-xs">
|
||||
<label>
|
||||
{loadingState !== 'loaded' && !GSXActive() ? 'Expected' : 'Actual'} GW (
|
||||
{loadingState !== 'loaded' && !gsxActive ? 'Expected' : 'Actual'} GW (
|
||||
{WASMData.userData.isImperial ? 'lbs' : 'kg'})
|
||||
</label>
|
||||
<input
|
||||
|
||||
@@ -1,20 +1,3 @@
|
||||
export const COHERENT_COMM_BUS_WASM_CALL = 'COMM_BUS_WASM_CALLBACK';
|
||||
|
||||
export const TFDI_SIMBRIEF_USERNAME_CALL = 'requestSimBriefUsername';
|
||||
export const TFDI_SIMBRIEF_USERNAME_EVENT = 'receiveSimBriefUsername';
|
||||
|
||||
export const COMM_BUS_LIVE_DATA_EVENT = 'khofmann_tfdi_md-11_load_manager_live_data';
|
||||
export const COMM_BUS_UPDATE_TARGET_EVENT = 'khofmann_tfdi_md-11_load_manager_update_target';
|
||||
|
||||
export const CG_ADJUST = 0.05;
|
||||
|
||||
export const GSX_SERVICE_CALLED = 4;
|
||||
export const GSX_SERVICE_ACTIVE = 5;
|
||||
export const GSX_SERVICE_FINISHED = 6;
|
||||
|
||||
export const MODE_SB_SET = 0;
|
||||
export const MODE_ZFW_SET = 1;
|
||||
export const MODE_STATION_SET = 2;
|
||||
export const MODE_LOAD_SET = 3;
|
||||
export const MODE_UNLOAD_SET = 4;
|
||||
export const MODE_OPTIONS_SET = 5;
|
||||
|
||||
@@ -5,6 +5,7 @@ interface WASMData {
|
||||
sbPlanned: {
|
||||
ZFW: number;
|
||||
GW: number;
|
||||
fuel: number;
|
||||
};
|
||||
loaded: boolean;
|
||||
}
|
||||
@@ -26,6 +27,7 @@ interface TargetPayload {
|
||||
ZFWCG: number;
|
||||
TOCG: number;
|
||||
total: number;
|
||||
fuel: number;
|
||||
}
|
||||
|
||||
interface TargetPayloadPax extends TargetPayload {
|
||||
@@ -39,9 +41,7 @@ interface TargetPayloadPax extends TargetPayload {
|
||||
rearCargo: number;
|
||||
}
|
||||
|
||||
interface LivePayloadPax extends TargetPayloadPax {
|
||||
fuel: number;
|
||||
}
|
||||
type LivePayloadPax = TargetPayloadPax;
|
||||
|
||||
interface TargetPayloadF extends TargetPayload {
|
||||
empty: number;
|
||||
@@ -54,13 +54,11 @@ interface TargetPayloadF extends TargetPayload {
|
||||
lowerRear: number;
|
||||
}
|
||||
|
||||
interface LivePayloadF extends TargetPayloadF {
|
||||
fuel: number;
|
||||
}
|
||||
type LivePayloadF = TargetPayloadF;
|
||||
|
||||
interface GSX {
|
||||
boardingState: number;
|
||||
deboardingState: number;
|
||||
couatlStarted: boolean;
|
||||
loadingState: GSXLoadingState;
|
||||
}
|
||||
|
||||
interface Limits {
|
||||
@@ -101,3 +99,11 @@ interface Options {
|
||||
paxWeight: number;
|
||||
bagWeight: number;
|
||||
}
|
||||
|
||||
export enum GSXLoadingState {
|
||||
IDLE = 0,
|
||||
BOARDING = 1,
|
||||
BOARDED = 2,
|
||||
DEBOARDING = 3,
|
||||
DEBOARDED = 4,
|
||||
}
|
||||
|
||||
@@ -7,3 +7,23 @@ export interface SimBrief {
|
||||
cargo: number;
|
||||
fuel: number;
|
||||
}
|
||||
|
||||
export enum CallMode {
|
||||
SB_SET = 0,
|
||||
ZFW_SET = 1,
|
||||
STATION_SET = 2,
|
||||
LOAD_SET = 3,
|
||||
UNLOAD_SET = 4,
|
||||
OPTIONS_SET = 5,
|
||||
GSX_RESET = 6,
|
||||
}
|
||||
|
||||
export enum CommBusCall {
|
||||
TFDI_SIMBRIEF_USERNAME = 'requestSimBriefUsername',
|
||||
}
|
||||
|
||||
export enum CommBusEvent {
|
||||
TFDI_SIMBRIEF_USERNAME = 'receiveSimBriefUsername',
|
||||
LIVE_DATA = 'khofmann_tfdi_md-11_load_manager_live_data',
|
||||
UPDATE_TARGET = 'khofmann_tfdi_md-11_load_manager_update_target',
|
||||
}
|
||||
|
||||
@@ -1,21 +1,12 @@
|
||||
import {
|
||||
COHERENT_COMM_BUS_WASM_CALL,
|
||||
COMM_BUS_UPDATE_TARGET_EVENT,
|
||||
MODE_LOAD_SET,
|
||||
MODE_OPTIONS_SET,
|
||||
MODE_SB_SET,
|
||||
MODE_STATION_SET,
|
||||
MODE_UNLOAD_SET,
|
||||
MODE_ZFW_SET,
|
||||
} from '../constants';
|
||||
import { SimBrief } from '../types/general';
|
||||
import { COHERENT_COMM_BUS_WASM_CALL } from '../constants';
|
||||
import { CallMode, CommBusEvent, SimBrief } from '../types/general';
|
||||
|
||||
export const loadAircraft = () => {
|
||||
Coherent.call(
|
||||
COHERENT_COMM_BUS_WASM_CALL,
|
||||
COMM_BUS_UPDATE_TARGET_EVENT,
|
||||
CommBusEvent.UPDATE_TARGET,
|
||||
JSON.stringify({
|
||||
mode: MODE_LOAD_SET,
|
||||
mode: CallMode.LOAD_SET,
|
||||
})
|
||||
);
|
||||
};
|
||||
@@ -23,9 +14,9 @@ export const loadAircraft = () => {
|
||||
export const unloadAircraft = () => {
|
||||
Coherent.call(
|
||||
COHERENT_COMM_BUS_WASM_CALL,
|
||||
COMM_BUS_UPDATE_TARGET_EVENT,
|
||||
CommBusEvent.UPDATE_TARGET,
|
||||
JSON.stringify({
|
||||
mode: MODE_UNLOAD_SET,
|
||||
mode: CallMode.UNLOAD_SET,
|
||||
})
|
||||
);
|
||||
};
|
||||
@@ -34,14 +25,15 @@ export const inRangeOf = (value: number, target: number, tolerance: number = 10)
|
||||
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_COMM_BUS_WASM_CALL,
|
||||
COMM_BUS_UPDATE_TARGET_EVENT,
|
||||
CommBusEvent.UPDATE_TARGET,
|
||||
JSON.stringify({
|
||||
mode: MODE_ZFW_SET,
|
||||
mode: CallMode.ZFW_SET,
|
||||
ZFWTarget: ZFWTarget,
|
||||
CGTarget: CGTarget,
|
||||
fuelTarget: fuelTarget,
|
||||
})
|
||||
);
|
||||
};
|
||||
@@ -52,19 +44,21 @@ export const CoherentCallStationEntryPax = (
|
||||
economy1: number,
|
||||
economy2: number,
|
||||
forwardCargo: number,
|
||||
rearCargo: number
|
||||
rearCargo: number,
|
||||
fuelTarget: number
|
||||
) => {
|
||||
Coherent.call(
|
||||
COHERENT_COMM_BUS_WASM_CALL,
|
||||
COMM_BUS_UPDATE_TARGET_EVENT,
|
||||
CommBusEvent.UPDATE_TARGET,
|
||||
JSON.stringify({
|
||||
mode: MODE_STATION_SET,
|
||||
mode: CallMode.STATION_SET,
|
||||
business1,
|
||||
business2,
|
||||
economy1,
|
||||
economy2,
|
||||
forwardCargo,
|
||||
rearCargo,
|
||||
fuelTarget,
|
||||
})
|
||||
);
|
||||
};
|
||||
@@ -75,47 +69,52 @@ export const CoherentCallStationEntryF = (
|
||||
upper3: number,
|
||||
upper4: number,
|
||||
lowerForward: number,
|
||||
lowerRear: number
|
||||
lowerRear: number,
|
||||
fuelTarget: number
|
||||
) => {
|
||||
Coherent.call(
|
||||
COHERENT_COMM_BUS_WASM_CALL,
|
||||
COMM_BUS_UPDATE_TARGET_EVENT,
|
||||
CommBusEvent.UPDATE_TARGET,
|
||||
JSON.stringify({
|
||||
mode: MODE_STATION_SET,
|
||||
mode: CallMode.STATION_SET,
|
||||
upper1,
|
||||
upper2,
|
||||
upper3,
|
||||
upper4,
|
||||
lowerForward,
|
||||
lowerRear,
|
||||
fuelTarget,
|
||||
})
|
||||
);
|
||||
};
|
||||
|
||||
export const CoherentCallSBEntryPax = (CGTarget: number, SBPlan?: SimBrief) => {
|
||||
const payload = {
|
||||
mode: MODE_SB_SET,
|
||||
cargo: SBPlan?.cargo,
|
||||
numPax: SBPlan ? parseInt(SBPlan.pax as unknown as string) : undefined,
|
||||
CGTarget: CGTarget,
|
||||
plannedZFW: SBPlan?.plannedZFW,
|
||||
plannedGW: SBPlan?.plannedGW,
|
||||
};
|
||||
const string = JSON.stringify(payload);
|
||||
|
||||
Coherent.call(COHERENT_COMM_BUS_WASM_CALL, COMM_BUS_UPDATE_TARGET_EVENT, string);
|
||||
};
|
||||
|
||||
export const CoherentCallSBEntryF = (CGTarget: number, SBPlan?: SimBrief) => {
|
||||
export const CoherentCallSBEntryPax = (CGTarget: number, fuel: number, SBPlan?: SimBrief) => {
|
||||
Coherent.call(
|
||||
COHERENT_COMM_BUS_WASM_CALL,
|
||||
COMM_BUS_UPDATE_TARGET_EVENT,
|
||||
CommBusEvent.UPDATE_TARGET,
|
||||
JSON.stringify({
|
||||
mode: MODE_SB_SET,
|
||||
mode: CallMode.SB_SET,
|
||||
cargo: SBPlan?.cargo,
|
||||
numPax: SBPlan ? parseInt(SBPlan.pax as unknown as string) : undefined,
|
||||
CGTarget: CGTarget,
|
||||
plannedZFW: SBPlan?.plannedZFW,
|
||||
plannedGW: SBPlan?.plannedGW,
|
||||
fuel: fuel,
|
||||
})
|
||||
);
|
||||
};
|
||||
|
||||
export const CoherentCallSBEntryF = (CGTarget: number, fuel: number, SBPlan?: SimBrief) => {
|
||||
Coherent.call(
|
||||
COHERENT_COMM_BUS_WASM_CALL,
|
||||
CommBusEvent.UPDATE_TARGET,
|
||||
JSON.stringify({
|
||||
mode: CallMode.SB_SET,
|
||||
cargo: SBPlan?.cargo,
|
||||
CGTarget: CGTarget,
|
||||
plannedZFW: SBPlan?.plannedZFW,
|
||||
plannedGW: SBPlan?.plannedGW,
|
||||
fuel: SBPlan?.fuel,
|
||||
})
|
||||
);
|
||||
};
|
||||
@@ -123,12 +122,22 @@ export const CoherentCallSBEntryF = (CGTarget: number, SBPlan?: SimBrief) => {
|
||||
export const CoherentCallOptionsSet = (GSXSync?: boolean, paxWeight?: number, bagWeight?: number) => {
|
||||
Coherent.call(
|
||||
COHERENT_COMM_BUS_WASM_CALL,
|
||||
COMM_BUS_UPDATE_TARGET_EVENT,
|
||||
CommBusEvent.UPDATE_TARGET,
|
||||
JSON.stringify({
|
||||
mode: MODE_OPTIONS_SET,
|
||||
mode: CallMode.OPTIONS_SET,
|
||||
GSXSync,
|
||||
paxWeight,
|
||||
bagWeight,
|
||||
})
|
||||
);
|
||||
};
|
||||
|
||||
export const CoherentCallGSXReset = () => {
|
||||
Coherent.call(
|
||||
COHERENT_COMM_BUS_WASM_CALL,
|
||||
CommBusEvent.UPDATE_TARGET,
|
||||
JSON.stringify({
|
||||
mode: CallMode.GSX_RESET,
|
||||
})
|
||||
);
|
||||
};
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,306 +1,299 @@
|
||||
#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);
|
||||
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);
|
||||
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;
|
||||
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--;
|
||||
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++;
|
||||
}
|
||||
}
|
||||
// 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);
|
||||
cargo -= _cargo;
|
||||
targetPayload->stations.total += _cargo;
|
||||
|
||||
// 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;
|
||||
}
|
||||
_cargo = 0;
|
||||
|
||||
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;
|
||||
}
|
||||
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, userData->isImperial);
|
||||
|
||||
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;
|
||||
}
|
||||
// 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;
|
||||
}
|
||||
|
||||
count--;
|
||||
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++;
|
||||
}
|
||||
}
|
||||
// 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);
|
||||
// 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;
|
||||
}
|
||||
|
||||
// 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--;
|
||||
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, 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;
|
||||
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 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);
|
||||
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 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;
|
||||
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);
|
||||
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;
|
||||
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;
|
||||
totalWeight += fuel->total;
|
||||
|
||||
*TOCG = TO_PERCENT_MAC(totalMoment / totalWeight);
|
||||
targetPayload->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);
|
||||
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);
|
||||
localPayload._ZFWCG = localPayload.ZFWCG / 100.0;
|
||||
|
||||
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 = {};
|
||||
fPayloadData_t localPayload = {};
|
||||
|
||||
localPayload.leftAux = localPayload.rightAux = isER ? AUX_WEIGHT(true) : 0;
|
||||
localPayload.pilot = localPayload.firstOfficer = localPayload.engineer = PILOT_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_F, SIMCONNECT_OBJECT_ID_USER, 0, 0, sizeof(fPayloadDataSet_t), &localPayload);
|
||||
localPayload._ZFWCG = -1;
|
||||
|
||||
SimConnect_SetDataOnSimObject(simConnect, DATA_DEFINITION_PAYLOAD_F, SIMCONNECT_OBJECT_ID_USER, 0, 0, sizeof(fPayloadDataSet_t),
|
||||
&localPayload);
|
||||
}
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
#pragma once
|
||||
|
||||
#ifndef __INTELLISENSE__
|
||||
# define MODULE_EXPORT __attribute__( ( visibility( "default" ) ) )
|
||||
# define MODULE_WASM_MODNAME(mod) __attribute__((import_module(mod)))
|
||||
#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__
|
||||
#define MODULE_EXPORT
|
||||
#define MODULE_WASM_MODNAME(mod)
|
||||
#define __attribute__(x)
|
||||
#define __restrict__
|
||||
#endif
|
||||
|
||||
/********************************* Headers *********************************/
|
||||
@@ -19,10 +19,11 @@
|
||||
// C++ headers
|
||||
#include <algorithm>
|
||||
// Own headers
|
||||
#include "fuel.h"
|
||||
#include "shared.h"
|
||||
|
||||
/******************************** Constants ********************************/
|
||||
//PMC pallet due to 104in door
|
||||
// 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))
|
||||
@@ -38,74 +39,79 @@
|
||||
|
||||
/***************************** 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;
|
||||
// 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;
|
||||
unsigned int cargo;
|
||||
} sbPlanned;
|
||||
// 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;
|
||||
// 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);
|
||||
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);
|
||||
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);
|
||||
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 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 HANDLE simConnect, const bool isImperial);
|
||||
void unloadF(const HANDLE simConnect, const bool isER);
|
||||
|
||||
@@ -0,0 +1,135 @@
|
||||
#include "fuel.h"
|
||||
|
||||
// ZFW Entry
|
||||
void distribute(FuelData_t *const targetFuel, const double fuelTarget, const UserData_t *const userData) {
|
||||
double fuelLbs = TO_POUNDS(userData->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 (userData->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 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, 0, 0, sizeof(FuelDataSet_t),
|
||||
&localFuel);
|
||||
}
|
||||
@@ -0,0 +1,88 @@
|
||||
#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 ********************************/
|
||||
#define LBS_PER_GAL 6.699999809
|
||||
#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
|
||||
#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 UserData_t *const userData);
|
||||
void fuel(const FuelData_t *const targetFuel, const HANDLE simConnect);
|
||||
@@ -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
@@ -1,45 +1,47 @@
|
||||
#pragma once
|
||||
|
||||
#ifndef __INTELLISENSE__
|
||||
# define MODULE_EXPORT __attribute__( ( visibility( "default" ) ) )
|
||||
# define MODULE_WASM_MODNAME(mod) __attribute__((import_module(mod)))
|
||||
#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__
|
||||
#define MODULE_EXPORT
|
||||
#define MODULE_WASM_MODNAME(mod)
|
||||
#define __attribute__(x)
|
||||
#define __restrict__
|
||||
#endif
|
||||
|
||||
/********************************* Headers *********************************/
|
||||
// MSFS headers
|
||||
#include "rapidjson/filewritestream.h"
|
||||
#include <MSFS/Legacy/gauges.h>
|
||||
#include <MSFS/MSFS.h>
|
||||
#include <MSFS/MSFS_CommBus.h>
|
||||
#include <MSFS/Legacy/gauges.h>
|
||||
#include <SimConnect.h>
|
||||
#include <rapidjson/document.h>
|
||||
#include <rapidjson/filereadstream.h>
|
||||
#include "rapidjson/filewritestream.h"
|
||||
#include <rapidjson/writer.h>
|
||||
#include <SimConnect.h>
|
||||
|
||||
// C headers
|
||||
#include <string.h>
|
||||
// C++ headers
|
||||
#include <ctime>
|
||||
// Own headers
|
||||
#include "shared.h"
|
||||
#include "pax.h"
|
||||
#include "freighter.h"
|
||||
#include "fuel.h"
|
||||
#include "pax.h"
|
||||
#include "shared.h"
|
||||
|
||||
/******************************** Constants ********************************/
|
||||
// Module identification
|
||||
#define MODULE_NAME "[KHOFMANN TFDi MD-11 Load Manager] "
|
||||
#define VERSION_STRING " 1.0 "
|
||||
#define VERSION_STRING "2.9-beta"
|
||||
// COMM BUS
|
||||
#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"
|
||||
|
||||
/******************************** Functions ********************************/
|
||||
void commBusUpdateTargetCallback(const char* args, unsigned int size, void* ctx);
|
||||
int receiveData(const char* buf);
|
||||
void commBusUpdateTargetCallback(const char *args, unsigned int size, void *ctx);
|
||||
int receiveData(const char *buf);
|
||||
void sendData();
|
||||
void CALLBACK MyDispatchProc(SIMCONNECT_RECV* pData, DWORD cbData, void* pContext);
|
||||
void log(FILE* file, const char* format, void* optionalElement = NULL);
|
||||
void CALLBACK MyDispatchProc(SIMCONNECT_RECV *pData, DWORD cbData, void *pContext);
|
||||
void log(FILE *file, const char *format, void *optionalElement = NULL);
|
||||
|
||||
@@ -5,28 +5,16 @@ VisualStudioVersion = 17.13.36105.23
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "load-manager", "load-manager.vcxproj", "{A5468B35-BBBD-4C55-97ED-81BFE343B0E4}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "load-manager-cli", "load-manager-cli.vcxproj", "{992CAF4B-B3F6-4A86-A1C1-663686082C5E}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|MSFS = Debug|MSFS
|
||||
Debug|x64 = Debug|x64
|
||||
Release|MSFS = Release|MSFS
|
||||
Release|x64 = Release|x64
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{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|x64.ActiveCfg = Debug|x64
|
||||
{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|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
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
||||
@@ -114,6 +114,7 @@
|
||||
</BasicRuntimeChecks>
|
||||
<LanguageStandard>stdcpp14</LanguageStandard>
|
||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||
<AdditionalOptions>/clang:-fstack-usage %(AdditionalOptions)</AdditionalOptions>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>
|
||||
@@ -211,6 +212,7 @@ Powershell.exe -File .\copy-debug.ps1</Command>
|
||||
<SupportJustMyCode>
|
||||
</SupportJustMyCode>
|
||||
<LanguageStandard>stdcpp14</LanguageStandard>
|
||||
<AdditionalOptions>/clang:-fstack-usage %(AdditionalOptions)</AdditionalOptions>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>
|
||||
@@ -286,12 +288,14 @@ Powershell.exe -File .\copy-release.ps1</Command>
|
||||
<ClCompile Include="freighter.cpp" />
|
||||
<ClCompile Include="load-manager.cpp" />
|
||||
<ClCompile Include="pax.cpp" />
|
||||
<ClCompile Include="fuel.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="freighter.h" />
|
||||
<ClInclude Include="load-manager.h" />
|
||||
<ClInclude Include="pax.h" />
|
||||
<ClInclude Include="shared.h" />
|
||||
<ClInclude Include="fuel.h" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
|
||||
+280
-278
@@ -1,323 +1,325 @@
|
||||
#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));
|
||||
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);
|
||||
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;
|
||||
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;
|
||||
|
||||
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--;
|
||||
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++;
|
||||
}
|
||||
}
|
||||
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--;
|
||||
}
|
||||
numPax -= _numPax;
|
||||
targetPayload->paxCount.total += _numPax;
|
||||
|
||||
count--;
|
||||
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);
|
||||
}
|
||||
// Refinement pax
|
||||
count = MAX_PAX;
|
||||
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 > 0) {
|
||||
targetPayload->paxCount.business1--;
|
||||
}
|
||||
else if (targetPayload->paxCount.business2 > 0) {
|
||||
targetPayload->paxCount.business2--;
|
||||
}
|
||||
else if (targetPayload->paxCount.economy1 > 0) {
|
||||
targetPayload->paxCount.economy1--;
|
||||
}
|
||||
else {
|
||||
break;
|
||||
}
|
||||
_numPax = 0;
|
||||
|
||||
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 > 0) {
|
||||
targetPayload->paxCount.economy2--;
|
||||
}
|
||||
else if (targetPayload->paxCount.economy1 > 0) {
|
||||
targetPayload->paxCount.economy1--;
|
||||
}
|
||||
else if (targetPayload->paxCount.business2 > 0) {
|
||||
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--;
|
||||
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--;
|
||||
}
|
||||
// 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--;
|
||||
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;
|
||||
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 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);
|
||||
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 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;
|
||||
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);
|
||||
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;
|
||||
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;
|
||||
totalWeight += fuel->total;
|
||||
|
||||
*TOCG = TO_PERCENT_MAC(totalMoment / totalWeight);
|
||||
targetPayload->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);
|
||||
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);
|
||||
localPayload._ZFWCG = localPayload.ZFWCG / 100.0;
|
||||
|
||||
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 = {};
|
||||
paxPayloadData_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);
|
||||
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);
|
||||
localPayload._ZFWCG = -1;
|
||||
|
||||
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 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);
|
||||
const double BAG_WEIGHT(const bool isImperial, const UserOptions_t *const options) {
|
||||
return (isImperial) ? (options->bagWeightLBS) : (options->bagWeightKG);
|
||||
}
|
||||
@@ -1,13 +1,13 @@
|
||||
#pragma once
|
||||
|
||||
#ifndef __INTELLISENSE__
|
||||
# define MODULE_EXPORT __attribute__( ( visibility( "default" ) ) )
|
||||
# define MODULE_WASM_MODNAME(mod) __attribute__((import_module(mod)))
|
||||
#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__
|
||||
#define MODULE_EXPORT
|
||||
#define MODULE_WASM_MODNAME(mod)
|
||||
#define __attribute__(x)
|
||||
#define __restrict__
|
||||
#endif
|
||||
|
||||
/********************************* Headers *********************************/
|
||||
@@ -19,23 +19,27 @@
|
||||
// C++ headers
|
||||
#include <algorithm>
|
||||
// Own headers
|
||||
#include "fuel.h"
|
||||
#include "shared.h"
|
||||
|
||||
/******************************** Constants ********************************/
|
||||
// 2x 190lbs default
|
||||
#define FRONT_CREW_WEIGHT(IS_IMPERIAL) ((IS_IMPERIAL) ? (380.0) : (172.0))
|
||||
// 5x 190lbs default
|
||||
#define REAR_CREW_WEIGHT(IS_IMPERIAL) ((IS_IMPERIAL) ? (950.0) : (430.0))
|
||||
#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 30
|
||||
#define MAX_BUSINESS_1 18
|
||||
// First 5 rows of economy
|
||||
#define MAX_BUSINESS_2 45
|
||||
// Next 14 rows
|
||||
// Next 10 rows
|
||||
#define MAX_ECONOMY_1 86
|
||||
// Remaining rows
|
||||
#define MAX_ECONOMY_2 137
|
||||
// 12 x 9
|
||||
// 6 x 8
|
||||
// 4 x 2
|
||||
#define MAX_ECONOMY_2 164
|
||||
// Total
|
||||
#define MAX_PAX 298
|
||||
#define MAX_PAX 313
|
||||
// Max ZFW
|
||||
#define MAX_PAX_ZFW(IS_IMPERIAL) ((IS_IMPERIAL) ? (400000) : (181437))
|
||||
// Arms
|
||||
@@ -56,92 +60,95 @@
|
||||
|
||||
/***************************** 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;
|
||||
// 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;
|
||||
unsigned short pax;
|
||||
unsigned int cargo;
|
||||
} sbPlanned;
|
||||
// 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 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);
|
||||
// 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);
|
||||
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 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 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);
|
||||
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);
|
||||
const double BAG_WEIGHT(const bool isImperial, const UserOptions_t *const options);
|
||||
@@ -1,13 +1,13 @@
|
||||
#pragma once
|
||||
|
||||
#ifndef __INTELLISENSE__
|
||||
# define MODULE_EXPORT __attribute__( ( visibility( "default" ) ) )
|
||||
# define MODULE_WASM_MODNAME(mod) __attribute__((import_module(mod)))
|
||||
#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__
|
||||
#define MODULE_EXPORT
|
||||
#define MODULE_WASM_MODNAME(mod)
|
||||
#define __attribute__(x)
|
||||
#define __restrict__
|
||||
#endif
|
||||
|
||||
/******************************** Constants ********************************/
|
||||
@@ -15,18 +15,15 @@
|
||||
#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
|
||||
// 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
|
||||
// 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_EMPTY -120.0
|
||||
#define ARM_PILOT 984.0
|
||||
#define ARM_FIRST_OFFICER 984.0
|
||||
#define ARM_ENGINEER 960.0
|
||||
@@ -34,22 +31,11 @@
|
||||
#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 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)
|
||||
@@ -60,71 +46,79 @@
|
||||
#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 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)
|
||||
#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,
|
||||
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_GSX,
|
||||
DATA_REQUEST_USER_DATA,
|
||||
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 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;
|
||||
double isCargo;
|
||||
double isER;
|
||||
double isImperial;
|
||||
} UserData_t;
|
||||
|
||||
typedef struct {
|
||||
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
|
||||
// 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;
|
||||
bool GSXSync;
|
||||
double paxWeightKG;
|
||||
double bagWeightKG;
|
||||
double paxWeightLBS;
|
||||
double bagWeightLBS;
|
||||
} UserOptions_t;
|
||||
@@ -0,0 +1,20 @@
|
||||
Fuel (once implemented)
|
||||
ZFWCG for WBS (once implemented) `MD11_EXTCTL_WBS_ZFWCG`
|
||||
https://discord.com/channels/589851727373795331/1165358675037270066/1469039399961497753
|
||||
|
||||
Fuel Schedule
|
||||
Mains 1/2/3
|
||||
Upper Aux
|
||||
Lower Aux
|
||||
Tail
|
||||
LEft/Right Forward Aux
|
||||
|
||||
Fuel Limits from EFB
|
||||
|
||||
GSX Sync
|
||||
When Fueling is called, fuel progressively using FuelDataSet_t and FUEL_SET enums
|
||||
Find fueling rate of plane
|
||||
|
||||
In JS
|
||||
Remove Set Fuel
|
||||
Fuel is set with total load button
|
||||
+1
-4
@@ -1,4 +1 @@
|
||||
Copy-Item .\PackageSources\wasm-module\MSFS\Debug\load-manager.wasm .\PackageSources\SimObjects\Airplanes\TFDi_Design_MD-11_GE\panel
|
||||
Copy-Item .\PackageSources\wasm-module\MSFS\Debug\load-manager.wasm .\PackageSources\SimObjects\Airplanes\TFDi_Design_MD-11_PW\panel
|
||||
Copy-Item .\PackageSources\wasm-module\MSFS\Debug\load-manager.wasm .\PackageSources\SimObjects\Airplanes\TFDi_Design_MD-11F_GE\panel
|
||||
Copy-Item .\PackageSources\wasm-module\MSFS\Debug\load-manager.wasm .\PackageSources\SimObjects\Airplanes\TFDi_Design_MD-11F_PW\panel
|
||||
Copy-Item .\PackageSources\wasm-module\MSFS\Debug\load-manager.wasm .\PackageSources\SimObjects\Airplanes\TFDi_Design_MD-11\common\panel
|
||||
+1
-4
@@ -1,4 +1 @@
|
||||
Copy-Item .\PackageSources\wasm-module\MSFS\Release\load-manager.wasm .\PackageSources\SimObjects\Airplanes\TFDi_Design_MD-11_GE\panel
|
||||
Copy-Item .\PackageSources\wasm-module\MSFS\Release\load-manager.wasm .\PackageSources\SimObjects\Airplanes\TFDi_Design_MD-11_PW\panel
|
||||
Copy-Item .\PackageSources\wasm-module\MSFS\Release\load-manager.wasm .\PackageSources\SimObjects\Airplanes\TFDi_Design_MD-11F_GE\panel
|
||||
Copy-Item .\PackageSources\wasm-module\MSFS\Release\load-manager.wasm .\PackageSources\SimObjects\Airplanes\TFDi_Design_MD-11F_PW\panel
|
||||
Copy-Item .\PackageSources\wasm-module\MSFS\Release\load-manager.wasm .\PackageSources\SimObjects\Airplanes\TFDi_Design_MD-11\common\panel
|
||||
|
||||
+18
-10
@@ -1,3 +1,4 @@
|
||||
const { applyPatch } = require("diff");
|
||||
const fs = require("fs");
|
||||
const util = require("node:util");
|
||||
const exec = util.promisify(require("node:child_process").exec);
|
||||
@@ -6,25 +7,32 @@ const readline = require("readline");
|
||||
const outPath =
|
||||
"./PackageSources/html_ui/Pages/VCockpit/Instruments/aircraft_efb/KH_TFDi_MD11_efb";
|
||||
|
||||
fs.copyFileSync("./EFB/efb.js", `${outPath}/efb.js`);
|
||||
fs.copyFileSync("./EFB/efb.html", `${outPath}/efb.html`);
|
||||
fs.copyFileSync("./EFB/efb.css", `${outPath}/efb.css`);
|
||||
console.log("Files transferred.");
|
||||
|
||||
exec("git apply ./EFB/efb-js.patch").then(({ stdout, stderr }) => {
|
||||
console.log("Patches efb.js applied.");
|
||||
});
|
||||
exec("git apply ./EFB/efb-html.patch").then(({ stdout, stderr }) => {
|
||||
console.log("Patches efb.html applied.");
|
||||
});
|
||||
let file1Contents = fs.readFileSync("./EFB/efb.js").toString();
|
||||
let patch = fs.readFileSync("./EFB/efb-js.patch").toString();
|
||||
let patchedFile = applyPatch(file1Contents, patch);
|
||||
fs.writeFileSync(`${outPath}/efb.js`, patchedFile);
|
||||
|
||||
file1Contents = fs.readFileSync("./EFB/efb.index.js").toString();
|
||||
patch = fs.readFileSync("./EFB/efb-index-js.patch").toString();
|
||||
patchedFile = applyPatch(file1Contents, patch);
|
||||
fs.writeFileSync(`${outPath}/efb.index.js`, patchedFile);
|
||||
|
||||
file1Contents = fs.readFileSync("./EFB/efb.html").toString();
|
||||
patch = fs.readFileSync("./EFB/efb-html.patch").toString();
|
||||
patchedFile = applyPatch(file1Contents, patch);
|
||||
fs.writeFileSync(`${outPath}/efb.html`, patchedFile);
|
||||
|
||||
var output = "";
|
||||
var lineReader = readline.createInterface({
|
||||
input: fs.createReadStream(`${outPath}/App.js`),
|
||||
});
|
||||
lineReader.on("line", (line) => {
|
||||
if (line.startsWith("import") || line.startsWith("export")) {
|
||||
if (line.startsWith("import")) {
|
||||
output += "// " + line + "\n";
|
||||
} else if (line.startsWith("export")) {
|
||||
output += "window.KH_LM = App;\n";
|
||||
} else {
|
||||
output += line + "\n";
|
||||
}
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"scripts": {
|
||||
"debugger": "cd \"$env:MSFS_SDK/Tools/CoherentGT Debugger\" && ./Debugger.exe",
|
||||
"locale": "cd \"$env:MSFS_SDK/Tools/MSFS_Localization\" && ./MSFSLocalizationManager.exe"
|
||||
},
|
||||
"devDependencies": {
|
||||
"diff": "^8.0.2"
|
||||
}
|
||||
}
|
||||
Generated
+23
@@ -0,0 +1,23 @@
|
||||
lockfileVersion: '9.0'
|
||||
|
||||
settings:
|
||||
autoInstallPeers: true
|
||||
excludeLinksFromLockfile: false
|
||||
|
||||
importers:
|
||||
|
||||
.:
|
||||
devDependencies:
|
||||
diff:
|
||||
specifier: ^8.0.2
|
||||
version: 8.0.2
|
||||
|
||||
packages:
|
||||
|
||||
diff@8.0.2:
|
||||
resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==}
|
||||
engines: {node: '>=0.3.1'}
|
||||
|
||||
snapshots:
|
||||
|
||||
diff@8.0.2: {}
|
||||
@@ -5,6 +5,33 @@
|
||||
}
|
||||
],
|
||||
"settings": {
|
||||
"cSpell.words": ["deboarding", "khofmann", "tfdi", "TFDI", "TOCG", "ZFWCG"]
|
||||
"cSpell.words": [
|
||||
"AUXLWR",
|
||||
"AUXUPR",
|
||||
"bksp",
|
||||
"couatl",
|
||||
"Deboarded",
|
||||
"DEBOARDED",
|
||||
"deboarding",
|
||||
"Deinitialized",
|
||||
"EXTCTL",
|
||||
"FCOMs",
|
||||
"FSDT",
|
||||
"FWDAUXL",
|
||||
"FWDAUXR",
|
||||
"HRESULT",
|
||||
"khofmann",
|
||||
"LEMAC",
|
||||
"MSFS",
|
||||
"NUMPASSENGERS",
|
||||
"SIMCONNECT",
|
||||
"SIMOBJECT",
|
||||
"SIMOBJECTS",
|
||||
"tfdi",
|
||||
"TFDI",
|
||||
"tfdidesign",
|
||||
"TOCG",
|
||||
"ZFWCG"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
<UserSettings>
|
||||
<CheckedOutPackages>
|
||||
<Package Name="xkhofmann-tfdidesign-md11-load-manager"/>
|
||||
</CheckedOutPackages>
|
||||
<SelectedPackages/>
|
||||
<Filter/>
|
||||
<ShowOnlyEdited>false</ShowOnlyEdited>
|
||||
</UserSettings>
|
||||
|
||||
Reference in New Issue
Block a user