feat: add src/fusion.cpp
This commit is contained in:
23
src/fusion.cpp
Normal file
23
src/fusion.cpp
Normal file
@@ -0,0 +1,23 @@
|
||||
#include "fusion.hpp"
|
||||
#include <cmath>
|
||||
|
||||
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";
|
||||
}
|
||||
Reference in New Issue
Block a user