#!bin/python
from __future__ import division
from rdflib import Graph, URIRef, Literal
from twisted.internet import reactor
from twisted.web.server import Site
from txzmq import ZmqEndpoint, ZmqFactory, ZmqPullConnection
import json
import klein
import run_local
from light9.collector.output import EnttecDmx, Udmx
from light9.collector.collector import Collector
from light9.namespaces import L9
from light9 import networking
class WebServer(object):
app = klein.Klein()
def __init__(self, collector):
self.collector = collector
@app.route('/attrs', methods=['PUT'])
def putAttrs(self, request):
body = json.load(request.content)
settings = []
for device, attr, value in body['settings']:
settings.append((URIRef(device), URIRef(attr), Literal(value)))
self.collector.setAttrs(body['client'],
body['clientSession'],
settings)
request.setResponseCode(202)
def startZmq(port, collector):
zf = ZmqFactory()
e = ZmqEndpoint('bind', 'tcp://*:%s' % port)
s = ZmqPullConnection(zf, e)
def onPull(message):
# todo: new compressed protocol where you send all URIs up
# front and then use small ints to refer to devices and
# attributes in subsequent requests.
message[0]
collector.setAttrs()
s.onPull = onPull
def main():
config = Graph()
# todo: replace with rdfdb's loaded graph, and notice changes
config.parse('show/dance2016/output.n3', format='n3')
# todo: drive outputs with config files
outputs = [EnttecDmx(L9['output/dmx0/'], 70, '/dev/dmx0'),
Udmx(L9['output/udmx/'], 70)]
c = Collector(config, outputs)
server = WebServer(c)
startZmq(networking.collectorZmq.port, c)
reactor.listenTCP(networking.collector.port,
Site(server.app.resource()),
interface='::')
reactor.run()
if __name__ == '__main__':
main()