52 lines
2.3 KiB
C++
52 lines
2.3 KiB
C++
#pragma once
|
|
#include <cstdint>
|
|
#include <optional>
|
|
#include <string>
|
|
#include <variant>
|
|
|
|
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<bool,double> value{false};
|
|
SignalValidity validity{SignalValidity::Missing};
|
|
double timestamp{};
|
|
std::optional<SignalTiming> 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<std::monostate,bool,double> default_value;
|
|
std::optional<double> 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&);
|
|
}
|