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