|
@@ -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')
|