prova
Dependencies: X_NUCLEO_53L0A1 mbed
Fork of 53L0A1_HandGestureRecognition by
Diff: Middlewares/ST/Gestures/GesturesDetect/Inc/ring_buffer.h
- Revision:
- 7:d79cbeda2982
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Middlewares/ST/Gestures/GesturesDetect/Inc/ring_buffer.h Fri Dec 15 14:16:16 2017 +0000 @@ -0,0 +1,145 @@ +/******************************************************************************* +Copyright © 2015, STMicroelectronics International N.V. +All rights reserved. + +Use and Redistribution are permitted only in accordance with licensing terms +available at www.st.com under software reference X-CUBE-6180XA1, and provided +that the following conditions are met: +* Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of STMicroelectronics nor the +names of its contributors may be used to endorse or promote products +derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROTECTED BY STMICROELECTRONICS PATENTS AND COPYRIGHTS. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND +NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. +IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +********************************************************************************/ +/* + * @file ring_buffer.h + * $Date: 2015-11-10 11:21:53 +0100 (Tue, 10 Nov 2015) $ + * $Revision: 2612 $ + */ + +#ifndef RING_BUFFER_H_ +#define RING_BUFFER_H_ + +#include "tof_gestures_platform.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @defgroup misc_ring_buffer Ring Buffer + * @brief Simple ring buffer implementation + @par Description + Ring buffer is implemented as a static array of integers of size #RB_MAX_SIZE. The functional size of the ring buffer is + programmable. When the ring_buffer is full, new elements added are replacing the older elements. This is typically used + to keep an history of the last ranging values measured from the ToF device. + * @ingroup misc + * @{ + */ + +/** Ring Buffer maximum size */ +#define RB_MAX_SIZE 16 + +/** + * @struct ring_buffer + * @brief Simple ring buffer of int with a programmable size (max size is #RB_MAX_SIZE) + */ +typedef struct +{ + int buffer[RB_MAX_SIZE]; + int* buffer_end; + int* data_start; + int* data_end; + int count; + int size; +} ring_buffer; + +/** + * @brief Initialize Ring Buffer + * @param rb Ring Buffer pointer + * @param size Number of int elements (max size is #RB_MAX_SIZE) + * @return 0 on success or -1 if size is greater than #RB_MAX_SIZE + */ +int RB_init(ring_buffer* rb, int size); + +/** + * @brief Push one element in Ring Buffer (after the last element) + * @par Function Description + * If ring buffer is full, added element is replacing the oldest element in the ring buffer + * @param rb Ring Buffer pointer + * @param data Element to add + * @return 0 on success + */ +int RB_push(ring_buffer* rb, int data); + +/** + * @brief pop one element in Ring Buffer (the last element) + * @param rb Ring Buffer pointer + * @return element + */ +int RB_pop(ring_buffer* rb); + +/** + * @brief Check if ring buffer is full + * @param rb Ring Buffer pointer + * @return true if full else false + */ +bool RB_full(ring_buffer* rb); + +/** + * @brief print/trace all elements in the ring buffer + * @param rb Ring Buffer pointer + * @note The TRACE key must be defined in the project + */ +void RB_trace(ring_buffer*rb); + +/** + * @brief Return the sum of elements in the ring buffer + * @param rb Ring Buffer pointer + * @return The sum + */ +int RB_sum(ring_buffer*rb); + +/** + * @brief Return the mean of all elements in the ring buffer + * @param rb Ring Buffer pointer + * @return The mean (rounded to integer) + */ +int RB_mean(ring_buffer*rb); + +/** + * @brief Return the mean of the absolute differences of each element with the mean + * @param rb Ring Buffer pointer + * @return The mad (rounded to integer) + */ +int RB_mad(ring_buffer*rb); + +/** + * @brief Return the direction of the curve of points stored in the buffer + * @param rb Ring Buffer pointer + * @return 1 if constantly increase, -1 if constantly decrease, 0 otherwise + */ +int RB_dir(ring_buffer*rb); + + /** @} */ + +#ifdef __cplusplus +} +#endif +#endif /* RING_BUFFER_H_ */ +