Skip to content

Instantly share code, notes, and snippets.

/dmxserver.py Secret

Created December 27, 2017 21:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anonymous/9df7a396cf695427d11be1320c3011db to your computer and use it in GitHub Desktop.
Save anonymous/9df7a396cf695427d11be1320c3011db to your computer and use it in GitHub Desktop.
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