parent
							
								
									521b444fe4
								
							
						
					
					
						commit
						e2fe52d08f
					
				@ -0,0 +1,89 @@ | 
				
			||||
import time | 
				
			||||
import gex | 
				
			||||
 | 
				
			||||
WK_TIME = 25 | 
				
			||||
BK_TIME = 5 | 
				
			||||
LIGHT_CNT = 30 | 
				
			||||
 | 
				
			||||
PH_BREAK = 'Break' | 
				
			||||
PH_BREAK_OVER = 'BreakOver' | 
				
			||||
PH_WORK = 'Work' | 
				
			||||
PH_WORK_OVER = 'WorkOver' | 
				
			||||
 | 
				
			||||
class Pymodoro: | 
				
			||||
    def __init__(self): | 
				
			||||
        self.phase = PH_BREAK_OVER | 
				
			||||
        self.work_s = 0 | 
				
			||||
        self.break_s = 0 | 
				
			||||
        self.colors = [0x000000 for _ in range(0, LIGHT_CNT)] | 
				
			||||
 | 
				
			||||
        client = gex.Client(gex.TrxRawUSB()) | 
				
			||||
        self.btn = gex.DIn(client, 'btn') | 
				
			||||
        self.neo = gex.Neopixel(client, 'neo') | 
				
			||||
        self.btn.on_trigger(0x01, self.on_btn) | 
				
			||||
 | 
				
			||||
        self.switch(PH_BREAK_OVER) | 
				
			||||
        self.display() | 
				
			||||
 | 
				
			||||
    def display(self): | 
				
			||||
        self.neo.load(self.colors) | 
				
			||||
 | 
				
			||||
    def on_btn(self, snapshot, timestamp): | 
				
			||||
        if self.phase == PH_BREAK_OVER: | 
				
			||||
            self.switch(PH_WORK) | 
				
			||||
 | 
				
			||||
        elif self.phase == PH_WORK_OVER: | 
				
			||||
            self.switch(PH_BREAK) | 
				
			||||
 | 
				
			||||
    def switch(self, phase): | 
				
			||||
        print("Switch to %s" % phase) | 
				
			||||
 | 
				
			||||
        if phase == PH_BREAK: | 
				
			||||
            self.colors = [0x009900 for _ in range(0, LIGHT_CNT)] | 
				
			||||
            self.break_s = BK_TIME * 60 | 
				
			||||
 | 
				
			||||
        elif phase == PH_BREAK_OVER: | 
				
			||||
            self.colors = [0x662200 for _ in range(0, LIGHT_CNT)] | 
				
			||||
 | 
				
			||||
        elif phase == PH_WORK: | 
				
			||||
            self.colors = [0x990000 for _ in range(0, LIGHT_CNT)] | 
				
			||||
            self.work_s = WK_TIME * 60 | 
				
			||||
 | 
				
			||||
        elif phase == PH_WORK_OVER: | 
				
			||||
            self.colors = [0x113300 for _ in range(0, LIGHT_CNT)] | 
				
			||||
 | 
				
			||||
        self.phase = phase | 
				
			||||
 | 
				
			||||
    def extinguish(self, dark, total): | 
				
			||||
        per_light = total / LIGHT_CNT | 
				
			||||
        lights = int((dark + per_light / 2) / per_light) | 
				
			||||
        for n in range(0, LIGHT_CNT - lights): | 
				
			||||
            self.colors[n] = 0x000000 | 
				
			||||
 | 
				
			||||
    def tick(self): | 
				
			||||
        if self.phase == PH_BREAK: | 
				
			||||
            self.break_s -= 1 | 
				
			||||
            print("Break remain: %d s" % self.break_s) | 
				
			||||
            self.extinguish(self.break_s, BK_TIME * 60) | 
				
			||||
 | 
				
			||||
            if self.break_s == 0: | 
				
			||||
                self.switch(PH_BREAK_OVER) | 
				
			||||
 | 
				
			||||
        elif self.phase == PH_WORK: | 
				
			||||
            self.work_s -= 1 | 
				
			||||
            print("Work remain: %d s" % self.work_s) | 
				
			||||
            self.extinguish(self.work_s, WK_TIME * 60) | 
				
			||||
 | 
				
			||||
            if self.work_s == 0: | 
				
			||||
                self.switch(PH_WORK_OVER) | 
				
			||||
 | 
				
			||||
        self.display() | 
				
			||||
 | 
				
			||||
    def run(self): | 
				
			||||
        while True: | 
				
			||||
            time.sleep(1) | 
				
			||||
            self.tick() | 
				
			||||
 | 
				
			||||
 | 
				
			||||
a = Pymodoro() | 
				
			||||
a.run() | 
				
			||||
					Loading…
					
					
				
		Reference in new issue