"""ERDTREE R02, raw PWM duty percentages; no photometric calibration claim.""" import math PINS=(0,2,4,6) DEFAULT=(22,48,82,12) NIGHT=(5,12,22,3) MODES=('常亮','缓慢呼吸','夜灯','关闭') def duty_u16(percent): percent=float(percent) if not math.isfinite(percent): raise ValueError('finite duty required') return round(max(0,min(100,percent))*65535/100) def levels(mode,elapsed_s): if mode==0:return DEFAULT if mode==1: a=math.sin(elapsed_s*2*math.pi/10) return (22,48+5*a,82+8*a,12) if mode==2:return NIGHT if mode==3:return (0,0,0,0) raise ValueError('unknown mode') class DebouncedPress: def __init__(self,now_ms): self.last_raw=1;self.stable=1;self.changed_ms=now_ms def update(self,raw,now_ms,diff): if raw!=self.last_raw: self.last_raw=raw;self.changed_ms=now_ms if diff(now_ms,self.changed_ms)>=40 and raw!=self.stable: self.stable=raw return raw==0 return False