962
|
1 from __future__ import division
|
|
2 import serial, struct, json, sys
|
|
3
|
|
4 from rdflib import Namespace, Literal
|
|
5 sys.path.append("/my/site/magma")
|
|
6 from stategraph import StateGraph
|
|
7 import klein
|
|
8 from twisted.internet import task
|
|
9 import random, time
|
|
10
|
|
11 import restkit
|
|
12 reasoning = restkit.Resource("http://bang:9071/", timeout=1)
|
|
13 ROOM = Namespace("http://projects.bigasterisk.com/room/")
|
|
14
|
|
15 def sendOneShot(stmt):
|
|
16 try:
|
|
17 t1 = time.time()
|
|
18 print "post to reasoning", stmt
|
|
19 p = reasoning.post("oneShot",
|
|
20 headers={"content-type": "text/n3"},
|
|
21 payload=("%s %s %s ." %
|
|
22 tuple(n.n3() for n in stmt)))
|
|
23 except restkit.errors.RequestFailed:
|
|
24 print "oneShot failed"
|
|
25 return
|
|
26 print "posted in %.04f sec. %r" % (time.time() - t1,
|
|
27 p.body_string())
|
|
28
|
|
29
|
|
30 class Busybox(object):
|
|
31 def __init__(self, port='/dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A4001lVK-if00-port0'):
|
|
32 self.serial = serial.Serial(port, baudrate=115200, timeout=.2)
|
|
33
|
|
34 def poll(self):
|
|
35 for tries in range(5):
|
|
36 self.serial.write('\x60\x00')
|
|
37 line = self.serial.readline()
|
|
38 if not line.startswith('{'):
|
|
39 continue
|
|
40 if tries > 0:
|
|
41 print "after %s tries" % tries
|
|
42 return json.loads(line)
|
|
43 return {'error': 'invalid response'}
|
|
44
|
|
45 def writeMessage(self, row, col, text):
|
|
46 msg = struct.pack('BBBBB', 0x60, 0x01, row, col, len(text)) + text
|
|
47 self.serial.write(msg)
|
|
48
|
|
49 def setBacklight(self, level):
|
|
50 self.serial.write(struct.pack('BBB', 0x60, 0x02, level))
|
|
51
|
|
52 sendOneShot((ROOM['greets'],
|
|
53 ROOM['change'],
|
|
54 ROOM['down']))
|
|
55
|
|
56 bb = Busybox()
|
|
57 words = open('/usr/share/dict/words').readlines()
|
|
58
|
|
59 lastWordTime = 0
|
|
60 last = None
|
|
61 s1 = []
|
|
62
|
|
63 def poll():
|
|
64 global lastWordTime, s1, last
|
|
65 now = time.time()
|
|
66 if now - lastWordTime > 1:
|
|
67 msg = '%15s' % random.choice(words).strip()[:15]
|
|
68 bb.writeMessage(1, 1, msg)
|
|
69 lastWordTime = now
|
|
70 last = bb.poll()
|
|
71 if 'slider1' in last:
|
|
72 s1 = s1[-5:] + [last['slider1']]
|
|
73 if len(s1) > 4:
|
|
74 median = sorted(s1)[2]
|
|
75 bb.setBacklight(min(255, median // 4))
|
|
76 if 'keyDown' in last:
|
|
77 keyNum = last['keyDown']
|
|
78 sendOneShot((ROOM['ariBed/button%s' % keyNum],
|
|
79 ROOM['change'],
|
|
80 ROOM['down']))
|
|
81
|
|
82
|
|
83 @klein.route('/graph', methods=['GET'])
|
|
84 def getGraph(request):
|
|
85 g = StateGraph(ROOM.busybox)
|
|
86 g.add((ROOM.busybox, ROOM.localHour, Literal('x')))
|
|
87 for attr in ['slider1', 'slider2', 'slider3', 'slider4']:
|
|
88 # needs: smoothing, exp curve correction
|
|
89 g.add((ROOM['busybox/%s' % attr], ROOM.value, Literal(round(last[attr] / 1021, 3))))
|
|
90 request.setHeader('Content-type', 'application/x-trig')
|
|
91 return g.asTrig()
|
|
92
|
|
93 task.LoopingCall(poll).start(.05)
|
|
94
|
|
95 klein.run('0.0.0.0', port=9056)
|
|
96
|