Alison Bartsch / Mbed 2 deprecated FreeFlyerROS

Dependencies:   mbed ros_lib_kinetic

Committer:
alisonsb
Date:
Wed Nov 13 02:47:08 2019 +0000
Revision:
7:1be54ceadd53
Parent:
4:cae255669971
meep test

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Knillinux 1:40bdbe1a93b7 1 /**
Knillinux 1:40bdbe1a93b7 2 * @author Aaron Berk
Knillinux 1:40bdbe1a93b7 3 *
Knillinux 1:40bdbe1a93b7 4 * @section LICENSE
Knillinux 1:40bdbe1a93b7 5 *
Knillinux 1:40bdbe1a93b7 6 * Copyright (c) 2010 ARM Limited
Knillinux 1:40bdbe1a93b7 7 *
Knillinux 1:40bdbe1a93b7 8 * Permission is hereby granted, free of charge, to any person obtaining a copy
Knillinux 1:40bdbe1a93b7 9 * of this software and associated documentation files (the "Software"), to deal
Knillinux 1:40bdbe1a93b7 10 * in the Software without restriction, including without limitation the rights
Knillinux 1:40bdbe1a93b7 11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
Knillinux 1:40bdbe1a93b7 12 * copies of the Software, and to permit persons to whom the Software is
Knillinux 1:40bdbe1a93b7 13 * furnished to do so, subject to the following conditions:
Knillinux 1:40bdbe1a93b7 14 *
Knillinux 1:40bdbe1a93b7 15 * The above copyright notice and this permission notice shall be included in
Knillinux 1:40bdbe1a93b7 16 * all copies or substantial portions of the Software.
Knillinux 1:40bdbe1a93b7 17 *
Knillinux 1:40bdbe1a93b7 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Knillinux 1:40bdbe1a93b7 19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Knillinux 1:40bdbe1a93b7 20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
Knillinux 1:40bdbe1a93b7 21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
Knillinux 1:40bdbe1a93b7 22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
Knillinux 1:40bdbe1a93b7 23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
Knillinux 1:40bdbe1a93b7 24 * THE SOFTWARE.
Knillinux 1:40bdbe1a93b7 25 *
Knillinux 1:40bdbe1a93b7 26 * @section DESCRIPTION
Knillinux 1:40bdbe1a93b7 27 *
Knillinux 1:40bdbe1a93b7 28 * Quadrature Encoder Interface.
Knillinux 1:40bdbe1a93b7 29 *
Knillinux 1:40bdbe1a93b7 30 * A quadrature encoder consists of two code tracks on a disc which are 90
Knillinux 1:40bdbe1a93b7 31 * degrees out of phase. It can be used to determine how far a wheel has
Knillinux 1:40bdbe1a93b7 32 * rotated, relative to a known starting position.
Knillinux 1:40bdbe1a93b7 33 *
Knillinux 1:40bdbe1a93b7 34 * Only one code track changes at a time leading to a more robust system than
Knillinux 1:40bdbe1a93b7 35 * a single track, because any jitter around any edge won't cause a state
Knillinux 1:40bdbe1a93b7 36 * change as the other track will remain constant.
Knillinux 1:40bdbe1a93b7 37 *
Knillinux 1:40bdbe1a93b7 38 * Encoders can be a homebrew affair, consisting of infrared emitters/receivers
Knillinux 1:40bdbe1a93b7 39 * and paper code tracks consisting of alternating black and white sections;
Knillinux 1:40bdbe1a93b7 40 * alternatively, complete disk and PCB emitter/receiver encoder systems can
Knillinux 1:40bdbe1a93b7 41 * be bought, but the interface, regardless of implementation is the same.
Knillinux 1:40bdbe1a93b7 42 *
Knillinux 1:40bdbe1a93b7 43 * +-----+ +-----+ +-----+
Knillinux 1:40bdbe1a93b7 44 * Channel A | ^ | | | | |
Knillinux 1:40bdbe1a93b7 45 * ---+ ^ +-----+ +-----+ +-----
Knillinux 1:40bdbe1a93b7 46 * ^ ^
Knillinux 1:40bdbe1a93b7 47 * ^ +-----+ +-----+ +-----+
Knillinux 1:40bdbe1a93b7 48 * Channel B ^ | | | | | |
Knillinux 1:40bdbe1a93b7 49 * ------+ +-----+ +-----+ +-----
Knillinux 1:40bdbe1a93b7 50 * ^ ^
Knillinux 1:40bdbe1a93b7 51 * ^ ^
Knillinux 1:40bdbe1a93b7 52 * 90deg
Knillinux 1:40bdbe1a93b7 53 *
Knillinux 1:40bdbe1a93b7 54 * The interface uses X2 encoding by default which calculates the pulse count
Knillinux 1:40bdbe1a93b7 55 * based on reading the current state after each rising and falling edge of
Knillinux 1:40bdbe1a93b7 56 * channel A.
Knillinux 1:40bdbe1a93b7 57 *
Knillinux 1:40bdbe1a93b7 58 * +-----+ +-----+ +-----+
Knillinux 1:40bdbe1a93b7 59 * Channel A | | | | | |
Knillinux 1:40bdbe1a93b7 60 * ---+ +-----+ +-----+ +-----
Knillinux 1:40bdbe1a93b7 61 * ^ ^ ^ ^ ^
Knillinux 1:40bdbe1a93b7 62 * ^ +-----+ ^ +-----+ ^ +-----+
Knillinux 1:40bdbe1a93b7 63 * Channel B ^ | ^ | ^ | ^ | ^ | |
Knillinux 1:40bdbe1a93b7 64 * ------+ ^ +-----+ ^ +-----+ +--
Knillinux 1:40bdbe1a93b7 65 * ^ ^ ^ ^ ^
Knillinux 1:40bdbe1a93b7 66 * ^ ^ ^ ^ ^
Knillinux 1:40bdbe1a93b7 67 * Pulse count 0 1 2 3 4 5 ...
Knillinux 1:40bdbe1a93b7 68 *
Knillinux 1:40bdbe1a93b7 69 * This interface can also use X4 encoding which calculates the pulse count
Knillinux 1:40bdbe1a93b7 70 * based on reading the current state after each rising and falling edge of
Knillinux 1:40bdbe1a93b7 71 * either channel.
Knillinux 1:40bdbe1a93b7 72 *
Knillinux 1:40bdbe1a93b7 73 * +-----+ +-----+ +-----+
Knillinux 1:40bdbe1a93b7 74 * Channel A | | | | | |
Knillinux 1:40bdbe1a93b7 75 * ---+ +-----+ +-----+ +-----
Knillinux 1:40bdbe1a93b7 76 * ^ ^ ^ ^ ^
Knillinux 1:40bdbe1a93b7 77 * ^ +-----+ ^ +-----+ ^ +-----+
Knillinux 1:40bdbe1a93b7 78 * Channel B ^ | ^ | ^ | ^ | ^ | |
Knillinux 1:40bdbe1a93b7 79 * ------+ ^ +-----+ ^ +-----+ +--
Knillinux 1:40bdbe1a93b7 80 * ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
Knillinux 1:40bdbe1a93b7 81 * ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
Knillinux 1:40bdbe1a93b7 82 * Pulse count 0 1 2 3 4 5 6 7 8 9 ...
Knillinux 1:40bdbe1a93b7 83 *
Knillinux 1:40bdbe1a93b7 84 * It defaults
Knillinux 1:40bdbe1a93b7 85 *
Knillinux 1:40bdbe1a93b7 86 * An optional index channel can be used which determines when a full
Knillinux 1:40bdbe1a93b7 87 * revolution has occured.
Knillinux 1:40bdbe1a93b7 88 *
Knillinux 1:40bdbe1a93b7 89 * If a 4 pules per revolution encoder was used, with X4 encoding,
Knillinux 1:40bdbe1a93b7 90 * the following would be observed.
Knillinux 1:40bdbe1a93b7 91 *
Knillinux 1:40bdbe1a93b7 92 * +-----+ +-----+ +-----+
Knillinux 1:40bdbe1a93b7 93 * Channel A | | | | | |
Knillinux 1:40bdbe1a93b7 94 * ---+ +-----+ +-----+ +-----
Knillinux 1:40bdbe1a93b7 95 * ^ ^ ^ ^ ^
Knillinux 1:40bdbe1a93b7 96 * ^ +-----+ ^ +-----+ ^ +-----+
Knillinux 1:40bdbe1a93b7 97 * Channel B ^ | ^ | ^ | ^ | ^ | |
Knillinux 1:40bdbe1a93b7 98 * ------+ ^ +-----+ ^ +-----+ +--
Knillinux 1:40bdbe1a93b7 99 * ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
Knillinux 1:40bdbe1a93b7 100 * ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
Knillinux 1:40bdbe1a93b7 101 * ^ ^ ^ +--+ ^ ^ +--+ ^
Knillinux 1:40bdbe1a93b7 102 * ^ ^ ^ | | ^ ^ | | ^
Knillinux 1:40bdbe1a93b7 103 * Index ------------+ +--------+ +-----------
Knillinux 1:40bdbe1a93b7 104 * ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
Knillinux 1:40bdbe1a93b7 105 * Pulse count 0 1 2 3 4 5 6 7 8 9 ...
Knillinux 1:40bdbe1a93b7 106 * Rev. count 0 1 2
Knillinux 1:40bdbe1a93b7 107 *
Knillinux 1:40bdbe1a93b7 108 * Rotational position in degrees can be calculated by:
Knillinux 1:40bdbe1a93b7 109 *
Knillinux 1:40bdbe1a93b7 110 * (pulse count / X * N) * 360
Knillinux 1:40bdbe1a93b7 111 *
Knillinux 1:40bdbe1a93b7 112 * Where X is the encoding type [e.g. X4 encoding => X=4], and N is the number
Knillinux 1:40bdbe1a93b7 113 * of pulses per revolution.
Knillinux 1:40bdbe1a93b7 114 *
Knillinux 1:40bdbe1a93b7 115 * Linear position can be calculated by:
Knillinux 1:40bdbe1a93b7 116 *
Knillinux 1:40bdbe1a93b7 117 * (pulse count / X * N) * (1 / PPI)
Knillinux 1:40bdbe1a93b7 118 *
Knillinux 1:40bdbe1a93b7 119 * Where X is encoding type [e.g. X4 encoding => X=44], N is the number of
Knillinux 1:40bdbe1a93b7 120 * pulses per revolution, and PPI is pulses per inch, or the equivalent for
Knillinux 1:40bdbe1a93b7 121 * any other unit of displacement. PPI can be calculated by taking the
Knillinux 1:40bdbe1a93b7 122 * circumference of the wheel or encoder disk and dividing it by the number
Knillinux 1:40bdbe1a93b7 123 * of pulses per revolution.
Knillinux 1:40bdbe1a93b7 124 */
Knillinux 1:40bdbe1a93b7 125
Knillinux 1:40bdbe1a93b7 126 /**
Knillinux 1:40bdbe1a93b7 127 * Includes
Knillinux 1:40bdbe1a93b7 128 */
Knillinux 1:40bdbe1a93b7 129 #include "QEI.h"
Knillinux 1:40bdbe1a93b7 130
Knillinux 1:40bdbe1a93b7 131 QEI::QEI(PinName channelA,
Knillinux 1:40bdbe1a93b7 132 PinName channelB,
Knillinux 1:40bdbe1a93b7 133 PinName index,
Knillinux 1:40bdbe1a93b7 134 int pulsesPerRev,
Knillinux 1:40bdbe1a93b7 135 int pulsesPerSpeedMeas,
Knillinux 1:40bdbe1a93b7 136 Encoding encoding) : channelA_(channelA), channelB_(channelB),
Knillinux 1:40bdbe1a93b7 137 index_(index) {
Knillinux 1:40bdbe1a93b7 138
Knillinux 1:40bdbe1a93b7 139 pulses_ = 0;
Knillinux 1:40bdbe1a93b7 140 revolutions_ = 0;
Knillinux 1:40bdbe1a93b7 141 speed_ = 0;
Knillinux 1:40bdbe1a93b7 142 pulsesPerRev_ = pulsesPerRev;
Knillinux 1:40bdbe1a93b7 143 pulsesPerSpeedMeas_ = pulsesPerSpeedMeas;
Knillinux 1:40bdbe1a93b7 144 encoding_ = encoding;
Knillinux 1:40bdbe1a93b7 145
Knillinux 1:40bdbe1a93b7 146 //Workout what the current state is.
Knillinux 1:40bdbe1a93b7 147 int chanA = channelA_.read();
Knillinux 1:40bdbe1a93b7 148 int chanB = channelB_.read();
Knillinux 1:40bdbe1a93b7 149
Knillinux 1:40bdbe1a93b7 150 //2-bit state.
Knillinux 1:40bdbe1a93b7 151 currState_ = (chanA << 1) | (chanB);
Knillinux 1:40bdbe1a93b7 152 prevState_ = currState_;
Knillinux 1:40bdbe1a93b7 153
Knillinux 1:40bdbe1a93b7 154 timer.reset();
Knillinux 1:40bdbe1a93b7 155 timer.start();
Knillinux 1:40bdbe1a93b7 156
Knillinux 1:40bdbe1a93b7 157 //X2 encoding uses interrupts on only channel A.
Knillinux 1:40bdbe1a93b7 158 //X4 encoding uses interrupts on channel A,
Knillinux 1:40bdbe1a93b7 159 //and on channel B.
Knillinux 1:40bdbe1a93b7 160 channelA_.rise(this, &QEI::encode);
Knillinux 1:40bdbe1a93b7 161 channelA_.fall(this, &QEI::encode);
Knillinux 1:40bdbe1a93b7 162
Knillinux 1:40bdbe1a93b7 163 //If we're using X4 encoding, then attach interrupts to channel B too.
Knillinux 1:40bdbe1a93b7 164 if (encoding == X4_ENCODING) {
Knillinux 1:40bdbe1a93b7 165 channelB_.rise(this, &QEI::encode);
Knillinux 1:40bdbe1a93b7 166 channelB_.fall(this, &QEI::encode);
Knillinux 1:40bdbe1a93b7 167 }
Knillinux 1:40bdbe1a93b7 168 //Index is optional.
Knillinux 1:40bdbe1a93b7 169 if (index != NC) {
Knillinux 1:40bdbe1a93b7 170 index_.rise(this, &QEI::index);
Knillinux 1:40bdbe1a93b7 171 }
Knillinux 1:40bdbe1a93b7 172
Knillinux 1:40bdbe1a93b7 173 }
Knillinux 1:40bdbe1a93b7 174
Knillinux 1:40bdbe1a93b7 175 void QEI::reset(void) {
Knillinux 1:40bdbe1a93b7 176
Knillinux 1:40bdbe1a93b7 177 pulses_ = 0;
Knillinux 1:40bdbe1a93b7 178 revolutions_ = 0;
Knillinux 1:40bdbe1a93b7 179 timer.reset();
Knillinux 1:40bdbe1a93b7 180 timer.start();
Knillinux 1:40bdbe1a93b7 181 }
Knillinux 1:40bdbe1a93b7 182
Knillinux 1:40bdbe1a93b7 183 int QEI::getCurrentState(void) {
Knillinux 1:40bdbe1a93b7 184
Knillinux 1:40bdbe1a93b7 185 return currState_;
Knillinux 1:40bdbe1a93b7 186
Knillinux 1:40bdbe1a93b7 187 }
Knillinux 1:40bdbe1a93b7 188
Knillinux 1:40bdbe1a93b7 189 int QEI::getPulses(void) {
Knillinux 1:40bdbe1a93b7 190
Knillinux 1:40bdbe1a93b7 191 return pulses_;
Knillinux 1:40bdbe1a93b7 192
Knillinux 1:40bdbe1a93b7 193 }
Knillinux 1:40bdbe1a93b7 194
Knillinux 1:40bdbe1a93b7 195 float QEI::getSpeed(void) {
Knillinux 1:40bdbe1a93b7 196
Knillinux 1:40bdbe1a93b7 197 return speed_;
Knillinux 1:40bdbe1a93b7 198
Knillinux 1:40bdbe1a93b7 199 }
Knillinux 1:40bdbe1a93b7 200
Knillinux 1:40bdbe1a93b7 201 int QEI::getRevolutions(void) {
Knillinux 1:40bdbe1a93b7 202
Knillinux 1:40bdbe1a93b7 203 return revolutions_;
Knillinux 1:40bdbe1a93b7 204
Knillinux 1:40bdbe1a93b7 205 }
Knillinux 1:40bdbe1a93b7 206
Knillinux 1:40bdbe1a93b7 207 // +-------------+
Knillinux 1:40bdbe1a93b7 208 // | X2 Encoding |
Knillinux 1:40bdbe1a93b7 209 // +-------------+
Knillinux 1:40bdbe1a93b7 210 //
Knillinux 1:40bdbe1a93b7 211 // When observing states two patterns will appear:
Knillinux 1:40bdbe1a93b7 212 //
Knillinux 1:40bdbe1a93b7 213 // Counter clockwise rotation:
Knillinux 1:40bdbe1a93b7 214 //
Knillinux 1:40bdbe1a93b7 215 // 10 -> 01 -> 10 -> 01 -> ...
Knillinux 1:40bdbe1a93b7 216 //
Knillinux 1:40bdbe1a93b7 217 // Clockwise rotation:
Knillinux 1:40bdbe1a93b7 218 //
Knillinux 1:40bdbe1a93b7 219 // 11 -> 00 -> 11 -> 00 -> ...
Knillinux 1:40bdbe1a93b7 220 //
Knillinux 1:40bdbe1a93b7 221 // We consider counter clockwise rotation to be "forward" and
Knillinux 1:40bdbe1a93b7 222 // counter clockwise to be "backward". Therefore pulse count will increase
Knillinux 1:40bdbe1a93b7 223 // during counter clockwise rotation and decrease during clockwise rotation.
Knillinux 1:40bdbe1a93b7 224 //
Knillinux 1:40bdbe1a93b7 225 // +-------------+
Knillinux 1:40bdbe1a93b7 226 // | X4 Encoding |
Knillinux 1:40bdbe1a93b7 227 // +-------------+
Knillinux 1:40bdbe1a93b7 228 //
Knillinux 1:40bdbe1a93b7 229 // There are four possible states for a quadrature encoder which correspond to
Knillinux 1:40bdbe1a93b7 230 // 2-bit gray code.
Knillinux 1:40bdbe1a93b7 231 //
Knillinux 1:40bdbe1a93b7 232 // A state change is only valid if of only one bit has changed.
Knillinux 1:40bdbe1a93b7 233 // A state change is invalid if both bits have changed.
Knillinux 1:40bdbe1a93b7 234 //
Knillinux 1:40bdbe1a93b7 235 // Clockwise Rotation ->
Knillinux 1:40bdbe1a93b7 236 //
Knillinux 1:40bdbe1a93b7 237 // 00 01 11 10 00
Knillinux 1:40bdbe1a93b7 238 //
Knillinux 1:40bdbe1a93b7 239 // <- Counter Clockwise Rotation
Knillinux 1:40bdbe1a93b7 240 //
Knillinux 1:40bdbe1a93b7 241 // If we observe any valid state changes going from left to right, we have
Knillinux 1:40bdbe1a93b7 242 // moved one pulse clockwise [we will consider this "backward" or "negative"].
Knillinux 1:40bdbe1a93b7 243 //
Knillinux 1:40bdbe1a93b7 244 // If we observe any valid state changes going from right to left we have
Knillinux 1:40bdbe1a93b7 245 // moved one pulse counter clockwise [we will consider this "forward" or
Knillinux 1:40bdbe1a93b7 246 // "positive"].
Knillinux 1:40bdbe1a93b7 247 //
Knillinux 1:40bdbe1a93b7 248 // We might enter an invalid state for a number of reasons which are hard to
Knillinux 1:40bdbe1a93b7 249 // predict - if this is the case, it is generally safe to ignore it, update
Knillinux 1:40bdbe1a93b7 250 // the state and carry on, with the error correcting itself shortly after.
Knillinux 1:40bdbe1a93b7 251 void QEI::encode(void) {
Knillinux 1:40bdbe1a93b7 252
Knillinux 1:40bdbe1a93b7 253 int change = 0;
Knillinux 1:40bdbe1a93b7 254 int chanA = channelA_.read();
Knillinux 1:40bdbe1a93b7 255 int chanB = channelB_.read();
Knillinux 1:40bdbe1a93b7 256
Knillinux 1:40bdbe1a93b7 257 //2-bit state.
Knillinux 1:40bdbe1a93b7 258 currState_ = (chanA << 1) | (chanB);
Knillinux 1:40bdbe1a93b7 259
Knillinux 1:40bdbe1a93b7 260 if (encoding_ == X2_ENCODING) {
Knillinux 1:40bdbe1a93b7 261
Knillinux 1:40bdbe1a93b7 262 //11->00->11->00 is counter clockwise rotation or "forward".
Knillinux 1:40bdbe1a93b7 263 if ((prevState_ == 0x3 && currState_ == 0x0) ||
Knillinux 1:40bdbe1a93b7 264 (prevState_ == 0x0 && currState_ == 0x3)) {
Knillinux 1:40bdbe1a93b7 265
Knillinux 1:40bdbe1a93b7 266 pulses_++;
Knillinux 1:40bdbe1a93b7 267
Knillinux 1:40bdbe1a93b7 268 }
Knillinux 1:40bdbe1a93b7 269 //10->01->10->01 is clockwise rotation or "backward".
Knillinux 1:40bdbe1a93b7 270 else if ((prevState_ == 0x2 && currState_ == 0x1) ||
Knillinux 1:40bdbe1a93b7 271 (prevState_ == 0x1 && currState_ == 0x2)) {
Knillinux 1:40bdbe1a93b7 272
Knillinux 1:40bdbe1a93b7 273 pulses_--;
Knillinux 1:40bdbe1a93b7 274
Knillinux 1:40bdbe1a93b7 275 }
Knillinux 1:40bdbe1a93b7 276
Knillinux 1:40bdbe1a93b7 277 } else if (encoding_ == X4_ENCODING) {
Knillinux 1:40bdbe1a93b7 278
Knillinux 1:40bdbe1a93b7 279 //Entered a new valid state.
Knillinux 1:40bdbe1a93b7 280 if (((currState_ ^ prevState_) != INVALID) && (currState_ != prevState_)) {
Knillinux 1:40bdbe1a93b7 281 //2 bit state. Right hand bit of prev XOR left hand bit of current
Knillinux 1:40bdbe1a93b7 282 //gives 0 if clockwise rotation and 1 if counter clockwise rotation.
Knillinux 1:40bdbe1a93b7 283 change = (prevState_ & PREV_MASK) ^ ((currState_ & CURR_MASK) >> 1);
Knillinux 1:40bdbe1a93b7 284
Knillinux 1:40bdbe1a93b7 285 if (change == 0) {
Knillinux 1:40bdbe1a93b7 286 change = -1;
Knillinux 1:40bdbe1a93b7 287 }
Knillinux 1:40bdbe1a93b7 288
Knillinux 1:40bdbe1a93b7 289 pulses_ -= change;
Knillinux 1:40bdbe1a93b7 290 }
Knillinux 1:40bdbe1a93b7 291
Knillinux 1:40bdbe1a93b7 292 }
Knillinux 1:40bdbe1a93b7 293
ambyld 4:cae255669971 294 if (abs(pulses_) >= pulsesPerSpeedMeas_) {
Knillinux 1:40bdbe1a93b7 295 speed_ = (float)pulses_/timer.read();
Knillinux 1:40bdbe1a93b7 296 pulses_ = 0;
Knillinux 1:40bdbe1a93b7 297 timer.reset();
Knillinux 1:40bdbe1a93b7 298 }
ambyld 4:cae255669971 299
Knillinux 1:40bdbe1a93b7 300
Knillinux 1:40bdbe1a93b7 301 prevState_ = currState_;
Knillinux 1:40bdbe1a93b7 302
Knillinux 1:40bdbe1a93b7 303 }
Knillinux 1:40bdbe1a93b7 304
Knillinux 1:40bdbe1a93b7 305 void QEI::index(void) {
Knillinux 1:40bdbe1a93b7 306
Knillinux 1:40bdbe1a93b7 307 revolutions_++;
Knillinux 1:40bdbe1a93b7 308
Knillinux 1:40bdbe1a93b7 309 }