Example of single tap and double tap detection for LSM6DSL in X-NUCLEO-IKS01A2

Dependencies:   X_NUCLEO_IKS01A2 mbed

Fork of SingleDoubleTap_IKS01A2 by ST Expansion SW Team

Single and Double Tap Demo Application based on sensor expansion board X-NUCLEO-IKS01A2

Main function is to show how to detect the single and double tap events using the sensor expansion board and send a notification using UART to a connected PC or Desktop and display it on terminal applications like TeraTerm.
After connection has been established:
- the user can try to tap the board and then view the notification using an hyper terminal. When the single tap is detected, the LED is switched on for a while.
- the user can press the user button to pass from the single tap detection to the double tap detection feature. The user can try to double tap the board and then view the notification using an hyper terminal. When the double tap is detected, the LED is switched on twice for a while.
- the user can press again the user button to disable the single and double tap detection feature.
- the user can press the user button to enable again the single tap detection feature and so on.

Committer:
nikapov
Date:
Fri Sep 08 13:01:29 2017 +0000
Revision:
22:c099076fb9cb
Parent:
19:ada8d403238b
Update libs.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
cparata 0:e4f89df7a7a5 1 /**
cparata 0:e4f89df7a7a5 2 ******************************************************************************
cparata 0:e4f89df7a7a5 3 * @file main.cpp
cparata 13:ce4e62ea3c02 4 * @author CLab
cparata 13:ce4e62ea3c02 5 * @version V1.0.0
cparata 14:1556d5cb2e9c 6 * @date 2-December-2016
cparata 0:e4f89df7a7a5 7 * @brief Simple Example application for using the X_NUCLEO_IKS01A2
cparata 0:e4f89df7a7a5 8 * MEMS Inertial & Environmental Sensor Nucleo expansion board.
cparata 0:e4f89df7a7a5 9 ******************************************************************************
cparata 0:e4f89df7a7a5 10 * @attention
cparata 0:e4f89df7a7a5 11 *
cparata 0:e4f89df7a7a5 12 * <h2><center>&copy; COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
cparata 0:e4f89df7a7a5 13 *
cparata 0:e4f89df7a7a5 14 * Redistribution and use in source and binary forms, with or without modification,
cparata 0:e4f89df7a7a5 15 * are permitted provided that the following conditions are met:
cparata 0:e4f89df7a7a5 16 * 1. Redistributions of source code must retain the above copyright notice,
cparata 0:e4f89df7a7a5 17 * this list of conditions and the following disclaimer.
cparata 0:e4f89df7a7a5 18 * 2. Redistributions in binary form must reproduce the above copyright notice,
cparata 0:e4f89df7a7a5 19 * this list of conditions and the following disclaimer in the documentation
cparata 0:e4f89df7a7a5 20 * and/or other materials provided with the distribution.
cparata 0:e4f89df7a7a5 21 * 3. Neither the name of STMicroelectronics nor the names of its contributors
cparata 0:e4f89df7a7a5 22 * may be used to endorse or promote products derived from this software
cparata 0:e4f89df7a7a5 23 * without specific prior written permission.
cparata 0:e4f89df7a7a5 24 *
cparata 0:e4f89df7a7a5 25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
cparata 0:e4f89df7a7a5 26 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
cparata 0:e4f89df7a7a5 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
cparata 0:e4f89df7a7a5 28 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
cparata 0:e4f89df7a7a5 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
cparata 0:e4f89df7a7a5 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
cparata 0:e4f89df7a7a5 31 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
cparata 0:e4f89df7a7a5 32 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
cparata 0:e4f89df7a7a5 33 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
cparata 0:e4f89df7a7a5 34 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
cparata 0:e4f89df7a7a5 35 *
cparata 0:e4f89df7a7a5 36 ******************************************************************************
cparata 0:e4f89df7a7a5 37 */
cparata 0:e4f89df7a7a5 38
cparata 0:e4f89df7a7a5 39 /* Includes */
cparata 0:e4f89df7a7a5 40 #include "mbed.h"
davide.aliprandi@st.com 19:ada8d403238b 41 #include "XNucleoIKS01A2.h"
cparata 0:e4f89df7a7a5 42
cparata 0:e4f89df7a7a5 43 /* Instantiate the expansion board */
davide.aliprandi@st.com 19:ada8d403238b 44 static XNucleoIKS01A2 *mems_expansion_board = XNucleoIKS01A2::instance(D14, D15, D4, D5);
cparata 0:e4f89df7a7a5 45
cparata 0:e4f89df7a7a5 46 /* Retrieve the composing elements of the expansion board */
cparata 0:e4f89df7a7a5 47 static LSM6DSLSensor *acc_gyro = mems_expansion_board->acc_gyro;
cparata 0:e4f89df7a7a5 48
cparata 0:e4f89df7a7a5 49 InterruptIn mybutton(USER_BUTTON);
cparata 0:e4f89df7a7a5 50 DigitalOut myled(LED1);
cparata 0:e4f89df7a7a5 51
cparata 7:4f512b172555 52 volatile int mems_event = 0;
cparata 0:e4f89df7a7a5 53 volatile int change_mode = 0;
cparata 0:e4f89df7a7a5 54 static int mode = 1; /* 0 means No tap, 1 means Single Tap enabled, 2 means Double Tap enabled*/
cparata 0:e4f89df7a7a5 55
davide.aliprandi@st.com 19:ada8d403238b 56 /* User button callback. */
davide.aliprandi@st.com 19:ada8d403238b 57 void pressed_cb() {
davide.aliprandi@st.com 19:ada8d403238b 58 change_mode = 1;
davide.aliprandi@st.com 19:ada8d403238b 59 }
davide.aliprandi@st.com 19:ada8d403238b 60
davide.aliprandi@st.com 19:ada8d403238b 61 /* Interrupt 1 callback. */
davide.aliprandi@st.com 19:ada8d403238b 62 void int1_cb() {
davide.aliprandi@st.com 19:ada8d403238b 63 mems_event = 1;
davide.aliprandi@st.com 19:ada8d403238b 64 }
cparata 0:e4f89df7a7a5 65
cparata 0:e4f89df7a7a5 66 /* Simple main function */
cparata 0:e4f89df7a7a5 67 int main() {
cparata 0:e4f89df7a7a5 68 /* Attach callback to User button press */
cparata 7:4f512b172555 69 mybutton.fall(&pressed_cb);
cparata 0:e4f89df7a7a5 70 /* Attach callback to LSM6DSL INT1 */
davide.aliprandi@st.com 19:ada8d403238b 71 acc_gyro->attach_int1_irq(&int1_cb);
cparata 0:e4f89df7a7a5 72
cparata 0:e4f89df7a7a5 73 /* Enable LSM6DSL accelerometer */
davide.aliprandi@st.com 19:ada8d403238b 74 acc_gyro->enable_x();
cparata 0:e4f89df7a7a5 75 /* Enable Single Tap Detection. */
davide.aliprandi@st.com 19:ada8d403238b 76 acc_gyro->enable_single_tap_detection();
cparata 0:e4f89df7a7a5 77
cparata 0:e4f89df7a7a5 78 printf("\r\n--- Starting new run ---\r\n");
cparata 0:e4f89df7a7a5 79
cparata 0:e4f89df7a7a5 80 while(1) {
cparata 0:e4f89df7a7a5 81 if(change_mode) {
cparata 0:e4f89df7a7a5 82 change_mode = 0;
cparata 0:e4f89df7a7a5 83 mode = ((mode + 1) % 3);
cparata 0:e4f89df7a7a5 84 switch(mode) {
cparata 0:e4f89df7a7a5 85 case 0:
cparata 0:e4f89df7a7a5 86 /* Disable Double Tap */
davide.aliprandi@st.com 19:ada8d403238b 87 acc_gyro->disable_double_tap_detection();
cparata 0:e4f89df7a7a5 88 break;
cparata 0:e4f89df7a7a5 89 case 1:
cparata 0:e4f89df7a7a5 90 /* Enable Single Tap */
davide.aliprandi@st.com 19:ada8d403238b 91 acc_gyro->enable_single_tap_detection();
cparata 0:e4f89df7a7a5 92 break;
cparata 0:e4f89df7a7a5 93 case 2:
cparata 0:e4f89df7a7a5 94 /* Disable Single Tap and Enable Double Tap */
davide.aliprandi@st.com 19:ada8d403238b 95 acc_gyro->disable_single_tap_detection();
davide.aliprandi@st.com 19:ada8d403238b 96 acc_gyro->enable_double_tap_detection();
cparata 0:e4f89df7a7a5 97 break;
cparata 0:e4f89df7a7a5 98 }
cparata 0:e4f89df7a7a5 99 }
cparata 0:e4f89df7a7a5 100
cparata 7:4f512b172555 101 if (mems_event) {
cparata 7:4f512b172555 102 mems_event = 0;
cparata 0:e4f89df7a7a5 103 switch(mode) {
cparata 0:e4f89df7a7a5 104 case 0:
cparata 0:e4f89df7a7a5 105 default:
cparata 0:e4f89df7a7a5 106 break;
cparata 0:e4f89df7a7a5 107 case 1: {
cparata 4:05f28412d61b 108 LSM6DSL_Event_Status_t status;
davide.aliprandi@st.com 19:ada8d403238b 109 acc_gyro->get_event_status(&status);
cparata 4:05f28412d61b 110 if (status.TapStatus) {
cparata 0:e4f89df7a7a5 111 /* Led blinking. */
cparata 0:e4f89df7a7a5 112 myled = 1;
cparata 0:e4f89df7a7a5 113 wait(0.1);
cparata 0:e4f89df7a7a5 114 myled = 0;
cparata 0:e4f89df7a7a5 115
cparata 0:e4f89df7a7a5 116 /* Output data. */
cparata 0:e4f89df7a7a5 117 printf("Single Tap Detected!\r\n");
cparata 0:e4f89df7a7a5 118 }
davide.aliprandi@st.com 19:ada8d403238b 119 break;
cparata 0:e4f89df7a7a5 120 }
cparata 0:e4f89df7a7a5 121 case 2: {
cparata 4:05f28412d61b 122 LSM6DSL_Event_Status_t status;
davide.aliprandi@st.com 19:ada8d403238b 123 acc_gyro->get_event_status(&status);
cparata 4:05f28412d61b 124 if (status.DoubleTapStatus) {
cparata 0:e4f89df7a7a5 125 /* Double Led blinking */
cparata 0:e4f89df7a7a5 126 myled = 1;
cparata 0:e4f89df7a7a5 127 wait(0.1);
cparata 0:e4f89df7a7a5 128 myled = 0;
cparata 0:e4f89df7a7a5 129 wait(0.1);
cparata 0:e4f89df7a7a5 130 myled = 1;
cparata 0:e4f89df7a7a5 131 wait(0.1);
cparata 0:e4f89df7a7a5 132 myled = 0;
cparata 0:e4f89df7a7a5 133
cparata 0:e4f89df7a7a5 134 /* Output data. */
cparata 0:e4f89df7a7a5 135 printf("Double Tap Detected!\r\n");
cparata 0:e4f89df7a7a5 136 }
davide.aliprandi@st.com 19:ada8d403238b 137 break;
cparata 0:e4f89df7a7a5 138 }
cparata 0:e4f89df7a7a5 139 }
cparata 0:e4f89df7a7a5 140 }
cparata 0:e4f89df7a7a5 141 }
cparata 0:e4f89df7a7a5 142 }