Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
mRotaryEncoder.h
- Committer:
- charly
- Date:
- 2015-03-11
- Revision:
- 6:854c349157b0
- Parent:
- 5:75ddffaf3721
- Child:
- 7:ec80fd9c0c08
File content as of revision 6:854c349157b0:
#ifndef MROTENC_H_INCLUDED
#define MROTENC_H_INCLUDED
#include "mbed.h"
#include "PinDetect.h"
/** This Class handles a rotary encoder with mechanical switches and an integrated pushbutton
* It uses two pins, one creating an interrupt on change.
* Rotation direction is determined by checking the state of the other pin.
* Additionally a pushbutton switch is detected
*
* 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)
* Extended by Karl Zweimueller (charly)
*
* Dent steady point ! ! !
* +-----+ +-----+
* pinA (interrupt) | | | |
* --+ +-----+ +---
* +-----+ +-----+
* pinB | | | |
* ----+ +-----+ +-
* --> C.W
* CW: increases position value
* CCW: decreases position value
*
* changelog:
*
* 09. Nov. 2010
* First version published Thomas Raab raabinator
* 26.11.2010 extended by charly - pushbutton, pullmode, debounce, callback-system
* Feb2011 Changes InterruptIn to PinDetect which does the debounce of mechanical switches
*
*/
class mRotaryEncoder {
public:
/** Create a mechanical rotary encoder object connected to the specified pins
*
* @param pinA Switch A of quadrature encoder
* @param pinB Switch B of quadrature encoder
* @param pinSW Pin for push-button switch
* @param pullmode mode for pinA pinB and pinSW like DigitalIn.mode
* @param debounceTime_us time in micro-seconds to wait for bouncing of mechanical switches to end
*/
mRotaryEncoder(PinName pinA, PinName pinB, PinName pinSW, PinMode pullMode=PullUp, int debounceTime_us=1000);
/** destroy object
*
*/
~mRotaryEncoder();
/** Get the actual value of the rotary position
*
* @return position int value of position
*/
int Get(void);
inline operator int() {
return Get();
}
/** Set the current position value
*
* @param value the new position to set
*
*/
void Set(int value);
inline mRotaryEncoder& operator= ( int value ) {
Set(value);
return *this;
}
/** attach a function to be called when switch is pressed
* keep this function short, as no interrrupts can occour within
*
* @param fptr Pointer to callback-function
*/
void attachSW(void (*fptr)(void)) {
m_pinSW->attach_deasserted(fptr);
}
template<typename T>
/** attach an object member function to be called when switch is pressed
*
* @param tptr pointer to object
* @param mprt pointer ro member function
*
*/
void attachSW(T* tptr, void (T::*mptr)(void)) {
if ((mptr != NULL) && (tptr != NULL)) {
m_pinSW->attach_deasserted(tptr, mptr);
}
}
/** callback-System for rotation of shaft
* attach a function to be called when the shaft is rotaded
* keep this function short, as no interrrupts can occour within
*
* @param fprt Pointer to callback-function
*/
void attachROT(void (*fptr)(void)) {
rotIsr.attach(fptr);
}
template<typename T>
/** attach an object member function to be called when shaft is rotaded
*
* @param tptr pointer to object
* @param mprt pointer ro member function
*
*/
void attachROT(T* tptr, void (T::*mptr)(void)) {
if ((mptr != NULL) && (tptr != NULL)) {
rotIsr.attach(tptr, mptr);
}
}
private:
PinDetect *m_pinA;
DigitalIn *m_pinB;
volatile int m_position;
int m_debounceTime_us;
PinDetect *m_pinSW;
void rise(void);
void fall(void);
protected:
/**
* Callback system.
* @ingroup INTERNALS
*/
FunctionPointer rotIsr;
};
#endif