Chris Styles
/
EA_RotaryEncoder
This example positions a lit LED in the I2C LED array using the rotary encoder
RotaryEncode.cpp@0:498b9b4a7bb9, 2010-03-02 (annotated)
- Committer:
- chris
- Date:
- Tue Mar 02 08:27:23 2010 +0000
- Revision:
- 0:498b9b4a7bb9
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
chris | 0:498b9b4a7bb9 | 1 | /* |
chris | 0:498b9b4a7bb9 | 2 | RotaryEncode |
chris | 0:498b9b4a7bb9 | 3 | (c) 2009, cstyles |
chris | 0:498b9b4a7bb9 | 4 | */ |
chris | 0:498b9b4a7bb9 | 5 | |
chris | 0:498b9b4a7bb9 | 6 | #include "RotaryEncode.h" |
chris | 0:498b9b4a7bb9 | 7 | #include "mbed.h" |
chris | 0:498b9b4a7bb9 | 8 | |
chris | 0:498b9b4a7bb9 | 9 | /* |
chris | 0:498b9b4a7bb9 | 10 | Constructor, pin names for I2C and the I2C addrss of the device |
chris | 0:498b9b4a7bb9 | 11 | */ |
chris | 0:498b9b4a7bb9 | 12 | |
chris | 0:498b9b4a7bb9 | 13 | |
chris | 0:498b9b4a7bb9 | 14 | RotaryEncode::RotaryEncode(PinName A, PinName B) |
chris | 0:498b9b4a7bb9 | 15 | : _rotary_in(A,B) { |
chris | 0:498b9b4a7bb9 | 16 | |
chris | 0:498b9b4a7bb9 | 17 | _position = 0; |
chris | 0:498b9b4a7bb9 | 18 | |
chris | 0:498b9b4a7bb9 | 19 | // Attach ticker |
chris | 0:498b9b4a7bb9 | 20 | _ticker.attach(this, &RotaryEncode::_ticker_handler, 0.010); |
chris | 0:498b9b4a7bb9 | 21 | } |
chris | 0:498b9b4a7bb9 | 22 | |
chris | 0:498b9b4a7bb9 | 23 | |
chris | 0:498b9b4a7bb9 | 24 | |
chris | 0:498b9b4a7bb9 | 25 | int RotaryEncode::read(void) { |
chris | 0:498b9b4a7bb9 | 26 | int rval = _position; |
chris | 0:498b9b4a7bb9 | 27 | _position = 0; |
chris | 0:498b9b4a7bb9 | 28 | return (rval); |
chris | 0:498b9b4a7bb9 | 29 | } |
chris | 0:498b9b4a7bb9 | 30 | |
chris | 0:498b9b4a7bb9 | 31 | |
chris | 0:498b9b4a7bb9 | 32 | |
chris | 0:498b9b4a7bb9 | 33 | |
chris | 0:498b9b4a7bb9 | 34 | void RotaryEncode::_ticker_handler(void) { |
chris | 0:498b9b4a7bb9 | 35 | |
chris | 0:498b9b4a7bb9 | 36 | _state = _rotary_in; |
chris | 0:498b9b4a7bb9 | 37 | _e = R_W; |
chris | 0:498b9b4a7bb9 | 38 | |
chris | 0:498b9b4a7bb9 | 39 | // we're in the no-change state |
chris | 0:498b9b4a7bb9 | 40 | if (_state == 0x03) { |
chris | 0:498b9b4a7bb9 | 41 | return; |
chris | 0:498b9b4a7bb9 | 42 | } |
chris | 0:498b9b4a7bb9 | 43 | |
chris | 0:498b9b4a7bb9 | 44 | while (_state != 0x03) { |
chris | 0:498b9b4a7bb9 | 45 | switch (_e) { |
chris | 0:498b9b4a7bb9 | 46 | case R_W: |
chris | 0:498b9b4a7bb9 | 47 | if (_state == 0x02) |
chris | 0:498b9b4a7bb9 | 48 | _e = R_R1; |
chris | 0:498b9b4a7bb9 | 49 | else if (_state == 0x01) |
chris | 0:498b9b4a7bb9 | 50 | _e = R_L1; |
chris | 0:498b9b4a7bb9 | 51 | break; |
chris | 0:498b9b4a7bb9 | 52 | |
chris | 0:498b9b4a7bb9 | 53 | case R_L1: |
chris | 0:498b9b4a7bb9 | 54 | if (_state == 0x00) |
chris | 0:498b9b4a7bb9 | 55 | _e = R_R2; |
chris | 0:498b9b4a7bb9 | 56 | break; |
chris | 0:498b9b4a7bb9 | 57 | case R_L2: |
chris | 0:498b9b4a7bb9 | 58 | if (_state == 0x01) { |
chris | 0:498b9b4a7bb9 | 59 | _e = R_R3; |
chris | 0:498b9b4a7bb9 | 60 | _position++; |
chris | 0:498b9b4a7bb9 | 61 | } |
chris | 0:498b9b4a7bb9 | 62 | break; |
chris | 0:498b9b4a7bb9 | 63 | case R_R1: |
chris | 0:498b9b4a7bb9 | 64 | if (_state == 0x00) |
chris | 0:498b9b4a7bb9 | 65 | _e = R_L2; |
chris | 0:498b9b4a7bb9 | 66 | break; |
chris | 0:498b9b4a7bb9 | 67 | case R_R2: |
chris | 0:498b9b4a7bb9 | 68 | if (_state == 0x02) { |
chris | 0:498b9b4a7bb9 | 69 | _e = R_L3; |
chris | 0:498b9b4a7bb9 | 70 | _position--; |
chris | 0:498b9b4a7bb9 | 71 | } |
chris | 0:498b9b4a7bb9 | 72 | break; |
chris | 0:498b9b4a7bb9 | 73 | } |
chris | 0:498b9b4a7bb9 | 74 | _state = _rotary_in; |
chris | 0:498b9b4a7bb9 | 75 | } |
chris | 0:498b9b4a7bb9 | 76 | |
chris | 0:498b9b4a7bb9 | 77 | } |
chris | 0:498b9b4a7bb9 | 78 | |
chris | 0:498b9b4a7bb9 | 79 | |
chris | 0:498b9b4a7bb9 | 80 | |
chris | 0:498b9b4a7bb9 | 81 |