48 MAX30001G(uint8_t csPin,
int intPin1 = -1,
int intPin2 = -1);
89 bool update(
bool reportRaw =
false);
107 void enableAFE(
bool ECG,
bool BIOZ,
bool RtoR);
130 bool threeleads =
true);
157 uint32_t frequency = 40000,
158 uint32_t current = 8000,
160 bool leadbias =
true,
161 bool leadsoffdetect =
false,
162 bool fourleads =
false
188 uint8_t ecg_speed = 1,
189 uint8_t ecg_gain = 2,
190 bool ecg_threeleads =
true,
191 uint8_t bioz_speed = 0,
192 uint8_t bioz_gain = 1,
193 uint8_t bioz_dlpf = 1,
194 uint8_t bioz_dhpf = 0,
195 uint32_t bioz_frequency = 8000,
196 uint32_t bioz_current = 8000,
197 float bioz_phase = 0.0f,
198 bool leadbias =
true,
199 bool leadsoffdetect =
false,
200 bool bioz_fourleads =
false
248 uint32_t frequency = 40000,
249 uint32_t current = 8000,
251 uint32_t resistance = 5000,
252 uint8_t modulation = 0,
253 uint8_t modulation_frequency = 3
262 uint32_t frequency = 40000,
float phase = 0.0f
273 void setupBIOZScan(uint8_t avg,
bool fast,
bool fourleads,
bool fullRange);
292 void scanBIOZ(uint8_t avg = 2,
bool fast =
false,
bool fourleads =
false,
bool fullRange =
false);
323 void scanBIOZ(
const BIOZScanConfig& config,
bool reuseCurrents =
false);
539 bool setInterrupt1(
bool ecg,
bool bioz,
bool rtor,
bool leadon,
bool leadoff,
bool bioz_fourwire =
false) {
540 return setInterrupt(
MAX30001_EN_INT1, ecg, bioz, rtor, leadon, leadoff, bioz_fourwire);
553 bool setInterrupt2(
bool ecg,
bool bioz,
bool rtor,
bool leadon,
bool leadoff,
bool bioz_fourwire =
false) {
554 return setInterrupt(
MAX30001_EN_INT2, ecg, bioz, rtor, leadon, leadoff, bioz_fourwire);
864 void setRtoR(
bool enable, uint8_t ptsf, uint8_t pavg, uint8_t gain, uint8_t wndw, uint8_t hoff, uint8_t ravg, uint8_t rhsf);
903 bool enableECGCalSignal,
904 bool enableBIOZCalSignal,
985 bool useHighResistance,
986 bool enableModulation,
1009 void printEN_INT1(
void) { printEN_INT(
en_int1); }
1012 void printEN_INT2(
void) { printEN_INT(
en_int2); }
1015 void printMNGR_INT(
void);
1018 void printMNGR_DYN(
void);
1021 void printCNFG_GEN(
void);
1024 void printCNFG_CAL(
void);
1027 void printCNFG_EMUX(
void);
1030 void printCNFG_ECG(
void);
1033 void printCNFG_BMUX(
void);
1036 void printCNFG_BIOZ(
void);
1039 void printCNFG_BIOZ_LC(
void);
1042 void printCNFG_RTOR1(
void);
1045 void printCNFG_RTOR2(
void);
1054 void updateGlobalECG_samplingRate(
void);
1057 void updateGlobalBIOZ_samplingRate(
void);
1060 void updateGlobalCAL_fcal(
void);
1063 void updateGlobalECG_latency(
void);
1066 void updateGlobalBIOZ_frequency(
void);
1069 void updateGlobalBIOZ_test_impedance(
void);
1072 void updateGlobalECG_lpf(
void);
1075 void updateGlobalBIOZ_dlpf(
void);
1078 void updateGlobalRCAL_freq(
void);
1081 void refreshTimingGlobals(
void);
1103 bool setInterrupt(uint8_t interrupt,
bool ecg,
bool bioz,
bool rtor,
bool leadon,
bool leadoff,
bool bioz_fourwire);
1109 void latchStatusFlags(uint32_t statusWord);
1115 uint32_t readStatusAndLatchFlags(
void);
1125 void writeRegister(uint8_t address, uint32_t data);
1132 uint32_t readRegister24(uint8_t address);
1139 uint32_t readRegister(uint8_t address) {
return readRegister24(address); }
1146 uint8_t readRegisterByte(uint8_t address);
1153 uint8_t readRegister8(uint8_t address) {
return readRegisterByte(address); };
1161 bool verifyWrite(uint8_t address, uint32_t expectedValue);
1169 bool verifRegister(uint8_t address, uint32_t expectedValue) {
return verifyWrite(address, expectedValue); }
1186 int32_t closestCurrent(int32_t current);
1195 float impedanceCosineModel(
float theta,
float magnitude,
float phase);
1196 float impedanceTriangularModel(
float theta,
float magnitude,
float phase);
1205 ImpedanceModel fitImpedanceCosine(
const float* phases,
const float* impedances,
int num_points);
1206 ImpedanceModel fitImpedanceTriangular(
const float* phases,
const float* impedances,
int num_points);
1208 uint8_t biozScanPhaseCountForFreq(uint8_t freq_idx)
const;
1209 uint8_t biozScanPhaseSelectorForStep(uint8_t freq_idx, uint8_t phase_step_idx)
const;
1210 uint8_t biozScanSelectAHPF(uint8_t freq_idx)
const;
1211 int32_t biozScanMaxHighCurrentForFreq(uint8_t freq_idx);
1212 int32_t biozScanClampCurrentForFreq(uint8_t freq_idx, int32_t requested_nA);
1213 float biozScanRobustMeanFromBuffer(uint8_t outlier_min_samples,
float outlier_sigma,
bool& hasSamples);
1218 enum SetupProfile : uint8_t {
1224 PROFILE_BIOZ_IMP_CAL,
1225 PROFILE_ECG_AND_BIOZ,
1229 enum BiozScanState : uint8_t {
1232 BIOZ_SCAN_CONFIG_FREQ,
1233 BIOZ_SCAN_CONFIG_CURRENT,
1234 BIOZ_SCAN_CONFIG_PHASE,
1235 BIOZ_SCAN_BEGIN_POINT,
1236 BIOZ_SCAN_DISCARD_POINT,
1237 BIOZ_SCAN_COLLECT_POINT,
1238 BIOZ_SCAN_PROCESS_POINT,
1239 BIOZ_SCAN_NEXT_PHASE,
1240 BIOZ_SCAN_EVALUATE_ATTEMPT,
1241 BIOZ_SCAN_FINALIZE_FREQ,
1252 static void onAFE_IRQ1(
void);
1256 static void onAFE_IRQ2(
void);
1258 SetupProfile _profile;
1266 bool _drainECGOnUpdate;
1267 bool _drainBIOZOnUpdate;
1268 bool _readRTOROnUpdate;
1270 bool _applyLeadSettingsOnStart;
1271 bool _leadBiasEnable;
1272 uint8_t _leadBiasResistance;
1273 bool _leadOffEnable;
1275 uint8_t _leadOffElectrodeImpedance;
1281 bool _scanCurrentProfileValid;
1283 uint8_t _scanProfileFreqStart;
1284 uint8_t _scanProfileFreqEnd;
1285 bool _scanProfileFast;
1288 bool _scanReuseCurrents;
1289 bool _scanInProgress;
1290 bool _scanCompleted;
1292 BiozScanState _BIOZScanState;
1293 uint8_t _scanFreqIndex;
1294 uint8_t _scanPhaseIndex;
1295 uint8_t _scanAttempt;
1296 uint8_t _scanNumPhaseMeasurements;
1297 uint8_t _scanDiscardSamplesSeen;
1298 uint8_t _scanDiscardSamplesTarget;
1299 uint8_t _scanCollectSamplesTarget;
1300 bool _scanCurrentChangedForAttempt;
1301 uint32_t _scanFifoTimeoutMs;
1302 uint32_t _scanWaitDeadlineMs;
1304 float _scanThresholdMin;
1305 float _scanThresholdMax;
1306 float _scanAdcTarget;
1309 bool _scanSawInvalidOrRange;
1310 bool _scanAnyAboveTarget;
1311 bool _scanAnyInTarget;
1312 float _scanMaxAbsRaw;
MAX30001G device driver class used by Arduino sketches.
Definition max30001g.h:34
void setDefaultRtoR(void)
Apply default RTOR settings and enable RTOR detection.
Definition max30001g_configure_rtor.cpp:9
void setECGgain(uint8_t gain)
Set ECG PGA gain.
Definition max30001g_configure_ecg.cpp:113
void setDefaultECGandBIOZTestSignal(void)
Apply default voltage calibration settings to ECG and BIOZ.
Definition max30001g_calibration.cpp:75
void setFIFOInterruptThreshold(uint8_t ecg, uint8_t bioz)
Set FIFO threshold that triggers ECG/BIOZ FIFO interrupts.
Definition max30001g_interrupt.cpp:555
void setupBIOZImpedanceCalibration(uint8_t speed=0, uint8_t gain=1, uint8_t ahpf=1, uint8_t dlpf=1, uint8_t dhpf=0, uint32_t frequency=40000, uint32_t current=8000, float phase=0.0f, uint32_t resistance=5000, uint8_t modulation=0, uint8_t modulation_frequency=3)
Configure internal BIOZ impedance calibration/test path.
Definition max30001g.cpp:1019
void clearLatchedStatusFlags(void)
Clear software-latched interrupt/fault flags.
Definition max30001g_interrupt.cpp:90
void setBIOZfilter(uint8_t ahpf, uint8_t lpf, uint8_t hpf)
Configure BIOZ analog and digital filters.
Definition max30001g_configure_bioz.cpp:548
void stepBIOZScan(void)
Advance state-machine style BIOZ scan flow by one step.
Definition max30001g.cpp:2050
void setDefaultBIOZTestSignal(void)
Apply default BIOZ voltage calibration signal settings.
Definition max30001g_calibration.cpp:56
void setDefaultECGTestSignal(void)
Apply default ECG voltage calibration signal settings.
Definition max30001g_calibration.cpp:38
void begin(void)
Definition max30001g.cpp:329
void setECGfilter(uint8_t lpf, uint8_t hpf)
Configure ECG digital filters.
Definition max30001g_configure_ecg.cpp:52
void setRtoR(bool enable, uint8_t ptsf, uint8_t pavg, uint8_t gain, uint8_t wndw, uint8_t hoff, uint8_t ravg, uint8_t rhsf)
Configure RTOR algorithm parameters.
Definition max30001g_configure_rtor.cpp:61
void readInfo(void)
Definition max30001g_regs.cpp:116
void setupBIOZSignalCalibration(uint8_t speed=0, uint8_t gain=1)
Configure BIOZ voltage calibration signal path.
Definition max30001g.cpp:928
void setBIOZModulationFrequencyByFrequency(uint32_t frequency_hz)
Set BIOZ modulation frequency by target Hz.
Definition max30001g_configure_bioz.cpp:248
void setLeadsOffDetection(bool enable, bool bioz_4, uint8_t electrode_impedance)
Configure lead-off detection behavior.
Definition max30001g_configure_leads.cpp:45
void setECGSamplingRate(uint8_t ECG)
Set ECG sample-rate selector.
Definition max30001g_configure_ecg.cpp:8
void readStatusRegisters(void)
Definition max30001g_regs.cpp:126
void setBIOZmag(uint32_t current_nA)
Set BIOZ current magnitude.
Definition max30001g_configure_bioz.cpp:312
void setECGNormalRecovery(void)
Definition max30001g_configure_ecg.cpp:243
void setupECGSignalCalibration(uint8_t speed=1, uint8_t gain=2)
Configure ECG voltage calibration signal path.
Definition max30001g.cpp:640
void setupBIOZScan(uint8_t avg, bool fast, bool fourleads, bool fullRange)
Configure lifecycle-driven BIOZ scan flow.
Definition max30001g.cpp:1653
float readBIOZ(bool reportRaw)
Read one BIOZ FIFO sample.
Definition max30001g_readdata.cpp:145
void handleECGFifoInterrupt(bool reportRaw=false)
Convenience callback handler: read ECG FIFO.
Definition max30001g_interrupt.cpp:338
void clearInterruptAggregateCallback(void)
Clear aggregate interrupt callback.
Definition max30001g_interrupt.cpp:310
void serviceAllInterrupts(void)
Read STATUS and update interrupt-driven global flags.
Definition max30001g_interrupt.cpp:178
void setupBIOZExternalImpedanceCalibration(uint32_t frequency=40000, float phase=0.0f)
Configure external impedance calibration path.
Definition max30001g.cpp:1268
void enableAFE(bool ECG, bool BIOZ, bool RtoR)
Enable or disable ECG, BIOZ, and R-to-R engines.
Definition max30001g.cpp:473
bool setInterrupt1(bool ecg, bool bioz, bool rtor, bool leadon, bool leadoff, bool bioz_fourwire=false)
Configure interrupt line INT1 event enables.
Definition max30001g.h:539
bool setInterruptAggregateCallback(InterruptCallback cb, void *context=nullptr, uint32_t statusMask=0x00FFFFFFUL)
Register aggregate callback invoked for status bits matching a mask.
Definition max30001g_interrupt.cpp:282
void handleRtoRInterrupt(void)
Convenience callback handler: read RTOR data.
Definition max30001g_interrupt.cpp:346
void stopBIOZScan(void)
Stop state-machine style BIOZ scan flow.
Definition max30001g.cpp:1826
float readECG(bool reportRaw)
Read one ECG FIFO sample.
Definition max30001g_readdata.cpp:118
void printConfig(void)
Definition max30001g_regs.cpp:70
bool setInterruptEventCallback(InterruptEvent event, InterruptCallback cb, void *context=nullptr)
Register callback for one specific interrupt event.
Definition max30001g_interrupt.cpp:266
void setLeadsOnDetection(bool enable)
Enable/disable ultra-low-power lead-on detection.
Definition max30001g_configure_leads.cpp:7
bool setInterrupt2(bool ecg, bool bioz, bool rtor, bool leadon, bool leadoff, bool bioz_fourwire=false)
Configure interrupt line INT2 event enables.
Definition max30001g.h:553
void setBIOZModulationFrequencybyIndex(uint8_t frequency_selector)
Set BIOZ modulation frequency by FCGEN index.
Definition max30001g_configure_bioz.cpp:281
void setBIOZgain(uint8_t gain, bool lowNoise)
Set BIOZ gain and front-end power/noise mode.
Definition max30001g_configure_bioz.cpp:215
void setTestSignal(bool enableECGCalSignal, bool enableBIOZCalSignal, bool unipolar, bool cal_vmag, uint8_t freq, uint8_t dutycycle)
Configure calibration voltage source and waveform settings.
Definition max30001g_calibration.cpp:96
void setupECG(uint8_t speed=1, uint8_t gain=2, bool threeleads=true)
Configure a ready-to-use ECG profile.
Definition max30001g.cpp:506
bool servicePendingInterrupts(void)
Service interrupts only when ISR software flags indicate pending work.
Definition max30001g_interrupt.cpp:154
void handleBIOZFifoInterrupt(bool reportRaw=false)
Convenience callback handler: read BIOZ FIFO.
Definition max30001g_interrupt.cpp:342
void end(void)
Definition max30001g.cpp:449
void stopECGManualRecovery(void)
Definition max30001g_configure_ecg.cpp:268
void readAllRegisters(void)
Definition max30001g_regs.cpp:10
void setBIOZSamplingRate(uint8_t speed_select)
Set BIOZ sample-rate selector.
Definition max30001g_configure_bioz.cpp:190
void setDefaultNoTestSignal(void)
Disable ECG/BIOZ voltage calibration source routing.
Definition max30001g_calibration.cpp:24
void setDefaultBIOZTestImpedance(void)
Apply default internal BIOZ test impedance settings.
Definition max30001g_calibration.cpp:323
void setECGAutoRecovery(int threshold_voltage)
Enable automatic ECG fast-recovery mode.
Definition max30001g_configure_ecg.cpp:206
void setDefaultNoBIOZTestImpedance(void)
Disable internal BIOZ test impedance path.
Definition max30001g_calibration.cpp:312
void setBIOZmodulation(uint8_t mode)
Set BIOZ current-generator modulation mode.
Definition max30001g_configure_bioz.cpp:614
void readECG_FIFO(bool reportRaw)
Burst-read ECG FIFO samples.
Definition max30001g_readdata.cpp:181
void printStatus(void)
Definition max30001g_regs.cpp:138
void printAllRegisters(void)
Definition max30001g_regs.cpp:75
void setBIOZPhaseOffsetbyPhase(float phase_deg)
Set BIOZ demodulation phase by degree request.
Definition max30001g_configure_bioz.cpp:493
void startECGManualRecovery(void)
Definition max30001g_configure_ecg.cpp:259
void readAndClearFaults(void)
Read and clear fault-related status conditions.
Definition max30001g_interrupt.cpp:258
void setDefaultInterruptClearing(void)
Configure default interrupt-clear, clears on RR read, fast recovery read, and sample read.
Definition max30001g_interrupt.cpp:512
void synch(void)
Definition max30001g_system.cpp:34
void restoreConfig(void)
Definition max30001g_regs.cpp:45
void readRTOR(void)
Read RTOR result and update RR-interval globals/buffer.
Definition max30001g_readdata.cpp:88
void setBIOZPhaseOffsetbyIndex(uint8_t selector)
Set BIOZ demodulation phase by selector.
Definition max30001g_configure_bioz.cpp:518
void clearAllInterruptCallbacks(void)
Clear all registered interrupt callbacks for this instance.
Definition max30001g_interrupt.cpp:323
void setECGLeadPolarity(bool inverted, bool open)
Configure ECG polarity and input switch state.
Definition max30001g_configure_ecg.cpp:158
void setLeadsBias(bool enable, uint8_t resistance)
Configure lead-bias mode and resistance.
Definition max30001g_configure_leads.cpp:360
void setFMSTR(uint8_t fmstr)
Set master clock selector and recompute timing globals.
Definition max30001g_system.cpp:47
void setupBIOZ(uint8_t speed=0, uint8_t gain=1, uint8_t ahpf=1, uint8_t dlpf=1, uint8_t dhpf=0, uint32_t frequency=40000, uint32_t current=8000, float phase=0.0f, bool leadbias=true, bool leadsoffdetect=false, bool fourleads=false)
Configure a ready-to-use BIOZ profile.
Definition max30001g.cpp:737
void readBIOZ_FIFO(bool reportRaw)
Burst-read BIOZ FIFO samples.
Definition max30001g_readdata.cpp:248
void setDefaultNoRtoR(void)
Apply default RTOR settings with RTOR disabled.
Definition max30001g_configure_rtor.cpp:36
void setupECGandBIOZ(uint8_t ecg_speed=1, uint8_t ecg_gain=2, bool ecg_threeleads=true, uint8_t bioz_speed=0, uint8_t bioz_gain=1, uint8_t bioz_dlpf=1, uint8_t bioz_dhpf=0, uint32_t bioz_frequency=8000, uint32_t bioz_current=8000, float bioz_phase=0.0f, bool leadbias=true, bool leadsoffdetect=false, bool bioz_fourleads=false)
Configure simultaneous ECG and BIOZ operation.
Definition max30001g.cpp:1294
void startBIOZScan(void)
Start state-machine style BIOZ scan flow.
Definition max30001g.cpp:1812
void stop(void)
Stop active measurement engines.
Definition max30001g.cpp:382
void(* InterruptCallback)(MAX30001G *device, uint32_t status, void *context)
Definition max30001g.h:66
void FIFOReset(void)
Reset ECG and BIOZ FIFOs. Does not affect data already transferred to RingBuffer.
Definition max30001g_readdata.cpp:68
void printInfo(void)
Definition max30001g_regs.cpp:267
void saveConfig(void)
Definition max30001g_regs.cpp:28
HealthCheckResult healthCheck(void)
Run basic health checks and return a summary result.
Definition max30001g_system.cpp:18
void setBIOZTestImpedance(bool enable, bool useHighResistance, bool enableModulation, uint8_t rnomValue, uint8_t rmodValue, uint8_t modFreq)
Configure BIOZ test impedance and optional modulation.
Definition max30001g_calibration.cpp:334
bool updateRaw(void)
Alias for raw-code update cycle.
Definition max30001g.h:95
void start(void)
Start measurement engines according to the most recent setup profile.
Definition max30001g.cpp:347
void swReset(void)
Definition max30001g_system.cpp:41
bool update(bool reportRaw=false)
Service pending IRQ work and drain enabled FIFOs.
Definition max30001g.cpp:399
void printBiozDiagnosticRegisters(const char *context=nullptr)
Definition max30001g_regs.cpp:96
void clearInterruptEventCallback(InterruptEvent event)
Clear callback for one interrupt event.
Definition max30001g_interrupt.cpp:294
void setBIOZCurrentMonitor(bool enable)
Enable/disable BIOZ current monitor.
Definition max30001g_configure_bioz.cpp:648
InterruptEvent
Definition max30001g.h:50
@ IRQ_BIOZ_UNDER
Definition max30001g.h:58
@ IRQ_ECG_OVF
Definition max30001g.h:52
@ IRQ_BIOZ_CGMON
Definition max30001g.h:59
@ IRQ_ECG_LEADOFF
Definition max30001g.h:54
@ IRQ_ECG_FAST
Definition max30001g.h:53
@ IRQ_ECG_FIFO
Definition max30001g.h:51
@ IRQ_RTOR
Definition max30001g.h:61
@ IRQ_PLL_UNLOCK
Definition max30001g.h:62
@ IRQ_BIOZ_OVF
Definition max30001g.h:56
@ IRQ_EVENT_COUNT
Definition max30001g.h:63
@ IRQ_BIOZ_OVER
Definition max30001g.h:57
@ IRQ_BIOZ_FIFO
Definition max30001g.h:55
@ IRQ_LEADS_ON
Definition max30001g.h:60
#define MAX30001_BIOZ_NUM_FREQUENCIES
Definition max30001g_defs.h:11
#define MAX30001_EN_INT2
Definition max30001g_defs.h:20
#define MAX30001_BIOZ_NUM_PHASES
Definition max30001g_defs.h:12
#define MAX30001_EN_INT1
Definition max30001g_defs.h:19
max30001_en_int_reg_t en_int2
Definition max30001g_globals.cpp:82
float fmstr
Definition max30001g_globals.cpp:55
max30001_status_reg_t status
Definition max30001g_globals.cpp:80
max30001_en_int_reg_t en_int1
Definition max30001g_globals.cpp:81
BIOZScanConfig configuration structure fields:
Definition max30001g_typedefs.h:92
ConfigSnapshot structure for storing/restoring MAX30001G register configurations.
Definition max30001g_typedefs.h:148
HealthCheckResult structure for storing health check results.
Definition max30001g_typedefs.h:39
ImpedanceModel structure for storing impedance measurement results.
Definition max30001g_typedefs.h:16
EN_INT (0x02) and (0x03) page 43 we can attach two interrupt lines to functions of the MAX30001 multi...
Definition max30001g_regs_typedefs.h:59