Files
@ 177e9ba0b4a7
Branch filter:
Location: light9/light8/io.py
177e9ba0b4a7
3.3 KiB
text/x-python
simple DMX server
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 | from parport import *
import socket, os
lastlevels = {}
def gethostlist(host):
return lastlevels[host]
def parselist(levels):
newlist = [0] * 68
# levels has at least one pair
ch, lev = None, None
while len(levels) >= 2:
ch, lev = levels.pop(0), levels.pop(0)
# off by one errors -- i hate them sooo much
newlist[int(ch) - 1] = int(lev)
return newlist
def sethostlist(host, changes):
if not changes: return
global lastlevels
if host not in lastlevels:
lastlevels[host] = [0] * 68
lastlevels[host] = parselist(changes)
'''
# changes has at least one pair
ch, lev = None, None
while len(changes) >= 2:
ch, lev = changes.pop(0), changes.pop(0)
# off by one errors -- i hate them sooo much
lastlevels[host][ch - 1] = lev
'''
def sendlevels(levels):
print "sendlevels: i'm a level hobo:", levels
levels = levels + [0]
# if levels[14] > 0: levels[14] = 100 # non-dim
print "sendlevels: wait for it... length =", len(levels)
outstart()
for p in range(1, 68 + 2):
outbyte(levels[p-1]*255 / 100)
print "sendlevels: done"
class ParportDMX: # ethdmx client or standalone server
def __init__(self, dummy=1, dimmers=68, machine_name='localhost',
standalone=0):
self.dimmers = dimmers
self.dummy = dummy
if not dummy:
getparport()
self.standalone = standalone
self.machine_name = machine_name
def sendupdates(self, levels):
if (not self.dummy) and levels:
print "update:", levels
if self.standalone:
print "standalone sendlevels", levels
sendlevels(parselist(levels))
return
pid = os.getpid()
s = ('%d ' % pid) + ' '.join([str(l) for l in levels]) + '\n'
# print "sending", s
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.connect((self.machine_name,
socket.getservbyname('ethdmx', 'tcp')))
self.sock.send(s)
# response = self.sock.recv(100)
# print "response", response
# if response != 'ACK\n':
# raise "Didn't get ACK from DMX server"
if __name__ == '__main__':
import SocketServer
getparport()
class DMXHandler(SocketServer.StreamRequestHandler):
def handle(self):
global lastlevels
changed = self.rfile.readline(1000)
# self.wfile.write("ACK\n")
pairs = changed.split()
pid = pairs[0]
changes = pairs[1:]
# print 'pairs', pairs
sethostlist(pid, changes)
self.preplevels()
def preplevels(self):
global lastlevels
hosts = lastlevels.keys()
maxlevels = [0] * 68
for h in hosts:
maxlevels = [max(hostlev, maxlev)
for hostlev, maxlev in zip(maxlevels, gethostlist(h))]
print "dmxhandler sending levels:", maxlevels
sendlevels(maxlevels)
print "Running DMX over Ethernet socket server. Everything is under " + \
"control."
server = SocketServer.TCPServer(('',
socket.getservbyname('ethdmx', 'tcp')), DMXHandler)
server.serve_forever()
|