]> Repositories - hackapet/Adafruit_Blinka_Displayio.git/blobdiff - displayio/display.py
Merge pull request #31 from makermelissa/pwm
[hackapet/Adafruit_Blinka_Displayio.git] / displayio / display.py
index eb3d6356d90ac092bed4dc8041212d3ae8abe5af..1ea5d5555d5911a4d0b127af498e3d129ede13ff 100644 (file)
@@ -155,9 +155,19 @@ class Display:
 
         self._backlight_type = None
         if backlight_pin is not None:
 
         self._backlight_type = None
         if backlight_pin is not None:
-            self._backlight_type = BACKLIGHT_IN_OUT
-            self._backlight = digitalio.DigitalInOut(backlight_pin)
-            self._backlight.switch_to_output()
+            try:
+                from pulseio import PWMOut  # pylint: disable=import-outside-toplevel
+
+                # 100Hz looks decent and doesn't keep the CPU too busy
+                self._backlight = PWMOut(backlight_pin, frequency=100, duty_cycle=0)
+                self._backlight_type = BACKLIGHT_PWM
+            except ImportError:
+                # PWMOut not implemented on this platform
+                pass
+            if self._backlight_type is None:
+                self._backlight_type = BACKLIGHT_IN_OUT
+                self._backlight = digitalio.DigitalInOut(backlight_pin)
+                self._backlight.switch_to_output()
             self.brightness = brightness
 
     # pylint: enable=too-many-locals
             self.brightness = brightness
 
     # pylint: enable=too-many-locals
@@ -192,7 +202,7 @@ class Display:
         self._bus.end_transaction()
 
     def _release(self):
         self._bus.end_transaction()
 
     def _release(self):
-        self._bus.release()
+        self._bus._release()  # pylint: disable=protected-access
         self._bus = None
 
     def show(self, group):
         self._bus = None
 
     def show(self, group):
@@ -213,6 +223,8 @@ class Display:
         When auto refresh is on, updates the display immediately. (The display will also
         update without calls to this.)
         """
         When auto refresh is on, updates the display immediately. (The display will also
         update without calls to this.)
         """
+        self._subrectangles = []
+
         # Go through groups and and add each to buffer
         if self._current_group is not None:
             buffer = Image.new("RGBA", (self._width, self._height))
         # Go through groups and and add each to buffer
         if self._current_group is not None:
             buffer = Image.new("RGBA", (self._width, self._height))
@@ -221,8 +233,9 @@ class Display:
             # save image to buffer (or probably refresh buffer so we can compare)
             self._buffer.paste(buffer)
 
             # save image to buffer (or probably refresh buffer so we can compare)
             self._buffer.paste(buffer)
 
-        # Eventually calculate dirty rectangles here
-        self._subrectangles.append(Rectangle(0, 0, self._width, self._height))
+        if self._current_group is not None:
+            # Eventually calculate dirty rectangles here
+            self._subrectangles.append(Rectangle(0, 0, self._width, self._height))
 
         for area in self._subrectangles:
             self._refresh_display_area(area)
 
         for area in self._subrectangles:
             self._refresh_display_area(area)
@@ -354,8 +367,10 @@ class Display:
             self._brightness = value
             if self._backlight_type == BACKLIGHT_IN_OUT:
                 self._backlight.value = round(self._brightness)
             self._brightness = value
             if self._backlight_type == BACKLIGHT_IN_OUT:
                 self._backlight.value = round(self._brightness)
-            # PWM not currently implemented
-            # Command-based brightness not implemented
+            elif self._backlight_type == BACKLIGHT_PWM:
+                self._backlight.duty_cycle = self._brightness * 65535
+            elif self._brightness_command is not None:
+                self._write(self._brightness_command, round(value * 255))
         else:
             raise ValueError("Brightness must be between 0.0 and 1.0")
 
         else:
             raise ValueError("Brightness must be between 0.0 and 1.0")