Explorar el Código

Add support for delayed fades

Zachary Kotlarek hace 14 años
padre
commit
5a52c86632
Se han modificado 1 ficheros con 23 adiciones y 9 borrados
  1. 23 9
      dmx/dmx.py

+ 23 - 9
dmx/dmx.pl → dmx/dmx.py

@@ -19,7 +19,7 @@ from ola.ClientWrapper import ClientWrapper
 max_channels = 512
 max_channels = 512
 wrapper = None
 wrapper = None
 state = [ 0 ] * max_channels
 state = [ 0 ] * max_channels
-cmds = { 'value' : [ 0 ] * max_channels, 'ticks' : [ 0 ] * max_channels }
+cmds = { 'value' : [ 0 ] * max_channels, 'ticks' : [ 0 ] * max_channels, 'delay' : [ 0 ] * max_channels }
 sock = None
 sock = None
 max_mesg_len = 1024
 max_mesg_len = 1024
 
 
@@ -45,11 +45,10 @@ def SendDMXFrame():
   wrapper.AddEvent(interval, SendDMXFrame)
   wrapper.AddEvent(interval, SendDMXFrame)
   
   
   # Check for new commands
   # Check for new commands
-  
   ready = select.select([sock], [], [], interval / 2000)[0]
   ready = select.select([sock], [], [], interval / 2000)[0]
   for fh in ready:
   for fh in ready:
     cmd = fh.recvfrom(max_mesg_len)[0]
     cmd = fh.recvfrom(max_mesg_len)[0]
-    channel, duration, intensity = string.split(cmd, ':')
+    channel, duration, intensity, delay = string.split(cmd, ':')
     try:
     try:
       channel = int(channel)
       channel = int(channel)
       duration = int(duration)
       duration = int(duration)
@@ -57,27 +56,42 @@ def SendDMXFrame():
     except ValueError:
     except ValueError:
       print 'Invalid command:', cmd
       print 'Invalid command:', cmd
       channel = -1
       channel = -1
+    try:
+      delay = int(delay)
+    except ValueError:
+      delay = 0
+    
+    # Save valid commands
     if (channel >= 0 and channel <= 512 and intensity >= 0 and intensity <= 255 and duration >= 0 and duration <= 300000):
     if (channel >= 0 and channel <= 512 and intensity >= 0 and intensity <= 255 and duration >= 0 and duration <= 300000):
       if (channel > 0):
       if (channel > 0):
         cmds['value'][channel - 1] = intensity
         cmds['value'][channel - 1] = intensity
         cmds['ticks'][channel - 1] = duration / interval
         cmds['ticks'][channel - 1] = duration / interval
+        cmds['delay'][channel - 1] = delay / interval
       else:
       else:
         for i in range(len(state)):
         for i in range(len(state)):
           cmds['value'][i] = intensity
           cmds['value'][i] = intensity
           cmds['ticks'][i] = duration / interval
           cmds['ticks'][i] = duration / interval
+          cmds['delay'][i] = delay / interval
     else:
     else:
       print 'Invalid command parameters:', channel, duration, intensity
       print 'Invalid command parameters:', channel, duration, intensity
   
   
   # Update values for each channel
   # Update values for each channel
   for i in range(len(cmds['value'])):
   for i in range(len(cmds['value'])):
+    delta = 0
     if (cmds['value'][i] != state[i]):
     if (cmds['value'][i] != state[i]):
-      diff = cmds['value'][i] - state[i]
-      if (cmds['ticks'][i] < 1):
-        delta = diff
+      if (cmds['delay'][i] > 0):
+        cmds['delay'][i] -= 1
       else:
       else:
-        delta = float(diff) / float(cmds['ticks'][i])
-      state[i] += delta
-      cmds['ticks'][i] -= 1
+        diff = cmds['value'][i] - state[i]
+        if (cmds['ticks'][i] < 1):
+          delta = diff
+        else:
+          delta = float(diff) / float(cmds['ticks'][i])
+        state[i] += delta
+        cmds['ticks'][i] -= 1
+      if (0):
+        print 'Channel:', (i + 1)
+        print "\tDelay:", cmds['delay'][i], "\tValue:", state[i], "\tDelta:", delta, "\tTicks:", cmds['ticks'][i]
     
     
   # Send all DMX channels
   # Send all DMX channels
   data = array.array('B')
   data = array.array('B')