comparison service/arduinoNode/arduinoNode.py @ 981:d9bbbd8d86f6

arduinoNode: use -v for logging; support a PUT with subj+pred in query, obj in body Ignore-this: 744c3c7d95655430b8ec547e56f6b4bc darcs-hash:20150514082612-312f9-f77a103ef67321aa5a0ffd7991b92befd5dac37f
author drewp <drewp@bigasterisk.com>
date Thu, 14 May 2015 01:26:12 -0700
parents f3023410d875
children 2161c71c7b02
comparison
equal deleted inserted replaced
980:2f1cb8b5950a 981:d9bbbd8d86f6
9 import serial 9 import serial
10 import cyclone.web 10 import cyclone.web
11 from rdflib import Graph, Namespace, URIRef, Literal, RDF 11 from rdflib import Graph, Namespace, URIRef, Literal, RDF
12 from rdflib.parser import StringInputSource 12 from rdflib.parser import StringInputSource
13 from twisted.internet import reactor, task 13 from twisted.internet import reactor, task
14 from docopt import docopt
14 15
15 import devices 16 import devices
16 import dotrender 17 import dotrender
17 import rdflib_patch 18 import rdflib_patch
18 rdflib_patch.fixQnameOfUriWithTrailingSlash() 19 rdflib_patch.fixQnameOfUriWithTrailingSlash()
326 327
327 def rdfGraphBody(body, headers): 328 def rdfGraphBody(body, headers):
328 g = Graph() 329 g = Graph()
329 g.parse(StringInputSource(body), format='nt') 330 g.parse(StringInputSource(body), format='nt')
330 return g 331 return g
331 332
332 class OutputPage(cyclone.web.RequestHandler): 333 class OutputPage(cyclone.web.RequestHandler):
333 def post(self): 334 def post(self):
335 # for old ui; use PUT instead
334 stmts = list(rdfGraphBody(self.request.body, self.request.headers)) 336 stmts = list(rdfGraphBody(self.request.body, self.request.headers))
335 for b in self.settings.boards: 337 for b in self.settings.boards:
336 b.outputStatements(stmts) 338 b.outputStatements(stmts)
337 339
340 def put(self):
341 subj = URIRef(self.get_argument('s'))
342 pred = URIRef(self.get_argument('p'))
343
344 turtleLiteral = self.request.body
345 try:
346 obj = Literal(float(turtleLiteral))
347 except TypeError:
348 obj = Literal(turtleLiteral)
349
350 stmt = (subj, pred, obj)
351 for b in self.settings.boards:
352 b.outputStatements([stmt])
353
354
338 class Boards(cyclone.web.RequestHandler): 355 class Boards(cyclone.web.RequestHandler):
339 def get(self): 356 def get(self):
340 357
341 self.set_header('Content-type', 'application/json') 358 self.set_header('Content-type', 'application/json')
342 self.write(json.dumps({ 359 self.write(json.dumps({
346 def currentSerialDevices(): 363 def currentSerialDevices():
347 log.info('find connected boards') 364 log.info('find connected boards')
348 return glob.glob('/dev/serial/by-id/*') 365 return glob.glob('/dev/serial/by-id/*')
349 366
350 def main(): 367 def main():
368 arg = docopt("""
369 Usage: reasoning.py [options]
370
371 -v Verbose
372 """)
373 log.setLevel(logging.WARN)
374 if arg['-v']:
375 from twisted.python import log as twlog
376 twlog.startLogging(sys.stdout)
377
378 log.setLevel(logging.DEBUG)
379
351 config = Config() 380 config = Config()
352 current = currentSerialDevices() 381 current = currentSerialDevices()
353 382
354 def onChange(): 383 def onChange():
355 # notify reasoning 384 # notify reasoning
366 boards[0].deployToArduino() 395 boards[0].deployToArduino()
367 396
368 log.info('open boards') 397 log.info('open boards')
369 for b in boards: 398 for b in boards:
370 b.startPolling() 399 b.startPolling()
371 400
372 from twisted.python import log as twlog
373 twlog.startLogging(sys.stdout)
374
375 log.setLevel(logging.DEBUG)
376 reactor.listenTCP(9059, cyclone.web.Application([ 401 reactor.listenTCP(9059, cyclone.web.Application([
377 (r"/()", cyclone.web.StaticFileHandler, { 402 (r"/()", cyclone.web.StaticFileHandler, {
378 "path": "static", "default_filename": "index.html"}), 403 "path": "static", "default_filename": "index.html"}),
379 (r'/static/(.*)', cyclone.web.StaticFileHandler, {"path": "static"}), 404 (r'/static/(.*)', cyclone.web.StaticFileHandler, {"path": "static"}),
380 (r'/boards', Boards), 405 (r'/boards', Boards),