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,40 @@
#pragma once
#include "FluidSim/MachinePorts.hpp"
#include <array>
#include <cstdint>
#include <string>
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<SignalValue,3> 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);
}