0
|
1 """
|
|
2 holds the current message on the front door lcd
|
|
3 """
|
15
|
4 import cyclone.web, sys, socket
|
0
|
5 import restkit
|
|
6 from twisted.internet import reactor
|
|
7 from twisted.internet.defer import inlineCallbacks
|
|
8 sys.path.append("/my/proj/homeauto/lib")
|
|
9 from cycloneerr import PrettyErrorHandler
|
6
|
10 from logsetup import log
|
0
|
11
|
|
12 class LcdParts(object):
|
24
|
13 def __init__(self, putUrl, pingUrl):
|
|
14 self.putUrl, self.pingUrl = putUrl, pingUrl
|
6
|
15 log.info("restarting- message is now empty")
|
0
|
16 self.message = ""
|
|
17 self.lastLine = ""
|
|
18
|
|
19 def updateLcd(self):
|
|
20 whole = "%-147s%-21s" % (self.message, self.lastLine)
|
15
|
21 try:
|
|
22 restkit.request(url=self.putUrl,
|
|
23 method="PUT",
|
|
24 body=whole,
|
|
25 headers={"content-type":"text/plain"})
|
|
26 except socket.error, e:
|
|
27 log.warn("update lcd failed, %s" % e)
|
24
|
28
|
|
29 try:
|
|
30 restkit.request(url=self.pingUrl, method="POST", body="")
|
|
31 except socket.error, e:
|
|
32 log.warn("ping failed, %s" % e)
|
0
|
33
|
|
34 class Index(PrettyErrorHandler, cyclone.web.RequestHandler):
|
|
35 @inlineCallbacks
|
|
36 def get(self):
|
|
37
|
|
38 # refresh output, and make an error if we can't talk to them
|
|
39 yield self.settings.lcdParts.updateLcd()
|
|
40
|
|
41 self.set_header("Content-Type", "application/xhtml+xml")
|
|
42 self.write(open("index.html").read())
|
|
43
|
|
44 def getArg(s):
|
|
45 return s.request.body.encode("ascii")
|
|
46
|
|
47 class Message(PrettyErrorHandler, cyclone.web.RequestHandler):
|
|
48 def get(self):
|
|
49 self.set_header("Content-Type", "text/plain")
|
|
50 self.write(self.settings.lcdParts.message)
|
|
51
|
|
52 def put(self):
|
|
53 self.settings.lcdParts.message = getArg(self)
|
|
54 self.settings.lcdParts.updateLcd()
|
|
55 self.set_status(204)
|
|
56
|
|
57 class LastLine(PrettyErrorHandler, cyclone.web.RequestHandler):
|
|
58 def get(self):
|
|
59 self.set_header("Content-Type", "text/plain")
|
|
60 self.write(self.settings.lcdParts.lastLine)
|
|
61
|
|
62 def put(self):
|
|
63 self.settings.lcdParts.lastLine = getArg(self)
|
|
64 self.settings.lcdParts.updateLcd()
|
|
65 self.set_status(204)
|
|
66
|
|
67 class Application(cyclone.web.Application):
|
|
68 def __init__(self, lcdParts):
|
|
69 handlers = [
|
|
70 (r"/", Index),
|
|
71 (r"/message", Message),
|
|
72 (r'/lastLine', LastLine),
|
|
73 ]
|
|
74 settings = {"lcdParts" : lcdParts}
|
|
75 cyclone.web.Application.__init__(self, handlers, **settings)
|
|
76
|
|
77 if __name__ == '__main__':
|
|
78
|
|
79 config = {
|
14
|
80 'frontDoorArduino': "http://slash:9080/",
|
24
|
81 'doorChangePost' : 'http://bang:8014/frontDoorChange',
|
0
|
82 'servePort' : 9081,
|
|
83 }
|
|
84
|
24
|
85 lcdParts = LcdParts(config['frontDoorArduino'] + 'lcd',
|
|
86 config['doorChangePost'])
|
0
|
87
|
|
88 reactor.listenTCP(config['servePort'], Application(lcdParts))
|
|
89 reactor.run()
|