IO is an event based input manager which permit to select which composents are manged on your system
Dependencies: C12832 FXOS8700Q LM75B MMA7660
FrdmK64f_AppShield_Input.hpp@4:50e2aefe516b, 2016-02-25 (annotated)
- Committer:
- co838_app56
- Date:
- Thu Feb 25 15:12:32 2016 +0000
- Revision:
- 4:50e2aefe516b
- Parent:
- 3:1ab88130bb9d
Fixing precision issue;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
co838_app56 | 0:2ac59c564ab0 | 1 | #pragma once |
co838_app56 | 0:2ac59c564ab0 | 2 | |
co838_app56 | 0:2ac59c564ab0 | 3 | #include "mbed.h" |
co838_app56 | 0:2ac59c564ab0 | 4 | #include "LM75B.h" |
co838_app56 | 0:2ac59c564ab0 | 5 | #include "MMA7660.h" |
co838_app56 | 0:2ac59c564ab0 | 6 | |
co838_app56 | 3:1ab88130bb9d | 7 | #include "Vector.h" |
co838_app56 | 0:2ac59c564ab0 | 8 | #include "Utils.h" |
co838_app56 | 0:2ac59c564ab0 | 9 | |
co838_app56 | 0:2ac59c564ab0 | 10 | template <class Parent> |
co838_app56 | 0:2ac59c564ab0 | 11 | class FrdmK64f_AppShield_Input : public Parent |
co838_app56 | 0:2ac59c564ab0 | 12 | { |
co838_app56 | 1:7be9a82f3ab8 | 13 | public: // List of manged Inputs |
co838_app56 | 1:7be9a82f3ab8 | 14 | |
co838_app56 | 1:7be9a82f3ab8 | 15 | enum IDBinaryInput |
co838_app56 | 1:7be9a82f3ab8 | 16 | { |
co838_app56 | 1:7be9a82f3ab8 | 17 | JoystickUp, |
co838_app56 | 1:7be9a82f3ab8 | 18 | JoystickDown, |
co838_app56 | 1:7be9a82f3ab8 | 19 | JoystickLeft, |
co838_app56 | 1:7be9a82f3ab8 | 20 | JoystickRight, |
co838_app56 | 1:7be9a82f3ab8 | 21 | JoystickMiddle, |
co838_app56 | 1:7be9a82f3ab8 | 22 | IDBinaryInput_MAX |
co838_app56 | 1:7be9a82f3ab8 | 23 | }; |
co838_app56 | 1:7be9a82f3ab8 | 24 | |
co838_app56 | 1:7be9a82f3ab8 | 25 | enum IDAnalogInput |
co838_app56 | 1:7be9a82f3ab8 | 26 | { |
co838_app56 | 1:7be9a82f3ab8 | 27 | PotLeft, |
co838_app56 | 1:7be9a82f3ab8 | 28 | PotRight, |
co838_app56 | 2:c871dc21467b | 29 | Temp, |
co838_app56 | 2:c871dc21467b | 30 | IDAnalogInput_MAX |
co838_app56 | 1:7be9a82f3ab8 | 31 | }; |
co838_app56 | 1:7be9a82f3ab8 | 32 | |
co838_app56 | 1:7be9a82f3ab8 | 33 | enum IDVectorInput |
co838_app56 | 1:7be9a82f3ab8 | 34 | { |
co838_app56 | 2:c871dc21467b | 35 | Accel, |
co838_app56 | 2:c871dc21467b | 36 | IDVectorInput_MAX |
co838_app56 | 1:7be9a82f3ab8 | 37 | }; |
co838_app56 | 1:7be9a82f3ab8 | 38 | |
co838_app56 | 1:7be9a82f3ab8 | 39 | private: |
co838_app56 | 1:7be9a82f3ab8 | 40 | |
co838_app56 | 0:2ac59c564ab0 | 41 | // Joystick |
co838_app56 | 0:2ac59c564ab0 | 42 | InterruptIn _joystickUp; |
co838_app56 | 0:2ac59c564ab0 | 43 | InterruptIn _joystickDown; |
co838_app56 | 0:2ac59c564ab0 | 44 | InterruptIn _joystickLeft; |
co838_app56 | 0:2ac59c564ab0 | 45 | InterruptIn _joystickRight; |
co838_app56 | 0:2ac59c564ab0 | 46 | InterruptIn _joystickMiddle; |
co838_app56 | 2:c871dc21467b | 47 | bool _binaryInputEnable[IDBinaryInput_MAX]; |
co838_app56 | 0:2ac59c564ab0 | 48 | |
co838_app56 | 0:2ac59c564ab0 | 49 | // Potentiometers |
co838_app56 | 0:2ac59c564ab0 | 50 | AnalogIn _potLeft; |
co838_app56 | 0:2ac59c564ab0 | 51 | AnalogIn _potRight; |
co838_app56 | 0:2ac59c564ab0 | 52 | float _potLeftValue; |
co838_app56 | 0:2ac59c564ab0 | 53 | float _potRightValue; |
co838_app56 | 0:2ac59c564ab0 | 54 | |
co838_app56 | 0:2ac59c564ab0 | 55 | // Tempeture sensor |
co838_app56 | 0:2ac59c564ab0 | 56 | LM75B _temp; |
co838_app56 | 0:2ac59c564ab0 | 57 | float _tempValue; |
co838_app56 | 0:2ac59c564ab0 | 58 | |
co838_app56 | 2:c871dc21467b | 59 | bool _analogInputEnable[IDAnalogInput_MAX]; |
co838_app56 | 3:1ab88130bb9d | 60 | float _analogInputPrec[IDAnalogInput_MAX]; |
co838_app56 | 2:c871dc21467b | 61 | |
co838_app56 | 0:2ac59c564ab0 | 62 | // Accelerometer |
co838_app56 | 0:2ac59c564ab0 | 63 | MMA7660 _accel; |
co838_app56 | 3:1ab88130bb9d | 64 | Vector _accelValue; |
co838_app56 | 2:c871dc21467b | 65 | bool _vectorInputEnable[IDVectorInput_MAX]; |
co838_app56 | 3:1ab88130bb9d | 66 | float _vectorInputPrec[IDVectorInput_MAX]; |
co838_app56 | 0:2ac59c564ab0 | 67 | |
co838_app56 | 0:2ac59c564ab0 | 68 | public: |
co838_app56 | 0:2ac59c564ab0 | 69 | |
co838_app56 | 0:2ac59c564ab0 | 70 | FrdmK64f_AppShield_Input(void) |
co838_app56 | 0:2ac59c564ab0 | 71 | : _joystickUp(A2), _joystickDown(A3), _joystickLeft(A4), _joystickRight(A5), _joystickMiddle(D4), |
co838_app56 | 3:1ab88130bb9d | 72 | _potLeft(A0), _potRight(A1), _potLeftValue(0.0f), _potRightValue(0.0f), |
co838_app56 | 3:1ab88130bb9d | 73 | _temp(D14, D15), _tempValue(0.0f), |
co838_app56 | 3:1ab88130bb9d | 74 | _accel(I2C_SDA, I2C_SCL) |
co838_app56 | 0:2ac59c564ab0 | 75 | { |
co838_app56 | 2:c871dc21467b | 76 | memset(_binaryInputEnable, 1, sizeof(_binaryInputEnable)); |
co838_app56 | 3:1ab88130bb9d | 77 | memset(_analogInputEnable, 0, sizeof(_analogInputEnable)); |
co838_app56 | 3:1ab88130bb9d | 78 | memset(_vectorInputEnable, 0, sizeof(_vectorInputEnable)); |
co838_app56 | 3:1ab88130bb9d | 79 | |
co838_app56 | 3:1ab88130bb9d | 80 | for (int it = 0; it < IDAnalogInput_MAX; ++it) _analogInputPrec[it] = 100.0f; |
co838_app56 | 3:1ab88130bb9d | 81 | for (int it = 0; it < IDVectorInput_MAX; ++it) _vectorInputPrec[it] = 10.0f; |
co838_app56 | 1:7be9a82f3ab8 | 82 | |
co838_app56 | 0:2ac59c564ab0 | 83 | _joystickUp.rise(this, &FrdmK64f_AppShield_Input::onJoystickUpRise); |
co838_app56 | 0:2ac59c564ab0 | 84 | _joystickUp.fall(this, &FrdmK64f_AppShield_Input::onJoystickUpFall); |
co838_app56 | 0:2ac59c564ab0 | 85 | _joystickDown.rise(this, &FrdmK64f_AppShield_Input::onJoystickDownRise); |
co838_app56 | 0:2ac59c564ab0 | 86 | _joystickDown.fall(this, &FrdmK64f_AppShield_Input::onJoystickDownFall); |
co838_app56 | 0:2ac59c564ab0 | 87 | _joystickLeft.rise(this, &FrdmK64f_AppShield_Input::onJoystickLeftRise); |
co838_app56 | 0:2ac59c564ab0 | 88 | _joystickLeft.fall(this, &FrdmK64f_AppShield_Input::onJoystickLeftFall); |
co838_app56 | 0:2ac59c564ab0 | 89 | _joystickRight.rise(this, &FrdmK64f_AppShield_Input::onJoystickRightRise); |
co838_app56 | 0:2ac59c564ab0 | 90 | _joystickRight.fall(this, &FrdmK64f_AppShield_Input::onJoystickRightFall); |
co838_app56 | 0:2ac59c564ab0 | 91 | _joystickMiddle.rise(this, &FrdmK64f_AppShield_Input::onJoystickMiddleRise); |
co838_app56 | 0:2ac59c564ab0 | 92 | _joystickMiddle.fall(this, &FrdmK64f_AppShield_Input::onJoystickMiddleFall); |
co838_app56 | 0:2ac59c564ab0 | 93 | |
co838_app56 | 3:1ab88130bb9d | 94 | _potLeftValue = prec(_potLeft, _analogInputPrec[PotLeft]); |
co838_app56 | 3:1ab88130bb9d | 95 | _potRightValue = prec(_potRight, _analogInputPrec[PotRight]); |
co838_app56 | 3:1ab88130bb9d | 96 | _tempValue = prec(_temp.read(), _analogInputPrec[Temp]); |
co838_app56 | 0:2ac59c564ab0 | 97 | } |
co838_app56 | 0:2ac59c564ab0 | 98 | |
co838_app56 | 1:7be9a82f3ab8 | 99 | using Parent::setEnable; |
co838_app56 | 2:c871dc21467b | 100 | void setEnable(FrdmK64f_AppShield_Input::IDBinaryInput inp, bool act) { _binaryInputEnable[inp] = act; } |
co838_app56 | 2:c871dc21467b | 101 | void setEnable(FrdmK64f_AppShield_Input::IDAnalogInput inp, bool act) { _analogInputEnable[inp] = act; } |
co838_app56 | 2:c871dc21467b | 102 | void setEnable(FrdmK64f_AppShield_Input::IDVectorInput inp, bool act) { _vectorInputEnable[inp] = act; } |
co838_app56 | 1:7be9a82f3ab8 | 103 | |
co838_app56 | 3:1ab88130bb9d | 104 | using Parent::setPrecision; |
co838_app56 | 4:50e2aefe516b | 105 | void setPrecision(FrdmK64f_AppShield_Input::IDAnalogInput inp, float prec) { _analogInputPrec[inp] = pow(10.0f, prec); } |
co838_app56 | 4:50e2aefe516b | 106 | void setPrecision(FrdmK64f_AppShield_Input::IDVectorInput inp, float prec) { _vectorInputPrec[inp] = pow(10.0f, prec); } |
co838_app56 | 0:2ac59c564ab0 | 107 | |
co838_app56 | 0:2ac59c564ab0 | 108 | // Not interresting section (do not use those methods) |
co838_app56 | 0:2ac59c564ab0 | 109 | // Callbacks for joystick |
co838_app56 | 2:c871dc21467b | 110 | void onJoystickUpRise(void) { if (_binaryInputEnable[JoystickUp]) Parent::_events.push(Event(Event::AppShield, Event::BinaryInput, JoystickUp, Event::Rise)); } |
co838_app56 | 2:c871dc21467b | 111 | void onJoystickUpFall(void) { if (_binaryInputEnable[JoystickUp]) Parent::_events.push(Event(Event::AppShield, Event::BinaryInput, JoystickUp, Event::Fall)); } |
co838_app56 | 2:c871dc21467b | 112 | void onJoystickDownRise(void) { if (_binaryInputEnable[JoystickDown]) Parent::_events.push(Event(Event::AppShield, Event::BinaryInput, JoystickDown, Event::Rise)); } |
co838_app56 | 2:c871dc21467b | 113 | void onJoystickDownFall(void) { if (_binaryInputEnable[JoystickDown]) Parent::_events.push(Event(Event::AppShield, Event::BinaryInput, JoystickDown, Event::Fall)); } |
co838_app56 | 2:c871dc21467b | 114 | void onJoystickLeftRise(void) { if (_binaryInputEnable[JoystickLeft]) Parent::_events.push(Event(Event::AppShield, Event::BinaryInput, JoystickLeft, Event::Rise)); } |
co838_app56 | 2:c871dc21467b | 115 | void onJoystickLeftFall(void) { if (_binaryInputEnable[JoystickLeft]) Parent::_events.push(Event(Event::AppShield, Event::BinaryInput, JoystickLeft, Event::Fall)); } |
co838_app56 | 2:c871dc21467b | 116 | void onJoystickRightRise(void) { if (_binaryInputEnable[JoystickRight]) Parent::_events.push(Event(Event::AppShield, Event::BinaryInput, JoystickRight, Event::Rise)); } |
co838_app56 | 2:c871dc21467b | 117 | void onJoystickRightFall(void) { if (_binaryInputEnable[JoystickRight]) Parent::_events.push(Event(Event::AppShield, Event::BinaryInput, JoystickRight, Event::Fall)); } |
co838_app56 | 2:c871dc21467b | 118 | void onJoystickMiddleRise(void) { if (_binaryInputEnable[JoystickMiddle]) Parent::_events.push(Event(Event::AppShield, Event::BinaryInput, JoystickMiddle, Event::Rise)); } |
co838_app56 | 2:c871dc21467b | 119 | void onJoystickMiddleFall(void) { if (_binaryInputEnable[JoystickMiddle]) Parent::_events.push(Event(Event::AppShield, Event::BinaryInput, JoystickMiddle, Event::Fall)); } |
co838_app56 | 0:2ac59c564ab0 | 120 | |
co838_app56 | 0:2ac59c564ab0 | 121 | // Callback for others sensors |
co838_app56 | 3:1ab88130bb9d | 122 | virtual void checkAnalog(void) |
co838_app56 | 0:2ac59c564ab0 | 123 | { |
co838_app56 | 3:1ab88130bb9d | 124 | Parent::checkAnalog(); |
co838_app56 | 2:c871dc21467b | 125 | |
co838_app56 | 2:c871dc21467b | 126 | if(_analogInputEnable[PotLeft]) |
co838_app56 | 0:2ac59c564ab0 | 127 | { |
co838_app56 | 3:1ab88130bb9d | 128 | Event event(Event::AppShield, Event::AnalogInput, PotLeft, prec(_potLeft, _analogInputPrec[PotLeft])); |
co838_app56 | 0:2ac59c564ab0 | 129 | if (event.analog != _potLeftValue) |
co838_app56 | 0:2ac59c564ab0 | 130 | { |
co838_app56 | 0:2ac59c564ab0 | 131 | _potLeftValue = event.analog; |
co838_app56 | 0:2ac59c564ab0 | 132 | Parent::_events.push(event); |
co838_app56 | 0:2ac59c564ab0 | 133 | } |
co838_app56 | 0:2ac59c564ab0 | 134 | } |
co838_app56 | 2:c871dc21467b | 135 | |
co838_app56 | 2:c871dc21467b | 136 | if(_analogInputEnable[PotRight]) |
co838_app56 | 0:2ac59c564ab0 | 137 | { |
co838_app56 | 3:1ab88130bb9d | 138 | Event event(Event::AppShield, Event::AnalogInput, PotRight, prec(_potRight, _analogInputPrec[PotRight])); |
co838_app56 | 0:2ac59c564ab0 | 139 | if (event.analog != _potRightValue) |
co838_app56 | 0:2ac59c564ab0 | 140 | { |
co838_app56 | 0:2ac59c564ab0 | 141 | _potRightValue = event.analog; |
co838_app56 | 0:2ac59c564ab0 | 142 | Parent::_events.push(event); |
co838_app56 | 0:2ac59c564ab0 | 143 | } |
co838_app56 | 0:2ac59c564ab0 | 144 | } |
co838_app56 | 2:c871dc21467b | 145 | |
co838_app56 | 2:c871dc21467b | 146 | if(_analogInputEnable[Temp]) |
co838_app56 | 0:2ac59c564ab0 | 147 | { |
co838_app56 | 3:1ab88130bb9d | 148 | Event event(Event::AppShield, Event::AnalogInput, Temp, prec(_temp.read(), _analogInputPrec[Temp])); |
co838_app56 | 0:2ac59c564ab0 | 149 | if (event.analog != _tempValue) |
co838_app56 | 0:2ac59c564ab0 | 150 | { |
co838_app56 | 0:2ac59c564ab0 | 151 | _tempValue = event.analog; |
co838_app56 | 0:2ac59c564ab0 | 152 | Parent::_events.push(event); |
co838_app56 | 0:2ac59c564ab0 | 153 | } |
co838_app56 | 0:2ac59c564ab0 | 154 | } |
co838_app56 | 3:1ab88130bb9d | 155 | } |
co838_app56 | 3:1ab88130bb9d | 156 | |
co838_app56 | 3:1ab88130bb9d | 157 | void checkVector(void) |
co838_app56 | 3:1ab88130bb9d | 158 | { |
co838_app56 | 3:1ab88130bb9d | 159 | Parent::checkVector(); |
co838_app56 | 2:c871dc21467b | 160 | |
co838_app56 | 2:c871dc21467b | 161 | if(_vectorInputEnable[Accel]) |
co838_app56 | 0:2ac59c564ab0 | 162 | { |
co838_app56 | 3:1ab88130bb9d | 163 | Event event(Event::AppShield, Event::VectorInput, Accel, Vector(prec(_accel.x(), _analogInputPrec[Accel]), prec(_accel.y(), _analogInputPrec[Accel]), prec(_accel.z(), _analogInputPrec[Accel]))); |
co838_app56 | 3:1ab88130bb9d | 164 | if (!(event.vector.eq(_accelValue, 1.0f / _analogInputPrec[Accel]))) |
co838_app56 | 0:2ac59c564ab0 | 165 | { |
co838_app56 | 0:2ac59c564ab0 | 166 | _accelValue = event.vector; |
co838_app56 | 0:2ac59c564ab0 | 167 | Parent::_events.push(event); |
co838_app56 | 0:2ac59c564ab0 | 168 | } |
co838_app56 | 0:2ac59c564ab0 | 169 | } |
co838_app56 | 0:2ac59c564ab0 | 170 | } |
co838_app56 | 0:2ac59c564ab0 | 171 | }; |