Rotary Encoder handling library for mbed

Dependents:   MIDI_CW Gemphet8

Committer:
ChuckTimber
Date:
Wed Aug 06 06:35:47 2014 +0000
Revision:
1:2732adb68dad
Parent:
0:c905f9e6866f
Child:
2:46173a05338e
Fixed description, added delayed on functionality.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ChuckTimber 0:c905f9e6866f 1 #include "REnc.h"
ChuckTimber 0:c905f9e6866f 2 #include "mbed.h"
ChuckTimber 0:c905f9e6866f 3
ChuckTimber 0:c905f9e6866f 4 /** class to make sound with a buzzer, based on a PwmOut
ChuckTimber 0:c905f9e6866f 5 * The class use a timeout to switch off the sound - it is not blocking while making noise
ChuckTimber 0:c905f9e6866f 6 *
ChuckTimber 0:c905f9e6866f 7 * Example:
ChuckTimber 0:c905f9e6866f 8 * @code
ChuckTimber 1:2732adb68dad 9 * // REnc sample
ChuckTimber 1:2732adb68dad 10 * #include "mbed.h"
ChuckTimber 1:2732adb68dad 11 * #include "REnc.h"
ChuckTimber 1:2732adb68dad 12 * void proc_REnc_right(void);
ChuckTimber 1:2732adb68dad 13 * void proc_REnc_left(void);
ChuckTimber 1:2732adb68dad 14 *
ChuckTimber 1:2732adb68dad 15 * // void proc_REnc_right(void) { }
ChuckTimber 1:2732adb68dad 16 * // void proc_REnc_left(void) { }
ChuckTimber 1:2732adb68dad 17 *
ChuckTimber 1:2732adb68dad 18 * REnc renc(dp1, dp2);
ChuckTimber 1:2732adb68dad 19 *
ChuckTimber 1:2732adb68dad 20 * int main()
ChuckTimber 1:2732adb68dad 21 * {
ChuckTimber 1:2732adb68dad 22 *
ChuckTimber 1:2732adb68dad 23 * // renc.setHandleRight(&proc_REnc_right);
ChuckTimber 1:2732adb68dad 24 * // renc.setHandleLeft(&proc_REnc_left);
ChuckTimber 1:2732adb68dad 25 *
ChuckTimber 1:2732adb68dad 26 * while(1) {
ChuckTimber 1:2732adb68dad 27 * if (renc.CMD == FORWARD) {
ChuckTimber 1:2732adb68dad 28 * proc_REnc_right();
ChuckTimber 1:2732adb68dad 29 * renc.CMD = STOP;
ChuckTimber 1:2732adb68dad 30 * } else if (renc.CMD == REVERSE) {
ChuckTimber 1:2732adb68dad 31 * proc_REnc_left();
ChuckTimber 1:2732adb68dad 32 * renc.CMD = STOP;
ChuckTimber 1:2732adb68dad 33 * }
ChuckTimber 1:2732adb68dad 34 * }
ChuckTimber 1:2732adb68dad 35 * }
ChuckTimber 0:c905f9e6866f 36 * @endcode
ChuckTimber 0:c905f9e6866f 37 */
ChuckTimber 0:c905f9e6866f 38
ChuckTimber 0:c905f9e6866f 39 using namespace mbed;
ChuckTimber 0:c905f9e6866f 40
ChuckTimber 1:2732adb68dad 41 // private function
ChuckTimber 1:2732adb68dad 42 /** sample_encoder input and process
ChuckTimber 1:2732adb68dad 43 *
ChuckTimber 1:2732adb68dad 44 */
ChuckTimber 0:c905f9e6866f 45 void REnc::sample_encoder(void)
ChuckTimber 0:c905f9e6866f 46 {
ChuckTimber 0:c905f9e6866f 47 static unsigned char i;
ChuckTimber 1:2732adb68dad 48 static unsigned int cnt;
ChuckTimber 1:2732adb68dad 49
ChuckTimber 0:c905f9e6866f 50 i = (i << 2) + ((~_pinb & 0x01)<< 1) + (~_pina & 0x1);
ChuckTimber 0:c905f9e6866f 51 i &= 0xf;
ChuckTimber 0:c905f9e6866f 52
ChuckTimber 0:c905f9e6866f 53 switch (i) {
ChuckTimber 0:c905f9e6866f 54 case 0x7:
ChuckTimber 0:c905f9e6866f 55 case 0xe:
ChuckTimber 0:c905f9e6866f 56 CMD = FORWARD;
ChuckTimber 1:2732adb68dad 57 cnt = 300;
ChuckTimber 1:2732adb68dad 58 STABLE = 0;
ChuckTimber 1:2732adb68dad 59 if (mRightCallback != NULL) { mRightCallback(); CMD = STOP; }
ChuckTimber 0:c905f9e6866f 60 break;
ChuckTimber 0:c905f9e6866f 61 case 0xb:
ChuckTimber 0:c905f9e6866f 62 case 0xd:
ChuckTimber 1:2732adb68dad 63 CMD = REVERSE;
ChuckTimber 1:2732adb68dad 64 cnt = 300;
ChuckTimber 1:2732adb68dad 65 STABLE = 0;
ChuckTimber 1:2732adb68dad 66 if (mLeftCallback != NULL) { mLeftCallback(); CMD = STOP; }
ChuckTimber 0:c905f9e6866f 67 break;
ChuckTimber 0:c905f9e6866f 68 default:
ChuckTimber 1:2732adb68dad 69 CMD = STOP;
ChuckTimber 1:2732adb68dad 70 if (cnt)
ChuckTimber 1:2732adb68dad 71 cnt--;
ChuckTimber 1:2732adb68dad 72 else
ChuckTimber 1:2732adb68dad 73 STABLE = 1;
ChuckTimber 0:c905f9e6866f 74 }
ChuckTimber 0:c905f9e6866f 75 }
ChuckTimber 0:c905f9e6866f 76
ChuckTimber 0:c905f9e6866f 77 void REnc::setHandleRight(void (*fptr)(void)) { mRightCallback = fptr; }
ChuckTimber 0:c905f9e6866f 78 void REnc::setHandleLeft(void (*fptr)(void)) { mLeftCallback = fptr; }
ChuckTimber 0:c905f9e6866f 79
ChuckTimber 1:2732adb68dad 80 // constructor
ChuckTimber 1:2732adb68dad 81 /** Create an REnc object connected to DigitalIn pins
ChuckTimber 1:2732adb68dad 82 *
ChuckTimber 1:2732adb68dad 83 * @param pina - Digital Input to A-phase of the rotary encoder
ChuckTimber 1:2732adb68dad 84 * @param pinb - Digital Input to B-phase of the rotary encoder
ChuckTimber 1:2732adb68dad 85 */
ChuckTimber 0:c905f9e6866f 86 REnc::REnc(PinName pina, PinName pinb) : _pina(pina), _pinb(pinb)
ChuckTimber 0:c905f9e6866f 87 {
ChuckTimber 1:2732adb68dad 88 CMD = STOP;
ChuckTimber 0:c905f9e6866f 89 mRightCallback = NULL;
ChuckTimber 0:c905f9e6866f 90 mLeftCallback = NULL;
ChuckTimber 1:2732adb68dad 91 _tick.attach(this, &REnc::sample_encoder, 0.002);
ChuckTimber 0:c905f9e6866f 92 }