Add machine workshop, typed logic, mechanics and sensor-driven ECUs

This commit is contained in:
max
2026-11-02 07:27:13 +01:00
parent eb2b6366c2
commit abfcce0f46
99 changed files with 28835 additions and 145 deletions

View 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&);
}