Skip to content

Commit 9e104c0

Browse files
authored
Merge pull request #7215 from FoamyGuy/set_root_group
displayio.show() API change
2 parents 6e40949 + 5746209 commit 9e104c0

File tree

13 files changed

+122
-22
lines changed

13 files changed

+122
-22
lines changed

shared-bindings/displayio/Display.c

+15-2
Original file line numberDiff line numberDiff line change
@@ -423,8 +423,21 @@ STATIC mp_obj_t displayio_display_obj_get_root_group(mp_obj_t self_in) {
423423
}
424424
MP_DEFINE_CONST_FUN_OBJ_1(displayio_display_get_root_group_obj, displayio_display_obj_get_root_group);
425425

426-
MP_PROPERTY_GETTER(displayio_display_root_group_obj,
427-
(mp_obj_t)&displayio_display_get_root_group_obj);
426+
STATIC mp_obj_t displayio_display_obj_set_root_group(mp_obj_t self_in, mp_obj_t group_in) {
427+
displayio_display_obj_t *self = native_display(self_in);
428+
displayio_group_t *group = NULL;
429+
if (group_in != mp_const_none) {
430+
group = MP_OBJ_TO_PTR(native_group(group_in));
431+
}
432+
433+
common_hal_displayio_display_set_root_group(self, group);
434+
return mp_const_none;
435+
}
436+
MP_DEFINE_CONST_FUN_OBJ_2(displayio_display_set_root_group_obj, displayio_display_obj_set_root_group);
437+
438+
MP_PROPERTY_GETSET(displayio_display_root_group_obj,
439+
(mp_obj_t)&displayio_display_get_root_group_obj,
440+
(mp_obj_t)&displayio_display_set_root_group_obj);
428441

429442

430443
//| def fill_row(self, y: int, buffer: WriteableBuffer) -> WriteableBuffer:

shared-bindings/displayio/Display.h

