Mercurial > code > home > repos > light9
annotate bin/lightsim @ 466:f69ba5ac17c5
qt version of lightsim now works
author | drewp@bigasterisk.com |
---|---|
date | Mon, 01 Sep 2008 05:36:24 +0000 |
parents | 60b49f6c2027 |
children | 2d9c85c98be6 |
rev | line source |
---|---|
352
9d1f323fb3d3
new bin/lightsim tied to dmxserver
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
1 #!/usr/bin/python |
9d1f323fb3d3
new bin/lightsim tied to dmxserver
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
2 |
9d1f323fb3d3
new bin/lightsim tied to dmxserver
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
3 from __future__ import division |
9d1f323fb3d3
new bin/lightsim tied to dmxserver
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
4 import run_local |
466 | 5 import sys, logging |
463 | 6 |
7 sys.path.append("lib") | |
8 import qt4reactor | |
9 qt4reactor.install() | |
352
9d1f323fb3d3
new bin/lightsim tied to dmxserver
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
10 |
463 | 11 from twisted.internet import reactor |
352
9d1f323fb3d3
new bin/lightsim tied to dmxserver
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
12 from twisted.internet.task import LoopingCall |
9d1f323fb3d3
new bin/lightsim tied to dmxserver
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
13 from twisted.web.xmlrpc import Proxy |
463 | 14 from louie import dispatcher |
466 | 15 from PyQt4.QtGui import QWidget, QLabel, QVBoxLayout, QHBoxLayout, QMainWindow |
463 | 16 from OpenGL.GL import * |
17 from OpenGL.GLU import * | |
18 | |
19 from light9 import networking, Patch, showconfig, dmxclient, updatefreq, prof | |
20 from light9.namespaces import L9 | |
21 from lightsim.openglsim import Surface | |
22 | |
352
9d1f323fb3d3
new bin/lightsim tied to dmxserver
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
23 log = logging.getLogger() |
9d1f323fb3d3
new bin/lightsim tied to dmxserver
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
24 logging.basicConfig(format="%(asctime)s %(levelname)-5s %(name)s %(filename)s:%(lineno)d: %(message)s") |
9d1f323fb3d3
new bin/lightsim tied to dmxserver
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
25 log.setLevel(logging.DEBUG) |
9d1f323fb3d3
new bin/lightsim tied to dmxserver
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
26 |
466 | 27 def filenamesForChan(graph, chan): |
28 for lyr in graph.objects(chan, L9['previewLayer']): | |
29 for imgPath in graph.objects(lyr, L9['path']): | |
30 yield imgPath | |
31 | |
32 _lastLevels = None | |
463 | 33 def poll(graph, serv, pollFreq, oglSurface): |
353
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
34 pollFreq.update() |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
35 dispatcher.send("status", key="pollFreq", value=str(pollFreq)) |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
36 d = serv.callRemote("currentlevels", dmxclient._id) |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
37 def received(dmxLevels): |
466 | 38 global _lastLevels |
39 if dmxLevels == _lastLevels: | |
40 return | |
41 _lastLevels = dmxLevels | |
353
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
42 level = {} # filename : level |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
43 for i, lev in enumerate(dmxLevels): |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
44 if lev == 0: |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
45 continue |
352
9d1f323fb3d3
new bin/lightsim tied to dmxserver
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
46 |
353
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
47 try: |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
48 chan = Patch.get_channel_uri(Patch.get_channel_name(i + 1)) |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
49 except KeyError: |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
50 continue |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
51 |
466 | 52 for imgPath in filenamesForChan(graph, chan): |
53 level[str(imgPath)] = lev | |
352
9d1f323fb3d3
new bin/lightsim tied to dmxserver
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
54 |
463 | 55 oglSurface.newLevels(levels=level) |
353
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
56 d.addCallback(received) |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
57 return d |
352
9d1f323fb3d3
new bin/lightsim tied to dmxserver
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
58 |
466 | 59 class StatusKeys(QWidget): |
60 """listens for dispatcher signal 'status' and displays the key/value args""" | |
61 def __init__(self, parent): | |
62 QWidget.__init__(self) | |
63 self.layout = QVBoxLayout() | |
64 self.setLayout(self.layout) | |
65 self.row = {} # key name : (Frame, value Label) | |
353
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
66 dispatcher.connect(self.status, "status") |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
67 |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
68 def status(self, key, value): |
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
69 if key not in self.row: |
466 | 70 row = QWidget() |
71 self.layout.addWidget(row) | |
72 cols = QHBoxLayout() | |
73 row.setLayout(cols) | |
74 lab1 = QLabel(key) | |
75 lab2 = QLabel(value) | |
76 cols.addWidget(lab1) | |
77 cols.addWidget(lab2) | |
78 self.row[key] = lab2 | |
353
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
79 else: |
466 | 80 lab = self.row[key] |
81 lab.setText(value) | |
353
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
82 |
466 | 83 class Window(QMainWindow): |
463 | 84 def __init__(self, filenames): |
466 | 85 QMainWindow.__init__(self, None) |
86 self.setWindowTitle(dmxclient._id) | |
352
9d1f323fb3d3
new bin/lightsim tied to dmxserver
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
87 |
466 | 88 w = QWidget() |
89 self.setCentralWidget(w) | |
90 mainLayout = QVBoxLayout() | |
91 w.setLayout(mainLayout) | |
463 | 92 |
466 | 93 self.glWidget = Surface(self, filenames, imgRescaleTo=128*2) |
94 | |
95 mainLayout.addWidget(self.glWidget) | |
96 | |
97 status = StatusKeys(mainLayout) | |
98 mainLayout.addWidget(status) | |
463 | 99 |
466 | 100 def requiredImages(graph): |
101 """filenames that we'll need to show, based on a config structure | |
102 like this: | |
103 ch:frontLeft a :Channel; | |
104 :previewLayer [ :path "lightsim/skyline/front-left.png" ] . | |
105 """ | |
106 filenames = [] | |
107 for lyr in graph.objects(None, L9['previewLayer']): | |
108 for p in graph.objects(lyr, L9['path']): | |
109 filenames.append(str(p)) | |
110 return filenames | |
353
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
111 |
463 | 112 if __name__ == '__main__': |
113 app = reactor.qApp | |
114 | |
115 graph = showconfig.getGraph() | |
353
941cfe1e1691
lightsim now reads levels from dmxserver
drewp@bigasterisk.com
parents:
352
diff
changeset
|
116 |
466 | 117 window = Window(requiredImages(graph)) |
463 | 118 window.show() |
119 | |
120 serv = Proxy(networking.dmxServerUrl()) | |
466 | 121 pollFreq = updatefreq.Updatefreq() |
122 LoopingCall(poll, graph, serv, pollFreq, window.glWidget).start(.05) | |
463 | 123 |
124 reactor.run() | |
125 |