an I2C bus optical sensor for heart rate monitor

Committer:
hidekich1
Date:
Mon Jun 12 08:48:38 2017 +0000
Revision:
0:68b1bd50b38b
Firse commit from ROHM Arduino library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hidekich1 0:68b1bd50b38b 1 /*****************************************************************************
hidekich1 0:68b1bd50b38b 2 BH1790GLC.cpp
hidekich1 0:68b1bd50b38b 3
hidekich1 0:68b1bd50b38b 4 Copyright (c) 2016 ROHM Co.,Ltd.
hidekich1 0:68b1bd50b38b 5
hidekich1 0:68b1bd50b38b 6 Permission is hereby granted, free of charge, to any person obtaining a copy
hidekich1 0:68b1bd50b38b 7 of this software and associated documentation files (the "Software"), to deal
hidekich1 0:68b1bd50b38b 8 in the Software without restriction, including without limitation the rights
hidekich1 0:68b1bd50b38b 9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
hidekich1 0:68b1bd50b38b 10 copies of the Software, and to permit persons to whom the Software is
hidekich1 0:68b1bd50b38b 11 furnished to do so, subject to the following conditions:
hidekich1 0:68b1bd50b38b 12
hidekich1 0:68b1bd50b38b 13 The above copyright notice and this permission notice shall be included in
hidekich1 0:68b1bd50b38b 14 all copies or substantial portions of the Software.
hidekich1 0:68b1bd50b38b 15
hidekich1 0:68b1bd50b38b 16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
hidekich1 0:68b1bd50b38b 17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
hidekich1 0:68b1bd50b38b 18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
hidekich1 0:68b1bd50b38b 19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
hidekich1 0:68b1bd50b38b 20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
hidekich1 0:68b1bd50b38b 21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
hidekich1 0:68b1bd50b38b 22 THE SOFTWARE.
hidekich1 0:68b1bd50b38b 23 ******************************************************************************/
hidekich1 0:68b1bd50b38b 24
hidekich1 0:68b1bd50b38b 25
hidekich1 0:68b1bd50b38b 26 #include "BH1790GLC.h"
hidekich1 0:68b1bd50b38b 27
hidekich1 0:68b1bd50b38b 28 BH1790GLC::BH1790GLC( PinName sda, PinName scl, char address )
hidekich1 0:68b1bd50b38b 29 : i2c_p( new I2C( sda, scl ) ), i2c( *i2c_p ), adr( address )
hidekich1 0:68b1bd50b38b 30 {
hidekich1 0:68b1bd50b38b 31 init();
hidekich1 0:68b1bd50b38b 32 }
hidekich1 0:68b1bd50b38b 33
hidekich1 0:68b1bd50b38b 34 BH1790GLC::BH1790GLC( I2C &i2c_obj, char address )
hidekich1 0:68b1bd50b38b 35 : i2c_p( NULL ), i2c( i2c_obj ), adr( address )
hidekich1 0:68b1bd50b38b 36 {
hidekich1 0:68b1bd50b38b 37 init();
hidekich1 0:68b1bd50b38b 38 }
hidekich1 0:68b1bd50b38b 39
hidekich1 0:68b1bd50b38b 40 BH1790GLC::~BH1790GLC()
hidekich1 0:68b1bd50b38b 41 {
hidekich1 0:68b1bd50b38b 42 if ( NULL != i2c_p )
hidekich1 0:68b1bd50b38b 43 delete i2c_p;
hidekich1 0:68b1bd50b38b 44 }
hidekich1 0:68b1bd50b38b 45
hidekich1 0:68b1bd50b38b 46 void BH1790GLC::init(void)
hidekich1 0:68b1bd50b38b 47 {
hidekich1 0:68b1bd50b38b 48 }
hidekich1 0:68b1bd50b38b 49
hidekich1 0:68b1bd50b38b 50 int BH1790GLC::meas_start(void)
hidekich1 0:68b1bd50b38b 51 {
hidekich1 0:68b1bd50b38b 52 int rc;
hidekich1 0:68b1bd50b38b 53 char val[3];
hidekich1 0:68b1bd50b38b 54 val[0] = BH1790GLC_MEAS_CONTROL1_VAL;
hidekich1 0:68b1bd50b38b 55 val[1] = BH1790GLC_MEAS_CONTROL2_VAL;
hidekich1 0:68b1bd50b38b 56 val[2] = BH1790GLC_MEAS_START_VAL;
hidekich1 0:68b1bd50b38b 57 rc = write(BH1790GLC_MEAS_CONTROL1, val, sizeof(val));
hidekich1 0:68b1bd50b38b 58 return (rc);
hidekich1 0:68b1bd50b38b 59 }
hidekich1 0:68b1bd50b38b 60
hidekich1 0:68b1bd50b38b 61 int BH1790GLC::get_rawval(char *data)
hidekich1 0:68b1bd50b38b 62 {
hidekich1 0:68b1bd50b38b 63 int rc;
hidekich1 0:68b1bd50b38b 64 rc = read(BH1790GLC_DATAOUT_LEDOFF, data, 4);
hidekich1 0:68b1bd50b38b 65 return (rc);
hidekich1 0:68b1bd50b38b 66 }
hidekich1 0:68b1bd50b38b 67
hidekich1 0:68b1bd50b38b 68 int BH1790GLC::get_val(unsigned short *data)
hidekich1 0:68b1bd50b38b 69 {
hidekich1 0:68b1bd50b38b 70 int rc;
hidekich1 0:68b1bd50b38b 71 char val[4];
hidekich1 0:68b1bd50b38b 72 rc = get_rawval(val);
hidekich1 0:68b1bd50b38b 73 data[0] = ((unsigned short)val[1] << 8) | (val[0]);
hidekich1 0:68b1bd50b38b 74 data[1] = ((unsigned short)val[3] << 8) | (val[2]);
hidekich1 0:68b1bd50b38b 75 return (rc);
hidekich1 0:68b1bd50b38b 76 }
hidekich1 0:68b1bd50b38b 77
hidekich1 0:68b1bd50b38b 78 int BH1790GLC::write(char memory_address, char *data, int size)
hidekich1 0:68b1bd50b38b 79 {
hidekich1 0:68b1bd50b38b 80 int rc;
hidekich1 0:68b1bd50b38b 81 char cmd[size];
hidekich1 0:68b1bd50b38b 82 cmd[0] = memory_address;
hidekich1 0:68b1bd50b38b 83 for (int i=0; i<size; i++) {
hidekich1 0:68b1bd50b38b 84 cmd[i+1] = data[i];
hidekich1 0:68b1bd50b38b 85 }
hidekich1 0:68b1bd50b38b 86 rc = i2c.write( adr, cmd, size+1,true);
hidekich1 0:68b1bd50b38b 87 return (rc);
hidekich1 0:68b1bd50b38b 88 }
hidekich1 0:68b1bd50b38b 89
hidekich1 0:68b1bd50b38b 90 int BH1790GLC::read(char memory_address, char *data, int size)
hidekich1 0:68b1bd50b38b 91 {
hidekich1 0:68b1bd50b38b 92 int rc;
hidekich1 0:68b1bd50b38b 93 char cmd[size];
hidekich1 0:68b1bd50b38b 94 cmd[0] = memory_address;
hidekich1 0:68b1bd50b38b 95 rc = i2c.write( adr, cmd, 1, false);
hidekich1 0:68b1bd50b38b 96 if (rc !=0){
hidekich1 0:68b1bd50b38b 97 return (rc);
hidekich1 0:68b1bd50b38b 98 }
hidekich1 0:68b1bd50b38b 99 rc = i2c.read ( adr, data, size);
hidekich1 0:68b1bd50b38b 100 return (rc);
hidekich1 0:68b1bd50b38b 101 }