Allow GSX state reset

Fix KG rounding of pax
This commit is contained in:
Kilian Hofmann 2025-09-08 03:06:48 +02:00
parent d75518517a
commit 9000d516ae
8 changed files with 52 additions and 66 deletions

View File

@ -1,6 +1,6 @@
{
"name": "tfdidesign-md11-load-manager",
"version": "0.1.116",
"version": "0.1.122",
"description": "",
"main": "index.js",
"type": "module",

View File

@ -31,6 +31,7 @@ export default {
plugins: [
replace({
'process.env.NODE_ENV': `"${targetEnv}"`,
preventAssignment: true,
}),
versionInjector(),
postcss({
@ -43,7 +44,9 @@ export default {
reactSvg(),
resolve(),
json(),
typescript(),
typescript({
outputToFilesystem: false,
}),
commonjs({
requireReturnsDefault: 'auto',
}),

View File

@ -21,16 +21,12 @@ const Freighter: FC<FreighterProps> = ({ WASMData, username }) => {
const [deboardingState, setDeboardingState] = useState(1);
useEffect(() => {
console.log('GSX boarding state changed', boardingState, WASMData.GSX.boardingState);
if (WASMData.GSX.boardingState < GSX_SERVICE_CALLED) return;
setBoardingState(WASMData.GSX.boardingState);
setDeboardingState(1);
}, [WASMData.GSX.boardingState]);
useEffect(() => {
console.log('GSX deboarding state changed', deboardingState, WASMData.GSX.deboardingState);
if (WASMData.GSX.deboardingState < GSX_SERVICE_CALLED) return;
setBoardingState(1);
@ -178,7 +174,7 @@ const Freighter: FC<FreighterProps> = ({ WASMData, username }) => {
/>
)}
{((username && selectedTab === 3) || (!username && selectedTab === 2)) && (
<OptionsF WASMData={WASMData} loadingState={loadingState} />
<OptionsF WASMData={WASMData} loadingState={loadingState} gsxActive={GSXActive()} />
)}
</>
);

View File

@ -1,5 +1,4 @@
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';
@ -8,16 +7,10 @@ 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>

View File

@ -1,5 +1,4 @@
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';
@ -8,19 +7,13 @@ 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 +47,7 @@ const OptionsPax: FC<OptionsPaxProps> = ({ WASMData, loadingState }) => {
setValue={(value) => {
CoherentCallOptionsSet(value);
}}
disabled={loadingState !== 'preview' || GSXActive()}
disabled={loadingState !== 'preview' || gsxActive}
/>
</div>
</div>
@ -69,7 +62,7 @@ const OptionsPax: FC<OptionsPaxProps> = ({ WASMData, loadingState }) => {
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()}
disabled={loadingState !== 'preview' || gsxActive}
/>
</div>
</div>
@ -82,7 +75,7 @@ const OptionsPax: FC<OptionsPaxProps> = ({ WASMData, loadingState }) => {
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()}
disabled={loadingState !== 'preview' || gsxActive}
/>
</div>
</div>

View File

@ -1,4 +1,4 @@
import { FC, useEffect, useState } from 'react';
import { FC, useEffect, useMemo, useState } from 'react';
import { GSX_SERVICE_CALLED, GSX_SERVICE_FINISHED } from '../../constants';
import { LoadingState } from '../../types/general';
import { WASMDataPax } from '../../types/WASMData';
@ -21,17 +21,13 @@ const Pax: FC<PaxProps> = ({ WASMData, username }) => {
const [deboardingState, setDeboardingState] = useState(1);
useEffect(() => {
console.log('GSX boarding state changed', boardingState, WASMData.GSX.boardingState);
if (WASMData.GSX.boardingState < GSX_SERVICE_CALLED) return;
if (WASMData.GSX.boardingState > 1 && WASMData.GSX.boardingState < GSX_SERVICE_CALLED) return;
setBoardingState(WASMData.GSX.boardingState);
setDeboardingState(1);
}, [WASMData.GSX.boardingState]);
useEffect(() => {
console.log('GSX deboarding state changed', deboardingState, WASMData.GSX.deboardingState);
if (WASMData.GSX.deboardingState < GSX_SERVICE_CALLED) return;
if (WASMData.GSX.deboardingState > 1 && WASMData.GSX.deboardingState < GSX_SERVICE_CALLED) return;
setBoardingState(1);
setDeboardingState(WASMData.GSX.deboardingState);
@ -58,27 +54,27 @@ const Pax: FC<PaxProps> = ({ 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 = () => {
const GSXActive = useMemo(() => {
// Cases when active:
// BOARDING called, running or done
// DEBOARDING called, running or done
@ -87,14 +83,20 @@ const Pax: FC<PaxProps> = ({ WASMData, username }) => {
// DEBOARDING not called, disabled
// BOTH done
console.log(
'GSXActive',
(boardingState >= GSX_SERVICE_CALLED || deboardingState >= GSX_SERVICE_CALLED) &&
deboardingState !== GSX_SERVICE_FINISHED
);
return (
(boardingState >= GSX_SERVICE_CALLED || deboardingState >= GSX_SERVICE_CALLED) &&
deboardingState !== GSX_SERVICE_FINISHED
);
};
}, [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,
@ -103,7 +105,7 @@ const Pax: FC<PaxProps> = ({ WASMData, username }) => {
];
}
if (WASMData.options.GSXSync && GSXActive() && boardingState !== GSX_SERVICE_FINISHED) {
if (WASMData.options.GSXSync && GSXActive && boardingState !== GSX_SERVICE_FINISHED) {
return [
WASMData.targetPayload.ZFWCG.toFixed(1),
WASMData.targetPayload.ZFWCG < WASMData.limits.minCG || WASMData.targetPayload.ZFWCG > WASMData.limits.maxCG,
@ -129,20 +131,20 @@ const Pax: FC<PaxProps> = ({ WASMData, username }) => {
<Profile
type="PAX"
isER={WASMData.userData.isER}
upper1={`${upper1(GSXActive() ? 'loaded' : loadingState)}`}
upper1max={loadingState === 'loaded' || GSXActive() ? `${upper1('preview')}` : `${WASMData.limits.business1}`}
upper2={`${upper2(GSXActive() ? 'loaded' : loadingState)}`}
upper2max={loadingState === 'loaded' || GSXActive() ? `${upper2('preview')}` : `${WASMData.limits.business2}`}
upper3={`${upper3(GSXActive() ? 'loaded' : loadingState)}`}
upper3max={loadingState === 'loaded' || GSXActive() ? `${upper3('preview')}` : `${WASMData.limits.economy1}`}
upper4={`${upper4(GSXActive() ? 'loaded' : loadingState)}`}
upper4max={loadingState === 'loaded' || GSXActive() ? `${upper4('preview')}` : `${WASMData.limits.economy2}`}
upper1={`${upper1(GSXActive ? 'loaded' : loadingState)}`}
upper1max={loadingState === 'loaded' || GSXActive ? `${upper1('preview')}` : `${WASMData.limits.business1}`}
upper2={`${upper2(GSXActive ? 'loaded' : loadingState)}`}
upper2max={loadingState === 'loaded' || GSXActive ? `${upper2('preview')}` : `${WASMData.limits.business2}`}
upper3={`${upper3(GSXActive ? 'loaded' : loadingState)}`}
upper3max={loadingState === 'loaded' || GSXActive ? `${upper3('preview')}` : `${WASMData.limits.economy1}`}
upper4={`${upper4(GSXActive ? 'loaded' : loadingState)}`}
upper4max={loadingState === 'loaded' || GSXActive ? `${upper4('preview')}` : `${WASMData.limits.economy2}`}
lower1={`${lower1()}`}
lower2={`${lower2()}`}
OEW={`${OEW()}`}
crew={`${crew()}`}
unit={WASMData.userData.isImperial ? 'LBS' : 'KG'}
inPreview={loadingState !== 'loaded' && !GSXActive()}
inPreview={loadingState !== 'loaded' && !GSXActive}
CGs={CGs()}
done={
WASMData.options.GSXSync
@ -162,7 +164,7 @@ const Pax: FC<PaxProps> = ({ WASMData, username }) => {
WASMData={WASMData}
loadingState={loadingState}
setLoadingState={setLoadingState}
gsxActive={GSXActive()}
gsxActive={GSXActive}
/>
)}
{((username && selectedTab === 1) || (!username && selectedTab === 0)) && (
@ -170,7 +172,7 @@ const Pax: FC<PaxProps> = ({ WASMData, username }) => {
WASMData={WASMData}
loadingState={loadingState}
setLoadingState={setLoadingState}
gsxActive={GSXActive()}
gsxActive={GSXActive}
/>
)}
{((username && selectedTab === 2) || (!username && selectedTab === 1)) && (
@ -178,11 +180,11 @@ const Pax: FC<PaxProps> = ({ WASMData, username }) => {
WASMData={WASMData}
loadingState={loadingState}
setLoadingState={setLoadingState}
gsxActive={GSXActive()}
gsxActive={GSXActive}
/>
)}
{((username && selectedTab === 3) || (!username && selectedTab === 2)) && (
<OptionsPax WASMData={WASMData} loadingState={loadingState} />
<OptionsPax WASMData={WASMData} loadingState={loadingState} gsxActive={GSXActive} />
)}
</>
);

View File

@ -1,5 +1,4 @@
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';

View File

@ -721,20 +721,20 @@ void sendData () {
FROM_POUNDS(UserData->isImperial, livePaxPayloadData->cabinCrewRear),
allocator);
livePayload.AddMember("business1",
(short)(FROM_POUNDS(UserData->isImperial, livePaxPayloadData->business1Left + livePaxPayloadData->business1Center +
livePaxPayloadData->business1Right) / PAX_WEIGHT(UserData->isImperial, UserOptions)),
(short)round((livePaxPayloadData->business1Left + livePaxPayloadData->business1Center +
livePaxPayloadData->business1Right) / PAX_WEIGHT(true, UserOptions)),
allocator);
livePayload.AddMember("business2",
(short)(FROM_POUNDS(UserData->isImperial, livePaxPayloadData->business2Left + livePaxPayloadData->business2Center +
livePaxPayloadData->business2Right) / PAX_WEIGHT(UserData->isImperial, UserOptions)),
(short)round((livePaxPayloadData->business2Left + livePaxPayloadData->business2Center +
livePaxPayloadData->business2Right) / PAX_WEIGHT(true, UserOptions)),
allocator);
livePayload.AddMember("economy1",
(short)(FROM_POUNDS(UserData->isImperial, livePaxPayloadData->economy1Left + livePaxPayloadData->economy1Center +
livePaxPayloadData->economy1Right) / PAX_WEIGHT(UserData->isImperial, UserOptions)),
(short)round((livePaxPayloadData->economy1Left + livePaxPayloadData->economy1Center +
livePaxPayloadData->economy1Right) / PAX_WEIGHT(true, UserOptions)),
allocator);
livePayload.AddMember("economy2",
(short)(FROM_POUNDS(UserData->isImperial, livePaxPayloadData->economy2Left + livePaxPayloadData->economy2Center +
livePaxPayloadData->economy2Right) / PAX_WEIGHT(UserData->isImperial, UserOptions)),
(short)round((livePaxPayloadData->economy2Left + livePaxPayloadData->economy2Center +
livePaxPayloadData->economy2Right) / PAX_WEIGHT(true, UserOptions)),
allocator);
livePayload.AddMember("forwardCargo", FROM_POUNDS(UserData->isImperial, livePaxPayloadData->forwardCargo), allocator);
livePayload.AddMember("rearCargo", FROM_POUNDS(UserData->isImperial, livePaxPayloadData->rearCargo), allocator);