Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- __author__ = 'harryberlin'
- import subprocess
- import xbmc
- class GPIOClass(object):
- def __init__(self, pin_number):
- self.pin_number = pin_number
- self.invert_signal = False
- self.triggering = False
- self.triggering_time = 0.2
- self.isOpen = False
- @staticmethod
- def _call(command):
- try:
- try:
- output = subprocess.check_output(command, stderr=subprocess.STDOUT)
- except subprocess.CalledProcessError as error:
- output = error.output
- return error.returncode
- else:
- return output
- finally:
- pass
- def open(self, mode='out', start_level=False, off_level=False):
- if pin_number not in [4, 5, 6, 7, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27]:
- raise ValueError('%s is not a valid GPIO' % pin_number)
- self.invert_signal = off_level
- if mode == 'out':
- self._call('chmod 222 /sys/class/gpio/export /sys/class/gpio/unexport')
- self._call('echo %s > /sys/class/gpio/export' % self.pin_number)
- self._call('chmod 222 /sys/class/gpio/gpio%s/direction' % self.pin_number)
- self._call('chmod 222 /sys/class/gpio/gpio%s/value' % self.pin_number)
- self._call('echo %s >/sys/class/gpio/gpio%s/direction' % ('high' if self.invert_signal
- else 'low', self.pin_number))
- if start_level:
- self.set()
- else:
- self.reset()
- elif mode == 'in':
- self._call('chmod 222 /sys/class/gpio/export /sys/class/gpio/unexport')
- self._call('echo %s > /sys/class/gpio/export' % self.pin_number)
- self.isOpen = True
- def close(self):
- if self.isOpen:
- self.reset()
- self._call('echo %s > /sys/class/gpio/unexport' % self.pin_number)
- self.isOpen = False
- def set(self):
- if self.isOpen:
- if self.invert_signal:
- call('echo "0" > /sys/class/gpio/gpio%s/value' % self.pin_number)
- log('Set GPIO%s Low' % self.pin_number, 2)
- else:
- call('echo "1" > /sys/class/gpio/gpio%s/value' % self.pin_number)
- log('Set GPIO%s High' % self.pin_number, 2)
- def reset(self):
- if self.isOpen:
- if self.invert_signal:
- self._call('echo "1" > /sys/class/gpio/gpio%s/value' % self.pin_number)
- log('Reset GPIO%s High' % self.pin_number, 2)
- else:
- self._call('echo "0" > /sys/class/gpio/gpio%s/value' % self.pin_number)
- log('Reset GPIO%s Low' % self.pin_number, 2)
- def toggle(self):
- if self.isOpen:
- pin_level = bool(call('cat /sys/class/gpio/gpio%s/value' % self.pin_number))
- if pin_level:
- self.reset()
- else:
- self.set()
- def trigger(self, holdtime=0.2):
- self.triggering_time = holdtime
- if self.triggering:
- return
- thread = Thread(target=self._trigger, args=(holdtime,))
- thread.daemon = True
- self.triggering = True
- thread.start()
- def _trigger(self, holdtime=0.2):
- if self.isOpen:
- self.set()
- while self.triggering_time > 0:
- self.triggering_time -= 0.001
- time.sleep(0.001)
- self.reset()
- self.triggering = False
- def get(self):
- if self.isOpen:
- value = call('cat /sys/class/gpio/gpio%s/value' % self.pin_number)
- if '1' in value:
- return True
- else:
- return False
- def log(string):
- xbmc.log('YOUR-ADDON-ID: %s' % string, xbmc.LOGNOTICE)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement