changeset 1:e43175de4495 default tip

Use 16-bit register read
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Sun, 13 Nov 2016 22:08:22 +0100
parents a0491f551a81
children
files gp2y0e03.py
diffstat 1 files changed, 26 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/gp2y0e03.py	Fri Sep 09 14:51:15 2016 +0200
+++ b/gp2y0e03.py	Sun Nov 13 22:08:22 2016 +0100
@@ -1,8 +1,15 @@
+import ustruct
 
 _REGISTER_SHIFT_BIT = const(0x35)
-_REGISTER_DISTANCE1 = const(0x5e)
-_REGISTER_DISTANCE2 = const(0x5f)
+_REGISTER_DISTANCE = const(0x5e)
+
 
+"""
+import gp2y0e03
+from machine import I2C, Pin
+i2c = I2C(Pin(0), Pin(2))
+s = gp2y0e03.GP2Y0E03(i2c)
+"""
 
 class GP2Y0E03:
     def __init__(self, i2c, address=0x40):
@@ -15,18 +22,27 @@
             return self.i2c.readfrom_mem(self.address, register, 1)[0]
         self.i2c.writeto_mem(self.address, register, bytearray([value]))
 
+    def _register16(self, register, value=None):
+        if value is None:
+            data = self.i2c.readfrom_mem(self.address, register, 2)
+            return ustruct.unpack(">H", data)[0]
+        self.i2c.writeto_mem(self.address, register, ustruct.pack(">H", value))
+
     def shift(self, value=None):
-        if value not in (1, 2, None):
-            raise ValueError("shift has to be 1 or 2")
+        if value not in {1, 2, None}:
+            raise ValueError("Shift has to be 1 or 2")
+        reading = self._register8(_REGISTER_SHIFT_BIT, value)
         if value is not None:
             self._shift = value
-        return self._register8(_REGISTER_SHIFT_BIT, value)
+        else:
+            self._shift = reading
+        return reading
 
     def read(self, raw=False):
-        low = self._register8(_REGISTER_DISTANCE2)
-        high = self._register8(_REGISTER_DISTANCE1)
-        value =  (high << 4 | low & 0x0f)
+        value = self._register16(_REGISTER_DISTANCE)
         if raw:
-            return high, low, value
-        # value in cm
+            return value
+        if value & 0xff00:
+            return 0 # out of range
+        # value in mm
         return (value / 16) / (1 << self._shift)