use drivers/Hrs3300.h from InfiniTime
The Hrs3300.h driver can now be used directly from InfiniTime. Some other improvement made that possible. One less simulator file, one less file to keep updated. Win-Win (for me at least).
This commit is contained in:
		
							parent
							
								
									83331a07ed
								
							
						
					
					
						commit
						2e746ea560
					
				@ -138,8 +138,6 @@ target_sources(infinisim PUBLIC
 | 
			
		||||
  sim/drivers/Bma421.cpp
 | 
			
		||||
  sim/drivers/Cst816s.h
 | 
			
		||||
  sim/drivers/Cst816s.cpp
 | 
			
		||||
  sim/drivers/Hrs3300.h
 | 
			
		||||
  sim/drivers/Hrs3300.cpp
 | 
			
		||||
  sim/drivers/SpiMaster.h
 | 
			
		||||
  sim/drivers/SpiMaster.cpp
 | 
			
		||||
  sim/drivers/TwiMaster.h
 | 
			
		||||
@ -199,6 +197,8 @@ target_sources(infinisim PUBLIC
 | 
			
		||||
  ${InfiniTime_DIR}/src/components/fs/FS.cpp
 | 
			
		||||
  ${InfiniTime_DIR}/src/components/motor/MotorController.h
 | 
			
		||||
  ${InfiniTime_DIR}/src/components/motor/MotorController.cpp
 | 
			
		||||
  ${InfiniTime_DIR}/src/drivers/Hrs3300.h
 | 
			
		||||
  ${InfiniTime_DIR}/src/drivers/Hrs3300.cpp
 | 
			
		||||
  ${InfiniTime_DIR}/src/drivers/PinMap.h
 | 
			
		||||
  ${InfiniTime_DIR}/src/drivers/Spi.h
 | 
			
		||||
  ${InfiniTime_DIR}/src/drivers/Spi.cpp
 | 
			
		||||
 | 
			
		||||
@ -1,105 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
  SPDX-License-Identifier: LGPL-3.0-or-later
 | 
			
		||||
  Original work Copyright (C) 2020 Daniel Thompson
 | 
			
		||||
  C++ port Copyright (C) 2021 Jean-François Milants
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include "drivers/Hrs3300.h"
 | 
			
		||||
#include <algorithm>
 | 
			
		||||
#include <nrf_gpio.h>
 | 
			
		||||
 | 
			
		||||
#include <FreeRTOS.h>
 | 
			
		||||
#include <task.h>
 | 
			
		||||
#include <nrf_log.h>
 | 
			
		||||
 | 
			
		||||
using namespace Pinetime::Drivers;
 | 
			
		||||
/** 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
 | 
			
		||||
 */
 | 
			
		||||
Hrs3300::Hrs3300(TwiMaster& twiMaster, uint8_t twiAddress) : twiMaster {twiMaster}, twiAddress {twiAddress} {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Hrs3300::Init() {
 | 
			
		||||
  nrf_gpio_cfg_input(30, NRF_GPIO_PIN_NOPULL);
 | 
			
		||||
 | 
			
		||||
  Disable();
 | 
			
		||||
//  vTaskDelay(100);
 | 
			
		||||
 | 
			
		||||
  // HRS disabled, 12.5 ms wait time between cycles, (partly) 20mA drive
 | 
			
		||||
  WriteRegister(static_cast<uint8_t>(Registers::Enable), 0x60);
 | 
			
		||||
 | 
			
		||||
  // (partly) 20mA drive, power on, "magic" (datasheet says both
 | 
			
		||||
  // "reserved" and "set low nibble to 8" but 0xe gives better results
 | 
			
		||||
  // and is used by at least two other HRS3300 drivers
 | 
			
		||||
  WriteRegister(static_cast<uint8_t>(Registers::PDriver), 0x6E);
 | 
			
		||||
 | 
			
		||||
  // HRS and ALS both in 16-bit mode
 | 
			
		||||
  WriteRegister(static_cast<uint8_t>(Registers::Res), 0x88);
 | 
			
		||||
 | 
			
		||||
  // 64x gain
 | 
			
		||||
  WriteRegister(static_cast<uint8_t>(Registers::Hgain), 0x10);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Hrs3300::Enable() {
 | 
			
		||||
  NRF_LOG_INFO("ENABLE");
 | 
			
		||||
  auto value = ReadRegister(static_cast<uint8_t>(Registers::Enable));
 | 
			
		||||
  value |= 0x80;
 | 
			
		||||
  WriteRegister(static_cast<uint8_t>(Registers::Enable), value);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Hrs3300::Disable() {
 | 
			
		||||
  NRF_LOG_INFO("DISABLE");
 | 
			
		||||
  auto value = ReadRegister(static_cast<uint8_t>(Registers::Enable));
 | 
			
		||||
  value &= ~0x80;
 | 
			
		||||
  WriteRegister(static_cast<uint8_t>(Registers::Enable), value);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint16_t Hrs3300::ReadHrs() {
 | 
			
		||||
  auto m = ReadRegister(static_cast<uint8_t>(Registers::C0DataM));
 | 
			
		||||
  auto h = ReadRegister(static_cast<uint8_t>(Registers::C0DataH));
 | 
			
		||||
  auto l = ReadRegister(static_cast<uint8_t>(Registers::C0dataL));
 | 
			
		||||
  return (m << 8) | ((h & 0x0f) << 4) | (l & 0x0f) | ((l & 0x30) << 12);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint16_t Hrs3300::ReadAls() {
 | 
			
		||||
  auto m = ReadRegister(static_cast<uint8_t>(Registers::C1dataM));
 | 
			
		||||
  auto h = ReadRegister(static_cast<uint8_t>(Registers::C1dataH));
 | 
			
		||||
  auto l = ReadRegister(static_cast<uint8_t>(Registers::C1dataL));
 | 
			
		||||
  return (m << 3) | ((h & 0x3f) << 11) | (l & 0x07);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Hrs3300::SetGain(uint8_t gain) {
 | 
			
		||||
  constexpr uint8_t maxGain = 64U;
 | 
			
		||||
  gain = std::min(gain, maxGain);
 | 
			
		||||
  uint8_t hgain = 0;
 | 
			
		||||
  while ((1 << hgain) < gain) {
 | 
			
		||||
    ++hgain;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  WriteRegister(static_cast<uint8_t>(Registers::Hgain), hgain << 2);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Hrs3300::SetDrive(uint8_t drive) {
 | 
			
		||||
  auto en = ReadRegister(static_cast<uint8_t>(Registers::Enable));
 | 
			
		||||
  auto pd = ReadRegister(static_cast<uint8_t>(Registers::PDriver));
 | 
			
		||||
 | 
			
		||||
  en = (en & 0xf7) | ((drive & 2) << 2);
 | 
			
		||||
  pd = (pd & 0xbf) | ((drive & 1) << 6);
 | 
			
		||||
 | 
			
		||||
  WriteRegister(static_cast<uint8_t>(Registers::Enable), en);
 | 
			
		||||
  WriteRegister(static_cast<uint8_t>(Registers::PDriver), pd);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Hrs3300::WriteRegister(uint8_t reg, uint8_t data) {
 | 
			
		||||
  auto ret = twiMaster.Write(twiAddress, reg, &data, 1);
 | 
			
		||||
  if (ret != TwiMaster::ErrorCodes::NoError)
 | 
			
		||||
    NRF_LOG_INFO("WRITE ERROR");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint8_t Hrs3300::ReadRegister(uint8_t reg) {
 | 
			
		||||
  uint8_t value;
 | 
			
		||||
  auto ret = twiMaster.Read(twiAddress, reg, &value, 1);
 | 
			
		||||
  if (ret != TwiMaster::ErrorCodes::NoError)
 | 
			
		||||
    NRF_LOG_INFO("READ ERROR");
 | 
			
		||||
  return value;
 | 
			
		||||
}
 | 
			
		||||
@ -1,46 +0,0 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include "drivers/TwiMaster.h"
 | 
			
		||||
 | 
			
		||||
namespace Pinetime {
 | 
			
		||||
  namespace Drivers {
 | 
			
		||||
    class Hrs3300 {
 | 
			
		||||
    public:
 | 
			
		||||
      enum class Registers : uint8_t {
 | 
			
		||||
        Id = 0x00,
 | 
			
		||||
        Enable = 0x01,
 | 
			
		||||
        EnableHen = 0x80,
 | 
			
		||||
        C1dataM = 0x08,
 | 
			
		||||
        C0DataM = 0x09,
 | 
			
		||||
        C0DataH = 0x0a,
 | 
			
		||||
        PDriver = 0x0c,
 | 
			
		||||
        C1dataH = 0x0d,
 | 
			
		||||
        C1dataL = 0x0e,
 | 
			
		||||
        C0dataL = 0x0f,
 | 
			
		||||
        Res = 0x16,
 | 
			
		||||
        Hgain = 0x17
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      Hrs3300(TwiMaster& twiMaster, uint8_t twiAddress);
 | 
			
		||||
      Hrs3300(const Hrs3300&) = delete;
 | 
			
		||||
      Hrs3300& operator=(const Hrs3300&) = delete;
 | 
			
		||||
      Hrs3300(Hrs3300&&) = delete;
 | 
			
		||||
      Hrs3300& operator=(Hrs3300&&) = delete;
 | 
			
		||||
 | 
			
		||||
      void Init();
 | 
			
		||||
      void Enable();
 | 
			
		||||
      void Disable();
 | 
			
		||||
      uint16_t ReadHrs();
 | 
			
		||||
      uint16_t ReadAls();
 | 
			
		||||
      void SetGain(uint8_t gain);
 | 
			
		||||
      void SetDrive(uint8_t drive);
 | 
			
		||||
 | 
			
		||||
    private:
 | 
			
		||||
      TwiMaster& twiMaster;
 | 
			
		||||
      uint8_t twiAddress;
 | 
			
		||||
 | 
			
		||||
      void WriteRegister(uint8_t reg, uint8_t data);
 | 
			
		||||
      uint8_t ReadRegister(uint8_t reg);
 | 
			
		||||
    };
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user