Rotary Encoder handling library for mbed
REnc.cpp@1:2732adb68dad, 2014-08-06 (annotated)
- 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?
User | Revision | Line number | New 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 | } |