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:
cparata
Date:
Fri Aug 19 12:31:21 2016 +0000
Revision:
2:21a191bd1998
Add interfaces to all components

Who changed what in which revision?

UserRevisionLine numberNew contents of line
cparata 2:21a191bd1998 1 /**
cparata 2:21a191bd1998 2 ******************************************************************************
cparata 2:21a191bd1998 3 * @file LSM303AGR_ACC_Sensor.h
cparata 2:21a191bd1998 4 * @author AST
cparata 2:21a191bd1998 5 * @version V1.0.0
cparata 2:21a191bd1998 6 * @date 5 August 2016
cparata 2:21a191bd1998 7 * @brief Abstract Class of an LSM303AGR accelerometer sensor.
cparata 2:21a191bd1998 8 ******************************************************************************
cparata 2:21a191bd1998 9 * @attention
cparata 2:21a191bd1998 10 *
cparata 2:21a191bd1998 11 * <h2><center>&copy; COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
cparata 2:21a191bd1998 12 *
cparata 2:21a191bd1998 13 * Redistribution and use in source and binary forms, with or without modification,
cparata 2:21a191bd1998 14 * are permitted provided that the following conditions are met:
cparata 2:21a191bd1998 15 * 1. Redistributions of source code must retain the above copyright notice,
cparata 2:21a191bd1998 16 * this list of conditions and the following disclaimer.
cparata 2:21a191bd1998 17 * 2. Redistributions in binary form must reproduce the above copyright notice,
cparata 2:21a191bd1998 18 * this list of conditions and the following disclaimer in the documentation
cparata 2:21a191bd1998 19 * and/or other materials provided with the distribution.
cparata 2:21a191bd1998 20 * 3. Neither the name of STMicroelectronics nor the names of its contributors
cparata 2:21a191bd1998 21 * may be used to endorse or promote products derived from this software
cparata 2:21a191bd1998 22 * without specific prior written permission.
cparata 2:21a191bd1998 23 *
cparata 2:21a191bd1998 24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
cparata 2:21a191bd1998 25 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
cparata 2:21a191bd1998 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
cparata 2:21a191bd1998 27 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
cparata 2:21a191bd1998 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
cparata 2:21a191bd1998 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
cparata 2:21a191bd1998 30 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
cparata 2:21a191bd1998 31 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
cparata 2:21a191bd1998 32 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
cparata 2:21a191bd1998 33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
cparata 2:21a191bd1998 34 *
cparata 2:21a191bd1998 35 ******************************************************************************
cparata 2:21a191bd1998 36 */
cparata 2:21a191bd1998 37
cparata 2:21a191bd1998 38
cparata 2:21a191bd1998 39 /* Prevent recursive inclusion -----------------------------------------------*/
cparata 2:21a191bd1998 40
cparata 2:21a191bd1998 41 #ifndef __LSM303AGR_ACC_Sensor_H__
cparata 2:21a191bd1998 42 #define __LSM303AGR_ACC_Sensor_H__
cparata 2:21a191bd1998 43
cparata 2:21a191bd1998 44
cparata 2:21a191bd1998 45 /* Includes ------------------------------------------------------------------*/
cparata 2:21a191bd1998 46
cparata 2:21a191bd1998 47 #include "DevI2C.h"
cparata 2:21a191bd1998 48 #include "LSM303AGR_ACC_driver.h"
cparata 2:21a191bd1998 49 #include "MotionSensor.h"
cparata 2:21a191bd1998 50
cparata 2:21a191bd1998 51 /* Defines -------------------------------------------------------------------*/
cparata 2:21a191bd1998 52 #define LSM303AGR_ACC_SENSITIVITY_FOR_FS_2G_NORMAL_MODE 3.900f /**< Sensitivity value for 2 g full scale and normal mode [mg/LSB] */
cparata 2:21a191bd1998 53 #define LSM303AGR_ACC_SENSITIVITY_FOR_FS_2G_HIGH_RESOLUTION_MODE 0.980f /**< Sensitivity value for 2 g full scale and high resolution mode [mg/LSB] */
cparata 2:21a191bd1998 54 #define LSM303AGR_ACC_SENSITIVITY_FOR_FS_2G_LOW_POWER_MODE 15.630f /**< Sensitivity value for 2 g full scale and low power mode [mg/LSB] */
cparata 2:21a191bd1998 55 #define LSM303AGR_ACC_SENSITIVITY_FOR_FS_4G_NORMAL_MODE 7.820f /**< Sensitivity value for 4 g full scale and normal mode [mg/LSB] */
cparata 2:21a191bd1998 56 #define LSM303AGR_ACC_SENSITIVITY_FOR_FS_4G_HIGH_RESOLUTION_MODE 1.950f /**< Sensitivity value for 4 g full scale and high resolution mode [mg/LSB] */
cparata 2:21a191bd1998 57 #define LSM303AGR_ACC_SENSITIVITY_FOR_FS_4G_LOW_POWER_MODE 31.260f /**< Sensitivity value for 4 g full scale and low power mode [mg/LSB] */
cparata 2:21a191bd1998 58 #define LSM303AGR_ACC_SENSITIVITY_FOR_FS_8G_NORMAL_MODE 15.630f /**< Sensitivity value for 8 g full scale and normal mode [mg/LSB] */
cparata 2:21a191bd1998 59 #define LSM303AGR_ACC_SENSITIVITY_FOR_FS_8G_HIGH_RESOLUTION_MODE 3.900f /**< Sensitivity value for 8 g full scale and high resolution mode [mg/LSB] */
cparata 2:21a191bd1998 60 #define LSM303AGR_ACC_SENSITIVITY_FOR_FS_8G_LOW_POWER_MODE 62.520f /**< Sensitivity value for 8 g full scale and low power mode [mg/LSB] */
cparata 2:21a191bd1998 61 #define LSM303AGR_ACC_SENSITIVITY_FOR_FS_16G_NORMAL_MODE 46.900f /**< Sensitivity value for 16 g full scale and normal mode [mg/LSB] */
cparata 2:21a191bd1998 62 #define LSM303AGR_ACC_SENSITIVITY_FOR_FS_16G_HIGH_RESOLUTION_MODE 11.720f /**< Sensitivity value for 16 g full scale and high resolution mode [mg/LSB] */
cparata 2:21a191bd1998 63 #define LSM303AGR_ACC_SENSITIVITY_FOR_FS_16G_LOW_POWER_MODE 187.580f /**< Sensitivity value for 16 g full scale and low power mode [mg/LSB] */
cparata 2:21a191bd1998 64
cparata 2:21a191bd1998 65 /* Class Declaration ---------------------------------------------------------*/
cparata 2:21a191bd1998 66
cparata 2:21a191bd1998 67 /**
cparata 2:21a191bd1998 68 * Abstract class of an LSM303AGR Inertial Measurement Unit (IMU) 6 axes
cparata 2:21a191bd1998 69 * sensor.
cparata 2:21a191bd1998 70 */
cparata 2:21a191bd1998 71 class LSM303AGR_ACC_Sensor : public MotionSensor
cparata 2:21a191bd1998 72 {
cparata 2:21a191bd1998 73 public:
cparata 2:21a191bd1998 74 LSM303AGR_ACC_Sensor(DevI2C &i2c);
cparata 2:21a191bd1998 75 LSM303AGR_ACC_Sensor(DevI2C &i2c, uint8_t address);
cparata 2:21a191bd1998 76 virtual int Init(void *init);
cparata 2:21a191bd1998 77 virtual int ReadID(uint8_t *id);
cparata 2:21a191bd1998 78 virtual int Get_X_Axes(int32_t *pData);
cparata 2:21a191bd1998 79 virtual int Get_X_AxesRaw(int16_t *pData);
cparata 2:21a191bd1998 80 virtual int Get_X_Sensitivity(float *pfData);
cparata 2:21a191bd1998 81 virtual int Get_X_ODR(float *odr);
cparata 2:21a191bd1998 82 virtual int Set_X_ODR(float odr);
cparata 2:21a191bd1998 83 virtual int Get_X_FS(float *fullScale);
cparata 2:21a191bd1998 84 virtual int Set_X_FS(float fullScale);
cparata 2:21a191bd1998 85 int Enable(void);
cparata 2:21a191bd1998 86 int Disable(void);
cparata 2:21a191bd1998 87 int ReadReg(uint8_t reg, uint8_t *data);
cparata 2:21a191bd1998 88 int WriteReg(uint8_t reg, uint8_t data);
cparata 2:21a191bd1998 89
cparata 2:21a191bd1998 90 /**
cparata 2:21a191bd1998 91 * @brief Utility function to read data.
cparata 2:21a191bd1998 92 * @param pBuffer: pointer to data to be read.
cparata 2:21a191bd1998 93 * @param RegisterAddr: specifies internal address register to be read.
cparata 2:21a191bd1998 94 * @param NumByteToRead: number of bytes to be read.
cparata 2:21a191bd1998 95 * @retval 0 if ok, an error code otherwise.
cparata 2:21a191bd1998 96 */
cparata 2:21a191bd1998 97 uint8_t IO_Read(uint8_t* pBuffer, uint8_t RegisterAddr, uint16_t NumByteToRead)
cparata 2:21a191bd1998 98 {
cparata 2:21a191bd1998 99 return (uint8_t) dev_i2c.i2c_read(pBuffer, address, RegisterAddr, NumByteToRead);
cparata 2:21a191bd1998 100 }
cparata 2:21a191bd1998 101
cparata 2:21a191bd1998 102 /**
cparata 2:21a191bd1998 103 * @brief Utility function to write data.
cparata 2:21a191bd1998 104 * @param pBuffer: pointer to data to be written.
cparata 2:21a191bd1998 105 * @param RegisterAddr: specifies internal address register to be written.
cparata 2:21a191bd1998 106 * @param NumByteToWrite: number of bytes to write.
cparata 2:21a191bd1998 107 * @retval 0 if ok, an error code otherwise.
cparata 2:21a191bd1998 108 */
cparata 2:21a191bd1998 109 uint8_t IO_Write(uint8_t* pBuffer, uint8_t RegisterAddr, uint16_t NumByteToWrite)
cparata 2:21a191bd1998 110 {
cparata 2:21a191bd1998 111 return (uint8_t) dev_i2c.i2c_write(pBuffer, address, RegisterAddr, NumByteToWrite);
cparata 2:21a191bd1998 112 }
cparata 2:21a191bd1998 113
cparata 2:21a191bd1998 114 private:
cparata 2:21a191bd1998 115 int Set_X_ODR_When_Enabled(float odr);
cparata 2:21a191bd1998 116 int Set_X_ODR_When_Disabled(float odr);
cparata 2:21a191bd1998 117 int Get_X_Sensitivity_Normal_Mode(float *sensitivity );
cparata 2:21a191bd1998 118 int Get_X_Sensitivity_LP_Mode(float *sensitivity );
cparata 2:21a191bd1998 119 int Get_X_Sensitivity_HR_Mode(float *sensitivity );
cparata 2:21a191bd1998 120
cparata 2:21a191bd1998 121 /* Helper classes. */
cparata 2:21a191bd1998 122 DevI2C &dev_i2c;
cparata 2:21a191bd1998 123
cparata 2:21a191bd1998 124 /* Configuration */
cparata 2:21a191bd1998 125 uint8_t address;
cparata 2:21a191bd1998 126
cparata 2:21a191bd1998 127 uint8_t isEnabled;
cparata 2:21a191bd1998 128 float Last_ODR;
cparata 2:21a191bd1998 129 };
cparata 2:21a191bd1998 130
cparata 2:21a191bd1998 131 #ifdef __cplusplus
cparata 2:21a191bd1998 132 extern "C" {
cparata 2:21a191bd1998 133 #endif
cparata 2:21a191bd1998 134 uint8_t LSM303AGR_ACC_IO_Write( void *handle, uint8_t WriteAddr, uint8_t *pBuffer, uint16_t nBytesToWrite );
cparata 2:21a191bd1998 135 uint8_t LSM303AGR_ACC_IO_Read( void *handle, uint8_t ReadAddr, uint8_t *pBuffer, uint16_t nBytesToRead );
cparata 2:21a191bd1998 136 #ifdef __cplusplus
cparata 2:21a191bd1998 137 }
cparata 2:21a191bd1998 138 #endif
cparata 2:21a191bd1998 139
cparata 2:21a191bd1998 140 #endif