From 04e5ec42514a5485339bd396c123ad65c67274a9 Mon Sep 17 00:00:00 2001 From: Kilian Hofmann Date: Tue, 9 Sep 2025 14:53:41 +0200 Subject: [PATCH] Moved GSX state machine into WASM --- PackageSources/js-bundle/package.json | 2 +- .../src/components/freighter/Freighter.tsx | 37 +-- .../js-bundle/src/components/pax/Pax.tsx | 79 +++---- PackageSources/js-bundle/src/constants.ts | 4 - .../js-bundle/src/types/WASMData.ts | 12 +- PackageSources/wasm-module/load-manager.cpp | 211 +++++++++++++----- PackageSources/wasm-module/load-manager.h | 2 +- PackageSources/wasm-module/shared.h | 14 ++ ...fdidesign-md11-load-manager.code-workspace | 11 +- 9 files changed, 218 insertions(+), 154 deletions(-) diff --git a/PackageSources/js-bundle/package.json b/PackageSources/js-bundle/package.json index 5692586..a72de41 100644 --- a/PackageSources/js-bundle/package.json +++ b/PackageSources/js-bundle/package.json @@ -1,6 +1,6 @@ { "name": "tfdidesign-md11-load-manager", - "version": "0.1.129", + "version": "0.1.138", "description": "", "main": "index.js", "type": "module", diff --git a/PackageSources/js-bundle/src/components/freighter/Freighter.tsx b/PackageSources/js-bundle/src/components/freighter/Freighter.tsx index d9dc91c..5e0a8ba 100644 --- a/PackageSources/js-bundle/src/components/freighter/Freighter.tsx +++ b/PackageSources/js-bundle/src/components/freighter/Freighter.tsx @@ -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'; @@ -17,21 +16,6 @@ interface FreighterProps { const Freighter: FC = ({ WASMData, username }) => { const [selectedTab, setSelectedTab] = useState(0); const [loadingState, setLoadingState] = useState('preview'); - const [boardingState, setBoardingState] = useState(1); - const [deboardingState, setDeboardingState] = useState(1); - - useEffect(() => { - if (WASMData.GSX.boardingState < GSX_SERVICE_CALLED) return; - - setBoardingState(WASMData.GSX.boardingState); - setDeboardingState(1); - }, [WASMData.GSX.boardingState]); - useEffect(() => { - if (WASMData.GSX.deboardingState < GSX_SERVICE_CALLED) return; - - setBoardingState(1); - setDeboardingState(WASMData.GSX.deboardingState); - }, [WASMData.GSX.deboardingState]); const upper1 = (overrideState: LoadingState = loadingState) => { if (overrideState !== 'loaded') return Math.round(WASMData.targetPayload.upper1); @@ -75,17 +59,10 @@ const Freighter: FC = ({ WASMData, username }) => { }; const GSXActive = () => { - // Cases when active: - // BOARDING called, running or done - // DEBOARDING called, running or done - // Cases when not active: - // BOARDING not called, disabled - // DEBOARDING not called, disabled - // BOTH done - return ( - (boardingState >= GSX_SERVICE_CALLED || deboardingState >= GSX_SERVICE_CALLED) && - deboardingState !== GSX_SERVICE_FINISHED + WASMData.GSX.couatlStarted && + WASMData.GSX.loadingState !== GSXLoadingState.IDLE && + WASMData.GSX.loadingState !== GSXLoadingState.DEBOARDED ); }; @@ -99,7 +76,7 @@ const Freighter: FC = ({ WASMData, username }) => { ]; } - if (WASMData.options.GSXSync && GSXActive() && 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, @@ -137,9 +114,7 @@ const Freighter: FC = ({ WASMData, username }) => { inPreview={loadingState !== 'loaded' && !GSXActive()} CGs={CGs()} done={ - WASMData.options.GSXSync - ? boardingState === GSX_SERVICE_FINISHED && deboardingState !== GSX_SERVICE_FINISHED - : loadingState !== 'preview' + WASMData.options.GSXSync ? WASMData.GSX.loadingState === GSXLoadingState.BOARDED : loadingState !== 'preview' } /> = ({ WASMData, username }) => { const [selectedTab, setSelectedTab] = useState(0); const [loadingState, setLoadingState] = useState('preview'); - const [boardingState, setBoardingState] = useState(1); - const [deboardingState, setDeboardingState] = useState(1); - - useEffect(() => { - if (WASMData.GSX.boardingState > 1 && WASMData.GSX.boardingState < GSX_SERVICE_CALLED) return; - - setBoardingState(WASMData.GSX.boardingState); - setDeboardingState(1); - }, [WASMData.GSX.boardingState]); - useEffect(() => { - if (WASMData.GSX.deboardingState > 1 && WASMData.GSX.deboardingState < GSX_SERVICE_CALLED) return; - - setBoardingState(1); - setDeboardingState(WASMData.GSX.deboardingState); - }, [WASMData.GSX.deboardingState]); const upper1 = (overrideState: LoadingState = loadingState) => { if (overrideState !== 'loaded') return WASMData.targetPayload.business1; @@ -54,43 +38,36 @@ const Pax: FC = ({ WASMData, username }) => { return WASMData.livePayload.economy2; }; const lower1 = () => { - if (loadingState !== 'loaded' && !GSXActive) return Math.round(WASMData.targetPayload.forwardCargo); + if (loadingState !== 'loaded' && !GSXActive()) return Math.round(WASMData.targetPayload.forwardCargo); return Math.round(WASMData.livePayload.forwardCargo); }; const lower2 = () => { - if (loadingState !== 'loaded' && !GSXActive) return Math.round(WASMData.targetPayload.rearCargo); + if (loadingState !== 'loaded' && !GSXActive()) return Math.round(WASMData.targetPayload.rearCargo); return Math.round(WASMData.livePayload.rearCargo); }; const OEW = () => { - if (loadingState !== 'loaded' && !GSXActive) return Math.round(WASMData.targetPayload.empty); + if (loadingState !== 'loaded' && !GSXActive()) return Math.round(WASMData.targetPayload.empty); return Math.round(WASMData.livePayload.empty); }; const crew = () => { - if (loadingState !== 'loaded' && !GSXActive) return Math.round(WASMData.targetPayload.crew); + if (loadingState !== 'loaded' && !GSXActive()) return Math.round(WASMData.targetPayload.crew); return Math.round(WASMData.livePayload.crew); }; - const GSXActive = useMemo(() => { - // Cases when active: - // BOARDING called, running or done - // DEBOARDING called, running or done - // Cases when not active: - // BOARDING not called, disabled - // DEBOARDING not called, disabled - // BOTH done - + const GSXActive = () => { return ( - (boardingState >= GSX_SERVICE_CALLED || deboardingState >= GSX_SERVICE_CALLED) && - deboardingState !== GSX_SERVICE_FINISHED + WASMData.GSX.couatlStarted && + WASMData.GSX.loadingState !== GSXLoadingState.IDLE && + WASMData.GSX.loadingState !== GSXLoadingState.DEBOARDED ); - }, [boardingState, deboardingState]); + }; const CGs = (): [string, boolean, string, boolean] => { - if (loadingState !== 'loaded' && !GSXActive) { + if (loadingState !== 'loaded' && !GSXActive()) { return [ WASMData.targetPayload.ZFWCG.toFixed(1), WASMData.targetPayload.ZFWCG < WASMData.limits.minCG || WASMData.targetPayload.ZFWCG > WASMData.limits.maxCG, @@ -99,7 +76,7 @@ const Pax: FC = ({ WASMData, username }) => { ]; } - if (WASMData.options.GSXSync && GSXActive && 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, @@ -125,25 +102,23 @@ const Pax: FC = ({ WASMData, username }) => { = ({ WASMData, username }) => { WASMData={WASMData} loadingState={loadingState} setLoadingState={setLoadingState} - gsxActive={GSXActive} + gsxActive={GSXActive()} /> )} {((username && selectedTab === 1) || (!username && selectedTab === 0)) && ( @@ -166,7 +141,7 @@ const Pax: FC = ({ WASMData, username }) => { WASMData={WASMData} loadingState={loadingState} setLoadingState={setLoadingState} - gsxActive={GSXActive} + gsxActive={GSXActive()} /> )} {((username && selectedTab === 2) || (!username && selectedTab === 1)) && ( @@ -174,11 +149,11 @@ const Pax: FC = ({ WASMData, username }) => { WASMData={WASMData} loadingState={loadingState} setLoadingState={setLoadingState} - gsxActive={GSXActive} + gsxActive={GSXActive()} /> )} {((username && selectedTab === 3) || (!username && selectedTab === 2)) && ( - + )} ); diff --git a/PackageSources/js-bundle/src/constants.ts b/PackageSources/js-bundle/src/constants.ts index 04c5587..64c4285 100644 --- a/PackageSources/js-bundle/src/constants.ts +++ b/PackageSources/js-bundle/src/constants.ts @@ -8,10 +8,6 @@ export const COMM_BUS_UPDATE_TARGET_EVENT = 'khofmann_tfdi_md-11_load_manager_up 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; diff --git a/PackageSources/js-bundle/src/types/WASMData.ts b/PackageSources/js-bundle/src/types/WASMData.ts index b6502bc..c7dd0de 100644 --- a/PackageSources/js-bundle/src/types/WASMData.ts +++ b/PackageSources/js-bundle/src/types/WASMData.ts @@ -59,8 +59,8 @@ interface LivePayloadF extends TargetPayloadF { } interface GSX { - boardingState: number; - deboardingState: number; + couatlStarted: boolean; + loadingState: GSXLoadingState; } interface Limits { @@ -101,3 +101,11 @@ interface Options { paxWeight: number; bagWeight: number; } + +export enum GSXLoadingState { + IDLE = 0, + BOARDING = 1, + BOARDED = 2, + DEBOARDING = 3, + DEBOARDED = 4, +} diff --git a/PackageSources/wasm-module/load-manager.cpp b/PackageSources/wasm-module/load-manager.cpp index 4448a60..d452696 100644 --- a/PackageSources/wasm-module/load-manager.cpp +++ b/PackageSources/wasm-module/load-manager.cpp @@ -17,6 +17,8 @@ HANDLE simConnect; FILE* logFile; MODULE_VAR tick18 = { TICK18 }; +#pragma region Module callbacks + // Init extern "C" MSFS_CALLBACK void module_init(void) { log(stdout, "Starting init.\n"); @@ -299,6 +301,11 @@ extern "C" MSFS_CALLBACK void module_init(void) { return; } // GSX LVars + hr = SimConnect_AddToDataDefinition(simConnect, DATA_DEFINITION_GSX, "L:FSDT_GSX_COUATL_STARTED", "number", SIMCONNECT_DATATYPE_FLOAT64); + if (hr != S_OK) { + log(stderr, "Could not add L:FSDT_GSX_COUATL_STARTED to data definition, terminating.\n"); + return; + } hr = SimConnect_AddToDataDefinition(simConnect, DATA_DEFINITION_GSX, "L:FSDT_GSX_BOARDING_STATE", "number", SIMCONNECT_DATATYPE_FLOAT64); if (hr != S_OK) { log(stderr, "Could not add L:FSDT_GSX_BOARDING_STATE to data definition, terminating.\n"); @@ -489,6 +496,8 @@ extern "C" MSFS_CALLBACK bool Load_Manager_gauge_callback(FsContext ctx, int ser return true; } +#pragma endregion + // CommBus void commBusUpdateTargetCallback(const char* args, unsigned int size, void* ctx) { int hr = receiveData(args); @@ -795,8 +804,8 @@ void sendData () { #pragma endregion // GSX - GSX.AddMember("boardingState", GSXData->boardingState, allocator); - GSX.AddMember("deboardingState", GSXData->deboardingState, allocator); + GSX.AddMember("couatlStarted", GSXData->couatlStarted, allocator); + GSX.AddMember("loadingState", GSXData->loadingState, allocator); // User Data userData.AddMember("isCargo", UserData->isCargo, allocator); @@ -954,79 +963,157 @@ void CALLBACK MyDispatchProc(SIMCONNECT_RECV* pData, DWORD cbData, void* pContex } case DATA_REQUEST_GSX: { GSXData_t* data = (GSXData_t*)&pObjData->dwData; - memcpy(GSXData, data, sizeof(GSXData_t)); + GSXData->couatlStarted = data->couatlStarted; + GSXData->boardingState = data->boardingState; + GSXData->deboardingState = data->deboardingState; + GSXData->passengersBoarded = data->passengersBoarded; + GSXData->passengersDeboarded = data->passengersDeboarded; + GSXData->cargoBoarded = data->cargoBoarded; + GSXData->cargoDeboarded = data->cargoDeboarded; - if (UserOptions->GSXSync) { - if (GSXData->boardingState == GSX_SERVICE_ACTIVE) { - double cargoBoarded = GSXData->cargoBoarded; - if (UserData->isCargo) { - fPayloadData_t localPayload = {}; - memcpy(&localPayload, targetFPayloadData, sizeof(localPayload)); + if (UserOptions->GSXSync && GSXData->couatlStarted == 1) { + switch ((char)GSXData->boardingState) { + case GSX_SERVICE_ACTIVE: { + GSXData->loadingState = LOADING_STATE_BOARDING; - localPayload.stations.upper1 = targetFPayloadData->stations.upper1 * (cargoBoarded / 100); - localPayload.stations.upper2 = targetFPayloadData->stations.upper2 * (cargoBoarded / 100); - localPayload.stations.upper3 = targetFPayloadData->stations.upper3 * (cargoBoarded / 100); - localPayload.stations.upper4 = targetFPayloadData->stations.upper4 * (cargoBoarded / 100); - localPayload.lowerForward = targetFPayloadData->lowerForward * (cargoBoarded / 100); - localPayload.lowerRear = targetFPayloadData->lowerRear * (cargoBoarded / 100); + double cargoBoarded = GSXData->cargoBoarded; + if (UserData->isCargo) { + fPayloadData_t localPayload = {}; + memcpy(&localPayload, targetFPayloadData, sizeof(localPayload)); - generatePayload(&localPayload, UserData->isImperial); - load(&localPayload, simConnect, UserData->isImperial); + localPayload.stations.upper1 = targetFPayloadData->stations.upper1 * (cargoBoarded / 100); + localPayload.stations.upper2 = targetFPayloadData->stations.upper2 * (cargoBoarded / 100); + localPayload.stations.upper3 = targetFPayloadData->stations.upper3 * (cargoBoarded / 100); + localPayload.stations.upper4 = targetFPayloadData->stations.upper4 * (cargoBoarded / 100); + localPayload.lowerForward = targetFPayloadData->lowerForward * (cargoBoarded / 100); + localPayload.lowerRear = targetFPayloadData->lowerRear * (cargoBoarded / 100); + + generatePayload(&localPayload, UserData->isImperial); + load(&localPayload, simConnect, UserData->isImperial); + } + else { + double passengersBoarded = GSXData->passengersBoarded; + paxPayloadData_t localPayload = {}; + memcpy(&localPayload, targetPaxPayloadData, sizeof(localPayload)); + + localPayload.paxCount.business1 = min(targetPaxPayloadData->paxCount.business1, passengersBoarded); + passengersBoarded -= localPayload.paxCount.business1; + localPayload.paxCount.business2 = min(targetPaxPayloadData->paxCount.business2, passengersBoarded); + passengersBoarded -= localPayload.paxCount.business2; + localPayload.paxCount.economy1 = min(targetPaxPayloadData->paxCount.economy1, passengersBoarded); + passengersBoarded -= localPayload.paxCount.economy1; + localPayload.paxCount.economy2 = min(targetPaxPayloadData->paxCount.economy2, passengersBoarded); + passengersBoarded -= localPayload.paxCount.economy2; + localPayload.forwardCargo = targetPaxPayloadData->forwardCargo * (cargoBoarded / 100); + localPayload.rearCargo = targetPaxPayloadData->rearCargo * (cargoBoarded / 100); + + generatePayload(&localPayload, UserData->isImperial, UserOptions); + load(&localPayload, simConnect, UserData->isImperial); + } + + break; } - else { - double passengersBoarded = GSXData->passengersBoarded; - paxPayloadData_t localPayload = {}; - memcpy(&localPayload, targetPaxPayloadData, sizeof(localPayload)); + case GSX_SERVICE_FINISHED: { + GSXData->loadingState = LOADING_STATE_BOARDED; - localPayload.paxCount.business1 = min(targetPaxPayloadData->paxCount.business1, passengersBoarded); - passengersBoarded -= localPayload.paxCount.business1; - localPayload.paxCount.business2 = min(targetPaxPayloadData->paxCount.business2, passengersBoarded); - passengersBoarded -= localPayload.paxCount.business2; - localPayload.paxCount.economy1 = min(targetPaxPayloadData->paxCount.economy1, passengersBoarded); - passengersBoarded -= localPayload.paxCount.economy1; - localPayload.paxCount.economy2 = min(targetPaxPayloadData->paxCount.economy2, passengersBoarded); - passengersBoarded -= localPayload.paxCount.economy2; - localPayload.forwardCargo = targetPaxPayloadData->forwardCargo * (cargoBoarded / 100); - localPayload.rearCargo = targetPaxPayloadData->rearCargo * (cargoBoarded / 100); + if (UserData->isCargo) { + fPayloadData_t localPayload = {}; + memcpy(&localPayload, targetFPayloadData, sizeof(localPayload)); - generatePayload(&localPayload, UserData->isImperial, UserOptions); - load(&localPayload, simConnect, UserData->isImperial); + generatePayload(&localPayload, UserData->isImperial); + load(&localPayload, simConnect, UserData->isImperial); + } + else { + paxPayloadData_t localPayload = {}; + memcpy(&localPayload, targetPaxPayloadData, sizeof(localPayload)); + + generatePayload(&localPayload, UserData->isImperial, UserOptions); + load(&localPayload, simConnect, UserData->isImperial); + } + + break; } } - if (GSXData->deboardingState == GSX_SERVICE_ACTIVE) { - double cargoDeboarded = GSXData->cargoDeboarded; - if (UserData->isCargo) { - fPayloadData_t localPayload = {}; - memcpy(&localPayload, targetFPayloadData, sizeof(localPayload)); + switch ((char)GSXData->deboardingState) { + case GSX_SERVICE_ACTIVE: { + // Exit if not boarded + if (GSXData->loadingState != LOADING_STATE_BOARDED) break; - localPayload.stations.upper1 -= targetFPayloadData->stations.upper1 * (cargoDeboarded / 100); - localPayload.stations.upper2 -= targetFPayloadData->stations.upper2 * (cargoDeboarded / 100); - localPayload.stations.upper3 -= targetFPayloadData->stations.upper3 * (cargoDeboarded / 100); - localPayload.stations.upper4 -= targetFPayloadData->stations.upper4 * (cargoDeboarded / 100); - localPayload.lowerForward -= targetFPayloadData->lowerForward * (cargoDeboarded / 100); - localPayload.lowerRear -= targetFPayloadData->lowerRear * (cargoDeboarded / 100); + GSXData->loadingState = LOADING_STATE_DEBOARDING; - generatePayload(&localPayload, UserData->isImperial); - load(&localPayload, simConnect, UserData->isImperial); + double cargoDeboarded = GSXData->cargoDeboarded; + if (UserData->isCargo) { + fPayloadData_t localPayload = {}; + memcpy(&localPayload, targetFPayloadData, sizeof(localPayload)); + + localPayload.stations.upper1 -= targetFPayloadData->stations.upper1 * (cargoDeboarded / 100); + localPayload.stations.upper2 -= targetFPayloadData->stations.upper2 * (cargoDeboarded / 100); + localPayload.stations.upper3 -= targetFPayloadData->stations.upper3 * (cargoDeboarded / 100); + localPayload.stations.upper4 -= targetFPayloadData->stations.upper4 * (cargoDeboarded / 100); + localPayload.lowerForward -= targetFPayloadData->lowerForward * (cargoDeboarded / 100); + localPayload.lowerRear -= targetFPayloadData->lowerRear * (cargoDeboarded / 100); + + generatePayload(&localPayload, UserData->isImperial); + load(&localPayload, simConnect, UserData->isImperial); + } + else { + double passengersDeboarded = GSXData->passengersDeboarded; + paxPayloadData_t localPayload = {}; + memcpy(&localPayload, targetPaxPayloadData, sizeof(localPayload)); + + localPayload.paxCount.business1 -= min(targetPaxPayloadData->paxCount.business1, passengersDeboarded); + passengersDeboarded -= targetPaxPayloadData->paxCount.business1 - localPayload.paxCount.business1; + localPayload.paxCount.business2 -= min(targetPaxPayloadData->paxCount.business2, passengersDeboarded); + passengersDeboarded -= targetPaxPayloadData->paxCount.business2 - localPayload.paxCount.business2; + localPayload.paxCount.economy1 -= min(targetPaxPayloadData->paxCount.economy1, passengersDeboarded); + passengersDeboarded -= targetPaxPayloadData->paxCount.economy1 - localPayload.paxCount.economy1; + localPayload.paxCount.economy2 -= min(targetPaxPayloadData->paxCount.economy2, passengersDeboarded); + passengersDeboarded -= targetPaxPayloadData->paxCount.economy2 - localPayload.paxCount.economy2; + localPayload.forwardCargo -= targetPaxPayloadData->forwardCargo * (cargoDeboarded / 100); + localPayload.rearCargo -= targetPaxPayloadData->rearCargo * (cargoDeboarded / 100); + + generatePayload(&localPayload, UserData->isImperial, UserOptions); + load(&localPayload, simConnect, UserData->isImperial); + } + + break; } - else { - double passengersDeboarded = GSXData->passengersDeboarded; - paxPayloadData_t localPayload = {}; - memcpy(&localPayload, targetPaxPayloadData, sizeof(localPayload)); + case GSX_SERVICE_FINISHED: { + // Exit if not deboarding + if (GSXData->loadingState != LOADING_STATE_DEBOARDING) break; - localPayload.paxCount.business1 -= min(targetPaxPayloadData->paxCount.business1, passengersDeboarded); - passengersDeboarded -= targetPaxPayloadData->paxCount.business1 - localPayload.paxCount.business1; - localPayload.paxCount.business2 -= min(targetPaxPayloadData->paxCount.business2, passengersDeboarded); - passengersDeboarded -= targetPaxPayloadData->paxCount.business2 - localPayload.paxCount.business2; - localPayload.paxCount.economy1 -= min(targetPaxPayloadData->paxCount.economy1, passengersDeboarded); - passengersDeboarded -= targetPaxPayloadData->paxCount.economy1 - localPayload.paxCount.economy1; - localPayload.paxCount.economy2 -= min(targetPaxPayloadData->paxCount.economy2, passengersDeboarded); - passengersDeboarded -= targetPaxPayloadData->paxCount.economy2 - localPayload.paxCount.economy2; - localPayload.forwardCargo -= targetPaxPayloadData->forwardCargo * (cargoDeboarded / 100); - localPayload.rearCargo -= targetPaxPayloadData->rearCargo * (cargoDeboarded / 100); + GSXData->loadingState = LOADING_STATE_DEBOARDED; - generatePayload(&localPayload, UserData->isImperial, UserOptions); - load(&localPayload, simConnect, UserData->isImperial); + if (UserData->isCargo) { + fPayloadData_t localPayload = {}; + memcpy(&localPayload, targetFPayloadData, sizeof(localPayload)); + + localPayload.stations.upper1 = 0; + localPayload.stations.upper2 = 0; + localPayload.stations.upper3 = 0; + localPayload.stations.upper4 = 0; + localPayload.lowerForward = 0; + localPayload.lowerRear = 0; + + generatePayload(&localPayload, UserData->isImperial); + load(&localPayload, simConnect, UserData->isImperial); + } + else { + paxPayloadData_t localPayload = {}; + memcpy(&localPayload, targetPaxPayloadData, sizeof(localPayload)); + + localPayload.paxCount.business1 = 0; + localPayload.paxCount.business2 = 0; + localPayload.paxCount.economy1 = 0; + localPayload.paxCount.economy2 = 0; + localPayload.forwardCargo = 0; + localPayload.rearCargo = 0; + + generatePayload(&localPayload, UserData->isImperial, UserOptions); + load(&localPayload, simConnect, UserData->isImperial); + } + + break; } } } diff --git a/PackageSources/wasm-module/load-manager.h b/PackageSources/wasm-module/load-manager.h index 17deae6..a2c4fa6 100644 --- a/PackageSources/wasm-module/load-manager.h +++ b/PackageSources/wasm-module/load-manager.h @@ -32,7 +32,7 @@ /******************************** Constants ********************************/ // Module identification #define MODULE_NAME "[KHOFMANN TFDi MD-11 Load Manager] " -#define VERSION_STRING "1.1" +#define VERSION_STRING "1.3" // 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/shared.h b/PackageSources/wasm-module/shared.h index ec17496..8f66d85 100644 --- a/PackageSources/wasm-module/shared.h +++ b/PackageSources/wasm-module/shared.h @@ -60,6 +60,7 @@ #define CG_TOLERANCE 0.05 // GSX States #define GSX_SERVICE_ACTIVE 5 +#define GSX_SERVICE_FINISHED 6 /********************************* Macros **********************************/ // Conversions @@ -87,6 +88,14 @@ enum DATA_REQUESTS { DATA_REQUEST_USER_DATA, }; +enum LOADING_STATES { + LOADING_STATE_IDLE, + LOADING_STATE_BOARDING, + LOADING_STATE_BOARDED, + LOADING_STATE_DEBOARDING, + LOADING_STATE_DEBOARDED, +}; + /***************************** Data structures *****************************/ typedef struct { double isCargo; @@ -95,12 +104,17 @@ typedef struct { } UserData_t; typedef struct { + // SimConnect mapped + double couatlStarted; // boolean double boardingState; // See manual, 5 => active double deboardingState; // See manual, 5 => active double passengersBoarded; // Num pax double passengersDeboarded; // Num pax double cargoBoarded; // In percent double cargoDeboarded; // In percent + + // Additional properties + enum LOADING_STATES loadingState; } GSXData_t; typedef struct { diff --git a/xkhofmann-tfdidesign-md11-load-manager.code-workspace b/xkhofmann-tfdidesign-md11-load-manager.code-workspace index ebe4802..c45450b 100644 --- a/xkhofmann-tfdidesign-md11-load-manager.code-workspace +++ b/xkhofmann-tfdidesign-md11-load-manager.code-workspace @@ -5,6 +5,15 @@ } ], "settings": { - "cSpell.words": ["deboarding", "khofmann", "tfdi", "TFDI", "TOCG", "ZFWCG"] + "cSpell.words": [ + "couatl", + "DEBOARDED", + "deboarding", + "khofmann", + "tfdi", + "TFDI", + "TOCG", + "ZFWCG" + ] } }