This fork adds bulk reading for faster transactions. It also removes the I2C construction from the constructor.

Dependents:   ColorDetector ColorDetectorV2 offline_sync_k64f

Fork of GroveColourSensor by Brian Daniels

Committer:
marcuschang
Date:
Wed Jul 15 10:25:43 2015 +0000
Revision:
5:f6a136b99533
Parent:
4:f0e8304db2a3
Fixed bug. uint16_t truncated to uint8_t.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bridadan 2:50cb56828ab9 1 /*
bridadan 2:50cb56828ab9 2 * Copyright (c) 2006-2013 ARM Limited
bridadan 2:50cb56828ab9 3 *
bridadan 2:50cb56828ab9 4 * Licensed under the Apache License, Version 2.0 (the "License");
bridadan 2:50cb56828ab9 5 * you may not use this file except in compliance with the License.
bridadan 2:50cb56828ab9 6 * You may obtain a copy of the License at
bridadan 2:50cb56828ab9 7 *
bridadan 2:50cb56828ab9 8 * http://www.apache.org/licenses/LICENSE-2.0
bridadan 2:50cb56828ab9 9 *
bridadan 2:50cb56828ab9 10 * Unless required by applicable law or agreed to in writing, software
bridadan 2:50cb56828ab9 11 * distributed under the License is distributed on an "AS IS" BASIS,
bridadan 2:50cb56828ab9 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
bridadan 2:50cb56828ab9 13 * See the License for the specific language governing permissions and
bridadan 2:50cb56828ab9 14 * limitations under the License.
bridadan 2:50cb56828ab9 15 */
bridadan 2:50cb56828ab9 16
bridadan 2:50cb56828ab9 17 #include "GroveColourSensor.h"
bridadan 2:50cb56828ab9 18
bridadan 2:50cb56828ab9 19 GroveColourSensor::GroveColourSensor(I2C *i2c) : i2c(i2c) {
bridadan 3:a401a082d57e 20 // Empty
bridadan 2:50cb56828ab9 21 }
bridadan 2:50cb56828ab9 22
bridadan 3:a401a082d57e 23
bridadan 2:50cb56828ab9 24 bool GroveColourSensor::powerUp(void) {
bridadan 2:50cb56828ab9 25 static const char powerUpCommand[] = {0x80, 0x03};
bridadan 2:50cb56828ab9 26 return i2c->write((SEVEN_BIT_ADDRESS << 1), powerUpCommand, sizeof(powerUpCommand)) == 0;
bridadan 2:50cb56828ab9 27 }
bridadan 2:50cb56828ab9 28
bridadan 4:f0e8304db2a3 29 bool GroveColourSensor::powerDown(void) {
bridadan 2:50cb56828ab9 30 static const char powerDownCommand[] = {0x80, 0x00};
bridadan 3:a401a082d57e 31 return i2c->write((SEVEN_BIT_ADDRESS << 1), powerDownCommand, sizeof(powerDownCommand)) == 0;
bridadan 2:50cb56828ab9 32 }
bridadan 2:50cb56828ab9 33
bridadan 2:50cb56828ab9 34 void GroveColourSensor::setGain(uint8_t gain) {
bridadan 2:50cb56828ab9 35 // Set gain (0 Prescale)
bridadan 2:50cb56828ab9 36 char gainRegValue = 0x00 | (gain << 4);
bridadan 2:50cb56828ab9 37
bridadan 2:50cb56828ab9 38 char gainCommand[] = {0x87, gainRegValue};
bridadan 2:50cb56828ab9 39 i2c->write((SEVEN_BIT_ADDRESS << 1), gainCommand, sizeof(gainCommand));
bridadan 2:50cb56828ab9 40 }
bridadan 2:50cb56828ab9 41
bridadan 2:50cb56828ab9 42 uint16_t GroveColourSensor::readColour(Colour_t colour) {
bridadan 4:f0e8304db2a3 43 char readColourRegistersCommand = 0xb0 + (2 * static_cast<unsigned>(colour));
bridadan 4:f0e8304db2a3 44 i2c->write((SEVEN_BIT_ADDRESS << 1), &readColourRegistersCommand, 1 /* size */);
bridadan 2:50cb56828ab9 45
bridadan 2:50cb56828ab9 46 uint16_t colourValue;
bridadan 2:50cb56828ab9 47 i2c->read((SEVEN_BIT_ADDRESS << 1), reinterpret_cast<char *>(&colourValue), sizeof(uint16_t));
bridadan 2:50cb56828ab9 48 return colourValue;
bridadan 2:50cb56828ab9 49 }
bridadan 2:50cb56828ab9 50
bridadan 2:50cb56828ab9 51 void GroveColourSensor::setBlockRead() {
bridadan 2:50cb56828ab9 52 char blockReadCommand = 0xD0;
bridadan 2:50cb56828ab9 53 i2c->write((SEVEN_BIT_ADDRESS << 1), &blockReadCommand, 1);
bridadan 2:50cb56828ab9 54 }
bridadan 2:50cb56828ab9 55
bridadan 2:50cb56828ab9 56 void GroveColourSensor::readBlock(RGBC *sample) {
bridadan 2:50cb56828ab9 57 char tmpColours[8] = {0};
bridadan 2:50cb56828ab9 58
bridadan 2:50cb56828ab9 59 if (!i2c->read((SEVEN_BIT_ADDRESS << 1), tmpColours, sizeof(tmpColours))) {
marcuschang 5:f6a136b99533 60 sample->ch.green = bytesTo16bit(tmpColours[0], tmpColours[1]);
marcuschang 5:f6a136b99533 61 sample->ch.red = bytesTo16bit(tmpColours[2], tmpColours[3]);
marcuschang 5:f6a136b99533 62 sample->ch.blue = bytesTo16bit(tmpColours[4], tmpColours[5]);
marcuschang 5:f6a136b99533 63 sample->ch.clear = bytesTo16bit(tmpColours[6], tmpColours[7]);
bridadan 2:50cb56828ab9 64 } else {
bridadan 2:50cb56828ab9 65 printf("I2C Read error\r\n");
bridadan 2:50cb56828ab9 66 }
bridadan 2:50cb56828ab9 67 }
bridadan 2:50cb56828ab9 68
bridadan 2:50cb56828ab9 69 uint16_t GroveColourSensor::readColour(unsigned colour) {
bridadan 4:f0e8304db2a3 70 if (colour >= NUM_COLOURS) {
bridadan 2:50cb56828ab9 71 return 0;
bridadan 2:50cb56828ab9 72 }
bridadan 2:50cb56828ab9 73
bridadan 2:50cb56828ab9 74 return readColour(static_cast<Colour_t>(colour));
bridadan 2:50cb56828ab9 75 }
bridadan 2:50cb56828ab9 76
bridadan 2:50cb56828ab9 77 uint16_t GroveColourSensor::bytesTo16bit(char lowByte, char highByte) {
marcuschang 5:f6a136b99533 78 uint16_t res = highByte;
marcuschang 5:f6a136b99533 79 res = (res << 8) | lowByte;
bridadan 2:50cb56828ab9 80 return res;
bridadan 2:50cb56828ab9 81 }