diff options
| author | mark9064 <30447455+mark9064@users.noreply.github.com> | 2024-01-22 23:37:52 +0000 |
|---|---|---|
| committer | JF <JF002@users.noreply.github.com> | 2024-08-05 20:32:43 +0200 |
| commit | 3dca742b6566859aee89e1b943ae2ea5fc0eaa95 (patch) | |
| tree | 8520a6872ede1d78475211000d319b5e40b255c3 /src/components/brightness/BrightnessController.h | |
| parent | 20ac7e8df38836d0a72c378b900b99c827c996c2 (diff) | |
aod: PPI/RTC-based backlight brightness
Diffstat (limited to 'src/components/brightness/BrightnessController.h')
| -rw-r--r-- | src/components/brightness/BrightnessController.h | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/src/components/brightness/BrightnessController.h b/src/components/brightness/BrightnessController.h index 7f86759a..650749a8 100644 --- a/src/components/brightness/BrightnessController.h +++ b/src/components/brightness/BrightnessController.h @@ -2,11 +2,14 @@ #include <cstdint> +#include "nrf_ppi.h" +#include "nrfx_gpiote.h" + namespace Pinetime { namespace Controllers { class BrightnessController { public: - enum class Levels { Off, Low, Medium, High }; + enum class Levels { Off, AlwaysOn, Low, Medium, High }; void Init(); void Set(Levels level); @@ -20,6 +23,25 @@ namespace Pinetime { private: Levels level = Levels::High; + static constexpr uint8_t UNSET = UINT8_MAX; + uint8_t lastPin = UNSET; + // Maximum time (μs) it takes for the RTC to fully stop + static constexpr uint8_t rtcStopTime = 46; + // Frequency of timer used for PWM (Hz) + static constexpr uint16_t timerFrequency = 32768; + // Backlight PWM frequency (Hz) + static constexpr uint16_t pwmFreq = 1000; + // Wraparound point in timer ticks + // Defines the number of brightness levels between each pin + static constexpr uint16_t timerPeriod = timerFrequency / pwmFreq; + // Warning: nimble reserves some PPIs + // https://github.com/InfiniTimeOrg/InfiniTime/blob/034d83fe6baf1ab3875a34f8cee387e24410a824/src/libs/mynewt-nimble/nimble/drivers/nrf52/src/ble_phy.c#L53 + // SpiMaster uses PPI 0 for an erratum workaround + // Channel 1, 2 should be free to use + static constexpr nrf_ppi_channel_t ppiBacklightOn = NRF_PPI_CHANNEL1; + static constexpr nrf_ppi_channel_t ppiBacklightOff = NRF_PPI_CHANNEL2; + + void ApplyBrightness(uint16_t val); }; } } |
