diff --git a/PackageSources/js-bundle/package.json b/PackageSources/js-bundle/package.json index 926b1bc..3e99c18 100644 --- a/PackageSources/js-bundle/package.json +++ b/PackageSources/js-bundle/package.json @@ -1,6 +1,6 @@ { "name": "tfdidesign-md11-load-manager", - "version": "0.2.8", + "version": "0.2.10", "description": "", "main": "index.js", "type": "module", diff --git a/PackageSources/js-bundle/src/components/SBEntry/SBEntryF.tsx b/PackageSources/js-bundle/src/components/SBEntry/SBEntryF.tsx index 3947580..df4c423 100644 --- a/PackageSources/js-bundle/src/components/SBEntry/SBEntryF.tsx +++ b/PackageSources/js-bundle/src/components/SBEntry/SBEntryF.tsx @@ -11,10 +11,11 @@ interface SBEntryProps { WASMData: WASMDataF; loadingState: LoadingState; gsxActive: boolean; + gsxFuelActive: boolean; setLoadingState: (newState: LoadingState) => void; } -const SBEntryF: FC = ({ WASMData, loadingState, gsxActive, setLoadingState }) => { +const SBEntryF: FC = ({ WASMData, loadingState, gsxActive, gsxFuelActive, setLoadingState }) => { const [CGTarget, setCGTarget] = useState(WASMData.targetPayload.CGTarget); const [fuel, setFuel] = useState(Math.round(WASMData.targetPayload.fuel)); const [SBInFlight, setSBInFlight] = useState(false); @@ -102,7 +103,7 @@ const SBEntryF: FC = ({ WASMData, loadingState, gsxActive, setLoad className={`w-1/2 rounded-lg border border-white bg-zinc-700 px-3 py-2 text-right`} value={fuel} onChange={(value) => handleInput(value, WASMData.limits.maxFuel, setFuel)} - disabled={loadingState !== 'preview' || gsxActive} + disabled={loadingState !== 'preview' || gsxFuelActive} /> diff --git a/PackageSources/js-bundle/src/components/SBEntry/SBEntryPax.tsx b/PackageSources/js-bundle/src/components/SBEntry/SBEntryPax.tsx index 23877b2..4ae3607 100644 --- a/PackageSources/js-bundle/src/components/SBEntry/SBEntryPax.tsx +++ b/PackageSources/js-bundle/src/components/SBEntry/SBEntryPax.tsx @@ -11,13 +11,13 @@ interface SBEntryProps { WASMData: WASMDataPax; loadingState: LoadingState; gsxActive: boolean; + gsxFuelActive: boolean; setLoadingState: (newState: LoadingState) => void; } -const SBEntryPax: FC = ({ WASMData, loadingState, gsxActive, setLoadingState }) => { +const SBEntryPax: FC = ({ WASMData, loadingState, gsxActive, gsxFuelActive, setLoadingState }) => { const [CGTarget, setCGTarget] = useState(WASMData.targetPayload.CGTarget); const [fuel, setFuel] = useState(Math.round(WASMData.targetPayload.fuel)); - const [fuelEnabled, setFuelEnabled] = useState(true); const [SBInFlight, setSBInFlight] = useState(false); // FROM EFB @@ -106,7 +106,7 @@ const SBEntryPax: FC = ({ WASMData, loadingState, gsxActive, setLo className={`w-1/2 rounded-lg border border-white bg-zinc-700 px-3 py-2 text-right`} value={fuel} onChange={(value) => handleInput(value, WASMData.limits.maxFuel, setFuel)} - disabled={loadingState !== 'preview' || gsxActive} + disabled={loadingState !== 'preview' || gsxFuelActive} /> diff --git a/PackageSources/js-bundle/src/components/freighter/Freighter.tsx b/PackageSources/js-bundle/src/components/freighter/Freighter.tsx index e0a52a4..2b1dba1 100644 --- a/PackageSources/js-bundle/src/components/freighter/Freighter.tsx +++ b/PackageSources/js-bundle/src/components/freighter/Freighter.tsx @@ -1,6 +1,6 @@ import { FC, useEffect, useState } from 'react'; import { LoadingState } from '../../types/general'; -import { GSXLoadingState, WASMDataF } from '../../types/WASMData'; +import { GSXFuelingState, GSXLoadingState, WASMDataF } from '../../types/WASMData'; import OptionsF from '../options/OptionsF'; import Profile from '../profile/Profile'; import SBEntryF from '../SBEntry/SBEntryF'; @@ -65,6 +65,9 @@ const Freighter: FC = ({ WASMData, username }) => { WASMData.GSX.loadingState !== GSXLoadingState.DEBOARDED ); }; + const GSXFuelActive = () => { + return WASMData.GSX.couatlStarted && WASMData.GSX.fuelingState !== GSXFuelingState.IDLE; + }; const CGs = (): [string, boolean, string, boolean] => { if (loadingState !== 'loaded' && !GSXActive()) { @@ -118,9 +121,7 @@ const Freighter: FC = ({ WASMData, username }) => { } /> @@ -130,6 +131,7 @@ const Freighter: FC = ({ WASMData, username }) => { loadingState={loadingState} setLoadingState={setLoadingState} gsxActive={GSXActive()} + gsxFuelActive={GSXFuelActive()} /> )} {((username && selectedTab === 1) || (!username && selectedTab === 0)) && ( @@ -138,6 +140,7 @@ const Freighter: FC = ({ WASMData, username }) => { loadingState={loadingState} setLoadingState={setLoadingState} gsxActive={GSXActive()} + gsxFuelActive={GSXFuelActive()} /> )} {((username && selectedTab === 2) || (!username && selectedTab === 1)) && ( @@ -146,6 +149,7 @@ const Freighter: FC = ({ WASMData, username }) => { loadingState={loadingState} setLoadingState={setLoadingState} gsxActive={GSXActive()} + gsxFuelActive={GSXFuelActive()} /> )} {((username && selectedTab === 3) || (!username && selectedTab === 2)) && ( diff --git a/PackageSources/js-bundle/src/components/pax/Pax.tsx b/PackageSources/js-bundle/src/components/pax/Pax.tsx index ff038b1..1d4eaf9 100644 --- a/PackageSources/js-bundle/src/components/pax/Pax.tsx +++ b/PackageSources/js-bundle/src/components/pax/Pax.tsx @@ -1,6 +1,6 @@ import { FC, useEffect, useState } from 'react'; import { LoadingState } from '../../types/general'; -import { GSXLoadingState, WASMDataPax } from '../../types/WASMData'; +import { GSXFuelingState, GSXLoadingState, WASMDataPax } from '../../types/WASMData'; import OptionsPax from '../options/OptionsPax'; import Profile from '../profile/Profile'; import SBEntryPax from '../SBEntry/SBEntryPax'; @@ -65,6 +65,9 @@ const Pax: FC = ({ WASMData, username }) => { WASMData.GSX.loadingState !== GSXLoadingState.DEBOARDED ); }; + const GSXFuelActive = () => { + return WASMData.GSX.couatlStarted && WASMData.GSX.fuelingState !== GSXFuelingState.IDLE; + }; const CGs = (): [string, boolean, string, boolean] => { if (loadingState !== 'loaded' && !GSXActive()) { @@ -134,6 +137,7 @@ const Pax: FC = ({ WASMData, username }) => { loadingState={loadingState} setLoadingState={setLoadingState} gsxActive={GSXActive()} + gsxFuelActive={GSXFuelActive()} /> )} {((username && selectedTab === 1) || (!username && selectedTab === 0)) && ( @@ -142,6 +146,7 @@ const Pax: FC = ({ WASMData, username }) => { loadingState={loadingState} setLoadingState={setLoadingState} gsxActive={GSXActive()} + gsxFuelActive={GSXFuelActive()} /> )} {((username && selectedTab === 2) || (!username && selectedTab === 1)) && ( @@ -150,6 +155,7 @@ const Pax: FC = ({ WASMData, username }) => { loadingState={loadingState} setLoadingState={setLoadingState} gsxActive={GSXActive()} + gsxFuelActive={GSXFuelActive()} /> )} {((username && selectedTab === 3) || (!username && selectedTab === 2)) && ( diff --git a/PackageSources/js-bundle/src/components/stationEntry/StationEntryF.tsx b/PackageSources/js-bundle/src/components/stationEntry/StationEntryF.tsx index baba1bf..b980654 100644 --- a/PackageSources/js-bundle/src/components/stationEntry/StationEntryF.tsx +++ b/PackageSources/js-bundle/src/components/stationEntry/StationEntryF.tsx @@ -9,10 +9,11 @@ interface StationEntryProps { WASMData: WASMDataF; loadingState: LoadingState; gsxActive: boolean; + gsxFuelActive: boolean; setLoadingState: (newState: LoadingState) => void; } -const StationEntryF: FC = ({ WASMData, loadingState, gsxActive, setLoadingState }) => { +const StationEntryF: FC = ({ WASMData, loadingState, gsxActive, gsxFuelActive, setLoadingState }) => { const [upper1, setUpper1] = useState(WASMData.targetPayload.upper1); const [upper2, setUpper2] = useState(WASMData.targetPayload.upper2); const [upper3, setUpper3] = useState(WASMData.targetPayload.upper3); @@ -76,7 +77,7 @@ const StationEntryF: FC = ({ WASMData, loadingState, gsxActiv className={`w-1/2 rounded-lg border border-white bg-zinc-700 px-3 py-2 text-right`} value={fuel} onChange={(value) => handleInput(value, WASMData.limits.maxFuel, setFuel)} - disabled={loadingState !== 'preview' || gsxActive} + disabled={loadingState !== 'preview' || gsxFuelActive} /> diff --git a/PackageSources/js-bundle/src/components/stationEntry/StationEntryPax.tsx b/PackageSources/js-bundle/src/components/stationEntry/StationEntryPax.tsx index c2f3382..3ff2768 100644 --- a/PackageSources/js-bundle/src/components/stationEntry/StationEntryPax.tsx +++ b/PackageSources/js-bundle/src/components/stationEntry/StationEntryPax.tsx @@ -9,10 +9,17 @@ interface StationEntryProps { WASMData: WASMDataPax; loadingState: LoadingState; gsxActive: boolean; + gsxFuelActive: boolean; setLoadingState: (newState: LoadingState) => void; } -const StationEntryPax: FC = ({ WASMData, loadingState, gsxActive, setLoadingState }) => { +const StationEntryPax: FC = ({ + WASMData, + loadingState, + gsxActive, + gsxFuelActive, + setLoadingState, +}) => { const [business1, setBusiness1] = useState(WASMData.targetPayload.business1); const [business2, setBusiness2] = useState(WASMData.targetPayload.business2); const [economy1, setEconomy1] = useState(WASMData.targetPayload.economy1); @@ -76,7 +83,7 @@ const StationEntryPax: FC = ({ WASMData, loadingState, gsxAct className={`w-1/2 rounded-lg border border-white bg-zinc-700 px-3 py-2 text-right`} value={fuel} onChange={(value) => handleInput(value, WASMData.limits.maxFuel, setFuel)} - disabled={loadingState !== 'preview' || gsxActive} + disabled={loadingState !== 'preview' || gsxFuelActive} /> diff --git a/PackageSources/js-bundle/src/components/zfwEntry/ZFWEntryF.tsx b/PackageSources/js-bundle/src/components/zfwEntry/ZFWEntryF.tsx index 27656ab..fc01a29 100644 --- a/PackageSources/js-bundle/src/components/zfwEntry/ZFWEntryF.tsx +++ b/PackageSources/js-bundle/src/components/zfwEntry/ZFWEntryF.tsx @@ -10,10 +10,11 @@ interface ZFWEntryProps { WASMData: WASMDataF; loadingState: LoadingState; gsxActive: boolean; + gsxFuelActive: boolean; setLoadingState: (newState: LoadingState) => void; } -const ZFWEntryF: FC = ({ WASMData, loadingState, gsxActive, setLoadingState }) => { +const ZFWEntryF: FC = ({ WASMData, loadingState, gsxActive, gsxFuelActive, setLoadingState }) => { const [CGTarget, setCGTarget] = useState(WASMData.targetPayload.CGTarget); const [fuel, setFuel] = useState(Math.round(WASMData.targetPayload.fuel)); const [ZFWTarget, setZFWTarget] = useState(Math.round(WASMData.targetPayload.total)); @@ -102,7 +103,7 @@ const ZFWEntryF: FC = ({ WASMData, loadingState, gsxActive, setLo className={`w-1/2 rounded-lg border border-white bg-zinc-700 px-3 py-2 text-right`} value={fuel} onChange={(value) => handleInput(value, WASMData.limits.maxFuel, setFuel)} - disabled={loadingState !== 'preview' || gsxActive} + disabled={loadingState !== 'preview' || gsxFuelActive} /> diff --git a/PackageSources/js-bundle/src/components/zfwEntry/ZFWEntryPax.tsx b/PackageSources/js-bundle/src/components/zfwEntry/ZFWEntryPax.tsx index d7fdd69..45cc638 100644 --- a/PackageSources/js-bundle/src/components/zfwEntry/ZFWEntryPax.tsx +++ b/PackageSources/js-bundle/src/components/zfwEntry/ZFWEntryPax.tsx @@ -10,10 +10,11 @@ interface ZFWEntryProps { WASMData: WASMDataPax; loadingState: LoadingState; gsxActive: boolean; + gsxFuelActive: boolean; setLoadingState: (newState: LoadingState) => void; } -const ZFWEntryPax: FC = ({ WASMData, loadingState, gsxActive, setLoadingState }) => { +const ZFWEntryPax: FC = ({ WASMData, loadingState, gsxActive, gsxFuelActive, setLoadingState }) => { const [CGTarget, setCGTarget] = useState(WASMData.targetPayload.CGTarget); const [fuel, setFuel] = useState(Math.round(WASMData.targetPayload.fuel)); const [ZFWTarget, setZFWTarget] = useState(Math.round(WASMData.targetPayload.total)); @@ -102,7 +103,7 @@ const ZFWEntryPax: FC = ({ WASMData, loadingState, gsxActive, set className={`w-1/2 rounded-lg border border-white bg-zinc-700 px-3 py-2 text-right`} value={fuel} onChange={(value) => handleInput(value, WASMData.limits.maxFuel, setFuel)} - disabled={loadingState !== 'preview' || gsxActive} + disabled={loadingState !== 'preview' || gsxFuelActive} /> diff --git a/PackageSources/js-bundle/src/types/WASMData.ts b/PackageSources/js-bundle/src/types/WASMData.ts index eac9231..db7197d 100644 --- a/PackageSources/js-bundle/src/types/WASMData.ts +++ b/PackageSources/js-bundle/src/types/WASMData.ts @@ -59,6 +59,7 @@ type LivePayloadF = TargetPayloadF; interface GSX { couatlStarted: boolean; loadingState: GSXLoadingState; + fuelingState: GSXFuelingState; } interface Limits { @@ -107,3 +108,8 @@ export enum GSXLoadingState { DEBOARDING = 3, DEBOARDED = 4, } + +export enum GSXFuelingState { + IDLE = 0, + FUELING = 1, +} diff --git a/PackageSources/wasm-module/freighter.cpp b/PackageSources/wasm-module/freighter.cpp index 05862d8..b9f3b15 100644 --- a/PackageSources/wasm-module/freighter.cpp +++ b/PackageSources/wasm-module/freighter.cpp @@ -275,11 +275,13 @@ void calculateCGs(fPayloadData_t *const targetPayload, const FuelData_t *const f targetPayload->TOCG = TO_PERCENT_MAC(totalMoment / totalWeight); } -void load(const fPayloadData_t *const targetPayload, const HANDLE simConnect, const bool isImperial) { +void load(const fPayloadData_t *const targetPayload, const FuelData_t *const fuel, const HANDLE simConnect, + const bool isImperial) { fPayloadData_t localPayload = {}; memcpy(&localPayload, targetPayload, sizeof(localPayload)); normalisePayload(&localPayload, isImperial); + calculateCGs(&localPayload, fuel, isImperial); localPayload._ZFWCG = localPayload.ZFWCG / 100.0; SimConnect_SetDataOnSimObject(simConnect, DATA_DEFINITION_PAYLOAD_F, SIMCONNECT_OBJECT_ID_USER, 0, 0, sizeof(fPayloadDataSet_t), diff --git a/PackageSources/wasm-module/freighter.h b/PackageSources/wasm-module/freighter.h index 402c772..92028e8 100644 --- a/PackageSources/wasm-module/freighter.h +++ b/PackageSources/wasm-module/freighter.h @@ -113,5 +113,6 @@ void generatePayload(fPayloadData_t *const targetPayload, const bool isImperial) // For Station Entry: CALL AFTER `generatePayload` void normalisePayload(fPayloadData_t *const targetPayload, const bool isImperial); void calculateCGs(fPayloadData_t *const targetPayload, const FuelData_t *const fuel, const bool isImperial); -void load(const fPayloadData_t *const targetPayload, const HANDLE simConnect, const bool isImperial); +void load(const fPayloadData_t *const targetPayload, const FuelData_t *const fuel, const HANDLE simConnect, + const bool isImperial); void unloadF(const HANDLE simConnect, const bool isER); diff --git a/PackageSources/wasm-module/fuel.cpp b/PackageSources/wasm-module/fuel.cpp index ffd32d8..be30afe 100644 --- a/PackageSources/wasm-module/fuel.cpp +++ b/PackageSources/wasm-module/fuel.cpp @@ -1,8 +1,7 @@ #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); +void distribute(FuelData_t *const targetFuel, const double fuelTarget, const bool isImperial, const bool isER) { + double fuelLbs = TO_POUNDS(isImperial, fuelTarget); // Equal mains if (fuelLbs <= MAX_TANK_1_3_LBS * 3) { @@ -98,7 +97,7 @@ void distribute(FuelData_t *const targetFuel, const double fuelTarget, const Use targetFuel->forwardAux1 = 0; targetFuel->forwardAux2 = 0; - } else if (userData->isER) { + } else if (isER) { targetFuel->main1 = MAX_TANK_1_3_MAIN_LBS; targetFuel->main3 = MAX_TANK_1_3_MAIN_LBS; targetFuel->main1Tip = MAX_TANK_1_3_TIP_LBS; @@ -118,6 +117,10 @@ void distribute(FuelData_t *const targetFuel, const double fuelTarget, const Use targetFuel->forwardAux2; } +void distribute(FuelData_t *const targetFuel, const double fuelTarget, const UserData_t *const userData) { + distribute(targetFuel, fuelTarget, userData->isImperial, userData->isER); +} + void fuel(const FuelData_t *const targetFuel, const HANDLE simConnect) { FuelDataSet_t localFuel = {}; diff --git a/PackageSources/wasm-module/fuel.h b/PackageSources/wasm-module/fuel.h index ff4f85a..aa73b27 100644 --- a/PackageSources/wasm-module/fuel.h +++ b/PackageSources/wasm-module/fuel.h @@ -22,7 +22,12 @@ #include "shared.h" /******************************** Constants ********************************/ + +// Pounds to gallons conversion #define LBS_PER_GAL 6.699999809 +// Fueling rate +#define FUELING_RATE ((LBS_PER_GAL * 1000) / 60) +// Max tank capacity gallons #define MAX_TANK_1_3_MAIN_GAL 5167.907 #define MAX_TANK_1_3_TIP_GAL 874.5 #define MAX_TANK_1_3_GAL (5167.907 + 874.5) @@ -31,6 +36,7 @@ #define MAX_LWR_AUX_GAL 1641.82 #define MAX_TAIL_GAL 1957.779 #define MAX_FWD_AUX_GAL 1970.8 +// Max tank capacity pounds #define MAX_TANK_1_3_MAIN_LBS (LBS_PER_GAL * MAX_TANK_1_3_MAIN_GAL) #define MAX_TANK_1_3_TIP_LBS (LBS_PER_GAL * MAX_TANK_1_3_TIP_GAL) #define MAX_TANK_1_3_LBS (LBS_PER_GAL * MAX_TANK_1_3_GAL) @@ -39,7 +45,6 @@ #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)) @@ -84,5 +89,6 @@ typedef struct { } FuelDataSet_t; /******************************** Functions ********************************/ +void distribute(FuelData_t *const targetFuel, const double fuelTarget, const bool isImperial, const bool isER); void distribute(FuelData_t *const targetFuel, const double fuelTarget, const UserData_t *const userData); void fuel(const FuelData_t *const targetFuel, const HANDLE simConnect); \ No newline at end of file diff --git a/PackageSources/wasm-module/load-manager.cpp b/PackageSources/wasm-module/load-manager.cpp index f228cde..cf50454 100644 --- a/PackageSources/wasm-module/load-manager.cpp +++ b/PackageSources/wasm-module/load-manager.cpp @@ -423,6 +423,12 @@ extern "C" MSFS_CALLBACK void module_init(void) { log(stderr, "Could not add L:FSDT_GSX_DEBOARDING_STATE to data definition, terminating.\n"); return; } + hr = SimConnect_AddToDataDefinition(simConnect, DATA_DEFINITION_GSX, "L:FSDT_GSX_REFUELING_STATE", "number", + SIMCONNECT_DATATYPE_FLOAT64); + if (hr != S_OK) { + log(stderr, "Could not add L:FSDT_GSX_REFULEING_STATE to data definition, terminating.\n"); + return; + } hr = SimConnect_AddToDataDefinition(simConnect, DATA_DEFINITION_GSX, "L:FSDT_GSX_NUMPASSENGERS_BOARDING_TOTAL", "number", SIMCONNECT_DATATYPE_FLOAT64); if (hr != S_OK) { @@ -604,10 +610,42 @@ extern "C" MSFS_CALLBACK void module_deinit(void) { // Main loop extern "C" MSFS_CALLBACK bool Load_Manager_gauge_callback(FsContext ctx, int service_id, void *pData) { + static double dTime = 0; + switch (service_id) { - case PANEL_SERVICE_PRE_UPDATE: { + case PANEL_SERVICE_PRE_DRAW: { + sGaugeDrawData *d = (sGaugeDrawData *)pData; + lookup_var(&tick18); if (fmod(tick18.var_value.n, 3) == 0) sendData(); + + if (GSXData->fuelingState == FUELING_STATE_FUELING && abs(liveFuelData->total - targetFuelData->total) < 0.1) { + GSXData->fuelingState = FUELING_STATE_FUELD; + fuel(targetFuelData, simConnect); + } + + dTime += d->dt; + + if (GSXData->fuelingState == FUELING_STATE_FUELING && dTime >= 0.5) { + + FuelData_t toSet = {}; + + if (targetFuelData->total > liveFuelData->total) { + distribute(&toSet, + min(targetFuelData->total, + liveFuelData->total + min(max(targetFuelData->total - liveFuelData->total, 1), FUELING_RATE) * dTime), + true, UserData->isER); + } else { + distribute(&toSet, + max(targetFuelData->total, + liveFuelData->total + max(min(targetFuelData->total - liveFuelData->total, -1), -FUELING_RATE) * dTime), + true, UserData->isER); + } + + dTime = 0; + + fuel(&toSet, simConnect); + } } default: break; @@ -723,10 +761,10 @@ int receiveData(const char *buf) { case CALL_MODE_LOAD_SET: { if (UserData->isCargo) { fuel(targetFuelData, simConnect); - load(targetFPayloadData, simConnect, UserData->isImperial); + load(targetFPayloadData, targetFuelData, simConnect, UserData->isImperial); } else { fuel(targetFuelData, simConnect); - load(targetPaxPayloadData, simConnect, UserData->isImperial); + load(targetPaxPayloadData, targetFuelData, simConnect, UserData->isImperial); } AircraftLoaded = true; @@ -781,6 +819,7 @@ int receiveData(const char *buf) { } case CALL_MODE_GSX_RESET: { GSXData->loadingState = LOADING_STATE_IDLE; + GSXData->fuelingState = FUELING_STATE_IDLE; UserOptions->GSXSync = false; } default: @@ -943,6 +982,7 @@ void sendData() { // GSX GSX.AddMember("couatlStarted", GSXData->couatlStarted, allocator); GSX.AddMember("loadingState", GSXData->loadingState, allocator); + GSX.AddMember("fuelingState", GSXData->fuelingState, allocator); // User Data userData.AddMember("isCargo", UserData->isCargo, allocator); @@ -1068,7 +1108,7 @@ void CALLBACK MyDispatchProc(SIMCONNECT_RECV *pData, DWORD cbData, void *pContex abs(liveFPayloadData->total - TO_POUNDS(UserData->isImperial, targetFPayloadData->total)) > 100) { log(stdout, "F AC loaded, Payload mismatch, resetting target\n"); - load(targetFPayloadData, simConnect, UserData->isImperial); + load(targetFPayloadData, liveFuelData, simConnect, UserData->isImperial); } break; @@ -1094,7 +1134,7 @@ void CALLBACK MyDispatchProc(SIMCONNECT_RECV *pData, DWORD cbData, void *pContex abs(livePaxPayloadData->total - TO_POUNDS(UserData->isImperial, targetPaxPayloadData->total)) > 100) { log(stdout, "PAX AC loaded, Payload mismatch, resetting target\n"); - load(targetPaxPayloadData, simConnect, UserData->isImperial); + load(targetPaxPayloadData, liveFuelData, simConnect, UserData->isImperial); } break; @@ -1122,6 +1162,7 @@ void CALLBACK MyDispatchProc(SIMCONNECT_RECV *pData, DWORD cbData, void *pContex GSXData->couatlStarted = data->couatlStarted; GSXData->boardingState = data->boardingState; GSXData->deboardingState = data->deboardingState; + GSXData->refuelingState = data->refuelingState; GSXData->passengersBoarded = data->passengersBoarded; GSXData->passengersDeboarded = data->passengersDeboarded; GSXData->cargoBoarded = data->cargoBoarded; @@ -1147,7 +1188,7 @@ void CALLBACK MyDispatchProc(SIMCONNECT_RECV *pData, DWORD cbData, void *pContex localPayload.lowerRear = targetFPayloadData->lowerRear * (cargoBoarded / 100); generatePayload(&localPayload, UserData->isImperial); - load(&localPayload, simConnect, UserData->isImperial); + load(&localPayload, liveFuelData, simConnect, UserData->isImperial); } else { double passengersBoarded = GSXData->passengersBoarded; paxPayloadData_t localPayload = {}; @@ -1165,7 +1206,7 @@ void CALLBACK MyDispatchProc(SIMCONNECT_RECV *pData, DWORD cbData, void *pContex localPayload.rearCargo = targetPaxPayloadData->rearCargo * (cargoBoarded / 100); generatePayload(&localPayload, UserData->isImperial, UserOptions); - load(&localPayload, simConnect, UserData->isImperial); + load(&localPayload, liveFuelData, simConnect, UserData->isImperial); } break; @@ -1180,13 +1221,13 @@ void CALLBACK MyDispatchProc(SIMCONNECT_RECV *pData, DWORD cbData, void *pContex memcpy(&localPayload, targetFPayloadData, sizeof(localPayload)); generatePayload(&localPayload, UserData->isImperial); - load(&localPayload, simConnect, UserData->isImperial); + load(&localPayload, liveFuelData, simConnect, UserData->isImperial); } else { paxPayloadData_t localPayload = {}; memcpy(&localPayload, targetPaxPayloadData, sizeof(localPayload)); generatePayload(&localPayload, UserData->isImperial, UserOptions); - load(&localPayload, simConnect, UserData->isImperial); + load(&localPayload, liveFuelData, simConnect, UserData->isImperial); } break; @@ -1216,7 +1257,7 @@ void CALLBACK MyDispatchProc(SIMCONNECT_RECV *pData, DWORD cbData, void *pContex localPayload.lowerRear -= targetFPayloadData->lowerRear * (cargoDeboarded / 100); generatePayload(&localPayload, UserData->isImperial); - load(&localPayload, simConnect, UserData->isImperial); + load(&localPayload, liveFuelData, simConnect, UserData->isImperial); } else { double passengersDeboarded = GSXData->passengersDeboarded; paxPayloadData_t localPayload = {}; @@ -1234,7 +1275,7 @@ void CALLBACK MyDispatchProc(SIMCONNECT_RECV *pData, DWORD cbData, void *pContex localPayload.rearCargo -= targetPaxPayloadData->rearCargo * (cargoDeboarded / 100); generatePayload(&localPayload, UserData->isImperial, UserOptions); - load(&localPayload, simConnect, UserData->isImperial); + load(&localPayload, liveFuelData, simConnect, UserData->isImperial); } break; @@ -1257,7 +1298,7 @@ void CALLBACK MyDispatchProc(SIMCONNECT_RECV *pData, DWORD cbData, void *pContex localPayload.lowerRear = 0; generatePayload(&localPayload, UserData->isImperial); - load(&localPayload, simConnect, UserData->isImperial); + load(&localPayload, liveFuelData, simConnect, UserData->isImperial); } else { paxPayloadData_t localPayload = {}; memcpy(&localPayload, targetPaxPayloadData, sizeof(localPayload)); @@ -1270,7 +1311,7 @@ void CALLBACK MyDispatchProc(SIMCONNECT_RECV *pData, DWORD cbData, void *pContex localPayload.rearCargo = 0; generatePayload(&localPayload, UserData->isImperial, UserOptions); - load(&localPayload, simConnect, UserData->isImperial); + load(&localPayload, liveFuelData, simConnect, UserData->isImperial); } break; @@ -1278,6 +1319,26 @@ void CALLBACK MyDispatchProc(SIMCONNECT_RECV *pData, DWORD cbData, void *pContex default: break; } + switch ((char)GSXData->refuelingState) { + case GSX_SERVICE_IDLE: { + GSXData->fuelingState = FUELING_STATE_IDLE; + + break; + } + case GSX_SERVICE_ACTIVE: { + GSXData->fuelingState = FUELING_STATE_FUELING; + + break; + } + case GSX_SERVICE_FINISHED: { + GSXData->fuelingState = FUELING_STATE_FUELD; + fuel(targetFuelData, simConnect); + + break; + } + default: + break; + } } break; diff --git a/PackageSources/wasm-module/load-manager.h b/PackageSources/wasm-module/load-manager.h index 542ba63..b5b5d7a 100644 --- a/PackageSources/wasm-module/load-manager.h +++ b/PackageSources/wasm-module/load-manager.h @@ -34,7 +34,7 @@ /******************************** Constants ********************************/ // Module identification #define MODULE_NAME "[KHOFMANN TFDi MD-11 Load Manager] " -#define VERSION_STRING "2.9-beta" +#define VERSION_STRING "2.12-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" diff --git a/PackageSources/wasm-module/pax.cpp b/PackageSources/wasm-module/pax.cpp index cc772b1..5e29e40 100644 --- a/PackageSources/wasm-module/pax.cpp +++ b/PackageSources/wasm-module/pax.cpp @@ -291,11 +291,13 @@ void calculateCGs(paxPayloadData_t *const targetPayload, const FuelData_t *const targetPayload->TOCG = TO_PERCENT_MAC(totalMoment / totalWeight); } -void load(const paxPayloadData_t *const targetPayload, const HANDLE simConnect, const bool isImperial) { +void load(const paxPayloadData_t *const targetPayload, const FuelData_t *const fuel, const HANDLE simConnect, + const bool isImperial) { paxPayloadData_t localPayload = {}; memcpy(&localPayload, targetPayload, sizeof(localPayload)); normalisePayload(&localPayload, isImperial); + calculateCGs(&localPayload, fuel, isImperial); localPayload._ZFWCG = localPayload.ZFWCG / 100.0; SimConnect_SetDataOnSimObject(simConnect, DATA_DEFINITION_PAYLOAD_PAX, SIMCONNECT_OBJECT_ID_USER, 0, 0, diff --git a/PackageSources/wasm-module/pax.h b/PackageSources/wasm-module/pax.h index 6cfbc06..34236dc 100644 --- a/PackageSources/wasm-module/pax.h +++ b/PackageSources/wasm-module/pax.h @@ -146,7 +146,8 @@ void generatePayload(paxPayloadData_t *const targetPayload, const bool isImperia // For Station Entry: CALL AFTER `generatePayload` void normalisePayload(paxPayloadData_t *const targetPayload, const bool isImperial); void calculateCGs(paxPayloadData_t *const targetPayload, const FuelData_t *const fuel, const bool isImperial); -void load(const paxPayloadData_t *const targetPayload, const HANDLE simConnect, const bool isImperial); +void load(const paxPayloadData_t *const targetPayload, const FuelData_t *const fuel, const HANDLE simConnect, + const bool isImperial); void unload(const HANDLE simConnect, const bool isER); // Based on ICAO/LH findings const double PAX_WEIGHT(const bool isImperial, const UserOptions_t *const options); diff --git a/PackageSources/wasm-module/shared.h b/PackageSources/wasm-module/shared.h index 05e31d4..4221d98 100644 --- a/PackageSources/wasm-module/shared.h +++ b/PackageSources/wasm-module/shared.h @@ -45,6 +45,7 @@ #define MAX_CG 34.0 #define CG_TOLERANCE 0.05 // GSX States +#define GSX_SERVICE_IDLE 1 #define GSX_SERVICE_ACTIVE 5 #define GSX_SERVICE_FINISHED 6 @@ -84,6 +85,8 @@ enum LOADING_STATES { LOADING_STATE_DEBOARDED, }; +enum FUELING_STATES { FUELING_STATE_IDLE, FUELING_STATE_FUELING, FUELING_STATE_FUELD }; + enum CALL_MODES { CALL_MODE_SB_SET, CALL_MODE_ZFW_SET, @@ -106,6 +109,7 @@ typedef struct { double couatlStarted; // boolean double boardingState; // See manual, 5 => active double deboardingState; // See manual, 5 => active + double refuelingState; // See manual, 5 => active double passengersBoarded; // Num pax double passengersDeboarded; // Num pax double cargoBoarded; // In percent @@ -113,6 +117,7 @@ typedef struct { // Additional properties enum LOADING_STATES loadingState; + enum FUELING_STATES fuelingState; } GSXData_t; typedef struct { diff --git a/TODO.md b/TODO.md index 5bd911e..c261bc8 100644 --- a/TODO.md +++ b/TODO.md @@ -1,20 +1,3 @@ -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 +TEST progressive fueling +TEST progressive loading/unloading ZFWCG +Implement minimum fuel in tank (i.e. unusable) \ No newline at end of file