Skip to content

Commit 7c549c3

Browse files
committed
Fix code review comments - Changed temperature types to int16_t (signed). Avoided divide by 0.
1 parent 4820a7e commit 7c549c3

File tree

2 files changed

+25
-19
lines changed

2 files changed

+25
-19
lines changed

examples/energy-management-app/energy-management-common/water-heater/include/WhmDelegate.h

+8-8
Original file line numberDiff line numberDiff line change
@@ -152,14 +152,14 @@ class WaterHeaterManagementDelegate : public WaterHeaterManagement::Delegate
152152
*
153153
* @param waterTemperature The water temperature in 100th's Celsius
154154
*/
155-
void SetWaterTemperature(uint16_t waterTemperature);
155+
void SetWaterTemperature(int16_t waterTemperature);
156156

157157
/**
158158
* @brief Set the target water temperature of the tank
159159
*
160160
* @param targetWaterTemperature The water temperature in 100th's Celsius
161161
*/
162-
void SetTargetWaterTemperature(uint16_t targetWaterTemperature);
162+
void SetTargetWaterTemperature(int16_t targetWaterTemperature);
163163

164164
/**
165165
* @brief Determine whether the heating sources need to be turned on or off or left unchanged.
@@ -197,15 +197,15 @@ class WaterHeaterManagementDelegate : public WaterHeaterManagement::Delegate
197197
* @param replacedWaterTemperature The temperature of the
198198
* percentageReplaced water.
199199
*/
200-
void DrawOffHotWater(Percent percentageReplaced, uint16_t replacedWaterTemperature);
200+
void DrawOffHotWater(Percent percentageReplaced, int16_t replacedWaterTemperature);
201201

202202
/**
203203
* Set the temperature of the cold water that fills the tank as the hot water
204204
* is drawn off.
205205
*
206206
* @param coldWaterTemperature The cold water temperature in 100th of a C
207207
*/
208-
void SetColdWaterTemperature(uint16_t coldWaterTemperature);
208+
void SetColdWaterTemperature(int16_t coldWaterTemperature);
209209

210210
private:
211211
/**
@@ -215,7 +215,7 @@ class WaterHeaterManagementDelegate : public WaterHeaterManagement::Delegate
215215
*
216216
* @return the target temperature
217217
*/
218-
uint16_t GetActiveTargetWaterTemperature() const;
218+
int16_t GetActiveTargetWaterTemperature() const;
219219

220220
/**
221221
* @brief Calculate the percentage of the water in the tank at the target
@@ -251,13 +251,13 @@ class WaterHeaterManagementDelegate : public WaterHeaterManagement::Delegate
251251
WhmManufacturer * mpWhmManufacturer;
252252

253253
// Target water temperature in 100ths of a C
254-
uint16_t mTargetWaterTemperature;
254+
int16_t mTargetWaterTemperature;
255255

256256
// Actual water temperature in 100ths of a C
257-
uint16_t mWaterTemperature;
257+
int16_t mWaterTemperature;
258258

259259
// The cold water temperature in 100ths of a C
260-
uint16_t mColdWaterTemperature;
260+
int16_t mColdWaterTemperature;
261261

262262
// Boost command parameters
263263

examples/energy-management-app/energy-management-common/water-heater/src/WhmDelegateImpl.cpp

+17-11
Original file line numberDiff line numberDiff line change
@@ -300,37 +300,43 @@ Status WaterHeaterManagementDelegate::HandleCancelBoost()
300300
*
301301
*********************************************************************************/
302302

303-
uint16_t WaterHeaterManagementDelegate::GetActiveTargetWaterTemperature() const
303+
int16_t WaterHeaterManagementDelegate::GetActiveTargetWaterTemperature() const
304304
{
305305
// Determine the target temperature. If a boost command is in progress and has a mBoostTemporarySetpoint value use that as the
306306
// target temperature.
307307
// Note, in practise the actual heating is likely to be controlled by the thermostat's occupiedHeatingSetpoint most of the
308308
// time, and the TemporarySetpoint (if not null) would be overiding the thermostat's occupiedHeatingSetpoint.
309309
// However, this code doesn't rely upon the thermostat cluster.
310-
uint16_t targetTemperature = (mBoostState == BoostStateEnum::kActive && mBoostTemporarySetpoint.HasValue())
311-
? static_cast<uint16_t>(mBoostTemporarySetpoint.Value())
310+
int16_t targetTemperature = (mBoostState == BoostStateEnum::kActive && mBoostTemporarySetpoint.HasValue())
311+
? static_cast<int16_t>(mBoostTemporarySetpoint.Value())
312312
: mTargetWaterTemperature;
313313

314314
return targetTemperature;
315315
}
316316

