Change some enum classes name

This commit is contained in:
GOB
2025-02-12 14:43:05 +09:00
parent 91a0c97a7c
commit ad80496b86
5 changed files with 214 additions and 214 deletions
@@ -4,6 +4,6 @@
* SPDX-License-Identifier: MIT
*/
/*
Example using M5UnitUnified for HatHEART
Example using M5UnitUnified for HatHeart
*/
#include "main/PlotToSerial.cpp"
@@ -15,10 +15,10 @@ namespace {
auto& lcd = M5.Display;
m5::unit::UnitUnified Units;
m5::unit::HatHeart hat;
m5::heart::PulseMonitor monitor{};
constexpr bool using_multi_led_mode{true};
constexpr bool using_multi_led_mode{false}; // Using multiLED mode if true
constexpr bool using_wire1{false}; // Using Wire1 if true
} // namespace
@@ -27,10 +27,12 @@ using namespace m5::unit::max30102;
void setup()
{
// Configuration if using Wire1
auto m5cfg = M5.config();
m5cfg.pmic_button = false; // Disable BtnPWR
m5cfg.internal_imu = false; // Disable internal IMU
m5cfg.internal_rtc = false; // Disable internal RTC
auto m5cfg = M5.config();
if (using_wire1) {
m5cfg.pmic_button = false; // Disable BtnPWR
m5cfg.internal_imu = false; // Disable internal IMU
m5cfg.internal_rtc = false; // Disable internal RTC
}
M5.begin(m5cfg);
auto board = M5.getBoard();
@@ -55,27 +57,27 @@ void setup()
}
// Using TwoWire
#if 1
Wire1.end();
Wire1.begin(0, 26, 400 * 1000U); // Hat port 0,26
if (!Units.add(hat, Wire1) || !Units.begin()) {
M5_LOGE("Failed to begin");
lcd.clear(TFT_RED);
while (true) {
m5::utility::delay(10000);
if (using_wire1) {
Wire1.end();
Wire1.begin(0, 26, 400 * 1000U);
if (!Units.add(hat, Wire1) || !Units.begin()) {
M5_LOGE("Failed to begin");
lcd.clear(TFT_RED);
while (true) {
m5::utility::delay(10000);
}
}
} else {
Wire.end();
Wire.begin(0, 26, 400 * 1000U);
if (!Units.add(hat, Wire) || !Units.begin()) {
M5_LOGE("Failed to begin");
lcd.clear(TFT_RED);
while (true) {
m5::utility::delay(10000);
}
}
}
#else
Wire.end();
Wire.begin(0, 26, 400 * 1000U); // Hat port 0,26
if (!Units.add(hat, Wire) || !Units.begin()) {
M5_LOGE("Failed to begin");
lcd.clear(TFT_RED);
while (true) {
m5::utility::delay(10000);
}
}
#endif
M5_LOGI("M5UnitUnified has been begun");
M5_LOGI("%s", Units.debugInfo().c_str());
@@ -83,7 +85,7 @@ void setup()
// In MultiLED mode, you need to set and start them yourself
if (using_multi_led_mode) {
hat.writeMode(Mode::MultiLED);
hat.writeSpO2Configuration(SpO2ADCRange::nA4096, Sampling::Rate400, LEDPulseWidth::PW411);
hat.writeSpO2Configuration(ADC::Range4096nA, Sampling::Rate400, LEDPulse::Width411);
hat.writeFIFOConfiguration(FIFOSampling::Average4, true, 15);
// hat.writeMultiLEDModeControl(Slot::Red, Slot::IR); // (A)
hat.writeMultiLEDModeControl(Slot::IR, Slot::Red); // (B)
+18 -19
View File
@@ -86,7 +86,7 @@ constexpr const uint8_t* allowed_setting_table[] = {
none_table, none_table, hr_table, spo2_table, none_table, none_table, none_table, spo2_table,
};
inline bool is_allowed_settings(const Mode mode, const Sampling rate, const LEDPulseWidth pw)
inline bool is_allowed_settings(const Mode mode, const Sampling rate, const LEDPulse pw)
{
return allowed_setting_table[m5::stl::to_underlying(mode)][m5::stl::to_underlying(rate)] &
(1U << m5::stl::to_underlying(pw));
@@ -184,19 +184,19 @@ struct ModeConfiguration {
};
struct SpO2Configuration {
inline SpO2ADCRange range() const
inline ADC range() const
{
return static_cast<SpO2ADCRange>((value >> 5) & 0x03);
return static_cast<ADC>((value >> 5) & 0x03);
}
inline Sampling rate() const
{
return static_cast<Sampling>((value >> 2) & 0x07);
}
inline LEDPulseWidth width() const
inline LEDPulse width() const
{
return static_cast<LEDPulseWidth>(value & 0x03);
return static_cast<LEDPulse>(value & 0x03);
}
inline void range(const SpO2ADCRange range)
inline void range(const ADC range)
{
value = (value & ~(0x03 << 5)) | ((m5::stl::to_underlying(range) & 0x03) << 5);
}
@@ -204,7 +204,7 @@ struct SpO2Configuration {
{
value = (value & ~(0x07 << 2)) | ((m5::stl::to_underlying(rate) & 0x07) << 2);
}
inline void width(const LEDPulseWidth width)
inline void width(const LEDPulse width)
{
value = (value & ~0x03) | (m5::stl::to_underlying(width) & 0x03);
}
@@ -247,7 +247,7 @@ bool UnitMAX30102::begin()
return false;
}
return (_cfg.start_periodic && (_cfg.mode == Mode::SPO2 || _cfg.mode == Mode::MultiLED))
return (_cfg.start_periodic && (_cfg.mode == Mode::SpO2 || _cfg.mode == Mode::HROnly))
? startPeriodicMeasurement(_cfg.mode, _cfg.adc_range, _cfg.sampling_rate, _cfg.pulse_width,
_cfg.fifo_sampling_average, _cfg.ir_current, _cfg.red_current)
: true;
@@ -277,9 +277,9 @@ bool UnitMAX30102::start_periodic_measurement()
FIFOSampling avg{};
bool rollover{};
uint8_t almostFull{};
SpO2ADCRange range{};
ADC range{};
Sampling rate{};
LEDPulseWidth width{};
LEDPulse width{};
if (readFIFOConfiguration(avg, rollover, almostFull) && readSpO2Configuration(range, rate, width)) {
_periodic = writeFIFOConfiguration(avg, true /* rollover always true */, almostFull) &&
@@ -295,8 +295,8 @@ bool UnitMAX30102::start_periodic_measurement()
return _periodic;
}
bool UnitMAX30102::start_periodic_measurement(const max30102::Mode mode, const SpO2ADCRange range,
const max30102::Sampling rate, const max30102::LEDPulseWidth width,
bool UnitMAX30102::start_periodic_measurement(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)
{
@@ -380,8 +380,7 @@ bool UnitMAX30102::write_mode_configuration(const max30102::ModeConfiguration& m
return writeRegister8(MODE_CONFIGURATION, mc.value);
}
bool UnitMAX30102::readSpO2Configuration(max30102::SpO2ADCRange& range, max30102::Sampling& rate,
max30102::LEDPulseWidth& width)
bool UnitMAX30102::readSpO2Configuration(max30102::ADC& range, max30102::Sampling& rate, max30102::LEDPulse& width)
{
SpO2Configuration sc{};
if (read_register8(SPO2_CONFIGURATION, sc.value)) {
@@ -407,8 +406,8 @@ bool UnitMAX30102::write_spo2_configuration(const SpO2Configuration& sc)
return writeRegister8(SPO2_CONFIGURATION, sc.value);
}
bool UnitMAX30102::writeSpO2Configuration(const max30102::SpO2ADCRange range, const max30102::Sampling rate,
const max30102::LEDPulseWidth width)
bool UnitMAX30102::writeSpO2Configuration(const max30102::ADC range, const max30102::Sampling rate,
const max30102::LEDPulse width)
{
SpO2Configuration sc{};
sc.range(range);
@@ -417,7 +416,7 @@ bool UnitMAX30102::writeSpO2Configuration(const max30102::SpO2ADCRange range, co
return write_spo2_configuration(sc);
}
bool UnitMAX30102::writeSpO2ADCRange(const max30102::SpO2ADCRange range)
bool UnitMAX30102::writeSpO2ADCRange(const max30102::ADC range)
{
SpO2Configuration sc{};
if (read_register8(SPO2_CONFIGURATION, sc.value)) {
@@ -437,7 +436,7 @@ bool UnitMAX30102::writeSpO2SamplingRate(const max30102::Sampling rate)
return false;
}
bool UnitMAX30102::writeSpO2LEDPulseWidth(const max30102::LEDPulseWidth width)
bool UnitMAX30102::writeSpO2LEDPulseWidth(const max30102::LEDPulse width)
{
SpO2Configuration sc{};
if (read_register8(SPO2_CONFIGURATION, sc.value)) {
@@ -622,7 +621,7 @@ bool UnitMAX30102::read_FIFO()
#if 1
uint32_t dlen = (_mode == Mode::HROnly) ? 3
: (_mode == Mode::SPO2) ? 6
: (_mode == Mode::SpO2) ? 6
: (_mode == Mode::MultiLED) ? 3 * ((_slot[0] != Slot::None) + (_slot[1] != Slot::None))
: 0;
if (dlen && readCount) {
+36 -37
View File
@@ -30,26 +30,26 @@ namespace max30102 {
enum class Mode : uint8_t {
None, //!< None
HROnly = 0x02, //!< Heart Rate mode (Red only)
SPO2, //!< SpO2 mode (Red and IR)
SpO2, //!< SpO2 mode (Red and IR)
MultiLED = 0x07, //!< Multi-LED mode (Red and IR)
};
/*!
@enum SpO2ADCRange
@enum ADC
@brief SpO2 ADC Range Control
@warning If the ambient environment is very bright or the sensor is exposed to strong light, setting a smaller value
may cause the IR/RED to overflow
*/
enum class SpO2ADCRange : uint8_t {
nA2048, //!< LSB size 7.81 Full scale 2048
nA4096, //!< LSB size 15.63 Full scale 4096
nA8192, //!< LSB size 31.25 Full scale 8192
nA16384, //!< LSB size 62.5 Full scale 16384
enum class ADC : uint8_t {
Range2048nA, //!< LSB size 7.81 Full scale 2048
Range4096nA, //!< LSB size 15.63 Full scale 4096
Range8192nA, //!< LSB size 31.25 Full scale 8192
Range16384nA, //!< LSB size 62.5 Full scale 16384
};
/*!
@enum Sampling
@brief Sampling rate for pulse
@brief Sampling rate for pulse/conversion
@details Unit is the number of sample per second
*/
enum class Sampling : uint8_t {
@@ -64,14 +64,14 @@ enum class Sampling : uint8_t {
};
/*!
@enum LEDPulseWidth
@enum LEDPulse
@brief LED pulse width (the IR and RED have the same pulse width)
*/
enum class LEDPulseWidth : uint8_t {
PW69, //!< 68.95 us (ADC 15 bits)
PW118, //!< 117.78 us (ADC 16 bits)
PW215, //!< 215.44 us (ADC 17 bits)
PW411, //!< 410.75 us (ADC 18 bits)
enum class LEDPulse : uint8_t {
Width69, //!< 68.95 us (ADC 15 bits)
Width118, //!< 117.78 us (ADC 16 bits)
Width215, //!< 215.44 us (ADC 17 bits)
Width411, //!< 410.75 us (ADC 18 bits)
};
/*!
@@ -99,9 +99,6 @@ enum class FIFOSampling : uint8_t {
// Average32, duplicated
};
struct ModeConfiguration;
struct SpO2Configuration;
constexpr uint8_t MAX_FIFO_DEPTH{32}; //!< @brief FIFO depth
/*!
@@ -176,6 +173,9 @@ constexpr uint8_t READ_REVISION_ID{0xFE};
constexpr uint8_t READ_PART_ID{0xFF};
} // namespace command
struct ModeConfiguration;
struct SpO2Configuration;
///@endcond
} // namespace max30102
@@ -200,15 +200,15 @@ public:
@warning In MultiLED mode, only the mode setting is performed
@warning The other settings are ignored, so you need to set and start them yourself
*/
max30102::Mode mode{max30102::Mode::SPO2};
max30102::Mode mode{max30102::Mode::SpO2};
//! Start periodic measurement on begin?
bool start_periodic{true};
//! ADC range if start on begin
max30102::SpO2ADCRange adc_range{max30102::SpO2ADCRange::nA4096};
max30102::ADC adc_range{max30102::ADC::Range4096nA};
//! Sampling rate if start on begin
max30102::Sampling sampling_rate{max30102::Sampling::Rate400};
//! LED pulse width if start on begin
max30102::LEDPulseWidth pulse_width{max30102::LEDPulseWidth::PW411};
max30102::LEDPulse pulse_width{max30102::LEDPulse::Width411};
//! LED current for IR if start on begin
uint8_t ir_current{0x1F};
//! LED current for Red if start on begin (only SpO2 MODE)
@@ -307,8 +307,8 @@ public:
@return True if successful
@warning Note that some combinations of rate and width are invalid. See also datasheet
*/
inline bool startPeriodicMeasurement(const max30102::Mode mode, const max30102::SpO2ADCRange range,
const max30102::Sampling rate, const max30102::LEDPulseWidth width,
inline 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)
{
@@ -390,25 +390,25 @@ public:
@param[out] width LED pulse width
@return True if successful
*/
bool readSpO2Configuration(max30102::SpO2ADCRange& range, max30102::Sampling& rate, max30102::LEDPulseWidth& width);
bool readSpO2Configuration(max30102::ADC& range, max30102::Sampling& rate, max30102::LEDPulse& width);
//! @brief Read the ADC range
inline bool readSpO2ADCRange(max30102::SpO2ADCRange& range)
inline bool readSpO2ADCRange(max30102::ADC& range)
{
max30102::Sampling rate{};
max30102::LEDPulseWidth width{};
max30102::LEDPulse width{};
return readSpO2Configuration(range, rate, width);
}
//! @brief Read the sampling rate
inline bool readSpO2SamplingRate(max30102::Sampling& rate)
{
max30102::SpO2ADCRange range{};
max30102::LEDPulseWidth width{};
max30102::ADC range{};
max30102::LEDPulse width{};
return readSpO2Configuration(range, rate, width);
}
//! @brief Read the LED pulse width
inline bool readSpO2LEDPulseWidth(max30102::LEDPulseWidth& width)
inline bool readSpO2LEDPulseWidth(max30102::LEDPulse& width)
{
max30102::SpO2ADCRange range{};
max30102::ADC range{};
max30102::Sampling rate{};
return readSpO2Configuration(range, rate, width);
}
@@ -420,14 +420,14 @@ public:
@return True if successful
@warning During periodic detection runs, an error is returned
*/
bool writeSpO2Configuration(const max30102::SpO2ADCRange range, const max30102::Sampling rate,
const max30102::LEDPulseWidth width);
bool writeSpO2Configuration(const max30102::ADC range, const max30102::Sampling rate,
const max30102::LEDPulse width);
//! @brief Write the ADC range
bool writeSpO2ADCRange(const max30102::SpO2ADCRange range);
bool writeSpO2ADCRange(const max30102::ADC range);
//! @brief Write the sampling rate
bool writeSpO2SamplingRate(const max30102::Sampling rate);
//! @brief Write the LED pulse width
bool writeSpO2LEDPulseWidth(const max30102::LEDPulseWidth width);
bool writeSpO2LEDPulseWidth(const max30102::LEDPulse width);
///@}
///@note Note that the target LEDs differ depending on the mode
@@ -581,10 +581,9 @@ protected:
bool read_register8(const uint8_t reg, uint8_t& v);
bool start_periodic_measurement();
bool start_periodic_measurement(const max30102::Mode mode, const max30102::SpO2ADCRange range,
const max30102::Sampling rate, const max30102::LEDPulseWidth width,
const max30102::FIFOSampling avg, const uint8_t ir_current,
const uint8_t red_current);
bool start_periodic_measurement(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);
bool stop_periodic_measurement();
bool write_mode_configuration(const max30102::ModeConfiguration& sc);
+131 -131
View File
@@ -97,23 +97,23 @@ constexpr uint32_t adc_resolution_bits_table[] = {
0x03FFFF, // 18 bits
};
bool is_allowed_settings(const Mode mode, const Sampling rate, const LEDPulseWidth pw)
bool is_allowed_settings(const Mode mode, const Sampling rate, const LEDPulse pw)
{
return allowed_setting_table[m5::stl::to_underlying(mode)][m5::stl::to_underlying(rate)] &
(1U << m5::stl::to_underlying(pw));
}
constexpr Mode mode_table[] = {
Mode::SPO2,
Mode::SpO2,
Mode::HROnly,
Mode::MultiLED,
};
constexpr SpO2ADCRange range_table[] = {
SpO2ADCRange::nA2048,
SpO2ADCRange::nA4096,
SpO2ADCRange::nA8192,
SpO2ADCRange::nA16384,
constexpr ADC range_table[] = {
ADC::Range2048nA,
ADC::Range4096nA,
ADC::Range8192nA,
ADC::Range16384nA,
};
constexpr Sampling sr_table[] = {
@@ -121,11 +121,11 @@ constexpr Sampling sr_table[] = {
Sampling::Rate800, Sampling::Rate1000, Sampling::Rate1600, Sampling::Rate3200,
};
constexpr LEDPulseWidth pw_table[] = {
LEDPulseWidth::PW69,
LEDPulseWidth::PW118,
LEDPulseWidth::PW215,
LEDPulseWidth::PW411,
constexpr LEDPulse pw_table[] = {
LEDPulse::Width69,
LEDPulse::Width118,
LEDPulse::Width215,
LEDPulse::Width411,
};
constexpr std::array<Slot, 2> slots_table[] = {
@@ -156,9 +156,9 @@ void test_spo2_config(UnitMAX30102* unit, const Mode mode)
auto s = m5::utility::formatString("Mode:%u Rate:%u Width:%u", mode, sr, pw);
SCOPED_TRACE(s);
SpO2ADCRange range{};
ADC range{};
Sampling rate{};
LEDPulseWidth width{};
LEDPulse width{};
if (is_allowed_settings(mode, sr, pw)) {
EXPECT_TRUE(unit->writeSpO2Configuration(rg, sr, pw));
@@ -172,9 +172,9 @@ void test_spo2_config(UnitMAX30102* unit, const Mode mode)
EXPECT_FALSE(unit->writeSpO2Configuration(rg, sr, pw));
SpO2ADCRange range2{};
ADC range2{};
Sampling rate2{};
LEDPulseWidth width2{};
LEDPulse width2{};
EXPECT_TRUE(unit->readSpO2Configuration(range2, rate2, width2));
EXPECT_EQ(range2, range);
EXPECT_EQ(rate2, rate2);
@@ -191,13 +191,13 @@ void test_spo2_config_each(UnitMAX30102* unit, const Mode mode)
SCOPED_TRACE(s);
EXPECT_TRUE(unit->writeMode(mode));
EXPECT_TRUE(unit->writeSpO2Configuration(SpO2ADCRange::nA2048, Sampling::Rate50, LEDPulseWidth::PW69));
EXPECT_TRUE(unit->writeSpO2Configuration(ADC::Range2048nA, Sampling::Rate50, LEDPulse::Width69));
for (auto& rg : range_table) {
auto s = m5::utility::formatString("Range:%u", rg);
SCOPED_TRACE(s);
SpO2ADCRange range{};
ADC range{};
EXPECT_TRUE(unit->writeSpO2ADCRange(rg));
EXPECT_TRUE(unit->readSpO2ADCRange(range));
EXPECT_EQ(range, rg);
@@ -206,7 +206,7 @@ void test_spo2_config_each(UnitMAX30102* unit, const Mode mode)
auto s = m5::utility::formatString("Rate:%u", sr);
SCOPED_TRACE(s);
if (is_allowed_settings(mode, sr, LEDPulseWidth::PW69)) {
if (is_allowed_settings(mode, sr, LEDPulse::Width69)) {
Sampling rate{};
EXPECT_TRUE(unit->writeSpO2SamplingRate(sr));
@@ -217,7 +217,7 @@ void test_spo2_config_each(UnitMAX30102* unit, const Mode mode)
for (auto&& pw : pw_table) {
auto s = m5::utility::formatString("Width:%u", pw);
SCOPED_TRACE(s);
LEDPulseWidth width{};
LEDPulse width{};
if (is_allowed_settings(mode, sr, pw)) {
EXPECT_TRUE(unit->writeSpO2LEDPulseWidth(pw));
@@ -225,7 +225,7 @@ void test_spo2_config_each(UnitMAX30102* unit, const Mode mode)
EXPECT_TRUE(unit->readSpO2LEDPulseWidth(width));
EXPECT_EQ(width, pw);
} else {
LEDPulseWidth width2{};
LEDPulse width2{};
EXPECT_TRUE(unit->readSpO2LEDPulseWidth(width));
EXPECT_FALSE(unit->writeSpO2LEDPulseWidth(pw));
@@ -234,7 +234,7 @@ void test_spo2_config_each(UnitMAX30102* unit, const Mode mode)
EXPECT_EQ(width2, width);
}
}
EXPECT_TRUE(unit->writeSpO2LEDPulseWidth(LEDPulseWidth::PW69));
EXPECT_TRUE(unit->writeSpO2LEDPulseWidth(LEDPulse::Width69));
} else {
Sampling rate{}, rate2{};
EXPECT_TRUE(unit->readSpO2SamplingRate(rate));
@@ -245,7 +245,7 @@ void test_spo2_config_each(UnitMAX30102* unit, const Mode mode)
EXPECT_EQ(rate2, rate);
}
}
EXPECT_TRUE(unit->writeSpO2Configuration(rg, Sampling::Rate50, LEDPulseWidth::PW69));
EXPECT_TRUE(unit->writeSpO2Configuration(rg, Sampling::Rate50, LEDPulse::Width69));
}
}
@@ -291,62 +291,62 @@ elapsed_time_t test_periodic(U* unit, const uint32_t times, const uint32_t measu
void test_periodic_spo2(UnitMAX30102* unit)
{
// Pairwise
constexpr std::tuple<SpO2ADCRange, Sampling, LEDPulseWidth, FIFOSampling> cond_table[] = {
{SpO2ADCRange::nA2048, Sampling::Rate50, LEDPulseWidth::PW118, FIFOSampling::Average1},
{SpO2ADCRange::nA8192, Sampling::Rate100, LEDPulseWidth::PW215, FIFOSampling::Average16},
{SpO2ADCRange::nA4096, Sampling::Rate100, LEDPulseWidth::PW411, FIFOSampling::Average4},
{SpO2ADCRange::nA4096, Sampling::Rate200, LEDPulseWidth::PW215, FIFOSampling::Average8},
{SpO2ADCRange::nA8192, Sampling::Rate1000, LEDPulseWidth::PW69, FIFOSampling::Average8},
{SpO2ADCRange::nA4096, Sampling::Rate800, LEDPulseWidth::PW69, FIFOSampling::Average1},
{SpO2ADCRange::nA16384, Sampling::Rate400, LEDPulseWidth::PW118, FIFOSampling::Average2},
{SpO2ADCRange::nA2048, Sampling::Rate200, LEDPulseWidth::PW69, FIFOSampling::Average16},
{SpO2ADCRange::nA16384, Sampling::Rate800, LEDPulseWidth::PW215, FIFOSampling::Average32},
{SpO2ADCRange::nA16384, Sampling::Rate1600, LEDPulseWidth::PW69, FIFOSampling::Average1},
{SpO2ADCRange::nA8192, Sampling::Rate200, LEDPulseWidth::PW411, FIFOSampling::Average1},
{SpO2ADCRange::nA2048, Sampling::Rate50, LEDPulseWidth::PW411, FIFOSampling::Average2},
{SpO2ADCRange::nA8192, Sampling::Rate800, LEDPulseWidth::PW118, FIFOSampling::Average4},
{SpO2ADCRange::nA2048, Sampling::Rate1600, LEDPulseWidth::PW69, FIFOSampling::Average4},
{SpO2ADCRange::nA4096, Sampling::Rate1000, LEDPulseWidth::PW118, FIFOSampling::Average32},
{SpO2ADCRange::nA4096, Sampling::Rate50, LEDPulseWidth::PW215, FIFOSampling::Average4},
{SpO2ADCRange::nA8192, Sampling::Rate400, LEDPulseWidth::PW69, FIFOSampling::Average32},
{SpO2ADCRange::nA2048, Sampling::Rate800, LEDPulseWidth::PW215, FIFOSampling::Average8},
{SpO2ADCRange::nA16384, Sampling::Rate100, LEDPulseWidth::PW411, FIFOSampling::Average1},
{SpO2ADCRange::nA16384, Sampling::Rate1000, LEDPulseWidth::PW118, FIFOSampling::Average16},
{SpO2ADCRange::nA8192, Sampling::Rate200, LEDPulseWidth::PW69, FIFOSampling::Average2},
{SpO2ADCRange::nA16384, Sampling::Rate1000, LEDPulseWidth::PW69, FIFOSampling::Average4},
{SpO2ADCRange::nA4096, Sampling::Rate400, LEDPulseWidth::PW215, FIFOSampling::Average1},
{SpO2ADCRange::nA4096, Sampling::Rate800, LEDPulseWidth::PW215, FIFOSampling::Average2},
{SpO2ADCRange::nA2048, Sampling::Rate100, LEDPulseWidth::PW118, FIFOSampling::Average8},
{SpO2ADCRange::nA16384, Sampling::Rate50, LEDPulseWidth::PW69, FIFOSampling::Average32},
{SpO2ADCRange::nA8192, Sampling::Rate50, LEDPulseWidth::PW411, FIFOSampling::Average16},
{SpO2ADCRange::nA8192, Sampling::Rate1600, LEDPulseWidth::PW69, FIFOSampling::Average8},
{SpO2ADCRange::nA2048, Sampling::Rate400, LEDPulseWidth::PW411, FIFOSampling::Average8},
{SpO2ADCRange::nA4096, Sampling::Rate1600, LEDPulseWidth::PW69, FIFOSampling::Average2},
{SpO2ADCRange::nA2048, Sampling::Rate1000, LEDPulseWidth::PW69, FIFOSampling::Average1},
{SpO2ADCRange::nA2048, Sampling::Rate100, LEDPulseWidth::PW69, FIFOSampling::Average32},
{SpO2ADCRange::nA4096, Sampling::Rate800, LEDPulseWidth::PW69, FIFOSampling::Average16},
{SpO2ADCRange::nA2048, Sampling::Rate1000, LEDPulseWidth::PW69, FIFOSampling::Average2},
{SpO2ADCRange::nA16384, Sampling::Rate200, LEDPulseWidth::PW411, FIFOSampling::Average32},
{SpO2ADCRange::nA2048, Sampling::Rate1600, LEDPulseWidth::PW69, FIFOSampling::Average16},
{SpO2ADCRange::nA2048, Sampling::Rate100, LEDPulseWidth::PW69, FIFOSampling::Average2},
{SpO2ADCRange::nA2048, Sampling::Rate1600, LEDPulseWidth::PW69, FIFOSampling::Average32},
{SpO2ADCRange::nA16384, Sampling::Rate50, LEDPulseWidth::PW69, FIFOSampling::Average8},
{SpO2ADCRange::nA2048, Sampling::Rate400, LEDPulseWidth::PW69, FIFOSampling::Average4},
{SpO2ADCRange::nA2048, Sampling::Rate400, LEDPulseWidth::PW69, FIFOSampling::Average16},
{SpO2ADCRange::nA2048, Sampling::Rate200, LEDPulseWidth::PW118, FIFOSampling::Average4},
constexpr std::tuple<ADC, Sampling, LEDPulse, FIFOSampling> cond_table[] = {
{ADC::Range2048nA, Sampling::Rate50, LEDPulse::Width118, FIFOSampling::Average1},
{ADC::Range8192nA, Sampling::Rate100, LEDPulse::Width215, FIFOSampling::Average16},
{ADC::Range4096nA, Sampling::Rate100, LEDPulse::Width411, FIFOSampling::Average4},
{ADC::Range4096nA, Sampling::Rate200, LEDPulse::Width215, FIFOSampling::Average8},
{ADC::Range8192nA, Sampling::Rate1000, LEDPulse::Width69, FIFOSampling::Average8},
{ADC::Range4096nA, Sampling::Rate800, LEDPulse::Width69, FIFOSampling::Average1},
{ADC::Range16384nA, Sampling::Rate400, LEDPulse::Width118, FIFOSampling::Average2},
{ADC::Range2048nA, Sampling::Rate200, LEDPulse::Width69, FIFOSampling::Average16},
{ADC::Range16384nA, Sampling::Rate800, LEDPulse::Width215, FIFOSampling::Average32},
{ADC::Range16384nA, Sampling::Rate1600, LEDPulse::Width69, FIFOSampling::Average1},
{ADC::Range8192nA, Sampling::Rate200, LEDPulse::Width411, FIFOSampling::Average1},
{ADC::Range2048nA, Sampling::Rate50, LEDPulse::Width411, FIFOSampling::Average2},
{ADC::Range8192nA, Sampling::Rate800, LEDPulse::Width118, FIFOSampling::Average4},
{ADC::Range2048nA, Sampling::Rate1600, LEDPulse::Width69, FIFOSampling::Average4},
{ADC::Range4096nA, Sampling::Rate1000, LEDPulse::Width118, FIFOSampling::Average32},
{ADC::Range4096nA, Sampling::Rate50, LEDPulse::Width215, FIFOSampling::Average4},
{ADC::Range8192nA, Sampling::Rate400, LEDPulse::Width69, FIFOSampling::Average32},
{ADC::Range2048nA, Sampling::Rate800, LEDPulse::Width215, FIFOSampling::Average8},
{ADC::Range16384nA, Sampling::Rate100, LEDPulse::Width411, FIFOSampling::Average1},
{ADC::Range16384nA, Sampling::Rate1000, LEDPulse::Width118, FIFOSampling::Average16},
{ADC::Range8192nA, Sampling::Rate200, LEDPulse::Width69, FIFOSampling::Average2},
{ADC::Range16384nA, Sampling::Rate1000, LEDPulse::Width69, FIFOSampling::Average4},
{ADC::Range4096nA, Sampling::Rate400, LEDPulse::Width215, FIFOSampling::Average1},
{ADC::Range4096nA, Sampling::Rate800, LEDPulse::Width215, FIFOSampling::Average2},
{ADC::Range2048nA, Sampling::Rate100, LEDPulse::Width118, FIFOSampling::Average8},
{ADC::Range16384nA, Sampling::Rate50, LEDPulse::Width69, FIFOSampling::Average32},
{ADC::Range8192nA, Sampling::Rate50, LEDPulse::Width411, FIFOSampling::Average16},
{ADC::Range8192nA, Sampling::Rate1600, LEDPulse::Width69, FIFOSampling::Average8},
{ADC::Range2048nA, Sampling::Rate400, LEDPulse::Width411, FIFOSampling::Average8},
{ADC::Range4096nA, Sampling::Rate1600, LEDPulse::Width69, FIFOSampling::Average2},
{ADC::Range2048nA, Sampling::Rate1000, LEDPulse::Width69, FIFOSampling::Average1},
{ADC::Range2048nA, Sampling::Rate100, LEDPulse::Width69, FIFOSampling::Average32},
{ADC::Range4096nA, Sampling::Rate800, LEDPulse::Width69, FIFOSampling::Average16},
{ADC::Range2048nA, Sampling::Rate1000, LEDPulse::Width69, FIFOSampling::Average2},
{ADC::Range16384nA, Sampling::Rate200, LEDPulse::Width411, FIFOSampling::Average32},
{ADC::Range2048nA, Sampling::Rate1600, LEDPulse::Width69, FIFOSampling::Average16},
{ADC::Range2048nA, Sampling::Rate100, LEDPulse::Width69, FIFOSampling::Average2},
{ADC::Range2048nA, Sampling::Rate1600, LEDPulse::Width69, FIFOSampling::Average32},
{ADC::Range16384nA, Sampling::Rate50, LEDPulse::Width69, FIFOSampling::Average8},
{ADC::Range2048nA, Sampling::Rate400, LEDPulse::Width69, FIFOSampling::Average4},
{ADC::Range2048nA, Sampling::Rate400, LEDPulse::Width69, FIFOSampling::Average16},
{ADC::Range2048nA, Sampling::Rate200, LEDPulse::Width118, FIFOSampling::Average4},
};
for (auto&& cond : cond_table) {
SpO2ADCRange range{};
ADC range{};
Sampling rate{};
LEDPulseWidth width{};
LEDPulse width{};
FIFOSampling avg{};
std::tie(range, rate, width, avg) = cond;
auto s = m5::utility::formatString("SPO2 RNG:%u SR:%u WID:%u AVG:%u", range, rate, width, avg);
SCOPED_TRACE(s);
EXPECT_TRUE(unit->startPeriodicMeasurement(Mode::SPO2, range, rate, width, avg, 0x1f, 0x1f));
EXPECT_TRUE(unit->startPeriodicMeasurement(Mode::SpO2, range, rate, width, avg, 0x1f, 0x1f));
auto it = unit->interval() ? unit->interval() : 1;
auto elapsed = test_periodic(unit, STORED_SIZE, it);
@@ -403,61 +403,61 @@ void test_periodic_spo2(UnitMAX30102* unit)
void test_periodic_hr(UnitMAX30102* unit)
{
// Pairwise
constexpr std::tuple<SpO2ADCRange, Sampling, LEDPulseWidth, FIFOSampling> cond_table[] = {
{SpO2ADCRange::nA8192, Sampling::Rate3200, LEDPulseWidth::PW69, FIFOSampling::Average4},
{SpO2ADCRange::nA2048, Sampling::Rate50, LEDPulseWidth::PW118, FIFOSampling::Average1},
{SpO2ADCRange::nA8192, Sampling::Rate100, LEDPulseWidth::PW215, FIFOSampling::Average16},
{SpO2ADCRange::nA4096, Sampling::Rate100, LEDPulseWidth::PW411, FIFOSampling::Average4},
{SpO2ADCRange::nA4096, Sampling::Rate200, LEDPulseWidth::PW215, FIFOSampling::Average8},
{SpO2ADCRange::nA8192, Sampling::Rate1000, LEDPulseWidth::PW118, FIFOSampling::Average8},
{SpO2ADCRange::nA4096, Sampling::Rate1000, LEDPulseWidth::PW69, FIFOSampling::Average1},
{SpO2ADCRange::nA16384, Sampling::Rate400, LEDPulseWidth::PW118, FIFOSampling::Average2},
{SpO2ADCRange::nA2048, Sampling::Rate200, LEDPulseWidth::PW69, FIFOSampling::Average16},
{SpO2ADCRange::nA8192, Sampling::Rate800, LEDPulseWidth::PW411, FIFOSampling::Average32},
{SpO2ADCRange::nA16384, Sampling::Rate1000, LEDPulseWidth::PW215, FIFOSampling::Average32},
{SpO2ADCRange::nA2048, Sampling::Rate1600, LEDPulseWidth::PW215, FIFOSampling::Average1},
{SpO2ADCRange::nA16384, Sampling::Rate200, LEDPulseWidth::PW411, FIFOSampling::Average1},
{SpO2ADCRange::nA2048, Sampling::Rate50, LEDPulseWidth::PW411, FIFOSampling::Average2},
{SpO2ADCRange::nA8192, Sampling::Rate400, LEDPulseWidth::PW215, FIFOSampling::Average1},
{SpO2ADCRange::nA8192, Sampling::Rate200, LEDPulseWidth::PW118, FIFOSampling::Average32},
{SpO2ADCRange::nA4096, Sampling::Rate1600, LEDPulseWidth::PW118, FIFOSampling::Average4},
{SpO2ADCRange::nA4096, Sampling::Rate3200, LEDPulseWidth::PW69, FIFOSampling::Average32},
{SpO2ADCRange::nA4096, Sampling::Rate50, LEDPulseWidth::PW215, FIFOSampling::Average4},
{SpO2ADCRange::nA2048, Sampling::Rate800, LEDPulseWidth::PW118, FIFOSampling::Average4},
{SpO2ADCRange::nA4096, Sampling::Rate800, LEDPulseWidth::PW69, FIFOSampling::Average2},
{SpO2ADCRange::nA16384, Sampling::Rate800, LEDPulseWidth::PW69, FIFOSampling::Average8},
{SpO2ADCRange::nA16384, Sampling::Rate3200, LEDPulseWidth::PW69, FIFOSampling::Average1},
{SpO2ADCRange::nA2048, Sampling::Rate3200, LEDPulseWidth::PW69, FIFOSampling::Average8},
{SpO2ADCRange::nA16384, Sampling::Rate100, LEDPulseWidth::PW118, FIFOSampling::Average1},
{SpO2ADCRange::nA4096, Sampling::Rate1000, LEDPulseWidth::PW411, FIFOSampling::Average16},
{SpO2ADCRange::nA8192, Sampling::Rate200, LEDPulseWidth::PW215, FIFOSampling::Average2},
{SpO2ADCRange::nA16384, Sampling::Rate1000, LEDPulseWidth::PW69, FIFOSampling::Average4},
{SpO2ADCRange::nA16384, Sampling::Rate1600, LEDPulseWidth::PW118, FIFOSampling::Average16},
{SpO2ADCRange::nA2048, Sampling::Rate800, LEDPulseWidth::PW215, FIFOSampling::Average1},
{SpO2ADCRange::nA2048, Sampling::Rate400, LEDPulseWidth::PW69, FIFOSampling::Average32},
{SpO2ADCRange::nA4096, Sampling::Rate400, LEDPulseWidth::PW411, FIFOSampling::Average8},
{SpO2ADCRange::nA2048, Sampling::Rate100, LEDPulseWidth::PW69, FIFOSampling::Average32},
{SpO2ADCRange::nA16384, Sampling::Rate50, LEDPulseWidth::PW69, FIFOSampling::Average32},
{SpO2ADCRange::nA8192, Sampling::Rate50, LEDPulseWidth::PW69, FIFOSampling::Average16},
{SpO2ADCRange::nA8192, Sampling::Rate1600, LEDPulseWidth::PW69, FIFOSampling::Average8},
{SpO2ADCRange::nA2048, Sampling::Rate1600, LEDPulseWidth::PW69, FIFOSampling::Average2},
{SpO2ADCRange::nA2048, Sampling::Rate800, LEDPulseWidth::PW69, FIFOSampling::Average16},
{SpO2ADCRange::nA2048, Sampling::Rate1000, LEDPulseWidth::PW69, FIFOSampling::Average2},
{SpO2ADCRange::nA2048, Sampling::Rate100, LEDPulseWidth::PW69, FIFOSampling::Average2},
{SpO2ADCRange::nA2048, Sampling::Rate1600, LEDPulseWidth::PW69, FIFOSampling::Average32},
{SpO2ADCRange::nA2048, Sampling::Rate3200, LEDPulseWidth::PW69, FIFOSampling::Average16},
{SpO2ADCRange::nA2048, Sampling::Rate400, LEDPulseWidth::PW69, FIFOSampling::Average4},
{SpO2ADCRange::nA2048, Sampling::Rate100, LEDPulseWidth::PW69, FIFOSampling::Average8},
{SpO2ADCRange::nA2048, Sampling::Rate3200, LEDPulseWidth::PW69, FIFOSampling::Average2},
{SpO2ADCRange::nA2048, Sampling::Rate50, LEDPulseWidth::PW69, FIFOSampling::Average8},
{SpO2ADCRange::nA2048, Sampling::Rate400, LEDPulseWidth::PW69, FIFOSampling::Average16},
{SpO2ADCRange::nA2048, Sampling::Rate200, LEDPulseWidth::PW69, FIFOSampling::Average4},
constexpr std::tuple<ADC, Sampling, LEDPulse, FIFOSampling> cond_table[] = {
{ADC::Range8192nA, Sampling::Rate3200, LEDPulse::Width69, FIFOSampling::Average4},
{ADC::Range2048nA, Sampling::Rate50, LEDPulse::Width118, FIFOSampling::Average1},
{ADC::Range8192nA, Sampling::Rate100, LEDPulse::Width215, FIFOSampling::Average16},
{ADC::Range4096nA, Sampling::Rate100, LEDPulse::Width411, FIFOSampling::Average4},
{ADC::Range4096nA, Sampling::Rate200, LEDPulse::Width215, FIFOSampling::Average8},
{ADC::Range8192nA, Sampling::Rate1000, LEDPulse::Width118, FIFOSampling::Average8},
{ADC::Range4096nA, Sampling::Rate1000, LEDPulse::Width69, FIFOSampling::Average1},
{ADC::Range16384nA, Sampling::Rate400, LEDPulse::Width118, FIFOSampling::Average2},
{ADC::Range2048nA, Sampling::Rate200, LEDPulse::Width69, FIFOSampling::Average16},
{ADC::Range8192nA, Sampling::Rate800, LEDPulse::Width411, FIFOSampling::Average32},
{ADC::Range16384nA, Sampling::Rate1000, LEDPulse::Width215, FIFOSampling::Average32},
{ADC::Range2048nA, Sampling::Rate1600, LEDPulse::Width215, FIFOSampling::Average1},
{ADC::Range16384nA, Sampling::Rate200, LEDPulse::Width411, FIFOSampling::Average1},
{ADC::Range2048nA, Sampling::Rate50, LEDPulse::Width411, FIFOSampling::Average2},
{ADC::Range8192nA, Sampling::Rate400, LEDPulse::Width215, FIFOSampling::Average1},
{ADC::Range8192nA, Sampling::Rate200, LEDPulse::Width118, FIFOSampling::Average32},
{ADC::Range4096nA, Sampling::Rate1600, LEDPulse::Width118, FIFOSampling::Average4},
{ADC::Range4096nA, Sampling::Rate3200, LEDPulse::Width69, FIFOSampling::Average32},
{ADC::Range4096nA, Sampling::Rate50, LEDPulse::Width215, FIFOSampling::Average4},
{ADC::Range2048nA, Sampling::Rate800, LEDPulse::Width118, FIFOSampling::Average4},
{ADC::Range4096nA, Sampling::Rate800, LEDPulse::Width69, FIFOSampling::Average2},
{ADC::Range16384nA, Sampling::Rate800, LEDPulse::Width69, FIFOSampling::Average8},
{ADC::Range16384nA, Sampling::Rate3200, LEDPulse::Width69, FIFOSampling::Average1},
{ADC::Range2048nA, Sampling::Rate3200, LEDPulse::Width69, FIFOSampling::Average8},
{ADC::Range16384nA, Sampling::Rate100, LEDPulse::Width118, FIFOSampling::Average1},
{ADC::Range4096nA, Sampling::Rate1000, LEDPulse::Width411, FIFOSampling::Average16},
{ADC::Range8192nA, Sampling::Rate200, LEDPulse::Width215, FIFOSampling::Average2},
{ADC::Range16384nA, Sampling::Rate1000, LEDPulse::Width69, FIFOSampling::Average4},
{ADC::Range16384nA, Sampling::Rate1600, LEDPulse::Width118, FIFOSampling::Average16},
{ADC::Range2048nA, Sampling::Rate800, LEDPulse::Width215, FIFOSampling::Average1},
{ADC::Range2048nA, Sampling::Rate400, LEDPulse::Width69, FIFOSampling::Average32},
{ADC::Range4096nA, Sampling::Rate400, LEDPulse::Width411, FIFOSampling::Average8},
{ADC::Range2048nA, Sampling::Rate100, LEDPulse::Width69, FIFOSampling::Average32},
{ADC::Range16384nA, Sampling::Rate50, LEDPulse::Width69, FIFOSampling::Average32},
{ADC::Range8192nA, Sampling::Rate50, LEDPulse::Width69, FIFOSampling::Average16},
{ADC::Range8192nA, Sampling::Rate1600, LEDPulse::Width69, FIFOSampling::Average8},
{ADC::Range2048nA, Sampling::Rate1600, LEDPulse::Width69, FIFOSampling::Average2},
{ADC::Range2048nA, Sampling::Rate800, LEDPulse::Width69, FIFOSampling::Average16},
{ADC::Range2048nA, Sampling::Rate1000, LEDPulse::Width69, FIFOSampling::Average2},
{ADC::Range2048nA, Sampling::Rate100, LEDPulse::Width69, FIFOSampling::Average2},
{ADC::Range2048nA, Sampling::Rate1600, LEDPulse::Width69, FIFOSampling::Average32},
{ADC::Range2048nA, Sampling::Rate3200, LEDPulse::Width69, FIFOSampling::Average16},
{ADC::Range2048nA, Sampling::Rate400, LEDPulse::Width69, FIFOSampling::Average4},
{ADC::Range2048nA, Sampling::Rate100, LEDPulse::Width69, FIFOSampling::Average8},
{ADC::Range2048nA, Sampling::Rate3200, LEDPulse::Width69, FIFOSampling::Average2},
{ADC::Range2048nA, Sampling::Rate50, LEDPulse::Width69, FIFOSampling::Average8},
{ADC::Range2048nA, Sampling::Rate400, LEDPulse::Width69, FIFOSampling::Average16},
{ADC::Range2048nA, Sampling::Rate200, LEDPulse::Width69, FIFOSampling::Average4},
};
for (auto&& cond : cond_table) {
SpO2ADCRange range{};
ADC range{};
Sampling rate{};
LEDPulseWidth width{};
LEDPulse width{};
FIFOSampling avg{};
std::tie(range, rate, width, avg) = cond;
@@ -638,8 +638,8 @@ TEST_P(TestMAX30102, SpO2Cfg)
EXPECT_TRUE(unit->stopPeriodicMeasurement());
EXPECT_FALSE(unit->inPeriodic());
test_spo2_config(unit.get(), Mode::SPO2);
test_spo2_config_each(unit.get(), Mode::SPO2);
test_spo2_config(unit.get(), Mode::SpO2);
test_spo2_config_each(unit.get(), Mode::SpO2);
test_spo2_config(unit.get(), Mode::HROnly);
test_spo2_config_each(unit.get(), Mode::HROnly);
@@ -719,7 +719,7 @@ TEST_P(TestMAX30102, MultiLEDMode)
// All invalid (slots can be set for MutiLED mode only).
constexpr Mode m_table[] = {
Mode::SPO2,
Mode::SpO2,
Mode::HROnly,
};
for (auto&& mode : m_table) {
@@ -814,7 +814,7 @@ TEST_P(TestMAX30102, Reset)
//
EXPECT_TRUE(unit->writeMode(Mode::MultiLED));
EXPECT_TRUE(unit->writeSpO2Configuration(SpO2ADCRange::nA16384, Sampling::Rate400, LEDPulseWidth::PW411));
EXPECT_TRUE(unit->writeSpO2Configuration(ADC::Range16384nA, Sampling::Rate400, LEDPulse::Width411));
EXPECT_TRUE(unit->writeLEDCurrent(0, 255));
EXPECT_TRUE(unit->writeLEDCurrent(1, 255));
EXPECT_TRUE(unit->writeMultiLEDModeControl(Slot::IR, Slot::Red));
@@ -835,13 +835,13 @@ TEST_P(TestMAX30102, Reset)
EXPECT_TRUE(unit->readMode(mode));
EXPECT_EQ(mode, Mode::None);
SpO2ADCRange range{};
ADC range{};
Sampling rate{};
LEDPulseWidth width{};
LEDPulse width{};
EXPECT_TRUE(unit->readSpO2Configuration(range, rate, width));
EXPECT_EQ(range, SpO2ADCRange::nA2048);
EXPECT_EQ(range, ADC::Range2048nA);
EXPECT_EQ(rate, Sampling::Rate50);
EXPECT_EQ(width, LEDPulseWidth::PW69);
EXPECT_EQ(width, LEDPulse::Width69);
uint8_t led1{}, led2{};
EXPECT_TRUE(unit->readLEDCurrent(led1, 0));
@@ -880,8 +880,8 @@ TEST_P(TestMAX30102, Periodic)
EXPECT_FALSE(unit->inPeriodic());
// 100 sps
EXPECT_TRUE(unit->startPeriodicMeasurement(Mode::SPO2, SpO2ADCRange::nA4096, Sampling::Rate100,
LEDPulseWidth::PW411, FIFOSampling::Average1, 0x1F, 0x1F));
EXPECT_TRUE(unit->startPeriodicMeasurement(Mode::SpO2, ADC::Range4096nA, Sampling::Rate100, LEDPulse::Width411,
FIFOSampling::Average1, 0x1F, 0x1F));
// Wait first updated
auto start_at = m5::utility::millis();
@@ -977,7 +977,7 @@ TEST_P(TestMAX30102, Periodic_MultiLED)
EXPECT_FALSE(unit->inPeriodic());
EXPECT_TRUE(unit->writeMode(Mode::MultiLED));
EXPECT_TRUE(unit->writeSpO2Configuration(SpO2ADCRange::nA4096, Sampling::Rate400, LEDPulseWidth::PW411));
EXPECT_TRUE(unit->writeSpO2Configuration(ADC::Range4096nA, Sampling::Rate400, LEDPulse::Width411));
EXPECT_TRUE(unit->writeFIFOConfiguration(FIFOSampling::Average4, true, 15));
EXPECT_TRUE(unit->writeLEDCurrent(0, 0x40));
EXPECT_TRUE(unit->writeLEDCurrent(1, 0x1F));