IO is an event based input manager which permit to select which composents are manged on your system
Dependencies: C12832 FXOS8700Q LM75B MMA7660
Diff: FrdmK64f_Input.hpp
- Revision:
- 3:1ab88130bb9d
- Parent:
- 2:c871dc21467b
- Child:
- 4:50e2aefe516b
diff -r c871dc21467b -r 1ab88130bb9d FrdmK64f_Input.hpp --- 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