Go to the documentation of this file.00001 #include <pigpio.h>
00002
00003 #include "wiegand.hpp"
00004
00005 Wiegand::Wiegand(int gpio_0, int gpio_1, WiegandCB_t callback, int timeout)
00006 {
00007
00008
00009
00010
00011
00012
00013
00014
00015 mygpio_0 = gpio_0;
00016 mygpio_1 = gpio_1;
00017
00018 mycallback = callback;
00019
00020 mytimeout = timeout;
00021
00022 in_code = 0;
00023
00024 gpioSetMode(gpio_0, PI_INPUT);
00025 gpioSetMode(gpio_1, PI_INPUT);
00026
00027 gpioSetPullUpDown(gpio_0, PI_PUD_UP);
00028 gpioSetPullUpDown(gpio_1, PI_PUD_UP);
00029
00030 gpioSetAlertFuncEx(gpio_0, _cbEx, this);
00031 gpioSetAlertFuncEx(gpio_1, _cbEx, this);
00032 }
00033
00034 void Wiegand::_cb(int gpio, int level, uint32_t tick)
00035 {
00036
00037
00038
00039
00040 if (level == 0)
00041 {
00042 if (!in_code)
00043 {
00044 bits = 1;
00045 num = 0;
00046
00047 in_code = 1;
00048 code_timeout = 0;
00049
00050 gpioSetWatchdog(mygpio_0, mytimeout);
00051 gpioSetWatchdog(mygpio_1, mytimeout);
00052 }
00053 else
00054 {
00055 bits++;
00056 num <<= 1;
00057 }
00058
00059 if (gpio == mygpio_0)
00060 {
00061 code_timeout &= 2;
00062 }
00063 else
00064 {
00065 code_timeout &= 1;
00066 num |= 1;
00067 }
00068 }
00069 else if (level == PI_TIMEOUT)
00070 {
00071 if (in_code)
00072 {
00073 if (gpio == mygpio_0)
00074 {
00075 code_timeout |= 1;
00076 }
00077 else
00078 {
00079 code_timeout |= 2;
00080 }
00081
00082 if (code_timeout == 3)
00083 {
00084 gpioSetWatchdog(mygpio_0, 0);
00085 gpioSetWatchdog(mygpio_1, 0);
00086
00087 in_code = 0;
00088
00089 (mycallback)(bits, num);
00090 }
00091 }
00092 }
00093 }
00094
00095 void Wiegand::_cbEx(int gpio, int level, uint32_t tick, void *user)
00096 {
00097
00098
00099
00100
00101 Wiegand *mySelf = (Wiegand *) user;
00102
00103 mySelf->_cb(gpio, level, tick);
00104 }
00105
00106
00107 void Wiegand::cancel(void)
00108 {
00109
00110
00111
00112
00113 gpioSetAlertFuncEx(mygpio_0, 0, this);
00114 gpioSetAlertFuncEx(mygpio_1, 0, this);
00115 }
00116