From 6a362159f7df1137fda7aa0ce776827e6a477c58 Mon Sep 17 00:00:00 2001 From: Martin Kompf Date: Mon, 28 Mar 2016 17:54:40 +0200 Subject: [PATCH] Use interrupt with edge triggering (epoll) --- setup.sh | 2 ++ wairc.py | 40 +++++++++++++++++++++++----------------- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/setup.sh b/setup.sh index 1d00a5a..1a2bf2f 100755 --- a/setup.sh +++ b/setup.sh @@ -1 +1,3 @@ +gpio unexport 9 gpio export 9 in +gpio edge 9 rising diff --git a/wairc.py b/wairc.py index 03a9934..33fbc4e 100755 --- a/wairc.py +++ b/wairc.py @@ -22,16 +22,16 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -import serial import time import sys import os import re +import select import argparse import rrdtool -# GPIO value files (wiringPi) -gpin = '/sys/class/gpio/gpio9/value' +# GPIO pin to read from +gpio_pin = 9 # counter unit: 1 revolution = x m^3 trigger_step = 0.001 @@ -78,6 +78,12 @@ def last_rrd_count(): handle.close() return val + +# Setup gpio edge interrupt triggering +def setup_gpio(pin): + os.system("gpio export {} in".format(pin)) + os.system("gpio edge {} rising".format(pin)) + # Main def main(): # Check command args @@ -88,29 +94,29 @@ def main(): if args.create: create_rrd() - trigger_state = 0 counter = last_rrd_count() print "restoring counter to %f" % counter - while(1==1): - # read gpio input value file - f = open(gpin, 'r') - line = f.read().strip() - f.close() + # open gpio input value file + # and register handler for edge trigger + setup_gpio(gpio_pin) + f = open("/sys/class/gpio/gpio{}/value".format(gpio_pin), 'r') + epoll = select.epoll() + epoll.register(f, select.EPOLLIN | select.EPOLLET) + events = epoll.poll() # eat the first edge - old_state = trigger_state - if line == '1': - trigger_state = 1 - elif line == '0': - trigger_state = 0 - if old_state == 1 and trigger_state == 0: - # trigger active -> update count rrd + while(1==1): + events = epoll.poll() + f.seek(0) + value = f.read(1) + if value == '1': + # trigger edge detected -> update count rrd counter += trigger_step update = "N:%.3f:%.3f" % (counter, trigger_step) #print update rrdtool.update(count_rrd, update) - time.sleep(0.1) + f.close() if __name__ == '__main__': main()