Read from bus in new _fetchValues() method and unregister interrupt in close()
authorBenjamin Braatz <benjamin.braatz@graph-it.com>
Wed, 11 Nov 2020 10:08:33 +0000 (11:08 +0100)
committerBenjamin Braatz <benjamin.braatz@graph-it.com>
Wed, 11 Nov 2020 10:08:33 +0000 (11:08 +0100)
graphit/pin/pcf8574.py

index 6bb10596f8c15d5479623ea8ab8f377d6e304743..6d54e749de5d3c192f322761730ecb4b0266fc86 100644 (file)
@@ -41,15 +41,18 @@ class PCF8574Input(graphit.event.EventEmitterMixin):
         self.__values = self.__pi.i2c_read_byte(self.__handle)
 
         def _onInterrupt(_value: bool):
-            oldValues = self.__values
-            self.__values = self.__pi.i2c_read_byte(self.__handle)
-
-            emitDiff(self._emit, oldValues, self.__values)
-        self.__interrupt.on('change', _onInterrupt)
+            self._fetchValues()
+        self.__int_handle = self.__interrupt.on('change', _onInterrupt)
 
         self.__pins = tuple(PCF8574InputPin(self, i) for i in range(0, 8))
 
+    def _fetchValues(self) -> None:
+        oldValues = self.__values
+        self.__values = self.__pi.i2c_read_byte(self.__handle)
+        emitDiff(self._emit, oldValues, self.__values)
+
     def close(self) -> None:
+        self.__interrupt.off(self.__int_handle)
         try:
             self.__pi.i2c_close(self.__handle)
         except AttributeError:
@@ -68,8 +71,7 @@ class PCF8574Input(graphit.event.EventEmitterMixin):
         return not bool(self.__values & (1 << pin))
 
     def getValues(self) -> int:
-        self.__values = self.__pi.i2c_read_byte(self.__handle)
-        return self.__values
+        return ~self.__values
 
 
 class PCF8574Output(graphit.event.EventEmitterMixin):
@@ -103,6 +105,9 @@ class PCF8574Output(graphit.event.EventEmitterMixin):
 
         return not bool(self.__values & (1 << pin))
 
+    def getValues(self) -> int:
+        return ~self.__values
+
     def setValue(self, pin: int, value: bool) -> None:
         assert isinstance(pin, int), 'pin must be an integer'
         assert pin >= 0 and pin <= 7, 'pin must be >= 0 and <= 7'