+1
Original file line numberDiff line numberDiff line change
@@ -67,5 +67,6 @@ bool common_hal_displayio_display_set_brightness(displayio_display_obj_t *self,
6767

6868
mp_obj_t common_hal_displayio_display_get_bus(displayio_display_obj_t *self);
6969
mp_obj_t common_hal_displayio_display_get_root_group(displayio_display_obj_t *self);
70+
mp_obj_t common_hal_displayio_display_set_root_group(displayio_display_obj_t *self, displayio_group_t *root_group);
7071

7172
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_DISPLAYIO_DISPLAY_H

shared-bindings/displayio/EPaperDisplay.c

+25
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,30 @@ MP_DEFINE_CONST_FUN_OBJ_1(displayio_epaperdisplay_get_bus_obj, displayio_epaperd
349349
MP_PROPERTY_GETTER(displayio_epaperdisplay_bus_obj,
350350
(mp_obj_t)&displayio_epaperdisplay_get_bus_obj);
351351

352+
//| root_group: Group
353+
//| """The root group on the epaper display."""
354+
//|
355+
STATIC mp_obj_t displayio_epaperdisplay_obj_get_root_group(mp_obj_t self_in) {
356+
displayio_epaperdisplay_obj_t *self = native_display(self_in);
357+
return common_hal_displayio_epaperdisplay_get_root_group(self);
358+
}
359+
MP_DEFINE_CONST_FUN_OBJ_1(displayio_epaperdisplay_get_root_group_obj, displayio_epaperdisplay_obj_get_root_group);
360+
361+
STATIC mp_obj_t displayio_epaperdisplay_obj_set_root_group(mp_obj_t self_in, mp_obj_t group_in) {
362+
displayio_epaperdisplay_obj_t *self = native_display(self_in);
363+
displayio_group_t *group = NULL;
364+
if (group_in != mp_const_none) {
365+
group = MP_OBJ_TO_PTR(native_group(group_in));
366+
}
367+
368+
common_hal_displayio_epaperdisplay_set_root_group(self, group);
369+
return mp_const_none;
370+
}
371+
MP_DEFINE_CONST_FUN_OBJ_2(displayio_epaperdisplay_set_root_group_obj, displayio_epaperdisplay_obj_set_root_group);
372+
373+
MP_PROPERTY_GETSET(displayio_epaperdisplay_root_group_obj,
374+
(mp_obj_t)&displayio_epaperdisplay_get_root_group_obj,
375+
(mp_obj_t)&displayio_epaperdisplay_set_root_group_obj);
352376

353377
STATIC const mp_rom_map_elem_t displayio_epaperdisplay_locals_dict_table[] = {
354378
{ MP_ROM_QSTR(MP_QSTR_show), MP_ROM_PTR(&displayio_epaperdisplay_show_obj) },
@@ -361,6 +385,7 @@ STATIC const mp_rom_map_elem_t displayio_epaperdisplay_locals_dict_table[] = {
361385
{ MP_ROM_QSTR(MP_QSTR_bus), MP_ROM_PTR(&displayio_epaperdisplay_bus_obj) },
362386
{ MP_ROM_QSTR(MP_QSTR_busy), MP_ROM_PTR(&displayio_epaperdisplay_busy_obj) },
363387
{ MP_ROM_QSTR(MP_QSTR_time_to_refresh), MP_ROM_PTR(&displayio_epaperdisplay_time_to_refresh_obj) },
388+
{ MP_ROM_QSTR(MP_QSTR_root_group), MP_ROM_PTR(&displayio_epaperdisplay_root_group_obj) },
364389
};
365390
STATIC MP_DEFINE_CONST_DICT(displayio_epaperdisplay_locals_dict, displayio_epaperdisplay_locals_dict_table);
366391

shared-bindings/displayio/EPaperDisplay.h

+3
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ bool common_hal_displayio_epaperdisplay_refresh(displayio_epaperdisplay_obj_t *s
4848

4949
bool common_hal_displayio_epaperdisplay_show(displayio_epaperdisplay_obj_t *self, displayio_group_t *root_group);
5050

51+
mp_obj_t common_hal_displayio_epaperdisplay_get_root_group(displayio_epaperdisplay_obj_t *self);
52+
bool common_hal_displayio_epaperdisplay_set_root_group(displayio_epaperdisplay_obj_t *self, displayio_group_t *root_group);
53+
5154
// Returns time in milliseconds.
5255
uint32_t common_hal_displayio_epaperdisplay_get_time_to_refresh(displayio_epaperdisplay_obj_t *self);
5356
bool common_hal_displayio_epaperdisplay_get_busy(displayio_epaperdisplay_obj_t *self);

shared-bindings/displayio/__init__.c

+2
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
#endif
4646
#include "shared-bindings/displayio/Shape.h"
4747
#include "shared-bindings/displayio/TileGrid.h"
48+
#include "shared-module/displayio/__init__.h"
4849

4950
//| """Native helpers for driving displays
5051
//|
@@ -95,6 +96,7 @@ STATIC const mp_rom_map_elem_t displayio_module_globals_table[] = {
9596
#endif
9697

9798
{ MP_ROM_QSTR(MP_QSTR_release_displays), MP_ROM_PTR(&displayio_release_displays_obj) },
99+
{ MP_ROM_QSTR(MP_QSTR_CIRCUITPYTHON_TERMINAL), MP_ROM_PTR(&circuitpython_splash) },
98100
};
99101
STATIC MP_DEFINE_CONST_DICT(displayio_module_globals, displayio_module_globals_table);
100102

shared-bindings/framebufferio/FramebufferDisplay.c

+18-2
Original file line numberDiff line numberDiff line change
@@ -328,8 +328,24 @@ STATIC mp_obj_t framebufferio_framebufferdisplay_obj_get_root_group(mp_obj_t sel
328328
}
329329
MP_DEFINE_CONST_FUN_OBJ_1(framebufferio_framebufferdisplay_get_root_group_obj, framebufferio_framebufferdisplay_obj_get_root_group);
330330

331-
MP_PROPERTY_GETTER(framebufferio_framebufferdisplay_root_group_obj,
332-
(mp_obj_t)&framebufferio_framebufferdisplay_get_root_group_obj);
331+
STATIC mp_obj_t framebufferio_framebufferdisplay_obj_set_root_group(mp_obj_t self_in, mp_obj_t group_in) {
332+
framebufferio_framebufferdisplay_obj_t *self = native_display(self_in);
333+
displayio_group_t *group = NULL;
334+
if (group_in != mp_const_none) {
335+
group = MP_OBJ_TO_PTR(native_group(group_in));
336+
}
337+
338+
bool ok = common_hal_framebufferio_framebufferdisplay_set_root_group(self, group);
339+
if (!ok) {
340+
mp_raise_ValueError(translate("Group already used"));
341+
}
342+
return mp_const_none;
343+
}
344+
MP_DEFINE_CONST_FUN_OBJ_2(framebufferio_framebufferdisplay_set_root_group_obj, framebufferio_framebufferdisplay_obj_set_root_group);
345+
346+
MP_PROPERTY_GETSET(framebufferio_framebufferdisplay_root_group_obj,
347+
(mp_obj_t)&framebufferio_framebufferdisplay_get_root_group_obj,
348+
(mp_obj_t)&framebufferio_framebufferdisplay_set_root_group_obj);
333349

334350
STATIC const mp_rom_map_elem_t framebufferio_framebufferdisplay_locals_dict_table[] = {
335351
{ MP_ROM_QSTR(MP_QSTR_show), MP_ROM_PTR(&framebufferio_framebufferdisplay_show_obj) },

shared-bindings/framebufferio/FramebufferDisplay.h

+1
Original file line numberDiff line numberDiff line change
@@ -61,5 +61,6 @@ bool common_hal_framebufferio_framebufferdisplay_set_brightness(framebufferio_fr
6161
mp_obj_t common_hal_framebufferio_framebufferdisplay_framebuffer(framebufferio_framebufferdisplay_obj_t *self);
6262

6363
mp_obj_t common_hal_framebufferio_framebufferdisplay_get_root_group(framebufferio_framebufferdisplay_obj_t *self);
64+
mp_obj_t common_hal_framebufferio_framebufferdisplay_set_root_group(framebufferio_framebufferdisplay_obj_t *self, displayio_group_t *root_group);
6465

6566
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_DISPLAYIO_FRAMEBUFFERDISPLAY_H

shared-module/displayio/Display.c

+20-3
Original file line numberDiff line numberDiff line change
@@ -136,12 +136,15 @@ void common_hal_displayio_display_construct(displayio_display_obj_t *self,
136136

137137
// Set the group after initialization otherwise we may send pixels while we delay in
138138
// initialization.
139-
common_hal_displayio_display_show(self, &circuitpython_splash);
139+
common_hal_displayio_display_set_root_group(self, &circuitpython_splash);
140140
common_hal_displayio_display_set_auto_refresh(self, auto_refresh);
141141
}
142142

143143
bool common_hal_displayio_display_show(displayio_display_obj_t *self, displayio_group_t *root_group) {
144-
return displayio_display_core_show(&self->core, root_group);
144+
if (root_group == NULL) {
145+
root_group = &circuitpython_splash;
146+
}
147+
return displayio_display_core_set_root_group(&self->core, root_group);
145148
}
146149

147150
uint16_t common_hal_displayio_display_get_width(displayio_display_obj_t *self) {
@@ -206,6 +209,9 @@ mp_obj_t common_hal_displayio_display_get_bus(displayio_display_obj_t *self) {
206209
}
207210

208211
mp_obj_t common_hal_displayio_display_get_root_group(displayio_display_obj_t *self) {
212+
if (self->core.current_group == NULL) {
213+
return mp_const_none;
214+
}
209215
return self->core.current_group;
210216
}
211217

@@ -398,6 +404,14 @@ void common_hal_displayio_display_set_auto_refresh(displayio_display_obj_t *self
398404
self->auto_refresh = auto_refresh;
399405
}
400406

407+
mp_obj_t common_hal_displayio_display_set_root_group(displayio_display_obj_t *self, displayio_group_t *root_group) {
408+
bool ok = displayio_display_core_set_root_group(&self->core, root_group);
409+
if (!ok) {
410+
mp_raise_ValueError(translate("Group already used"));
411+
}
412+
return mp_const_none;
413+
}
414+
401415
void displayio_display_background(displayio_display_obj_t *self) {
402416
if (self->auto_refresh && (supervisor_ticks_ms64() - self->core.last_refresh) > self->native_ms_per_frame) {
403417
_refresh_display(self);
@@ -421,7 +435,10 @@ void release_display(displayio_display_obj_t *self) {
421435

422436
void reset_display(displayio_display_obj_t *self) {
423437
common_hal_displayio_display_set_auto_refresh(self, true);
424-
common_hal_displayio_display_show(self, NULL);
438+
circuitpython_splash.x = 0; // reset position in case someone moved it.
439+
circuitpython_splash.y = 0;
440+
supervisor_start_terminal(self->core.width, self->core.height);
441+
common_hal_displayio_display_set_root_group(self, &circuitpython_splash);
425442
}
426443

427444
void displayio_display_collect_ptrs(displayio_display_obj_t *self) {

shared-module/displayio/Display.h

-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ typedef struct {
6464
void displayio_display_background(displayio_display_obj_t *self);
6565
void release_display(displayio_display_obj_t *self);
6666
void reset_display(displayio_display_obj_t *self);
67-
6867
void displayio_display_collect_ptrs(displayio_display_obj_t *self);
6968

7069
#endif // MICROPY_INCLUDED_SHARED_MODULE_DISPLAYIO_DISPLAY_H

shared-module/displayio/EPaperDisplay.c

+14-1
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,14 @@ void common_hal_displayio_epaperdisplay_construct(displayio_epaperdisplay_obj_t
103103
}
104104

105105
bool common_hal_displayio_epaperdisplay_show(displayio_epaperdisplay_obj_t *self, displayio_group_t *root_group) {
106-
return displayio_display_core_show(&self->core, root_group);
106+
if (root_group == NULL) {
107+
root_group = &circuitpython_splash;
108+
}
109+
return displayio_display_core_set_root_group(&self->core, root_group);
110+
}
111+
112+
bool common_hal_displayio_epaperdisplay_set_root_group(displayio_epaperdisplay_obj_t *self, displayio_group_t *root_group) {
113+
return displayio_display_core_set_root_group(&self->core, root_group);
107114
}
108115

109116
STATIC const displayio_area_t *displayio_epaperdisplay_get_refresh_areas(displayio_epaperdisplay_obj_t *self) {
@@ -239,6 +246,12 @@ uint16_t common_hal_displayio_epaperdisplay_get_rotation(displayio_epaperdisplay
239246
return self->core.rotation;
240247
}
241248

249+
mp_obj_t common_hal_displayio_epaperdisplay_get_root_group(displayio_epaperdisplay_obj_t *self) {
250+
if (self->core.current_group == NULL) {
251+
return mp_const_none;
252+
}
253+
return self->core.current_group;
254+
}
242255

243256
STATIC bool displayio_epaperdisplay_refresh_area(displayio_epaperdisplay_obj_t *self, const displayio_area_t *area) {
244257
uint16_t buffer_size = 128; // In uint32_ts

shared-module/displayio/display_core.c

+7-11
Original file line numberDiff line numberDiff line change
@@ -162,17 +162,10 @@ void displayio_display_core_set_rotation(displayio_display_core_t *self,
162162
}
163163
}
164164

165-
bool displayio_display_core_show(displayio_display_core_t *self, displayio_group_t *root_group) {
165+
bool displayio_display_core_set_root_group(displayio_display_core_t *self, displayio_group_t *root_group) {
166166

167-
if (root_group == NULL) { // set the display to the REPL, reset REPL position and size
168-
circuitpython_splash.in_group = false;
169-
// force the circuit_python_splash out of any group (Note: could cause problems with the parent group)
170-
circuitpython_splash.x = 0; // reset position in case someone moved it.
171-
circuitpython_splash.y = 0;
172-
173-
supervisor_start_terminal(self->width, self->height);
174-
175-
root_group = &circuitpython_splash;
167+
if (root_group == NULL) {
168+
// Show nothing on the display
176169
}
177170
if (root_group == self->current_group) {
178171
return true;
@@ -366,7 +359,10 @@ void displayio_display_core_collect_ptrs(displayio_display_core_t *self) {
366359
}
367360

368361
bool displayio_display_core_fill_area(displayio_display_core_t *self, displayio_area_t *area, uint32_t *mask, uint32_t *buffer) {
369-
return displayio_group_fill_area(self->current_group, &self->colorspace, area, mask, buffer);
362+
if (self->current_group != NULL) {
363+
return displayio_group_fill_area(self->current_group,&self->colorspace, area, mask, buffer);
364+
}
365+
return false;
370366
}
371367

372368
bool displayio_display_core_clip_area(displayio_display_core_t *self, const displayio_area_t *area, displayio_area_t *clipped) {

shared-module/displayio/display_core.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ void displayio_display_core_construct(displayio_display_core_t *self,
6161
mp_obj_t bus, uint16_t width, uint16_t height, uint16_t ram_width, uint16_t ram_height, int16_t colstart, int16_t rowstart, uint16_t rotation,
6262
uint16_t color_depth, bool grayscale, bool pixels_in_byte_share_row, uint8_t bytes_per_cell, bool reverse_pixels_in_byte, bool reverse_bytes_in_word);
6363

64-
bool displayio_display_core_show(displayio_display_core_t *self, displayio_group_t *root_group);
64+
bool displayio_display_core_set_root_group(displayio_display_core_t *self, displayio_group_t *root_group);
6565

6666
uint16_t displayio_display_core_get_width(displayio_display_core_t *self);
6767
uint16_t displayio_display_core_get_height(displayio_display_core_t *self);

shared-module/framebufferio/FramebufferDisplay.c

+15-1
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,10 @@ void common_hal_framebufferio_framebufferdisplay_construct(framebufferio_framebu
102102
}
103103

104104
bool common_hal_framebufferio_framebufferdisplay_show(framebufferio_framebufferdisplay_obj_t *self, displayio_group_t *root_group) {
105-
return displayio_display_core_show(&self->core, root_group);
105+
if (root_group == NULL) {
106+
root_group = &circuitpython_splash;
107+
}
108+
return displayio_display_core_set_root_group(&self->core, root_group);
106109
}
107110

108111
uint16_t common_hal_framebufferio_framebufferdisplay_get_width(framebufferio_framebufferdisplay_obj_t *self) {
@@ -360,5 +363,16 @@ void framebufferio_framebufferdisplay_reset(framebufferio_framebufferdisplay_obj
360363
}
361364

362365
mp_obj_t common_hal_framebufferio_framebufferdisplay_get_root_group(framebufferio_framebufferdisplay_obj_t *self) {
366+
if (self->core.current_group == NULL) {
367+
return mp_const_none;
368+
}
363369
return self->core.current_group;
364370
}
371+
372+
mp_obj_t common_hal_framebufferio_framebufferdisplay_set_root_group(framebufferio_framebufferdisplay_obj_t *self, displayio_group_t *root_group) {
373+
bool ok = displayio_display_core_set_root_group(&self->core, root_group);
374+
if (!ok) {
375+
mp_raise_ValueError(translate("Group already used"));
376+
}
377+
return mp_const_none;
378+
}

0 commit comments

Comments
 (0)