Add machine workshop, typed logic, mechanics and sensor-driven ECUs
This commit is contained in:
51
include/FluidSim/MachinePorts.hpp
Normal file
51
include/FluidSim/MachinePorts.hpp
Normal file
@@ -0,0 +1,51 @@
|
||||
#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&);
|
||||
}
|
||||
Reference in New Issue
Block a user