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

Dependencies:   C12832 FXOS8700Q LM75B MMA7660

FrdmK64f_Input.hpp

Committer:
co838_app56
Date:
2016-02-25
Revision:
3:1ab88130bb9d
Parent:
2:c871dc21467b
Child:
4:50e2aefe516b

File content as of revision 3:1ab88130bb9d:

#pragma once

#include "mbed.h"
#include "FXOS8700Q.h"

template <class Parent>
class FrdmK64f_Input : public Parent
{
public: // List of manged Inputs

    enum IDBinaryInput
    {
        ButtonLeft,
        ButtonRight,
        IDBinaryInput_MAX
    };
    
    enum IDVectorInput
    {
        Accel,
        Magnet,
        IDVectorInput_MAX
    };
    
private:

    // Buttons
    InterruptIn         _buttonLeft;
    InterruptIn         _buttonRight;
    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),
          _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    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);
            }
        }
    }
};