annotate service/deskArduino/deskArduino.py @ 1129:7375eae3e095

clamp led brightness Ignore-this: 7bd6777e794fec977b09f0052939ed4f darcs-hash:29764504b7a8e795a28b1345276fd60d4015f88f
author drewp <drewp@bigasterisk.com>
date Mon, 15 Jan 2018 03:00:26 -0800
parents 62565b2467a8
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
805
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
1 #!bin/python
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
2 """
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
3 talks to shiftbrite driver on dash, plus future arduino stuff
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
4 """
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
5
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
6 from __future__ import division
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
7
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
8 import cyclone.web, sys, bitstring
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
9 from twisted.python import log
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
10 from twisted.internet import reactor
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
11 from rdflib import Namespace
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
12 sys.path.append("/my/proj/house/frontdoor")
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
13 from loggingserial import LoggingSerial
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
14 sys.path.append("/my/site/magma")
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
15 from stategraph import StateGraph
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
16 sys.path.append("/my/proj/homeauto/lib")
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
17 from cycloneerr import PrettyErrorHandler
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
18
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
19 ROOM = Namespace("http://projects.bigasterisk.com/room/")
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
20 DEV = Namespace("http://projects.bigasterisk.com/device/")
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
21
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
22 from webcolors import hex_to_rgb, rgb_to_hex
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
23
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
24 def rgbFromHex(h):
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
25 """returns tuple of 0..1023"""
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
26 norm = hex_to_rgb(h)
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
27 return tuple([x * 4 for x in norm])
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
28
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
29 def hexFromRgb(rgb):
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
30 return rgb_to_hex(tuple([x // 4 for x in rgb]))
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
31
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
32 class ArduinoDesk(object):
878
62565b2467a8 default port on deskarduino
drewp <drewp@bigasterisk.com>
parents: 805
diff changeset
33 def __init__(self, ports=['/dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A900gbcG-if00-port0']):
805
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
34 self.ser = LoggingSerial(ports=ports, baudrate=115200, timeout=1)
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
35
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
36 def ping(self):
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
37 self.ser.write("\x60\x00")
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
38 msg = self.ser.readJson()
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
39 assert msg == {"ok":"ping"}, msg
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
40
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
41 def shiftbrite(self, colors):
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
42 """
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
43 shift out this sequence of (r,g,b) triples of 10-bit ints
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
44 """
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
45 out = "".join(bitstring.pack("0b00, uint:10, uint:10, uint:10",
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
46 b, r, g).bytes
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
47 for r,g,b in colors)
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
48
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
49 self.ser.write("\x60\x01" + chr(len(out)) + out)
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
50 msg = self.ser.readJson()
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
51 assert msg == {"ok":1}, msg
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
52
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
53 class Index(PrettyErrorHandler, cyclone.web.RequestHandler):
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
54 def get(self):
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
55 self.settings.arduino.ping()
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
56
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
57 self.set_header("Content-Type", "application/xhtml+xml")
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
58 self.write(open("index.html").read())
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
59
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
60 class GraphPage(PrettyErrorHandler, cyclone.web.RequestHandler):
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
61 def get(self):
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
62 self.set_header("Content-Type", "application/x-trig")
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
63 g = StateGraph(ROOM['deskArduino'])
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
64 # g.add((s,p,o)) for colors and stuff
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
65 self.write(g.asTrig())
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
66
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
67 class Brite(PrettyErrorHandler, cyclone.web.RequestHandler):
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
68 def get(self, chan):
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
69 self.set_header("Content-Type", "text/plain")
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
70 self.write(hexFromRgb(self.settings.colors[int(chan)]))
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
71
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
72 def put(self, chan):
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
73 s = self.settings
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
74 s.colors[int(chan)] = rgbFromHex(self.request.body)
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
75 s.arduino.shiftbrite(s.colors)
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
76 post = put
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
77
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
78 class Application(cyclone.web.Application):
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
79 def __init__(self, arduino):
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
80 handlers = [
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
81 (r"/", Index),
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
82 (r"/graph", GraphPage),
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
83 (r"/brite/(\d+)", Brite),
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
84 ]
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
85 colors = [(0,0,0)] * 2 # stored 10-bit
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
86 cyclone.web.Application.__init__(self, handlers,
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
87 arduino=arduino, colors=colors)
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
88
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
89 if __name__ == '__main__':
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
90 config = { # to be read from a file
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
91 'servePort' : 9014,
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
92 }
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
93
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
94 #log.startLogging(sys.stdout)
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
95
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
96 arduino = ArduinoDesk()
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
97
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
98 reactor.listenTCP(config['servePort'], Application(arduino))
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
99 reactor.run()