using tweaked rgb_sensor_buffer

Dependencies:   rgb_sensor

Dependents:   nespresso_demo

Fork of rgb_sensor_buffer by Milosch Meriac

Committer:
bridadan
Date:
Fri Mar 20 16:07:33 2015 +0000
Revision:
3:363d6de01d73
Parent:
0:bbd86bfe6577
using tweaked rgb_sensor

Who changed what in which revision?

UserRevisionLine numberNew contents of line
meriac 0:bbd86bfe6577 1 /* Discrete RGB color sensor (buffered)
meriac 0:bbd86bfe6577 2 *
meriac 0:bbd86bfe6577 3 * - uses single-channel light-dependent resistor (via ADC)
meriac 0:bbd86bfe6577 4 * and a RGB LED.
meriac 0:bbd86bfe6577 5 * - compensates background light
meriac 0:bbd86bfe6577 6 *
meriac 0:bbd86bfe6577 7 * Copyright (c) 2014 ARM Limited
meriac 0:bbd86bfe6577 8 *
meriac 0:bbd86bfe6577 9 * Licensed under the Apache License, Version 2.0 (the "License");
meriac 0:bbd86bfe6577 10 * you may not use this file except in compliance with the License.
meriac 0:bbd86bfe6577 11 * You may obtain a copy of the License at
meriac 0:bbd86bfe6577 12 *
meriac 0:bbd86bfe6577 13 * http://www.apache.org/licenses/LICENSE-2.0
meriac 0:bbd86bfe6577 14 *
meriac 0:bbd86bfe6577 15 * Unless required by applicable law or agreed to in writing, software
meriac 0:bbd86bfe6577 16 * distributed under the License is distributed on an "AS IS" BASIS,
meriac 0:bbd86bfe6577 17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
meriac 0:bbd86bfe6577 18 * See the License for the specific language governing permissions and
meriac 0:bbd86bfe6577 19 * limitations under the License.
meriac 0:bbd86bfe6577 20 */
meriac 0:bbd86bfe6577 21
meriac 0:bbd86bfe6577 22 /* initialize globally */
meriac 0:bbd86bfe6577 23 #include <mbed.h>
meriac 0:bbd86bfe6577 24 #include "rgb_sensor_buffer.h"
meriac 0:bbd86bfe6577 25
meriac 0:bbd86bfe6577 26 RGB_SensorBuffer* RGB_SensorBuffer::m_global = NULL;
meriac 0:bbd86bfe6577 27
meriac 0:bbd86bfe6577 28 RGB_SensorBuffer::RGB_SensorBuffer(PinName red, PinName green, PinName blue, PinName adc)
meriac 0:bbd86bfe6577 29 :RGB_Sensor(red,green,blue,adc)
meriac 0:bbd86bfe6577 30 {
meriac 0:bbd86bfe6577 31 /* allow only one instance */
meriac 0:bbd86bfe6577 32 if(m_global)
meriac 0:bbd86bfe6577 33 {
meriac 0:bbd86bfe6577 34 m_initialized = false;
meriac 0:bbd86bfe6577 35 return;
meriac 0:bbd86bfe6577 36 }
meriac 0:bbd86bfe6577 37
meriac 0:bbd86bfe6577 38 m_global = this;
meriac 0:bbd86bfe6577 39 m_initialized = true;
meriac 0:bbd86bfe6577 40 }
meriac 0:bbd86bfe6577 41
meriac 0:bbd86bfe6577 42 bool RGB_SensorBuffer::__callback(const TRGB &color)
meriac 0:bbd86bfe6577 43 {
meriac 0:bbd86bfe6577 44 return m_global ? m_global->callback(color) : false;
meriac 0:bbd86bfe6577 45 }
meriac 0:bbd86bfe6577 46
meriac 0:bbd86bfe6577 47 bool RGB_SensorBuffer::callback(const TRGB &color)
meriac 0:bbd86bfe6577 48 {
meriac 0:bbd86bfe6577 49 int avg;
meriac 0:bbd86bfe6577 50
meriac 0:bbd86bfe6577 51 if(!m_buffer)
meriac 0:bbd86bfe6577 52 return false;
meriac 0:bbd86bfe6577 53
meriac 0:bbd86bfe6577 54 avg = (color.ch.red + color.ch.green + color.ch.blue)/(3*RGB_OVERSAMPLING);
meriac 0:bbd86bfe6577 55
meriac 0:bbd86bfe6577 56 if(!m_buffer_pos)
meriac 0:bbd86bfe6577 57 {
meriac 0:bbd86bfe6577 58 /* wait for trigger */
meriac 0:bbd86bfe6577 59 if(avg<=m_treshold)
meriac 0:bbd86bfe6577 60 return true;
meriac 0:bbd86bfe6577 61 }
meriac 0:bbd86bfe6577 62 else
meriac 0:bbd86bfe6577 63 /* wait for termination */
meriac 0:bbd86bfe6577 64 if(avg>m_treshold)
meriac 0:bbd86bfe6577 65 m_buffer_spurious=0;
meriac 0:bbd86bfe6577 66 else
meriac 0:bbd86bfe6577 67 {
meriac 0:bbd86bfe6577 68 m_buffer_spurious++;
meriac 0:bbd86bfe6577 69
meriac 0:bbd86bfe6577 70 /* ignore spurious blobs */
meriac 0:bbd86bfe6577 71 if(m_buffer_spurious>=RGB_SENSOR_BUFFER_SPURIOUS_COUNT)
meriac 0:bbd86bfe6577 72 {
meriac 0:bbd86bfe6577 73 m_buffer_pos -= m_buffer_spurious;
meriac 0:bbd86bfe6577 74 m_buffer_spurious = 0;
meriac 0:bbd86bfe6577 75
meriac 0:bbd86bfe6577 76 if(m_buffer_pos<RGB_SENSOR_BUFFER_MIN)
meriac 0:bbd86bfe6577 77 {
meriac 0:bbd86bfe6577 78 m_buffer_pos = 0;
meriac 0:bbd86bfe6577 79 return true;
meriac 0:bbd86bfe6577 80 }
meriac 0:bbd86bfe6577 81 return false;
meriac 0:bbd86bfe6577 82 }
meriac 0:bbd86bfe6577 83 else
meriac 0:bbd86bfe6577 84 return true;
meriac 0:bbd86bfe6577 85 }
meriac 0:bbd86bfe6577 86
meriac 0:bbd86bfe6577 87 /* record color */
meriac 0:bbd86bfe6577 88 if(m_buffer_pos<m_count)
meriac 0:bbd86bfe6577 89 m_buffer[m_buffer_pos++] = color;
meriac 0:bbd86bfe6577 90
meriac 0:bbd86bfe6577 91 /* finish after buffer is full */
meriac 0:bbd86bfe6577 92 return m_buffer_pos<m_count;
meriac 0:bbd86bfe6577 93 }
meriac 0:bbd86bfe6577 94
meriac 0:bbd86bfe6577 95 int RGB_SensorBuffer::trigger(TRGB* rgb, int count, int treshold)
meriac 0:bbd86bfe6577 96 {
meriac 0:bbd86bfe6577 97 if(!m_initialized)
meriac 0:bbd86bfe6577 98 return -1;
meriac 0:bbd86bfe6577 99
meriac 0:bbd86bfe6577 100 /* remember settings */
meriac 0:bbd86bfe6577 101 m_buffer = rgb;
meriac 0:bbd86bfe6577 102 m_buffer_pos = m_buffer_spurious = 0;
meriac 0:bbd86bfe6577 103 m_count = count;
meriac 0:bbd86bfe6577 104 m_treshold = treshold;
meriac 0:bbd86bfe6577 105
meriac 0:bbd86bfe6577 106 return (capture(__callback) && wait()) ? m_buffer_pos : -2;
meriac 0:bbd86bfe6577 107 }