Changeset - 6059de6659c3
[Not reviewed]
default
2 4 2
Drew Perttula - 8 years ago 2017-06-01 09:03:09
drewp@bigasterisk.com
move effects/ page into web/. fix homepage list. rm old subserver code.
Ignore-this: df247afa405eb7e3a80891c2806d5fed
6 files changed with 21 insertions and 79 deletions:
0 comments (0 inline, 0 general)
bin/effecteval
Show inline comments
 
#!bin/python
 

	
 
from __future__ import division
 
from run_local import log
 
from twisted.internet import reactor
 
from twisted.internet.defer import inlineCallbacks, returnValue
 
import cyclone.web, cyclone.websocket, cyclone.httpclient
 
import sys, optparse, logging, subprocess, json, itertools
 
from rdflib import URIRef, Literal
 

	
 
sys.path.append('/usr/lib/pymodules/python2.7/') # for numpy, on rpi
 
sys.path.append('/usr/lib/python2.7/dist-packages') # For numpy
 
from light9 import networking, showconfig
 
from light9.effecteval.effect import EffectNode
bin/subserver
Show inline comments
 
@@ -8,63 +8,24 @@ import sys, optparse, logging, json, sub
 
from dateutil.tz import tzlocal
 
from twisted.internet import reactor, defer
 
import cyclone.web, cyclone.httpclient, cyclone.websocket
 
from rdflib import RDF, URIRef, Literal
 
import pyjade.utils
 
from light9.rdfdb.syncedgraph import SyncedGraph
 
from light9.rdfdb.patch import Patch
 
from light9.namespaces import L9, DCTERMS
 
from light9 import networking, showconfig
 

	
 
from lib.cycloneerr import PrettyErrorHandler
 
        
 
liveClients = set()
 
def sendToLiveClients(d=None, asJson=None):
 
    j = asJson or json.dumps(d)
 
    for c in liveClients:
 
        c.sendMessage(j)
 

	
 
class Live(cyclone.websocket.WebSocketHandler):
 
    def connectionMade(self, *args, **kwargs):
 
        log.info("websocket opened")
 
        liveClients.add(self)
 
        self.settings.onNewClient()
 

	
 
    def connectionLost(self, reason):
 
        log.info("websocket closed")
 
        liveClients.remove(self)
 

	
 
    def messageReceived(self, message):
 
        log.info("got message %s" % message)
 
        self.sendMessage(message)
 
        
 
class EffectsUpdates(cyclone.websocket.WebSocketHandler):
 
    def connectionMade(self, *args, **kwargs):
 
        self.connected = True
 
        self.settings.graph.addHandler(self.onGraphChange)
 
        
 
    def connectionLost(self, reason):
 
        self.connected = False
 
        
 
    def onGraphChange(self):
 
        if not self.connected:
 
            return
 
        graph = self.settings.graph
 
        classes = []
 
        for e in graph.subjects(RDF.type, L9['Effect']):
 
            classes.append({'uri': e,
 
                            'label': graph.label(e),
 
                            'code': graph.value(e, L9['code'])})
 
        self.sendMessage({'classes': classes})
 

	
 
class Static(PrettyErrorHandler, cyclone.web.StaticFileHandler):
 
    def get(self, path, *args, **kw):
 
        if path in ['', 'effects']:
 
            return self.respondStaticJade("light9/subserver/%s.jade" %
 
                                          (path or 'index'))
 
            
 
        if path.endswith(".js"):
 
            return self.responseStaticCoffee(
 
                'light9/subserver/%s' %
 
                path.replace(".js", ".coffee")) # potential security hole
 

	
 
        cyclone.web.StaticFileHandler.get(self, path, *args, **kw)
 
@@ -107,52 +68,22 @@ def newestImage(subject):
 
    return newest[1]
 
        
 
