#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import pigpio
from time import sleep
import sys
import threading
 
 
# Led制御
"""
指定した色全部が同時に点滅調光するモード
指定した色を順番に点滅調光するモード
r:赤、g:緑、b:青(GPIO番号指定、点灯しない場合は、0(ゼロ指定))
ton:点灯時間、toff:消灯時間(秒)
duc:dutyサイクル指定(1〜100指定)
v:調光有無指定、0:調光無し、1:調光有り
c:同時点灯、順番点灯指定、0:同時点灯調光、1:順番点灯調光
"""
class LedThread(threading.Thread): # スレッドを立ち上げてサーボを駆動
 
    def __init__(self,r,g,b,ton,toff,duc,v,c):
        
        super(LedThread, self).__init__()
        
        self.r = r # 赤
        self.g = g # 緑
        self.b = b # 青
        self.ton = ton # 点灯時間
        self.toff = toff # 消灯時間
        self.duc = duc # dutyサイクル(1~100指定)
        self.v = v # 調光有無指定、0:調光無し、1:調光有り
        self.c = c # 同時点灯、順番点灯指定、0:同時点灯調光、1:順番点灯調光
 
        self.stop_event = threading.Event()
        
        self.setDaemon(True)
        
 
        self.pi = pigpio.pi()
        
        
        self.list = [self.r,self.g,self.b]
        
        self.rgblist = []
        
        for p in self.list:
            if p != 0:
                self.rgblist.append(p)
 
                          
        
    def stop(self):
        
        self.stop_event.set()
        
        for p in self.rgblist:
            self.pi.set_mode(p, pigpio.INPUT)
 
        self.pi.stop()
 
 
 
    def run(self):
                
                
        if not ((4 <= self.r <= 27) or (self.r == 0)):
            return False
        if not ((4 <= self.g <= 27) or (self.g == 0)):
            return False    
        if not ((4 <= self.b <= 27) or (self.b == 0)):
            return False        
        
        
        
        FREQ = 200 # PWM周波数 200Hz
        
        RANGE = 100 # PWM最大値 100
       
        
        for p in self.rgblist:
            self.pi.set_mode(p, pigpio.OUTPUT)
                
 
        for p in self.rgblist:
            self.pi.set_PWM_frequency(p, FREQ)
                
                
        for p in self.rgblist:
            self.pi.set_PWM_range(p, RANGE)  
  
        
        d = 0
        dc = self.duc
        
        if self.v == 0: # 調光無しか?
            dc = RANGE # dc=RANGEの時は調光なしの点滅
            
 
        if self.c == 0: # 同時点滅調光モード
            
            while not self.stop_event.is_set():
 
                for p in self.rgblist:
                    self.pi.set_PWM_dutycycle(p, d)      
                               
                sleep(self.ton)
                
                for p in self.rgblist:
                    self.pi.set_PWM_dutycycle(p, 0)
                                     
                sleep(self.toff)
                
                d += dc
 
                if d >= RANGE or d <= 0:
                    dc *= -1
                    if d > RANGE:
                        d = RANGE
                    if d < 0:
                        d = 0
 
 
                    
        elif self.c == 1: # 順番点滅調光モード
            
            while not self.stop_event.is_set():
                
                for p in range(len(self.rgblist)):
                    self.pi.set_PWM_dutycycle(self.rgblist[p], d)
                    
                    sleep(self.ton)
                    
                    self.pi.set_PWM_dutycycle(self.rgblist[p], 0)
                    
                    sleep(self.toff)
                    
                        
                    d += dc
 
                    if d >= RANGE or d <= 0:
                        dc *= -1
                        if d > RANGE:
                            d = RANGE
                        if d < 0:
                            d = 0
 
 
if __name__ == '__main__':
    
    
    Led = LedThread(r=25,g=21,b=19,ton=0.8,toff=0.3,duc=5,v=1,c=1) # Led制御スレッドインスタンス
    #Led = LedThread(r=25,g=21,b=19,ton=0.8,toff=0.3,duc=5,v=0,c=0) # Led制御スレッドインスタンス
    
    Led.start() # Led制御開始
    
    
    sleep(9) # ロボットの何らかの動作。例えば、「会話」中にLedで表情を表現する。
    
    
    Led.stop() # Led制御停止
    
    sys.exit()