diff --git a/firmware/controllers/sensors/converters/func_chain.h b/firmware/controllers/sensors/converters/func_chain.h index f28aa371ca..6d6db39a17 100644 --- a/firmware/controllers/sensors/converters/func_chain.h +++ b/firmware/controllers/sensors/converters/func_chain.h @@ -24,6 +24,10 @@ protected: // Base case is the identity function return {true, input}; } + + void showInfo(Logging* logger, float testInputValue) const { + // base case does nothing + } }; template @@ -58,6 +62,17 @@ public: return TBase::template get(); } + void showInfo(Logging* logger, float testInputValue) const { + // Print info about this level + m_f.showInfo(logger, testInputValue); + + // If valid, recurse down + auto res = m_f.convert(testInputValue); + if (res.Valid) { + TBase::showInfo(logger, res.Value); + } + } + private: TFirst m_f; }; @@ -77,6 +92,10 @@ public: return m_fs.template get(); } + void showInfo(Logging* logger, float testInputValue) const override { + m_fs.showInfo(logger, testInputValue); + } + private: priv::FuncChain m_fs; }; diff --git a/firmware/controllers/sensors/converters/linear_func.cpp b/firmware/controllers/sensors/converters/linear_func.cpp index 19f4f7c074..10ed4d3ef0 100644 --- a/firmware/controllers/sensors/converters/linear_func.cpp +++ b/firmware/controllers/sensors/converters/linear_func.cpp @@ -21,3 +21,9 @@ SensorResult LinearFunc::convert(float inputValue) const { return {isValid, result}; } + +void LinearFunc::showInfo(Logging* logger, float testRawValue) const { + scheduleMsg(logger, " Linear function slope: %.2f offset: %.2f min: %.1f max: %.1f", m_a, m_b, m_minOutput, m_maxOutput); + const auto [valid, value] = convert(testRawValue); + scheduleMsg(logger, " raw value %.2f converts to %.2f", testRawValue, value); +} diff --git a/firmware/controllers/sensors/converters/linear_func.h b/firmware/controllers/sensors/converters/linear_func.h index 2350ea9db0..15c1cfc529 100644 --- a/firmware/controllers/sensors/converters/linear_func.h +++ b/firmware/controllers/sensors/converters/linear_func.h @@ -10,6 +10,8 @@ public: SensorResult convert(float inputValue) const override; + void showInfo(Logging* logger, float testRawValue) const override; + private: // Linear equation parameters for equation of form // y = ax + b diff --git a/firmware/controllers/sensors/converters/resistance_func.cpp b/firmware/controllers/sensors/converters/resistance_func.cpp index 8f39c71c3f..b3d2bc22e4 100644 --- a/firmware/controllers/sensors/converters/resistance_func.cpp +++ b/firmware/controllers/sensors/converters/resistance_func.cpp @@ -3,6 +3,7 @@ */ #include "resistance_func.h" +#include "loggingcentral.h" void ResistanceFunc::configure(float supplyVoltage, float pullupResistor) { m_pullupResistor = pullupResistor; @@ -25,3 +26,8 @@ SensorResult ResistanceFunc::convert(float raw) const { return {true, resistance}; } + +void ResistanceFunc::showInfo(Logging* logger, float testInputValue) const { + const auto [valid, value] = convert(testInputValue); + scheduleMsg(logger, " %.2f volts -> %.1f ohms, with supply voltage %.2f and pullup %.1f.", testInputValue, value, m_supplyVoltage, m_pullupResistor); +} diff --git a/firmware/controllers/sensors/converters/resistance_func.h b/firmware/controllers/sensors/converters/resistance_func.h index 8f12577135..4afef36994 100644 --- a/firmware/controllers/sensors/converters/resistance_func.h +++ b/firmware/controllers/sensors/converters/resistance_func.h @@ -16,6 +16,8 @@ public: SensorResult convert(float inputValue) const override; + void showInfo(Logging* logger, float testInputValue) const override; + private: float m_supplyVoltage = 5.0f; float m_pullupResistor = 1000.0f; diff --git a/firmware/controllers/sensors/converters/sensor_converter_func.h b/firmware/controllers/sensors/converters/sensor_converter_func.h index ee13adb9aa..eeb8923d5f 100644 --- a/firmware/controllers/sensors/converters/sensor_converter_func.h +++ b/firmware/controllers/sensors/converters/sensor_converter_func.h @@ -2,6 +2,9 @@ #include "sensor.h" +class Logging; + struct SensorConverter { virtual SensorResult convert(float raw) const = 0; + virtual void showInfo(Logging* logger, float testRawValue) const {} }; diff --git a/firmware/controllers/sensors/converters/thermistor_func.h b/firmware/controllers/sensors/converters/thermistor_func.h index ea9f2e715e..23e724948e 100644 --- a/firmware/controllers/sensors/converters/thermistor_func.h +++ b/firmware/controllers/sensors/converters/thermistor_func.h @@ -2,7 +2,7 @@ * @author Matthew Kennedy, (c) 2019 * * A function to convert resistance to thermistor temperature (NTC). Uses the - * Steinhart-Hart equation to prevent having to compute many logarithms at runtime. + * Steinhart-Hart equation to avoid having to compute many logarithms at runtime. */ #pragma once diff --git a/firmware/controllers/sensors/sensor_info_printing.cpp b/firmware/controllers/sensors/sensor_info_printing.cpp index 40e302ad10..0db441a14c 100644 --- a/firmware/controllers/sensors/sensor_info_printing.cpp +++ b/firmware/controllers/sensors/sensor_info_printing.cpp @@ -10,4 +10,9 @@ void ProxySensor::showInfo(Logging* logger, const char* sensorName) const { void FunctionalSensor::showInfo(Logging* logger, const char* sensorName) const { const auto [valid, value] = get(); scheduleMsg(logger, "Sensor \"%s\": Raw value: %.2f Valid: %d Converted value %.2f", sensorName, m_rawValue, valid, value); + + // now print out the underlying function's info + if (auto func = m_function) { + func->showInfo(logger, m_rawValue); + } }