From d9e025fbb7fa10f3c8a4e75f0135eacdba9642d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xose=20P=C3=A9rez?= Date: Mon, 21 May 2018 11:53:05 +0200 Subject: [PATCH] Fix overflow in CSE7766 energy calculation (#856) --- code/espurna/sensors/CSE7766Sensor.h | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/code/espurna/sensors/CSE7766Sensor.h b/code/espurna/sensors/CSE7766Sensor.h index 9a013020..7aa58364 100644 --- a/code/espurna/sensors/CSE7766Sensor.h +++ b/code/espurna/sensors/CSE7766Sensor.h @@ -270,10 +270,16 @@ class CSE7766Sensor : public BaseSensor { } // Calculate energy - static unsigned long cf_pulses_last = 0; - unsigned long cf_pulses = _data[21] << 8 | _data[22]; + unsigned int difference; + static unsigned int cf_pulses_last = 0; + unsigned int cf_pulses = _data[21] << 8 | _data[22]; if (0 == cf_pulses_last) cf_pulses_last = cf_pulses; - _energy += (cf_pulses - cf_pulses_last) * (float) _coefP / 1000000.0; + if (cf_pulses < cf_pulses_last) { + difference = cf_pulses + (0xFFFF - cf_pulses_last) + 1; + } else { + difference = cf_pulses - cf_pulses_last; + } + _energy += difference * (float) _coefP / 1000000.0; cf_pulses_last = cf_pulses; }