aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJean-François Milants <jf@codingfield.com>2023-05-07 18:18:49 +0200
committerJF <JF002@users.noreply.github.com>2023-06-04 17:03:22 +0200
commita48d4e0b1330a34e32f56a6d4a65c77eca84f655 (patch)
tree131ef7075e24557599909a59046886c2089f5b46
parent32a9fff60c1c5d797cdf90f2c7f5c7241c8738c9 (diff)
Power optimization - Enable HRS3300 (heart rate sensor) sleep mode.
Put the HRS3300 to sleep mode when InfiniTime is going to sleep. This change reduces the power consumption by 130µA when the heart rate sensor is disabled.
-rw-r--r--src/drivers/Hrs3300.cpp10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/drivers/Hrs3300.cpp b/src/drivers/Hrs3300.cpp
index 004c5362..7dfd301c 100644
--- a/src/drivers/Hrs3300.cpp
+++ b/src/drivers/Hrs3300.cpp
@@ -14,6 +14,10 @@
using namespace Pinetime::Drivers;
+namespace {
+ static constexpr uint8_t ledDriveCurrentValue = 0x2f;
+}
+
/** Driver for the HRS3300 heart rate sensor.
* Original implementation from wasp-os : https://github.com/daniel-thompson/wasp-os/blob/master/wasp/drivers/hrs3300.py
*
@@ -35,7 +39,7 @@ void Hrs3300::Init() {
// Note: Setting low nibble to 0x8 per the datasheet results in
// modulated LED driver output. Setting to 0xF results in clean,
// steady output during the ADC conversion period.
- WriteRegister(static_cast<uint8_t>(Registers::PDriver), 0x2f);
+ WriteRegister(static_cast<uint8_t>(Registers::PDriver), ledDriveCurrentValue);
// HRS and ALS both in 15-bit mode results in ~50ms LED drive period
// and presumably ~50ms ADC conversion period.
@@ -50,6 +54,8 @@ void Hrs3300::Enable() {
auto value = ReadRegister(static_cast<uint8_t>(Registers::Enable));
value |= 0x80;
WriteRegister(static_cast<uint8_t>(Registers::Enable), value);
+
+ WriteRegister(static_cast<uint8_t>(Registers::PDriver), ledDriveCurrentValue);
}
void Hrs3300::Disable() {
@@ -57,6 +63,8 @@ void Hrs3300::Disable() {
auto value = ReadRegister(static_cast<uint8_t>(Registers::Enable));
value &= ~0x80;
WriteRegister(static_cast<uint8_t>(Registers::Enable), value);
+
+ WriteRegister(static_cast<uint8_t>(Registers::PDriver), 0);
}
uint32_t Hrs3300::ReadHrs() {