10#ifndef M5_UNIT_HEART_UNIT_MAX30102_HPP
11#define M5_UNIT_HEART_UNIT_MAX30102_HPP
13#include <M5UnitComponent.hpp>
14#include <m5_utility/stl/extension.hpp>
15#include <m5_utility/container/circular_buffer.hpp>
43enum class ADC : uint8_t {
102constexpr uint8_t MAX_FIFO_DEPTH{32};
109 std::array<uint8_t, 6>
raw{};
112 inline uint32_t
ir()
const
114 return mask & ((
static_cast<uint32_t
>(
raw[3]) << 16) | (
static_cast<uint32_t
>(
raw[4]) << 8) |
115 static_cast<uint32_t
>(
raw[5]));
118 inline uint32_t
red()
const
120 return mask & ((
static_cast<uint32_t
>(
raw[0]) << 16) | (
static_cast<uint32_t
>(
raw[1]) << 8) |
121 static_cast<uint32_t
>(
raw[2]));
130 std::array<uint8_t, 2> raw{0x80, 0x00};
139 return (raw[0] != 0x80) ?
static_cast<int8_t
>(raw[0]) + raw[1] * 0.0625f
140 : std::numeric_limits<float>::quiet_NaN();
145 return celsius() * 9.0f / 5.0f + 32.f;
152constexpr uint8_t READ_INTERRUPT_STATUS_1{0x00};
153constexpr uint8_t READ_INTERRUPT_STATUS_2{0x01};
154constexpr uint8_t INTERRUPT_ENABLE_1{0x02};
155constexpr uint8_t INTERRUPT_ENABLE_2{0x03};
157constexpr uint8_t FIFO_WRITE_POINTER{0x04};
158constexpr uint8_t FIFO_OVERFLOW_COUNTER{0x05};
159constexpr uint8_t FIFO_READ_POINTER{0x06};
160constexpr uint8_t FIFO_DATA_REGISTER{0x07};
162constexpr uint8_t FIFO_CONFIGURATION{0x08};
163constexpr uint8_t MODE_CONFIGURATION{0x09};
164constexpr uint8_t SPO2_CONFIGURATION{0x0A};
165constexpr uint8_t LED_CONFIGURATION_1{0x0C};
166constexpr uint8_t LED_CONFIGURATION_2{0x0D};
168constexpr uint8_t MULTI_LED_MODE_CONTROL_12{0x11};
169constexpr uint8_t MULTI_LED_MODE_CONTROL_34{0x12};
171constexpr uint8_t TEMP_INTEGER{0x1F};
172constexpr uint8_t TEMP_FRACTION{0x20};
173constexpr uint8_t TEMP_CONFIGURATION{0x21};
175constexpr uint8_t READ_REVISION_ID{0xFE};
176constexpr uint8_t READ_PART_ID{0xFF};
180struct SpO2Configuration;
190class UnitMAX30102 :
public Component,
public PeriodicMeasurementAdapter<UnitMAX30102, max30102::Data> {
225 : Component(addr), _data{new
m5::container::CircularBuffer<
max30102::Data>(
max30102::MAX_FIFO_DEPTH)}
227 auto ccfg = component_config();
228 ccfg.clock = 400 * 1000U;
229 ccfg.stored_size = max30102::MAX_FIFO_DEPTH;
230 component_config(ccfg);
237 virtual bool begin()
override;
239 virtual void update(
const bool force =
false)
override;
258 inline uint32_t
ir()
const
260 return !empty() ? oldest().ir() : 0;
263 inline uint32_t
red()
const
265 return !empty() ? oldest().red() : 0;
280 [[deprecated(
"Please use retrieved()")]]
inline uint8_t
retrived()
const
317 return PeriodicMeasurementAdapter<UnitMAX30102, max30102::Data>::startPeriodicMeasurement();
334 const uint8_t red_current)
336 return PeriodicMeasurementAdapter<UnitMAX30102, max30102::Data>::startPeriodicMeasurement(
337 mode, range, rate, width, avg, ir_current, red_current);
346 return PeriodicMeasurementAdapter<UnitMAX30102, max30102::Data>::stopPeriodicMeasurement();
467 return read_led_current(slot, raw);
478 return read_led_current(slot, mA);
488 return write_led_current(slot, raw);
497 template <typename T, typename std::enable_if<std::is_floating_point<T>::value, std::nullptr_t>::type =
nullptr>
500 return write_led_current(slot,
static_cast<float>(mA));
563 return read_register8(max30102::command::FIFO_READ_POINTER, rptr);
568 return writeRegister8(max30102::command::FIFO_READ_POINTER, rptr);
574 return read_register8(max30102::command::FIFO_WRITE_POINTER, wptr);
579 return writeRegister8(max30102::command::FIFO_WRITE_POINTER, wptr);
585 return read_register8(max30102::command::FIFO_OVERFLOW_COUNTER, cnt);
590 return writeRegister8(max30102::command::FIFO_OVERFLOW_COUNTER, cnt);
616 bool read_register(
const uint8_t reg, uint8_t* buf,
const size_t len);
617 bool read_register8(
const uint8_t reg, uint8_t& v);
619 bool start_periodic_measurement();
622 const uint8_t ir_current,
const uint8_t red_current);
623 bool stop_periodic_measurement();
625 bool write_spo2_configuration(
const max30102::SpO2Configuration& sc);
627 bool read_led_current(
const uint8_t idx, uint8_t& raw);
628 bool read_led_current(
const uint8_t idx,
float& mA);
629 bool write_led_current(
const uint8_t idx,
const uint8_t raw);
630 bool write_led_current(
const uint8_t idx,
const float mA);
635 bool reset_FIFO(
const bool circling_read_ptr =
true);
642 std::unique_ptr<m5::container::CircularBuffer<max30102::Data>> _data{};
643 max30102::Mode _mode{};
644 uint8_t _retrieved{}, _overflow{};
646 max30102::Slot _slot[2]{};
Pulse oximetry and heart-rate sensor.
bool readMode(max30102::Mode &mode)
Read the operation mode.
Definition unit_MAX30102.cpp:325
bool writeFIFOReadPointer(const uint8_t rptr)
Write the FIFO read pointer.
Definition unit_MAX30102.hpp:566
bool writeMultiLEDModeControl(const max30102::Slot slot1, const max30102::Slot slot2)
Write the MultiLED Mode to Slot 1-2.
Definition unit_MAX30102.cpp:494
uint32_t red() const
Oldest Red.
Definition unit_MAX30102.hpp:263
bool resetFIFO()
Reset FIFO pointer and counter.
Definition unit_MAX30102.hpp:593
bool writeLEDCurrent(const uint8_t slot, const uint8_t raw)
Write the LED current.
Definition unit_MAX30102.hpp:486
bool writeSpO2LEDPulseWidth(const max30102::LEDPulse width)
Write the LED pulse width.
Definition unit_MAX30102.cpp:440
bool writeSpO2Configuration(const max30102::ADC range, const max30102::Sampling rate, const max30102::LEDPulse width)
Write the SpO2 configuration.
Definition unit_MAX30102.cpp:410
bool readFIFOOverflowCounter(uint8_t &cnt)
Read the FIFO overflow counter.
Definition unit_MAX30102.hpp:582
bool readSpO2SamplingRate(max30102::Sampling &rate)
Read the sampling rate.
Definition unit_MAX30102.hpp:423
uint8_t retrieved() const
Number of data last retrieved.
Definition unit_MAX30102.hpp:272
bool stopPeriodicMeasurement()
Stop periodic measurement.
Definition unit_MAX30102.hpp:344
bool reset()
Reset.
Definition unit_MAX30102.cpp:682
bool writeFIFOWritePointer(const uint8_t wptr)
Write the FIFO write pointer.
Definition unit_MAX30102.hpp:577
uint32_t caluculateSamplingRate()
Deprecated alias of calculateSamplingRate()
Definition unit_MAX30102.hpp:304
bool writeFIFOOverflowCounter(const uint8_t cnt)
Write the FIFO overflow counter.
Definition unit_MAX30102.hpp:588
bool measureTemperatureSingleshot(max30102::TemperatureData &td)
Measure temperature single shot.
Definition unit_MAX30102.cpp:526
bool readRevisionID(uint8_t &rev)
Read the revision ID.
Definition unit_MAX30102.cpp:703
bool writeMode(const max30102::Mode mode)
Write the operation mode.
Definition unit_MAX30102.cpp:336
bool startPeriodicMeasurement(const max30102::Mode mode, const max30102::ADC range, const max30102::Sampling rate, const max30102::LEDPulse width, const max30102::FIFOSampling avg, const uint8_t ir_current, const uint8_t red_current)
Start periodic measurement.
Definition unit_MAX30102.hpp:331
bool writeSpO2ADCRange(const max30102::ADC range)
Write the ADC range.
Definition unit_MAX30102.cpp:420
UnitMAX30102(const uint8_t addr=DEFAULT_ADDRESS)
Constructor.
Definition unit_MAX30102.hpp:224
uint32_t calculateSamplingRate()
Calculate the sampling rate from the current settings.
Definition unit_MAX30102.cpp:709
bool writeSpO2SamplingRate(const max30102::Sampling rate)
Write the sampling rate.
Definition unit_MAX30102.cpp:430
bool readShutdownControl(bool &shdn)
Read the shutdown control.
Definition unit_MAX30102.cpp:354
bool readLEDCurrent(uint8_t &raw, const uint8_t slot)
Read the LED current.
Definition unit_MAX30102.hpp:465
bool readFIFOConfiguration(max30102::FIFOSampling &avg, bool &rollover, uint8_t &almostFull)
Read the FIFO configuration.
Definition unit_MAX30102.cpp:549
bool readFIFOWritePointer(uint8_t &wptr)
Read the FIFO write pointer.
Definition unit_MAX30102.hpp:571
bool startPeriodicMeasurement()
Start periodic measurement in the current settings.
Definition unit_MAX30102.hpp:315
bool readMultiLEDModeControl(max30102::Slot &slot1, max30102::Slot &slot2)
Read the MultiLED Mode from Slot 1-2.
Definition unit_MAX30102.cpp:482
config_t config()
Gets the configuration.
Definition unit_MAX30102.hpp:244
bool readFIFOReadPointer(uint8_t &rptr)
Read the FIFO read pointer.
Definition unit_MAX30102.hpp:560
bool readSpO2ADCRange(max30102::ADC &range)
Read the ADC range.
Definition unit_MAX30102.hpp:416
uint32_t ir() const
Oldest IR.
Definition unit_MAX30102.hpp:258
virtual void update(const bool force=false) override
Update the unit.
Definition unit_MAX30102.cpp:260
uint8_t retrived() const
Deprecated alias of retrieved()
Definition unit_MAX30102.hpp:280
bool readSpO2Configuration(max30102::ADC &range, max30102::Sampling &rate, max30102::LEDPulse &width)
Read the SpO2 configuration.
Definition unit_MAX30102.cpp:380
bool readLEDCurrent(float &mA, const uint8_t slot)
Read the LED current.
Definition unit_MAX30102.hpp:476
bool writeFIFOConfiguration(const max30102::FIFOSampling avg, const bool rollover, const uint8_t almostFull)
Write the FIFO configuration.
Definition unit_MAX30102.cpp:565
void config(const config_t &cfg)
Set the configuration.
Definition unit_MAX30102.hpp:249
bool writeShutdownControl(const bool shdn)
Write the shutdown control.
Definition unit_MAX30102.cpp:365
uint8_t overflow() const
The number of samples lost.
Definition unit_MAX30102.hpp:288
virtual bool begin() override
Begin the unit.
Definition unit_MAX30102.cpp:225
bool readSpO2LEDPulseWidth(max30102::LEDPulse &width)
Read the LED pulse width.
Definition unit_MAX30102.hpp:430
bool writeLEDCurrent(const uint8_t slot, const T mA)
Write the LED current.
Definition unit_MAX30102.hpp:498
Top level namespace of M5Stack.
Settings for begin.
Definition unit_MAX30102.hpp:199
max30102::LEDPulse pulse_width
LED pulse width if start on begin.
Definition unit_MAX30102.hpp:213
max30102::FIFOSampling fifo_sampling_average
FIFO sampling average if start on begin.
Definition unit_MAX30102.hpp:219
bool start_periodic
Start periodic measurement on begin?
Definition unit_MAX30102.hpp:207
max30102::ADC adc_range
ADC range if start on begin.
Definition unit_MAX30102.hpp:209
max30102::Mode mode
Operating mode if start on begin.
Definition unit_MAX30102.hpp:205
max30102::Sampling sampling_rate
Sampling rate if start on begin.
Definition unit_MAX30102.hpp:211
uint8_t ir_current
LED current for IR if start on begin.
Definition unit_MAX30102.hpp:215
uint8_t red_current
LED current for Red if start on begin (only SpO2 MODE)
Definition unit_MAX30102.hpp:217
Measurement data group.
Definition unit_MAX30102.hpp:108
std::array< uint8_t, 6 > raw
Raw data [0...2]:Red [3...5]:IR.
Definition unit_MAX30102.hpp:109
uint32_t mask
Definition unit_MAX30102.hpp:110
uint32_t red() const
Gets the Red value.
Definition unit_MAX30102.hpp:118
uint32_t ir() const
Gets the IR value.
Definition unit_MAX30102.hpp:112
Measurement data group for temperature.
Definition unit_MAX30102.hpp:129
float fahrenheit() const
Temperature (Fahrenheit)
Definition unit_MAX30102.hpp:143
float celsius() const
Temperature (Celsius)
Definition unit_MAX30102.hpp:137
float temperature() const
Temperature (Celsius)
Definition unit_MAX30102.hpp:132
Mode
Operation mode.
Definition unit_MAX30102.hpp:30
@ MultiLED
Multi-LED mode (Red and IR)
ADC
SpO2 ADC Range Control.
Definition unit_MAX30102.hpp:43
@ Range8192nA
LSB size 31.25 Full scale 8192.
@ Range4096nA
LSB size 15.63 Full scale 4096.
@ Range16384nA
LSB size 62.5 Full scale 16384.
@ Range2048nA
LSB size 7.81 Full scale 2048.
Sampling
Sampling rate for pulse/conversion.
Definition unit_MAX30102.hpp:55
Slot
Multi-LED mode control.
Definition unit_MAX30102.hpp:81
LEDPulse
LED pulse width (the IR and RED have the same pulse width)
Definition unit_MAX30102.hpp:70
@ Width69
68.95 us (ADC 15 bits)
@ Width411
410.75 us (ADC 18 bits)
@ Width118
117.78 us (ADC 16 bits)
@ Width215
215.44 us (ADC 17 bits)
FIFOSampling
Number of samples averaged per FIFO sample.
Definition unit_MAX30102.hpp:91
@ Average1
1 (no averaging)