GSX Synced boarding/deboarding
This commit is contained in:
parent
f7304c5c7b
commit
c394cd4d7b
@ -1,6 +1,11 @@
|
|||||||
import { FC, useEffect, useRef, useState } from 'react';
|
import { FC, useEffect, useRef, useState } from 'react';
|
||||||
import { unloadAircraft } from '../../configs/shared';
|
import { unloadAircraft } from '../../configs/shared';
|
||||||
import { COHERENT_COMBUS_WASM_CALL, COMM_BUS_UPDATE_TARGET_EVENT } from '../../constants';
|
import {
|
||||||
|
COHERENT_COMBUS_WASM_CALL,
|
||||||
|
COMM_BUS_UPDATE_TARGET_EVENT,
|
||||||
|
GSX_SERVICE_CALLED,
|
||||||
|
GSX_SERVICE_FINISHED,
|
||||||
|
} from '../../constants';
|
||||||
import { WASMDataPax } from '../../types/WASMData';
|
import { WASMDataPax } from '../../types/WASMData';
|
||||||
import { LoadingState } from '../../types/general';
|
import { LoadingState } from '../../types/general';
|
||||||
import { ImportFlightPlan } from '../../utils/TFDISBImport';
|
import { ImportFlightPlan } from '../../utils/TFDISBImport';
|
||||||
@ -40,6 +45,13 @@ const SBEntryPax: FC<SBEntryProps> = ({ WASMData, loadingState, username, setLoa
|
|||||||
return GW() <= WASMData.limits.maxTOW;
|
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) => {
|
const handleInput = (input: string, maxValue: number, setter: (value: number) => void) => {
|
||||||
if (!input) {
|
if (!input) {
|
||||||
setter(0);
|
setter(0);
|
||||||
@ -116,7 +128,7 @@ const SBEntryPax: FC<SBEntryProps> = ({ WASMData, loadingState, username, setLoa
|
|||||||
className={`w-1/2 rounded-lg border border-white bg-zinc-700 px-3 py-2 text-right`}
|
className={`w-1/2 rounded-lg border border-white bg-zinc-700 px-3 py-2 text-right`}
|
||||||
value={fuel}
|
value={fuel}
|
||||||
onChange={(e) => handleInput(e.target.value, WASMData.limits.maxFuel, setFuel)}
|
onChange={(e) => handleInput(e.target.value, WASMData.limits.maxFuel, setFuel)}
|
||||||
disabled={loadingState !== 'preview'}
|
disabled={loadingState !== 'preview' || GSXActive()}
|
||||||
/>
|
/>
|
||||||
<button
|
<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"
|
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"
|
||||||
@ -130,7 +142,7 @@ const SBEntryPax: FC<SBEntryProps> = ({ WASMData, loadingState, username, setLoa
|
|||||||
SimVar.SetSimVarValue('L:MD11_EFB_READ_READY', 'bool', true);
|
SimVar.SetSimVarValue('L:MD11_EFB_READ_READY', 'bool', true);
|
||||||
setFuelEnabled(false);
|
setFuelEnabled(false);
|
||||||
}}
|
}}
|
||||||
disabled={loadingState !== 'preview' || !fuelEnabled}
|
disabled={loadingState !== 'preview' || !fuelEnabled || GSXActive()}
|
||||||
>
|
>
|
||||||
Load Fuel
|
Load Fuel
|
||||||
</button>
|
</button>
|
||||||
@ -166,7 +178,7 @@ const SBEntryPax: FC<SBEntryProps> = ({ WASMData, loadingState, username, setLoa
|
|||||||
minCG={WASMData.limits.minCG}
|
minCG={WASMData.limits.minCG}
|
||||||
maxCG={WASMData.limits.maxCG}
|
maxCG={WASMData.limits.maxCG}
|
||||||
value={CGTarget}
|
value={CGTarget}
|
||||||
disabled={loadingState !== 'preview'}
|
disabled={loadingState !== 'preview' || GSXActive()}
|
||||||
increase={() =>
|
increase={() =>
|
||||||
setCGTarget((prev) => {
|
setCGTarget((prev) => {
|
||||||
const _new = prev + 0.1;
|
const _new = prev + 0.1;
|
||||||
@ -215,6 +227,8 @@ const SBEntryPax: FC<SBEntryProps> = ({ WASMData, loadingState, username, setLoa
|
|||||||
<ActionBar
|
<ActionBar
|
||||||
loadingState={loadingState}
|
loadingState={loadingState}
|
||||||
loadDisabled={!GWValid() || SBInFlight}
|
loadDisabled={!GWValid() || SBInFlight}
|
||||||
|
GSXSync={WASMData.options.GSXSync}
|
||||||
|
GSXActive={GSXActive()}
|
||||||
importSB={handleSB}
|
importSB={handleSB}
|
||||||
load={() => {
|
load={() => {
|
||||||
setLoadingState('loaded');
|
setLoadingState('loaded');
|
||||||
|
|||||||
@ -4,16 +4,17 @@ import { LoadingState } from '../../types/general';
|
|||||||
interface ActionBarProps {
|
interface ActionBarProps {
|
||||||
loadingState: LoadingState;
|
loadingState: LoadingState;
|
||||||
loadDisabled: boolean;
|
loadDisabled: boolean;
|
||||||
|
GSXSync: boolean;
|
||||||
|
GSXActive: boolean;
|
||||||
importSB?: () => void;
|
importSB?: () => void;
|
||||||
load: () => void;
|
load: () => void;
|
||||||
unload: () => void;
|
unload: () => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
const ActionBar: FC<ActionBarProps> = ({ loadingState, loadDisabled, importSB, load, unload }) => {
|
const ActionBar: FC<ActionBarProps> = ({ loadingState, loadDisabled, GSXSync, GSXActive, importSB, load, unload }) => {
|
||||||
return (
|
return (
|
||||||
<div className="relative flex w-full items-center justify-start gap-x-6">
|
<div className="relative flex w-full items-center justify-start gap-x-6">
|
||||||
{/*TODO: HIDE FOR GSX SYNCED */}
|
{loadingState === 'preview' && !GSXSync && (
|
||||||
{loadingState === 'preview' && (
|
|
||||||
<button
|
<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"
|
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"
|
data-ripple-light="true"
|
||||||
@ -23,8 +24,7 @@ const ActionBar: FC<ActionBarProps> = ({ loadingState, loadDisabled, importSB, l
|
|||||||
Load
|
Load
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
{/*TODO: HIDE FOR GSX SYNCED */}
|
{loadingState === 'loaded' && !GSXSync && (
|
||||||
{loadingState === 'loaded' && (
|
|
||||||
<button
|
<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"
|
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"
|
data-ripple-light="true"
|
||||||
@ -41,6 +41,7 @@ const ActionBar: FC<ActionBarProps> = ({ loadingState, loadDisabled, importSB, l
|
|||||||
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"
|
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"
|
data-ripple-light="true"
|
||||||
onClick={importSB}
|
onClick={importSB}
|
||||||
|
disabled={GSXActive}
|
||||||
>
|
>
|
||||||
Import from SimBrief
|
Import from SimBrief
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
import { FC, useState } from 'react';
|
import { FC, useState } from 'react';
|
||||||
import { loadAircraft } from '../../configs/shared';
|
import { loadAircraft } from '../../configs/shared';
|
||||||
|
import { GSX_SERVICE_CALLED, GSX_SERVICE_FINISHED } from '../../constants';
|
||||||
import { LoadingState } from '../../types/general';
|
import { LoadingState } from '../../types/general';
|
||||||
import { WASMDataPax } from '../../types/WASMData';
|
import { WASMDataPax } from '../../types/WASMData';
|
||||||
import Profile from '../profile/Profile';
|
import Profile from '../profile/Profile';
|
||||||
@ -38,28 +39,35 @@ const Pax: FC<PaxProps> = ({ WASMData, username }) => {
|
|||||||
return WASMData.livePayload.economy2;
|
return WASMData.livePayload.economy2;
|
||||||
};
|
};
|
||||||
const lower1 = () => {
|
const lower1 = () => {
|
||||||
if (loadingState !== 'loaded') return Math.round(WASMData.targetPayload.forwardCargo);
|
if (loadingState !== 'loaded' && !GSXActive()) return Math.round(WASMData.targetPayload.forwardCargo);
|
||||||
|
|
||||||
return Math.round(WASMData.livePayload.forwardCargo);
|
return Math.round(WASMData.livePayload.forwardCargo);
|
||||||
};
|
};
|
||||||
const lower2 = () => {
|
const lower2 = () => {
|
||||||
if (loadingState !== 'loaded') return Math.round(WASMData.targetPayload.rearCargo);
|
if (loadingState !== 'loaded' && !GSXActive()) return Math.round(WASMData.targetPayload.rearCargo);
|
||||||
|
|
||||||
return Math.round(WASMData.livePayload.rearCargo);
|
return Math.round(WASMData.livePayload.rearCargo);
|
||||||
};
|
};
|
||||||
const OEW = () => {
|
const OEW = () => {
|
||||||
if (loadingState !== 'loaded') return Math.round(WASMData.targetPayload.empty);
|
if (loadingState !== 'loaded' && !GSXActive()) return Math.round(WASMData.targetPayload.empty);
|
||||||
|
|
||||||
return Math.round(WASMData.livePayload.empty);
|
return Math.round(WASMData.livePayload.empty);
|
||||||
};
|
};
|
||||||
const crew = () => {
|
const crew = () => {
|
||||||
if (loadingState !== 'loaded') return Math.round(WASMData.targetPayload.crew);
|
if (loadingState !== 'loaded' && !GSXActive()) return Math.round(WASMData.targetPayload.crew);
|
||||||
|
|
||||||
return Math.round(WASMData.livePayload.crew);
|
return Math.round(WASMData.livePayload.crew);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const GSXActive = () => {
|
||||||
|
return (
|
||||||
|
(WASMData.GSX.boardingState >= GSX_SERVICE_CALLED || WASMData.GSX.deboardingState >= GSX_SERVICE_CALLED) &&
|
||||||
|
WASMData.GSX.deboardingState !== GSX_SERVICE_FINISHED
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
const CGs = (): [string, boolean, string, boolean] => {
|
const CGs = (): [string, boolean, string, boolean] => {
|
||||||
if (loadingState !== 'loaded') {
|
if (loadingState !== 'loaded' && !GSXActive()) {
|
||||||
return [
|
return [
|
||||||
WASMData.targetPayload.ZFWCG.toFixed(1),
|
WASMData.targetPayload.ZFWCG.toFixed(1),
|
||||||
WASMData.targetPayload.ZFWCG < WASMData.limits.minCG || WASMData.targetPayload.ZFWCG > WASMData.limits.maxCG,
|
WASMData.targetPayload.ZFWCG < WASMData.limits.minCG || WASMData.targetPayload.ZFWCG > WASMData.limits.maxCG,
|
||||||
@ -81,20 +89,20 @@ const Pax: FC<PaxProps> = ({ WASMData, username }) => {
|
|||||||
<Profile
|
<Profile
|
||||||
type="PAX"
|
type="PAX"
|
||||||
isER={WASMData.userData.isER}
|
isER={WASMData.userData.isER}
|
||||||
upper1={`${upper1()}`}
|
upper1={`${upper1(GSXActive() ? 'loaded' : loadingState)}`}
|
||||||
upper1max={loadingState === 'loaded' ? `${upper1('preview')}` : `${WASMData.limits.business1}`}
|
upper1max={loadingState === 'loaded' || GSXActive() ? `${upper1('preview')}` : `${WASMData.limits.business1}`}
|
||||||
upper2={`${upper2()}`}
|
upper2={`${upper2(GSXActive() ? 'loaded' : loadingState)}`}
|
||||||
upper2max={loadingState === 'loaded' ? `${upper2('preview')}` : `${WASMData.limits.business2}`}
|
upper2max={loadingState === 'loaded' || GSXActive() ? `${upper2('preview')}` : `${WASMData.limits.business2}`}
|
||||||
upper3={`${upper3()}`}
|
upper3={`${upper3(GSXActive() ? 'loaded' : loadingState)}`}
|
||||||
upper3max={loadingState === 'loaded' ? `${upper3('preview')}` : `${WASMData.limits.economy1}`}
|
upper3max={loadingState === 'loaded' || GSXActive() ? `${upper3('preview')}` : `${WASMData.limits.economy1}`}
|
||||||
upper4={`${upper4()}`}
|
upper4={`${upper4(GSXActive() ? 'loaded' : loadingState)}`}
|
||||||
upper4max={loadingState === 'loaded' ? `${upper4('preview')}` : `${WASMData.limits.economy2}`}
|
upper4max={loadingState === 'loaded' || GSXActive() ? `${upper4('preview')}` : `${WASMData.limits.economy2}`}
|
||||||
lower1={`${lower1()}`}
|
lower1={`${lower1()}`}
|
||||||
lower2={`${lower2()}`}
|
lower2={`${lower2()}`}
|
||||||
OEW={`${OEW()}`}
|
OEW={`${OEW()}`}
|
||||||
crew={`${crew()}`}
|
crew={`${crew()}`}
|
||||||
unit={WASMData.userData.isImperial ? 'LBS' : 'KG'}
|
unit={WASMData.userData.isImperial ? 'LBS' : 'KG'}
|
||||||
inPreview={loadingState !== 'loaded'}
|
inPreview={loadingState !== 'loaded' && !GSXActive()}
|
||||||
CGs={CGs()}
|
CGs={CGs()}
|
||||||
/>
|
/>
|
||||||
<Tabbar
|
<Tabbar
|
||||||
|
|||||||
@ -1,6 +1,11 @@
|
|||||||
import { FC, useEffect, useState } from 'react';
|
import { FC, useEffect, useState } from 'react';
|
||||||
import { unloadAircraft } from '../../configs/shared';
|
import { unloadAircraft } from '../../configs/shared';
|
||||||
import { COHERENT_COMBUS_WASM_CALL, COMM_BUS_UPDATE_TARGET_EVENT } from '../../constants';
|
import {
|
||||||
|
COHERENT_COMBUS_WASM_CALL,
|
||||||
|
COMM_BUS_UPDATE_TARGET_EVENT,
|
||||||
|
GSX_SERVICE_CALLED,
|
||||||
|
GSX_SERVICE_FINISHED,
|
||||||
|
} from '../../constants';
|
||||||
import { LoadingState } from '../../types/general';
|
import { LoadingState } from '../../types/general';
|
||||||
import { WASMDataPax } from '../../types/WASMData';
|
import { WASMDataPax } from '../../types/WASMData';
|
||||||
import ActionBar from '../actionbar/ActionBar';
|
import ActionBar from '../actionbar/ActionBar';
|
||||||
@ -37,6 +42,13 @@ const StationEntryPax: FC<StationEntryProps> = ({ WASMData, loadingState, setLoa
|
|||||||
return GW() <= WASMData.limits.maxTOW;
|
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) => {
|
const handleInput = (input: string, maxValue: number, setter: (value: number) => void) => {
|
||||||
if (!input) {
|
if (!input) {
|
||||||
setter(0);
|
setter(0);
|
||||||
@ -91,7 +103,7 @@ const StationEntryPax: FC<StationEntryProps> = ({ WASMData, loadingState, setLoa
|
|||||||
className={`w-1/2 rounded-lg border border-white bg-zinc-700 px-3 py-2 text-right`}
|
className={`w-1/2 rounded-lg border border-white bg-zinc-700 px-3 py-2 text-right`}
|
||||||
value={fuel}
|
value={fuel}
|
||||||
onChange={(e) => handleInput(e.target.value, WASMData.limits.maxFuel, setFuel)}
|
onChange={(e) => handleInput(e.target.value, WASMData.limits.maxFuel, setFuel)}
|
||||||
disabled={loadingState !== 'preview'}
|
disabled={loadingState !== 'preview' || GSXActive()}
|
||||||
/>
|
/>
|
||||||
<button
|
<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"
|
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"
|
||||||
@ -105,7 +117,7 @@ const StationEntryPax: FC<StationEntryProps> = ({ WASMData, loadingState, setLoa
|
|||||||
SimVar.SetSimVarValue('L:MD11_EFB_READ_READY', 'bool', true);
|
SimVar.SetSimVarValue('L:MD11_EFB_READ_READY', 'bool', true);
|
||||||
setFuelEnabled(false);
|
setFuelEnabled(false);
|
||||||
}}
|
}}
|
||||||
disabled={loadingState !== 'preview' || !fuelEnabled}
|
disabled={loadingState !== 'preview' || !fuelEnabled || GSXActive()}
|
||||||
>
|
>
|
||||||
Load Fuel
|
Load Fuel
|
||||||
</button>
|
</button>
|
||||||
@ -121,7 +133,7 @@ const StationEntryPax: FC<StationEntryProps> = ({ WASMData, loadingState, setLoa
|
|||||||
className="w-1/2 rounded-lg border border-white bg-zinc-700 px-3 py-2 text-right focus:border-blue-600 focus:ring-blue-600"
|
className="w-1/2 rounded-lg border border-white bg-zinc-700 px-3 py-2 text-right focus:border-blue-600 focus:ring-blue-600"
|
||||||
value={business1}
|
value={business1}
|
||||||
onChange={(e) => handleInput(e.target.value, WASMData.limits.business1, setBusiness1)}
|
onChange={(e) => handleInput(e.target.value, WASMData.limits.business1, setBusiness1)}
|
||||||
disabled={loadingState !== 'preview'}
|
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="relative flex w-full items-center justify-between bg-zinc-700 p-2 px-4">
|
||||||
@ -132,7 +144,7 @@ const StationEntryPax: FC<StationEntryProps> = ({ WASMData, loadingState, setLoa
|
|||||||
className="w-1/2 rounded-lg border border-white bg-zinc-700 px-3 py-2 text-right focus:border-blue-600 focus:ring-blue-600"
|
className="w-1/2 rounded-lg border border-white bg-zinc-700 px-3 py-2 text-right focus:border-blue-600 focus:ring-blue-600"
|
||||||
value={business2}
|
value={business2}
|
||||||
onChange={(e) => handleInput(e.target.value, WASMData.limits.business2, setBusiness2)}
|
onChange={(e) => handleInput(e.target.value, WASMData.limits.business2, setBusiness2)}
|
||||||
disabled={loadingState !== 'preview'}
|
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="relative flex w-full items-center justify-between bg-zinc-600 p-2 px-4">
|
||||||
@ -143,7 +155,7 @@ const StationEntryPax: FC<StationEntryProps> = ({ WASMData, loadingState, setLoa
|
|||||||
className="w-1/2 rounded-lg border border-white bg-zinc-700 px-3 py-2 text-right focus:border-blue-600 focus:ring-blue-600"
|
className="w-1/2 rounded-lg border border-white bg-zinc-700 px-3 py-2 text-right focus:border-blue-600 focus:ring-blue-600"
|
||||||
value={economy1}
|
value={economy1}
|
||||||
onChange={(e) => handleInput(e.target.value, WASMData.limits.economy1, setEconomy1)}
|
onChange={(e) => handleInput(e.target.value, WASMData.limits.economy1, setEconomy1)}
|
||||||
disabled={loadingState !== 'preview'}
|
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="relative flex w-full items-center justify-between bg-zinc-700 p-2 px-4">
|
||||||
@ -154,7 +166,7 @@ const StationEntryPax: FC<StationEntryProps> = ({ WASMData, loadingState, setLoa
|
|||||||
className="w-1/2 rounded-lg border border-white bg-zinc-700 px-3 py-2 text-right focus:border-blue-600 focus:ring-blue-600"
|
className="w-1/2 rounded-lg border border-white bg-zinc-700 px-3 py-2 text-right focus:border-blue-600 focus:ring-blue-600"
|
||||||
value={economy2}
|
value={economy2}
|
||||||
onChange={(e) => handleInput(e.target.value, WASMData.limits.economy2, setEconomy2)}
|
onChange={(e) => handleInput(e.target.value, WASMData.limits.economy2, setEconomy2)}
|
||||||
disabled={loadingState !== 'preview'}
|
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="relative flex w-full items-center justify-between bg-zinc-600 p-2 px-4">
|
||||||
@ -165,7 +177,7 @@ const StationEntryPax: FC<StationEntryProps> = ({ WASMData, loadingState, setLoa
|
|||||||
className="w-1/2 rounded-lg border border-white bg-zinc-700 px-3 py-2 text-right focus:border-blue-600 focus:ring-blue-600"
|
className="w-1/2 rounded-lg border border-white bg-zinc-700 px-3 py-2 text-right focus:border-blue-600 focus:ring-blue-600"
|
||||||
value={forwardCargo}
|
value={forwardCargo}
|
||||||
onChange={(e) => handleInput(e.target.value, WASMData.limits.forwardCargo, setForwardCargo)}
|
onChange={(e) => handleInput(e.target.value, WASMData.limits.forwardCargo, setForwardCargo)}
|
||||||
disabled={loadingState !== 'preview'}
|
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="relative flex w-full items-center justify-between rounded-b-md bg-zinc-700 p-2 px-4">
|
||||||
@ -176,7 +188,7 @@ const StationEntryPax: FC<StationEntryProps> = ({ WASMData, loadingState, setLoa
|
|||||||
className="w-1/2 rounded-lg border border-white bg-zinc-700 px-3 py-2 text-right focus:border-blue-600 focus:ring-blue-600"
|
className="w-1/2 rounded-lg border border-white bg-zinc-700 px-3 py-2 text-right focus:border-blue-600 focus:ring-blue-600"
|
||||||
value={rearCargo}
|
value={rearCargo}
|
||||||
onChange={(e) => handleInput(e.target.value, WASMData.limits.rearCargo, setRearCargo)}
|
onChange={(e) => handleInput(e.target.value, WASMData.limits.rearCargo, setRearCargo)}
|
||||||
disabled={loadingState !== 'preview'}
|
disabled={loadingState !== 'preview' || GSXActive()}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -211,6 +223,8 @@ const StationEntryPax: FC<StationEntryProps> = ({ WASMData, loadingState, setLoa
|
|||||||
<ActionBar
|
<ActionBar
|
||||||
loadingState={loadingState}
|
loadingState={loadingState}
|
||||||
loadDisabled={!ZFWValid() || !GWValid()}
|
loadDisabled={!ZFWValid() || !GWValid()}
|
||||||
|
GSXSync={WASMData.options.GSXSync}
|
||||||
|
GSXActive={GSXActive()}
|
||||||
load={() => {
|
load={() => {
|
||||||
setLoadingState('loaded');
|
setLoadingState('loaded');
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,11 @@
|
|||||||
import { FC, useEffect, useState } from 'react';
|
import { FC, useEffect, useState } from 'react';
|
||||||
import { unloadAircraft } from '../../configs/shared';
|
import { unloadAircraft } from '../../configs/shared';
|
||||||
import { COHERENT_COMBUS_WASM_CALL, COMM_BUS_UPDATE_TARGET_EVENT } from '../../constants';
|
import {
|
||||||
|
COHERENT_COMBUS_WASM_CALL,
|
||||||
|
COMM_BUS_UPDATE_TARGET_EVENT,
|
||||||
|
GSX_SERVICE_CALLED,
|
||||||
|
GSX_SERVICE_FINISHED,
|
||||||
|
} from '../../constants';
|
||||||
import { WASMDataPax } from '../../types/WASMData';
|
import { WASMDataPax } from '../../types/WASMData';
|
||||||
import { LoadingState } from '../../types/general';
|
import { LoadingState } from '../../types/general';
|
||||||
import CGSelect from '../CGSelect/CGSelect';
|
import CGSelect from '../CGSelect/CGSelect';
|
||||||
@ -34,6 +39,13 @@ const ZFWEntryPax: FC<ZFWEntryProps> = ({ WASMData, loadingState, setLoadingStat
|
|||||||
return GW() <= WASMData.limits.maxTOW;
|
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) => {
|
const handleInput = (input: string, maxValue: number, setter: (value: number) => void) => {
|
||||||
if (!input) {
|
if (!input) {
|
||||||
setter(0);
|
setter(0);
|
||||||
@ -110,7 +122,7 @@ const ZFWEntryPax: FC<ZFWEntryProps> = ({ WASMData, loadingState, setLoadingStat
|
|||||||
className={`w-1/2 rounded-lg border border-white bg-zinc-700 px-3 py-2 text-right`}
|
className={`w-1/2 rounded-lg border border-white bg-zinc-700 px-3 py-2 text-right`}
|
||||||
value={fuel}
|
value={fuel}
|
||||||
onChange={(e) => handleInput(e.target.value, WASMData.limits.maxFuel, setFuel)}
|
onChange={(e) => handleInput(e.target.value, WASMData.limits.maxFuel, setFuel)}
|
||||||
disabled={loadingState !== 'preview'}
|
disabled={loadingState !== 'preview' || GSXActive()}
|
||||||
/>
|
/>
|
||||||
<button
|
<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"
|
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"
|
||||||
@ -124,7 +136,7 @@ const ZFWEntryPax: FC<ZFWEntryProps> = ({ WASMData, loadingState, setLoadingStat
|
|||||||
SimVar.SetSimVarValue('L:MD11_EFB_READ_READY', 'bool', true);
|
SimVar.SetSimVarValue('L:MD11_EFB_READ_READY', 'bool', true);
|
||||||
setFuelEnabled(false);
|
setFuelEnabled(false);
|
||||||
}}
|
}}
|
||||||
disabled={loadingState !== 'preview' || !fuelEnabled}
|
disabled={loadingState !== 'preview' || !fuelEnabled || GSXActive()}
|
||||||
>
|
>
|
||||||
Load Fuel
|
Load Fuel
|
||||||
</button>
|
</button>
|
||||||
@ -141,7 +153,7 @@ const ZFWEntryPax: FC<ZFWEntryProps> = ({ WASMData, loadingState, setLoadingStat
|
|||||||
value={ZFWTarget}
|
value={ZFWTarget}
|
||||||
onChange={(e) => handleInputZFW(e.target.value)}
|
onChange={(e) => handleInputZFW(e.target.value)}
|
||||||
onBlur={(e) => handleBlur(e.target.value)}
|
onBlur={(e) => handleBlur(e.target.value)}
|
||||||
disabled={loadingState !== 'preview'}
|
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="relative flex w-full items-center justify-between rounded-b-md bg-zinc-700 p-2 px-4">
|
||||||
@ -152,7 +164,7 @@ const ZFWEntryPax: FC<ZFWEntryProps> = ({ WASMData, loadingState, setLoadingStat
|
|||||||
minCG={WASMData.limits.minCG}
|
minCG={WASMData.limits.minCG}
|
||||||
maxCG={WASMData.limits.maxCG}
|
maxCG={WASMData.limits.maxCG}
|
||||||
value={CGTarget}
|
value={CGTarget}
|
||||||
disabled={loadingState !== 'preview'}
|
disabled={loadingState !== 'preview' || GSXActive()}
|
||||||
increase={() =>
|
increase={() =>
|
||||||
setCGTarget((prev) => {
|
setCGTarget((prev) => {
|
||||||
const _new = prev + 0.1;
|
const _new = prev + 0.1;
|
||||||
@ -201,6 +213,8 @@ const ZFWEntryPax: FC<ZFWEntryProps> = ({ WASMData, loadingState, setLoadingStat
|
|||||||
<ActionBar
|
<ActionBar
|
||||||
loadingState={loadingState}
|
loadingState={loadingState}
|
||||||
loadDisabled={!GWValid()}
|
loadDisabled={!GWValid()}
|
||||||
|
GSXSync={WASMData.options.GSXSync}
|
||||||
|
GSXActive={GSXActive()}
|
||||||
load={() => {
|
load={() => {
|
||||||
setLoadingState('loaded');
|
setLoadingState('loaded');
|
||||||
|
|
||||||
|
|||||||
@ -7,3 +7,7 @@ export const COMM_BUS_LIVE_DATA_EVENT = 'khofmann_tfdi_md-11_load_manager_live_d
|
|||||||
export const COMM_BUS_UPDATE_TARGET_EVENT = 'khofmann_tfdi_md-11_load_manager_update_target';
|
export const COMM_BUS_UPDATE_TARGET_EVENT = 'khofmann_tfdi_md-11_load_manager_update_target';
|
||||||
|
|
||||||
export const CG_ADJUST = 0.05;
|
export const CG_ADJUST = 0.05;
|
||||||
|
|
||||||
|
export const GSX_SERVICE_CALLED = 4;
|
||||||
|
export const GSX_SERVICE_ACTIVE = 5;
|
||||||
|
export const GSX_SERVICE_FINISHED = 6;
|
||||||
|
|||||||
11
PackageSources/js-bundle/src/types/WASMData.d.ts
vendored
11
PackageSources/js-bundle/src/types/WASMData.d.ts
vendored
@ -4,6 +4,7 @@ export interface WASMDataPax {
|
|||||||
GSX: GSX;
|
GSX: GSX;
|
||||||
userData: UserData;
|
userData: UserData;
|
||||||
limits: LimitsPax;
|
limits: LimitsPax;
|
||||||
|
options: Options;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface TargetPayload {
|
interface TargetPayload {
|
||||||
@ -46,10 +47,6 @@ interface LivePayloadF extends TargetPayloadF {
|
|||||||
interface GSX {
|
interface GSX {
|
||||||
boardingState: number;
|
boardingState: number;
|
||||||
deboardingState: number;
|
deboardingState: number;
|
||||||
passengersBoarded: number;
|
|
||||||
passengersDeboarded: number;
|
|
||||||
cargoBoarded: number;
|
|
||||||
cargoDeboarded: number;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
interface Limits {
|
interface Limits {
|
||||||
@ -84,3 +81,9 @@ interface UserData {
|
|||||||
isER: boolean;
|
isER: boolean;
|
||||||
isImperial: boolean;
|
isImperial: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface Options {
|
||||||
|
GSXSync: boolean;
|
||||||
|
paxWeight: number;
|
||||||
|
bagWeight: number;
|
||||||
|
}
|
||||||
|
|||||||
@ -10,6 +10,7 @@ paxPayloadData_t* targetPaxPayloadData;
|
|||||||
fPayloadData_t* liveFPayloadData;
|
fPayloadData_t* liveFPayloadData;
|
||||||
fPayloadData_t* targetFPayloadData;
|
fPayloadData_t* targetFPayloadData;
|
||||||
FuelData_t* liveFuelData;
|
FuelData_t* liveFuelData;
|
||||||
|
UserOptions_t* UserOptions;
|
||||||
|
|
||||||
// Operational
|
// Operational
|
||||||
bool commBusCallbackRegistered;
|
bool commBusCallbackRegistered;
|
||||||
@ -34,6 +35,7 @@ extern "C" MSFS_CALLBACK void module_init(void) {
|
|||||||
liveFPayloadData = new fPayloadData_t();
|
liveFPayloadData = new fPayloadData_t();
|
||||||
targetFPayloadData = new fPayloadData_t();
|
targetFPayloadData = new fPayloadData_t();
|
||||||
liveFuelData = new FuelData_t();
|
liveFuelData = new FuelData_t();
|
||||||
|
UserOptions = new UserOptions_t();
|
||||||
|
|
||||||
targetFPayloadData->CGTarget = targetPaxPayloadData->CGTarget = 21;
|
targetFPayloadData->CGTarget = targetPaxPayloadData->CGTarget = 21;
|
||||||
|
|
||||||
@ -392,6 +394,26 @@ extern "C" MSFS_CALLBACK void module_init(void) {
|
|||||||
log(stdout, MODULE_NAME"CommBus registered.\n");
|
log(stdout, MODULE_NAME"CommBus registered.\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Options
|
||||||
|
FILE* optionsFile = fopen("\\work\\options.json", "rb");
|
||||||
|
if (optionsFile != NULL) {
|
||||||
|
char readBuffer[256];
|
||||||
|
rapidjson::FileReadStream is(optionsFile, readBuffer, sizeof(readBuffer));
|
||||||
|
rapidjson::Document optionsDoc;
|
||||||
|
optionsDoc.ParseStream(is);
|
||||||
|
if (optionsDoc.HasMember("GSXSync")) UserOptions->GSXSync = optionsDoc["GSXSync"].GetBool();
|
||||||
|
if (optionsDoc.HasMember("paxWeightKG")) UserOptions->paxWeightKG = optionsDoc["paxWeightKG"].GetDouble();
|
||||||
|
if (optionsDoc.HasMember("bagWeightKG")) UserOptions->bagWeightKG = optionsDoc["bagWeightKG"].GetDouble();
|
||||||
|
if (optionsDoc.HasMember("paxWeightLBS")) UserOptions->paxWeightLBS = optionsDoc["paxWeightLBS"].GetDouble();
|
||||||
|
if (optionsDoc.HasMember("bagWeightLBS")) UserOptions->bagWeightLBS = optionsDoc["bagWeightLBS"].GetDouble();
|
||||||
|
fclose(optionsFile);
|
||||||
|
|
||||||
|
log(stdout, MODULE_NAME"Options loaded.\n");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
log(stdout, MODULE_NAME"Options file not present, skip.\n");
|
||||||
|
}
|
||||||
|
|
||||||
log(stdout, MODULE_NAME"Initialized.\n");
|
log(stdout, MODULE_NAME"Initialized.\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -403,6 +425,8 @@ extern "C" MSFS_CALLBACK void module_deinit(void) {
|
|||||||
log(stderr, MODULE_NAME"Failed to close SimConnect.\n");
|
log(stderr, MODULE_NAME"Failed to close SimConnect.\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log(stdout, MODULE_NAME"SimConnect closed.\n");
|
||||||
|
|
||||||
delete UserData;
|
delete UserData;
|
||||||
delete GSXData;
|
delete GSXData;
|
||||||
delete livePaxPayloadData;
|
delete livePaxPayloadData;
|
||||||
@ -411,7 +435,36 @@ extern "C" MSFS_CALLBACK void module_deinit(void) {
|
|||||||
delete targetFPayloadData;
|
delete targetFPayloadData;
|
||||||
delete liveFuelData;
|
delete liveFuelData;
|
||||||
|
|
||||||
|
log(stdout, MODULE_NAME"Global memory released.\n");
|
||||||
|
|
||||||
fsCommBusUnregister(COMM_BUS_UPDATE_TARGET_EVENT, commBusUpdateTargetCallback);
|
fsCommBusUnregister(COMM_BUS_UPDATE_TARGET_EVENT, commBusUpdateTargetCallback);
|
||||||
|
|
||||||
|
log(stdout, MODULE_NAME"CommBus unregistered.\n");
|
||||||
|
|
||||||
|
// Options
|
||||||
|
rapidjson::Document optionsDoc;
|
||||||
|
rapidjson::Document::AllocatorType& allocator = optionsDoc.GetAllocator();
|
||||||
|
optionsDoc.SetObject();
|
||||||
|
optionsDoc.AddMember("GSXSync", UserOptions->GSXSync, allocator);
|
||||||
|
optionsDoc.AddMember("paxWeightKG", UserOptions->paxWeightKG, allocator);
|
||||||
|
optionsDoc.AddMember("bagWeightKG", UserOptions->bagWeightKG, allocator);
|
||||||
|
optionsDoc.AddMember("paxWeightLBS", UserOptions->paxWeightLBS, allocator);
|
||||||
|
optionsDoc.AddMember("bagWeightLBS", UserOptions->bagWeightLBS, allocator);
|
||||||
|
FILE* optionsFile = fopen("\\work\\options.json", "wb");
|
||||||
|
if (optionsFile != NULL) {
|
||||||
|
char writeBuffer[256];
|
||||||
|
rapidjson::FileWriteStream os(optionsFile, writeBuffer, sizeof(writeBuffer));
|
||||||
|
rapidjson::Writer<rapidjson::FileWriteStream> writer(os);
|
||||||
|
optionsDoc.Accept(writer);
|
||||||
|
fclose(optionsFile);
|
||||||
|
|
||||||
|
log(stdout, MODULE_NAME"Options written.\n");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
log(stdout, MODULE_NAME"Filed to open options file for write, skip.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
log(stdout, MODULE_NAME"Deinitialized.\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Main loop
|
// Main loop
|
||||||
@ -455,13 +508,14 @@ int receiveData(const char* buf) {
|
|||||||
|
|
||||||
if (UserData->isCargo) {
|
if (UserData->isCargo) {
|
||||||
targetPaxPayloadData->CGTarget = CGTarget;
|
targetPaxPayloadData->CGTarget = CGTarget;
|
||||||
|
//TODO: F load
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (!document.HasMember("numPax")) return -1;
|
if (!document.HasMember("numPax")) return -1;
|
||||||
unsigned short numPax = document["numPax"].GetInt();
|
unsigned short numPax = document["numPax"].GetInt();
|
||||||
|
|
||||||
targetPaxPayloadData->CGTarget = CGTarget;
|
targetPaxPayloadData->CGTarget = CGTarget;
|
||||||
distribute(targetPaxPayloadData, liveFuelData, numPax, cargo, UserData->isImperial);
|
distribute(targetPaxPayloadData, liveFuelData, numPax, cargo, UserData->isImperial, UserData->isER);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -473,17 +527,18 @@ int receiveData(const char* buf) {
|
|||||||
|
|
||||||
if (UserData->isCargo) {
|
if (UserData->isCargo) {
|
||||||
targetPaxPayloadData->CGTarget = CGTarget;
|
targetPaxPayloadData->CGTarget = CGTarget;
|
||||||
|
//TODO: F load
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
targetPaxPayloadData->CGTarget = CGTarget;
|
targetPaxPayloadData->CGTarget = CGTarget;
|
||||||
distribute(targetPaxPayloadData, liveFuelData, ZFWTarget, UserData->isImperial);
|
distribute(targetPaxPayloadData, liveFuelData, ZFWTarget, UserData->isImperial, UserData->isER);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// Station Entry
|
// Station Entry
|
||||||
case 2: {
|
case 2: {
|
||||||
if (UserData->isCargo) {
|
if (UserData->isCargo) {
|
||||||
|
//TODO: F load
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (!document.HasMember("business1") || !document.HasMember("business2") ||
|
if (!document.HasMember("business1") || !document.HasMember("business2") ||
|
||||||
@ -503,7 +558,7 @@ int receiveData(const char* buf) {
|
|||||||
// Trigger load
|
// Trigger load
|
||||||
case 3: {
|
case 3: {
|
||||||
if (UserData->isCargo) {
|
if (UserData->isCargo) {
|
||||||
|
//TODO: F load
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
load(targetPaxPayloadData, simConnect, UserData->isImperial);
|
load(targetPaxPayloadData, simConnect, UserData->isImperial);
|
||||||
@ -514,10 +569,10 @@ int receiveData(const char* buf) {
|
|||||||
// Trigger unload
|
// Trigger unload
|
||||||
case 4: {
|
case 4: {
|
||||||
if (UserData->isCargo) {
|
if (UserData->isCargo) {
|
||||||
|
//TODO: F load
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
unload(simConnect, UserData->isImperial);
|
unload(simConnect, UserData->isER);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@ -551,6 +606,8 @@ void sendData () {
|
|||||||
userData.SetObject();
|
userData.SetObject();
|
||||||
rapidjson::Value limits;
|
rapidjson::Value limits;
|
||||||
limits.SetObject();
|
limits.SetObject();
|
||||||
|
rapidjson::Value options;
|
||||||
|
options.SetObject();
|
||||||
|
|
||||||
rapidjson::StringBuffer strbuf;
|
rapidjson::StringBuffer strbuf;
|
||||||
rapidjson::Writer<rapidjson::StringBuffer> writer(strbuf);
|
rapidjson::Writer<rapidjson::StringBuffer> writer(strbuf);
|
||||||
@ -665,14 +722,9 @@ void sendData () {
|
|||||||
|
|
||||||
#pragma endregion
|
#pragma endregion
|
||||||
|
|
||||||
//TODO: Evaluate necessity of sending GSX data
|
|
||||||
// GSX
|
// GSX
|
||||||
GSX.AddMember("boardingState", GSXData->boardingState, allocator);
|
GSX.AddMember("boardingState", GSXData->boardingState, allocator);
|
||||||
GSX.AddMember("deboardingState", GSXData->deboardingState, allocator);
|
GSX.AddMember("deboardingState", GSXData->deboardingState, allocator);
|
||||||
GSX.AddMember("passengersBoarded", GSXData->passengersBoarded, allocator);
|
|
||||||
GSX.AddMember("passengersDeboarded", GSXData->passengersDeboarded, allocator);
|
|
||||||
GSX.AddMember("cargoBoarded", GSXData->cargoBoarded, allocator);
|
|
||||||
GSX.AddMember("cargoDeboarded", GSXData->cargoDeboarded, allocator);
|
|
||||||
|
|
||||||
// User Data
|
// User Data
|
||||||
userData.AddMember<bool>("isCargo", UserData->isCargo, allocator);
|
userData.AddMember<bool>("isCargo", UserData->isCargo, allocator);
|
||||||
@ -692,7 +744,7 @@ void sendData () {
|
|||||||
limits.AddMember("upper3", -1, allocator);
|
limits.AddMember("upper3", -1, allocator);
|
||||||
limits.AddMember("upper4", -1, allocator);
|
limits.AddMember("upper4", -1, allocator);
|
||||||
limits.AddMember("lowerForward", MAX_FRONT_CARGO(UserData->isImperial), allocator);
|
limits.AddMember("lowerForward", MAX_FRONT_CARGO(UserData->isImperial), allocator);
|
||||||
limits.AddMember("lowerRear", MAX_REAR_CARGO(UserData->isImperial), allocator);
|
limits.AddMember("lowerRear", MAX_REAR_CARGO(UserData->isImperial, UserData->isER), allocator);
|
||||||
// TODO: Actual F limit
|
// TODO: Actual F limit
|
||||||
//limits.AddMember("MaxZFW", MAX_F_ZFW, allocator);
|
//limits.AddMember("MaxZFW", MAX_F_ZFW, allocator);
|
||||||
limits.AddMember("minZFW", targetFPayloadData->empty + targetFPayloadData->leftAux + targetFPayloadData->rightAux, allocator);
|
limits.AddMember("minZFW", targetFPayloadData->empty + targetFPayloadData->leftAux + targetFPayloadData->rightAux, allocator);
|
||||||
@ -704,17 +756,23 @@ void sendData () {
|
|||||||
limits.AddMember("economy1", MAX_ECONOMY_1, allocator);
|
limits.AddMember("economy1", MAX_ECONOMY_1, allocator);
|
||||||
limits.AddMember("economy2", MAX_ECONOMY_2, allocator);
|
limits.AddMember("economy2", MAX_ECONOMY_2, allocator);
|
||||||
limits.AddMember("forwardCargo", MAX_FRONT_CARGO(UserData->isImperial), allocator);
|
limits.AddMember("forwardCargo", MAX_FRONT_CARGO(UserData->isImperial), allocator);
|
||||||
limits.AddMember("rearCargo", MAX_REAR_CARGO(UserData->isImperial), allocator);
|
limits.AddMember("rearCargo", MAX_REAR_CARGO(UserData->isImperial, UserData->isER), allocator);
|
||||||
limits.AddMember("maxZFW", MAX_PAX_ZFW(UserData->isImperial), allocator);
|
limits.AddMember("maxZFW", MAX_PAX_ZFW(UserData->isImperial), allocator);
|
||||||
limits.AddMember("minZFW", targetPaxPayloadData->empty + targetPaxPayloadData->leftAux + targetPaxPayloadData->rightAux, allocator);
|
limits.AddMember("minZFW", targetPaxPayloadData->empty + targetPaxPayloadData->leftAux + targetPaxPayloadData->rightAux, allocator);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Options
|
||||||
|
options.AddMember("GSXSync", UserOptions->GSXSync, allocator);
|
||||||
|
options.AddMember("paxWeight", UserData->isImperial ? UserOptions->paxWeightLBS : UserOptions->paxWeightKG, allocator);
|
||||||
|
options.AddMember("bagWeight", UserData->isImperial ? UserOptions->bagWeightLBS : UserOptions->bagWeightKG, allocator);
|
||||||
|
|
||||||
// Construct document
|
// Construct document
|
||||||
document.AddMember("livePayload", livePayload.Move(), allocator);
|
document.AddMember("livePayload", livePayload.Move(), allocator);
|
||||||
document.AddMember("targetPayload", targetPayload.Move(), allocator);
|
document.AddMember("targetPayload", targetPayload.Move(), allocator);
|
||||||
document.AddMember("GSX", GSX.Move(), allocator);
|
document.AddMember("GSX", GSX.Move(), allocator);
|
||||||
document.AddMember("userData", userData.Move(), allocator);
|
document.AddMember("userData", userData.Move(), allocator);
|
||||||
document.AddMember("limits", limits.Move(), allocator);
|
document.AddMember("limits", limits.Move(), allocator);
|
||||||
|
document.AddMember("options", options.Move(), allocator);
|
||||||
|
|
||||||
// Write to CommBus
|
// Write to CommBus
|
||||||
document.Accept(writer);
|
document.Accept(writer);
|
||||||
@ -796,6 +854,59 @@ void CALLBACK MyDispatchProc(SIMCONNECT_RECV* pData, DWORD cbData, void* pContex
|
|||||||
GSXData_t* data = (GSXData_t*)&pObjData->dwData;
|
GSXData_t* data = (GSXData_t*)&pObjData->dwData;
|
||||||
memcpy(GSXData, data, sizeof(GSXData_t));
|
memcpy(GSXData, data, sizeof(GSXData_t));
|
||||||
|
|
||||||
|
if (UserOptions->GSXSync) {
|
||||||
|
if (GSXData->boardingState == GSX_SERVICE_ACTIVE) {
|
||||||
|
double cargoBoarded = GSXData->cargoBoarded;
|
||||||
|
if (UserData->isCargo) {
|
||||||
|
//TODO: Progressive F load
|
||||||
|
}
|
||||||
|
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);
|
||||||
|
load(&localPayload, simConnect, UserData->isImperial);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (GSXData->deboardingState == GSX_SERVICE_ACTIVE) {
|
||||||
|
double cargoDeboarded = GSXData->cargoDeboarded;
|
||||||
|
if (UserData->isCargo) {
|
||||||
|
//TODO: Progressive F unload
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
double passengersDeboarded = GSXData->passengersDeboarded;
|
||||||
|
paxPayloadData_t localPayload = {};
|
||||||
|
memcpy(&localPayload, targetPaxPayloadData, sizeof(localPayload));
|
||||||
|
|
||||||
|
localPayload.paxCount.business1 -= min(targetPaxPayloadData->paxCount.business1, passengersDeboarded);
|
||||||
|
passengersDeboarded -= localPayload.paxCount.business1;
|
||||||
|
localPayload.paxCount.business2 -= min(targetPaxPayloadData->paxCount.business2, passengersDeboarded);
|
||||||
|
passengersDeboarded -= localPayload.paxCount.business2;
|
||||||
|
localPayload.paxCount.economy1 -= min(targetPaxPayloadData->paxCount.economy1, passengersDeboarded);
|
||||||
|
passengersDeboarded -= localPayload.paxCount.economy1;
|
||||||
|
localPayload.paxCount.economy2 -= min(targetPaxPayloadData->paxCount.economy2, passengersDeboarded);
|
||||||
|
passengersDeboarded -= localPayload.paxCount.economy2;
|
||||||
|
localPayload.forwardCargo -= targetPaxPayloadData->forwardCargo * (cargoDeboarded / 100);
|
||||||
|
localPayload.rearCargo -= targetPaxPayloadData->rearCargo * (cargoDeboarded / 100);
|
||||||
|
|
||||||
|
generatePayload(&localPayload, UserData->isImperial);
|
||||||
|
load(&localPayload, simConnect, UserData->isImperial);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case DATA_REQUEST_USER_DATA: {
|
case DATA_REQUEST_USER_DATA: {
|
||||||
|
|||||||
@ -15,6 +15,8 @@
|
|||||||
#include <MSFS/Legacy/gauges.h>
|
#include <MSFS/Legacy/gauges.h>
|
||||||
|
|
||||||
#include <rapidjson/document.h>
|
#include <rapidjson/document.h>
|
||||||
|
#include <rapidjson/filereadstream.h>
|
||||||
|
#include "rapidjson/filewritestream.h"
|
||||||
#include <rapidjson/writer.h>
|
#include <rapidjson/writer.h>
|
||||||
|
|
||||||
#include <SimConnect.h>
|
#include <SimConnect.h>
|
||||||
|
|||||||
@ -1,18 +1,18 @@
|
|||||||
#include "pax.h"
|
#include "pax.h"
|
||||||
|
|
||||||
//ZFW Entry, fill pax first (pax+bag), rest is cargo
|
//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 bool isImperial) {
|
void distribute(paxPayloadData_t* const targetPayload, const FuelData_t* const fuel, const double ZFWTarget, const bool isImperial, const bool isER) {
|
||||||
// Find payload, num pax and extra cargo
|
// Find payload, num pax and extra cargo
|
||||||
double payload = ZFWTarget - targetPayload->empty - targetPayload->pilot - targetPayload->firstOfficer - targetPayload->engineer -
|
double payload = ZFWTarget - targetPayload->empty - targetPayload->pilot - targetPayload->firstOfficer - targetPayload->engineer -
|
||||||
targetPayload->cabinCrewFront - targetPayload->cabinCrewRear - targetPayload->leftAux - targetPayload->rightAux;
|
targetPayload->cabinCrewFront - targetPayload->cabinCrewRear - targetPayload->leftAux - targetPayload->rightAux;
|
||||||
unsigned short numPax = max(0.0, min((double)MAX_PAX, floor(payload / (PAX_WEIGHT(isImperial) + BAG_WEIGHT(isImperial)))));
|
unsigned short numPax = max(0.0, min((double)MAX_PAX, floor(payload / (PAX_WEIGHT(isImperial) + BAG_WEIGHT(isImperial)))));
|
||||||
unsigned int cargo = round(payload - numPax * PAX_WEIGHT(isImperial) - numPax * BAG_WEIGHT(isImperial));
|
unsigned int cargo = round(payload - numPax * PAX_WEIGHT(isImperial) - numPax * BAG_WEIGHT(isImperial));
|
||||||
|
|
||||||
distribute(targetPayload, fuel, numPax, cargo, isImperial);
|
distribute(targetPayload, fuel, numPax, cargo, isImperial, isER);
|
||||||
}
|
}
|
||||||
|
|
||||||
//SimBrief Entry, SB pax count and extra cargo
|
//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 bool isImperial) {
|
void distribute(paxPayloadData_t* const targetPayload, const FuelData_t* const fuel, unsigned short numPax, unsigned int cargo, const bool isImperial, const bool isER) {
|
||||||
// Clear
|
// Clear
|
||||||
targetPayload->paxCount.business1 = targetPayload->paxCount.business2 = targetPayload->paxCount.economy1 = targetPayload->paxCount.economy2 =
|
targetPayload->paxCount.business1 = targetPayload->paxCount.business2 = targetPayload->paxCount.economy1 = targetPayload->paxCount.economy2 =
|
||||||
targetPayload->paxCount.total = 0;
|
targetPayload->paxCount.total = 0;
|
||||||
@ -94,7 +94,7 @@ void distribute(paxPayloadData_t* const targetPayload, const FuelData_t* const f
|
|||||||
targetPayload->forwardCargo++;
|
targetPayload->forwardCargo++;
|
||||||
cargo--;
|
cargo--;
|
||||||
}
|
}
|
||||||
if (targetPayload->rearCargo < MAX_REAR_CARGO(isImperial) && cargo > 0) {
|
if (targetPayload->rearCargo < MAX_REAR_CARGO(isImperial, isER) && cargo > 0) {
|
||||||
targetPayload->rearCargo++;
|
targetPayload->rearCargo++;
|
||||||
cargo--;
|
cargo--;
|
||||||
}
|
}
|
||||||
@ -170,14 +170,14 @@ void distribute(paxPayloadData_t* const targetPayload, const FuelData_t* const f
|
|||||||
count--;
|
count--;
|
||||||
}
|
}
|
||||||
// Refinement cargo
|
// Refinement cargo
|
||||||
count = MAX_FRONT_CARGO(isImperial) + MAX_REAR_CARGO(isImperial);
|
count = MAX_FRONT_CARGO(isImperial) + MAX_REAR_CARGO(isImperial, isER);
|
||||||
while (count > 0) {
|
while (count > 0) {
|
||||||
generatePayload(targetPayload, isImperial);
|
generatePayload(targetPayload, isImperial);
|
||||||
calculateCGs(targetPayload, fuel, &targetPayload->ZFWCG, &targetPayload->TOCG, isImperial);
|
calculateCGs(targetPayload, fuel, &targetPayload->ZFWCG, &targetPayload->TOCG, isImperial);
|
||||||
|
|
||||||
// in front of target
|
// in front of target
|
||||||
if (targetPayload->ZFWCG < targetPayload->CGTarget - CG_TOLERANCE) {
|
if (targetPayload->ZFWCG < targetPayload->CGTarget - CG_TOLERANCE) {
|
||||||
if (targetPayload->forwardCargo > 0 && targetPayload->rearCargo < MAX_REAR_CARGO(isImperial)) {
|
if (targetPayload->forwardCargo > 0 && targetPayload->rearCargo < MAX_REAR_CARGO(isImperial, isER)) {
|
||||||
if (targetPayload->forwardCargo > BAG_WEIGHT(isImperial) &&
|
if (targetPayload->forwardCargo > BAG_WEIGHT(isImperial) &&
|
||||||
targetPayload->rearCargo < MAX_FRONT_CARGO(isImperial) - BAG_WEIGHT(isImperial)) {
|
targetPayload->rearCargo < MAX_FRONT_CARGO(isImperial) - BAG_WEIGHT(isImperial)) {
|
||||||
targetPayload->forwardCargo -= BAG_WEIGHT(isImperial);
|
targetPayload->forwardCargo -= BAG_WEIGHT(isImperial);
|
||||||
@ -196,7 +196,7 @@ void distribute(paxPayloadData_t* const targetPayload, const FuelData_t* const f
|
|||||||
else if (targetPayload->ZFWCG > targetPayload->CGTarget + CG_TOLERANCE) {
|
else if (targetPayload->ZFWCG > targetPayload->CGTarget + CG_TOLERANCE) {
|
||||||
if (targetPayload->rearCargo > 0 && targetPayload->forwardCargo < MAX_FRONT_CARGO(isImperial)) {
|
if (targetPayload->rearCargo > 0 && targetPayload->forwardCargo < MAX_FRONT_CARGO(isImperial)) {
|
||||||
if (targetPayload->rearCargo > BAG_WEIGHT(isImperial) &&
|
if (targetPayload->rearCargo > BAG_WEIGHT(isImperial) &&
|
||||||
targetPayload->forwardCargo < MAX_REAR_CARGO(isImperial) - BAG_WEIGHT(isImperial)) {
|
targetPayload->forwardCargo < MAX_REAR_CARGO(isImperial, isER) - BAG_WEIGHT(isImperial)) {
|
||||||
targetPayload->rearCargo -= BAG_WEIGHT(isImperial);
|
targetPayload->rearCargo -= BAG_WEIGHT(isImperial);
|
||||||
targetPayload->forwardCargo += BAG_WEIGHT(isImperial);
|
targetPayload->forwardCargo += BAG_WEIGHT(isImperial);
|
||||||
}
|
}
|
||||||
@ -218,7 +218,7 @@ void distribute(paxPayloadData_t* const targetPayload, const FuelData_t* const f
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Updates pax stations with their respective weights
|
// Updates pax stations with their respective weights
|
||||||
// Used internally and used for Station Entry (pax only, cargo is ste directly)
|
// Used internally and used for Station Entry (pax only, cargo is set directly)
|
||||||
void generatePayload(paxPayloadData_t* const targetPayload, const bool isImperial) {
|
void generatePayload(paxPayloadData_t* const targetPayload, const bool isImperial) {
|
||||||
targetPayload->business1Left = targetPayload->business1Center = targetPayload->business1Right = (targetPayload->paxCount.business1 / 3.0) * PAX_WEIGHT(isImperial);
|
targetPayload->business1Left = targetPayload->business1Center = targetPayload->business1Right = (targetPayload->paxCount.business1 / 3.0) * PAX_WEIGHT(isImperial);
|
||||||
targetPayload->business2Left = targetPayload->business2Center = targetPayload->business2Right = (targetPayload->paxCount.business2 / 3.0) * PAX_WEIGHT(isImperial);
|
targetPayload->business2Left = targetPayload->business2Center = targetPayload->business2Right = (targetPayload->paxCount.business2 / 3.0) * PAX_WEIGHT(isImperial);
|
||||||
@ -255,6 +255,8 @@ void normalisePayload(paxPayloadData_t* const targetPayload, const bool isImperi
|
|||||||
targetPayload->cabinCrewRear = TO_POUNDS(isImperial, targetPayload->cabinCrewRear);
|
targetPayload->cabinCrewRear = TO_POUNDS(isImperial, targetPayload->cabinCrewRear);
|
||||||
targetPayload->forwardCargo = TO_POUNDS(isImperial, targetPayload->forwardCargo);
|
targetPayload->forwardCargo = TO_POUNDS(isImperial, targetPayload->forwardCargo);
|
||||||
targetPayload->rearCargo = TO_POUNDS(isImperial, targetPayload->rearCargo);
|
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) {
|
void calculateCGs(const paxPayloadData_t* const targetPayload, const FuelData_t* const fuel, double* const ZFWCG, double* const TOCG, const bool isImperial) {
|
||||||
@ -299,8 +301,13 @@ void load(const paxPayloadData_t* const targetPayload, const HANDLE simConnect,
|
|||||||
SimConnect_SetDataOnSimObject(simConnect, DATA_DEFINITION_PAYLOAD_PAX, SIMCONNECT_OBJECT_ID_USER, 0, 0, sizeof(paxPayloadDataSet_t), &localPayload);
|
SimConnect_SetDataOnSimObject(simConnect, DATA_DEFINITION_PAYLOAD_PAX, SIMCONNECT_OBJECT_ID_USER, 0, 0, sizeof(paxPayloadDataSet_t), &localPayload);
|
||||||
}
|
}
|
||||||
|
|
||||||
void unload(const HANDLE simConnect, const bool isImperial) {
|
void unload(const HANDLE simConnect, const bool isER) {
|
||||||
paxPayloadDataSet_t localPayload = {};
|
paxPayloadDataSet_t localPayload = {};
|
||||||
|
|
||||||
|
localPayload.cabinCrewFront = FRONT_CREW_WEIGHT(true);
|
||||||
|
localPayload.cabinCrewRear = REAR_CREW_WEIGHT(true);
|
||||||
|
localPayload.leftAux = localPayload.rightAux = isER ? AUX_WEIGHT(true) : 0;
|
||||||
|
localPayload.pilot = localPayload.firstOfficer = localPayload.engineer = PILOT_WEIGHT(true);
|
||||||
|
|
||||||
SimConnect_SetDataOnSimObject(simConnect, DATA_DEFINITION_PAYLOAD_PAX, SIMCONNECT_OBJECT_ID_USER, 0, 0, sizeof(localPayload), &localPayload);
|
SimConnect_SetDataOnSimObject(simConnect, DATA_DEFINITION_PAYLOAD_PAX, SIMCONNECT_OBJECT_ID_USER, 0, 0, sizeof(localPayload), &localPayload);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -21,9 +21,9 @@
|
|||||||
#include "types.h"
|
#include "types.h"
|
||||||
|
|
||||||
//ZFW Entry, fill pax first (pax+bag), rest is cargo
|
//ZFW Entry, fill pax first (pax+bag), rest is cargo
|
||||||
void distribute(paxPayloadData_t* const targetPayload, const FuelData_t* const fuel, const double ZFWTarget, bool isImperial);
|
void distribute(paxPayloadData_t* const targetPayload, const FuelData_t* const fuel, const double ZFWTarget, const bool isImperial, const bool isER);
|
||||||
//SimBrief Entry, SB pax count and total cargo
|
//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, bool isImperial);
|
void distribute(paxPayloadData_t* const targetPayload, const FuelData_t* const fuel, unsigned short numPax, unsigned int cargo, const bool isImperial, const bool isER);
|
||||||
// Updates pax stations with their respective weights
|
// Updates pax stations with their respective weights
|
||||||
// Used internally and used for Station Entry (pax only, cargo is ste directly)
|
// Used internally and used for Station Entry (pax only, cargo is ste directly)
|
||||||
// STATION WEIGHTS ARE NOT NORMALISED TO POUNDS
|
// STATION WEIGHTS ARE NOT NORMALISED TO POUNDS
|
||||||
@ -33,4 +33,4 @@ void generatePayload(paxPayloadData_t* const targetPayload, const bool isImperia
|
|||||||
void normalisePayload(paxPayloadData_t* const targetPayload, const bool isImperial);
|
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 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 load(const paxPayloadData_t* const targetPayload, const HANDLE simConnect, const bool isImperial);
|
||||||
void unload(const HANDLE simConnect, const bool isImperial);
|
void unload(const HANDLE simConnect, const bool isER);
|
||||||
|
|||||||
@ -18,7 +18,7 @@
|
|||||||
//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))
|
#define MAX_FRONT_CARGO(IS_IMPERIAL) ((IS_IMPERIAL) ? (6.0 * 15000.0) : (6.0 * 6804.0))
|
||||||
//LD3s due to 70in door
|
//LD3s due to 70in door
|
||||||
#define MAX_REAR_CARGO(IS_IMPERIAL) ((IS_IMPERIAL) ? (14.0 * 3500.0) : (14.0 * 1588.0))
|
#define MAX_REAR_CARGO(IS_IMPERIAL, IS_ER) ((IS_IMPERIAL) ? ((IS_ER ? 14.0 : 2.0) * 3500.0) : ((IS_ER ? 14.0 : 2.0) * 1588.0))
|
||||||
|
|
||||||
// All actual Business seats
|
// All actual Business seats
|
||||||
#define MAX_BUSINESS_1 30
|
#define MAX_BUSINESS_1 30
|
||||||
@ -101,6 +101,9 @@
|
|||||||
#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))
|
#define FROM_POUNDS(IS_IMPERIAL, VALUE) ((IS_IMPERIAL) ? (VALUE) : (VALUE) * (1.0 / 2.20462262185))
|
||||||
|
|
||||||
|
// GSX States
|
||||||
|
#define GSX_SERVICE_ACTIVE 5
|
||||||
|
|
||||||
// SimConnect ENUMs
|
// SimConnect ENUMs
|
||||||
enum DATA_DEFINITIONS {
|
enum DATA_DEFINITIONS {
|
||||||
DATA_DEFINITION_EMPTY_WEIGHT,
|
DATA_DEFINITION_EMPTY_WEIGHT,
|
||||||
@ -259,3 +262,11 @@ typedef struct {
|
|||||||
// Additional properties
|
// Additional properties
|
||||||
double total;
|
double total;
|
||||||
} FuelData_t;
|
} FuelData_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
bool GSXSync;
|
||||||
|
double paxWeightKG;
|
||||||
|
double bagWeightKG;
|
||||||
|
double paxWeightLBS;
|
||||||
|
double bagWeightLBS;
|
||||||
|
} UserOptions_t;
|
||||||
@ -10,8 +10,10 @@ Coherent.call("COMM_BUS_WASM_CALLBACK", "khofmann_tfdi_md-11_load_manager_update
|
|||||||
TODO:
|
TODO:
|
||||||
|
|
||||||
- JS
|
- JS
|
||||||
- GSX State for displaying status fo prog. loading
|
|
||||||
- Persist SB data across page changes
|
- Persist SB data across page changes
|
||||||
- Duplicate Input pages for F
|
- Duplicate Input pages for F
|
||||||
|
- Options (GSX sync, pax/bag weights)
|
||||||
- WASM
|
- WASM
|
||||||
- GSX synced setting of payload
|
- Custom pax/bag weights
|
||||||
|
- F loading stuff
|
||||||
|
- TEST GSX synced unload
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user