From 6fccadf8fa726adaa834393c1e9b04253f7b2c6f Mon Sep 17 00:00:00 2001 From: marcsello Date: Wed, 30 Sep 2020 00:04:50 +0200 Subject: [PATCH] Implemented blinkenlights --- .gitignore | 1 + README.md | 2 +- birbnetes_iot_platform_raspberry/__init__.py | 1 + birbnetes_iot_platform_raspberry/led_stuff.py | 95 +++++++++++++++++++ .../playback_stuff.py | 1 + .../record_stuff.py | 0 requirements.txt | 2 + setup.py | 37 ++++++++ 8 files changed, 138 insertions(+), 1 deletion(-) create mode 100644 birbnetes_iot_platform_raspberry/__init__.py create mode 100644 birbnetes_iot_platform_raspberry/led_stuff.py create mode 100644 birbnetes_iot_platform_raspberry/playback_stuff.py create mode 100644 birbnetes_iot_platform_raspberry/record_stuff.py create mode 100644 requirements.txt create mode 100644 setup.py diff --git a/.gitignore b/.gitignore index 13d1490..e532603 100644 --- a/.gitignore +++ b/.gitignore @@ -129,3 +129,4 @@ dmypy.json # Pyre type checker .pyre/ +.idea/ diff --git a/README.md b/README.md index a97d671..6fd7ecc 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,3 @@ -# libbirbpy +# iot-platform-raspberry Library handling low level hardware interactions for iot-logic \ No newline at end of file diff --git a/birbnetes_iot_platform_raspberry/__init__.py b/birbnetes_iot_platform_raspberry/__init__.py new file mode 100644 index 0000000..d4bfa81 --- /dev/null +++ b/birbnetes_iot_platform_raspberry/__init__.py @@ -0,0 +1 @@ +from .led_stuff import BirbnetesIoTPlatformStatusDriver \ No newline at end of file diff --git a/birbnetes_iot_platform_raspberry/led_stuff.py b/birbnetes_iot_platform_raspberry/led_stuff.py new file mode 100644 index 0000000..7c6a4cf --- /dev/null +++ b/birbnetes_iot_platform_raspberry/led_stuff.py @@ -0,0 +1,95 @@ +from threading import Thread +from queue import Queue, Empty +import time +import RPi.GPIO as GPIO + +GPIO.setmode(GPIO.BCM) + + +class BlinkenLight: + + def __init__(self, pin): + self._pin = pin + self._pattern_queue = Queue() + self._active_pattern = None + self._pointer = 0 + + GPIO.setup(pin, GPIO.OUT, initial=GPIO.LOW) + + def clk(self): + + if not self._active_pattern: # No pattern loaded + + if self._pointer == -5: # Skip 5 ticks before new pattern + + try: + pattern = self._pattern_queue.get(block=False) + self._active_pattern = pattern + self._pointer = 0 + except Empty: + return + + else: + self._pointer -= 1 + + # Meanwhile a pattern loaded + if self._active_pattern: # There is a pattern loaded + + if self._pointer == len(self._active_pattern): + self._active_pattern = None + self._pointer = 0 + GPIO.output(self._pin, False) + else: + GPIO.output(self._pin, bool(self._active_pattern[self._pointer])) + + self._pointer += 1 + + def enqueue_pattern(self, pattern: list): + self._pattern_queue.put(pattern) + + def cleanup(self): + GPIO.cleanup(self._pin) + + +class BlinkenLights(Thread): + LED_TARGETS = { + 'red': 23, + 'green': 24 + } + + def __init__(self): + super().__init__() + self._led_controllers = {} + for name, pin in self.LED_TARGETS.items(): + self._led_controllers[name] = BlinkenLight(pin) + self._active = True + + def run(self): + + while self._active: + time.sleep(200) + for name, led in self._led_controllers: + led.clk() + + for name, led in self._led_controllers: + led.cleanup() + + def enqueue_pattern(self, target: str, pattern: list): + self._led_controllers[target].enqueue_pattern(pattern) + + def stop(self): + self._active = False + + +class BirbnetesIoTPlatformStatusDriver: + + blinken_lights = None + + @classmethod + def init(cls): + cls.blinken_lights = BlinkenLights() + cls.blinken_lights.start() + + @classmethod + def enqueue_pattern(cls, target: str, pattern: list): + cls.blinken_lights.enqueue_pattern(target, pattern) diff --git a/birbnetes_iot_platform_raspberry/playback_stuff.py b/birbnetes_iot_platform_raspberry/playback_stuff.py new file mode 100644 index 0000000..037aaa7 --- /dev/null +++ b/birbnetes_iot_platform_raspberry/playback_stuff.py @@ -0,0 +1 @@ +import alsaaudio diff --git a/birbnetes_iot_platform_raspberry/record_stuff.py b/birbnetes_iot_platform_raspberry/record_stuff.py new file mode 100644 index 0000000..e69de29 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..2943951 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +RPi.GPIO +pyalsaaudio \ No newline at end of file diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..65ab6ac --- /dev/null +++ b/setup.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python + +"""The setup script.""" + +from setuptools import setup, find_packages + +with open('README.md') as readme_file: + readme = readme_file.read() + +requirements = ['RPi.GPIO', 'pyalsaaudio'] + +setup_requirements = ['pytest-runner', ] + +test_requirements = ['pytest>=3', ] + +setup( + author="Marcell Pünkösd", + author_email='punkosdmarcell@rocketmail.com', + python_requires='>=3.7', + classifiers=[ + 'Development Status :: 3 - Alpha', + ], + description="Platform abstraction layer for Birbnetes IoT device", + install_requires=requirements, + license="MIT license", + long_description=readme, + include_package_data=True, + keywords='birbnetes', + name='birbnetes_iot_platform_raspberry', + packages=find_packages(include=['birbnetes_iot_platform_raspberry', 'birbnetes_iot_platform_raspberry.*']), + setup_requires=setup_requirements, + test_suite='tests', + tests_require=test_requirements, + url='https://git.kmlabz.com/birbnetes/iot-platform-raspberry', + version='0.1.0', + zip_safe=False, +) \ No newline at end of file