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

Dependencies:   C12832 FXOS8700Q LM75B MMA7660

Revision:
0:2ac59c564ab0
Child:
1:7be9a82f3ab8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/FrdmK64f_AppShield_Input.hpp	Tue Feb 23 17:25:07 2016 +0000
@@ -0,0 +1,138 @@
+#pragma once
+
+#include "mbed.h"
+#include "LM75B.h"
+#include "MMA7660.h"
+
+#include "Vector.hpp"
+#include "Utils.h"
+
+template <class Parent>
+class FrdmK64f_AppShield_Input : public Parent
+{
+    // Joystick
+    InterruptIn         _joystickUp;
+    InterruptIn         _joystickDown;
+    InterruptIn         _joystickLeft;
+    InterruptIn         _joystickRight;
+    InterruptIn         _joystickMiddle;
+    
+    // Potentiometers
+    AnalogIn            _potLeft;
+    AnalogIn            _potRight;
+    float               _potLeftValue;
+    float               _potRightValue;
+    float               _potLeftPrecision;
+    float               _potRightPrecision;
+
+    // Tempeture sensor
+    LM75B               _temp;
+    float               _tempValue;
+    float               _tempPrecision;
+    
+    // Accelerometer
+    MMA7660             _accel;
+    Vector<float>       _accelValue;
+    float               _accelPrecision;
+    
+public:
+
+    enum IDBinaryInput
+    {
+        JoystickUp,
+        JoystickDown,
+        JoystickLeft,
+        JoystickRight,
+        JoystickMiddle
+    };
+    
+    enum IDAnalogInput
+    {
+        PotLeft,
+        PotRight,
+        Temp
+    };
+    
+    enum IDVectorInput
+    {
+        Accel
+    };
+
+    FrdmK64f_AppShield_Input(void)
+        : _joystickUp(A2), _joystickDown(A3), _joystickLeft(A4), _joystickRight(A5), _joystickMiddle(D4),
+        _potLeft(A0), _potRight(A1), _potLeftValue(0.0f), _potRightValue(0.0f), _potLeftPrecision(1000.0f), _potRightPrecision(1000.0f),
+        _temp(D14, D15), _tempValue(0.0f), _tempPrecision(10.0f),
+        _accel(I2C_SDA, I2C_SCL), _accelPrecision(10.0f)
+    {
+        _joystickUp.rise(this, &FrdmK64f_AppShield_Input::onJoystickUpRise);
+        _joystickUp.fall(this, &FrdmK64f_AppShield_Input::onJoystickUpFall);
+        _joystickDown.rise(this, &FrdmK64f_AppShield_Input::onJoystickDownRise);
+        _joystickDown.fall(this, &FrdmK64f_AppShield_Input::onJoystickDownFall);
+        _joystickLeft.rise(this, &FrdmK64f_AppShield_Input::onJoystickLeftRise);
+        _joystickLeft.fall(this, &FrdmK64f_AppShield_Input::onJoystickLeftFall);
+        _joystickRight.rise(this, &FrdmK64f_AppShield_Input::onJoystickRightRise);
+        _joystickRight.fall(this, &FrdmK64f_AppShield_Input::onJoystickRightFall);
+        _joystickMiddle.rise(this, &FrdmK64f_AppShield_Input::onJoystickMiddleRise);
+        _joystickMiddle.fall(this, &FrdmK64f_AppShield_Input::onJoystickMiddleFall);
+        
+        _potLeftValue = prec(_potLeft, _potLeftPrecision);
+        _potRightValue = prec(_potRight, _potRightPrecision);
+        _tempValue = prec(_temp.read(), _tempPrecision);
+    }
+    
+    void    setPotLeftPrecision(short int pres) { _potLeftPrecision = pow(10.0f, pres); }
+    void    setPotRightPrecision(short int pres) { _potRightPrecision = pow(10.0f, pres); }
+    void    setTempPrecision(short int pres) { _tempPrecision = pow(10.0f, pres); }
+    void    setAccelPrecision(short int pres) { _accelPrecision = pow(10.0f, pres); }
+    
+    // Not interresting section (do not use those methods)
+    // Callbacks for joystick
+    void    onJoystickUpRise(void) { Parent::_events.push(Event(Event::AppShield, Event::BinaryInput, JoystickUp, Event::Rise)); }
+    void    onJoystickUpFall(void) { Parent::_events.push(Event(Event::AppShield, Event::BinaryInput, JoystickUp, Event::Fall)); }
+    void    onJoystickDownRise(void) { Parent::_events.push(Event(Event::AppShield, Event::BinaryInput, JoystickDown, Event::Rise)); }
+    void    onJoystickDownFall(void) { Parent::_events.push(Event(Event::AppShield, Event::BinaryInput, JoystickDown, Event::Fall)); }
+    void    onJoystickLeftRise(void) { Parent::_events.push(Event(Event::AppShield, Event::BinaryInput, JoystickLeft, Event::Rise)); }
+    void    onJoystickLeftFall(void) { Parent::_events.push(Event(Event::AppShield, Event::BinaryInput, JoystickLeft, Event::Fall)); }
+    void    onJoystickRightRise(void) { Parent::_events.push(Event(Event::AppShield, Event::BinaryInput, JoystickRight, Event::Rise)); }
+    void    onJoystickRightFall(void) { Parent::_events.push(Event(Event::AppShield, Event::BinaryInput, JoystickRight, Event::Fall)); }
+    void    onJoystickMiddleRise(void) { Parent::_events.push(Event(Event::AppShield, Event::BinaryInput, JoystickMiddle, Event::Rise)); }
+    void    onJoystickMiddleFall(void) { Parent::_events.push(Event(Event::AppShield, Event::BinaryInput, JoystickMiddle, Event::Fall)); }
+    
+    // Callback for others sensors
+    virtual void    chechAnalog(void)
+    {
+        Parent::chechAnalog();
+        {
+            Event   event(Event::AppShield, Event::AnalogInput, PotLeft, prec(_potLeft, _potLeftPrecision));
+            if (event.analog != _potLeftValue)
+            {
+                _potLeftValue = event.analog;
+                Parent::_events.push(event);
+            }
+        }
+        {
+            Event   event(Event::AppShield, Event::AnalogInput, PotRight, prec(_potRight, _potRightPrecision));
+            if (event.analog != _potRightValue)
+            {
+                _potRightValue = event.analog;
+                Parent::_events.push(event);
+            }
+        }
+        {
+            Event   event(Event::AppShield, Event::AnalogInput, Temp, prec(_temp.read(), _tempPrecision));
+            if (event.analog != _tempValue)
+            {
+                _tempValue = event.analog;
+                Parent::_events.push(event);
+            }
+        }
+        {
+            Event   event(Event::AppShield, Event::VectorInput, Accel, Vector<float>(prec(_accel.x(), _accelPrecision), prec(_accel.y(), _accelPrecision), prec(_accel.z(), _accelPrecision)));
+            if (!(event.vector.eq(_accelValue, 1.0f / _accelPrecision)))
+            {
+                _accelValue = event.vector;
+                Parent::_events.push(event);
+            }
+        }
+    }
+};
\ No newline at end of file