Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: implement airline modifiable information database #9868

Draft
wants to merge 2 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions fbw-a32nx/src/systems/shared/src/a32nx_ami.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import {
AirlineModifiableInformation,
AirlineModifiableInformationDatabase,
DefaultValuesAmiDatabaseLayer,
LiveryAmiDatabaseLayer,
UserSettingsAmiDatabaseLayer,
} from '@flybywiresim/fbw-sdk';
import { DefaultUserSettingManager, EventBus } from '@microsoft/msfs-sdk';

const defaultAmiData: AirlineModifiableInformation = {
perfFactor: 0, // %
idleFactor: 0, // %
perfCode: 'ARM',
taxiFuel: 200, // kg
rteRsv: 5, // %
rsvMin: 0, // kg
rsvMax: 10_000, // kg
rsvInflt: true, // YES / NO
rsvAltn: false, // YES / NO
finalTg: 30, // minutes
finalTf: 30, // minutes
finalFixf: 0, // kg
finalAlt: 1500, // ft AGL
finalDest: 'A', // P or A
};

/** This will probably come from persistence.ts when NXDataStore is gone */
const bus = new EventBus();
const userSettings = new DefaultUserSettingManager<AirlineModifiableInformation>(
bus,
Object.entries(defaultAmiData).map(([key, value]) => ({ name: key, defaultValue: value })),
);

export const AmiDatabase = new AirlineModifiableInformationDatabase(
new UserSettingsAmiDatabaseLayer(userSettings),
new LiveryAmiDatabaseLayer(),
new DefaultValuesAmiDatabaseLayer(defaultAmiData),
);
110 changes: 110 additions & 0 deletions fbw-common/src/systems/shared/src/ami.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
import { UserSettingManager } from '@microsoft/msfs-sdk';

export type AirlineModifiableInformation = {
/**
* %, performance factor
*/
perfFactor: number;
/**
* %, idle factor
*/
idleFactor: number;
/**
* modification password, three characters
*/
perfCode: string;
/**
* kg, taxi fuel
*/
taxiFuel: number;
/**
* % of trip fuel as route reserves
*/
rteRsv: number;
/**
* kg, Minimum value of route reserves
*/
rsvMin: number;
/**
* kg, Maximum value of route reserves
*/
rsvMax: number; //
/**
* Reserves are computed for fuel predictions in flight
*/
rsvInflt: boolean;
/**
* Reserves includes fuel for alternate trip
*/
rsvAltn: boolean;
/**
* minutes, Final holding time used for fuel planning computation
*/
finalTg: number;
/**
* minutes, Final holding time used for fuel prediction computation (only used if finalFixf = 0)
*/
finalTf: number;
/**
* kg, Final holding fuel quantity used for fuel prediction computation
*/
finalFixf: number;
/**
* ft AGL, Altitude of the holding pattern on which the final fuel computation is based
*/
finalAlt: number;
/**
* P or A, Final holding pattern is flown at Primary or Alternate destination
*/
finalDest: 'A' | 'P';
};

type AmiKey = keyof AirlineModifiableInformation;
type AmiValue<T extends AmiKey> = AirlineModifiableInformation[T];

interface OptionalAmiDatabaseLayer {
get<T extends AmiKey>(key: T): AmiValue<T> | undefined;
}

interface AmiDatabaseLayer {
get<T extends AmiKey>(key: T): AmiValue<T>;
}

export class AirlineModifiableInformationDatabase implements AmiDatabaseLayer {
constructor(
private readonly settings: AmiDatabaseLayer,
private readonly liveryRecords: OptionalAmiDatabaseLayer,
private readonly defaultRecods: AmiDatabaseLayer,
) {}

get<T extends AmiKey>(key: T): AmiValue<T> {
return this.settings.get(key) ?? this.liveryRecords.get(key) ?? this.defaultRecods.get(key);
}
}

export class UserSettingsAmiDatabaseLayer implements AmiDatabaseLayer {
constructor(private readonly userSettings: UserSettingManager<AirlineModifiableInformation>) {}

get<T extends AmiKey>(key: T): AmiValue<T> {
return this.userSettings.getSetting(key).value;
}

whenChanged(key: AmiKey) {
return this.userSettings.whenSettingChanged(key);
}
}

export class LiveryAmiDatabaseLayer implements OptionalAmiDatabaseLayer {
get<T extends AmiKey>(_key: T): AmiValue<T> {
// TODO Fetch from livery
return undefined;
}
}

export class DefaultValuesAmiDatabaseLayer implements OptionalAmiDatabaseLayer {
constructor(private readonly defaultValues: AirlineModifiableInformation) {}

get<T extends AmiKey>(key: T): AmiValue<T> {
return this.defaultValues[key];
}
}
1 change: 1 addition & 0 deletions fbw-common/src/systems/shared/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
export * from './AircraftGithubVersionChecker';
export * from './amdb';
export * from './ami';
export * from './ApproachUtils';
export * from './Arinc429ConsumerSubject';
export * from './Arinc429RegisterSubject';
Expand Down