enhancing Multitech's library for some accelerometer

Fork of MMA845x by Multi-Hackers

Revision:
12:92294b5ca1c1
Parent:
10:89dd748f9211
Child:
13:77a8994b3bb2
--- a/MMA845x.cpp	Mon Jul 02 22:52:24 2018 +0000
+++ b/MMA845x.cpp	Mon Jul 02 23:55:31 2018 +0000
@@ -142,15 +142,36 @@
     return result;
 }
 
-uint8_t MMA845x::enableOrientationDetect(void) const
+uint8_t MMA845x::enableOrientationDetect(uint8_t debounce_steps, INTERRUPT_PIN pin) const
 {
     uint8_t result = 0;
-
     // if(_who_am_i != MMA8451) {
     //     debug("%s %d: Feature not compatible with the connected device.\n", __FILE__, __LINE__);
     //     result = 1;
     // }
     // ↑ not true. MMA8451 is the only one supporting variable trip-angle values
+    char datain[1];
+    uint8_t dataout;
+
+    MMA845x::writeRegister(PL_COUNT, debounce_steps);
+    MMA845x::writeRegister(PL_CFG, 0b11000000); // enable and set debounce counter to clear out of {clear, decrement}
+
+    if (pin != INT_NONE) {
+        // enable interrupt
+        result |= MMA845x::readRegister(CTRL_REG4, 1, datain);
+        dataout = (datain[0] | INT_LNDPRT);
+        result |= MMA845x::writeRegister(CTRL_REG4, dataout);
+
+        //set pin for the interrupt
+        result |= MMA845x::readRegister(CTRL_REG5, 1, datain);
+        if (pin == 0)   dataout = (datain[0] & ~INT_LNDPRT); // clearing bit
+        else            dataout = (datain[0] | INT_LNDPRT);  // setting bit
+    } else {
+        // disable interrupt
+        result |= MMA845x::readRegister(CTRL_REG4, 1, datain);
+        dataout = (datain[0] & ~INT_LNDPRT);
+        result |= MMA845x::writeRegister(CTRL_REG4, dataout);
+    }
 
     return result;
 }