if __name__ == "__main__":
 
    parser = optparse.OptionParser()
 
    parser.add_option("-v", "--verbose", action="store_true",
 
                      help="logging.DEBUG")
 
    (options, args) = parser.parse_args()
 

	
 
    log.setLevel(logging.DEBUG if options.verbose else logging.INFO)
 

	
 
    graph = SyncedGraph(networking.rdfdb.url, "subServer")
 

	
 
    d = {}
 
    def updateSubs():
 
        subs = []
 
        for sub in sorted(graph.subjects(RDF.type, L9['Submaster'])):
 
            rec = {'uri' : sub}
 
            rec['isLocal'] = graph.contains((sub, RDF.type,
 
                                             L9['LocalSubmaster']))
 
            rec['label'] = graph.label(sub)
 
            rec['img'] = newestImage(sub)
 
            subs.append(rec)
 
        
 
        d.clear()
 
        d.update({'subs': subs})
 

	
 
        d['chases'] = []
 
        for chase in sorted(graph.subjects(RDF.type, L9['Chase'])):
 
            fakeLabel = chase.rsplit('/', 1)[-1]
 
            d['chases'].append({
 
                'uri': chase,
 
                'label': fakeLabel,
 
            })
 
        
 
        sendToLiveClients(d=d)
 
    def onNewClient():
 
        sendToLiveClients(d=d)
 
        
 
    graph.addHandler(updateSubs)
 
    
 
    
 
    port = networking.subServer.port
 
    reactor.listenTCP(port, cyclone.web.Application(handlers=[
 
        (r'/live', Live),
 
        (r'/effectsUpdates', EffectsUpdates),
 
        (r'/snapshot', Snapshot),
 
        (r'/(.*)', Static,
 
         {"path" : "light9/subserver",
 
          "default_filename" : "index.jade"}),
 
        ], debug=True, graph=graph, onNewClient=onNewClient))
 
    log.info("serving on %s" % port)
 
    reactor.run()
light9/web/effects/effects.coffee
Show inline comments
 
file renamed from light9/subserver/effects2.coffee to light9/web/effects/effects.coffee
light9/web/effects/index.html
Show inline comments
 
file renamed from light9/subserver/effects2.html to light9/web/effects/index.html
 
@@ -36,26 +36,27 @@
 
                   content-type="application/x-www-form-urlencoded"></iron-ajax>
 
          <button on-click="onAdd">Add to current song</button>
 
          <button on-mousedown="onMomentaryPress"
 
                  on-mouseup="onMomentaryRelease">Add momentary</button>
 

	
 
      </template>
 
    </dom-module>
 
    
 
    <dom-module id="light9-effects">
 
      <template>
 
        <style>
 
        </style>
 
        <h1>Effects</h1>
 
        <rdfdb-synced-graph graph="{{graph}}"></rdfdb-synced-graph>
 

	
 
        <template is="dom-repeat" items="{{effectClasses}}">
 
          <light9-effect-class graph="{{graph}}" uri="{{item}}"></light9-effect-class>
 
        </template>
 
        
 
      </template>
 
    </dom-module>       
 

	
 
    <light9-effects></light9-effects>
 

	
 
    <script src="effects2.js"></script>
 
    <script src="effects.js"></script>
 
  </body>
 
</html>
light9/web/index.html
Show inline comments
 
<!doctype html>
 
