diff --git a/mozc-nazoru/bin/nazoru-input b/mozc-nazoru/bin/nazoru-input index fb75e41..99839f5 100755 --- a/mozc-nazoru/bin/nazoru-input +++ b/mozc-nazoru/bin/nazoru-input @@ -16,8 +16,12 @@ # limitations under the License. from __future__ import print_function -from nazoru.led import LED_BLUE, LED_RED +from nazoru.led import LED_BLUE, LED_RED, LED_CHASSIS +import time LED_RED.blink(1) +LED_CHASSIS.on() +time.sleep(1) +LED_CHASSIS.off() import argparse import os @@ -48,6 +52,7 @@ def main(): LED_RED.off() LED_BLUE.blink(1) + LED_CHASSIS.set_brightness(5) print('Ready. Please input your scrrible.') while True: @@ -60,9 +65,11 @@ def main(): print('done.') break + LED_CHASSIS.set_brightness(100) LED_RED.on() result = predictor.predict_top_n(data, 5) LED_RED.off() + LED_CHASSIS.set_brightness(5) print('\n=== RESULTS ===') for item in result: diff --git a/mozc-nazoru/setup.py b/mozc-nazoru/setup.py index aed5e6f..2093af7 100755 --- a/mozc-nazoru/setup.py +++ b/mozc-nazoru/setup.py @@ -67,6 +67,7 @@ setup( 'tensorflow', 'enum34;python_version<"3.4"', 'pyserial', - 'evdev;platform_system=="Linux"' + 'evdev;platform_system=="Linux"', + 'wiringpi' ] ) diff --git a/mozc-nazoru/src/nazoru/led.py b/mozc-nazoru/src/nazoru/led.py index 3a3c2a0..fa44644 100644 --- a/mozc-nazoru/src/nazoru/led.py +++ b/mozc-nazoru/src/nazoru/led.py @@ -16,7 +16,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -class LEDBase(): +class LEDBase(object): def __init__(self, pin): self._pin = pin def on(self): @@ -25,17 +25,19 @@ class LEDBase(): pass def blink(self, interval): pass + def set_brightness(self, brightness): + pass try: import RPi.GPIO as GPIO import threading + GPIO.setmode(GPIO.BOARD) class LED(LEDBase): ON = 'ON' OFF = 'OFF' def __init__(self, pin): - GPIO.setmode(GPIO.BOARD) self._pin = pin self._lock = threading.Lock() self._timer = None @@ -72,11 +74,72 @@ try: self._timer.cancel() self._timer = None + import wiringpi + wiringpi.wiringPiSetupPhys() + class SlowLED(LEDBase): + DUTY_MAX = 1024 + INTERVAL_MS = 10 + + def __init__(self, pin, delay_ms): + self._pin = pin + self._delay_ms = delay_ms + wiringpi.pinMode(pin, wiringpi.GPIO.PWM_OUTPUT) + self._target_duty = 0 + self._current_duty = 0 + self._remaining_cycles = 0 + self._lock = threading.Lock() + self._timer = None + self.off() + + # Called every 10ms + def _update(self): + with self._lock: + diff = (self._target_duty - self._current_duty) // \ + self._remaining_cycles + self._current_duty += diff + self._remaining_cycles -= 1 + self._set_duty_immediate(self._current_duty) + if self._remaining_cycles == 0: + self._timer.cancel() + self._timer = None + return + self._timer = threading.Timer(self.INTERVAL_MS * 0.001, self._update) + self._timer.daemon = True + self._timer.start() + + + # |duty|: 0 - 100 + def _set_duty_immediate(self, duty): + wiringpi.pwmWrite(self._pin, int(self.DUTY_MAX * duty // 100)) + + def _set_duty_slow(self, duty, time_ms): + with self._lock: + self._target_duty = duty + self._remaining_cycles = time_ms // self.INTERVAL_MS + if self._timer is None: + self._timer = threading.Timer(self.INTERVAL_MS * 0.001, self._update) + self._timer.daemon = True + self._timer.start() + + def on(self): + self._set_duty_slow(100, self._delay_ms) + + def off(self): + self._set_duty_slow(0, self._delay_ms) + + # |brightness|: 0 - 100 + def set_brightness(self, brightness): + self._set_duty_slow(brightness, self._delay_ms) + except ImportError as e: import sys class LED(LEDBase): pass + class SlowLED(LEDBase): + def __init__(self, pin, delay_ms): + super(SlowLED, self).__init__(pin) LED_BLUE = LED(38) LED_RED = LED(40) +LED_CHASSIS = SlowLED(32, 500)