From acfd46aa60f27c8a2e4025e452f8ed5650fdc44f Mon Sep 17 00:00:00 2001
From: Michael Killough <michaeljkillough@gmail.com>
Date: Sun, 16 Aug 2020 12:19:32 +0100
Subject: [PATCH] Fix full on/off in pca9685.

It's currently not possible to toggle between full off and full on, as
switching to full on leaves the full off control bit set. The full off
control bit takes precedence according to the datasheet, which means the
signal remains off.

The 'normal' branch does correctly clear full off/full on, as it writes
0s to the `LEDn_ON` registers unconditionally and writes 0 to the control
bit in `LEDn_OFF`.
---
 extras/pca9685/pca9685.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/extras/pca9685/pca9685.c b/extras/pca9685/pca9685.c
index b115170..8b8605a 100644
--- a/extras/pca9685/pca9685.c
+++ b/extras/pca9685/pca9685.c
@@ -185,6 +185,7 @@ void pca9685_set_pwm_value(i2c_dev_t *dev, uint8_t channel, uint16_t val)
     if (val == 0)
     {
         // Full off
+        // Takes precedence over full on.
         write_reg(dev, reg + OFFS_REG_LED_OFF, LED_FULL_ON_OFF);
     }
     else if (val < 4096)
@@ -195,6 +196,8 @@ void pca9685_set_pwm_value(i2c_dev_t *dev, uint8_t channel, uint16_t val)
     }
     else
     {
+        // Clear full off, as it takes precedence over full on.
+        write_reg(dev, reg + OFFS_REG_LED_OFF, 0);
         // Full on
         write_reg(dev, reg + OFFS_REG_LED_ON, LED_FULL_ON_OFF);
     }