rotary_encoder.cpp
Go to the documentation of this file.
1 #include <iostream>
2 
3 #include <pigpio.h>
4 
5 #include "rotary_encoder.hpp"
6 
7 /*
8 
9  +---------+ +---------+ 0
10  | | | |
11  A | | | |
12  | | | |
13  +---------+ +---------+ +----- 1
14 
15  +---------+ +---------+ 0
16  | | | |
17  B | | | |
18  | | | |
19  ----+ +---------+ +---------+ 1
20 
21 */
22 
23 void re_decoder::_pulse(int gpio, int level, uint32_t tick)
24 {
25  if (gpio == mygpioA) levA = level; else levB = level;
26 
27  if (gpio != lastGpio) /* debounce */
28  {
29  lastGpio = gpio;
30 
31  if ((gpio == mygpioA) && (level == 1))
32  {
33  if (levB) (mycallback)(1);
34  }
35  else if ((gpio == mygpioB) && (level == 1))
36  {
37  if (levA) (mycallback)(-1);
38  }
39  }
40 }
41 
42 void re_decoder::_pulseEx(int gpio, int level, uint32_t tick, void *user)
43 {
44  /*
45  Need a static callback to link with C.
46  */
47 
48  re_decoder *mySelf = (re_decoder *) user;
49 
50  mySelf->_pulse(gpio, level, tick); /* Call the instance callback. */
51 }
52 
54 {
55  mygpioA = gpioA;
56  mygpioB = gpioB;
57 
59 
60  levA=0;
61  levB=0;
62 
63  lastGpio = -1;
64 
65  gpioSetMode(gpioA, PI_INPUT);
66  gpioSetMode(gpioB, PI_INPUT);
67 
68  /* pull up is needed as encoder common is grounded */
69 
72 
73  /* monitor encoder level changes */
74 
75  gpioSetAlertFuncEx(gpioA, _pulseEx, this);
76  gpioSetAlertFuncEx(gpioB, _pulseEx, this);
77 }
78 
80 {
81  gpioSetAlertFuncEx(mygpioA, 0, this);
82  gpioSetAlertFuncEx(mygpioB, 0, this);
83 }
84 
void callback(uint32_t hash)
int gpioSetMode(unsigned gpio, unsigned mode)
Definition: pigpio.c:8607
re_decoderCB_t mycallback
#define PI_PUD_UP
Definition: pigpio.h:594
re_decoder(int gpioA, int gpioB, re_decoderCB_t callback)
void _pulse(int gpio, int level, uint32_t tick)
#define PI_INPUT
Definition: pigpio.h:581
void re_cancel(void)
int gpioSetAlertFuncEx(unsigned gpio, gpioAlertFuncEx_t f, void *userdata)
Definition: pigpio.c:11320
int gpioSetPullUpDown(unsigned gpio, unsigned pud)
Definition: pigpio.c:8661
void(* re_decoderCB_t)(int)
static void _pulseEx(int gpio, int level, uint32_t tick, void *user)


cob_hand_bridge
Author(s): Mathias Lüdtke
autogenerated on Tue Oct 20 2020 03:35:57