save loops

Dependencies:   mbed

hardwareIO/CRotaryEncoder.h

Committer:
mbedalvaro
Date:
2014-12-02
Revision:
0:df6fdd9b99f0

File content as of revision 0:df6fdd9b99f0:

#ifndef CROTENC_H_INCLUDED
#define CROTENC_H_INCLUDED

#include "mbed.h"


/* This Class handles a rotary encoder like the one from Pollin electronic (Panasonic EVEP...).
 * It uses two pins, one creating an interrupt on change.
 * Rotation direction is determined by checking the state of the other pin.
 *
 * Operating the encoder changes an internal integer value that can be read
 * by Get() or the operator int() functions.
 * A new value can be set by Set(value) or opperator=.
 *
 * Autor: Thomas Raab (Raabinator)
 *
 * Dent steady point     !     !     !
 *                    +-----+     +-----+
 * pinA (interrupt)   |     |     |     |
 *                  --+     +-----+     +---
 *                      +-----+     +-----+
 * pinB                 |     |     |     |
 *                  ----+     +-----+     +-
 *                           --> C.W
 * CW:  increases position value
 * CCW: decreases position value
 *
 * changelog:
 *
 * 09. Nov. 2010
 *     First version published.
 *
 */

#define ROTARY_ENCODER1_PINA p21
#define ROTARY_ENCODER1_PINB p22

#define ROTARY_ENCODER2_PINA p26
#define ROTARY_ENCODER2_PINB p27

class CRotaryEncoder
{
    public:
    CRotaryEncoder(PinName pinA, PinName pinB);
    ~CRotaryEncoder();
    
    int Get(void);
    inline operator int() { return Get(); }

    void Set(int value);
    inline CRotaryEncoder& operator= ( int  value ) { Set(value); return *this; }
    
    void SetMinMax(int min, int max);
    
    bool CheckNew();

    private:
    void wrapValue();
    InterruptIn     *m_pinA;
    DigitalIn       *m_pinB;
    volatile int    m_position, maxValue, minValue;
    volatile bool newValue;
    
    void rise(void);
    void fall(void);
    

};

extern CRotaryEncoder rotaryEncoder1;
extern CRotaryEncoder rotaryEncoder2;

#endif