pub mod builder;
pub mod input;
pub mod output;
pub mod measurements;
pub mod set_points;
pub mod prelude;
use input::ControllerInput;
use output::ControllerOutput;
use set_points::ControllerSetPoints;
use measurements::FlowMeasurementSettings;
use stormath::type_aliases::Float;
#[derive(Debug, Clone)]
pub struct Controller {
pub set_points: Vec<ControllerSetPoints>,
pub flow_measurement_settings: FlowMeasurementSettings,
pub time_steps_between_updates: usize,
pub start_time: Float,
pub time_step_index: usize,
pub use_input_velocity_for_apparent_wind_direction: bool,
}
impl Controller {
pub fn update(
&self,
time: Float,
time_step: Float,
input: &[ControllerInput],
) -> Option<Vec<ControllerOutput>> {
let initialization_done = time >= self.start_time;
let time_to_update = self.time_step_index % self.time_steps_between_updates == 0;
let first_time_step = self.time_step_index == 1;
if first_time_step || (time_to_update && initialization_done) {
let nr_wings = self.set_points.len();
let mut out = Vec::with_capacity(nr_wings);
for i in 0..nr_wings {
let output_single = self.set_points[i].get_new_output(&input[i], time_step);
out.push(output_single)
}
return Some(out)
}
None
}
}