Mercurial > code > home > repos > light9
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() |