summaryrefslogtreecommitdiff
path: root/shared-module/framebufferio
diff options
context:
space:
mode:
authorJeff Epler <jepler@gmail.com>2020-04-10 09:07:06 -0500
committerJeff Epler <jepler@gmail.com>2020-04-14 18:24:58 -0500
commitba20bc8b4322373ec9ed55ed9f299675ea2801f8 (patch)
tree4c20ebf80b0ef32292a08bc07832eb13454117b6 /shared-module/framebufferio
parent129c6369cfd510b12e5f8ae1d9c9a51853f1b498 (diff)
framebufferio: move backlight down to the underlying framebuffer
Diffstat (limited to 'shared-module/framebufferio')
-rw-r--r--shared-module/framebufferio/FramebufferDisplay.c65
-rw-r--r--shared-module/framebufferio/FramebufferDisplay.h15
2 files changed, 20 insertions, 60 deletions
diff --git a/shared-module/framebufferio/FramebufferDisplay.c b/shared-module/framebufferio/FramebufferDisplay.c
index ec2fe7b31..bd0764e8e 100644
--- a/shared-module/framebufferio/FramebufferDisplay.c
+++ b/shared-module/framebufferio/FramebufferDisplay.c
@@ -45,7 +45,6 @@ void common_hal_framebufferio_framebufferdisplay_construct(framebufferio_framebu
mp_obj_t framebuffer, uint16_t width, uint16_t height,
uint16_t rotation, uint16_t color_depth,
uint8_t bytes_per_cell,
- const mcu_pin_obj_t* backlight_pin, mp_float_t brightness, bool auto_brightness,
bool auto_refresh, uint16_t native_frames_per_second) {
// Turn off auto-refresh as we init.
self->auto_refresh = false;
@@ -58,7 +57,6 @@ void common_hal_framebufferio_framebufferdisplay_construct(framebufferio_framebu
displayio_display_core_construct(&self->core, NULL, width, height, ram_width, ram_height, 0, 0, rotation,
color_depth, false, false, bytes_per_cell, false, false);
- self->auto_brightness = auto_brightness;
self->first_manual_refresh = !auto_refresh;
self->native_frames_per_second = native_frames_per_second;
@@ -66,25 +64,6 @@ void common_hal_framebufferio_framebufferdisplay_construct(framebufferio_framebu
supervisor_start_terminal(width, height);
- // Always set the backlight type in case we're reusing memory.
- self->backlight_inout.base.type = &mp_type_NoneType;
- if (backlight_pin != NULL && common_hal_mcu_pin_is_free(backlight_pin)) {
- pwmout_result_t result = common_hal_pulseio_pwmout_construct(&self->backlight_pwm, backlight_pin, 0, 50000, false);
- if (result != PWMOUT_OK) {
- self->backlight_inout.base.type = &digitalio_digitalinout_type;
- common_hal_digitalio_digitalinout_construct(&self->backlight_inout, backlight_pin);
- common_hal_never_reset_pin(backlight_pin);
- } else {
- self->backlight_pwm.base.type = &pulseio_pwmout_type;
- common_hal_pulseio_pwmout_never_reset(&self->backlight_pwm);
- }
- }
- if (!self->auto_brightness && (self->framebuffer_protocol->set_brightness != NULL || self->backlight_inout.base.type != &mp_type_NoneType)) {
- common_hal_framebufferio_framebufferdisplay_set_brightness(self, brightness);
- } else {
- self->current_brightness = -1.0;
- }
-
// Set the group after initialization otherwise we may send pixels while we delay in
// initialization.
common_hal_framebufferio_framebufferdisplay_show(self, &circuitpython_splash);
@@ -104,33 +83,31 @@ uint16_t common_hal_framebufferio_framebufferdisplay_get_height(framebufferio_fr
}
bool common_hal_framebufferio_framebufferdisplay_get_auto_brightness(framebufferio_framebufferdisplay_obj_t* self) {
- return self->auto_brightness;
+ if (self->framebuffer_protocol->get_auto_brightness) {
+ return self->framebuffer_protocol->get_auto_brightness(self->framebuffer);
+ }
+ return true;
}
-void common_hal_framebufferio_framebufferdisplay_set_auto_brightness(framebufferio_framebufferdisplay_obj_t* self, bool auto_brightness) {
- self->auto_brightness = auto_brightness;
+bool common_hal_framebufferio_framebufferdisplay_set_auto_brightness(framebufferio_framebufferdisplay_obj_t* self, bool auto_brightness) {
+ if (self->framebuffer_protocol->set_auto_brightness) {
+ return self->framebuffer_protocol->set_auto_brightness(self->framebuffer, auto_brightness);
+ }
+ return false;
}
mp_float_t common_hal_framebufferio_framebufferdisplay_get_brightness(framebufferio_framebufferdisplay_obj_t* self) {
- return self->current_brightness;
+ if (self->framebuffer_protocol->set_brightness) {
+ return self->framebuffer_protocol->get_brightness(self->framebuffer);
+ }
+ return -1;
}
bool common_hal_framebufferio_framebufferdisplay_set_brightness(framebufferio_framebufferdisplay_obj_t* self, mp_float_t brightness) {
- self->updating_backlight = true;
bool ok = false;
if (self->framebuffer_protocol->set_brightness) {
self->framebuffer_protocol->set_brightness(self->framebuffer, brightness);
ok = true;
- } else if (self->backlight_pwm.base.type == &pulseio_pwmout_type) {
- common_hal_pulseio_pwmout_set_duty_cycle(&self->backlight_pwm, (uint16_t) (0xffff * brightness));
- ok = true;
- } else if (self->backlight_inout.base.type == &digitalio_digitalinout_type) {
- common_hal_digitalio_digitalinout_set_value(&self->backlight_inout, brightness > 0.99);
- ok = true;
- }
- self->updating_backlight = false;
- if (ok) {
- self->current_brightness = brightness;
}
return ok;
}
@@ -295,17 +272,8 @@ void common_hal_framebufferio_framebufferdisplay_set_auto_refresh(framebufferio_
}
STATIC void _update_backlight(framebufferio_framebufferdisplay_obj_t* self) {
- if (!self->auto_brightness || self->updating_backlight) {
- return;
- }
- if (supervisor_ticks_ms64() - self->last_backlight_refresh < 100) {
- return;
- }
// TODO(tannewt): Fade the backlight based on it's existing value and a target value. The target
// should account for ambient light when possible.
- common_hal_framebufferio_framebufferdisplay_set_brightness(self, 1.0);
-
- self->last_backlight_refresh = supervisor_ticks_ms64();
}
void framebufferio_framebufferdisplay_background(framebufferio_framebufferdisplay_obj_t* self) {
@@ -318,18 +286,11 @@ void framebufferio_framebufferdisplay_background(framebufferio_framebufferdispla
void release_framebufferdisplay(framebufferio_framebufferdisplay_obj_t* self) {
release_display_core(&self->core);
- if (self->backlight_pwm.base.type == &pulseio_pwmout_type) {
- common_hal_pulseio_pwmout_reset_ok(&self->backlight_pwm);
- common_hal_pulseio_pwmout_deinit(&self->backlight_pwm);
- } else if (self->backlight_inout.base.type == &digitalio_digitalinout_type) {
- common_hal_digitalio_digitalinout_deinit(&self->backlight_inout);
- }
self->framebuffer_protocol->deinit(self->framebuffer);
}
void reset_framebufferdisplay(framebufferio_framebufferdisplay_obj_t* self) {
self->auto_refresh = true;
- self->auto_brightness = true;
common_hal_framebufferio_framebufferdisplay_show(self, NULL);
}
diff --git a/shared-module/framebufferio/FramebufferDisplay.h b/shared-module/framebufferio/FramebufferDisplay.h
index a5c8607bb..a7b91a522 100644
--- a/shared-module/framebufferio/FramebufferDisplay.h
+++ b/shared-module/framebufferio/FramebufferDisplay.h
@@ -40,22 +40,15 @@
typedef struct {
mp_obj_base_t base;
displayio_display_core_t core;
- union {
- digitalio_digitalinout_obj_t backlight_inout;
- pulseio_pwmout_obj_t backlight_pwm;
- };
mp_obj_t framebuffer;
const struct _framebuffer_p_t *framebuffer_protocol;
mp_buffer_info_t bufinfo;
uint64_t last_backlight_refresh;
uint64_t last_refresh_call;
- mp_float_t current_brightness;
uint16_t native_frames_per_second;
uint16_t native_ms_per_frame;
bool auto_refresh;
bool first_manual_refresh;
- bool auto_brightness;
- bool updating_backlight;
} framebufferio_framebufferdisplay_obj_t;
void framebufferio_framebufferdisplay_background(framebufferio_framebufferdisplay_obj_t* self);
@@ -69,14 +62,20 @@ mp_obj_t common_hal_framebufferio_framebufferdisplay_get_framebuffer(framebuffer
typedef void (*framebuffer_get_bufinfo_fun)(mp_obj_t, mp_buffer_info_t *bufinfo);
typedef void (*framebuffer_swapbuffers_fun)(mp_obj_t);
typedef void (*framebuffer_deinit_fun)(mp_obj_t);
-typedef void (*framebuffer_set_brightness_fun)(mp_obj_t, mp_float_t);
+typedef bool (*framebuffer_set_brightness_fun)(mp_obj_t, mp_float_t);
+typedef mp_float_t (*framebuffer_get_brightness_fun)(mp_obj_t);
+typedef bool (*framebuffer_set_auto_brightness_fun)(mp_obj_t, bool);
+typedef bool (*framebuffer_get_auto_brightness_fun)(mp_obj_t);
typedef struct _framebuffer_p_t {
MP_PROTOCOL_HEAD // MP_QSTR_protocol_framebuffer
framebuffer_get_bufinfo_fun get_bufinfo;
framebuffer_swapbuffers_fun swapbuffers;
framebuffer_deinit_fun deinit;
+ framebuffer_get_brightness_fun get_brightness;
framebuffer_set_brightness_fun set_brightness;
+ framebuffer_get_auto_brightness_fun get_auto_brightness;
+ framebuffer_set_auto_brightness_fun set_auto_brightness;
} framebuffer_p_t;
#endif // MICROPY_INCLUDED_SHARED_MODULE_DISPLAYIO_FRAMEBUFFERDISPLAY_H