rotary_encoder.cpp
Go to the documentation of this file.
00001 #include <iostream>
00002 
00003 #include <pigpio.h>
00004 
00005 #include "rotary_encoder.hpp"
00006 
00007 /*
00008 
00009              +---------+         +---------+      0
00010              |         |         |         |
00011    A         |         |         |         |
00012              |         |         |         |
00013    +---------+         +---------+         +----- 1
00014 
00015        +---------+         +---------+            0
00016        |         |         |         |
00017    B   |         |         |         |
00018        |         |         |         |
00019    ----+         +---------+         +---------+  1
00020 
00021 */
00022 
00023 void re_decoder::_pulse(int gpio, int level, uint32_t tick)
00024 {
00025    if (gpio == mygpioA) levA = level; else levB = level;
00026 
00027    if (gpio != lastGpio) /* debounce */
00028    {
00029       lastGpio = gpio;
00030 
00031       if ((gpio == mygpioA) && (level == 1))
00032       {
00033          if (levB) (mycallback)(1);
00034       }
00035       else if ((gpio == mygpioB) && (level == 1))
00036       {
00037          if (levA) (mycallback)(-1);
00038       }
00039    }
00040 }
00041 
00042 void re_decoder::_pulseEx(int gpio, int level, uint32_t tick, void *user)
00043 {
00044    /*
00045       Need a static callback to link with C.
00046    */
00047 
00048    re_decoder *mySelf = (re_decoder *) user;
00049 
00050    mySelf->_pulse(gpio, level, tick); /* Call the instance callback. */
00051 }
00052 
00053 re_decoder::re_decoder(int gpioA, int gpioB, re_decoderCB_t callback)
00054 {
00055    mygpioA = gpioA;
00056    mygpioB = gpioB;
00057 
00058    mycallback = callback;
00059 
00060    levA=0;
00061    levB=0;
00062 
00063    lastGpio = -1;
00064 
00065    gpioSetMode(gpioA, PI_INPUT);
00066    gpioSetMode(gpioB, PI_INPUT);
00067 
00068    /* pull up is needed as encoder common is grounded */
00069 
00070    gpioSetPullUpDown(gpioA, PI_PUD_UP);
00071    gpioSetPullUpDown(gpioB, PI_PUD_UP);
00072 
00073    /* monitor encoder level changes */
00074 
00075    gpioSetAlertFuncEx(gpioA, _pulseEx, this);
00076    gpioSetAlertFuncEx(gpioB, _pulseEx, this);
00077 }
00078 
00079 void re_decoder::re_cancel(void)
00080 {
00081    gpioSetAlertFuncEx(mygpioA, 0, this);
00082    gpioSetAlertFuncEx(mygpioB, 0, this);
00083 }
00084 


cob_hand_bridge
Author(s): Mathias Lüdtke
autogenerated on Thu Jun 6 2019 20:43:57