Mercurial > code > home > repos > homeauto
diff service/bedroomArduino/bedroomArduino.py @ 37:8e55a6a9c425
add shiftbrites to bedroom arduino
Ignore-this: c0ce65f20b52679af58b9e31bcc3cf2e
author | drewp@bigasterisk.com |
---|---|
date | Sat, 25 Aug 2012 14:20:45 -0700 |
parents | 5fef0b7db346 |
children | 1fada3a61c5f |
line wrap: on
line diff
--- a/service/bedroomArduino/bedroomArduino.py Tue Aug 07 23:24:10 2012 -0700 +++ b/service/bedroomArduino/bedroomArduino.py Sat Aug 25 14:20:45 2012 -0700 @@ -5,7 +5,7 @@ from __future__ import division -import cyclone.web, json, traceback, os, sys, time, logging +import cyclone.web, json, traceback, os, sys, time, logging, bitstring from twisted.internet import reactor, task from twisted.web.client import getPage sys.path.append("/my/proj/house/frontdoor") @@ -14,6 +14,9 @@ from cycloneerr import PrettyErrorHandler from logsetup import log +sys.path.append("/my/proj/pixel/shiftweb") +from shiftweb import hexFromRgb, rgbFromHex + sys.path.append("/my/site/magma") from stategraph import StateGraph from rdflib import Namespace @@ -34,11 +37,28 @@ def poll(self): self.ser.write("\x60\x01\x00") ret = self.ser.readJson() + ret['motion'] = int(ret['motion'] > 100) return ret def setSpeakerChoice(self, pillow): self.ser.write("\x60\x02" + chr(pillow)) - return self.ser.readJson() + return self.ser.readJson() + + def setLeds(self, colors): + """ + shift out this sequence of (r,g,b) triples of 10-bit ints + The nearest led gets color[0], etc. + """ + resetCurrent = "".join(bitstring.pack("0b01, uint:10, uint:10, uint:10", + 127, 127, 127).bytes + for loop in range(len(colors))) + out = "".join(bitstring.pack("0b00, uint:10, uint:10, uint:10", + b, r, g).bytes + for r,g,b in reversed(colors)) + out = resetCurrent + out + self.ser.write("\x60\x03" + chr(len(out)) + out) + msg = self.ser.readJson() + assert msg == {"ok":1}, msg class Index(PrettyErrorHandler, cyclone.web.RequestHandler): def get(self): @@ -56,6 +76,18 @@ ret = self.settings.arduino.setSpeakerChoice(int(self.get_argument('pillow'))) self.write(ret) +class Brite(PrettyErrorHandler, cyclone.web.RequestHandler): + def put(self, which): + which = int(which) + brites = self.settings.brites + if which + 1 > len(brites): + brites.extend([(0,0,0)] * (which + 1 - len(brites))) + brites[which] = rgbFromHex(self.request.body) + + self.settings.arduino.setLeds(brites) + self.set_header("Content-Type", "text/plain") + self.write("ok") + class GraphPage(PrettyErrorHandler, cyclone.web.RequestHandler): def get(self): self.set_header("Content-Type", "application/x-trig") @@ -75,7 +107,7 @@ self.period = period self.lastValues = None self.lastPollTime = 0 - self.lastMotion = False + self.lastMotion = None def assertIsCurrent(self): """raise an error if the poll data is not fresh""" @@ -91,8 +123,8 @@ except ValueError, e: print e else: - print newData - return + #print newData # for testing + self.lastPollTime = now self.lastValues = newData # for other data besides the blinks self.processMotion(newData['motion']) @@ -121,7 +153,7 @@ if __name__ == '__main__': config = { # to be read from a file - 'arduinoPort': '/dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A4001lVK-if00-port0', + 'arduinoPort': '/dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A4001nIu-if00-port0', 'servePort' : 9088, 'pollFrequency' : 6, 'boardName' : 'bedroom', # gets sent with updates @@ -142,5 +174,6 @@ (r"/", Index), (r"/graph", GraphPage), (r'/speakerChoice', SpeakerChoice), - ], arduino=ard, poller=p)) + (r'/brite/(\d+)', Brite), + ], arduino=ard, poller=p, brites=[])) reactor.run()