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_AppShield_Input.hpp
- 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