|
|
@@ -2,6 +2,7 @@
|
|
|
import os
|
|
|
import sys
|
|
|
import array
|
|
|
+import select
|
|
|
import socket
|
|
|
import string
|
|
|
import subprocess
|
|
|
@@ -10,10 +11,18 @@ from ola.ClientWrapper import ClientWrapper
|
|
|
# ====================================
|
|
|
# Globals
|
|
|
# ====================================
|
|
|
+max_channels = 512
|
|
|
wrapper = None
|
|
|
-state = [ 0 ]
|
|
|
-cmds = { 'value' : [ 0 ], 'ticks' : [ 0 ] }
|
|
|
+state = [ 0 ] * max_channels
|
|
|
+cmds = { 'value' : [ 0 ] * max_channels, 'ticks' : [ 0 ] * max_channels }
|
|
|
sock = None
|
|
|
+max_mesg_len = 1024
|
|
|
+
|
|
|
+# ====================================
|
|
|
+# Defaults
|
|
|
+# ====================================
|
|
|
+interval = 50
|
|
|
+universe = 0
|
|
|
|
|
|
# ====================================
|
|
|
# Wrapper callback -- exit on errors
|
|
|
@@ -29,35 +38,57 @@ def DmxSent(state):
|
|
|
def SendDMXFrame():
|
|
|
# Re-schedule ourselves in interval ms (do this first to keep the timing consistent)
|
|
|
wrapper.AddEvent(interval, SendDMXFrame)
|
|
|
-
|
|
|
+
|
|
|
# Check for new commands
|
|
|
- global sock
|
|
|
+
|
|
|
+ ready = select.select([sock], [], [], interval / 2000)[0]
|
|
|
+ for fh in ready:
|
|
|
+ cmd = fh.recvfrom(max_mesg_len)[0]
|
|
|
+ channel, duration, intensity = string.split(cmd, ':')
|
|
|
+ try:
|
|
|
+ channel = int(channel)
|
|
|
+ duration = int(duration)
|
|
|
+ intensity = int(intensity)
|
|
|
+ except ValueError:
|
|
|
+ print 'Invalid command:', cmd
|
|
|
+ channel = -1
|
|
|
+ if (channel >= 0 and channel <= 512 and intensity >= 0 and intensity <= 255 and duration >= 0 and duration <= 60000):
|
|
|
+ if (channel > 0):
|
|
|
+ cmds['value'][channel - 1] = intensity
|
|
|
+ cmds['ticks'][channel - 1] = duration / interval
|
|
|
+ else:
|
|
|
+ for i in range(len(state)):
|
|
|
+ cmds['value'][i] = intensity
|
|
|
+ cmds['ticks'][i] = duration / interval
|
|
|
+ else:
|
|
|
+ print 'Invalid command parameters:', channel, duration, intensity
|
|
|
|
|
|
# Update values for each channel
|
|
|
for i in range(len(cmds['value'])):
|
|
|
if (cmds['value'][i] != state[i]):
|
|
|
diff = cmds['value'][i] - state[i]
|
|
|
- delta = float(diff) / float(cmds['ticks'][i])
|
|
|
+ if (cmds['ticks'][i] < 1):
|
|
|
+ delta = diff
|
|
|
+ else:
|
|
|
+ delta = float(diff) / float(cmds['ticks'][i])
|
|
|
state[i] += int(delta)
|
|
|
- cmd['ticks'][i] -= 1
|
|
|
-
|
|
|
+ cmds['ticks'][i] -= 1
|
|
|
+
|
|
|
# Send all DMX channels
|
|
|
data = array.array('B')
|
|
|
for i in range(len(state)):
|
|
|
- data.append(state[i])
|
|
|
+ data.append(state[i])
|
|
|
wrapper.Client().SendDmx(universe, data, DmxSent)
|
|
|
|
|
|
# ====================================
|
|
|
# Main
|
|
|
# ====================================
|
|
|
|
|
|
-# Pick a universe (0, or as specified in the environment)
|
|
|
-universe = 0
|
|
|
+# Pick a universe (default from above, or as specified in the environment)
|
|
|
if 'UNIVERSE' in os.environ:
|
|
|
universe = int(os.environ['UNIVERSE'])
|
|
|
|
|
|
-# Pick a tick interval (50ms, or as specified in the environment)
|
|
|
-interval = 50
|
|
|
+# Pick a tick interval (default from above, or as specified in the environment)
|
|
|
if 'INTERVAL' in os.environ:
|
|
|
universe = int(os.environ['INTERVAL'])
|
|
|
|