annotate light8/io.py @ 71:177e9ba0b4a7

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