Mercurial > code > home > repos > homeauto
changeset 1425:75aaa0547d55
whitespace
Ignore-this: 5ebd8b301f22adecc8c34b9e28aa8c76
darcs-hash:bfce337ecbc8660031d58be7e268dc804e16ad8a
author | drewp <drewp@bigasterisk.com> |
---|---|
date | Wed, 07 Aug 2019 21:06:04 -0700 |
parents | 458355ee1b99 |
children | c3c2418d138c |
files | service/arduinoNode/devices.py |
diffstat | 1 files changed, 64 insertions(+), 65 deletions(-) [+] |
line wrap: on
line diff
--- a/service/arduinoNode/devices.py Wed Aug 07 20:55:00 2019 -0700 +++ b/service/arduinoNode/devices.py Wed Aug 07 21:06:04 2019 -0700 @@ -17,7 +17,7 @@ for c in iter(lambda: read(1), '\n'): buf += c return buf - + class DeviceType(object): deviceType = None @classmethod @@ -66,7 +66,7 @@ 'watchPrefixes': self.watchPrefixes(), 'outputWidgets': self.outputWidgets(), } - + def readFromPoll(self, read): """ read an update message returned as part of a poll bundle. This may @@ -78,10 +78,10 @@ def wantIdleOutput(self): return False - + def outputIdle(self, write): return - + def hostStatements(self): """ Like readFromPoll but these statements come from the host-side @@ -91,7 +91,7 @@ be fast. """ return [] - + def watchPrefixes(self): """ subj,pred pairs of the statements that might be returned from @@ -100,7 +100,7 @@ always watch the whole tree of statements starting self.uri """ return [] - + def generateIncludes(self): """filenames of .h files to #include""" return [] @@ -108,22 +108,22 @@ def generateArduinoLibs(self): """names of libraries for the ARDUINO_LIBS line in the makefile""" return [] - + def generateGlobalCode(self): - """C code to emit in the global section. + """C code to emit in the global section. Note that 'frame' (uint8) is available and increments each frame. """ return '' - + def generateSetupCode(self): """C code to emit in setup()""" return '' - + def generateIdleCode(self): """C code to emit in the serial-read loop""" return '' - + def generatePollCode(self): """ C code to run a poll update. This should Serial.write its output @@ -140,7 +140,7 @@ calls in here. """ return '' - + def outputPatterns(self): """ Triple patterns, using None as a wildcard, that should be routed @@ -154,7 +154,7 @@ handler you have in sendOutput """ return [] - + def sendOutput(self, statements, write, read): """ If we got statements that match this class's outputPatterns, this @@ -166,7 +166,7 @@ whatever. Just need a way to collect them into graph statements. """ raise NotImplementedError - + _knownTypes = set() def register(deviceType): _knownTypes.add(deviceType) @@ -177,10 +177,10 @@ @classmethod def findInstances(cls, graph, board): return [cls(graph, board, None)] - + def generatePollCode(self): return "Serial.write('k');" - + def readFromPoll(self, read): byte = read(1) if byte != 'k': @@ -196,17 +196,17 @@ def __init__(self, graph, uri, pinNumber): DeviceType.__init__(self, graph, uri, pinNumber) self.lastRead = None - + 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': @@ -217,7 +217,7 @@ if self.lastRead is not None and motion != self.lastRead: oneshot = [(self.uri, ROOM['sees'], ROOM['motionStart'])] self.lastRead = motion - + return {'latest': [ (self.uri, ROOM['sees'], ROOM['motion'] if motion else ROOM['noMotion']), @@ -235,7 +235,7 @@ ROOM['motion'] if (dt < 60 * 10) else ROOM['noMotion']), (self.uri, ROOM['seesRecently30'], ROOM['motion'] if (dt < 30) else ROOM['noMotion'])] - + def watchPrefixes(self): return [ (self.uri, ROOM['sees']), @@ -250,18 +250,18 @@ def __init__(self, graph, uri, pinNumber): DeviceType.__init__(self, graph, uri, pinNumber) self.lastClosed = None - + def generateSetupCode(self): return 'pinMode(%(pin)d, INPUT); digitalWrite(%(pin)d, HIGH);' % { 'pin': self.pinNumber, } - + def generatePollCode(self): # note: pulldown means unpressed reads as a 1 return "Serial.write(digitalRead(%(pin)d) ? '0' : '1');" % { 'pin': self.pinNumber } - + def readFromPoll(self, read): b = read(1) if b not in '01': @@ -276,13 +276,13 @@ else: oneshot = [] self.lastClosed = closed - + return {'latest': [ (self.uri, ROOM['buttonState'], ROOM['pressed'] if closed else ROOM['notPressed']), ], 'oneshot': oneshot} - + def watchPrefixes(self): return [ (self.uri, ROOM['buttonState']), @@ -298,7 +298,7 @@ happens only at device startup (not even program startup, yet). self.uri is a resource representing the bus. - + DS18S20 pin 1: ground, pin 2: data and pull-up with 4.7k. """ deviceType = ROOM['OneWire'] @@ -311,28 +311,28 @@ def generateArduinoLibs(self): return ['OneWire', 'DallasTemperature'] - + def generateGlobalCode(self): # not yet isolated to support multiple OW buses return ''' -OneWire oneWire(%(pinNumber)s); +OneWire oneWire(%(pinNumber)s); DallasTemperature sensors(&oneWire); #define MAX_DEVICES 8 DeviceAddress tempSensorAddress[MAX_DEVICES]; -void initSensors() { +void initSensors() { sensors.begin(); - sensors.setResolution(12); + sensors.setResolution(12); sensors.setWaitForConversion(false); for (uint8_t i=0; i < sensors.getDeviceCount(); ++i) { sensors.getAddress(tempSensorAddress[i], i); } } ''' % dict(pinNumber=self.pinNumber) - + def generateSetupCode(self): return 'initSensors();' - + def generatePollCode(self): return r''' sensors.requestTemperatures(); @@ -346,7 +346,7 @@ Serial.write((uint8_t)sensors.getDeviceCount()); for (uint8_t i=0; i < sensors.getDeviceCount(); ++i) { float newTemp = sensors.getTempF(tempSensorAddress[i]); - + Serial.write(tempSensorAddress[i], 8); Serial.write((uint8_t*)(&newTemp), 4); } @@ -391,12 +391,12 @@ deviceType = ROOM['LedOutput'] def hostStateInit(self): self.value = 0 - + def generateSetupCode(self): return 'pinMode(%(pin)d, OUTPUT); digitalWrite(%(pin)d, LOW);' % { 'pin': self.pinNumber, } - + def outputPatterns(self): return [(self.uri, ROOM['brightness'], None)] @@ -410,7 +410,7 @@ def hostStatements(self): return [(self.uri, ROOM['brightness'], Literal(self.value))] - + def generateActionCode(self): return r''' while(Serial.available() < 1) NULL; @@ -432,12 +432,12 @@ deviceType = ROOM['DigitalOutput'] def hostStateInit(self): self.value = 0 - + def generateSetupCode(self): return 'pinMode(%(pin)d, OUTPUT); digitalWrite(%(pin)d, LOW);' % { 'pin': self.pinNumber, } - + def outputPatterns(self): return [(self.uri, ROOM['level'], None)] @@ -450,13 +450,13 @@ def hostStatements(self): return [(self.uri, ROOM['level'], Literal('high' if self.value else 'low'))] - + def generateActionCode(self): return r''' while(Serial.available() < 1) NULL; digitalWrite(%(pin)d, Serial.read()); ''' % dict(pin=self.pinNumber) - + def outputWidgets(self): return [{ 'element': 'output-switch', @@ -464,7 +464,7 @@ 'pred': ROOM['level'], }] - + @register class PwmBoard(DeviceType): deviceType = ROOM['PwmBoard'] @@ -487,7 +487,7 @@ }""", initBindings=dict(dev=row.dev), initNs={'': ROOM}): outs[out.area] = out.chan.toPython() yield cls(graph, row.dev, outs=outs) - + def __init__(self, graph, dev, outs): self.codeVals = {'pwm': 'pwm%s' % (hash(str(dev)) % 99999)} self.outs = outs @@ -499,24 +499,24 @@ def hostStatements(self): return [(uri, ROOM['brightness'], Literal(b)) for uri, b in self.values.items()] - + def generateIncludes(self): return ['Wire.h', 'Adafruit_PWMServoDriver.h'] def generateArduinoLibs(self): return ['Wire', 'Adafruit-PWM-Servo-Driver-Library'] - + def generateGlobalCode(self): return r''' Adafruit_PWMServoDriver %(pwm)s = Adafruit_PWMServoDriver(0x40); ''' % self.codeVals - + def generateSetupCode(self): return ''' %(pwm)s.begin(); %(pwm)s.setPWMFreq(1200); ''' % self.codeVals - + def generateActionCode(self): return r''' while(Serial.available() < 3) NULL; @@ -537,7 +537,7 @@ self.values[statements[0][0]] = value v12 = int(min(4095, max(0, value * 4095))) write(chr(chan) + chr(v12 >> 8) + chr(v12 & 0xff)) - + def outputWidgets(self): return [{ 'element': 'output-slider', @@ -580,7 +580,7 @@ def generateArduinoLibs(self): return ['ST7565'] - + def generateGlobalCode(self): return ''' ST7565 glcd(%(SID)d, %(SCLK)d, %(A0)d, %(RST)d, %(CS)d); @@ -591,14 +591,14 @@ A0=self.connections[ROOM['lcdA0']], RST=self.connections[ROOM['lcdRST']], CS=self.connections[ROOM['lcdCS']]) - + def generateSetupCode(self): return ''' glcd.st7565_init(); glcd.st7565_command(CMD_DISPLAY_ON); glcd.st7565_command(CMD_SET_ALLPTS_NORMAL); glcd.st7565_set_brightness(0x18); - + glcd.display(); // show splashscreen ''' @@ -614,7 +614,7 @@ def hostStatements(self): return [(self.uri, ROOM['text'], Literal(self.text))] - + def outputWidgets(self): return [{ 'element': 'output-fixed-text', @@ -623,7 +623,7 @@ 'subj': self.uri, 'pred': ROOM['text'], }] - + def generateActionCode(self): return ''' while(Serial.available() < 1) NULL; @@ -636,7 +636,7 @@ newtxt[i] = 0; } glcd.clear(); - glcd.drawstring(0,0, newtxt); + glcd.drawstring(0,0, newtxt); glcd.display(); ''' @@ -648,13 +648,13 @@ def __init__(self, graph, uri, pinNumber): super(RgbPixels, self).__init__(graph, uri, pinNumber) self.anim = RgbPixelsAnimation(graph, uri, self.updateOutput) - + self.replace = {'ledArray': 'leds_%s' % self.pinNumber, 'ledCount': self.anim.maxIndex() - 1, 'pin': self.pinNumber, 'ledType': 'WS2812', } - + def generateIncludes(self): """filenames of .h files to #include""" return ['FastLED.h'] @@ -665,13 +665,13 @@ def myId(self): return 'rgb_%s' % self.pinNumber - + def generateGlobalCode(self): return 'CRGB {ledArray}[{ledCount}];'.format(**self.replace) def generateSetupCode(self): return 'FastLED.addLeds<{ledType}, {pin}>({ledArray}, {ledCount});'.format(**self.replace) - + def sendOutput(self, statements, write, read): log.info('sendOutput start') self.write = write @@ -688,14 +688,14 @@ def wantIdleOutput(self): return True - + def outputIdle(self, write): self.write = write - self.updateOutput() - + self.updateOutput() + def hostStatements(self): return self.anim.hostStatements() - + def outputPatterns(self): return self.anim.outputPatterns() @@ -719,16 +719,15 @@ while(Serial.available() < 1) NULL; byte b = Serial.read(); - + {ledArray}[id] = CRGB(r, g, b); }} FastLED.show(); '''.format(**self.replace) - + def makeDevices(graph, board): out = [] for dt in sorted(_knownTypes, key=lambda cls: cls.__name__): out.extend(dt.findInstances(graph, board)) return out -