InfiniTime.git

commit a48d4e0b1330a34e32f56a6d4a65c77eca84f655

Author: Jean-François Milants <jf@codingfield.com>

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.

 src/drivers/Hrs3300.cpp | 10 +++++++++-


diff --git a/src/drivers/Hrs3300.cpp b/src/drivers/Hrs3300.cpp
index 004c536267a38ed285d5d97eb3b2bdc7aa248f47..7dfd301ca8f712040ad4b66900ed9f2905c256a5 100644
--- a/src/drivers/Hrs3300.cpp
+++ b/src/drivers/Hrs3300.cpp
@@ -14,6 +14,10 @@ #include 
 
 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 @@   // Current 12.5mA and low nibble 0xF.
   // 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 @@   NRF_LOG_INFO("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 @@   NRF_LOG_INFO("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() {