Skip to content

Commit

Permalink
systems-host: enable lint (no functional changes)
Browse files Browse the repository at this point in the history
  • Loading branch information
flogross89 committed Sep 15, 2024
1 parent 1e87657 commit bc1258d
Show file tree
Hide file tree
Showing 13 changed files with 1,790 additions and 1,641 deletions.
1 change: 1 addition & 0 deletions .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ module.exports = {
'fbw-ingamepanels-checklist-fix/*',
'!fbw-a380x/src/systems/instruments/src/PFD/*',
'!fbw-a380x/src/systems/instruments/src/MFD/*',
'!fbw-a380x/src/systems/systems-host/*',
],
rules: {
'prettier/prettier': ['error', {}, { usePrettierrc: true }],
Expand Down
1 change: 1 addition & 0 deletions fbw-a380x/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ These systems are currently not operational / these features are missing and sha
- AP tuning for A380X
- FLS
- THR NOISE, DCLB
- ILS back course implementation in AP + EFIS

### ATA 22 Flight Management System (FMS)

Expand Down
8 changes: 8 additions & 0 deletions fbw-a380x/src/systems/systems-host/.eslintrc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
'use strict';

module.exports = {
extends: '../../../../.eslintrc.js',

// overrides airbnb, use sparingly
rules: { 'react/react-in-jsx-scope': 'off', 'react/no-unknown-property': 'off', 'react/style-prop-object': 'off' },
};
7 changes: 4 additions & 3 deletions fbw-a380x/src/systems/systems-host/README.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
# FBW Systems Host

The systems host is used to provide non-Rust systems of the A380X an environment to run as single
instrument without rendering or connection to the MCDU, etc. The system inherits from the
The systems host is used to provide non-Rust systems of the A380X an environment to run as single
instrument without rendering or connection to the MCDU, etc. The system inherits from the
BaseInstruments class that is managed by the simulator.

It manages the different power supplies, systems and handles the simulator states.

## Communication stack

The systems and the power supply communicate via the MSFS EventBus. The power supply class
The systems and the power supply communicate via the MSFS EventBus. The power supply class
translates the simulator variables into EventBus events.

## System interfaces
Expand All @@ -21,5 +21,6 @@ Every system has to implement the following functions:
- `update` is called in every update call of the simulator, but only after `startPublish` is called

## Example

(TODO: update for A380X's first system)
~~The `systems/atsu.ts` is a first example how to implement a system inside the host environment.~~
1 change: 0 additions & 1 deletion fbw-a380x/src/systems/systems-host/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import {
InstrumentBackplane,
Clock,
ClockEvents,
Subject,
ConsumerSubject,
MappedSubject,
SubscribableMapFunctions,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import {
MappedSubject,
SimVarValueType,
Subject,
Subscribable
Subscribable,
} from '@microsoft/msfs-sdk';
import { RadioNavSelectedNavaid, RmpAmuBusEvents } from 'systems-host/systems/Communications/RmpAmuBusPublisher';
import { FailuresConsumer } from '@flybywiresim/fbw-sdk';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,10 +83,7 @@ export class RmpAmuBusPublisher extends SimVarPublisher<RmpAmuBusEvents> {
['rmp_amu_int_transmit', { name: `L:A380X_RMP_#index#_INT_TX`, type: SimVarValueType.Bool, indexed: true }],
['rmp_amu_cab_transmit', { name: `L:A380X_RMP_#index#_CAB_TX`, type: SimVarValueType.Bool, indexed: true }],
['rmp_amu_pa_transmit', { name: `L:A380X_RMP_#index#_PA_TX`, type: SimVarValueType.Bool, indexed: true }],
[
'rmp_amu_nav_filter',
{ name: `L:A380X_RMP_#index#_NAV_FILTER`, type: SimVarValueType.Bool, indexed: true },
],
['rmp_amu_nav_filter', { name: `L:A380X_RMP_#index#_NAV_FILTER`, type: SimVarValueType.Bool, indexed: true }],

['rmp_amu_vhf1_receive', { name: `L:A380X_RMP_#index#_VHF_VOL_RX_1`, type: SimVarValueType.Bool, indexed: true }],
['rmp_amu_vhf2_receive', { name: `L:A380X_RMP_#index#_VHF_VOL_RX_2`, type: SimVarValueType.Bool, indexed: true }],
Expand All @@ -112,7 +109,7 @@ export class RmpAmuBusPublisher extends SimVarPublisher<RmpAmuBusEvents> {
['rmp_amu_pa_volume', { name: `L:A380X_RMP_#index#_PA_VOL`, type: SimVarValueType.Number, indexed: true }],
['rmp_amu_nav_volume', { name: `L:A380X_RMP_#index#_NAV_VOL`, type: SimVarValueType.Number, indexed: true }],

['rmp_amu_nav_sel', { name: `L:A380X_RMP_#index#_NAV_SEL`, type :SimVarValueType.Enum, indexed: true }],
['rmp_amu_nav_sel', { name: `L:A380X_RMP_#index#_NAV_SEL`, type: SimVarValueType.Enum, indexed: true }],
]);

super(simvars, bus, pacer);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,33 +1,41 @@
// Copyright (c) 2024 FlyByWire Simulations
// SPDX-License-Identifier: GPL-3.0

import { ConsumerValue, EventBus, Instrument, MutableSubscribable, SimVarValueType, Subject, Subscription } from '@microsoft/msfs-sdk';
import {
ConsumerValue,
EventBus,
Instrument,
MutableSubscribable,
SimVarValueType,
Subject,
Subscription,
} from '@microsoft/msfs-sdk';
import { CameraEvents } from 'instruments/src/MsfsAvionicsCommon/providers/CameraPublisher';
import { AudioManagementUnit, ComIndex } from './AudioManagementUnit';
import { RadioNavSelectedNavaid, RmpAmuBusEvents } from './RmpAmuBusPublisher';

interface NavaidDefinition {
setVolume: (volume: number, amuIndex: number) => Promise<unknown>,
setIdent: (on: boolean, amuIndex: number) => Promise<unknown>,
setVolume: (volume: number, amuIndex: number) => Promise<unknown>;
setIdent: (on: boolean, amuIndex: number) => Promise<unknown>;
}

interface NavaidState extends NavaidDefinition {
isIdentOn: MutableSubscribable<boolean>,
volume: MutableSubscribable<number>,
subs: Subscription[],
isIdentOn: MutableSubscribable<boolean>;
volume: MutableSubscribable<number>;
subs: Subscription[];
}

interface ComDefinition {
setVolume: (volume: number) => Promise<unknown>,
setReceive: (on: boolean) => Promise<unknown>,
setTransmit: (on: boolean, amuIndex: number) => Promise<unknown>,
setVolume: (volume: number) => Promise<unknown>;
setReceive: (on: boolean) => Promise<unknown>;
setTransmit: (on: boolean, amuIndex: number) => Promise<unknown>;
}

interface ComState extends ComDefinition {
isReceiveOn: MutableSubscribable<boolean>,
isTransmitOn: MutableSubscribable<boolean>,
volume: MutableSubscribable<number>,
subs: Subscription[],
isReceiveOn: MutableSubscribable<boolean>;
isTransmitOn: MutableSubscribable<boolean>;
volume: MutableSubscribable<number>;
subs: Subscription[];
}

enum SimTransmitStates {
Expand Down Expand Up @@ -59,7 +67,7 @@ export class SimAudioManager implements Instrument {
},
setIdent: (on, amuIndex) => {
return Promise.all([
SimVar.SetSimVarValue('RADIO_VOR3_IDENT_SET', SimVarValueType.Number, amuIndex === 2 ? 0 : (on ? 1 : 0)),
SimVar.SetSimVarValue('RADIO_VOR3_IDENT_SET', SimVarValueType.Number, amuIndex === 2 ? 0 : on ? 1 : 0),
SimVar.SetSimVarValue('RADIO_VOR4_IDENT_SET', SimVarValueType.Number, amuIndex === 2 ? (on ? 1 : 0) : 0),
]);
},
Expand Down Expand Up @@ -90,8 +98,16 @@ export class SimAudioManager implements Instrument {
setReceive: (on) => SimVar.SetSimVarValue('K:COM1_RECEIVE_SELECT', SimVarValueType.Number, on ? 1 : 0),
setTransmit: (on, amuIndex) => {
return Promise.all([
SimVar.SetSimVarValue(amuIndex === 2 ? 'K:COPILOT_TRANSMITTER_SET' : 'K:PILOT_TRANSMITTER_SET', SimVarValueType.Enum, on ? SimTransmitStates.Com1 : SimTransmitStates.None),
SimVar.SetSimVarValue(amuIndex === 2 ? 'K:PILOT_TRANSMITTER_SET' : 'K:COPILOT_TRANSMITTER_SET', SimVarValueType.Enum, SimTransmitStates.None),
SimVar.SetSimVarValue(
amuIndex === 2 ? 'K:COPILOT_TRANSMITTER_SET' : 'K:PILOT_TRANSMITTER_SET',
SimVarValueType.Enum,
on ? SimTransmitStates.Com1 : SimTransmitStates.None,
),
SimVar.SetSimVarValue(
amuIndex === 2 ? 'K:PILOT_TRANSMITTER_SET' : 'K:COPILOT_TRANSMITTER_SET',
SimVarValueType.Enum,
SimTransmitStates.None,
),
]);
},
},
Expand All @@ -100,8 +116,16 @@ export class SimAudioManager implements Instrument {
setReceive: (on) => SimVar.SetSimVarValue('K:COM2_RECEIVE_SELECT', SimVarValueType.Number, on ? 1 : 0),
setTransmit: (on, amuIndex) => {
return Promise.all([
SimVar.SetSimVarValue(amuIndex === 2 ? 'K:COPILOT_TRANSMITTER_SET' : 'K:PILOT_TRANSMITTER_SET', SimVarValueType.Enum, on ? SimTransmitStates.Com2 : SimTransmitStates.None),
SimVar.SetSimVarValue(amuIndex === 2 ? 'K:PILOT_TRANSMITTER_SET' : 'K:COPILOT_TRANSMITTER_SET', SimVarValueType.Enum, SimTransmitStates.None),
SimVar.SetSimVarValue(
amuIndex === 2 ? 'K:COPILOT_TRANSMITTER_SET' : 'K:PILOT_TRANSMITTER_SET',
SimVarValueType.Enum,
on ? SimTransmitStates.Com2 : SimTransmitStates.None,
),
SimVar.SetSimVarValue(
amuIndex === 2 ? 'K:PILOT_TRANSMITTER_SET' : 'K:COPILOT_TRANSMITTER_SET',
SimVarValueType.Enum,
SimTransmitStates.None,
),
]);
},
},
Expand All @@ -110,8 +134,16 @@ export class SimAudioManager implements Instrument {
setReceive: (on) => SimVar.SetSimVarValue('K:COM3_RECEIVE_SELECT', SimVarValueType.Number, on ? 1 : 0),
setTransmit: (on, amuIndex) => {
return Promise.all([
SimVar.SetSimVarValue(amuIndex === 2 ? 'K:COPILOT_TRANSMITTER_SET' : 'K:PILOT_TRANSMITTER_SET', SimVarValueType.Enum, on ? SimTransmitStates.Com3 : SimTransmitStates.None),
SimVar.SetSimVarValue(amuIndex === 2 ? 'K:PILOT_TRANSMITTER_SET' : 'K:COPILOT_TRANSMITTER_SET', SimVarValueType.Enum, SimTransmitStates.None),
SimVar.SetSimVarValue(
amuIndex === 2 ? 'K:COPILOT_TRANSMITTER_SET' : 'K:PILOT_TRANSMITTER_SET',
SimVarValueType.Enum,
on ? SimTransmitStates.Com3 : SimTransmitStates.None,
),
SimVar.SetSimVarValue(
amuIndex === 2 ? 'K:PILOT_TRANSMITTER_SET' : 'K:COPILOT_TRANSMITTER_SET',
SimVarValueType.Enum,
SimTransmitStates.None,
),
]);
},
},
Expand All @@ -121,35 +153,43 @@ export class SimAudioManager implements Instrument {

private activeAmuIndex = 1;

private readonly navaidStates: Map<RadioNavSelectedNavaid, NavaidState> = new Map(Object.entries(SimAudioManager.navaidDefinitions).map(([key, def]) => {
const isIdentOn = Subject.create<boolean>(false);
const volume = Subject.create<number>(0);
private readonly navaidStates: Map<RadioNavSelectedNavaid, NavaidState> = new Map(
Object.entries(SimAudioManager.navaidDefinitions).map(([key, def]) => {
const isIdentOn = Subject.create<boolean>(false);
const volume = Subject.create<number>(0);

const subs = [
isIdentOn.sub((v) => def.setIdent(v === true, this.activeAmuIndex), true, true),
volume.sub((v) => def.setVolume(v, this.activeAmuIndex), true, true),
];
const subs = [
isIdentOn.sub((v) => def.setIdent(v === true, this.activeAmuIndex), true, true),
volume.sub((v) => def.setVolume(v, this.activeAmuIndex), true, true),
];

return [parseInt(key), { ...def, isIdentOn, volume, subs }];
}));
return [parseInt(key), { ...def, isIdentOn, volume, subs }];
}),
);

private readonly comStates: Map<ComIndex, ComState> = new Map(Object.entries(SimAudioManager.comDefinitions).map(([key, def]) => {
const isReceiveOn = Subject.create<boolean>(false);
const isTransmitOn = Subject.create<boolean>(false);
const volume = Subject.create<number>(0);
private readonly comStates: Map<ComIndex, ComState> = new Map(
Object.entries(SimAudioManager.comDefinitions).map(([key, def]) => {
const isReceiveOn = Subject.create<boolean>(false);
const isTransmitOn = Subject.create<boolean>(false);
const volume = Subject.create<number>(0);

const subs = [
isReceiveOn.sub((v) => def.setReceive(v === true), true, true),
isTransmitOn.sub((v) => def.setTransmit(v === true, this.activeAmuIndex), true, true),
volume.sub((v) => def.setVolume(v), true, true),
];
const subs = [
isReceiveOn.sub((v) => def.setReceive(v === true), true, true),
isTransmitOn.sub((v) => def.setTransmit(v === true, this.activeAmuIndex), true, true),
volume.sub((v) => def.setVolume(v), true, true),
];

return [parseInt(key), { ...def, isReceiveOn, isTransmitOn, volume, subs }];
}));
return [parseInt(key), { ...def, isReceiveOn, isTransmitOn, volume, subs }];
}),
);

private readonly isPilotSittingFoSide = ConsumerValue.create(this.sub.on('camera_pilot_in_fo_seat'), false);

constructor(private readonly bus: EventBus, private readonly amu1: AudioManagementUnit, private readonly amu2: AudioManagementUnit) {}
constructor(
private readonly bus: EventBus,
private readonly amu1: AudioManagementUnit,
private readonly amu2: AudioManagementUnit,
) {}

init(): void {
for (const navaid of this.navaidStates.values()) {
Expand All @@ -165,7 +205,7 @@ export class SimAudioManager implements Instrument {
}
}
onUpdate(): void {
this.activeAmuIndex = (!this.amu1.isHealthy.get() || this.isPilotSittingFoSide.get()) ? 2 : 1;
this.activeAmuIndex = !this.amu1.isHealthy.get() || this.isPilotSittingFoSide.get() ? 2 : 1;
const activeAmu = this.activeAmuIndex === 2 ? this.amu2 : this.amu1;
const isAmuHealthy = activeAmu.isHealthy.get();

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,13 @@
import { ConsumerSubject, EventBus, GameStateProvider, Instrument, SimVarValueType, Subject, Subscribable, Wait } from '@microsoft/msfs-sdk';
import {
ConsumerSubject,
EventBus,
GameStateProvider,
Instrument,
SimVarValueType,
Subject,
Subscribable,
Wait,
} from '@microsoft/msfs-sdk';
import { MfdSurvEvents } from '../../../instruments/src/MsfsAvionicsCommon/providers/MfdSurvPublisher';
import { FailuresConsumer } from '@flybywiresim/fbw-sdk';
import { A380Failure } from '@failures';
Expand Down
Loading

0 comments on commit bc1258d

Please sign in to comment.