IO is an event based input manager which permit to select which composents are manged on your system

Dependencies:   C12832 FXOS8700Q LM75B MMA7660

Revision:
3:1ab88130bb9d
Parent:
2:c871dc21467b
Child:
4:50e2aefe516b
--- a/FrdmK64f_Input.hpp	Tue Feb 23 18:56:50 2016 +0000
+++ b/FrdmK64f_Input.hpp	Thu Feb 25 14:28:48 2016 +0000
@@ -1,6 +1,7 @@
 #pragma once
 
 #include "mbed.h"
+#include "FXOS8700Q.h"
 
 template <class Parent>
 class FrdmK64f_Input : public Parent
@@ -14,35 +15,100 @@
         IDBinaryInput_MAX
     };
     
+    enum IDVectorInput
+    {
+        Accel,
+        Magnet,
+        IDVectorInput_MAX
+    };
+    
 private:
 
     // Buttons
     InterruptIn         _buttonLeft;
     InterruptIn         _buttonRight;
-    bool                _binaryInputEnable[2];
+    bool                _binaryInputEnable[IDBinaryInput_MAX];
+    
+    FXOS8700Q_acc       _accel;
+    FXOS8700Q_mag       _magnet;
+    Vector              _accelValue;
+    Vector              _magnetValue;    
+    float               _accelPrecision;
+    float               _magnetPrecision;
+    bool                _vectorInputEnable[IDVectorInput_MAX];
+    float               _vectorInputPrec[IDVectorInput_MAX];
     
 public:
     FrdmK64f_Input(void)
-        : _buttonLeft(SW3), _buttonRight(SW2)
+        : _buttonLeft(SW3), _buttonRight(SW2),
+          _accel( PTE25, PTE24, FXOS8700CQ_SLAVE_ADDR1), _magnet( PTE25, PTE24, FXOS8700CQ_SLAVE_ADDR1),
+          _accelPrecision(100.0f), _magnetPrecision(100.0f)
+
     {
         memset(_binaryInputEnable, 1, sizeof(_binaryInputEnable));
+        memset(_vectorInputEnable, 0, sizeof(_vectorInputEnable));
+        
+        for (int it = 0; it < IDVectorInput_MAX; ++it) _vectorInputPrec[it] = 10.0f;
         
         _buttonLeft.rise(this, &FrdmK64f_Input::onButtonLeftRise);
         _buttonLeft.fall(this, &FrdmK64f_Input::onButtonLeftFall);
         _buttonRight.rise(this, &FrdmK64f_Input::onButtonRightRise);
         _buttonRight.fall(this, &FrdmK64f_Input::onButtonRightFall);
+        
+        _accel.enable();
+        _magnet.enable();
     }
     
     using   Parent::setEnable;
     void    setEnable(FrdmK64f_Input::IDBinaryInput inp, bool act) { _binaryInputEnable[inp] = act; }
+    void    setEnable(FrdmK64f_Input::IDVectorInput inp, bool act) { _vectorInputEnable[inp] = act; }
     
+    using   Parent::setPrecision;
+    void    setPrecision(FrdmK64f_Input::IDVectorInput inp, float prec) { _vectorInputPrec[inp] = prec; }
+
     // Not interresting section (do not use those methods)
     // Callbacks for joystick
     void    onButtonLeftRise(void) { if (_binaryInputEnable[ButtonLeft]) Parent::_events.push(Event(Event::FrdmK64f, Event::BinaryInput, ButtonLeft, Event::Rise)); }
     void    onButtonLeftFall(void) { if (_binaryInputEnable[ButtonLeft]) Parent::_events.push(Event(Event::FrdmK64f, Event::BinaryInput, ButtonLeft, Event::Fall)); }
     void    onButtonRightRise(void) { if (_binaryInputEnable[ButtonRight]) Parent::_events.push(Event(Event::FrdmK64f, Event::BinaryInput, ButtonRight, Event::Rise)); }
     void    onButtonRightFall(void) { if (_binaryInputEnable[ButtonRight]) Parent::_events.push(Event(Event::FrdmK64f, Event::BinaryInput, ButtonRight, Event::Fall)); }
-    
+
+    using Parent::checkAnalog;    
     // Callback for others sensors
-    virtual void    chechAnalog(void) { Parent::chechAnalog(); }
+    virtual void    checkVector(void)
+    {
+        Parent::checkVector();
+        
+        if(_vectorInputEnable[Accel])
+        {
+            MotionSensorDataUnits acc_data;
+            _accel.getAxis(acc_data);
+            Vector   tmp;
+            tmp.x = prec(acc_data.x, _vectorInputPrec[Accel]);
+            tmp.y = prec(acc_data.y, _vectorInputPrec[Accel]);
+            tmp.z = prec(acc_data.z, _vectorInputPrec[Accel]);
+            Event   event(Event::FrdmK64f, Event::VectorInput, Accel, tmp);
+            if (!(event.vector.eq(_accelValue, 1.0f / _vectorInputPrec[Accel])))
+            {
+                _accelValue = event.vector;
+                Parent::_events.push(event);
+            }
+        }
+        
+        if(_vectorInputEnable[Magnet])
+        {
+            MotionSensorDataUnits mag_data;
+            _magnet.getAxis(mag_data);
+            Vector   tmp;
+            tmp.x = prec(mag_data.x, _vectorInputPrec[Magnet]);
+            tmp.y = prec(mag_data.y, _vectorInputPrec[Magnet]);
+            tmp.z = prec(mag_data.z, _vectorInputPrec[Magnet]);
+            Event   event(Event::FrdmK64f, Event::VectorInput, Magnet, tmp);
+            if (!(event.vector.eq(_accelValue, (int)(1.0f / _vectorInputPrec[Magnet]))))
+            {
+                _accelValue = event.vector;
+                Parent::_events.push(event);
+            }
+        }
+    }
 };
\ No newline at end of file