comparison light8/io.py @ 71:177e9ba0b4a7

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