Skip to content

Commit

Permalink
feat(cond): a380 temperature control and ventilation
Browse files Browse the repository at this point in the history
FBW PR 8086
  • Loading branch information
Revyn112 committed Oct 21, 2023
1 parent b12d100 commit 4f23afd
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 28 deletions.
52 changes: 38 additions & 14 deletions hdw-a339x-acj/src/wasm/systems/a320_systems/src/air_conditioning.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use systems::{
AdirsToAirCondInterface, Air, AirConditioningOverheadShared, AirConditioningPack, CabinFan,
Channel, DuctTemperature, MixerUnit, OutflowValveSignal, OutletAir, OverheadFlowSelector,
PackFlowControllers, PressurizationConstants, PressurizationOverheadShared, TrimAirSystem,
ZoneType,
VcmShared, ZoneType,
},
overhead::{
AutoManFaultPushButton, NormalOnPushButton, OnOffFaultPushButton, OnOffPushButton,
Expand All @@ -33,7 +33,7 @@ use systems::{
use std::time::Duration;
use uom::si::{
f64::*, pressure::hectopascal, ratio::percent, thermodynamic_temperature::degree_celsius,
velocity::knot,
velocity::knot, volume::cubic_meter, volume_rate::liter_per_second,
};

use crate::payload::A320Pax;
Expand Down Expand Up @@ -177,7 +177,7 @@ impl A320Cabin {
fn update(
&mut self,
context: &UpdateContext,
air_conditioning_system: &(impl OutletAir + DuctTemperature),
air_conditioning_system: &(impl OutletAir + DuctTemperature + VcmShared),
lgciu: [&impl LgciuWeightOnWheels; 2],
number_of_passengers: &impl NumberOfPassengers,
pressurization: &A320PressurizationSystem,
Expand Down Expand Up @@ -251,6 +251,8 @@ pub struct A320AirConditioningSystem {
}

impl A320AirConditioningSystem {
const CAB_FAN_DESIGN_FLOW_RATE_L_S: f64 = 325.; // litres/sec

pub(crate) fn new(context: &mut InitContext, cabin_zones: &[ZoneType; 3]) -> Self {
Self {
acs_interface: [
Expand Down Expand Up @@ -298,15 +300,29 @@ impl A320AirConditioningSystem {
),
],
cabin_fans: [
CabinFan::new(1, ElectricalBusType::AlternatingCurrent(1)),
CabinFan::new(2, ElectricalBusType::AlternatingCurrent(2)),
CabinFan::new(
1,
VolumeRate::new::<liter_per_second>(Self::CAB_FAN_DESIGN_FLOW_RATE_L_S),
ElectricalBusType::AlternatingCurrent(1),
),
CabinFan::new(
2,
VolumeRate::new::<liter_per_second>(Self::CAB_FAN_DESIGN_FLOW_RATE_L_S),
ElectricalBusType::AlternatingCurrent(2),
),
],
mixer_unit: MixerUnit::new(cabin_zones),
packs: [
AirConditioningPack::new(Pack(1)),
AirConditioningPack::new(Pack(2)),
AirConditioningPack::new(context, Pack(1)),
AirConditioningPack::new(context, Pack(2)),
],
trim_air_system: TrimAirSystem::new(context, cabin_zones, &[1]),
trim_air_system: TrimAirSystem::new(
context,
cabin_zones,
&[1],
Volume::new::<cubic_meter>(4.),
Volume::new::<cubic_meter>(0.03),
),

air_conditioning_overhead: A320AirConditioningSystemOverhead::new(context, cabin_zones),
}
Expand Down Expand Up @@ -423,9 +439,9 @@ impl A320AirConditioningSystem {
self.trim_air_system.update(
context,
&self.mixer_unit,
&[
&self.acsc[0].trim_air_pressure_regulating_valve_controller(),
&self.acsc[1].trim_air_pressure_regulating_valve_controller(),
[
self.acsc[0].trim_air_pressure_regulating_valve_controller(),
self.acsc[1].trim_air_pressure_regulating_valve_controller(),
],
&[&self.acsc[0], &self.acsc[1], &self.acsc[1]],
);
Expand Down Expand Up @@ -480,15 +496,21 @@ impl OutletAir for A320AirConditioningSystem {
outlet_air.set_temperature(self.duct_temperature().iter().average());

outlet_air

// TODO: This should use self.trim_air_system.outlet_air()
}
}

// This is not used in the A320
impl VcmShared for A320AirConditioningSystem {}

impl SimulationElement for A320AirConditioningSystem {
fn accept<V: SimulationElementVisitor>(&mut self, visitor: &mut V) {
accept_iterable!(self.acs_interface, visitor);
accept_iterable!(self.acsc, visitor);
self.trim_air_system.accept(visitor);
accept_iterable!(self.cabin_fans, visitor);
accept_iterable!(self.packs, visitor);

self.air_conditioning_overhead.accept(visitor);

Expand Down Expand Up @@ -549,7 +571,7 @@ impl AirConditioningSystemInterfaceUnit {
self.discrete_word_1.set_bit(21, acsc.channel_1_inop());
self.discrete_word_1.set_bit(22, acsc.channel_2_inop());
self.discrete_word_1
.set_bit(23, acs_overhead.hot_air_pushbutton_is_on());
.set_bit(23, acs_overhead.hot_air_pushbutton_is_on(1));
self.discrete_word_1.set_bit(24, acsc.galley_fan_fault());
self.discrete_word_1.set_bit(25, cabin_fans[0].has_fault());
self.discrete_word_1.set_bit(26, cabin_fans[1].has_fault());
Expand Down Expand Up @@ -636,7 +658,7 @@ impl<const ZONES: usize> AirConditioningOverheadShared
self.pack_pbs.iter().map(|pack| pack.is_on()).collect()
}

fn hot_air_pushbutton_is_on(&self) -> bool {
fn hot_air_pushbutton_is_on(&self, _hot_air_id: usize) -> bool {
self.hot_air_pb.is_on()
}

Expand Down Expand Up @@ -827,8 +849,10 @@ struct A320PressurizationConstants;

impl PressurizationConstants for A320PressurizationConstants {
// Volume data from A320 AIRCRAFT CHARACTERISTICS - AIRPORT AND MAINTENANCE PLANNING
const CABIN_VOLUME_CUBIC_METER: f64 = 139.; // m3
const CABIN_ZONE_VOLUME_CUBIC_METER: f64 = 139.; // m3
const COCKPIT_VOLUME_CUBIC_METER: f64 = 9.; // m3
const FWD_CARGO_ZONE_VOLUME_CUBIC_METER: f64 = 0.; // m3 Not used in A320
const BULK_CARGO_ZONE_VOLUME_CUBIC_METER: f64 = 0.; // m3 Not used in A320
const PRESSURIZED_FUSELAGE_VOLUME_CUBIC_METER: f64 = 330.; // m3
const CABIN_LEAKAGE_AREA: f64 = 0.0003; // m2
const OUTFLOW_VALVE_SIZE: f64 = 0.05; // m2
Expand Down
49 changes: 36 additions & 13 deletions hdw-a339x/src/wasm/systems/a320_systems/src/air_conditioning.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use systems::{
AdirsToAirCondInterface, Air, AirConditioningOverheadShared, AirConditioningPack, CabinFan,
Channel, DuctTemperature, MixerUnit, OutflowValveSignal, OutletAir, OverheadFlowSelector,
PackFlowControllers, PressurizationConstants, PressurizationOverheadShared, TrimAirSystem,
ZoneType,
VcmShared, ZoneType,
},
overhead::{
AutoManFaultPushButton, NormalOnPushButton, OnOffFaultPushButton, OnOffPushButton,
Expand All @@ -33,7 +33,7 @@ use systems::{
use std::time::Duration;
use uom::si::{
f64::*, pressure::hectopascal, ratio::percent, thermodynamic_temperature::degree_celsius,
velocity::knot,
velocity::knot, volume::cubic_meter, volume_rate::liter_per_second,
};

use crate::payload::A320Pax;
Expand Down Expand Up @@ -177,7 +177,7 @@ impl A320Cabin {
fn update(
&mut self,
context: &UpdateContext,
air_conditioning_system: &(impl OutletAir + DuctTemperature),
air_conditioning_system: &(impl OutletAir + DuctTemperature + VcmShared),
lgciu: [&impl LgciuWeightOnWheels; 2],
number_of_passengers: &impl NumberOfPassengers,
pressurization: &A320PressurizationSystem,
Expand Down Expand Up @@ -258,6 +258,8 @@ pub struct A320AirConditioningSystem {
}

impl A320AirConditioningSystem {
const CAB_FAN_DESIGN_FLOW_RATE_L_S: f64 = 325.; // litres/sec

pub(crate) fn new(context: &mut InitContext, cabin_zones: &[ZoneType; 3]) -> Self {
Self {
acs_interface: [
Expand Down Expand Up @@ -305,15 +307,29 @@ impl A320AirConditioningSystem {
),
],
cabin_fans: [
CabinFan::new(1, ElectricalBusType::AlternatingCurrent(1)),
CabinFan::new(2, ElectricalBusType::AlternatingCurrent(2)),
CabinFan::new(
1,
VolumeRate::new::<liter_per_second>(Self::CAB_FAN_DESIGN_FLOW_RATE_L_S),
ElectricalBusType::AlternatingCurrent(1),
),
CabinFan::new(
2,
VolumeRate::new::<liter_per_second>(Self::CAB_FAN_DESIGN_FLOW_RATE_L_S),
ElectricalBusType::AlternatingCurrent(2),
),
],
mixer_unit: MixerUnit::new(cabin_zones),
packs: [
AirConditioningPack::new(Pack(1)),
AirConditioningPack::new(Pack(2)),
AirConditioningPack::new(context, Pack(1)),
AirConditioningPack::new(context, Pack(2)),
],
trim_air_system: TrimAirSystem::new(context, cabin_zones, &[1]),
trim_air_system: TrimAirSystem::new(
context,
cabin_zones,
&[1],
Volume::new::<cubic_meter>(4.),
Volume::new::<cubic_meter>(0.03),
),

air_conditioning_overhead: A320AirConditioningSystemOverhead::new(context, cabin_zones),
}
Expand Down Expand Up @@ -431,8 +447,8 @@ impl A320AirConditioningSystem {
context,
&self.mixer_unit,
&[
&self.acsc[0].trim_air_pressure_regulating_valve_controller(),
&self.acsc[1].trim_air_pressure_regulating_valve_controller(),
self.acsc[0].trim_air_pressure_regulating_valve_controller(),
self.acsc[1].trim_air_pressure_regulating_valve_controller(),
],
&[&self.acsc[0], &self.acsc[1], &self.acsc[1]],
);
Expand Down Expand Up @@ -487,15 +503,20 @@ impl OutletAir for A320AirConditioningSystem {
outlet_air.set_temperature(self.duct_temperature().iter().average());

outlet_air
// TODO: This should use self.trim_air_system.outlet_air()
}
}

// This is not used in the A320
impl VcmShared for A320AirConditioningSystem {}

impl SimulationElement for A320AirConditioningSystem {
fn accept<V: SimulationElementVisitor>(&mut self, visitor: &mut V) {
accept_iterable!(self.acs_interface, visitor);
accept_iterable!(self.acsc, visitor);
self.trim_air_system.accept(visitor);
accept_iterable!(self.cabin_fans, visitor);
accept_iterable!(self.packs, visitor);

self.air_conditioning_overhead.accept(visitor);

Expand Down Expand Up @@ -556,7 +577,7 @@ impl AirConditioningSystemInterfaceUnit {
self.discrete_word_1.set_bit(21, acsc.channel_1_inop());
self.discrete_word_1.set_bit(22, acsc.channel_2_inop());
self.discrete_word_1
.set_bit(23, acs_overhead.hot_air_pushbutton_is_on());
.set_bit(23, acs_overhead.hot_air_pushbutton_is_on(1));
self.discrete_word_1.set_bit(24, acsc.galley_fan_fault());
self.discrete_word_1.set_bit(25, cabin_fans[0].has_fault());
self.discrete_word_1.set_bit(26, cabin_fans[1].has_fault());
Expand Down Expand Up @@ -643,7 +664,7 @@ impl<const ZONES: usize> AirConditioningOverheadShared
self.pack_pbs.iter().map(|pack| pack.is_on()).collect()
}

fn hot_air_pushbutton_is_on(&self) -> bool {
fn hot_air_pushbutton_is_on(&self, _hot_air_id: usize) -> bool {
self.hot_air_pb.is_on()
}

Expand Down Expand Up @@ -834,8 +855,10 @@ struct A320PressurizationConstants;

impl PressurizationConstants for A320PressurizationConstants {
// Volume data from A320 AIRCRAFT CHARACTERISTICS - AIRPORT AND MAINTENANCE PLANNING
const CABIN_VOLUME_CUBIC_METER: f64 = 139.; // m3
const CABIN_ZONE_VOLUME_CUBIC_METER: f64 = 139.; // m3
const COCKPIT_VOLUME_CUBIC_METER: f64 = 9.; // m3
const FWD_CARGO_ZONE_VOLUME_CUBIC_METER: f64 = 0.; // m3 Not used in A320
const BULK_CARGO_ZONE_VOLUME_CUBIC_METER: f64 = 0.; // m3 Not used in A320
const PRESSURIZED_FUSELAGE_VOLUME_CUBIC_METER: f64 = 330.; // m3
const CABIN_LEAKAGE_AREA: f64 = 0.0003; // m2
const OUTFLOW_VALVE_SIZE: f64 = 0.05; // m2
Expand Down

0 comments on commit 4f23afd

Please sign in to comment.