Optical Sensor for Heart Rate Monitor IC

BH1790GLC.cpp

Committer:
mcm
Date:
2021-09-16
Revision:
4:55075fea807c
Parent:
2:eb95a49c8a29

File content as of revision 4:55075fea807c:

/**
 * @brief       BH1790GLC.cpp
 * @details     Optical Sensor for Heart Rate Monitor IC.
 *              Function file.
 *
 *
 * @return      N/A
 *
 * @author      Manuel Caballero
 * @date        07/December/2019
 * @version     07/December/2019    The ORIGIN
 * @pre         N/A.
 * @warning     N/A
 * @pre         This code belongs to AqueronteBlog ( http://unbarquero.blogspot.com ).
 */

#include "BH1790GLC.h"


BH1790GLC::BH1790GLC ( PinName sda, PinName scl, uint32_t addr, uint32_t freq )
    : _i2c             ( sda, scl )
    , _BH1790GLC_Addr  ( addr )
{
    _i2c.frequency( freq );
}


BH1790GLC::~BH1790GLC()
{
}


/**
 * @brief       BH1790GLC_GetManufacturerID ( BH1790GLC_data_t* )
 *
 * @details     It gets the manufacturer ID.
 *
 * @param[in]    N/A.
 *
 * @param[out]   myManufacturerID:  Manufacturer ID.
 *
 *
 * @return       Status of BH1790GLC_GetManufacturerID.
 *
 *
 * @author      Manuel Caballero
 * @date        07/December/2019
 * @version     07/December/2019   The ORIGIN
 * @pre         N/A
 * @warning     N/A.
 */
BH1790GLC::BH1790GLC_status_t BH1790GLC::BH1790GLC_GetManufacturerID ( BH1790GLC_data_t* myManufacturerID )
{
    char     cmd = 0;
    uint32_t aux;

    /* Read the register */
    cmd  =   BH1790GLC_MANUFACTURER_ID;
    aux  =   _i2c.write ( _BH1790GLC_Addr, &cmd, 1U, true );
    aux  =   _i2c.read  ( _BH1790GLC_Addr, &cmd, 1U );


    /* Parse data   */
    myManufacturerID->manufacturer_id   =    cmd;



    if ( aux == I2C_SUCCESS ) {
        return   BH1790GLC_SUCCESS;
    } else {
        return   BH1790GLC_FAILURE;
    }
}



/**
 * @brief       BH1790GLC_GetPartID ( BH1790GLC_data_t* )
 *
 * @details     It gets the part ID.
 *
 * @param[in]    N/A.
 *
 * @param[out]   myPartID:  Part ID.
 *
 *
 * @return       Status of BH1790GLC_GetPartID.
 *
 *
 * @author      Manuel Caballero
 * @date        07/December/2019
 * @version     07/December/2019   The ORIGIN
 * @pre         N/A
 * @warning     N/A.
 */
BH1790GLC::BH1790GLC_status_t BH1790GLC::BH1790GLC_GetPartID ( BH1790GLC_data_t* myPartID )
{
    char     cmd = 0;
    uint32_t aux;

    /* Read the register */
    cmd  =   BH1790GLC_PART_ID;
    aux  =   _i2c.write ( _BH1790GLC_Addr, &cmd, 1U, true );
    aux  =   _i2c.read  ( _BH1790GLC_Addr, &cmd, 1U );


    /* Parse data   */
    myPartID->part_id   =    cmd;



    if ( aux == I2C_SUCCESS ) {
        return   BH1790GLC_SUCCESS;
    } else {
        return   BH1790GLC_FAILURE;
    }
}



/**
 * @brief       BH1790GLC_SoftReset ( void )
 *
 * @details     It performs a software reset.
 *
 * @param[in]    N/A.
 *
 * @param[out]   N/A.
 *
 *
 * @return       Status of BH1790GLC_SoftReset.
 *
 *
 * @author      Manuel Caballero
 * @date        07/December/2019
 * @version     07/December/2019   The ORIGIN
 * @pre         N/A
 * @warning     N/A.
 */
