Sweep a servo according to Proximity sensor measure
Dependencies: Servo X_NUCLEO_6180XA1 mbed
Fork of HelloWorld_6180XA1 by
Revision 18:6312be3b32d9, committed 2015-10-28
- Comitter:
- gallonm
- Date:
- Wed Oct 28 15:06:09 2015 +0000
- Parent:
- 17:68515d0667af
- Child:
- 19:394c9a4a3046
- Commit message:
- Deleted Middlewares folder and its subfolders.; Deleted HmiBBGesture files.
Changed in this revision
--- a/Middlewares/ST/STM32_HMI_HandGesture/HmiBBGesture.cpp Wed Oct 28 14:56:58 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,296 +0,0 @@ -/* ---------------------------------------------------------------------- - * Copyright (C) 2014 STMicroelectronics. All rights reserved. - * - * Project: BB gesture recognition - * Title: HmiBBGesture - * - * Description: Gesture recognition - left, right, tap - * - * 20/10/14 - * Changed from proximity to range - * Ultra simplified version - * - * -------------------------------------------------------------------- */ - -//#define PRINT_DEBUG_ -#define USE_MICRO_ - -#include "HmiBBGesture.h" -#include "stm32f4xx_hal.h" -#include <stdint.h> -#include <stdio.h> - -#ifdef USE_MICRO_ -//#include "vl6180x_shield.h" -//#include "platform.h" -//#define GET_TIME_STAMP() ((int)timer_get_clock_time_msecs()) // for Mbed -#define GET_TIME_STAMP() (int32_t)HAL_GetTick() // for Cube -#else -/* PC config */ -#include <windows.h> -#define GET_TIME_STAMP() ((int)timeGetTime()) -#endif - -#ifdef PRINT_DEBUG_ -#ifdef USE_MICRO_ -static char str[80]; -//extern void serial_print(const char *str); -#define serial_print(str) printf(str) -#endif -#endif - -#define HMI_SIGNAL_CODE_DROP_DOWN 1 -#define HMI_SIGNAL_CODE_RAISE_UP 2 -#define HMI_SIGNAL_CODE_DOWN_STATE 3 -#define HMI_SIGNAL_CODE_UP_STATE 4 -#define HMI_SIGNAL_CODE_NULL -1 - -#define HMI_TAP_CODE_SINGLE 0 -#define HMI_TAP_CODE_DOUBLE 1 -#define HMI_TAP_CODE_HOLD 2 -#define HMI_TAP_CODE_NULL -1 - - - - -/********************************************************************************** - * - * - * Gesture recognition class - * - * - **********************************************************************************/ - - -void HmiBBGesture::Init(int threshold_mm, int tap_threshold_mm, int min_hold_duration_ms, int min_swipe_duration_ms, int max_gesture_duration_ms ) -{ - m_motion_r.Init( threshold_mm ); - m_motion_l.Init( threshold_mm ); - m_tap_det.Init( tap_threshold_mm, 150, min_hold_duration_ms, false, 0 ); - m_fsm_state = 0; - m_timestamp = GET_TIME_STAMP(); - m_min_swipe_ms = min_swipe_duration_ms; - m_max_gesture_ms = max_gesture_duration_ms; - m_gesture_starts_from_right = false; -} - -int HmiBBGesture::Update(int range_r, int range_l, int *gesture_duration_ms) -{ - int r_code, r_ms; - int l_code, l_ms; - int duration; - int gesture_code = HMI_BB_GESTURE_CODE_NULL; - *gesture_duration_ms = 0; - - r_code = m_motion_r.Update( range_r , &r_ms ); - l_code = m_motion_l.Update( range_l , &l_ms ); -// printf ("r_ms: %d l_ms: %d\n\r",r_ms, l_ms); - switch( m_fsm_state ) - { - case 1: // gesture ends - - duration = GET_TIME_STAMP() - m_timestamp; - if(duration > m_max_gesture_ms) // gesture is too long - discard it - { - m_fsm_state = 0; -#ifdef PRINT_DEBUG_ - -#ifdef USE_MICRO_ -sprintf(str, "FSM 1 - Discarded %d %d %d mts %d\n",r_code,l_code,duration, m_timestamp); -serial_print(str); -#else -printf("FSM 1 - Discarded %d %d %d \n",r_code,l_code,duration); -#endif - -#endif - } - else if( (m_gesture_starts_from_right && l_code == HMI_SIGNAL_CODE_RAISE_UP ) || - (m_gesture_starts_from_right==false && r_code == HMI_SIGNAL_CODE_RAISE_UP) ) - { - m_fsm_state = 0; - if( duration > (m_min_swipe_ms/2) ) - { - gesture_code = ( m_gesture_starts_from_right ) ? HMI_BB_GESTURE_CODE_RIGHT : HMI_BB_GESTURE_CODE_LEFT; - *gesture_duration_ms = duration; -#ifdef PRINT_DEBUG_ - -#ifdef USE_MICRO_ -sprintf(str,"FSM 2 - Recognized %d\n",gesture_code); -serial_print(str); -#else -printf("FSM 2 - Recognized %d\n",gesture_code); -#endif - -#endif - } -#ifdef PRINT_DEBUG_ - else - { -#ifdef USE_MICRO_ -sprintf(str,"FSM 1 - Discarded %d %d %d \n",r_code,l_code,duration); -serial_print(str); -#else -printf("FSM 1 - Discarded %d %d %d \n",r_code,l_code,duration); -#endif - } -#endif - } - - break; - - case 0: // gesture starts - if( l_code == HMI_SIGNAL_CODE_DOWN_STATE && r_code == HMI_SIGNAL_CODE_RAISE_UP && r_ms > m_min_swipe_ms ) - { - m_gesture_starts_from_right = true; - m_fsm_state = 1; - m_timestamp = GET_TIME_STAMP(); - m_var_max_gesture_ms = r_ms; -#ifdef PRINT_DEBUG_ - -#ifdef USE_MICRO_ -sprintf(str,"FSM 0 - Right started %d\n",r_ms); -serial_print(str); -#else -printf("FSM 0 - Right started %d\n",r_ms); -#endif - -#endif - } - else if( l_code == HMI_SIGNAL_CODE_RAISE_UP && r_code == HMI_SIGNAL_CODE_DOWN_STATE && l_ms > m_min_swipe_ms ) - { - m_gesture_starts_from_right = false; - m_fsm_state = 1; - m_timestamp = GET_TIME_STAMP(); - m_var_max_gesture_ms = l_ms; -#ifdef PRINT_DEBUG_ - -#ifdef USE_MICRO_ -sprintf(str,"FSM 0 - Left started %d\n",l_ms); -serial_print(str); -#else -printf("FSM 0 - Left started %d\n",l_ms); -#endif - -#endif - } - break; - - default: - break; - }; - - if( m_tap_det.Update((range_r+range_l)/2,&duration) == HMI_TAP_CODE_HOLD ) - { - gesture_code = HMI_BB_GESTURE_CODE_TAP; - *gesture_duration_ms = duration; - m_fsm_state = 0; - } - - return gesture_code; -} - - -/********************************************************************************** - * - * - * MotionDetector class - * - * - **********************************************************************************/ - -void MotionDetector::Init(int threshold) -{ - m_threshold = threshold; - m_runonce = true; -} - - -int MotionDetector::Update(int sample,int *duration) -{ - int return_code; - bool belowCurrent, isContinuous; - - - // run once - if( m_runonce ) - { - m_runonce = false; - m_timestamp = GET_TIME_STAMP(); - m_prev_sample = sample; - belowCurrent = (sample < m_threshold); - isContinuous = true; - return_code = ( belowCurrent ) ? HMI_SIGNAL_CODE_DOWN_STATE : HMI_SIGNAL_CODE_UP_STATE; - *duration = 1; - return return_code; - } - - *duration = 0; - return_code = HMI_SIGNAL_CODE_NULL; - belowCurrent = (sample < m_threshold); - isContinuous = ( belowCurrent == (m_prev_sample < m_threshold)); - m_prev_sample = sample; - - // update - *duration = GET_TIME_STAMP() - m_timestamp; - if( isContinuous ) - { - return_code = ( belowCurrent ) ? HMI_SIGNAL_CODE_DOWN_STATE : HMI_SIGNAL_CODE_UP_STATE; - } - else - { - return_code = ( belowCurrent ) ? HMI_SIGNAL_CODE_DROP_DOWN : HMI_SIGNAL_CODE_RAISE_UP; - m_timestamp = GET_TIME_STAMP(); - } - - return return_code; -} - - - -/********************************************************************************** - * - * - * TapDetector - * - * - **********************************************************************************/ -void TapDetector::Init( int threshold, int min_down_duration_ms, int min_hold_duration_ms, bool enable_double_tap, int double_tap_min_duration_ms) -{ - m_threshold = threshold; - m_motion.Init( threshold ); - m_min_down_duration_ms = min_down_duration_ms; - m_min_hold_duration_ms = min_hold_duration_ms; - m_min_dtap_duration_ms = double_tap_min_duration_ms; - m_notify_hold = true; - m_notify_dtap = enable_double_tap; - m_timestamp = GET_TIME_STAMP(); -} - -int TapDetector::Update( int sample, int *duration ) -{ - int return_code; - int motion_code,motion_duration; - - return_code = HMI_TAP_CODE_NULL; - *duration = 0; - motion_code = m_motion.Update(sample, &motion_duration); - - // hold condition - down_duration > hold_time - if( motion_code == HMI_SIGNAL_CODE_DOWN_STATE && motion_duration > m_min_hold_duration_ms ) - { - if( m_notify_hold ) - { - return_code = HMI_TAP_CODE_HOLD; - m_notify_hold = false; // to avoid continue notification ( anti flood ) - *duration = motion_duration; - } - } - else if( motion_code == HMI_SIGNAL_CODE_RAISE_UP ) - { - m_notify_hold = true; - /* TODO add TAP single/double code */ - } - - return return_code; -} -
--- a/Middlewares/ST/STM32_HMI_HandGesture/HmiBBGesture.h Wed Oct 28 14:56:58 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,86 +0,0 @@ -/* ---------------------------------------------------------------------- - * Copyright (C) 2014 STMicroelectronics. All rights reserved. - * - * Project: BB gesture recognition - * Title: HmiBBGesture - * - * Description: Gesture recognition - left, right, tap - * - * -------------------------------------------------------------------- */ - -#ifndef HMIBBGESTURE_H_ -#define HMIBBGESTURE_H_ - -#ifdef __cplusplus //c++ -extern "C" -{ -#endif - -#define HMI_BB_GESTURE_CODE_TAP 0 -#define HMI_BB_GESTURE_CODE_LEFT 1 -#define HMI_BB_GESTURE_CODE_RIGHT 2 -#define HMI_BB_GESTURE_CODE_NULL -1 - - -class MotionDetector -{ -public: - MotionDetector() {}; - ~MotionDetector() {}; - - void Init(int threshold); - int Update(int sample,int *duration); - -protected: - int m_prev_sample; - int m_threshold; - int m_timestamp; - bool m_runonce; -}; - - -class TapDetector -{ -public: - TapDetector() {}; - ~TapDetector() {}; - void Init( int threshold, int min_down_duration_ms, int min_hold_duration_ms, bool enable_double_tap, int double_tap_min_duration_ms); - int Update( int sample, int *duration ); - -protected: - MotionDetector m_motion; - int m_threshold; - int m_min_down_duration_ms; - int m_min_hold_duration_ms; - int m_min_dtap_duration_ms; - int m_timestamp; - bool m_notify_hold; - bool m_notify_dtap; -}; - - -class HmiBBGesture -{ -public: - HmiBBGesture() {}; - ~HmiBBGesture() {}; - - void Init(int threshold_mm, int tap_threshold_mm, int min_hold_duration_ms, int min_swipe_duration_ms, int max_gesture_duration_ms ); - int Update(int range_r, int range_l,int *gesture_duration_ms); - -protected: - MotionDetector m_motion_r; - MotionDetector m_motion_l; - TapDetector m_tap_det; - int m_timestamp; - int m_fsm_state; - int m_min_swipe_ms; - int m_max_gesture_ms; - int m_var_max_gesture_ms; - bool m_gesture_starts_from_right; - -}; -#ifdef __cplusplus //c++ -} -#endif -#endif /* HMIBBGESTURE_H_ */
--- a/X_NUCLEO_COMMON.lib Wed Oct 28 14:56:58 2015 +0000 +++ b/X_NUCLEO_COMMON.lib Wed Oct 28 15:06:09 2015 +0000 @@ -1,1 +1,1 @@ -http://developer.mbed.org/teams/ST/code/X_NUCLEO_COMMON/#527e203b709b +http://developer.mbed.org/teams/ST/code/X_NUCLEO_COMMON/#da29b5403ca1
--- a/main.cpp Wed Oct 28 14:56:58 2015 +0000 +++ b/main.cpp Wed Oct 28 15:06:09 2015 +0000 @@ -1,6 +1,5 @@ #include "mbed.h" #include "x_nucleo_6180xa1.h" -#include "HmiBBGesture.h" #include <string.h> #include <stdlib.h> #include <stdio.h> @@ -40,8 +39,6 @@ DevI2C device_i2c(VL6180X_I2C_SDA, VL6180X_I2C_SCL); static X_NUCLEO_6180XA1 *board=X_NUCLEO_6180XA1::Instance(&device_i2c); -//HmiBBGesture gesture_reco; - MeasureData_t data_sensor_top, data_sensor_bottom, data_sensor_left, data_sensor_right; /* flags that handle interrupt request */