Mercurial > code > home > repos > homeauto
diff service/arduinoNode/devices.py @ 969:70a5392b24d3
start arduinonode
Ignore-this: 6ddc4d3af9ab8468e25b346bddf15835
darcs-hash:20150406091339-312f9-bcbca91eff6dc85a402d341248e7ce6128e71723
author | drewp <drewp@bigasterisk.com> |
---|---|
date | Mon, 06 Apr 2015 02:13:39 -0700 |
parents | |
children | c0180bd2b33a |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/service/arduinoNode/devices.py Mon Apr 06 02:13:39 2015 -0700 @@ -0,0 +1,70 @@ +from rdflib import Namespace, RDF, URIRef + +ROOM = Namespace('http://projects.bigasterisk.com/room/') + +class BoardInput(object): + """ + one device that gives us input. this includes processing to make + statements, but this object doesn't store state + """ + def __init__(self, graph, uri): + self.graph, self.uri = graph, uri + + def readFromPoll(self, read): + """ + read an update message returned as part of a poll bundle. This may + consume a varying number of bytes depending on the type of + input (e.g. IR receiver). + Returns rdf statements. + """ + raise NotImplementedError + + def generateSetupCode(self): + return '' + + def generatePollCode(self): + return '' + + def pinNumber(self, pred=ROOM['pin']): + pinUri = self.graph.value(self.uri, pred) + return int(self.graph.value(pinUri, ROOM['pinNumber'])) + +_inputForType = {} +def registerInput(deviceType): + def newcls(cls): + _inputForType[deviceType] = cls + return cls + return newcls + +class PingInput(BoardInput): + def generatePollCode(self): + return "Serial.write('k');" + def readFromPoll(self, read): + if read(1) != 'k': + raise ValueError('invalid ping response') + return [(self.uri, ROOM['ping'], ROOM['ok'])] + +@registerInput(deviceType=ROOM['MotionSensor']) +class MotionSensorInput(BoardInput): + def generateSetupCode(self): + return 'pinMode(%(pin)d, INPUT); digitalWrite(%(pin)d, LOW);' % { + 'pin': self.pinNumber(), + } + + def generatePollCode(self): + return "Serial.write(digitalRead(%(pin)d) ? 'y' : 'n');" % { + 'pin': self.pinNumber() + } + + def readFromPoll(self, read): + b = read(1) + if b not in 'yn': + raise ValueError('unexpected response %r' % b) + motion = b == 'y' + return [(self.uri, ROOM['sees'], + ROOM['motion'] if motion else ROOM['noMotion'])] + +def makeBoardInput(graph, uri): + deviceType = graph.value(uri, RDF.type) + return _inputForType[deviceType](graph, uri) +