41 lines
1.6 KiB
C++
41 lines
1.6 KiB
C++
#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);
|
|
}
|