Advertisement
Guest User

Untitled

a guest
Sep 1st, 2015
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.80 KB | None | 0 0
  1. import time
  2. import collections
  3. import select
  4. import threading
  5. from Logger import Logger
  6.  
  7. GPIOType = collections.namedtuple("GPIOType", [ "io", "number", "name", "inverted", "filename" ])
  8.  
  9. _log = Logger("IOAccess")
  10.  
  11. class InputPoller(threading.Thread):
  12.     def __init__(self, inputs, callback):
  13.         threading.Thread.__init__(self)
  14.         self._inputs = inputs
  15.         self._callback = callback
  16.         self._files = { gpio.name: open(gpio.filename, "r") for gpio in self._inputs }
  17.         self._pollobj = select.poll()
  18.         for (name, f) in self._files.items():
  19.             self._pollobj.register(f.fileno(), select.POLLPRI)
  20.  
  21.     def _getall(self):
  22.         values = { }
  23.         for gpio in self._inputs:
  24.             f = self._files[gpio.name]
  25.             f.seek(0)
  26.             data = f.read()[:-1]
  27.             data = (data == "1")
  28.             data ^= gpio.inverted
  29.             values[gpio.name] = data
  30.         return values
  31.  
  32.     def run(self):
  33.         while True:
  34.             pollresult = self._pollobj.poll(1000)
  35.             if len(pollresult) > 0:
  36.                 self._callback(self._getall())
  37.  
  38. class IOAccess():
  39.     def __init__(self):
  40.         self._gpios = { }
  41.         self._lastvalues = { }
  42.  
  43.     def addinput(self, gpiono, name, inverted = False):
  44.         self._gpios[name] = GPIOType(io = "in", number = gpiono, name = name, inverted = inverted, filename = IOAccess._gpiofilename(gpiono))
  45.    
  46.     def addoutput(self, gpiono, name, inverted = False):
  47.         self._gpios[name] = GPIOType(io = "out", number = gpiono, name = name, inverted = inverted, filename = IOAccess._gpiofilename(gpiono))
  48.  
  49.     def _gpiofilename(gpiono):
  50.         filename = "/sys/class/gpio/gpio%d/value" % (gpiono)
  51.         return filename
  52.  
  53.     def listen(self, listener):
  54.         inputs = { gpio for gpio in self._gpios.values() if gpio.io == "in" }
  55.         thread = InputPoller(inputs, listener)
  56.         thread.start()
  57.  
  58.     def setoutput(self, gpio, value):
  59.         if value:
  60.             writestr = "1"
  61.         else:
  62.             writestr = "0"
  63.         f = open(gpio.filename, "w")
  64.         print(writestr, file = f)
  65.         f.close()
  66.  
  67.     def pulse(self, gpioname, length = 0.01):
  68.         gpio = self._gpios[gpioname]       
  69.         assert(gpio.io == "out")
  70.         _log.log("Pulse %s len %.3f sec" % (str(gpio), length))
  71.         t0 = time.time()
  72.         self.setoutput(gpio, not gpio.inverted)
  73.         time.sleep(length)
  74.         self.setoutput(gpio, gpio.inverted)
  75.         t1 = time.time()
  76.         _log.log("Actual pulse len %.3f sec (%+.3f sec)" % (t1 - t0, (t1 - t0) - length))
  77.  
  78.     def multipulse(self, gpioname, ontime, offtime, count):
  79.         for i in range(count):
  80.             self.pulse(gpioname, ontime)
  81.             time.sleep(offtime)
  82.  
  83. if __name__ == "__main__":
  84.     import sys
  85.     ioa = IOAccess()
  86.     ioa.addinput(21, "BtnUp", True)
  87.     ioa.addinput(4, "BtnDown", True)
  88.     ioa.addinput(17, "BtnRight", True)
  89.     ioa.addinput(22, "BtnLeft", True)
  90.     ioa.addoutput(23, "AudioSilent", False)
  91.     ioa.addoutput(24, "AudioLouder", False)
  92. #   ioa.pulse(sys.argv[1], float(sys.argv[2]))
  93.     def listener(states):
  94.         print(states)
  95.  
  96.     ioa.listen(listener)
  97.     while True:
  98.         time.sleep(1)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement