Advertisement
Guest User

Simple command line GPIOClass for KODI on Raspberry Pi

a guest
Jan 18th, 2020
486
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.93 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4. __author__ = 'harryberlin'
  5.  
  6. import subprocess
  7. import xbmc
  8.  
  9.  
  10. class GPIOClass(object):
  11.  
  12.     def __init__(self, pin_number):
  13.         self.pin_number = pin_number
  14.         self.invert_signal = False
  15.         self.triggering = False
  16.         self.triggering_time = 0.2
  17.         self.isOpen = False
  18.  
  19.     @staticmethod
  20.     def _call(command):
  21.         try:
  22.             try:
  23.                 output = subprocess.check_output(command, stderr=subprocess.STDOUT)
  24.             except subprocess.CalledProcessError as error:
  25.                 output = error.output
  26.                 return error.returncode
  27.             else:
  28.                 return output
  29.         finally:
  30.             pass
  31.  
  32.     def open(self, mode='out', start_level=False, off_level=False):
  33.         if pin_number not in [4, 5, 6, 7, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27]:
  34.             raise ValueError('%s is not a valid GPIO' % pin_number)
  35.  
  36.         self.invert_signal = off_level
  37.  
  38.         if mode == 'out':
  39.             self._call('chmod 222 /sys/class/gpio/export /sys/class/gpio/unexport')
  40.             self._call('echo %s > /sys/class/gpio/export' % self.pin_number)
  41.  
  42.             self._call('chmod 222 /sys/class/gpio/gpio%s/direction' % self.pin_number)
  43.             self._call('chmod 222 /sys/class/gpio/gpio%s/value' % self.pin_number)
  44.             self._call('echo %s >/sys/class/gpio/gpio%s/direction' % ('high' if self.invert_signal
  45.                                                                       else 'low', self.pin_number))
  46.             if start_level:
  47.                 self.set()
  48.             else:
  49.                 self.reset()
  50.         elif mode == 'in':
  51.             self._call('chmod 222 /sys/class/gpio/export /sys/class/gpio/unexport')
  52.             self._call('echo %s > /sys/class/gpio/export' % self.pin_number)
  53.  
  54.         self.isOpen = True
  55.  
  56.     def close(self):
  57.         if self.isOpen:
  58.             self.reset()
  59.             self._call('echo %s > /sys/class/gpio/unexport' % self.pin_number)
  60.             self.isOpen = False
  61.  
  62.     def set(self):
  63.         if self.isOpen:
  64.             if self.invert_signal:
  65.                 call('echo "0" > /sys/class/gpio/gpio%s/value' % self.pin_number)
  66.                 log('Set GPIO%s Low' % self.pin_number, 2)
  67.             else:
  68.                 call('echo "1" > /sys/class/gpio/gpio%s/value' % self.pin_number)
  69.                 log('Set GPIO%s High' % self.pin_number, 2)
  70.  
  71.     def reset(self):
  72.         if self.isOpen:
  73.  
  74.             if self.invert_signal:
  75.                 self._call('echo "1" > /sys/class/gpio/gpio%s/value' % self.pin_number)
  76.                 log('Reset GPIO%s High' % self.pin_number, 2)
  77.             else:
  78.                 self._call('echo "0" > /sys/class/gpio/gpio%s/value' % self.pin_number)
  79.                 log('Reset GPIO%s Low' % self.pin_number, 2)
  80.  
  81.     def toggle(self):
  82.         if self.isOpen:
  83.             pin_level = bool(call('cat /sys/class/gpio/gpio%s/value' % self.pin_number))
  84.             if pin_level:
  85.                 self.reset()
  86.             else:
  87.                 self.set()
  88.  
  89.     def trigger(self, holdtime=0.2):
  90.         self.triggering_time = holdtime
  91.         if self.triggering:
  92.             return
  93.         thread = Thread(target=self._trigger, args=(holdtime,))
  94.         thread.daemon = True
  95.         self.triggering = True
  96.         thread.start()
  97.  
  98.     def _trigger(self, holdtime=0.2):
  99.         if self.isOpen:
  100.             self.set()
  101.             while self.triggering_time > 0:
  102.                 self.triggering_time -= 0.001
  103.                 time.sleep(0.001)
  104.             self.reset()
  105.         self.triggering = False
  106.  
  107.     def get(self):
  108.         if self.isOpen:
  109.             value = call('cat /sys/class/gpio/gpio%s/value' % self.pin_number)
  110.             if '1' in value:
  111.                 return True
  112.             else:
  113.                 return False
  114.  
  115.  
  116. def log(string):
  117.     xbmc.log('YOUR-ADDON-ID: %s' % string, xbmc.LOGNOTICE)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement