diff --git a/examples/energy-management-app/energy-management-common/water-heater/include/WhmDelegate.h b/examples/energy-management-app/energy-management-common/water-heater/include/WhmDelegate.h index e38325032864f0..dffa91b5297efc 100644 --- a/examples/energy-management-app/energy-management-common/water-heater/include/WhmDelegate.h +++ b/examples/energy-management-app/energy-management-common/water-heater/include/WhmDelegate.h @@ -152,14 +152,14 @@ class WaterHeaterManagementDelegate : public WaterHeaterManagement::Delegate * * @param waterTemperature The water temperature in 100th's Celsius */ - void SetWaterTemperature(uint16_t waterTemperature); + void SetWaterTemperature(int16_t waterTemperature); /** * @brief Set the target water temperature of the tank * * @param targetWaterTemperature The water temperature in 100th's Celsius */ - void SetTargetWaterTemperature(uint16_t targetWaterTemperature); + void SetTargetWaterTemperature(int16_t targetWaterTemperature); /** * @brief Determine whether the heating sources need to be turned on or off or left unchanged. @@ -197,7 +197,7 @@ class WaterHeaterManagementDelegate : public WaterHeaterManagement::Delegate * @param replacedWaterTemperature The temperature of the * percentageReplaced water. */ - void DrawOffHotWater(Percent percentageReplaced, uint16_t replacedWaterTemperature); + void DrawOffHotWater(Percent percentageReplaced, int16_t replacedWaterTemperature); /** * Set the temperature of the cold water that fills the tank as the hot water @@ -205,7 +205,7 @@ class WaterHeaterManagementDelegate : public WaterHeaterManagement::Delegate * * @param coldWaterTemperature The cold water temperature in 100th of a C */ - void SetColdWaterTemperature(uint16_t coldWaterTemperature); + void SetColdWaterTemperature(int16_t coldWaterTemperature); private: /** @@ -215,7 +215,7 @@ class WaterHeaterManagementDelegate : public WaterHeaterManagement::Delegate * * @return the target temperature */ - uint16_t GetActiveTargetWaterTemperature() const; + int16_t GetActiveTargetWaterTemperature() const; /** * @brief Calculate the percentage of the water in the tank at the target @@ -251,13 +251,13 @@ class WaterHeaterManagementDelegate : public WaterHeaterManagement::Delegate WhmManufacturer * mpWhmManufacturer; // Target water temperature in 100ths of a C - uint16_t mTargetWaterTemperature; + int16_t mTargetWaterTemperature; // Actual water temperature in 100ths of a C - uint16_t mWaterTemperature; + int16_t mWaterTemperature; // The cold water temperature in 100ths of a C - uint16_t mColdWaterTemperature; + int16_t mColdWaterTemperature; // Boost command parameters diff --git a/examples/energy-management-app/energy-management-common/water-heater/src/WhmDelegateImpl.cpp b/examples/energy-management-app/energy-management-common/water-heater/src/WhmDelegateImpl.cpp index 03d8b885c90abc..9c51ce409dad4c 100644 --- a/examples/energy-management-app/energy-management-common/water-heater/src/WhmDelegateImpl.cpp +++ b/examples/energy-management-app/energy-management-common/water-heater/src/WhmDelegateImpl.cpp @@ -300,15 +300,15 @@ Status WaterHeaterManagementDelegate::HandleCancelBoost() * *********************************************************************************/ -uint16_t WaterHeaterManagementDelegate::GetActiveTargetWaterTemperature() const +int16_t WaterHeaterManagementDelegate::GetActiveTargetWaterTemperature() const { // Determine the target temperature. If a boost command is in progress and has a mBoostTemporarySetpoint value use that as the // target temperature. // Note, in practise the actual heating is likely to be controlled by the thermostat's occupiedHeatingSetpoint most of the // time, and the TemporarySetpoint (if not null) would be overiding the thermostat's occupiedHeatingSetpoint. // However, this code doesn't rely upon the thermostat cluster. - uint16_t targetTemperature = (mBoostState == BoostStateEnum::kActive && mBoostTemporarySetpoint.HasValue()) - ? static_cast(mBoostTemporarySetpoint.Value()) + int16_t targetTemperature = (mBoostState == BoostStateEnum::kActive && mBoostTemporarySetpoint.HasValue()) + ? static_cast(mBoostTemporarySetpoint.Value()) : mTargetWaterTemperature; return targetTemperature; @@ -316,21 +316,27 @@ uint16_t WaterHeaterManagementDelegate::GetActiveTargetWaterTemperature() const uint8_t WaterHeaterManagementDelegate::CalculateTankPercentage() const { - int32_t tankPercentage = 100 * (static_cast(mWaterTemperature) - static_cast(mColdWaterTemperature)) / - (static_cast(GetActiveTargetWaterTemperature()) - static_cast(mColdWaterTemperature)); + int32_t tankPercentage; + int32_t divisor = static_cast(GetActiveTargetWaterTemperature()) - static_cast(mColdWaterTemperature); + tankPercentage = 100; + if (divisor >= 0) + { + tankPercentage = 100 * (static_cast(mWaterTemperature) - static_cast(mColdWaterTemperature)) / divisor; + } + tankPercentage = std::min(tankPercentage, static_cast(100)); tankPercentage = std::max(tankPercentage, static_cast(0)); return static_cast(tankPercentage); } -void WaterHeaterManagementDelegate::SetColdWaterTemperature(uint16_t coldWaterTemperature) +void WaterHeaterManagementDelegate::SetColdWaterTemperature(int16_t coldWaterTemperature) { mColdWaterTemperature = coldWaterTemperature; } -void WaterHeaterManagementDelegate::SetWaterTemperature(uint16_t waterTemperature) +void WaterHeaterManagementDelegate::SetWaterTemperature(int16_t waterTemperature) { mWaterTemperature = waterTemperature; @@ -344,7 +350,7 @@ void WaterHeaterManagementDelegate::SetWaterTemperature(uint16_t waterTemperatur ChangeHeatingIfNecessary(); } -void WaterHeaterManagementDelegate::SetTargetWaterTemperature(uint16_t targetWaterTemperature) +void WaterHeaterManagementDelegate::SetTargetWaterTemperature(int16_t targetWaterTemperature) { mTargetWaterTemperature = targetWaterTemperature; @@ -352,10 +358,10 @@ void WaterHeaterManagementDelegate::SetTargetWaterTemperature(uint16_t targetWat ChangeHeatingIfNecessary(); } -void WaterHeaterManagementDelegate::DrawOffHotWater(Percent percentageReplaced, uint16_t replacedWaterTemperature) +void WaterHeaterManagementDelegate::DrawOffHotWater(Percent percentageReplaced, int16_t replacedWaterTemperature) { // First calculate the new average water temperature - mWaterTemperature = static_cast( + mWaterTemperature = static_cast( (mWaterTemperature * (100 - percentageReplaced) + replacedWaterTemperature * percentageReplaced) / 100); // Replaces percentageReplaced% of the water in the tank with water of a temperature replacedWaterTemperature @@ -370,7 +376,7 @@ void WaterHeaterManagementDelegate::DrawOffHotWater(Percent percentageReplaced, bool WaterHeaterManagementDelegate::HasWaterTemperatureReachedTarget() const { - uint16_t targetTemperature = GetActiveTargetWaterTemperature(); + int16_t targetTemperature = GetActiveTargetWaterTemperature(); if (mBoostState == BoostStateEnum::kActive) {