fmi-sim 0.5.0

A pure Rust FMI simulator
Documentation
use fmi::{
    fmi2::{import::Fmi2Import, instance::InstanceME},
    traits::FmiInstance,
};

use crate::{
    Error,
    sim::{
        InputState, RecorderState, SimState, SimStateTrait,
        io::StartValues,
        params::SimParams,
        traits::{InstSetValues, SimApplyStartValues},
    },
};

impl<'a> SimStateTrait<'a, InstanceME<'a>, Fmi2Import> for SimState<InstanceME<'a>> {
    fn new(
        import: &'a Fmi2Import,
        sim_params: SimParams,
        input_state: InputState<InstanceME<'a>>,
        recorder_state: RecorderState<InstanceME<'a>>,
    ) -> Result<Self, Error> {
        log::trace!("Instantiating ME Simulation: {sim_params:#?}");
        let inst = import.instantiate_me("inst1", true, true)?;
        Ok(Self {
            sim_params,
            input_state,
            recorder_state,
            inst,
            next_event_time: None,
        })
    }
}

impl SimApplyStartValues<InstanceME<'_>> for SimState<InstanceME<'_>> {
    fn apply_start_values(
        &mut self,
        start_values: &StartValues<<InstanceME as FmiInstance>::ValueRef>,
    ) -> Result<(), Error> {
        start_values.variables.iter().for_each(|(vr, ary)| {
            self.inst.set_array(&[*vr], ary);
        });
        Ok(())
    }
}