Hexiwear Heart rate sensor driver

Dependents:   Hexi_MAX30101 Hexiwear HexiwearFinal HexiwearFinal1

Fork of FXOS8700 by Aswin Sivakumar

MAX30101.h

Committer:
DimiterK
Date:
2016-09-04
Revision:
4:3be008e67345
Parent:
3:4bfb42d6c70c

File content as of revision 4:3be008e67345:

#ifndef MAX30101_H
#define MAX30101_H
#include "mbed.h"

#define MAX30101_I2C_ADDRESS (0xAE<<1) //pins SA0,SA1=0

#define MAXIM_BYTES_PER_ADC_VALUE ( 3 )
#define MAXIM_FIFO_DEPTH          ( 32 )

#define MAX30101_InterruptStatus1                       0x00
#define MAX30101_InterruptStatus2                       0x01
#define MAX30101_InterruptEnable1                       0x02
#define MAX30101_InterruptEnable2                       0x03

#define MAX30101_FIFO_WR_PTR                            0x04
#define MAX30101_FIFO_OV_PTR                            0x05
#define MAX30101_FIFO_RD_PTR                            0x06
#define MAX30101_FIFO_DATA                              0x07
#define MAX30101_FIFOConfiguration                      0x08
#define MAX30101_ModeConfiguration                      0x09
#define MAX30101_SPO2Configuration                      0x0A
#define MAX30101_LED1RedPulseAmplitude                  0x0C
#define MAX30101_LED2IrPulseAmplitude                   0x0D
#define MAX30101_LED3GreenPulseAmplitude                0x0E
#define MAX30101_ProximityModePulseAmplitude            0x10
#define MAX30101_MultiLEDModeControlTime2Time1          0x11
#define MAX30101_MultiLEDModeControlTime4Time3          0x12
#define MAX30101_DieTemperatureInteger                  0x1F
#define MAX30101_DieTemperatureFraction                 0x20
#define MAX30101_DieTemperatureConfig                   0x21
#define MAX30101_ProximityInterruptThreshold            0x30
#define MAX30101_RevisionID                             0xFE
#define MAX30101_DeviceID                               0xFF

/******************************************************************************/
#define A_FULL          0x80
#define PPG_RD          0x40
#define ALC_OVF         0x20
#define PROX_IN         0x10
#define PWR_RDY         0x01

#define DIE_TEMP_RDY    0x02

#define A_FULL_EN       0x80
#define PPG_RDY_EN      0x40
#define ALC_OVF_EN1     0x20
#define ALC_OVF_EN0     0x10

#define DIE_TEMP_RDY_EN 0x02

#define SHDN            0x80
#define RESET           0x40
#define MODE1           0x02
#define MODE0           0x01

#define SPO2_ADC_RGE1   0x40 
#define SPO2_ADC_RGE0   0x20
#define SPO2_SR2        0x10
#define SPO2_SR1        0x08
#define SPO2_SR0        0x04
#define LED_PW1         0x02
#define LED_PW0         0x01

#define TEMP_EN         0x01

/******************************************************************************/

#define MAXIM_SLOT_NUM  2

typedef enum
{
  modeHR        = 0x2,
  modeSPO2      = 0x3,
  modeMultiLED  = 0x7

} max30101_mode_t;

typedef enum
{
  ledPower_69  = 0x0, // ADC -> 15 bit
  ledPower_118 = 0x1, // ADC -> 16 bit
  ledPower_215 = 0x2, // ADC -> 17 bit
  ledPower_411 = 0x3  // ADC -> 18 bit

} max30101_ledpwr_t;


/** HR global status enum */
typedef enum
{
    HEART_RATE_STATUS_SUCCESS,
    HEART_RATE_STATUS_ERROR

} heartRate_status_t;

typedef enum
{
  sampleRate_50   = 0x0,
  sampleRate_100  = 0x1,
  sampleRate_200  = 0x2,
  sampleRate_400  = 0x3,
  sampleRate_800  = 0x4,
  sampleRate_1000 = 0x5,
  sampleRate_1600 = 0x6,
  sampleRate_3200 = 0x7

} max30101_sampleRate_t;

typedef enum
{
  LEDSlotNone  =  0x0,
  LEDSlotRed   =  0x1,
  LEDSlotIR    =  0x2,
  LEDSlotGreen =  0x3

} max30101_LEDSlot_t;

typedef enum
{
  STATUS_MAXIM_SUCCESS,        // success
  STATUS_MAXIM_ERROR,          // fail
  STATUS_MAXIM_PROTOCOL_ERROR, // protocol failure
  STATUS_MAXIM_INIT_ERROR,     // initialization error
  STATUS_MAXIM_PARAM_ERROR,    // invalid parameter is given
  STATUS_MAXIM_OVF_ERROR,      // sensor data overflow
  STATUS_MAXIM_TIMEOUT         // timeout occured

} max30101_status_t;

typedef enum
{
  adcRange2048  = 0x0,
  adcRange4096  = 0x1,
  adcRange8192  = 0x2,
  adcRange16384 = 0x3

} max30101_adcRange_t;

typedef enum
{
  ovsNone = 0x0, // no averaging
  ovs2    = 0x1, // average 2 samples
  ovs4    = 0x2, // average 4 samples
  ovs8    = 0x3, // average 8 samples
  ovs16   = 0x4, // average 16 samples
  ovs32   = 0x5  // average 32 samples

} max30101_ovs_t;

#define HR_SAMPLE_RATE ( 50 ) /** sample rate for MAXIM 30101 sensor */


class MAX30101
{
public:
  /**
  * MAX30101 constructor
  *
  * @param sda SDA pin
  * @param sdl SCL pin
  * @param addr addr of the I2C peripheral
  */
  MAX30101(PinName sda, PinName scl);
 
  /**
  * MAX30101 destructor
  */
  ~MAX30101();

    void enable(void);
     
    void shutdown(void);
    
    max30101_status_t reset(void);
        
    void setMode(max30101_mode_t sensorMode);
    
    void setSPO2_ADC_range(void);
    
    void set_SPO2_sampleRange(void);
    
    void set_LED_PulseWidth(uint8_t pw);
    
    max30101_status_t readRawData(uint8_t* dataBuff, uint8_t* sampleNum );
    float getTemp(void);
    
    float getDieTemp(void);
    
    uint8_t  getRevisionID(void);

    uint8_t getChipID(void);
 
private:
  I2C m_i2c;
  int m_addr;
  void readRegs(int addr, uint8_t * data, int len);
  void writeRegs(uint8_t * data, int len);
  
  uint8_t readRegister( uint8_t regaddr);
  void writeRegister(uint8_t regaddr, uint8_t data);
  
  // mode (HR, SpO2, or multi-led)
  max30101_mode_t mode;

  // multiLED slots
  max30101_LEDSlot_t LEDSlot[ MAXIM_SLOT_NUM ];
  uint8_t activeSlots;

  // LED currents
  uint8_t LEDCurrentRed;
  uint8_t LEDCurrentIR;
  uint8_t LEDCurrentGreen;

  // timings
  max30101_sampleRate_t sampleRate;
  max30101_ledpwr_t pulseWidth;
  // ADC range
  max30101_adcRange_t range;
  // averaging
  max30101_ovs_t oversample;
 
};
 
#endif