فهرست منبع

changed core logic

subDesTagesMitExtraKaese 3 سال پیش
والد
کامیت
dcae705c80
2فایلهای تغییر یافته به همراه62 افزوده شده و 31 حذف شده
  1. 36 15
      leds.py
  2. 26 16
      main.py

+ 36 - 15
leds.py

@@ -8,42 +8,63 @@ class Leds:
     self.led_count = len(LED_LIST)
     self.led_count = len(LED_LIST)
     self.pwm = [None] * self.led_count
     self.pwm = [None] * self.led_count
     self.vals = [0] * self.led_count
     self.vals = [0] * self.led_count
-    self.diff = [0.0] * self.led_count
+    self.diff = [0] * self.led_count
     self.stepId = [0] * self.led_count
     self.stepId = [0] * self.led_count
     self.steps = 50
     self.steps = 50
     self.frequency = 800
     self.frequency = 800
+    self.enabled = True
   
   
-  def enable(self, i):
+  def init(self, i):
     if not self.pwm[i]:
     if not self.pwm[i]:
       self.pwm[i] = PWM(Pin(LED_LIST[i][1]), channel=LED_LIST[i][2], freq=self.frequency, duty=0)
       self.pwm[i] = PWM(Pin(LED_LIST[i][1]), channel=LED_LIST[i][2], freq=self.frequency, duty=0)
 
 
-  def enableAll(self):
-    for i in range(self.led_count):
-      self.enable(i)
-
-  def disable(self, i):
+  def deinit(self, i):
     if self.pwm[i]:
     if self.pwm[i]:
       self.pwm[i].deinit()
       self.pwm[i].deinit()
       self.pwm[i] = None
       self.pwm[i] = None
 
 
-  def disableAll(self):
+  def enable(self):
+    self.enabled = True
     for i in range(self.led_count):
     for i in range(self.led_count):
-      self.disable(i)
+      self.diff[i] = float(self.vals[i]) / self.steps
+      self.stepId[i] = 0
+
+  def disable(self):
+    for i in range(self.led_count):
+      self.setColor(i, 0)
+    self.enabled = False
+
+  def setSteps(self, n):
+    if n < 1:
+      n = 1
+    self.steps = n
 
 
   def setColor(self, i, val):
   def setColor(self, i, val):
-    if not self.pwm[i]:
-      return
-    self.diff[i] = float(self.vals[i] - self.pwm[i].duty()) / (self.steps)
+    if val < 0:
+      val = 0
+    elif val > 256:
+      val = 256
     self.vals[i] = val
     self.vals[i] = val
+
+    if not self.enabled:
+      return
+    if not self.pwm[i]:
+      self.diff[i] = self.vals[i]
+    else:
+      self.diff[i] = self.vals[i] - (self.pwm[i].duty() + 1)
     self.stepId[i] = 0
     self.stepId[i] = 0
 
 
   def update(self):
   def update(self):
     for i in range(self.led_count):
     for i in range(self.led_count):
-      if not self.pwm[i]:
+      if self.enabled and not self.pwm[i] and self.vals[i]:
+        self.init(i)
+      elif not self.pwm[i]:
         continue
         continue
       if self.stepId[i] > self.steps:
       if self.stepId[i] > self.steps:
-        self.pwm[i].duty(self.vals[i])
+        self.diff[i] = 0
+        if self.pwm[i].duty() == 0 or not self.enabled:
+          self.deinit(i)
       else:
       else:
-        self.pwm[i].duty(int(self.vals[i] - self.diff[i] * (self.steps - self.stepId[i])))
+        self.pwm[i].duty(int(self.vals[i] - self.diff[i] * float(self.steps - self.stepId[i]) / self.steps))
         self.stepId[i] += 1
         self.stepId[i] += 1
   
   

+ 26 - 16
main.py

@@ -13,30 +13,43 @@ from leds import Leds
 import gc
 import gc
 gc.collect()
 gc.collect()
 
 
-station = network.WLAN(network.STA_IF)
 leds = Leds()
 leds = Leds()
+leds.setColor(2, 1)
+leds.update()
+
+station = network.WLAN(network.STA_IF)
+
+def send_status(error = None):
+  msg = {
+    'state': "ON" if leds.enabled else "OFF",
+    'speed': leds.steps,
+    'color': {LED_LIST[i][0]: leds.vals[i] for i in range(len(LED_LIST))},
+    'time' : time.time(),
+    'error': error
+  }
+  msg = ujson.dumps(msg)
+  client.publish(TOPIC_PUB, bytes(msg, 'utf-8'))
 
 
 def sub_cb(topic, msg):
 def sub_cb(topic, msg):
   try:
   try:
     cmd = ujson.loads(str(msg, 'utf-8'))
     cmd = ujson.loads(str(msg, 'utf-8'))
     if 'state' in cmd:
     if 'state' in cmd:
       if cmd['state'] == "OFF":
       if cmd['state'] == "OFF":
-        leds.disableAll()
+        leds.disable()
       else:
       else:
-        leds.enableAll()
+        leds.enable()
     if 'speed' in cmd:
     if 'speed' in cmd:
-      leds.steps = int(cmd['fade'])
+      leds.setSteps(int(cmd['speed']))
     if 'color' in cmd:
     if 'color' in cmd:
       for i, (color, _, _) in enumerate(LED_LIST):
       for i, (color, _, _) in enumerate(LED_LIST):
         if color in cmd['color']:
         if color in cmd['color']:
-          val = int(cmd['color'][color])
-          if val >= 0 and val <= 255:
-            leds.setColor(i, val)
+          leds.setColor(i, int(cmd['color'][color]))
     if 'reset' in cmd:
     if 'reset' in cmd:
       machine.reset()
       machine.reset()
+    send_status()
     
     
   except Exception as e:
   except Exception as e:
-    client.publish(TOPIC_PUB, b"error")
+    send_status("cb error")
 
 
 
 
 def connect_and_subscribe():
 def connect_and_subscribe():
@@ -61,24 +74,21 @@ except OSError as e:
   restart_and_reconnect()
   restart_and_reconnect()
 
 
 last_message = 0
 last_message = 0
-message_interval = 10
-counter = 0
+message_interval = 60
 
 
 while True:
 while True:
   try:
   try:
     client.check_msg()
     client.check_msg()
-    if (time.time() - last_message) > message_interval:
-      msg = b'online #%d' % counter
-      client.publish(TOPIC_PUB, msg)
+    if (time.time() - last_message) >= message_interval:
+      send_status()
       last_message = time.time()
       last_message = time.time()
       gc.collect()
       gc.collect()
-      counter += 1
     leds.update()
     leds.update()
     time.sleep(0.02)
     time.sleep(0.02)
   except OSError as e:
   except OSError as e:
-    client.publish(TOPIC_PUB, b"OSError")
+    send_status("loop error")
     restart_and_reconnect()
     restart_and_reconnect()
   if station.isconnected() == False:
   if station.isconnected() == False:
-    leds.enable(0)
+    leds.init(0)
     leds.setColor(0, 60)
     leds.setColor(0, 60)