Mercurial > code > home > repos > homeauto
comparison service/arduinoNode/devices.py @ 997:b24885725f59
support for pwm board
Ignore-this: 4bf59699c590c75c79e6ae72d719343a
darcs-hash:20150830081929-312f9-45f7134e807c5de2bb0dad13a5a9d1fa032bf471
author | drewp <drewp@bigasterisk.com> |
---|---|
date | Sun, 30 Aug 2015 01:19:29 -0700 |
parents | c6989dcf1f4f |
children | f8ffb9d8d982 |
comparison
equal
deleted
inserted
replaced
996:a34e008a8f95 | 997:b24885725f59 |
---|---|
270 (self.uri, ROOM['temperatureRetries']), | 270 (self.uri, ROOM['temperatureRetries']), |
271 ] | 271 ] |
272 | 272 |
273 def byteFromFloat(f): | 273 def byteFromFloat(f): |
274 return chr(int(min(255, max(0, f * 255)))) | 274 return chr(int(min(255, max(0, f * 255)))) |
275 | 275 |
276 @register | 276 @register |
277 class LedOutput(DeviceType): | 277 class LedOutput(DeviceType): |
278 deviceType = ROOM['LedOutput'] | 278 deviceType = ROOM['LedOutput'] |
279 def generateSetupCode(self): | 279 def generateSetupCode(self): |
280 return 'pinMode(%(pin)d, OUTPUT); digitalWrite(%(pin)d, LOW);' % { | 280 return 'pinMode(%(pin)d, OUTPUT); digitalWrite(%(pin)d, LOW);' % { |
335 return [{ | 335 return [{ |
336 'element': 'output-switch', | 336 'element': 'output-switch', |
337 'subj': self.uri, | 337 'subj': self.uri, |
338 'pred': ROOM['level'], | 338 'pred': ROOM['level'], |
339 }] | 339 }] |
340 | 340 |
341 @register | |
342 class PwmBoard(DeviceType): | |
343 deviceType = ROOM['PwmBoard'] | |
344 @classmethod | |
345 def findInstances(cls, graph, board): | |
346 for row in graph.query("""SELECT DISTINCT ?dev ?sda ?scl WHERE { | |
347 ?board :hasPin ?sdaPin . | |
348 ?board :hasPin ?sclPin . | |
349 ?sdaPin :pinNumber ?sda; :connectedTo ?sdaConn . | |
350 ?sclPin :pinNumber ?scl; :connectedTo ?sclConn . | |
351 ?dev a :PwmBoard; | |
352 :scl ?sclConn; | |
353 :sda ?sdaConn . | |
354 }""", initBindings=dict(board=board), initNs={'': ROOM}): | |
355 if (row.sda, row.scl) != (Literal('a4'), Literal('a5')): | |
356 raise NotImplementedError(row) | |
357 outs = {} | |
358 for out in graph.query("""SELECT DISTINCT ?area ?chan WHERE { | |
359 ?dev :output [:area ?area; :channel ?chan] . | |
360 }""", initBindings=dict(dev=row.dev), initNs={'': ROOM}): | |
361 outs[out.area] = out.chan.toPython() | |
362 yield cls(graph, row.dev, outs=outs) | |
363 | |
364 def __init__(self, graph, dev, outs): | |
365 super(PwmBoard, self).__init__(graph, dev, pinNumber=None) | |
366 self.codeVals = {'pwm': 'pwm%s' % (hash(str(dev)) % 99999)} | |
367 self.outs = outs | |
368 | |
369 def generateIncludes(self): | |
370 return ['Wire.h', 'Adafruit_PWMServoDriver.h'] | |
371 | |
372 def generateArduinoLibs(self): | |
373 return ['Wire', 'Adafruit-PWM-Servo-Driver-Library'] | |
374 | |
375 def generateGlobalCode(self): | |
376 return r''' | |
377 Adafruit_PWMServoDriver %(pwm)s = Adafruit_PWMServoDriver(0x40); | |
378 ''' % self.codeVals | |
379 | |
380 def generateSetupCode(self): | |
381 return ''' | |
382 %(pwm)s.begin(); | |
383 %(pwm)s.setPWMFreq(1200); | |
384 ''' % self.codeVals | |
385 | |
386 def generateActionCode(self): | |
387 return r''' | |
388 while(Serial.available() < 3) NULL; | |
389 byte chan = Serial.read(); | |
390 uint16_t level = uint16_t(Serial.read()) << 8; | |
391 level |= Serial.read(); | |
392 %(pwm)s.setPWM(chan, 0, level); | |
393 ''' % self.codeVals | |
394 | |
395 def outputPatterns(self): | |
396 return [(area, ROOM['brightness'], None) for area in self.outs] | |
397 | |
398 def sendOutput(self, statements, write, read): | |
399 assert len(statements) == 1 | |
400 assert statements[0][1] == ROOM['brightness']; | |
401 chan = self.outs[statements[0][0]] | |
402 value = float(statements[0][2]) | |
403 v12 = int(min(4095, max(0, value * 4095))) | |
404 write(chr(chan) + chr(v12 >> 8) + chr(v12 & 0xff)) | |
405 | |
406 def outputWidgets(self): | |
407 return [{ | |
408 'element': 'output-slider', | |
409 'min': 0, | |
410 'max': 1, | |
411 'step': 1 / 255, | |
412 'subj': area, | |
413 'pred': ROOM['brightness'], | |
414 } for area in self.outs] | |
415 | |
341 @register | 416 @register |
342 class ST7576Lcd(DeviceType): | 417 class ST7576Lcd(DeviceType): |
343 deviceType = ROOM['ST7565Lcd'] | 418 deviceType = ROOM['ST7565Lcd'] |
344 @classmethod | 419 @classmethod |
345 def findInstances(cls, graph, board): | 420 def findInstances(cls, graph, board): |