From 1f56132bb656fae52a89eeb590169663f6373ffc Mon Sep 17 00:00:00 2001 From: xingchen <1098756313@qq.com> Date: Fri, 25 Sep 2026 11:56:52 +0800 Subject: [PATCH] feat: add src/fusion.cpp --- src/fusion.cpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/fusion.cpp 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"; +}