no changes

Fork of MMA8451Q by Johan Kritzinger

Revision:
6:26a391348e7c
Parent:
5:2d14600116fc
--- a/MMA8451Q.cpp	Sun Mar 10 04:34:03 2013 +0000
+++ b/MMA8451Q.cpp	Wed Mar 07 11:40:05 2018 +0000
@@ -1,25 +1,8 @@
-/* Copyright (c) 2010-2011 mbed.org, MIT License
-*
-* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
-* and associated documentation files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use, copy, modify, merge, publish,
-* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following conditions:
-*
-* The above copyright notice and this permission notice shall be included in all copies or
-* substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
 #include "MMA8451Q.h"
 
 #define INT_SOURCE        0x0C 
 #define REG_WHO_AM_I      0x0D
+#define XYZ_DATA_CFG      0X0E
 #define HP_FILTER_CUTOFF  0x0F 
 #define PULSE_CFG         0x21 
 #define PULSE_SRC         0x22 
@@ -47,6 +30,20 @@
 
 MMA8451Q::~MMA8451Q() { }
 
+//read sr value to understand if a tap has occured and in which axe\axes
+uint8_t MMA8451Q::get_source_reg_value(){
+    uint8_t srch_val = 0;
+    readRegs(PULSE_SRC, &srch_val, 1);
+    return srch_val;
+    }
+    
+void MMA8451Q::disable_lpfilter(){
+        //disable LOW PASS FILTER
+        uint8_t data[2] = {HP_FILTER_CUTOFF , 0x00}; 
+    writeRegs(data,2);
+    
+        }
+
 uint8_t MMA8451Q::getWhoAmI() {
     uint8_t who_am_i = 0;
     readRegs(REG_WHO_AM_I, &who_am_i, 1);
@@ -84,13 +81,78 @@
     return acc;
 }
 
+
+void MMA8451Q::lv1setSingleTap(){
+    
+    uint8_t CTRL_REG1_Data;
+//    int adds;
+   uint8_t data[2] = {REG_CTRL_REG_1, 0x00}; //data rate 400hz (0x08), 800hz 0x00
+   
+   
+    //800 Hz, Standby Mode
+    writeRegs(data,2);
+    
+    //8g (0x10) dynamic range (0x00 for 2g and 0x01 for 4g)
+    //enable the 4th bit means enable the hpfilter to both fifo and data registers(0b000010xx)-> enable hpf for xx dynamic range
+    data[0] = XYZ_DATA_CFG; data[1] = 0x00;
+    writeRegs(data,2);
+    
+    //Enable X, Y and Z Single Pulse with DPA = 0 no double pulse abort  
+    // 0x55 gia na einai setarismeno to ele bit, diladi oi times ston pulse_src reg na paramenoun statikes mexri na diavastoun  
+    //0x3f gia simgle kai double pulse enable se olous tous aksones
+    data[0]=PULSE_CFG;data[1]=0x15; //0x15 to involved all 3 axis to tap detection , 0x04 only Y axis
+    writeRegs(data,2);
+    
+    
+     //SetThreshold 2g on X and Y and 2.64g on Z
+    //Note: Every step is 0.063g
+    //2.0 /0.063g = 32 counts
+    //3g/0.063g = 48 counts
+    data[0]=PULSE_THSX;data[1]=0x40; //0x40
+    writeRegs(data,2);//Set X Threshold to 2g 
+    data[0]=PULSE_THSY;data[1]=0x40; //0x40
+    writeRegs(data,2);//Set Y Threshold to 2g 
+    data[0]=PULSE_THSZ;data[1]=0xFF; //0x40
+    writeRegs(data,2);//Set Z Threshold to 3g
+
+    //Set Time Limit for Tap Detection to 50 ms NO LP Mode
+    //Note: 400 Hz ODR, Time step is 0.625 ms per step
+    //50 ms/0.625 ms = 80 counts 
+    data[0]=PULSE_TMLT;data[1]=0x50; 
+    writeRegs(data,2);//200 ms
+    
+    //Set Latency Time to 300 ms
+    //Note: 400 Hz ODR LPMode, Time step is 1.25 ms per step 200 ms/1.25 ms = 160 counts
+    data[0]=PULSE_LTCY;data[1]=0xFF; 
+    writeRegs(data,2);//200 ms
+    
+   
+    //Route INT1 to System Interrupt
+    
+    data[0]=CTRL_REG4;data[1]=0x08;
+    writeRegs(data,2);//Enable Pulse Interrupt in System CTRL_REG4
+    data[0]=CTRL_REG5;data[1]= 0x08; 
+    writeRegs(data,2);//Route Pulse Interrupt to INT1 hardware Pin CTRL_REG5
+    
+    
+    //Set the device to Active Mode
+    readRegs(0x2A,&CTRL_REG1_Data,1);//Read out the contents of the register 
+    CTRL_REG1_Data |= 0x01; //Change the value in the register to Active Mode.
+    data[0]=REG_CTRL_REG_1; 
+    data[1]=CTRL_REG1_Data;
+    writeRegs(data,2);//Write in the updated value to put the device in Active Mode
+         
+}
+
+
+
 void MMA8451Q::setDoubleTap(void){
 //Implemented directly from Freescale's AN4072 
 //Added to MMA8451Q lib
 
     uint8_t CTRL_REG1_Data;
 //    int adds;
-   uint8_t data[2] = {REG_CTRL_REG_1, 0x08};
+   uint8_t data[2] = {REG_CTRL_REG_1, 0x08}; 
     
     //400 Hz, Standby Mode
     writeRegs(data,2);
@@ -103,29 +165,29 @@
     //Note: Every step is 0.063g
     //3 g/0.063g = 48 counts
     //5g/0.063g = 79 counts
-    data[0]=PULSE_THSX;data[1]=0x30;
+    data[0]=PULSE_THSX;data[1]=0x4f;
     writeRegs(data,2);//Set X Threshold to 3g 
-    data[0]=PULSE_THSY;data[1]=0x30;
+    data[0]=PULSE_THSY;data[1]=0x4f;
     writeRegs(data,2);//Set Y Threshold to 3g 
-    data[0]=PULSE_THSZ;data[1]=0x4F;
+    data[0]=PULSE_THSZ;data[1]=0x5F;
     writeRegs(data,2);//Set Z Threshold to 5g
 
     //Set Time Limit for Tap Detection to 60 ms LP Mode
     //Note: 400 Hz ODR, Time step is 1.25 ms per step
     //60 ms/1.25 ms = 48 counts 
-    data[0]=PULSE_TMLT;data[1]=0x30;
+    data[0]=PULSE_TMLT;data[1]=0x50;
     writeRegs(data,2);//60 ms
     
     //Set Latency Time to 200 ms
     //Note: 400 Hz ODR LPMode, Time step is 2.5 ms per step 00 ms/2.5 ms = 80 counts
-    data[0]=PULSE_LTCY;data[1]=0x50;
+    data[0]=PULSE_LTCY;data[1]=0xF0;
     writeRegs(data,2);//200 ms
     
     //Set Time Window for second tap to 300 ms
     //Note: 400 Hz ODR LP Mode, Time step is 2.5 ms per step
     //300 ms/2.5 ms = 120 counts
-    data[0]=PULSE_WIND;data[1]=0x78;
-    writeRegs(data,2);//300 ms
+    data[0]=PULSE_WIND;data[1]=0x78; 
+    writeRegs(data,2);//300 ms   
     
     //Route INT1 to System Interrupt
     data[0]=CTRL_REG4;data[1]=0x08;
@@ -139,7 +201,8 @@
     data[0]=REG_CTRL_REG_1; 
     data[1]=CTRL_REG1_Data;
     writeRegs(data,2);//Write in the updated value to put the device in Active Mode
-}
+} 
+
 
 
 void MMA8451Q::readRegs(int addr, uint8_t * data, int len) {
@@ -153,3 +216,4 @@
 void MMA8451Q::writeRegs(uint8_t * data, int len) {
     m_i2c.write(m_addr, (char *)data, len);
 }
+