#pragma once #include #include #include #include namespace fluidsim::port { enum class PortDomain {Gas,Rotational,Translational,Boolean,Number,EcuAssignment}; enum class PortDirection {Bidirectional,Input,Output}; enum class PortCardinality {Single,Multiple}; // Quantities carry meaning as well as dimensions. Opening and scalar, or crank // angle and cycle phase, require an explicit conversion even when units match. enum class SignalQuantity {None,Scalar,Fraction,Pressure,Temperature,MassFlow,FreshAirMassFlow,AngularSpeed,Angle,CyclePhase,Torque,Power,Position,Velocity,Force,Time,Inertia}; enum class PressureReference {None,Absolute,Gauge,Differential}; enum class SignalValidity {Valid,Missing,Fault}; // Runtime-only pickup evidence. Arithmetic creates new values without timing // authority; routing retains the original acquisition time, including delays. struct SignalTiming { std::uint32_t sensor{},shaft{}; double sampled_at{},unwrapped_angle{},angular_speed{}; bool operator==(const SignalTiming&)const=default; }; struct SignalValue { std::variant value{false}; SignalValidity validity{SignalValidity::Missing}; double timestamp{}; std::optional timing; static SignalValue boolean(bool,double timestamp=0); static SignalValue number(double,double timestamp=0); }; struct MachinePortDescriptor { std::string key,name; PortDomain domain{PortDomain::Gas}; PortDirection direction{PortDirection::Bidirectional}; PortCardinality cardinality{PortCardinality::Single}; SignalQuantity quantity{SignalQuantity::None}; PressureReference pressure_reference{PressureReference::None}; bool required{}; std::variant default_value; std::optional minimum,maximum; bool operator==(const MachinePortDescriptor&)const=default; }; struct PortCompatibility {bool allowed{};std::string message;}; const char* port_domain_key(PortDomain); const char* signal_quantity_key(SignalQuantity); const char* signal_quantity_unit(SignalQuantity); // Internal SI units. bool signal_domain(PortDomain); void validate_port_descriptor(const MachinePortDescriptor&); PortCompatibility port_compatibility(const MachinePortDescriptor&,const MachinePortDescriptor&); bool signal_value_valid_for(const SignalValue&,const MachinePortDescriptor&); }