#pragma once #include "FluidSim/MachinePorts.hpp" #include #include #include namespace fluidsim::port { enum class MachineSensorKind {Pressure,DifferentialPressure,GasTemperature,MassFlow,Crank,ThrottlePosition}; inline constexpr int machine_sensor_kind_count=6; struct MachineSensorTap { std::uint32_t part{}; float position{.5f}; // Normalized pipe arclength, independent of fluid cells. std::string label; // Retains the intended host when a binding is unresolved. bool operator==(const MachineSensorTap&)const=default; }; struct MachineSensor { std::uint32_t id{}; MachineSensorKind kind{MachineSensorKind::Pressure}; std::string name; MachineSensorTap target,reference; float angle_offset{}; // Radians, added to the physical shaft angle. bool operator==(const MachineSensor&)const=default; }; enum class MachineSensorStatus {Valid,MissingHost,IncompatibleHost,Fault}; struct MachineSensorState { std::uint32_t id{}; std::array outputs; unsigned count{}; MachineSensorStatus status{MachineSensorStatus::MissingHost}; // An ideal crank pickup preserves provenance and unwrapped crossings. An // arbitrary numeric RPM signal must never acquire timing authority from it. std::uint32_t timing_shaft{}; double unwrapped_angle{}; }; const char* machine_sensor_key(MachineSensorKind); const char* machine_sensor_name(MachineSensorKind); const char* machine_sensor_status_name(MachineSensorStatus); unsigned machine_sensor_output_count(MachineSensorKind); MachinePortDescriptor machine_sensor_output(const MachineSensor&,unsigned); }