diff service/starArduino/starArduino.py @ 4:be855a111619

move a bunch of services into this tree, give them all web status pages Ignore-this: a11e90f9d2cd9470565c743f54943c4b
author drewp@bigasterisk.com
date Mon, 08 Aug 2011 00:31:31 -0700
parents
children 4bf2be19c6c4
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/service/starArduino/starArduino.py	Mon Aug 08 00:31:31 2011 -0700
@@ -0,0 +1,66 @@
+"""
+arduino driver for the nightlight+buttons+temp setup running on star
+
+"""
+from __future__ import division
+
+import sys, jsonlib
+from twisted.internet import reactor, task
+import cyclone.web
+
+sys.path.append("/my/proj/pixel/shiftweb")
+from drvarduino import ShiftbriteArduino
+from shiftweb import hexFromRgb, rgbFromHex
+
+sys.path.append("/my/proj/homeauto/lib")
+from cycloneerr import PrettyErrorHandler
+from logsetup import log
+
+sys.path.append("/my/proj/ariremote")
+from oscserver import ArduinoWatcher
+
+class Index(PrettyErrorHandler, cyclone.web.RequestHandler):
+    def get(self):
+        self.settings.arduino.ping()
+        
+        self.set_header("Content-Type", "application/xhtml+xml")
+        self.write(open("index.html").read())
+
+class Temperature(PrettyErrorHandler, cyclone.web.RequestHandler):
+    def get(self):
+        f = self.settings.arduino.getTemperature()
+        self.set_header("Content-Type", "application/json")
+        self.write(jsonlib.write({"temp" : f}))
+
+class Brite(PrettyErrorHandler, cyclone.web.RequestHandler):
+    def get(self, pos):
+        self.set_header("Content-Type", "text/plain")
+        self.write(hexFromRgb(self.settings.colors[int(pos)]))
+
+    def put(self, pos):
+        channel = int(pos)
+        colors = self.settings.colors
+        colors[channel] = rgbFromHex(self.request.body)
+        self.settings.arduino.update(colors)
+        self.set_header("Content-Type", "text/plain")
+        self.write("updated %r" % colors)
+    
+class Graph(PrettyErrorHandler, cyclone.web.RequestHandler):    
+    def get(self):
+        raise NotImplementedError
+    
+if __name__ == '__main__':
+    sb = ShiftbriteArduino(numChannels=3)
+
+    colors = [(0,0,0)] * sb.numChannels
+
+    aw = ArduinoWatcher(sb)
+    task.LoopingCall(aw.poll).start(1.0/20)
+    
+    reactor.listenTCP(9014, cyclone.web.Application([
+        (r'/', Index),
+        (r'/temperature', Temperature),
+        (r'/brite/(\d+)', Brite),
+        (r'/graph', Graph),
+        ], arduino=sb, colors=colors))
+    reactor.run()