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):