changeset 1062:6ab7a933c2a8

button :press oneshot Ignore-this: 683ebd47640eb29f6af4da4b352e304f darcs-hash:a6ef95d08deccb78307cc06e642755be24ee0c3e
author drewp <drewp@bigasterisk.com>
date Mon, 21 Mar 2016 04:22:39 -0700
parents ef635e9b9dce
children 295d20307b81
files service/arduinoNode/devices.py
diffstat 1 files changed, 18 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/service/arduinoNode/devices.py	Mon Mar 21 04:21:35 2016 -0700
+++ b/service/arduinoNode/devices.py	Mon Mar 21 04:22:39 2016 -0700
@@ -228,6 +228,10 @@
 class PushbuttonInput(DeviceType):
     """add a switch to ground; we'll turn on pullup"""
     deviceType = ROOM['Pushbutton']
+    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,
@@ -243,13 +247,22 @@
         b = read(1)
         if b not in '01':
             raise ValueError('unexpected response %r' % b)
-        motion = b == '1'
+        closed = b == '0'
 
-        #and exactly once for the transition
-        return [
+        if self.lastClosed is not None and closed != self.lastClosed:
+            oneshot = [
+                (self.uri, ROOM['buttonState'],
+                 ROOM['press'] if closed else ROOM['release']),
+            ]
+        else:
+            oneshot = []
+        self.lastClosed = closed
+            
+        return {'latest': [
             (self.uri, ROOM['buttonState'],
-             ROOM['pressed'] if motion else ROOM['notPressed']),
-        ]
+             ROOM['pressed'] if closed else ROOM['notPressed']),
+        ],
+                'oneshot': oneshot}
     
     def watchPrefixes(self):
         return [