using tweaked rgb_sensor_buffer
Fork of rgb_sensor_buffer by
rgb_sensor_buffer.cpp@3:363d6de01d73, 2015-03-20 (annotated)
- 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?
User | Revision | Line number | New 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 | } |