diff service/piNode/devices.py @ 1038:ffe6a00c6cef

server/browser graph sync. cut dependency on the WS version. merge some changes between arduino/pi code. Ignore-this: cf7d20d54e134e8ff33a9ee405610846 darcs-hash:b4350a6308480857b2846a8518190b956981eef4
author drewp <drewp@bigasterisk.com>
date Sat, 30 Jan 2016 06:40:00 -0800
parents 8d1a8a96e895
children 141079644c45
line wrap: on
line diff
--- a/service/piNode/devices.py	Thu Jan 28 02:48:54 2016 -0800
+++ b/service/piNode/devices.py	Sat Jan 30 06:40:00 2016 -0800
@@ -40,7 +40,14 @@
     def __init__(self, graph, uri, pi, pinNumber):
         self.graph, self.uri, self.pi = graph, uri, pi
         self.pinNumber = pinNumber
+        self.hostStateInit()
 
+    def hostStateInit(self):
+        """
+        If you don't want to use __init__, you can use this to set up
+        whatever storage you might need for hostStatements
+        """
+        
     def description(self):
         return {
             'uri': self.uri,
@@ -51,6 +58,16 @@
             'outputWidgets': self.outputWidgets(),
         }
 
+    def hostStatements(self):
+        """
+        Like readFromPoll but these statements come from the host-side
+        python code, not the connected device. Include output state
+        (e.g. light brightness) if its master version is in this
+        object. This method is called on /graph requests so it should
+        be fast.
+        """
+        return []
+        
     def watchPrefixes(self):
         """
         subj,pred pairs of the statements that might be returned from
@@ -159,13 +176,17 @@
     def __init__(self, graph, uri, pi, r, g, b):
         self.graph, self.uri, self.pi = graph, uri, pi
         self.rgb = map(int, [r, g, b])
+        self.value = '#000000'
             
     def setup(self):
         for i in self.rgb:
             self.pi.set_mode(i, pigpio.OUTPUT)
             self.pi.set_PWM_frequency(i, 200)
             self.pi.set_PWM_dutycycle(i, 0)
-
+            
+    def hostStatements(self):
+        return [(self.uri, ROOM['color'], Literal(self.value))]
+        
     def outputPatterns(self):
         return [(self.uri, ROOM['color'], None)]
 
@@ -178,6 +199,7 @@
         assert statements[0][:2] == (self.uri, ROOM['color'])
 
         rgb = self._rgbFromHex(statements[0][2])
+        self.value = statements[0][2]
 
         for (i, v) in zip(self.rgb, rgb):
             self.pi.set_PWM_dutycycle(i, v)
@@ -271,7 +293,10 @@
 @register
 class LedOutput(DeviceType):
     deviceType = ROOM['LedOutput']
-                
+
+    def hostStateInit(self):
+        self.value = 0
+    
     def setup(self):
         self.pi.set_mode(self.pinNumber, pigpio.OUTPUT)
         self.pi.set_PWM_frequency(self.pinNumber, 200)
@@ -283,8 +308,12 @@
     def sendOutput(self, statements):
         assert len(statements) == 1
         assert statements[0][:2] == (self.uri, ROOM['brightness'])
-        v = int(float(statements[0][2]) * 255)
+        self.value = float(statements[0][2])
+        v = int(self.value * 255)
         self.pi.set_PWM_dutycycle(self.pinNumber, v)
+
+    def hostStatements(self):
+        return [(self.uri, ROOM['brightness'], Literal(self.value))]       
         
     def outputWidgets(self):
         return [{