diff --git a/src/fusion.cpp b/src/fusion.cpp new file mode 100644 index 0000000..457fed2 --- /dev/null +++ b/src/fusion.cpp @@ -0,0 +1,23 @@ +#include "fusion.hpp" +#include + +FusionResult fuse(const ChannelAssessment& primary, const ChannelAssessment& secondary) { + bool a = primary.state == ChannelState::Healthy; + bool b = secondary.state == ChannelState::Healthy; + if (!a && !b) return {FusionState::Unavailable, std::nullopt, "none"}; + if (a && !b) return {FusionState::Degraded, primary.reading.celsius, primary.reading.channel}; + if (!a && b) return {FusionState::Degraded, secondary.reading.celsius, secondary.reading.channel}; + if (std::abs(primary.reading.celsius - secondary.reading.celsius) > 3.0) + return {FusionState::Conflict, std::nullopt, "conflict"}; + return {FusionState::Nominal, (primary.reading.celsius + secondary.reading.celsius) / 2.0, "dual"}; +} + +const char* state_name(FusionState state) { + switch (state) { + case FusionState::Nominal: return "nominal"; + case FusionState::Degraded: return "degraded"; + case FusionState::Conflict: return "conflict"; + case FusionState::Unavailable: return "unavailable"; + } + return "unknown"; +}