rotary_encoder.c
Go to the documentation of this file.
1 #include <stdio.h>
2 #include <stdlib.h>
3 
4 #include <pigpio.h>
5 
6 #include "rotary_encoder.h"
7 
8 struct _Pi_Renc_s
9 {
10  int gpioA;
11  int gpioB;
13  int levA;
14  int levB;
15  int lastGpio;
16 };
17 
18 /*
19 
20  +---------+ +---------+ 0
21  | | | |
22  A | | | |
23  | | | |
24  +---------+ +---------+ +----- 1
25 
26  +---------+ +---------+ 0
27  | | | |
28  B | | | |
29  | | | |
30  ----+ +---------+ +---------+ 1
31 
32 */
33 
34 static void _cb(int gpio, int level, uint32_t tick, void *user)
35 {
36  Pi_Renc_t *renc;
37 
38  renc = user;
39 
40  if (gpio == renc->gpioA) renc->levA = level; else renc->levB = level;
41 
42  if (gpio != renc->lastGpio) /* debounce */
43  {
44  renc->lastGpio = gpio;
45 
46  if ((gpio == renc->gpioA) && (level == 1))
47  {
48  if (renc->levB) (renc->callback)(1);
49  }
50  else if ((gpio == renc->gpioB) && (level == 1))
51  {
52  if (renc->levA) (renc->callback)(-1);
53  }
54  }
55 }
56 
58 {
59  Pi_Renc_t *renc;
60 
61  renc = malloc(sizeof(Pi_Renc_t));
62 
63  renc->gpioA = gpioA;
64  renc->gpioB = gpioB;
65  renc->callback = callback;
66  renc->levA=0;
67  renc->levB=0;
68  renc->lastGpio = -1;
69 
70  gpioSetMode(gpioA, PI_INPUT);
71  gpioSetMode(gpioB, PI_INPUT);
72 
73  /* pull up is needed as encoder common is grounded */
74 
77 
78  /* monitor encoder level changes */
79 
80  gpioSetAlertFuncEx(gpioA, _cb, renc);
81  gpioSetAlertFuncEx(gpioB, _cb, renc);
82 }
83 
85 {
86  if (renc)
87  {
88  gpioSetAlertFunc(renc->gpioA, 0);
89  gpioSetAlertFunc(renc->gpioB, 0);
90 
91  free(renc);
92  }
93 }
94 
void(* Pi_Renc_CB_t)(int)
Definition: rotary_encoder.h:4
int gpioSetAlertFunc(unsigned gpio, gpioAlertFunc_t f)
Definition: pigpio.c:11303
int gpioSetMode(unsigned gpio, unsigned mode)
Definition: pigpio.c:8607
void Pi_Renc_cancel(Pi_Renc_t *renc)
#define PI_PUD_UP
Definition: pigpio.h:594
static void _cb(int gpio, int level, uint32_t tick, void *user)
Pi_Renc_t * Pi_Renc(int gpioA, int gpioB, Pi_Renc_CB_t callback)
#define PI_INPUT
Definition: pigpio.h:581
int gpioSetAlertFuncEx(unsigned gpio, gpioAlertFuncEx_t f, void *userdata)
Definition: pigpio.c:11320
int gpioSetPullUpDown(unsigned gpio, unsigned pud)
Definition: pigpio.c:8661
Pi_Renc_CB_t callback


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