Measuring plethysmogram with BH1792GLC (Rohm Semiconductor) and calculating pulse rate

Dependencies:   USBDevice mbed

Committer:
t_tatsuoka
Date:
Mon Feb 05 21:28:19 2018 +0000
Revision:
1:90f70c146a26
Parent:
0:18d735a66926
Ver. 1.0.1 ???beep?????????????????????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
t_tatsuoka 0:18d735a66926 1 /**
t_tatsuoka 0:18d735a66926 2 * @file Bh1792glcCtrl.cpp
t_tatsuoka 0:18d735a66926 3 * @brief Control BH1792GLC (Plethysmogram sensor by Rohm Semiconductor)
t_tatsuoka 1:90f70c146a26 4 * @date 2018.02.06
t_tatsuoka 1:90f70c146a26 5 * @version 1.0.1
t_tatsuoka 0:18d735a66926 6 */
t_tatsuoka 0:18d735a66926 7 #include "Bh1792glcCtrl.h"
t_tatsuoka 0:18d735a66926 8
t_tatsuoka 0:18d735a66926 9 /** Constructor
t_tatsuoka 0:18d735a66926 10 * @param bh_sda Pin for SDA on BH1792GLC
t_tatsuoka 0:18d735a66926 11 * @param bh_scl Pin for SCL on BH1792GLC
t_tatsuoka 0:18d735a66926 12 * @param bh_int Pin for INT on BH1792GLC
t_tatsuoka 0:18d735a66926 13 */
t_tatsuoka 0:18d735a66926 14 Bh1792glcCtrl::Bh1792glcCtrl(PinName bh_sda, PinName bh_scl, PinName bh_int) :
t_tatsuoka 0:18d735a66926 15 _i2c(bh_sda, bh_scl), _bh_int(bh_int)
t_tatsuoka 0:18d735a66926 16 {
t_tatsuoka 0:18d735a66926 17 init();
t_tatsuoka 0:18d735a66926 18 }
t_tatsuoka 0:18d735a66926 19
t_tatsuoka 0:18d735a66926 20 /** Get waveform data
t_tatsuoka 0:18d735a66926 21 * @param *val Result value
t_tatsuoka 0:18d735a66926 22 * @retval Status
t_tatsuoka 0:18d735a66926 23 */
t_tatsuoka 0:18d735a66926 24 int Bh1792glcCtrl::get_val(int32_t &val)
t_tatsuoka 0:18d735a66926 25 {
t_tatsuoka 0:18d735a66926 26 int i;
t_tatsuoka 0:18d735a66926 27 int ret;
t_tatsuoka 0:18d735a66926 28 uint8_t read_addr[1] = { BH1792_ADDR_GDATA_LEDOFF_LSBS };
t_tatsuoka 0:18d735a66926 29 uint8_t reg_val[4];
t_tatsuoka 0:18d735a66926 30 uint16_t led_val[2];
t_tatsuoka 0:18d735a66926 31
t_tatsuoka 0:18d735a66926 32 ret = start_measure();
t_tatsuoka 0:18d735a66926 33 if (ret) {
t_tatsuoka 0:18d735a66926 34 // Measuring start error
t_tatsuoka 0:18d735a66926 35 return ret;
t_tatsuoka 0:18d735a66926 36 }
t_tatsuoka 0:18d735a66926 37
t_tatsuoka 0:18d735a66926 38 for(i=0; i<INT_CHECK_COUNT_LIMIT; i++) {
t_tatsuoka 0:18d735a66926 39 if(_bh_int.read() == 0) {
t_tatsuoka 0:18d735a66926 40 ret = _i2c.write((_sad | 0), (const char*)read_addr, 1, true);
t_tatsuoka 0:18d735a66926 41 if (ret) {
t_tatsuoka 0:18d735a66926 42 // Read command error
t_tatsuoka 0:18d735a66926 43 return ret;
t_tatsuoka 0:18d735a66926 44 }
t_tatsuoka 0:18d735a66926 45 ret = _i2c.read((_sad | 1), (char *)reg_val, 4);
t_tatsuoka 0:18d735a66926 46 if (ret) {
t_tatsuoka 0:18d735a66926 47 // Read data error
t_tatsuoka 0:18d735a66926 48 return ret;
t_tatsuoka 0:18d735a66926 49 }
t_tatsuoka 0:18d735a66926 50 led_val[0] = ((unsigned short)reg_val[1] << 8) | (reg_val[0]); /* When LED off */
t_tatsuoka 0:18d735a66926 51 led_val[1] = ((unsigned short)reg_val[3] << 8) | (reg_val[2]); /* When LED on */
t_tatsuoka 0:18d735a66926 52 val = (int32_t)led_val[1] - (int32_t)led_val[0];
t_tatsuoka 0:18d735a66926 53 break;
t_tatsuoka 0:18d735a66926 54 }
t_tatsuoka 0:18d735a66926 55 wait_us(INT_CHECK_INTERVAL_US);
t_tatsuoka 0:18d735a66926 56 }
t_tatsuoka 0:18d735a66926 57 if(i >= INT_CHECK_COUNT_LIMIT) {
t_tatsuoka 0:18d735a66926 58 // INT timeout error
t_tatsuoka 0:18d735a66926 59 return BH1792_I2C_ERR;
t_tatsuoka 0:18d735a66926 60 }
t_tatsuoka 0:18d735a66926 61
t_tatsuoka 0:18d735a66926 62 return BH1792_SUCCESS;
t_tatsuoka 0:18d735a66926 63 }
t_tatsuoka 0:18d735a66926 64
t_tatsuoka 0:18d735a66926 65 /** Initialize
t_tatsuoka 0:18d735a66926 66 * @retval Status
t_tatsuoka 0:18d735a66926 67 */
t_tatsuoka 0:18d735a66926 68 int Bh1792glcCtrl::init()
t_tatsuoka 0:18d735a66926 69 {
t_tatsuoka 0:18d735a66926 70 int ret = BH1792_SUCCESS;
t_tatsuoka 0:18d735a66926 71 _sad = (BH1792_SLAVE_ADDR << 1);
t_tatsuoka 0:18d735a66926 72
t_tatsuoka 0:18d735a66926 73 _i2c.frequency(I2C_FREQENCY);
t_tatsuoka 0:18d735a66926 74 wait(0.1);
t_tatsuoka 0:18d735a66926 75
t_tatsuoka 0:18d735a66926 76 ret = send_default_params();
t_tatsuoka 0:18d735a66926 77 return ret;
t_tatsuoka 0:18d735a66926 78 }
t_tatsuoka 0:18d735a66926 79
t_tatsuoka 0:18d735a66926 80 /** Send default settings to BH1792GLC
t_tatsuoka 0:18d735a66926 81 * @retval Status
t_tatsuoka 0:18d735a66926 82 */
t_tatsuoka 0:18d735a66926 83 int Bh1792glcCtrl::send_default_params()
t_tatsuoka 0:18d735a66926 84 {
t_tatsuoka 0:18d735a66926 85 int ret = BH1792_SUCCESS;
t_tatsuoka 0:18d735a66926 86 int32_t len = DEFAULT_PARAM_SIZE + 1;
t_tatsuoka 0:18d735a66926 87 uint8_t reg[len];
t_tatsuoka 0:18d735a66926 88
t_tatsuoka 0:18d735a66926 89 reg[0] = BH1792_ADDR_MEAS_CTRL1;
t_tatsuoka 0:18d735a66926 90 reg[1] = (BH1792_PRM_RDY << 7) | (BH1792_PRM_SEL_ADC_GREEN << 4) | BH1792_PRM_MSR_SINGLE;
t_tatsuoka 0:18d735a66926 91 reg[2] = (BH1792_PRM_LED_EN1_0 << 6) | BH1792_PRM_LED_CUR1_MA(DEFAULT_LED_CURRENT1);
t_tatsuoka 0:18d735a66926 92 reg[3] = (BH1792_PRM_LED_EN2_0 << 7) | BH1792_PRM_LED_CUR2_MA(DEFAULT_LED_CURRENT2);
t_tatsuoka 0:18d735a66926 93 reg[4] = (uint8_t)DEFAULT_MEAS_CTRL4_LSB;
t_tatsuoka 0:18d735a66926 94 reg[5] = (uint8_t)DEFAULT_MEAS_CTRL4_MSB;
t_tatsuoka 0:18d735a66926 95 reg[6] = BH1792_PRM_INT_SEL_SGL;
t_tatsuoka 0:18d735a66926 96
t_tatsuoka 0:18d735a66926 97 ret = _i2c.write((_sad | 0), (char *)reg, len);
t_tatsuoka 0:18d735a66926 98 return ret;
t_tatsuoka 0:18d735a66926 99 }
t_tatsuoka 0:18d735a66926 100
t_tatsuoka 0:18d735a66926 101 /** Start measuring plethysmotram
t_tatsuoka 0:18d735a66926 102 * @retval Status
t_tatsuoka 0:18d735a66926 103 */
t_tatsuoka 0:18d735a66926 104 int Bh1792glcCtrl::start_measure()
t_tatsuoka 0:18d735a66926 105 {
t_tatsuoka 0:18d735a66926 106 int32_t ret = BH1792_SUCCESS;
t_tatsuoka 0:18d735a66926 107 uint8_t reg[2];
t_tatsuoka 0:18d735a66926 108
t_tatsuoka 0:18d735a66926 109 reg[0] = BH1792_ADDR_MEAS_START;
t_tatsuoka 0:18d735a66926 110 reg[1] = BH1792_PRM_MEAS_ST;
t_tatsuoka 0:18d735a66926 111
t_tatsuoka 0:18d735a66926 112 ret = _i2c.write((_sad | 0), (char *)reg, 2);
t_tatsuoka 0:18d735a66926 113 return ret;
t_tatsuoka 0:18d735a66926 114 }