-
-
Save anonymous/9df7a396cf695427d11be1320c3011db to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import array | |
import json | |
import time | |
from ola.ClientWrapper import ClientWrapper | |
from twisted.web import server, resource | |
from twisted.internet import reactor | |
NUMLAMPS=8 | |
TICK_INTERVAL=50 | |
class DMXValue(object): | |
def __init__(self, value): | |
self._value = value | |
self._target = value | |
self._orig = None | |
self._start = None | |
self._when = None | |
@property | |
def value(self): | |
if self._when: | |
now = time.time() | |
if self._when < now: | |
self._value = self._target | |
self._when = None | |
else: | |
self._value = self._orig + (self._target - self._orig) * ((now - self._start) / (self._when - self._start)) | |
return int(round(self._value)) | |
@value.setter | |
def value(self, value): | |
self._value = value | |
def set_value(self, value, fade=0): | |
if not fade: | |
self.value = value | |
else: | |
self._orig = self.value | |
self._target = value | |
now = time.time() | |
self._when = now + fade | |
self._start = now | |
class DMXLamp(object): | |
def __init__(self, red, green, blue): | |
self.red = red | |
self.green = green | |
self.blue = blue | |
@property | |
def rgb(self): | |
return {"red": self.red.value, | |
"green": self.green.value, | |
"blue": self.blue.value} | |
def set_rgb(self, red, green, blue, fade=None): | |
self.red.set_value(red, fade=fade) | |
self.green.set_value(green, fade=fade) | |
self.blue.set_value(blue, fade=fade) | |
dmx = [DMXValue(0) for _ in xrange(NUMLAMPS*5+1)] | |
lamps = [DMXLamp(red=dmx[1+5*i], green=dmx[2+5*i], blue=dmx[3+5*i]) for i in xrange(NUMLAMPS)] | |
class DMXController(object): | |
def __init__(self): | |
self.stop = False | |
self.wrapper = None | |
def startDMX(self): | |
self.wrapper = ClientWrapper() | |
self.wrapper.AddEvent(TICK_INTERVAL, self.SendDMXFrame) | |
self.wrapper.Run() | |
def DmxSent(self, state): | |
if not state.Succeeded(): | |
self.wrapper.Stop() | |
def SendDMXFrame(self): | |
if self.stop: | |
self.wrapper.Stop() | |
data = array.array('B') | |
for d in dmx: | |
data.append(d.value) | |
self.wrapper.AddEvent(TICK_INTERVAL, self.SendDMXFrame) | |
self.wrapper.Client().SendDmx(1, data, self.DmxSent) | |
class Simple(resource.Resource): | |
isLeaf = True | |
def render_GET(self, request): | |
request.responseHeaders.addRawHeader(b"content-type", b"application/json") | |
result = {"lamps": []} | |
for lamp in lamps: | |
result["lamps"].append(lamp.rgb) | |
return json.dumps(result) | |
def render_POST(self, request): | |
lamp_id = int(request.args["lamp_id"][0]) | |
red = int(request.args["red"][0]) | |
green = int(request.args["green"][0]) | |
blue = int(request.args["blue"][0]) | |
fade = float(request.args["fade"][0]) | |
lamps[lamp_id].set_rgb(red=red, green=green, blue=blue, fade=fade) | |
return "OK" | |
def main(): | |
controller = DMXController() | |
site = server.Site(Simple()) | |
reactor.listenTCP(1255, site) | |
reactor.callInThread(controller.startDMX) | |
reactor.run() | |
controller.stop = True | |
if __name__ == '__main__': | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment