Tetsuro Tatsuoka
/
BH1792GLC_Eval
Measuring plethysmogram with BH1792GLC (Rohm Semiconductor) and calculating pulse rate
Bh1792glcCtrl.cpp@1:90f70c146a26, 2018-02-05 (annotated)
- 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?
User | Revision | Line number | New 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 | } |