BH1790GLC::BH1790GLC_status_t BH1790GLC::BH1790GLC_SoftReset ( void )
{
    char     cmd[2] = { 0 };
    uint32_t aux;

    /* Update the register */
    cmd[0]   =   BH1790GLC_RESET;
    cmd[1]   =   RESET_SWRESET_ENABLED;
    aux      =   _i2c.write ( _BH1790GLC_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );



    if ( aux == I2C_SUCCESS ) {
        return   BH1790GLC_SUCCESS;
    } else {
        return   BH1790GLC_FAILURE;
    }
}


/**
 * @brief       BH1790GLC_StartMeasurement ( BH1790GLC_data_t )
 *
 * @details     It triggers a new measurement sample.
 *
 * @param[in]    myConfData:        System control setting and Measurement control setting.
 *
 * @param[out]   N/A.
 *
 *
 * @return       Status of BH1790GLC_StartMeasurement.
 *
 *
 * @author      Manuel Caballero
 * @date        07/December/2019
 * @version     07/December/2019   The ORIGIN
 * @pre         Start measurement by writing MEAS_ST=1 after writing RDY=1. Measurement doesn`t
 *              restart if writing MEAS_ST=1 after start measurement. When stop measurement, write SWRESET=1
 *              without writing MEAS_ST=0 (for changing some parameters as well).
 * @pre         The user MUST RESPECT the measurement time, T_INT = 28ms ( maximum ).
 * @pre         The function uses auto-increment.
 * @warning     System control setting and measurement control setting must be initialized in order to guarantee
 *              the correct behavior of the device.
 */
BH1790GLC::BH1790GLC_status_t BH1790GLC::BH1790GLC_StartMeasurement ( BH1790GLC_data_t myConfData )
{
    char     cmd[4] = { 0 };
    uint32_t aux;

    /* Write the register */
    cmd[0]   =   BH1790GLC_MEAS_CONTROL1;
    cmd[1]   =   ( myConfData.rdy | myConfData.led_lighting_freq | myConfData.rcycle );
    cmd[2]   =   ( myConfData.led_en | myConfData.led_on_time | myConfData.led_current );
    cmd[3]   =   MEAS_START_MEAS_ST_MEASUREMENT_START;
    aux      =   _i2c.write ( _BH1790GLC_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );



    if ( aux == I2C_SUCCESS ) {
        return   BH1790GLC_SUCCESS;
    } else {
        return   BH1790GLC_FAILURE;
    }
}



/**
 * @brief       BH1790GLC_GetRawDataOut ( void )
 *
 * @details     It gets the DATAOUT ( DATAOUT_LEDOFF and DATAOUT_LEDON data ). Raw data value.
 *
 * @param[in]    N/A.
 *
 * @param[out]   myRawDataOut:      Raw data for DATAOUT_LEDOFF and DATAOUT_LEDON.
 *
 *
 * @return       Status of BH1790GLC_GetRawDataOut.
 *
 *
 * @author      Manuel Caballero
 * @date        07/December/2019
 * @version     07/December/2019   The ORIGIN
 * @pre         This function uses auto-increment.
 * @warning     N/A.
 */
BH1790GLC::BH1790GLC_status_t BH1790GLC::BH1790GLC_GetRawDataOut ( BH1790GLC_data_t* myRawDataOut )
{
    char     cmd[4] = { 0 };
    uint32_t aux;

    /* Read the register */
    cmd[0]   =   BH1790GLC_DATAOUT_LEDOFF_LSB;
    aux      =   _i2c.write ( _BH1790GLC_Addr, &cmd[0], 1U, true );
    aux      =   _i2c.read  ( _BH1790GLC_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );

    /* Parse the data    */
    myRawDataOut->dataOut_LED_OFF    =   cmd[1];
    myRawDataOut->dataOut_LED_OFF  <<=   8U;
    myRawDataOut->dataOut_LED_OFF   |=   cmd[0];

    myRawDataOut->dataOut_LED_ON     =   cmd[3];
    myRawDataOut->dataOut_LED_ON  <<=    8U;
    myRawDataOut->dataOut_LED_ON    |=   cmd[2];



    if ( aux == I2C_SUCCESS ) {
        return   BH1790GLC_SUCCESS;
    } else {
        return   BH1790GLC_FAILURE;
    }
}