1use fmi::{
2 fmi2::{import::Fmi2Import, instance::InstanceME},
3 traits::FmiInstance,
4};
5
6use crate::{
7 Error,
8 sim::{
9 InputState, RecorderState, SimState, SimStateTrait,
10 io::StartValues,
11 params::SimParams,
12 traits::{InstSetValues, SimApplyStartValues},
13 },
14};
15
16impl<'a> SimStateTrait<'a, InstanceME<'a>, Fmi2Import> for SimState<InstanceME<'a>> {
17 fn new(
18 import: &'a Fmi2Import,
19 sim_params: SimParams,
20 input_state: InputState<InstanceME<'a>>,
21 recorder_state: RecorderState<InstanceME<'a>>,
22 ) -> Result<Self, Error> {
23 log::trace!("Instantiating ME Simulation: {sim_params:#?}");
24 let inst = import.instantiate_me("inst1", true, true)?;
25 Ok(Self {
26 sim_params,
27 input_state,
28 recorder_state,
29 inst,
30 next_event_time: None,
31 })
32 }
33}
34
35impl SimApplyStartValues<InstanceME<'_>> for SimState<InstanceME<'_>> {
36 fn apply_start_values(
37 &mut self,
38 start_values: &StartValues<<InstanceME as FmiInstance>::ValueRef>,
39 ) -> Result<(), Error> {
40 start_values.variables.iter().for_each(|(vr, ary)| {
41 self.inst.set_array(&[*vr], ary);
42 });
43 Ok(())
44 }
45}