317317
uint8_t WaterHeaterManagementDelegate::CalculateTankPercentage() const
318318
{
319-
int32_t tankPercentage = 100 * (static_cast<int32_t>(mWaterTemperature) - static_cast<int32_t>(mColdWaterTemperature)) /
320-
(static_cast<int32_t>(GetActiveTargetWaterTemperature()) - static_cast<int32_t>(mColdWaterTemperature));
319+
int32_t tankPercentage;
320+
int32_t divisor = static_cast<int32_t>(GetActiveTargetWaterTemperature()) - static_cast<int32_t>(mColdWaterTemperature);
321321

322+
tankPercentage = 100;
323+
if (divisor >= 0)
324+
{
325+
tankPercentage = 100 * (static_cast<int32_t>(mWaterTemperature) - static_cast<int32_t>(mColdWaterTemperature)) / divisor;
326+
}
327+
322328
tankPercentage = std::min(tankPercentage, static_cast<int32_t>(100));
323329
tankPercentage = std::max(tankPercentage, static_cast<int32_t>(0));
324330

325331
return static_cast<uint8_t>(tankPercentage);
326332
}
327333

328-
void WaterHeaterManagementDelegate::SetColdWaterTemperature(uint16_t coldWaterTemperature)
334+
void WaterHeaterManagementDelegate::SetColdWaterTemperature(int16_t coldWaterTemperature)
329335
{
330336
mColdWaterTemperature = coldWaterTemperature;
331337
}
332338

333-
void WaterHeaterManagementDelegate::SetWaterTemperature(uint16_t waterTemperature)
339+
void WaterHeaterManagementDelegate::SetWaterTemperature(int16_t waterTemperature)
334340
{
335341
mWaterTemperature = waterTemperature;
336342

@@ -344,18 +350,18 @@ void WaterHeaterManagementDelegate::SetWaterTemperature(uint16_t waterTemperatur
344350
ChangeHeatingIfNecessary();
345351
}
346352

347-
void WaterHeaterManagementDelegate::SetTargetWaterTemperature(uint16_t targetWaterTemperature)
353+
void WaterHeaterManagementDelegate::SetTargetWaterTemperature(int16_t targetWaterTemperature)
348354
{
349355
mTargetWaterTemperature = targetWaterTemperature;
350356

351357
// See if the heat needs to be turned on or off
352358
ChangeHeatingIfNecessary();
353359
}
354360

355-
void WaterHeaterManagementDelegate::DrawOffHotWater(Percent percentageReplaced, uint16_t replacedWaterTemperature)
361+
void WaterHeaterManagementDelegate::DrawOffHotWater(Percent percentageReplaced, int16_t replacedWaterTemperature)
356362
{
357363
// First calculate the new average water temperature
358-
mWaterTemperature = static_cast<uint16_t>(
364+
mWaterTemperature = static_cast<int16_t>(
359365
(mWaterTemperature * (100 - percentageReplaced) + replacedWaterTemperature * percentageReplaced) / 100);
360366

361367
// Replaces percentageReplaced% of the water in the tank with water of a temperature replacedWaterTemperature
@@ -370,7 +376,7 @@ void WaterHeaterManagementDelegate::DrawOffHotWater(Percent percentageReplaced,
370376

371377
bool WaterHeaterManagementDelegate::HasWaterTemperatureReachedTarget() const
372378
{
373-
uint16_t targetTemperature = GetActiveTargetWaterTemperature();
379+
int16_t targetTemperature = GetActiveTargetWaterTemperature();
374380

375381
if (mBoostState == BoostStateEnum::kActive)
376382
{

0 commit comments

Comments
 (0)