Mercurial > code > home > repos > light9
annotate bin/effecteval @ 1101:3074f635ee23
effect page can write code edits back
Ignore-this: 756a3e3a40e4a6c823629e146d6c2799
author | Drew Perttula <drewp@bigasterisk.com> |
---|---|
date | Mon, 09 Jun 2014 03:56:25 +0000 |
parents | 1583e997fe0e |
children | 771f50f19b4b |
rev | line source |
---|---|
1018
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
1 #!bin/python |
1053
9937e2e3d17b
effecteval faster loop, stats page
Drew Perttula <drewp@bigasterisk.com>
parents:
1052
diff
changeset
|
2 from __future__ import division |
1018
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
3 from run_local import log |
1053
9937e2e3d17b
effecteval faster loop, stats page
Drew Perttula <drewp@bigasterisk.com>
parents:
1052
diff
changeset
|
4 from twisted.internet import reactor |
9937e2e3d17b
effecteval faster loop, stats page
Drew Perttula <drewp@bigasterisk.com>
parents:
1052
diff
changeset
|
5 from twisted.internet.defer import inlineCallbacks, returnValue |
1027
a38414bd3929
hacking on effecteval
Drew Perttula <drewp@bigasterisk.com>
parents:
1019
diff
changeset
|
6 import cyclone.web, cyclone.websocket, cyclone.httpclient |
1052
b370618ce723
split EffectNode out of effecteval
Drew Perttula <drewp@bigasterisk.com>
parents:
1051
diff
changeset
|
7 import sys, optparse, logging, subprocess, json, time, traceback |
1051
be016cd5e5c5
effecteval names its new curve after the sub you drop on it
Drew Perttula <drewp@bigasterisk.com>
parents:
1044
diff
changeset
|
8 from rdflib import URIRef, Literal |
1018
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
9 |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
10 sys.path.append(".") |
1033
b5ee7aa9341a
effecteval now runs effects in the background, following the current song, and sends dmx output
Drew Perttula <drewp@bigasterisk.com>
parents:
1027
diff
changeset
|
11 from light9 import networking, showconfig, Submaster, dmxclient |
1079
fce46850ed8c
consolidate the curve load/save rdf code more
Drew Perttula <drewp@bigasterisk.com>
parents:
1076
diff
changeset
|
12 from light9.curvecalc.curve import CurveResource |
fce46850ed8c
consolidate the curve load/save rdf code more
Drew Perttula <drewp@bigasterisk.com>
parents:
1076
diff
changeset
|
13 from light9.effecteval.effect import EffectNode |
1100
1583e997fe0e
pull EffectLoop to another module
Drew Perttula <drewp@bigasterisk.com>
parents:
1080
diff
changeset
|
14 from light9.effecteval.effectloop import EffectLoop |
1079
fce46850ed8c
consolidate the curve load/save rdf code more
Drew Perttula <drewp@bigasterisk.com>
parents:
1076
diff
changeset
|
15 from light9.greplin_cyclone import StatsForCyclone |
1052
b370618ce723
split EffectNode out of effecteval
Drew Perttula <drewp@bigasterisk.com>
parents:
1051
diff
changeset
|
16 from light9.namespaces import L9, RDF, RDFS |
1044
a2081b9adfe4
effecteval now takes dropped subs and makes new effects out of them
Drew Perttula <drewp@bigasterisk.com>
parents:
1043
diff
changeset
|
17 from light9.rdfdb.patch import Patch |
1079
fce46850ed8c
consolidate the curve load/save rdf code more
Drew Perttula <drewp@bigasterisk.com>
parents:
1076
diff
changeset
|
18 from light9.rdfdb.syncedgraph import SyncedGraph |
1053
9937e2e3d17b
effecteval faster loop, stats page
Drew Perttula <drewp@bigasterisk.com>
parents:
1052
diff
changeset
|
19 from greplin import scales |
1018
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
20 |
1060
473db8bebb8f
install a copy of cycloneerr.py
Drew Perttula <drewp@bigasterisk.com>
parents:
1055
diff
changeset
|
21 from lib.cycloneerr import PrettyErrorHandler |
1018
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
22 |
1054
4595a82f5a90
effecteval has a delete button on effect rows
Drew Perttula <drewp@bigasterisk.com>
parents:
1053
diff
changeset
|
23 class EffectEdit(PrettyErrorHandler, cyclone.web.RequestHandler): |
1018
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
24 def get(self): |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
25 self.write(open("light9/effecteval/effect.html").read()) |
1054
4595a82f5a90
effecteval has a delete button on effect rows
Drew Perttula <drewp@bigasterisk.com>
parents:
1053
diff
changeset
|
26 def delete(self): |
4595a82f5a90
effecteval has a delete button on effect rows
Drew Perttula <drewp@bigasterisk.com>
parents:
1053
diff
changeset
|
27 graph = self.settings.graph |
4595a82f5a90
effecteval has a delete button on effect rows
Drew Perttula <drewp@bigasterisk.com>
parents:
1053
diff
changeset
|
28 uri = URIRef(self.get_argument('uri')) |
4595a82f5a90
effecteval has a delete button on effect rows
Drew Perttula <drewp@bigasterisk.com>
parents:
1053
diff
changeset
|
29 with graph.currentState(tripleFilter=(None, L9['effect'], uri)) as g: |
4595a82f5a90
effecteval has a delete button on effect rows
Drew Perttula <drewp@bigasterisk.com>
parents:
1053
diff
changeset
|
30 song = ctx = list(g.subjects(L9['effect'], uri))[0] |
4595a82f5a90
effecteval has a delete button on effect rows
Drew Perttula <drewp@bigasterisk.com>
parents:
1053
diff
changeset
|
31 self.settings.graph.patch(Patch(delQuads=[ |
4595a82f5a90
effecteval has a delete button on effect rows
Drew Perttula <drewp@bigasterisk.com>
parents:
1053
diff
changeset
|
32 (song, L9['effect'], uri, ctx), |
4595a82f5a90
effecteval has a delete button on effect rows
Drew Perttula <drewp@bigasterisk.com>
parents:
1053
diff
changeset
|
33 ])) |
1055
6ce00faec207
move sequentialUri to the graph lib
Drew Perttula <drewp@bigasterisk.com>
parents:
1054
diff
changeset
|
34 |
1044
a2081b9adfe4
effecteval now takes dropped subs and makes new effects out of them
Drew Perttula <drewp@bigasterisk.com>
parents:
1043
diff
changeset
|
35 class SongEffects(PrettyErrorHandler, cyclone.web.RequestHandler): |
a2081b9adfe4
effecteval now takes dropped subs and makes new effects out of them
Drew Perttula <drewp@bigasterisk.com>
parents:
1043
diff
changeset
|
36 def post(self): |
a2081b9adfe4
effecteval now takes dropped subs and makes new effects out of them
Drew Perttula <drewp@bigasterisk.com>
parents:
1043
diff
changeset
|
37 song = URIRef(self.get_argument('uri')) |
1076
dc474426845d
effecteval better logging. everyone put their curve files in the right place.
Drew Perttula <drewp@bigasterisk.com>
parents:
1064
diff
changeset
|
38 dropped = URIRef(self.get_argument('drop')) |
1044
a2081b9adfe4
effecteval now takes dropped subs and makes new effects out of them
Drew Perttula <drewp@bigasterisk.com>
parents:
1043
diff
changeset
|
39 ctx = song |
1055
6ce00faec207
move sequentialUri to the graph lib
Drew Perttula <drewp@bigasterisk.com>
parents:
1054
diff
changeset
|
40 graph = self.settings.graph |
1076
dc474426845d
effecteval better logging. everyone put their curve files in the right place.
Drew Perttula <drewp@bigasterisk.com>
parents:
1064
diff
changeset
|
41 effect = graph.sequentialUri(song + "/effect-") |
dc474426845d
effecteval better logging. everyone put their curve files in the right place.
Drew Perttula <drewp@bigasterisk.com>
parents:
1064
diff
changeset
|
42 curve = graph.sequentialUri(song + "/curve-") |
1051
be016cd5e5c5
effecteval names its new curve after the sub you drop on it
Drew Perttula <drewp@bigasterisk.com>
parents:
1044
diff
changeset
|
43 |
1055
6ce00faec207
move sequentialUri to the graph lib
Drew Perttula <drewp@bigasterisk.com>
parents:
1054
diff
changeset
|
44 with graph.currentState( |
1076
dc474426845d
effecteval better logging. everyone put their curve files in the right place.
Drew Perttula <drewp@bigasterisk.com>
parents:
1064
diff
changeset
|
45 tripleFilter=(dropped, RDFS.label, None)) as g: |
dc474426845d
effecteval better logging. everyone put their curve files in the right place.
Drew Perttula <drewp@bigasterisk.com>
parents:
1064
diff
changeset
|
46 droppedSubLabel = g.label(dropped) |
1079
fce46850ed8c
consolidate the curve load/save rdf code more
Drew Perttula <drewp@bigasterisk.com>
parents:
1076
diff
changeset
|
47 |
fce46850ed8c
consolidate the curve load/save rdf code more
Drew Perttula <drewp@bigasterisk.com>
parents:
1076
diff
changeset
|
48 cr = CurveResource(graph, curve) |
fce46850ed8c
consolidate the curve load/save rdf code more
Drew Perttula <drewp@bigasterisk.com>
parents:
1076
diff
changeset
|
49 cr.newCurve(ctx, label=Literal('sub %s' % droppedSubLabel)) |
fce46850ed8c
consolidate the curve load/save rdf code more
Drew Perttula <drewp@bigasterisk.com>
parents:
1076
diff
changeset
|
50 cr.saveCurve() |
1055
6ce00faec207
move sequentialUri to the graph lib
Drew Perttula <drewp@bigasterisk.com>
parents:
1054
diff
changeset
|
51 graph.patch(Patch(addQuads=[ |
1051
be016cd5e5c5
effecteval names its new curve after the sub you drop on it
Drew Perttula <drewp@bigasterisk.com>
parents:
1044
diff
changeset
|
52 (song, L9['curve'], curve, ctx), |
1044
a2081b9adfe4
effecteval now takes dropped subs and makes new effects out of them
Drew Perttula <drewp@bigasterisk.com>
parents:
1043
diff
changeset
|
53 (song, L9['effect'], effect, ctx), |
a2081b9adfe4
effecteval now takes dropped subs and makes new effects out of them
Drew Perttula <drewp@bigasterisk.com>
parents:
1043
diff
changeset
|
54 (effect, RDF.type, L9['Effect'], ctx), |
a2081b9adfe4
effecteval now takes dropped subs and makes new effects out of them
Drew Perttula <drewp@bigasterisk.com>
parents:
1043
diff
changeset
|
55 (effect, L9['code'], |
1076
dc474426845d
effecteval better logging. everyone put their curve files in the right place.
Drew Perttula <drewp@bigasterisk.com>
parents:
1064
diff
changeset
|
56 Literal('out = sub(%s, intensity=%s)' % (dropped.n3(), curve.n3())), |
1044
a2081b9adfe4
effecteval now takes dropped subs and makes new effects out of them
Drew Perttula <drewp@bigasterisk.com>
parents:
1043
diff
changeset
|
57 ctx), |
1076
dc474426845d
effecteval better logging. everyone put their curve files in the right place.
Drew Perttula <drewp@bigasterisk.com>
parents:
1064
diff
changeset
|
58 ])) |
1079
fce46850ed8c
consolidate the curve load/save rdf code more
Drew Perttula <drewp@bigasterisk.com>
parents:
1076
diff
changeset
|
59 |
1044
a2081b9adfe4
effecteval now takes dropped subs and makes new effects out of them
Drew Perttula <drewp@bigasterisk.com>
parents:
1043
diff
changeset
|
60 |
1043
aa45e5379c5a
effecteval improvements. displays current song+effect tree
Drew Perttula <drewp@bigasterisk.com>
parents:
1041
diff
changeset
|
61 class SongEffectsUpdates(cyclone.websocket.WebSocketHandler): |
aa45e5379c5a
effecteval improvements. displays current song+effect tree
Drew Perttula <drewp@bigasterisk.com>
parents:
1041
diff
changeset
|
62 def connectionMade(self, *args, **kwargs): |
aa45e5379c5a
effecteval improvements. displays current song+effect tree
Drew Perttula <drewp@bigasterisk.com>
parents:
1041
diff
changeset
|
63 self.graph = self.settings.graph |
aa45e5379c5a
effecteval improvements. displays current song+effect tree
Drew Perttula <drewp@bigasterisk.com>
parents:
1041
diff
changeset
|
64 self.graph.addHandler(self.updateClient) |
aa45e5379c5a
effecteval improvements. displays current song+effect tree
Drew Perttula <drewp@bigasterisk.com>
parents:
1041
diff
changeset
|
65 |
aa45e5379c5a
effecteval improvements. displays current song+effect tree
Drew Perttula <drewp@bigasterisk.com>
parents:
1041
diff
changeset
|
66 def updateClient(self): |
aa45e5379c5a
effecteval improvements. displays current song+effect tree
Drew Perttula <drewp@bigasterisk.com>
parents:
1041
diff
changeset
|
67 # todo: abort if client is gone |
aa45e5379c5a
effecteval improvements. displays current song+effect tree
Drew Perttula <drewp@bigasterisk.com>
parents:
1041
diff
changeset
|
68 playlist = self.graph.value(showconfig.showUri(), L9['playList']) |
aa45e5379c5a
effecteval improvements. displays current song+effect tree
Drew Perttula <drewp@bigasterisk.com>
parents:
1041
diff
changeset
|
69 songs = list(self.graph.items(playlist)) |
aa45e5379c5a
effecteval improvements. displays current song+effect tree
Drew Perttula <drewp@bigasterisk.com>
parents:
1041
diff
changeset
|
70 out = [] |
aa45e5379c5a
effecteval improvements. displays current song+effect tree
Drew Perttula <drewp@bigasterisk.com>
parents:
1041
diff
changeset
|
71 for s in songs: |
aa45e5379c5a
effecteval improvements. displays current song+effect tree
Drew Perttula <drewp@bigasterisk.com>
parents:
1041
diff
changeset
|
72 out.append({'uri': s, 'label': self.graph.label(s)}) |
1054
4595a82f5a90
effecteval has a delete button on effect rows
Drew Perttula <drewp@bigasterisk.com>
parents:
1053
diff
changeset
|
73 out[-1]['effects'] = [{'uri': uri} for uri in sorted(self.graph.objects(s, L9['effect']))] |
1043
aa45e5379c5a
effecteval improvements. displays current song+effect tree
Drew Perttula <drewp@bigasterisk.com>
parents:
1041
diff
changeset
|
74 self.sendMessage({'songs': out}) |
aa45e5379c5a
effecteval improvements. displays current song+effect tree
Drew Perttula <drewp@bigasterisk.com>
parents:
1041
diff
changeset
|
75 |
aa45e5379c5a
effecteval improvements. displays current song+effect tree
Drew Perttula <drewp@bigasterisk.com>
parents:
1041
diff
changeset
|
76 |
aa45e5379c5a
effecteval improvements. displays current song+effect tree
Drew Perttula <drewp@bigasterisk.com>
parents:
1041
diff
changeset
|
77 class EffectUpdates(cyclone.websocket.WebSocketHandler): |
1018
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
78 """ |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
79 stays alive for the life of the effect page |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
80 """ |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
81 def connectionMade(self, *args, **kwargs): |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
82 log.info("websocket opened") |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
83 self.uri = URIRef(self.get_argument('uri')) |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
84 self.sendMessage({'hello': repr(self)}) |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
85 |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
86 self.graph = self.settings.graph |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
87 self.graph.addHandler(self.updateClient) |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
88 |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
89 def updateClient(self): |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
90 # todo: if client has dropped, abort and don't get any more |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
91 # graph updates |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
92 self.sendMessage({'code': self.graph.value(self.uri, L9['code'])}) |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
93 |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
94 def connectionLost(self, reason): |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
95 log.info("websocket closed") |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
96 |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
97 def messageReceived(self, message): |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
98 log.info("got message %s" % message) |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
99 # write a patch back to the graph |
1101
3074f635ee23
effect page can write code edits back
Drew Perttula <drewp@bigasterisk.com>
parents:
1100
diff
changeset
|
100 |
3074f635ee23
effect page can write code edits back
Drew Perttula <drewp@bigasterisk.com>
parents:
1100
diff
changeset
|
101 class Code(PrettyErrorHandler, cyclone.web.RequestHandler): |
3074f635ee23
effect page can write code edits back
Drew Perttula <drewp@bigasterisk.com>
parents:
1100
diff
changeset
|
102 def put(self): |
3074f635ee23
effect page can write code edits back
Drew Perttula <drewp@bigasterisk.com>
parents:
1100
diff
changeset
|
103 effect = URIRef(self.get_argument('uri')) |
3074f635ee23
effect page can write code edits back
Drew Perttula <drewp@bigasterisk.com>
parents:
1100
diff
changeset
|
104 code = Literal(self.get_argument('code')) |
3074f635ee23
effect page can write code edits back
Drew Perttula <drewp@bigasterisk.com>
parents:
1100
diff
changeset
|
105 with self.settings.graph.currentState(tripleFilter=(None, L9['effect'], effect)) as g: |
3074f635ee23
effect page can write code edits back
Drew Perttula <drewp@bigasterisk.com>
parents:
1100
diff
changeset
|
106 song = g.subjects(L9['effect'], effect).next() |
3074f635ee23
effect page can write code edits back
Drew Perttula <drewp@bigasterisk.com>
parents:
1100
diff
changeset
|
107 self.settings.graph.patchObject( |
3074f635ee23
effect page can write code edits back
Drew Perttula <drewp@bigasterisk.com>
parents:
1100
diff
changeset
|
108 context=song, |
3074f635ee23
effect page can write code edits back
Drew Perttula <drewp@bigasterisk.com>
parents:
1100
diff
changeset
|
109 subject=effect, |
3074f635ee23
effect page can write code edits back
Drew Perttula <drewp@bigasterisk.com>
parents:
1100
diff
changeset
|
110 predicate=L9['code'], |
3074f635ee23
effect page can write code edits back
Drew Perttula <drewp@bigasterisk.com>
parents:
1100
diff
changeset
|
111 newObject=code) |
3074f635ee23
effect page can write code edits back
Drew Perttula <drewp@bigasterisk.com>
parents:
1100
diff
changeset
|
112 self.send_error(202) |
1019 | 113 |
114 class EffectEval(PrettyErrorHandler, cyclone.web.RequestHandler): | |
1027
a38414bd3929
hacking on effecteval
Drew Perttula <drewp@bigasterisk.com>
parents:
1019
diff
changeset
|
115 @inlineCallbacks |
1019 | 116 def get(self): |
1033
b5ee7aa9341a
effecteval now runs effects in the background, following the current song, and sends dmx output
Drew Perttula <drewp@bigasterisk.com>
parents:
1027
diff
changeset
|
117 # return dmx list for that effect |
1019 | 118 uri = URIRef(self.get_argument('uri')) |
1027
a38414bd3929
hacking on effecteval
Drew Perttula <drewp@bigasterisk.com>
parents:
1019
diff
changeset
|
119 response = yield cyclone.httpclient.fetch( |
a38414bd3929
hacking on effecteval
Drew Perttula <drewp@bigasterisk.com>
parents:
1019
diff
changeset
|
120 networking.musicPlayer.path('time')) |
a38414bd3929
hacking on effecteval
Drew Perttula <drewp@bigasterisk.com>
parents:
1019
diff
changeset
|
121 songTime = json.loads(response.body)['t'] |
1033
b5ee7aa9341a
effecteval now runs effects in the background, following the current song, and sends dmx output
Drew Perttula <drewp@bigasterisk.com>
parents:
1027
diff
changeset
|
122 |
b5ee7aa9341a
effecteval now runs effects in the background, following the current song, and sends dmx output
Drew Perttula <drewp@bigasterisk.com>
parents:
1027
diff
changeset
|
123 node = EffectNode(self.settings.graph, uri) |
b5ee7aa9341a
effecteval now runs effects in the background, following the current song, and sends dmx output
Drew Perttula <drewp@bigasterisk.com>
parents:
1027
diff
changeset
|
124 outSub = node.eval(songTime) |
b5ee7aa9341a
effecteval now runs effects in the background, following the current song, and sends dmx output
Drew Perttula <drewp@bigasterisk.com>
parents:
1027
diff
changeset
|
125 self.write(json.dumps(outSub.get_dmx_list())) |
b5ee7aa9341a
effecteval now runs effects in the background, following the current song, and sends dmx output
Drew Perttula <drewp@bigasterisk.com>
parents:
1027
diff
changeset
|
126 |
b5ee7aa9341a
effecteval now runs effects in the background, following the current song, and sends dmx output
Drew Perttula <drewp@bigasterisk.com>
parents:
1027
diff
changeset
|
127 |
b5ee7aa9341a
effecteval now runs effects in the background, following the current song, and sends dmx output
Drew Perttula <drewp@bigasterisk.com>
parents:
1027
diff
changeset
|
128 # Completely not sure where the effect background loop should |
b5ee7aa9341a
effecteval now runs effects in the background, following the current song, and sends dmx output
Drew Perttula <drewp@bigasterisk.com>
parents:
1027
diff
changeset
|
129 # go. Another process could own it, and get this request repeatedly: |
1019 | 130 class SongEffectsEval(PrettyErrorHandler, cyclone.web.RequestHandler): |
131 def get(self): | |
132 song = URIRef(self.get_argument('song')) | |
133 effects = effectsForSong(self.settings.graph, song) | |
1033
b5ee7aa9341a
effecteval now runs effects in the background, following the current song, and sends dmx output
Drew Perttula <drewp@bigasterisk.com>
parents:
1027
diff
changeset
|
134 raise NotImplementedError |
1019 | 135 self.write(maxDict(effectDmxDict(e) for e in effects)) |
136 # return dmx dict for all effects in the song, already combined | |
1033
b5ee7aa9341a
effecteval now runs effects in the background, following the current song, and sends dmx output
Drew Perttula <drewp@bigasterisk.com>
parents:
1027
diff
changeset
|
137 |
1018
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
138 class App(object): |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
139 def __init__(self, show): |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
140 self.show = show |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
141 self.graph = SyncedGraph("effectEval") |
1043
aa45e5379c5a
effecteval improvements. displays current song+effect tree
Drew Perttula <drewp@bigasterisk.com>
parents:
1041
diff
changeset
|
142 self.graph.initiallySynced.addCallback(self.launch) |
aa45e5379c5a
effecteval improvements. displays current song+effect tree
Drew Perttula <drewp@bigasterisk.com>
parents:
1041
diff
changeset
|
143 |
1053
9937e2e3d17b
effecteval faster loop, stats page
Drew Perttula <drewp@bigasterisk.com>
parents:
1052
diff
changeset
|
144 self.stats = scales.collection('/', |
9937e2e3d17b
effecteval faster loop, stats page
Drew Perttula <drewp@bigasterisk.com>
parents:
1052
diff
changeset
|
145 scales.PmfStat('sendLevels'), |
9937e2e3d17b
effecteval faster loop, stats page
Drew Perttula <drewp@bigasterisk.com>
parents:
1052
diff
changeset
|
146 scales.PmfStat('getMusic'), |
9937e2e3d17b
effecteval faster loop, stats page
Drew Perttula <drewp@bigasterisk.com>
parents:
1052
diff
changeset
|
147 scales.PmfStat('writeDmx'), |
9937e2e3d17b
effecteval faster loop, stats page
Drew Perttula <drewp@bigasterisk.com>
parents:
1052
diff
changeset
|
148 scales.IntStat('errors'), |
9937e2e3d17b
effecteval faster loop, stats page
Drew Perttula <drewp@bigasterisk.com>
parents:
1052
diff
changeset
|
149 ) |
9937e2e3d17b
effecteval faster loop, stats page
Drew Perttula <drewp@bigasterisk.com>
parents:
1052
diff
changeset
|
150 |
1043
aa45e5379c5a
effecteval improvements. displays current song+effect tree
Drew Perttula <drewp@bigasterisk.com>
parents:
1041
diff
changeset
|
151 def launch(self, *args): |
1053
9937e2e3d17b
effecteval faster loop, stats page
Drew Perttula <drewp@bigasterisk.com>
parents:
1052
diff
changeset
|
152 self.loop = EffectLoop(self.graph, self.stats) |
9937e2e3d17b
effecteval faster loop, stats page
Drew Perttula <drewp@bigasterisk.com>
parents:
1052
diff
changeset
|
153 |
1018
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
154 SFH = cyclone.web.StaticFileHandler |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
155 self.cycloneApp = cyclone.web.Application(handlers=[ |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
156 (r'/()', SFH, |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
157 {'path': 'light9/effecteval', 'default_filename': 'index.html'}), |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
158 (r'/effect', EffectEdit), |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
159 (r'/(websocket\.js)', SFH, {'path': 'light9/rdfdb/web/'}), |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
160 (r'/effect\.js', StaticCoffee, {'src': 'light9/effecteval/effect.coffee'}), |
1041
a4632a7b2e17
upgrade knockout and jquery, simplify the static/ dirs for all web services
Drew Perttula <drewp@bigasterisk.com>
parents:
1033
diff
changeset
|
161 (r'/index\.js', StaticCoffee, {'src': 'light9/effecteval/index.coffee'}), |
a4632a7b2e17
upgrade knockout and jquery, simplify the static/ dirs for all web services
Drew Perttula <drewp@bigasterisk.com>
parents:
1033
diff
changeset
|
162 (r'/effectUpdates', EffectUpdates), |
1101
3074f635ee23
effect page can write code edits back
Drew Perttula <drewp@bigasterisk.com>
parents:
1100
diff
changeset
|
163 (r'/code', Code), |
1041
a4632a7b2e17
upgrade knockout and jquery, simplify the static/ dirs for all web services
Drew Perttula <drewp@bigasterisk.com>
parents:
1033
diff
changeset
|
164 (r'/songEffectsUpdates', SongEffectsUpdates), |
1018
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
165 (r'/static/(.*)', SFH, {'path': 'static/'}), |
1019 | 166 (r'/effect/eval', EffectEval), |
1044
a2081b9adfe4
effecteval now takes dropped subs and makes new effects out of them
Drew Perttula <drewp@bigasterisk.com>
parents:
1043
diff
changeset
|
167 (r'/songEffects', SongEffects), |
1019 | 168 (r'/songEffects/eval', SongEffectsEval), |
1053
9937e2e3d17b
effecteval faster loop, stats page
Drew Perttula <drewp@bigasterisk.com>
parents:
1052
diff
changeset
|
169 (r'/stats', StatsForCyclone), |
9937e2e3d17b
effecteval faster loop, stats page
Drew Perttula <drewp@bigasterisk.com>
parents:
1052
diff
changeset
|
170 ], debug=True, graph=self.graph, stats=self.stats) |
1043
aa45e5379c5a
effecteval improvements. displays current song+effect tree
Drew Perttula <drewp@bigasterisk.com>
parents:
1041
diff
changeset
|
171 reactor.listenTCP(networking.effectEval.port, self.cycloneApp) |
aa45e5379c5a
effecteval improvements. displays current song+effect tree
Drew Perttula <drewp@bigasterisk.com>
parents:
1041
diff
changeset
|
172 log.info("listening on %s" % networking.effectEval.port) |
1053
9937e2e3d17b
effecteval faster loop, stats page
Drew Perttula <drewp@bigasterisk.com>
parents:
1052
diff
changeset
|
173 |
1018
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
174 class StaticCoffee(PrettyErrorHandler, cyclone.web.RequestHandler): |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
175 def initialize(self, src): |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
176 super(StaticCoffee, self).initialize() |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
177 self.src = src |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
178 def get(self): |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
179 self.set_header('Content-Type', 'application/javascript') |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
180 self.write(subprocess.check_output([ |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
181 '/usr/bin/coffee', '--compile', '--print', self.src])) |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
182 |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
183 |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
184 if __name__ == "__main__": |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
185 parser = optparse.OptionParser() |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
186 parser.add_option('--show', |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
187 help='show URI, like http://light9.bigasterisk.com/show/dance2008', |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
188 default=showconfig.showUri()) |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
189 parser.add_option("-v", "--verbose", action="store_true", |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
190 help="logging.DEBUG") |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
191 parser.add_option("--twistedlog", action="store_true", |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
192 help="twisted logging") |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
193 (options, args) = parser.parse_args() |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
194 |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
195 log.setLevel(logging.DEBUG if options.verbose else logging.INFO) |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
196 |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
197 if not options.show: |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
198 raise ValueError("missing --show http://...") |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
199 |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
200 app = App(URIRef(options.show)) |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
201 if options.twistedlog: |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
202 from twisted.python import log as twlog |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
203 twlog.startLogging(sys.stderr) |
e28a443bd153
initial effecteval that can propagate changes from the graph to a web page
drewp@bigasterisk.com
parents:
diff
changeset
|
204 reactor.run() |