Rohm BH1749NUC color sensor library

Dependents:   rohm-SensorShield-example

Committer:
MACRUM
Date:
Wed Feb 27 06:48:28 2019 +0000
Revision:
0:fe0f43b69595
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MACRUM 0:fe0f43b69595 1 /*****************************************************************************
MACRUM 0:fe0f43b69595 2 BH1749NUC.cpp
MACRUM 0:fe0f43b69595 3
MACRUM 0:fe0f43b69595 4 Copyright (c) 2018-2019 ROHM Co.,Ltd.
MACRUM 0:fe0f43b69595 5
MACRUM 0:fe0f43b69595 6 Permission is hereby granted, free of charge, to any person obtaining a copy
MACRUM 0:fe0f43b69595 7 of this software and associated documentation files (the "Software"), to deal
MACRUM 0:fe0f43b69595 8 in the Software without restriction, including without limitation the rights
MACRUM 0:fe0f43b69595 9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
MACRUM 0:fe0f43b69595 10 copies of the Software, and to permit persons to whom the Software is
MACRUM 0:fe0f43b69595 11 furnished to do so, subject to the following conditions:
MACRUM 0:fe0f43b69595 12
MACRUM 0:fe0f43b69595 13 The above copyright notice and this permission notice shall be included in
MACRUM 0:fe0f43b69595 14 all copies or substantial portions of the Software.
MACRUM 0:fe0f43b69595 15
MACRUM 0:fe0f43b69595 16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
MACRUM 0:fe0f43b69595 17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
MACRUM 0:fe0f43b69595 18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
MACRUM 0:fe0f43b69595 19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
MACRUM 0:fe0f43b69595 20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
MACRUM 0:fe0f43b69595 21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
MACRUM 0:fe0f43b69595 22 THE SOFTWARE.
MACRUM 0:fe0f43b69595 23 ******************************************************************************/
MACRUM 0:fe0f43b69595 24 #include "mbed.h"
MACRUM 0:fe0f43b69595 25 #include "BH1749NUC.h"
MACRUM 0:fe0f43b69595 26
MACRUM 0:fe0f43b69595 27 BH1749NUC::BH1749NUC(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr)
MACRUM 0:fe0f43b69595 28 {
MACRUM 0:fe0f43b69595 29 }
MACRUM 0:fe0f43b69595 30
MACRUM 0:fe0f43b69595 31 BH1749NUC::~BH1749NUC()
MACRUM 0:fe0f43b69595 32 {
MACRUM 0:fe0f43b69595 33 m_addr = 0;
MACRUM 0:fe0f43b69595 34 }
MACRUM 0:fe0f43b69595 35
MACRUM 0:fe0f43b69595 36 int BH1749NUC::init(void)
MACRUM 0:fe0f43b69595 37 {
MACRUM 0:fe0f43b69595 38 int rc;
MACRUM 0:fe0f43b69595 39 char reg;
MACRUM 0:fe0f43b69595 40
MACRUM 0:fe0f43b69595 41 rc = read(BH1749NUC_SYSTEM_CONTROL, &reg, sizeof(reg));
MACRUM 0:fe0f43b69595 42 if (rc != 0) {
MACRUM 0:fe0f43b69595 43 DEBUG_PRINT("Can't access BH1749NUC\n");
MACRUM 0:fe0f43b69595 44 return (rc);
MACRUM 0:fe0f43b69595 45 }
MACRUM 0:fe0f43b69595 46 reg = reg & 0x3F;
MACRUM 0:fe0f43b69595 47 DEBUG_PRINT("BH1749NUC Part ID Value = %02x\n", reg);
MACRUM 0:fe0f43b69595 48
MACRUM 0:fe0f43b69595 49 if (reg != BH1749NUC_PART_ID_VAL) {
MACRUM 0:fe0f43b69595 50 DEBUG_PRINT("Can't find BH1749NUC\n");
MACRUM 0:fe0f43b69595 51 return (rc);
MACRUM 0:fe0f43b69595 52 }
MACRUM 0:fe0f43b69595 53
MACRUM 0:fe0f43b69595 54 rc = read(BH1749NUC_MANUFACTURER_ID, &reg, sizeof(reg));
MACRUM 0:fe0f43b69595 55 if (rc != 0) {
MACRUM 0:fe0f43b69595 56 DEBUG_PRINT("Can't access BH1749NUC\n");
MACRUM 0:fe0f43b69595 57 return (rc);
MACRUM 0:fe0f43b69595 58 }
MACRUM 0:fe0f43b69595 59 DEBUG_PRINT("BH1749NUC MANUFACTURER ID Register Value = %02x\n", reg);
MACRUM 0:fe0f43b69595 60
MACRUM 0:fe0f43b69595 61 if (reg != BH1749NUC_MANUFACT_ID_VAL) {
MACRUM 0:fe0f43b69595 62 DEBUG_PRINT("Can't find BH1749NUC\n");
MACRUM 0:fe0f43b69595 63 return (rc);
MACRUM 0:fe0f43b69595 64 }
MACRUM 0:fe0f43b69595 65
MACRUM 0:fe0f43b69595 66 reg = BH1749NUC_MODE_CONTROL1_VAL;
MACRUM 0:fe0f43b69595 67 rc = write(BH1749NUC_MODE_CONTROL1, &reg, sizeof(reg));
MACRUM 0:fe0f43b69595 68 if (rc != 0) {
MACRUM 0:fe0f43b69595 69 DEBUG_PRINT("Can't write BH1749NUC MODE_CONTROL1 register\n");
MACRUM 0:fe0f43b69595 70 return (rc);
MACRUM 0:fe0f43b69595 71 }
MACRUM 0:fe0f43b69595 72
MACRUM 0:fe0f43b69595 73 reg = BH1749NUC_MODE_CONTROL2_VAL;
MACRUM 0:fe0f43b69595 74 rc = write(BH1749NUC_MODE_CONTROL2, &reg, sizeof(reg));
MACRUM 0:fe0f43b69595 75 if (rc != 0) {
MACRUM 0:fe0f43b69595 76 DEBUG_PRINT("Can't write BH1749NUC MODE_CONTROL2 register\n");
MACRUM 0:fe0f43b69595 77 return (rc);
MACRUM 0:fe0f43b69595 78 }
MACRUM 0:fe0f43b69595 79
MACRUM 0:fe0f43b69595 80 wait_ms(WAIT_TMT2_MAX);
MACRUM 0:fe0f43b69595 81 return (rc);
MACRUM 0:fe0f43b69595 82 }
MACRUM 0:fe0f43b69595 83
MACRUM 0:fe0f43b69595 84 int BH1749NUC::get_rawval(char *data)
MACRUM 0:fe0f43b69595 85 {
MACRUM 0:fe0f43b69595 86 int rc;
MACRUM 0:fe0f43b69595 87
MACRUM 0:fe0f43b69595 88 rc = read(BH1749NUC_RED_DATA_LSB, data, GET_BYTE_RED_TO_GREEN2);
MACRUM 0:fe0f43b69595 89 if (rc != 0) {
MACRUM 0:fe0f43b69595 90 DEBUG_PRINT("Can't get BH1749NUC RGB, IR and GREEN2 value\n");
MACRUM 0:fe0f43b69595 91 }
MACRUM 0:fe0f43b69595 92
MACRUM 0:fe0f43b69595 93 return (rc);
MACRUM 0:fe0f43b69595 94 }
MACRUM 0:fe0f43b69595 95
MACRUM 0:fe0f43b69595 96 int BH1749NUC::get_val(unsigned short *data)
MACRUM 0:fe0f43b69595 97 {
MACRUM 0:fe0f43b69595 98 int rc;
MACRUM 0:fe0f43b69595 99 char val[GET_BYTE_RED_TO_GREEN2];
MACRUM 0:fe0f43b69595 100
MACRUM 0:fe0f43b69595 101 rc = get_rawval(val);
MACRUM 0:fe0f43b69595 102 if (rc != 0) {
MACRUM 0:fe0f43b69595 103 return (rc);
MACRUM 0:fe0f43b69595 104 }
MACRUM 0:fe0f43b69595 105
MACRUM 0:fe0f43b69595 106 //val[6] and val[7] are RESERVED Register Value
MACRUM 0:fe0f43b69595 107 data[0] = ((unsigned short)val[1] << 8) | val[0];
MACRUM 0:fe0f43b69595 108 data[1] = ((unsigned short)val[3] << 8) | val[2];
MACRUM 0:fe0f43b69595 109 data[2] = ((unsigned short)val[5] << 8) | val[4];
MACRUM 0:fe0f43b69595 110 data[3] = ((unsigned short)val[9] << 8) | val[8];
MACRUM 0:fe0f43b69595 111 data[4] = ((unsigned short)val[11] << 8) | val[10];
MACRUM 0:fe0f43b69595 112
MACRUM 0:fe0f43b69595 113 return (rc);
MACRUM 0:fe0f43b69595 114 }
MACRUM 0:fe0f43b69595 115
MACRUM 0:fe0f43b69595 116 int BH1749NUC::write(char memory_address, char *data, int size)
MACRUM 0:fe0f43b69595 117 {
MACRUM 0:fe0f43b69595 118 int rc = 0;
MACRUM 0:fe0f43b69595 119
MACRUM 0:fe0f43b69595 120 char t = memory_address;
MACRUM 0:fe0f43b69595 121 m_i2c.write(m_addr, &t, 1, true);
MACRUM 0:fe0f43b69595 122 rc = m_i2c.write(m_addr, data, size);
MACRUM 0:fe0f43b69595 123 return (rc);
MACRUM 0:fe0f43b69595 124 }
MACRUM 0:fe0f43b69595 125
MACRUM 0:fe0f43b69595 126 int BH1749NUC::read(char memory_address, char *data, int size)
MACRUM 0:fe0f43b69595 127 {
MACRUM 0:fe0f43b69595 128 char t = memory_address;
MACRUM 0:fe0f43b69595 129 m_i2c.write(m_addr, &t, 1, true);
MACRUM 0:fe0f43b69595 130 return m_i2c.read(m_addr, data, size);
MACRUM 0:fe0f43b69595 131 }