Skip to content

Commit 5fc2014

Browse files
authored
Merge pull request #2390 from jepler/displayio-set-rotation
displayio: make 'rotation' property settable
2 parents 663f61c + a63da7a commit 5fc2014

File tree

6 files changed

+38
-1
lines changed

6 files changed

+38
-1
lines changed

shared-bindings/displayio/Display.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -394,11 +394,18 @@ STATIC mp_obj_t displayio_display_obj_get_rotation(mp_obj_t self_in) {
394394
return MP_OBJ_NEW_SMALL_INT(common_hal_displayio_display_get_rotation(self));
395395
}
396396
MP_DEFINE_CONST_FUN_OBJ_1(displayio_display_get_rotation_obj, displayio_display_obj_get_rotation);
397+
STATIC mp_obj_t displayio_display_obj_set_rotation(mp_obj_t self_in, mp_obj_t value) {
398+
displayio_display_obj_t *self = native_display(self_in);
399+
common_hal_displayio_display_set_rotation(self, mp_obj_get_int(value));
400+
return mp_const_none;
401+
}
402+
MP_DEFINE_CONST_FUN_OBJ_2(displayio_display_set_rotation_obj, displayio_display_obj_set_rotation);
403+
397404

398405
const mp_obj_property_t displayio_display_rotation_obj = {
399406
.base.type = &mp_type_property,
400407
.proxy = {(mp_obj_t)&displayio_display_get_rotation_obj,
401-
(mp_obj_t)&mp_const_none_obj,
408+
(mp_obj_t)&displayio_display_set_rotation_obj,
402409
(mp_obj_t)&mp_const_none_obj},
403410
};
404411

shared-bindings/displayio/Display.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ void common_hal_displayio_display_set_auto_refresh(displayio_display_obj_t* self
5858
uint16_t common_hal_displayio_display_get_width(displayio_display_obj_t* self);
5959
uint16_t common_hal_displayio_display_get_height(displayio_display_obj_t* self);
6060
uint16_t common_hal_displayio_display_get_rotation(displayio_display_obj_t* self);
61+
void common_hal_displayio_display_set_rotation(displayio_display_obj_t* self, int rotation);
6162

6263
bool common_hal_displayio_display_get_auto_brightness(displayio_display_obj_t* self);
6364
void common_hal_displayio_display_set_auto_brightness(displayio_display_obj_t* self, bool auto_brightness);

shared-module/displayio/Display.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,10 +308,27 @@ STATIC void _refresh_display(displayio_display_obj_t* self) {
308308
displayio_display_core_finish_refresh(&self->core);
309309
}
310310

311+
void common_hal_displayio_display_set_rotation(displayio_display_obj_t* self, int rotation){
312+
bool transposed = (self->core.rotation == 90 || self->core.rotation == 270);
313+
bool will_transposed = (rotation == 90 || rotation == 270);
314+
if(transposed != will_transposed) {
315+
int tmp = self->core.width;
316+
self->core.width = self->core.height;
317+
self->core.height = tmp;
318+
}
319+
displayio_display_core_set_rotation(&self->core, rotation);
320+
supervisor_stop_terminal();
321+
supervisor_start_terminal(self->core.width, self->core.height);
322+
if (self->core.current_group != NULL) {
323+
displayio_group_update_transform(self->core.current_group, &self->core.transform);
324+
}
325+
}
326+
311327
uint16_t common_hal_displayio_display_get_rotation(displayio_display_obj_t* self){
312328
return self->core.rotation;
313329
}
314330

331+
315332
bool common_hal_displayio_display_refresh(displayio_display_obj_t* self, uint32_t target_ms_per_frame, uint32_t maximum_ms_per_real_frame) {
316333
if (!self->auto_refresh && !self->first_manual_refresh) {
317334
uint64_t current_time = supervisor_ticks_ms64();

shared-module/displayio/display_core.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,15 @@ void displayio_display_core_construct(displayio_display_core_t* self,
8686
self->height = height;
8787
self->ram_width = ram_width;
8888
self->ram_height = ram_height;
89+
90+
displayio_display_core_set_rotation(self, rotation);
91+
}
92+
93+
void displayio_display_core_set_rotation( displayio_display_core_t* self,
94+
int rotation) {
95+
int height = self->height;
96+
int width = self->width;
97+
8998
rotation = rotation % 360;
9099
self->rotation = rotation;
91100
self->transform.x = 0;

shared-module/displayio/display_core.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ uint16_t displayio_display_core_get_height(displayio_display_core_t* self);
6868
void displayio_display_core_set_dither(displayio_display_core_t* self, bool dither);
6969
bool displayio_display_core_get_dither(displayio_display_core_t* self);
7070

71+
void displayio_display_core_set_rotation(displayio_display_core_t* self, int rotation);
72+
7173
bool displayio_display_core_bus_free(displayio_display_core_t *self);
7274
bool displayio_display_core_begin_transaction(displayio_display_core_t* self);
7375
void displayio_display_core_end_transaction(displayio_display_core_t* self);

supervisor/shared/display.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ void supervisor_start_terminal(uint16_t width_px, uint16_t height_px) {
8181
grid->pixel_width = width_in_tiles * grid->tile_width;
8282
grid->pixel_height = height_in_tiles * grid->tile_height;
8383
grid->tiles = tiles;
84+
grid->full_change = true;
8485

8586
common_hal_terminalio_terminal_construct(&supervisor_terminal, grid, &supervisor_terminal_font);
8687
}

0 commit comments

Comments
 (0)