<html>
 
  <head>
 
    <title></title>
 
    <title>light9 home</title>
 
    <meta charset="utf-8" />
 
    <script src="/lib/webcomponentsjs/webcomponents-lite.min.js"></script>
 
    <link rel="stylesheet" href="/style.css">
 
    <script src="/lib/webcomponentsjs/webcomponents-lite.min.js"></script>
 
    <link rel="import" href="/lib/polymer/polymer.html">
 
  </head>
 
  <body>
 
    <dom-module id="service-button-row">
 
      <template>
 
        <style>
 
         div {
 
             display: flex;
 
             justify-content: space-between;
 
             padding: 2px 3px;
 
         }
 
         div:hover {
 
             background: gray;
 
         }
 
         .left {
 
             display: inline-block;
 
             margin-right: 3px;
 
             flex-grow: 1;
 
         }
 
         .window {
 
         }
 
        </style>
 
        <div>
 
          <span class="left"><a class="big" href="{{name}}/">{{name}}</a></span>
 
          <span><button on-click="click">window</button></span>
 
          <span class="window"><button on-click="click">window</button></span>
 
          <span><a href="{{name}}/stats">stats</a></span>
 
        </div>
 
      </template>
 
      <script>
 
       HTMLImports.whenReady(function () {
 
           Polymer({
 
               is: "service-button-row",
 
               properties: {
 
                   name: String,
 
               },
 
               click: function() {
 
                   window.open(this.name + '/', '_blank',
 
                               'scrollbars=1,resizable=1,titlebar=0,location=0');
 
               }
 
           });
 
       });
 
      </script>
 
    </dom-module>
 
    
 
    <h1>light9 home page</h1>
 

	
 
    <div style="float: left">
 
      <service-button-row name="."></service-button-row>
 
      <service-button-row name="rdfdb"></service-button-row>
 
      <hr>
 
      <service-button-row name="ascoltami"></service-button-row>
 
      <hr>
 
      <service-button-row name="picamserve"></service-button-row>
 
      <service-button-row name="vidref"></service-button-row>
 
      <hr>
 
      <service-button-row name="collector"></service-button-row>
 
      <service-button-row name="effectSequencer"></service-button-row>
 
      <service-button-row name="ascoltami"></service-button-row>
 
      <service-button-row name="live"></service-button-row>
 
      <service-button-row name="effects"></service-button-row>
 
      <service-button-row name="timeline"></service-button-row>
 
      <service-button-row name="paint"></service-button-row>
 
      <service-button-row name="effectEval"></service-button-row>
 
      <hr>
 
      <service-button-row name="subServer"></service-button-row>
 
      <service-button-row name="picamserve"></service-button-row>
 
      <service-button-row name="vidref"></service-button-row>
 
      <service-button-row name="live"></service-button-row>
 
      <service-button-row name="timeline"></service-button-row>
 
      <service-button-row name="subComposer"></service-button-row>
 
    </div>
 
    
 
  </body>
 
</html>
makefile
Show inline comments
 
@@ -98,24 +98,24 @@ darcs_show_checkpoint:
 
	darcs rec -a -m "checkpoint show data" ${LIGHT9_SHOW}
 

	
 
/usr/share/arduino/Arduino.mk:
 
	sudo aptitude install arduino-mk
 

	
 
arduino_upload: /usr/share/arduino/Arduino.mk
 
	cd rgbled
 
	make upload
 

	
 
effect_node_setup: create_virtualenv packages binexec install_python_deps
 

	
 
coffee:
 
	zsh -c 'coffee -cw light9/web/{.,live,timeline,paint}/*.coffee'
 
	zsh -c 'coffee -cw light9/web/{.,live,timeline,paint,effects}/*.coffee'
 

	
 
env-mypy/bin/mypy:
 
	mkdir -p env-mypy
 
	virtualenv -p /usr/bin/python3  env-mypy/
 
	env-mypy/bin/pip install mypy==0.510 lxml==3.7.3
 

	
 
mypy-collector: env-mypy/bin/mypy
 
	env-mypy/bin/mypy --py2 --ignore-missing-imports --strict-optional --custom-typeshed-dir stubs --html-report /tmp/rep bin/collector light9/collector/*.py
 

	
 
mypy-paint: env-mypy/bin/mypy
 
	env-mypy/bin/mypy --py2 --ignore-missing-imports --strict-optional --custom-typeshed-dir stubs --html-report /tmp/rep light9/paint/*.py
0 comments (0 inline, 0 general)