1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
//! Traits defining power flow interfaces for various powertrain components
use self::vehicle_model::VehicleState;
use super::*;
pub trait Powertrain {
/// Sets maximum possible positive and negative propulsion-related powers
/// this component/system can produce, accounting for any aux-related power
/// required.
/// # Arguments
/// - `pwr_upstream`: power (in forward and backward/regen directions) available from upstream component, where applicable
/// - `pwr_aux`: aux-related power required from this component
/// - `dt`: simulation time step size
/// - `veh_state`: the vehicle state
fn set_curr_pwr_prop_out_max(
&mut self,
pwr_upstream: (si::Power, si::Power),
pwr_aux: si::Power,
dt: si::Time,
veh_state: &VehicleState,
) -> anyhow::Result<()>;
/// Returns maximum achievable positive and negative propulsion powers after
/// [Powertrain::set_curr_pwr_prop_out_max] has been called.
fn get_curr_pwr_prop_out_max(&self) -> anyhow::Result<(si::Power, si::Power)>;
/// Solves for this powertrain system/component efficiency and sets/returns power output values.
/// # Arguments
/// - `pwr_out_req`: propulsion-related power output required
/// - `veh_state`: state of vehicle
/// - `enabled`: whether the component is active in current time step (e.g. engine idling v. shut off)
/// - `dt`: simulation time step size
/// # Returns
/// - Some(si::Power) if this is a pass-through component (e.g. [ElectricMachine])
fn solve(
&mut self,
pwr_out_req: si::Power,
enabled: bool,
dt: si::Time,
) -> anyhow::Result<Option<si::Power>>;
/// Returns regen power after `Powertrain::solve` has been called
fn pwr_regen(&self) -> anyhow::Result<si::Power>;
}