TREx/indication_driver.py
2023-01-20 02:05:55 +09:00

66 lines
2.1 KiB
Python

import neopixel
import time
from typing import List
from threading import Thread
import sys
sys.path.append('.')
import config
class IndicationDriver:
def __init__(self):
self.pixels = neopixel.NeoPixel(
config.PIXEL_PIN,
config.NUM_PIXELS,
brightness= config.NEOPIXEL_BRIGHTNESS,
auto_write=False,
pixel_order=neopixel.GRB
)
self._run_loop = True
self._indication_loop = None
self.trash_category = ""
self.stop()
def _clear(self):
self.pixels.fill((0,0,0))
self.pixels.show()
self.trash_category = ""
def stop(self):
if self._indication_loop:
self._run_loop = False
self._indication_loop.join()
self._clear()
def _get_trash_location(self, trash_type: str) -> List[int]:
if trash_type in config.TRASH_LOCATION:
center_location = config.TRASH_LOCATION[trash_type]
return range(center_location-2, center_location+3)
else:
raise ValueError
def indicate(self, trash_type: str):
self.stop()
self.trash_category = trash_type
location = self._get_trash_location(trash_type)
def _indication_loop(self, location: List[int]):
for idx in location:
self.pixels[idx] = (0, 255, 0)
self.pixels.show()
self._run_loop = True
start_time = time.process_time()
while self._run_loop and time.process_time() < start_time + 10:
for step in range (4):
for idx in range(location[0]):
if idx % 4 == step:
self.pixels[idx] = (0, 0, 255)
else:
self.pixels[idx] = (0, 0, 0)
self.pixels.show()
time.sleep(.1)
self._clear()
self._indication_loop = Thread(target = _indication_loop, args = (self, location, ))
self._indication_loop.start()
sleep(.1)